From 134e24f8d855dfd73809a2e516f74d288619b087 Mon Sep 17 00:00:00 2001
From: Martin Wendt
Date: Thu, 11 Jan 2024 20:37:38 +0100
Subject: [PATCH] Bump version to 0.8.0
---
dist/wunderbaum.css | 5 +-
dist/wunderbaum.css.map | 2 +-
dist/wunderbaum.d.ts | 571 +-
dist/wunderbaum.esm.js | 1253 +-
dist/wunderbaum.esm.min.js | 64 +-
dist/wunderbaum.esm.min.js.map | 2 +-
dist/wunderbaum.umd.js | 15391 ++++++++--------
dist/wunderbaum.umd.min.js | 139 +-
dist/wunderbaum.umd.min.js.map | 2 +-
docs/api/assets/navigation.js | 2 +-
docs/api/assets/search.js | 2 +-
docs/api/classes/util.Deferred.html | 20 +-
docs/api/classes/util.ValidationError.html | 10 +-
docs/api/classes/wb_node.WunderbaumNode.html | 318 +-
docs/api/classes/wunderbaum.Wunderbaum.html | 293 +-
docs/api/enums/types.ChangeType.html | 24 +-
docs/api/enums/types.NavModeEnum.html | 16 +-
docs/api/enums/types.NodeRegion.html | 22 +-
docs/api/enums/types.NodeStatusType.html | 18 +-
docs/api/enums/types.RenderFlag.html | 16 +-
.../common.decompressSourceData.html | 8 +-
.../common.makeNodeTitleMatcher.html | 10 +-
.../common.makeNodeTitleStartMatcher.html | 8 +-
.../api/functions/common.nodeTitleSorter.html | 8 +-
docs/api/functions/util.adaptiveThrottle.html | 8 +-
docs/api/functions/util.assert.html | 8 +-
docs/api/functions/util.debounce.html | 101 +
docs/api/functions/util.documentReady.html | 8 +-
.../functions/util.documentReadyPromise.html | 8 +-
docs/api/functions/util.each.html | 8 +-
docs/api/functions/util.elemFromHtml.html | 8 +-
docs/api/functions/util.elemFromSelector.html | 8 +-
docs/api/functions/util.error.html | 8 +-
docs/api/functions/util.escapeHtml.html | 8 +-
docs/api/functions/util.escapeRegex.html | 8 +-
docs/api/functions/util.escapeTooltip.html | 8 +-
docs/api/functions/util.eventToString.html | 8 +-
docs/api/functions/util.extend.html | 8 +-
docs/api/functions/util.extractHtmlText.html | 8 +-
docs/api/functions/util.getOption.html | 8 +-
docs/api/functions/util.getValueFromElem.html | 8 +-
docs/api/functions/util.isArray.html | 8 +-
docs/api/functions/util.isEmptyObject.html | 8 +-
docs/api/functions/util.isFunction.html | 8 +-
docs/api/functions/util.isPlainObject.html | 8 +-
docs/api/functions/util.noop.html | 8 +-
docs/api/functions/util.onEvent.html | 10 +-
docs/api/functions/util.overrideMethod.html | 8 +-
docs/api/functions/util.setElemDisplay.html | 8 +-
.../api/functions/util.setTimeoutPromise.html | 8 +-
docs/api/functions/util.setValueToElem.html | 8 +-
docs/api/functions/util.sleep.html | 8 +-
docs/api/functions/util.throttle.html | 100 +
docs/api/functions/util.toSet.html | 8 +-
docs/api/functions/util.toggleCheckbox.html | 8 +-
docs/api/functions/util.type.html | 8 +-
docs/api/index.html | 8 +-
.../interfaces/types.AddChildrenOptions.html | 14 +-
.../interfaces/types.ApplyCommandOptions.html | 8 +-
.../interfaces/types.ColumnDefinition.html | 30 +-
.../api/interfaces/types.ColumnEventInfo.html | 16 +-
.../interfaces/types.ExpandAllOptions.html | 16 +-
.../interfaces/types.FilterNodesOptions.html | 22 +-
.../interfaces/types.MakeVisibleOptions.html | 14 +-
.../api/interfaces/types.NavigateOptions.html | 12 +-
.../interfaces/types.NodeTypeDefinition.html | 18 +-
docs/api/interfaces/types.RenderOptions.html | 22 +-
.../types.ScrollIntoViewOptions.html | 16 +-
.../api/interfaces/types.ScrollToOptions.html | 18 +-
.../interfaces/types.SetActiveOptions.html | 20 +-
.../interfaces/types.SetColumnOptions.html | 12 +-
.../interfaces/types.SetExpandedOptions.html | 20 +-
.../interfaces/types.SetSelectedOptions.html | 16 +-
.../interfaces/types.SetStatusOptions.html | 12 +-
docs/api/interfaces/types.SourceAjaxType.html | 16 +-
.../interfaces/types.SourceObjectType.html | 24 +-
docs/api/interfaces/types.UpdateOptions.html | 10 +-
.../interfaces/types.VisitRowsOptions.html | 18 +-
.../interfaces/types.WbActivateEventType.html | 22 +-
.../interfaces/types.WbChangeEventType.html | 36 +-
.../interfaces/types.WbClickEventType.html | 20 +-
.../types.WbDeactivateEventType.html | 22 +-
.../types.WbEditApplyEventType.html | 38 +-
.../interfaces/types.WbEditEditEventType.html | 22 +-
.../interfaces/types.WbErrorEventType.html | 22 +-
docs/api/interfaces/types.WbEventInfo.html | 26 +-
.../interfaces/types.WbExpandEventType.html | 142 +
.../interfaces/types.WbFocusEventType.html | 18 +-
.../types.WbIconBadgeEventResultType.html | 14 +-
.../types.WbIconBadgeEventType.html | 22 +-
.../api/interfaces/types.WbInitEventType.html | 18 +-
.../interfaces/types.WbKeydownEventType.html | 20 +-
docs/api/interfaces/types.WbNodeData.html | 44 +-
.../api/interfaces/types.WbNodeEventType.html | 25 +-
.../interfaces/types.WbReceiveEventType.html | 22 +-
.../interfaces/types.WbRenderEventType.html | 30 +-
.../interfaces/types.WbSelectEventType.html | 22 +-
.../api/interfaces/types.WbTreeEventType.html | 16 +-
.../wb_options.WunderbaumOptions.html | 112 +-
docs/api/modules/common.html | 8 +-
docs/api/modules/types.html | 9 +-
docs/api/modules/util.html | 30 +-
docs/api/modules/wb_node.html | 8 +-
docs/api/modules/wb_options.html | 8 +-
docs/api/modules/wunderbaum.html | 8 +-
docs/api/types/types.ApplyCommandType.html | 8 +-
docs/api/types/types.BoolOptionResolver.html | 8 +-
.../types.BoolOrStringOptionResolver.html | 8 +-
docs/api/types/types.CheckboxOption.html | 8 +-
.../api/types/types.ColumnDefinitionList.html | 8 +-
docs/api/types/types.ColumnEventInfoMap.html | 8 +-
docs/api/types/types.DndOptionsType.html | 8 +-
.../types/types.DropEffectAllowedType.html | 8 +-
docs/api/types/types.DropEffectType.html | 8 +-
docs/api/types/types.DropRegionType.html | 8 +-
docs/api/types/types.DropRegionTypeSet.html | 8 +-
docs/api/types/types.DynamicBoolOption.html | 8 +-
.../types.DynamicBoolOrStringOption.html | 8 +-
.../types/types.DynamicCheckboxOption.html | 8 +-
docs/api/types/types.DynamicIconOption.html | 8 +-
docs/api/types/types.DynamicStringOption.html | 8 +-
docs/api/types/types.EditOptionsType.html | 8 +-
docs/api/types/types.FilterModeType.html | 8 +-
docs/api/types/types.FilterOptionsType.html | 17 +-
docs/api/types/types.GridOptionsType.html | 8 +-
docs/api/types/types.IconOption.html | 8 +-
docs/api/types/types.InsertNodeType.html | 8 +-
docs/api/types/types.MatcherCallback.html | 8 +-
docs/api/types/types.NodeAnyCallback.html | 8 +-
docs/api/types/types.NodeFilterCallback.html | 8 +-
docs/api/types/types.NodeFilterResponse.html | 8 +-
docs/api/types/types.NodeSelectCallback.html | 8 +-
docs/api/types/types.NodeStringCallback.html | 8 +-
docs/api/types/types.NodeToDictCallback.html | 8 +-
.../types/types.NodeTypeDefinitionMap.html | 8 +-
docs/api/types/types.NodeVisitCallback.html | 8 +-
docs/api/types/types.NodeVisitResponse.html | 8 +-
docs/api/types/types.SelectModeType.html | 8 +-
docs/api/types/types.SortCallback.html | 8 +-
docs/api/types/types.SourceListType.html | 8 +-
docs/api/types/types.SourceType.html | 8 +-
docs/api/types/types.TristateType.html | 8 +-
docs/api/types/types.WbIconBadgeCallback.html | 8 +-
docs/api/types/util.EventCallbackType.html | 8 +-
docs/api/types/util.FunctionType.html | 8 +-
.../variables/common.DEFAULT_DEBUGLEVEL.html | 8 +-
docs/api/variables/common.ICON_WIDTH.html | 8 +-
docs/api/variables/common.INPUT_KEYS.html | 8 +-
docs/api/variables/common.KEY_NODATA.html | 8 +-
.../variables/common.KEY_TO_ACTION_DICT.html | 8 +-
.../variables/common.RENDER_MAX_PREFETCH.html | 8 +-
.../variables/common.RENDER_MIN_PREFETCH.html | 8 +-
.../common.RESERVED_TREE_SOURCE_KEYS.html | 8 +-
docs/api/variables/common.ROW_HEIGHT.html | 8 +-
docs/api/variables/common.TEST_IMG.html | 8 +-
.../variables/common.TITLE_SPAN_PAD_Y.html | 8 +-
docs/api/variables/common.iconMaps.html | 8 +-
docs/api/variables/util.MAX_INT.html | 8 +-
docs/api/variables/util.MOUSE_BUTTONS.html | 8 +-
docs/api/variables/util.isMac.html | 8 +-
docs/unittest/test-core.js | 46 +-
package.json | 2 +-
162 files changed, 10637 insertions(+), 9653 deletions(-)
create mode 100644 docs/api/functions/util.debounce.html
create mode 100644 docs/api/functions/util.throttle.html
create mode 100644 docs/api/interfaces/types.WbExpandEventType.html
diff --git a/dist/wunderbaum.css b/dist/wunderbaum.css
index d4d5f23d..5b183667 100644
--- a/dist/wunderbaum.css
+++ b/dist/wunderbaum.css
@@ -492,10 +492,13 @@ i.wb-icon > span.wb-badge {
}
.wb-col input:invalid {
- color: var(--wb-error-color);
background-color: var(--wb-error-background-color);
}
+.wb-col.wb-invalid {
+ border: 1px dotted var(--wb-error-color);
+}
+
@keyframes wb-spin-animation {
0% {
transform: rotate(0deg);
diff --git a/dist/wunderbaum.css.map b/dist/wunderbaum.css.map
index 3bfee3bd..ce2be56e 100644
--- a/dist/wunderbaum.css.map
+++ b/dist/wunderbaum.css.map
@@ -1 +1 @@
-{"version":3,"sourceRoot":"","sources":["../src/wunderbaum.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AA2EA;AAAA;EAME;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;;;AAMF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EACA;EAGA;AAsBA;AAuBA;AAwQA;AAoHA;AAwBA;AAgEA;AAEA;AAUA;AAoBA;AAYA;;AAziBA;EAEE;;AAIF;EACE;EACA;;AAGF;EACE;EAEA;;AAMF;EACE;EACA;EACA;;AAGF;AAAA;EAEE;;AAKF;EACE;EACA;EACA;EACA;EACA;;AAMA;EACE;EACA;EACA;EACA;;AAIA;EACE;;AAKF;EAEE;;AAGF;EAEE;;AAGF;EACE;;AAOA;EAEE;EACA;;AAEA;EACE;;AAaN;EAEE;EACA;;AAEA;EACE;;AAON;EACE;;AAEA;EACE;;AAOF;EACE;;AAGF;EAEE;;AAGA;EACE;;AAKJ;EACE;EACA;;AAGF;EAEE;EACA;;AAEA;EAEE;;AAIJ;EACE;;AAGF;AAAA;AAAA;EAGE;EAcA;EASA;;AAGF;EAEE;;AAON;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EAIA;;AAIF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;;AAIJ;EACE;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;AAqBA;;AAhBA;AAAA;AAAA;AAAA;EAIE;EACA;EACA;EACA;;AAGF;AAAA;EAEE;EACA;;AAIF;EACE;;AAGF;EACE;EACA;EACA;;AAMA;EACE;;AAIJ;AAAA;EAEE;EACA;EACA;EACA;;AAGF;EACE;EAEA;EACA;EACA;EACA;EACA;;AAUI;EACE;;AAON;EACE;;AAIJ;EACE;;AAEA;EACE;;AAIF;EACE;;AAGF;EACE;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAgBE;EACA;EACA;;AAGF;AAAA;EAEE;;AAcA;EACE;;AAWJ;EACE;;AAGF;EACE;;AAEA;EACE;;AAON;EACE;;AAEA;EACE;;AAQJ;EACE;;AASJ;EACE;;AAEA;EACE;;AAGF;EACE;;AAcN;EACE;;AAEA;EACE;;AAIJ;EACE;;AAEA;EACE;EACA;;AAGA;EACE;EACA;;AAEA;EAGE;EACA;EAGA;EACA;EACA;;AAgBR;AAAA;EAIE;EACA;EACA;;AAKF;EACE;;AAUE;AAAA;EAEE;;AAFF;AAAA;EAEE;;AAFF;AAAA;EAEE;;AAFF;AAAA;EAEE;;AAOJ;EAIE;EACA;;AAGF;AAAA;EAKE;EACA;;AAMF;AAAA;EAEE;EACA;EACA;EACA;;AAOF;EACE;;AAGF;AAAA;EAEE;;AAKA;EACE;;;AAMR;AAEA;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;AAEA;EACE;EACA;;;AAQJ;AACA;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAIA;AAAA;EAEE;;AAGF;AAAA;EAEE;;;AAIJ;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAIJ;AAAA;AAAA;AAMA;EACE;EACA;;;AAGF;EAEE;EACA;;;AAGF;EACE;IACE;;EAGF;IACE;;;AAIJ;EACE;IACE;;EAGF;IACE;;;AAIJ;EACE;IACE;;EAGF;IACE","file":"wunderbaum.css"}
\ No newline at end of file
+{"version":3,"sourceRoot":"","sources":["../src/wunderbaum.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AA2EA;AAAA;EAME;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;;;AAMF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EACA;EAGA;AAsBA;AAuBA;AAwQA;AAoHA;AAwBA;AAgEA;AAEA;AAUA;AAoBA;AAYA;;AAziBA;EAEE;;AAIF;EACE;EACA;;AAGF;EACE;EAEA;;AAMF;EACE;EACA;EACA;;AAGF;AAAA;EAEE;;AAKF;EACE;EACA;EACA;EACA;EACA;;AAMA;EACE;EACA;EACA;EACA;;AAIA;EACE;;AAKF;EAEE;;AAGF;EAEE;;AAGF;EACE;;AAOA;EAEE;EACA;;AAEA;EACE;;AAaN;EAEE;EACA;;AAEA;EACE;;AAON;EACE;;AAEA;EACE;;AAOF;EACE;;AAGF;EAEE;;AAGA;EACE;;AAKJ;EACE;EACA;;AAGF;EAEE;EACA;;AAEA;EAEE;;AAIJ;EACE;;AAGF;AAAA;AAAA;EAGE;EAcA;EASA;;AAGF;EAEE;;AAON;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EAIA;;AAIF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;;AAIJ;EACE;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;AAqBA;;AAhBA;AAAA;AAAA;AAAA;EAIE;EACA;EACA;EACA;;AAGF;AAAA;EAEE;EACA;;AAIF;EACE;;AAGF;EACE;EACA;EACA;;AAMA;EACE;;AAIJ;AAAA;EAEE;EACA;EACA;EACA;;AAGF;EACE;EAEA;EACA;EACA;EACA;EACA;;AAUI;EACE;;AAON;EACE;;AAIJ;EACE;;AAEA;EACE;;AAIF;EACE;;AAGF;EACE;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAgBE;EACA;EACA;;AAGF;AAAA;EAEE;;AAcA;EACE;;AAWJ;EACE;;AAGF;EACE;;AAEA;EACE;;AAON;EACE;;AAEA;EACE;;AAQJ;EACE;;AASJ;EACE;;AAEA;EACE;;AAGF;EACE;;AAcN;EACE;;AAEA;EACE;;AAIJ;EACE;;AAEA;EACE;EACA;;AAGA;EACE;EACA;;AAEA;EAGE;EACA;EAGA;EACA;EACA;;AAgBR;AAAA;EAIE;EACA;EACA;;AAKF;EACE;;AAUE;AAAA;EAEE;;AAFF;AAAA;EAEE;;AAFF;AAAA;EAEE;;AAFF;AAAA;EAEE;;AAOJ;EAIE;EACA;;AAGF;AAAA;EAKE;EACA;;AAMF;AAAA;EAEE;EACA;EACA;EACA;;AAOF;EACE;;AAGF;AAAA;EAEE;;AAKA;EACE;;;AAMR;AAEA;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;AAEA;EACE;EACA;;;AAQJ;AACA;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAIA;AAAA;EAEE;;AAGF;AAAA;EAEE;;;AAIJ;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAIJ;AAAA;AAAA;AAMA;EACE;EACA;;;AAGF;EAGE;;;AAGF;EACE;;;AAKF;EACE;IACE;;EAGF;IACE;;;AAIJ;EACE;IACE;;EAGF;IACE;;;AAIJ;EACE;IACE;;EAGF;IACE","file":"wunderbaum.css"}
\ No newline at end of file
diff --git a/dist/wunderbaum.d.ts b/dist/wunderbaum.d.ts
index 4f08b4b7..2060e3c4 100644
--- a/dist/wunderbaum.d.ts
+++ b/dist/wunderbaum.d.ts
@@ -1,3 +1,137 @@
+declare module "debounce" {
+ /*!
+ * debounce & throttle, taken from https://github.com/lodash/lodash v4.17.21
+ * MIT License: https://raw.githubusercontent.com/lodash/lodash/4.17.21-npm/LICENSE
+ * Modified for TypeScript type annotations.
+ */
+ type Procedure = (...args: any[]) => any;
+ type DebounceOptions = {
+ leading?: boolean;
+ maxWait?: number;
+ trailing?: boolean;
+ };
+ type ThrottleOptions = {
+ leading?: boolean;
+ trailing?: boolean;
+ };
+ export interface DebouncedFunction {
+ (this: ThisParameterType, ...args: Parameters): ReturnType;
+ cancel: () => void;
+ flush: () => any;
+ pending: () => boolean;
+ }
+ /**
+ * Creates a debounced function that delays invoking `func` until after `wait`
+ * milliseconds have elapsed since the last time the debounced function was
+ * invoked, or until the next browser frame is drawn. The debounced function
+ * comes with a `cancel` method to cancel delayed `func` invocations and a
+ * `flush` method to immediately invoke them. Provide `options` to indicate
+ * whether `func` should be invoked on the leading and/or trailing edge of the
+ * `wait` timeout. The `func` is invoked with the last arguments provided to the
+ * debounced function. Subsequent calls to the debounced function return the
+ * result of the last `func` invocation.
+ *
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is
+ * invoked on the trailing edge of the timeout only if the debounced function
+ * is invoked more than once during the `wait` timeout.
+ *
+ * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+ * until the next tick, similar to `setTimeout` with a timeout of `0`.
+ *
+ * If `wait` is omitted in an environment with `requestAnimationFrame`, `func`
+ * invocation will be deferred until the next frame is drawn (typically about
+ * 16ms).
+ *
+ * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+ * for details over the differences between `debounce` and `throttle`.
+ *
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to debounce.
+ * @param {number} [wait=0]
+ * The number of milliseconds to delay; if omitted, `requestAnimationFrame` is
+ * used (if available).
+ * @param {Object} [options={}] The options object.
+ * @param {boolean} [options.leading=false]
+ * Specify invoking on the leading edge of the timeout.
+ * @param {number} [options.maxWait]
+ * The maximum time `func` is allowed to be delayed before it's invoked.
+ * @param {boolean} [options.trailing=true]
+ * Specify invoking on the trailing edge of the timeout.
+ * @returns {Function} Returns the new debounced function.
+ * @example
+ *
+ * // Avoid costly calculations while the window size is in flux.
+ * jQuery(window).on('resize', debounce(calculateLayout, 150))
+ *
+ * // Invoke `sendMail` when clicked, debouncing subsequent calls.
+ * jQuery(element).on('click', debounce(sendMail, 300, {
+ * 'leading': true,
+ * 'trailing': false
+ * }))
+ *
+ * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
+ * const debounced = debounce(batchLog, 250, { 'maxWait': 1000 })
+ * const source = new EventSource('/stream')
+ * jQuery(source).on('message', debounced)
+ *
+ * // Cancel the trailing debounced invocation.
+ * jQuery(window).on('popstate', debounced.cancel)
+ *
+ * // Check for pending invocations.
+ * const status = debounced.pending() ? "Pending..." : "Ready"
+ */
+ export function debounce(func: F, wait?: number, options?: DebounceOptions): DebouncedFunction;
+ /**
+ * Creates a throttled function that only invokes `func` at most once per
+ * every `wait` milliseconds (or once per browser frame). The throttled function
+ * comes with a `cancel` method to cancel delayed `func` invocations and a
+ * `flush` method to immediately invoke them. Provide `options` to indicate
+ * whether `func` should be invoked on the leading and/or trailing edge of the
+ * `wait` timeout. The `func` is invoked with the last arguments provided to the
+ * throttled function. Subsequent calls to the throttled function return the
+ * result of the last `func` invocation.
+ *
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is
+ * invoked on the trailing edge of the timeout only if the throttled function
+ * is invoked more than once during the `wait` timeout.
+ *
+ * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+ * until the next tick, similar to `setTimeout` with a timeout of `0`.
+ *
+ * If `wait` is omitted in an environment with `requestAnimationFrame`, `func`
+ * invocation will be deferred until the next frame is drawn (typically about
+ * 16ms).
+ *
+ * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+ * for details over the differences between `throttle` and `debounce`.
+ *
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to throttle.
+ * @param {number} [wait=0]
+ * The number of milliseconds to throttle invocations to; if omitted,
+ * `requestAnimationFrame` is used (if available).
+ * @param {Object} [options={}] The options object.
+ * @param {boolean} [options.leading=true]
+ * Specify invoking on the leading edge of the timeout.
+ * @param {boolean} [options.trailing=true]
+ * Specify invoking on the trailing edge of the timeout.
+ * @returns {Function} Returns the new throttled function.
+ * @example
+ *
+ * // Avoid excessively updating the position while scrolling.
+ * jQuery(window).on('scroll', throttle(updatePosition, 100))
+ *
+ * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
+ * const throttled = throttle(renewToken, 300000, { 'trailing': false })
+ * jQuery(element).on('click', throttled)
+ *
+ * // Cancel the trailing throttled invocation.
+ * jQuery(window).on('popstate', throttled.cancel)
+ */
+ export function throttle(func: F, wait?: number, options?: ThrottleOptions): DebouncedFunction;
+}
declare module "util" {
/*!
* Wunderbaum - util
@@ -5,6 +139,8 @@ declare module "util" {
* @VERSION, @DATE (https://github.com/mar10/wunderbaum)
*/
/** @module util */
+ import { DebouncedFunction, debounce, throttle } from "debounce";
+ export { debounce, throttle };
/** Readable names for `MouseEvent.button` */
export const MOUSE_BUTTONS: {
[key: number]: string;
@@ -14,8 +150,18 @@ declare module "util" {
export const isMac: boolean;
export type FunctionType = (...args: any[]) => any;
export type EventCallbackType = (e: Event) => boolean | void;
+ /** A generic error that can be thrown to indicate a validation error when
+ * handling the `apply` event for a node title or the `change` event for a
+ * grid cell.
+ */
+ export class ValidationError extends Error {
+ constructor(message: string);
+ }
/**
* A ES6 Promise, that exposes the resolve()/reject() methods.
+ *
+ * TODO: See [Promise.withResolvers()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers#description)
+ * , a proposed standard, but not yet implemented in any browser.
*/
export class Deferred {
private thens;
@@ -115,13 +261,11 @@ declare module "util" {
*/
export function setValueToElem(elem: HTMLElement, value: any): void;
/** Show/hide element by setting the `display` style to 'none'. */
- export function setElemDisplay(elem: string | Element, flag: boolean): void;
+ export function setElemDisplay(elem: string | HTMLElement, flag: boolean): void;
/** Create and return an unconnected `HTMLElement` from a HTML string. */
- export function elemFromHtml(html: string): HTMLElement;
+ export function elemFromHtml(html: string): T;
/** Return a HtmlElement from selector or cast an existing element. */
- export function elemFromSelector(obj: string | Element): HTMLElement | null;
- /** Return a EventTarget from selector or cast an existing element. */
- export function eventTargetFromSelector(obj: string | EventTarget): EventTarget | null;
+ export function elemFromSelector(obj: string | T): T | null;
/**
* Return a canonical descriptive string for a keyboard or mouse event.
*
@@ -164,7 +308,7 @@ declare module "util" {
/** A dummy function that does nothing ('no operation'). */
export function noop(...args: any[]): any;
/**
- * Bind one or more event handlers directly to an [[EventTarget]].
+ * Bind one or more event handlers directly to an [EventTarget](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget).
*
* @param element EventTarget or selector
* @param eventNames
@@ -202,7 +346,7 @@ declare module "util" {
*/
export function overrideMethod(instance: any, methodName: string, handler: FunctionType, ctx?: any): void;
/** Run function after ms milliseconds and return a promise that resolves when done. */
- export function setTimeoutPromise(this: unknown, callback: (...args: any[]) => void, ms: number): Promise;
+ export function setTimeoutPromise(this: unknown, callback: (...args: any[]) => T, ms: number): Promise;
/**
* Wait `ms` microseconds.
*
@@ -249,7 +393,7 @@ declare module "util" {
* throttledFoo();
* ```
*/
- export function adaptiveThrottle(this: unknown, callback: (...args: any[]) => void, options: any): (...args: any[]) => void;
+ export function adaptiveThrottle(this: unknown, callback: (...args: any[]) => void, options: object): DebouncedFunction<(...args: any[]) => void>;
}
declare module "common" {
/*!
@@ -305,7 +449,7 @@ declare module "common" {
};
/** Return a callback that returns true if the node title matches the string
* or regular expression.
- * @see {@link WunderbaumNode.findAll}
+ * @see {@link WunderbaumNode.findAll()}
*/
export function makeNodeTitleMatcher(match: string | RegExp): MatcherCallback;
/** Return a callback that returns true if the node title starts with a string (case-insensitive). */
@@ -346,23 +490,23 @@ declare module "deferred" {
* }
* ```
*/
- export class Deferred {
+ export class Deferred {
private _promise;
protected _resolve: any;
protected _reject: any;
constructor();
- /** Resolve the [[Promise]]. */
+ /** Resolve the Promise. */
resolve(value?: any): void;
- /** Reject the [[Promise]]. */
+ /** Reject the Promise. */
reject(reason?: any): void;
- /** Return the native [[Promise]] instance.*/
- promise(): Promise;
- /** Call [[Promise.then]] on the embedded promise instance.*/
+ /** Return the native Promise instance.*/
+ promise(): Promise;
+ /** Call Promise.then on the embedded promise instance.*/
then(cb: PromiseCallbackType): Promise;
- /** Call [[Promise.catch]] on the embedded promise instance.*/
- catch(cb: PromiseCallbackType): Promise;
- /** Call [[Promise.finally]] on the embedded promise instance.*/
- finally(cb: finallyCallbackType): Promise;
+ /** Call Promise.catch on the embedded promise instance.*/
+ catch(cb: PromiseCallbackType): Promise;
+ /** Call Promise.finally on the embedded promise instance.*/
+ finally(cb: finallyCallbackType): Promise;
}
}
declare module "wb_node" {
@@ -489,6 +633,8 @@ declare module "wb_node" {
* as space-separated string, array of strings, or set of strings.
*/
setClass(className: string | string[] | Set, flag?: boolean): void;
+ /** Start editing this node's title. */
+ startEditTitle(): void;
/** Call `setExpanded()` on all descendant nodes. */
expandAll(flag?: boolean, options?: ExpandAllOptions): Promise;
/**
@@ -554,6 +700,13 @@ declare module "wb_node" {
* @returns {WunderbaumNode | null}
*/
getColElem(colIdx: number | string): HTMLSpanElement;
+ /**
+ * Return all nodes with the same refKey.
+ *
+ * @param includeSelf Include this node itself.
+ * @see {@link Wunderbaum.findByRefKey}
+ */
+ getCloneList(includeSelf?: boolean): WunderbaumNode[];
/** Return the first child node or null.
* @returns {WunderbaumNode | null}
*/
@@ -590,19 +743,22 @@ declare module "wb_node" {
/** Return true if this node is the currently active tree node. */
isActive(): boolean;
/** Return true if this node is a direct or indirect parent of `other`.
- * (See also [[isParentOf]].)
+ * @see {@link WunderbaumNode.isParentOf}
*/
isAncestorOf(other: WunderbaumNode): boolean;
/** Return true if this node is a **direct** subnode of `other`.
- * (See also [[isDescendantOf]].)
+ * @see {@link WunderbaumNode.isDescendantOf}
*/
isChildOf(other: WunderbaumNode): boolean;
+ /** Return true if this node's refKey is used by at least one other node.
+ */
+ isClone(): boolean;
/** Return true if this node's title spans all columns, i.e. the node has no
* grid cells.
*/
isColspan(): boolean;
/** Return true if this node is a direct or indirect subnode of `other`.
- * (See also [[isChildOf]].)
+ * @see {@link WunderbaumNode.isChildOf}
*/
isDescendantOf(other: WunderbaumNode): boolean;
/** Return true if this node has children, i.e. the node is generally expandable.
@@ -610,8 +766,11 @@ declare module "wb_node" {
* an expand operation is currently possible.
*/
isExpandable(andCollapsed?: boolean): boolean;
- /** Return true if this node is currently in edit-title mode. */
- isEditing(): boolean;
+ /** Return true if _this_ node is currently in edit-title mode.
+ *
+ * See {@link Wunderbaum.startEditTitle} to check if any node is currently edited.
+ */
+ isEditingTitle(): boolean;
/** Return true if this node is currently expanded. */
isExpanded(): boolean;
/** Return true if this node is the first node of its parent's children. */
@@ -627,7 +786,7 @@ declare module "wb_node" {
/** Return true if this node is a temporarily generated status node of type 'paging'. */
isPagingNode(): boolean;
/** Return true if this node is a **direct** parent of `other`.
- * (See also [[isAncestorOf]].)
+ * @see {@link WunderbaumNode.isAncestorOf}
*/
isParentOf(other: WunderbaumNode): boolean;
/** (experimental) Return true if this node is partially loaded. */
@@ -639,7 +798,7 @@ declare module "wb_node" {
/** Return true if this node has DOM representaion, i.e. is displayed in the viewport. */
isRendered(): boolean;
/** Return true if this node is the (invisible) system root node.
- * (See also [[isTopLevel()]].)
+ * @see {@link WunderbaumNode.isTopLevel}
*/
isRootNode(): boolean;
/** Return true if this node is selected, i.e. the checkbox is set.
@@ -677,7 +836,7 @@ declare module "wb_node" {
* @param {object} [options] passed to `setExpanded()`.
* Defaults to {noAnimation: false, noEvents: false, scrollIntoView: true}
*/
- makeVisible(options?: MakeVisibleOptions): Promise;
+ makeVisible(options?: MakeVisibleOptions): Promise;
/** Move this node to targetNode. */
moveTo(targetNode: WunderbaumNode, mode?: InsertNodeType, map?: NodeAnyCallback): void;
/** Set focus relative to this node and optionally activate.
@@ -756,9 +915,10 @@ declare module "wb_node" {
*/
scrollIntoView(options?: ScrollIntoViewOptions): Promise;
/**
- * Activate this node, deactivate previous, send events, activate column and scroll int viewport.
+ * Activate this node, deactivate previous, send events, activate column and
+ * scroll into viewport.
*/
- setActive(flag?: boolean, options?: SetActiveOptions): Promise;
+ setActive(flag?: boolean, options?: SetActiveOptions): Promise;
/**
* Expand or collapse this node.
*/
@@ -874,7 +1034,7 @@ declare module "wb_options" {
*/
import { ColumnDefinitionList, DndOptionsType, DynamicBoolOption, DynamicBoolOrStringOption, DynamicCheckboxOption, DynamicIconOption, EditOptionsType, FilterOptionsType, NavModeEnum, NodeTypeDefinitionMap, SelectModeType, WbActivateEventType, WbChangeEventType, WbClickEventType, WbDeactivateEventType, WbErrorEventType, WbIconBadgeCallback, WbInitEventType, WbKeydownEventType, WbNodeData, WbNodeEventType, WbReceiveEventType, WbRenderEventType, WbTreeEventType } from "types";
/**
- * Available options for [[Wunderbaum]].
+ * Available options for {@link wunderbaum.Wunderbaum}.
*
* Options are passed to the constructor as plain object:
*
@@ -1307,24 +1467,56 @@ declare module "types" {
event: Event;
}
export interface WbChangeEventType extends WbNodeEventType {
+ /** Additional information derived from the original change event. */
info: WbEventInfo;
- inputElem: HTMLInputElement;
+ /** The embedded element that fired the change event. */
+ inputElem: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;
+ /** The new value of the embedded element, depending on the input element type. */
inputValue: any;
+ /** Result of `inputElem.checkValidity()`. */
+ inputValid: boolean;
}
export interface WbClickEventType extends WbTreeEventType {
/** The original event. */
event: MouseEvent;
+ /** The clicked node if any. */
node: WunderbaumNode;
+ /** Additional information derived from the original mouse event. */
info: WbEventInfo;
}
- export interface WbErrorEventType extends WbNodeEventType {
- error: any;
- }
export interface WbDeactivateEventType extends WbNodeEventType {
nextNode: WunderbaumNode;
/** The original event. */
event: Event;
}
+ export interface WbEditApplyEventType extends WbNodeEventType {
+ /** Additional information derived from the original change event. */
+ info: WbEventInfo;
+ /** The input element of the node title that fired the change event. */
+ inputElem: HTMLInputElement;
+ /** The previous node title. */
+ oldValue: string;
+ /** The new node title. */
+ newValue: string;
+ /** Result of `inputElem.checkValidity()`. */
+ inputValid: boolean;
+ }
+ export interface WbEditEditEventType extends WbNodeEventType {
+ /** The input element of the node title that was just created. */
+ inputElem: HTMLInputElement;
+ }
+ export interface WbErrorEventType extends WbNodeEventType {
+ error: any;
+ }
+ export interface WbExpandEventType extends WbNodeEventType {
+ flag: boolean;
+ }
+ export interface WbFocusEventType extends WbTreeEventType {
+ /** The original event. */
+ event: FocusEvent;
+ /** True if `focusin`, false if `focusout`. */
+ flag: boolean;
+ }
export interface WbIconBadgeEventType extends WbNodeEventType {
iconSpan: HTMLElement;
}
@@ -1336,29 +1528,29 @@ declare module "types" {
/** Tooltip for the badge. */
badgeTooltip?: string;
}
- export interface WbFocusEventType extends WbTreeEventType {
- /** The original event. */
- event: FocusEvent;
- /** True if `focusin`, false if `focusout`. */
- flag: boolean;
+ export interface WbInitEventType extends WbTreeEventType {
+ error?: any;
}
export interface WbKeydownEventType extends WbTreeEventType {
/** The original event. */
event: KeyboardEvent;
node: WunderbaumNode;
+ /** Additional information derived from the original keyboard event. */
info: WbEventInfo;
}
- export interface WbInitEventType extends WbTreeEventType {
- error?: any;
- }
export interface WbReceiveEventType extends WbNodeEventType {
response: any;
}
+ export interface WbSelectEventType extends WbNodeEventType {
+ flag: boolean;
+ }
export interface WbRenderEventType extends WbNodeEventType {
/**
* True if the node's markup was not yet created. In this case the render
* event should create embedded input controls (in addition to update the
- * values according to to current node data).
+ * values according to to current node data).
+ * False if the node's markup was already created. In this case the render
+ * event should only update the values according to to current node data.
*/
isNew: boolean;
/** The node's `` element. */
@@ -1372,9 +1564,20 @@ declare module "types" {
*/
allColInfosById: ColumnEventInfoMap;
/**
- * Array of node's `` elements, *that should be rendered*.
+ * Array of node's `` elements,
+ * *that should be rendered by the event handler*.
* In contrast to `allColInfosById`, the node title is not part of this array.
* If node.isColspan() is true, this array is empty (`[]`).
+ * This allows to iterate over all relevant in a simple loop:
+ * ```
+ * for (const col of Object.values(e.renderColInfosById)) {
+ * switch (col.id) {
+ * default:
+ * // Assumption: we named column.id === node.data.NAME
+ * col.elem.textContent = node.data[col.id];
+ * break;
+ * }
+ * }
*/
renderColInfosById: ColumnEventInfoMap;
}
@@ -1425,14 +1628,17 @@ declare module "types" {
* elements of that column.
*/
classes?: string;
- /** If `headerClasses` is a string, it will be used for the header element,
- * while `classes` is used for data elements.
+ /** If `headerClasses` is a set, it will be used for the header element only
+ * (unlike `classes`, which is used for body and header cells).
*/
headerClasses?: string;
/** Optional HTML content that is rendered into all `span.wb-col` elements of that column.*/
html?: string;
+ /** @internal */
_weight?: number;
+ /** @internal */
_widthPx?: number;
+ /** @internal */
_ofsPx?: number;
[key: string]: unknown;
}
@@ -1454,7 +1660,7 @@ declare module "types" {
[colId: string]: ColumnEventInfo;
};
/**
- * Additional inforation derived from mouse or keyboard events.
+ * Additional information derived from mouse or keyboard events.
* @see {@link Wunderbaum.getEventInfo}
*/
export interface WbEventInfo {
@@ -1625,22 +1831,37 @@ declare module "types" {
/** Which node to scroll into the viewport.*/
node: WunderbaumNode;
}
- /** Possible values for {@link WunderbaumNode.setActive()} `options` argument. */
+ /** Possible values for {@link WunderbaumNode.setActive} `options` argument. */
export interface SetActiveOptions {
- /** Generate (de)activate event, even if node already has this status (default: false). */
+ /** Generate (de)activate event, even if node already has this status (@default: false). */
retrigger?: boolean;
- /** Do not generate (de)activate event (default: false). */
+ /** Do not generate (de)activate event (@default: false). */
noEvents?: boolean;
- /** Set node as focused node (default: true). */
- focusNode?: boolean;
- /** Set node as focused node (default: false). */
+ /** Call `tree.setFocus()` to acquire keyboard focus (@default: false). */
focusTree?: boolean;
/** Optional original event that will be passed to the (de)activate handler. */
event?: Event;
- /** Call {@link Wunderbaum.setColumn}. */
- colIdx?: number;
+ /** Also call {@link Wunderbaum.setColumn()}. */
+ colIdx?: number | string;
+ /**
+ * Focus embedded input control of the grid cell if any (requires colIdx >= 0).
+ * If colIdx is 0 or '*', the node title is put into edit mode.
+ * Implies `focusTree: true`, requires `colIdx`.
+ */
+ edit?: boolean;
+ }
+ /** Possible values for {@link WunderbaumNode.setColumn()} `options` argument. */
+ export interface SetColumnOptions {
+ /**
+ * Focus embedded input control of the grid cell if any .
+ * If colIdx is 0 or '*', the node title is put into edit mode.
+ * @default false
+ */
+ edit?: boolean;
+ /** Horizontically scroll into view. @default: true */
+ scrollIntoView?: boolean;
}
- /** Possible values for {@link WunderbaumNode.setExpanded()} `options` argument. */
+ /** Possible values for {@link WunderbaumNode.setExpanded} `options` argument. */
export interface SetExpandedOptions {
/** Ignore {@link WunderbaumOptions.minExpandLevel}. @default false */
force?: boolean;
@@ -1740,46 +1961,63 @@ declare module "types" {
* Grayout unmatched nodes (pass "hide" to remove unmatched node instead)
* @default 'dim'
*/
- mode?: "dim" | "hide";
+ mode?: FilterModeType;
/**
- * Display a 'no data' status node if result is empty
+ * Display a 'no data' status node if result is empty (hide-mode only).
+ * Pass false to simply show an empy pane, or pass a string to customize the message.
* @default true
*/
- noData?: boolean;
+ noData?: boolean | string;
};
+ /**
+ * Note:
+ * This options are used for renaming node titles.
+ * There is also the `tree.change` event to handle modifying node data from
+ * input controls that are embedded in grid cells.
+ */
export type EditOptionsType = {
/**
+ * Used to debounce the `change` event handler for grid cells [ms].
* @default 100
*/
debounce?: number;
/**
+ * Minimum number of characters required for node title input field.
* @default 1
*/
minlength?: number;
/**
+ * Maximum number of characters allowed for node title input field.
* @default null;
*/
maxlength?: null | number;
/**
- * ["clickActive", "F2", "macEnter"],
+ * Array of strings to determine which user input should trigger edit mode.
+ * E.g. `["clickActive", "F2", "macEnter"]`:
+ * 'clickActive': single click on active node title
+ * 'F2': press F2 key
+ * 'macEnter': press Enter (on macOS only)
+ * Pass an empty array to disable edit mode.
* @default []
*/
trigger?: string[];
/**
+ * Trim whitespace before saving a node title.
* @default true
*/
trim?: boolean;
/**
+ * Select all text of a node title, so it can be overwritten by typing.
* @default true
*/
select?: boolean;
/**
- * Handle 'clickActive' only if last click is less than this old (0: always)
+ * Handle 'clickActive' only if last click is less than this ms old (0: always)
* @default 1000
*/
slowClickDelay?: number;
/**
- * Please enter a title",
+ * Permanently apply node title input validations (CSS and tooltip) on keydown.
* @default true
*/
validity?: boolean;
@@ -1975,140 +2213,6 @@ declare module "wb_extension_base" {
onRender(data: any): boolean | undefined;
}
}
-declare module "debounce" {
- /*!
- * debounce & throttle, taken from https://github.com/lodash/lodash v4.17.21
- * MIT License: https://raw.githubusercontent.com/lodash/lodash/4.17.21-npm/LICENSE
- * Modified for TypeScript type annotations.
- */
- type Procedure = (...args: any[]) => any;
- type DebounceOptions = {
- leading?: boolean;
- maxWait?: number;
- trailing?: boolean;
- };
- type ThrottleOptions = {
- leading?: boolean;
- trailing?: boolean;
- };
- export interface DebouncedFunction {
- (this: ThisParameterType, ...args: Parameters): ReturnType;
- cancel: () => void;
- flush: () => any;
- pending: () => boolean;
- }
- /**
- * Creates a debounced function that delays invoking `func` until after `wait`
- * milliseconds have elapsed since the last time the debounced function was
- * invoked, or until the next browser frame is drawn. The debounced function
- * comes with a `cancel` method to cancel delayed `func` invocations and a
- * `flush` method to immediately invoke them. Provide `options` to indicate
- * whether `func` should be invoked on the leading and/or trailing edge of the
- * `wait` timeout. The `func` is invoked with the last arguments provided to the
- * debounced function. Subsequent calls to the debounced function return the
- * result of the last `func` invocation.
- *
- * **Note:** If `leading` and `trailing` options are `true`, `func` is
- * invoked on the trailing edge of the timeout only if the debounced function
- * is invoked more than once during the `wait` timeout.
- *
- * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
- * until the next tick, similar to `setTimeout` with a timeout of `0`.
- *
- * If `wait` is omitted in an environment with `requestAnimationFrame`, `func`
- * invocation will be deferred until the next frame is drawn (typically about
- * 16ms).
- *
- * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
- * for details over the differences between `debounce` and `throttle`.
- *
- * @since 0.1.0
- * @category Function
- * @param {Function} func The function to debounce.
- * @param {number} [wait=0]
- * The number of milliseconds to delay; if omitted, `requestAnimationFrame` is
- * used (if available).
- * @param {Object} [options={}] The options object.
- * @param {boolean} [options.leading=false]
- * Specify invoking on the leading edge of the timeout.
- * @param {number} [options.maxWait]
- * The maximum time `func` is allowed to be delayed before it's invoked.
- * @param {boolean} [options.trailing=true]
- * Specify invoking on the trailing edge of the timeout.
- * @returns {Function} Returns the new debounced function.
- * @example
- *
- * // Avoid costly calculations while the window size is in flux.
- * jQuery(window).on('resize', debounce(calculateLayout, 150))
- *
- * // Invoke `sendMail` when clicked, debouncing subsequent calls.
- * jQuery(element).on('click', debounce(sendMail, 300, {
- * 'leading': true,
- * 'trailing': false
- * }))
- *
- * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
- * const debounced = debounce(batchLog, 250, { 'maxWait': 1000 })
- * const source = new EventSource('/stream')
- * jQuery(source).on('message', debounced)
- *
- * // Cancel the trailing debounced invocation.
- * jQuery(window).on('popstate', debounced.cancel)
- *
- * // Check for pending invocations.
- * const status = debounced.pending() ? "Pending..." : "Ready"
- */
- export function debounce(func: F, wait?: number, options?: DebounceOptions): DebouncedFunction;
- /**
- * Creates a throttled function that only invokes `func` at most once per
- * every `wait` milliseconds (or once per browser frame). The throttled function
- * comes with a `cancel` method to cancel delayed `func` invocations and a
- * `flush` method to immediately invoke them. Provide `options` to indicate
- * whether `func` should be invoked on the leading and/or trailing edge of the
- * `wait` timeout. The `func` is invoked with the last arguments provided to the
- * throttled function. Subsequent calls to the throttled function return the
- * result of the last `func` invocation.
- *
- * **Note:** If `leading` and `trailing` options are `true`, `func` is
- * invoked on the trailing edge of the timeout only if the throttled function
- * is invoked more than once during the `wait` timeout.
- *
- * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
- * until the next tick, similar to `setTimeout` with a timeout of `0`.
- *
- * If `wait` is omitted in an environment with `requestAnimationFrame`, `func`
- * invocation will be deferred until the next frame is drawn (typically about
- * 16ms).
- *
- * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
- * for details over the differences between `throttle` and `debounce`.
- *
- * @since 0.1.0
- * @category Function
- * @param {Function} func The function to throttle.
- * @param {number} [wait=0]
- * The number of milliseconds to throttle invocations to; if omitted,
- * `requestAnimationFrame` is used (if available).
- * @param {Object} [options={}] The options object.
- * @param {boolean} [options.leading=true]
- * Specify invoking on the leading edge of the timeout.
- * @param {boolean} [options.trailing=true]
- * Specify invoking on the trailing edge of the timeout.
- * @returns {Function} Returns the new throttled function.
- * @example
- *
- * // Avoid excessively updating the position while scrolling.
- * jQuery(window).on('scroll', throttle(updatePosition, 100))
- *
- * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
- * const throttled = throttle(renewToken, 300000, { 'trailing': false })
- * jQuery(element).on('click', throttled)
- *
- * // Cancel the trailing throttled invocation.
- * jQuery(window).on('popstate', throttled.cancel)
- */
- export function throttle(func: F, wait?: number, options?: ThrottleOptions): DebouncedFunction;
-}
declare module "wb_ext_filter" {
import { FilterNodesOptions, FilterOptionsType, NodeFilterCallback } from "types";
import { Wunderbaum } from "wunderbaum";
@@ -2299,7 +2403,7 @@ declare module "wb_ext_edit" {
protected curEditNode: WunderbaumNode | null;
protected relatedNode: WunderbaumNode | null;
constructor(tree: Wunderbaum);
- protected _applyChange(eventName: string, node: WunderbaumNode, colElem: HTMLElement, extra: any): Promise;
+ protected _applyChange(eventName: string, node: WunderbaumNode, colElem: HTMLElement, inputElem: HTMLInputElement, extra: any): Promise;
protected _onChange(e: Event): void;
init(): void;
_preprocessKeyEvent(data: any): boolean | undefined;
@@ -2335,13 +2439,14 @@ declare module "wunderbaum" {
*/
import * as util from "util";
import { ExtensionsDict, WunderbaumExtension } from "wb_extension_base";
- import { ApplyCommandType, ChangeType, ColumnDefinitionList, ExpandAllOptions, FilterModeType, MatcherCallback, NavModeEnum, NodeStatusType, NodeStringCallback, NodeTypeDefinitionMap, ScrollToOptions, SetActiveOptions, UpdateOptions, SetStatusOptions, WbEventInfo, ApplyCommandOptions, AddChildrenOptions, VisitRowsOptions, NodeFilterCallback, FilterNodesOptions, RenderFlag, NodeVisitCallback, SortCallback, NodeToDictCallback, WbNodeData, DynamicCheckboxOption, SourceType, DynamicIconOption, DynamicStringOption, DynamicBoolOption } from "types";
+ import { ApplyCommandType, ChangeType, ColumnDefinitionList, ExpandAllOptions, FilterModeType, MatcherCallback, NavModeEnum, NodeStatusType, NodeStringCallback, NodeTypeDefinitionMap, ScrollToOptions, SetActiveOptions, UpdateOptions, SetStatusOptions, WbEventInfo, ApplyCommandOptions, AddChildrenOptions, VisitRowsOptions, NodeFilterCallback, FilterNodesOptions, RenderFlag, NodeVisitCallback, SortCallback, NodeToDictCallback, WbNodeData, DynamicCheckboxOption, SourceType, DynamicIconOption, DynamicStringOption, DynamicBoolOption, SetColumnOptions } from "types";
import { WunderbaumNode } from "wb_node";
import { WunderbaumOptions } from "wb_options";
+ import { DebouncedFunction } from "debounce";
/**
* A persistent plain object or array.
*
- * See also [[WunderbaumOptions]].
+ * See also {@link WunderbaumOptions}.
*/
export class Wunderbaum {
protected static sequence: number;
@@ -2364,7 +2469,7 @@ declare module "wunderbaum" {
readonly data: {
[key: string]: any;
};
- protected readonly _updateViewportThrottled: (...args: any) => void;
+ protected readonly _updateViewportThrottled: DebouncedFunction<() => void>;
protected extensionList: WunderbaumExtension[];
protected extensions: ExtensionsDict;
/** Merged options from constructor args and tree- and extension defaults. */
@@ -2399,7 +2504,7 @@ declare module "wunderbaum" {
/** Expose some useful methods of the util.ts module as `tree._util`. */
_util: typeof util;
filterMode: FilterModeType;
- /** @internal Use `setColumn()`/`getActiveColElem()`*/
+ /** @internal Use `setColumn()`/`getActiveColElem()` to access. */
activeColIdx: number;
/** @internal */
_cellNavMode: boolean;
@@ -2417,7 +2522,7 @@ declare module "wunderbaum" {
* getTree(1); // Get second Wunderbaum instance on page
* getTree(event); // Get tree for this mouse- or keyboard event
* getTree("foo"); // Get tree for this `tree.options.id`
- * getTree("#tree"); // Get tree for this matching element
+ * getTree("#tree"); // Get tree for first matching element selector
* ```
*/
static getTree(el?: Element | Event | number | string | WunderbaumNode): Wunderbaum | null;
@@ -2559,20 +2664,32 @@ declare module "wunderbaum" {
/**
* Find all nodes that match condition.
*
+ * @param match title string to search for, or a
+ * callback function that returns `true` if a node is matched.
* @see {@link WunderbaumNode.findAll}
*/
findAll(match: string | RegExp | MatcherCallback): WunderbaumNode[];
+ /**
+ * Find all nodes with a given _refKey_ (aka a list of clones).
+ *
+ * @param refKey a `node.refKey` value to search for.
+ * @returns an array of matching nodes with at least two element or `[]`
+ * if nothing found.
+ *
+ * @see {@link WunderbaumNode.getCloneList}
+ */
+ findByRefKey(refKey: string): WunderbaumNode[];
/**
* Find first node that matches condition.
*
+ * @param match title string to search for, or a
+ * callback function that returns `true` if a node is matched.
* @see {@link WunderbaumNode.findFirst}
*/
findFirst(match: string | RegExp | MatcherCallback): WunderbaumNode;
/**
* Find first node that matches condition.
*
- * @param match title string to search for, or a
- * callback function that returns `true` if a node is matched.
* @see {@link WunderbaumNode.findFirst}
*
*/
@@ -2580,6 +2697,7 @@ declare module "wunderbaum" {
/**
* Find the next visible node that starts with `match`, starting at `startNode`
* and wrap-around at the end.
+ * Used by quicksearch and keyboard navigation.
*/
findNextNode(match: string | MatcherCallback, startNode?: WunderbaumNode | null): WunderbaumNode | null;
/**
@@ -2623,6 +2741,9 @@ declare module "wunderbaum" {
getActiveColElem(): HTMLSpanElement;
/**
* Return the currently active node or null.
+ * @see {@link WunderbaumNode.setActive}
+ * @see {@link WunderbaumNode.isActive}
+ * @see {@link WunderbaumNode.getFocusNode}
*/
getActiveNode(): WunderbaumNode;
/**
@@ -2630,7 +2751,8 @@ declare module "wunderbaum" {
*/
getFirstChild(): WunderbaumNode;
/**
- * Return the currently active node or null.
+ * Return the node that currently has keyboard focus or null.
+ * @see {@link WunderbaumNode.getActiveNode}
*/
getFocusNode(): WunderbaumNode;
/** Return a {node: WunderbaumNode, region: TYPE} object for a mouse event.
@@ -2645,8 +2767,16 @@ declare module "wunderbaum" {
* @internal
*/
toString(): string;
- /** Return true if any node is currently in edit-title mode. */
+ /** Return true if any node title or grid cell is currently beeing edited.
+ *
+ * See also {@link Wunderbaum.isEditingTitle}.
+ */
isEditing(): boolean;
+ /** Return true if any node is currently in edit-title mode.
+ *
+ * See also {@link WunderbaumNode.isEditingTitle} and {@link Wunderbaum.isEditing}.
+ */
+ isEditingTitle(): boolean;
/**
* Return true if any node is currently beeing loaded, i.e. a Ajax request is pending.
*/
@@ -2682,18 +2812,23 @@ declare module "wunderbaum" {
/**
* Set column #colIdx to 'active'.
*
- * This higlights the column header and -cells by adding the `wb-active` class.
+ * This higlights the column header and -cells by adding the `wb-active`
+ * class to all grid cells of the active column.
* Available in cell-nav mode only.
+ *
+ * If _options.edit_ is true, the embedded input element is focused, or if
+ * colIdx is 0, the node title is put into edit mode.
*/
- setColumn(colIdx: number): void;
- /** Set or remove keybaord focus to the tree container. */
+ setColumn(colIdx: number | string, options?: SetColumnOptions): void;
+ /** Set or remove keyboard focus to the tree container. */
setActiveNode(key: string, flag?: boolean, options?: SetActiveOptions): void;
- /** Set or remove keybaord focus to the tree container. */
+ /** Set or remove keyboard focus to the tree container. */
setFocus(flag?: boolean): void;
/**
* Schedule an update request to reflect a tree change.
* The render operation is async and debounced unless the `immediate` option
* is set.
+ *
* Use {@link WunderbaumNode.update()} if only a single node has changed,
* or {@link WunderbaumNode._render()}) to pass special options.
*/
@@ -2820,29 +2955,23 @@ declare module "wunderbaum" {
*/
enableUpdate(flag: boolean): void;
/**
- * [ext-filter] Dim or hide nodes.
+ * Dim or hide nodes.
*/
filterNodes(filter: string | NodeFilterCallback, options: FilterNodesOptions): void;
/**
- * [ext-filter] Dim or hide whole branches.
+ * Dim or hide whole branches.
*/
filterBranches(filter: string | NodeFilterCallback, options: FilterNodesOptions): void;
/**
- * [ext-filter] Reset the filter.
- *
- * @requires [[FilterExtension]]
+ * Reset the filter.
*/
clearFilter(): void;
/**
- * [ext-filter] Return true if a filter is currently applied.
- *
- * @requires [[FilterExtension]]
+ * Return true if a filter is currently applied.
*/
isFilterActive(): boolean;
/**
- * [ext-filter] Re-apply current filter.
- *
- * @requires [[FilterExtension]]
+ * Re-apply current filter.
*/
updateFilter(): void;
}
diff --git a/dist/wunderbaum.esm.js b/dist/wunderbaum.esm.js
index fa92e8a9..fa29926f 100644
--- a/dist/wunderbaum.esm.js
+++ b/dist/wunderbaum.esm.js
@@ -1,7 +1,304 @@
+/*!
+ * debounce & throttle, taken from https://github.com/lodash/lodash v4.17.21
+ * MIT License: https://raw.githubusercontent.com/lodash/lodash/4.17.21-npm/LICENSE
+ * Modified for TypeScript type annotations.
+ */
+/* --- */
+/** Detect free variable `global` from Node.js. */
+const freeGlobal = typeof global === "object" &&
+ global !== null &&
+ global.Object === Object &&
+ global;
+/** Detect free variable `globalThis` */
+const freeGlobalThis = typeof globalThis === "object" &&
+ globalThis !== null &&
+ globalThis.Object == Object &&
+ globalThis;
+/** Detect free variable `self`. */
+const freeSelf = typeof self === "object" && self !== null && self.Object === Object && self;
+/** Used as a reference to the global object. */
+const root = freeGlobalThis || freeGlobal || freeSelf || Function("return this")();
+/**
+ * Checks if `value` is the
+ * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
+ * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * isObject({})
+ * // => true
+ *
+ * isObject([1, 2, 3])
+ * // => true
+ *
+ * isObject(Function)
+ * // => true
+ *
+ * isObject(null)
+ * // => false
+ */
+function isObject(value) {
+ const type = typeof value;
+ return value != null && (type === "object" || type === "function");
+}
+/**
+ * Creates a debounced function that delays invoking `func` until after `wait`
+ * milliseconds have elapsed since the last time the debounced function was
+ * invoked, or until the next browser frame is drawn. The debounced function
+ * comes with a `cancel` method to cancel delayed `func` invocations and a
+ * `flush` method to immediately invoke them. Provide `options` to indicate
+ * whether `func` should be invoked on the leading and/or trailing edge of the
+ * `wait` timeout. The `func` is invoked with the last arguments provided to the
+ * debounced function. Subsequent calls to the debounced function return the
+ * result of the last `func` invocation.
+ *
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is
+ * invoked on the trailing edge of the timeout only if the debounced function
+ * is invoked more than once during the `wait` timeout.
+ *
+ * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+ * until the next tick, similar to `setTimeout` with a timeout of `0`.
+ *
+ * If `wait` is omitted in an environment with `requestAnimationFrame`, `func`
+ * invocation will be deferred until the next frame is drawn (typically about
+ * 16ms).
+ *
+ * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+ * for details over the differences between `debounce` and `throttle`.
+ *
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to debounce.
+ * @param {number} [wait=0]
+ * The number of milliseconds to delay; if omitted, `requestAnimationFrame` is
+ * used (if available).
+ * @param {Object} [options={}] The options object.
+ * @param {boolean} [options.leading=false]
+ * Specify invoking on the leading edge of the timeout.
+ * @param {number} [options.maxWait]
+ * The maximum time `func` is allowed to be delayed before it's invoked.
+ * @param {boolean} [options.trailing=true]
+ * Specify invoking on the trailing edge of the timeout.
+ * @returns {Function} Returns the new debounced function.
+ * @example
+ *
+ * // Avoid costly calculations while the window size is in flux.
+ * jQuery(window).on('resize', debounce(calculateLayout, 150))
+ *
+ * // Invoke `sendMail` when clicked, debouncing subsequent calls.
+ * jQuery(element).on('click', debounce(sendMail, 300, {
+ * 'leading': true,
+ * 'trailing': false
+ * }))
+ *
+ * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
+ * const debounced = debounce(batchLog, 250, { 'maxWait': 1000 })
+ * const source = new EventSource('/stream')
+ * jQuery(source).on('message', debounced)
+ *
+ * // Cancel the trailing debounced invocation.
+ * jQuery(window).on('popstate', debounced.cancel)
+ *
+ * // Check for pending invocations.
+ * const status = debounced.pending() ? "Pending..." : "Ready"
+ */
+function debounce(func, wait = 0, options = {}) {
+ let lastArgs, lastThis, maxWait, result, timerId, lastCallTime;
+ let lastInvokeTime = 0;
+ let leading = false;
+ let maxing = false;
+ let trailing = true;
+ // Bypass `requestAnimationFrame` by explicitly setting `wait=0`.
+ const useRAF = !wait && wait !== 0 && typeof root.requestAnimationFrame === "function";
+ if (typeof func !== "function") {
+ throw new TypeError("Expected a function");
+ }
+ wait = +wait || 0;
+ if (isObject(options)) {
+ leading = !!options.leading;
+ maxing = "maxWait" in options;
+ maxWait = maxing ? Math.max(+options.maxWait || 0, wait) : maxWait;
+ trailing = "trailing" in options ? !!options.trailing : trailing;
+ }
+ function invokeFunc(time) {
+ const args = lastArgs;
+ const thisArg = lastThis;
+ lastArgs = lastThis = undefined;
+ lastInvokeTime = time;
+ result = func.apply(thisArg, args);
+ return result;
+ }
+ function startTimer(pendingFunc, wait) {
+ if (useRAF) {
+ root.cancelAnimationFrame(timerId);
+ return root.requestAnimationFrame(pendingFunc);
+ }
+ return setTimeout(pendingFunc, wait);
+ }
+ function cancelTimer(id) {
+ if (useRAF) {
+ return root.cancelAnimationFrame(id);
+ }
+ clearTimeout(id);
+ }
+ function leadingEdge(time) {
+ // Reset any `maxWait` timer.
+ lastInvokeTime = time;
+ // Start the timer for the trailing edge.
+ timerId = startTimer(timerExpired, wait);
+ // Invoke the leading edge.
+ return leading ? invokeFunc(time) : result;
+ }
+ function remainingWait(time) {
+ const timeSinceLastCall = time - lastCallTime;
+ const timeSinceLastInvoke = time - lastInvokeTime;
+ const timeWaiting = wait - timeSinceLastCall;
+ return maxing
+ ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke)
+ : timeWaiting;
+ }
+ function shouldInvoke(time) {
+ const timeSinceLastCall = time - lastCallTime;
+ const timeSinceLastInvoke = time - lastInvokeTime;
+ // Either this is the first call, activity has stopped and we're at the
+ // trailing edge, the system time has gone backwards and we're treating
+ // it as the trailing edge, or we've hit the `maxWait` limit.
+ return (lastCallTime === undefined ||
+ timeSinceLastCall >= wait ||
+ timeSinceLastCall < 0 ||
+ (maxing && timeSinceLastInvoke >= maxWait));
+ }
+ function timerExpired() {
+ const time = Date.now();
+ if (shouldInvoke(time)) {
+ return trailingEdge(time);
+ }
+ // Restart the timer.
+ timerId = startTimer(timerExpired, remainingWait(time));
+ }
+ function trailingEdge(time) {
+ timerId = undefined;
+ // Only invoke if we have `lastArgs` which means `func` has been
+ // debounced at least once.
+ if (trailing && lastArgs) {
+ return invokeFunc(time);
+ }
+ lastArgs = lastThis = undefined;
+ return result;
+ }
+ function cancel() {
+ if (timerId !== undefined) {
+ cancelTimer(timerId);
+ }
+ lastInvokeTime = 0;
+ lastArgs = lastCallTime = lastThis = timerId = undefined;
+ }
+ function flush() {
+ return timerId === undefined ? result : trailingEdge(Date.now());
+ }
+ function pending() {
+ return timerId !== undefined;
+ }
+ function debounced(...args) {
+ const time = Date.now();
+ const isInvoking = shouldInvoke(time);
+ lastArgs = args;
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
+ lastThis = this;
+ lastCallTime = time;
+ if (isInvoking) {
+ if (timerId === undefined) {
+ return leadingEdge(lastCallTime);
+ }
+ if (maxing) {
+ // Handle invocations in a tight loop.
+ timerId = startTimer(timerExpired, wait);
+ return invokeFunc(lastCallTime);
+ }
+ }
+ if (timerId === undefined) {
+ timerId = startTimer(timerExpired, wait);
+ }
+ return result;
+ }
+ debounced.cancel = cancel;
+ debounced.flush = flush;
+ debounced.pending = pending;
+ return debounced;
+}
+/**
+ * Creates a throttled function that only invokes `func` at most once per
+ * every `wait` milliseconds (or once per browser frame). The throttled function
+ * comes with a `cancel` method to cancel delayed `func` invocations and a
+ * `flush` method to immediately invoke them. Provide `options` to indicate
+ * whether `func` should be invoked on the leading and/or trailing edge of the
+ * `wait` timeout. The `func` is invoked with the last arguments provided to the
+ * throttled function. Subsequent calls to the throttled function return the
+ * result of the last `func` invocation.
+ *
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is
+ * invoked on the trailing edge of the timeout only if the throttled function
+ * is invoked more than once during the `wait` timeout.
+ *
+ * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+ * until the next tick, similar to `setTimeout` with a timeout of `0`.
+ *
+ * If `wait` is omitted in an environment with `requestAnimationFrame`, `func`
+ * invocation will be deferred until the next frame is drawn (typically about
+ * 16ms).
+ *
+ * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+ * for details over the differences between `throttle` and `debounce`.
+ *
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to throttle.
+ * @param {number} [wait=0]
+ * The number of milliseconds to throttle invocations to; if omitted,
+ * `requestAnimationFrame` is used (if available).
+ * @param {Object} [options={}] The options object.
+ * @param {boolean} [options.leading=true]
+ * Specify invoking on the leading edge of the timeout.
+ * @param {boolean} [options.trailing=true]
+ * Specify invoking on the trailing edge of the timeout.
+ * @returns {Function} Returns the new throttled function.
+ * @example
+ *
+ * // Avoid excessively updating the position while scrolling.
+ * jQuery(window).on('scroll', throttle(updatePosition, 100))
+ *
+ * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
+ * const throttled = throttle(renewToken, 300000, { 'trailing': false })
+ * jQuery(element).on('click', throttled)
+ *
+ * // Cancel the trailing throttled invocation.
+ * jQuery(window).on('popstate', throttled.cancel)
+ */
+function throttle(func, wait = 0, options = {}) {
+ let leading = true;
+ let trailing = true;
+ if (typeof func !== "function") {
+ throw new TypeError("Expected a function");
+ }
+ if (isObject(options)) {
+ leading = "leading" in options ? !!options.leading : leading;
+ trailing = "trailing" in options ? !!options.trailing : trailing;
+ }
+ return debounce(func, wait, {
+ leading,
+ trailing,
+ maxWait: wait,
+ });
+}
+
/*!
* Wunderbaum - util
* Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
*/
/** @module util */
/** Readable names for `MouseEvent.button` */
@@ -27,8 +324,21 @@ const ENTITY_MAP = {
"'": "'",
"/": "/",
};
+/** A generic error that can be thrown to indicate a validation error when
+ * handling the `apply` event for a node title or the `change` event for a
+ * grid cell.
+ */
+class ValidationError extends Error {
+ constructor(message) {
+ super(message);
+ this.name = "ValidationError";
+ }
+}
/**
* A ES6 Promise, that exposes the resolve()/reject() methods.
+ *
+ * TODO: See [Promise.withResolvers()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers#description)
+ * , a proposed standard, but not yet implemented in any browser.
*/
let Deferred$1 = class Deferred {
constructor() {
@@ -360,27 +670,29 @@ function elemFromHtml(html) {
t.innerHTML = html.trim();
return t.content.firstElementChild;
}
-const _IGNORE_KEYS = new Set(["Alt", "Control", "Meta", "Shift"]);
-/** Return a HtmlElement from selector or cast an existing element. */
-function elemFromSelector(obj) {
- if (!obj) {
- return null; //(null as unknown) as HTMLElement;
- }
- if (typeof obj === "string") {
- return document.querySelector(obj);
- }
- return obj;
-}
-/** Return a EventTarget from selector or cast an existing element. */
-function eventTargetFromSelector(obj) {
+const _IGNORE_KEYS = new Set(["Alt", "Control", "Meta", "Shift"]);
+/** Return a HtmlElement from selector or cast an existing element. */
+function elemFromSelector(obj) {
if (!obj) {
- return null;
+ return null; //(null as unknown) as HTMLElement;
}
if (typeof obj === "string") {
return document.querySelector(obj);
}
return obj;
}
+// /** Return a EventTarget from selector or cast an existing element. */
+// export function eventTargetFromSelector(
+// obj: string | EventTarget
+// ): EventTarget | null {
+// if (!obj) {
+// return null;
+// }
+// if (typeof obj === "string") {
+// return document.querySelector(obj) as EventTarget;
+// }
+// return obj as EventTarget;
+// }
/**
* Return a canonical descriptive string for a keyboard or mouse event.
*
@@ -478,7 +790,8 @@ function isPlainObject(obj) {
function noop(...args) { }
function onEvent(rootTarget, eventNames, selectorOrHandler, handlerOrNone) {
let selector, handler;
- rootTarget = eventTargetFromSelector(rootTarget);
+ rootTarget = elemFromSelector(rootTarget);
+ // rootTarget = eventTargetFromSelector(rootTarget)!;
if (handlerOrNone) {
selector = selectorOrHandler;
handler = handlerOrNone;
@@ -669,8 +982,6 @@ function type(obj) {
* ```
*/
function adaptiveThrottle(callback, options) {
- let waiting = 0; // Initially, we're not waiting
- let pendingArgs = null;
const opts = Object.assign({
minDelay: 16,
defaultDelay: 200,
@@ -679,6 +990,9 @@ function adaptiveThrottle(callback, options) {
}, options);
const minDelay = Math.max(16, +opts.minDelay);
const maxDelay = +opts.maxDelay;
+ let waiting = 0; // Initially, we're not waiting
+ let pendingArgs = null;
+ let pendingTimer = null;
const throttledFn = (...args) => {
if (waiting) {
pendingArgs = args;
@@ -705,9 +1019,10 @@ function adaptiveThrottle(callback, options) {
// `adaptiveThrottle() calling worker took ${elap}ms. delay = ${curDelay}ms, using ${useDelay}ms`,
// pendingArgs
// );
- setTimeout(() => {
+ pendingTimer = setTimeout(() => {
// Unblock, and trigger pending requests if any
// const skipped = waiting - 1;
+ pendingTimer = null;
waiting = 0; // And allow future invocations
if (pendingArgs != null) {
// There was another request while running or waiting
@@ -720,52 +1035,68 @@ function adaptiveThrottle(callback, options) {
}, useDelay);
}
};
+ throttledFn.cancel = () => {
+ if (pendingTimer) {
+ clearTimeout(pendingTimer);
+ pendingTimer = null;
+ }
+ pendingArgs = null;
+ waiting = 0;
+ };
+ throttledFn.pending = () => {
+ return !!pendingTimer;
+ };
+ throttledFn.flush = () => {
+ throw new Error("Not implemented");
+ };
return throttledFn;
}
var util = /*#__PURE__*/Object.freeze({
- __proto__: null,
- Deferred: Deferred$1,
- MAX_INT: MAX_INT,
- MOUSE_BUTTONS: MOUSE_BUTTONS,
- adaptiveThrottle: adaptiveThrottle,
- assert: assert,
- documentReady: documentReady,
- documentReadyPromise: documentReadyPromise,
- each: each,
- elemFromHtml: elemFromHtml,
- elemFromSelector: elemFromSelector,
- error: error,
- escapeHtml: escapeHtml,
- escapeRegex: escapeRegex,
- escapeTooltip: escapeTooltip,
- eventTargetFromSelector: eventTargetFromSelector,
- eventToString: eventToString,
- extend: extend,
- extractHtmlText: extractHtmlText,
- getOption: getOption,
- getValueFromElem: getValueFromElem,
- isArray: isArray,
- isEmptyObject: isEmptyObject,
- isFunction: isFunction,
- isMac: isMac,
- isPlainObject: isPlainObject,
- noop: noop,
- onEvent: onEvent,
- overrideMethod: overrideMethod,
- setElemDisplay: setElemDisplay,
- setTimeoutPromise: setTimeoutPromise,
- setValueToElem: setValueToElem,
- sleep: sleep,
- toSet: toSet,
- toggleCheckbox: toggleCheckbox,
- type: type
+ __proto__: null,
+ Deferred: Deferred$1,
+ MAX_INT: MAX_INT,
+ MOUSE_BUTTONS: MOUSE_BUTTONS,
+ ValidationError: ValidationError,
+ adaptiveThrottle: adaptiveThrottle,
+ assert: assert,
+ debounce: debounce,
+ documentReady: documentReady,
+ documentReadyPromise: documentReadyPromise,
+ each: each,
+ elemFromHtml: elemFromHtml,
+ elemFromSelector: elemFromSelector,
+ error: error,
+ escapeHtml: escapeHtml,
+ escapeRegex: escapeRegex,
+ escapeTooltip: escapeTooltip,
+ eventToString: eventToString,
+ extend: extend,
+ extractHtmlText: extractHtmlText,
+ getOption: getOption,
+ getValueFromElem: getValueFromElem,
+ isArray: isArray,
+ isEmptyObject: isEmptyObject,
+ isFunction: isFunction,
+ isMac: isMac,
+ isPlainObject: isPlainObject,
+ noop: noop,
+ onEvent: onEvent,
+ overrideMethod: overrideMethod,
+ setElemDisplay: setElemDisplay,
+ setTimeoutPromise: setTimeoutPromise,
+ setValueToElem: setValueToElem,
+ sleep: sleep,
+ throttle: throttle,
+ toSet: toSet,
+ toggleCheckbox: toggleCheckbox,
+ type: type
});
/*!
* Wunderbaum - types
* Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
*/
/**
* Possible values for {@link WunderbaumNode.update()} and {@link Wunderbaum.update()}.
@@ -829,363 +1160,66 @@ var NavModeEnum;
/*!
* Wunderbaum - wb_extension_base
* Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
*/
class WunderbaumExtension {
constructor(tree, id, defaults) {
this.enabled = true;
- this.tree = tree;
- this.id = id;
- this.treeOpts = tree.options;
- const opts = tree.options;
- if (this.treeOpts[id] === undefined) {
- opts[id] = this.extensionOpts = extend({}, defaults);
- }
- else {
- // TODO: do we break existing object instance references here?
- this.extensionOpts = extend({}, defaults, opts[id]);
- opts[id] = this.extensionOpts;
- }
- this.enabled = this.getPluginOption("enabled", true);
- }
- /** Called on tree (re)init after all extensions are added, but before loading.*/
- init() {
- this.tree.element.classList.add("wb-ext-" + this.id);
- }
- // protected callEvent(type: string, extra?: any): any {
- // let func = this.extensionOpts[type];
- // if (func) {
- // return func.call(
- // this.tree,
- // util.extend(
- // {
- // event: this.id + "." + type,
- // },
- // extra
- // )
- // );
- // }
- // }
- getPluginOption(name, defaultValue) {
- var _a;
- return (_a = this.extensionOpts[name]) !== null && _a !== void 0 ? _a : defaultValue;
- }
- setPluginOption(name, value) {
- this.extensionOpts[name] = value;
- }
- setEnabled(flag = true) {
- return this.setPluginOption("enabled", !!flag);
- // this.enabled = !!flag;
- }
- onKeyEvent(data) {
- return;
- }
- onRender(data) {
- return;
- }
-}
-
-/*!
- * debounce & throttle, taken from https://github.com/lodash/lodash v4.17.21
- * MIT License: https://raw.githubusercontent.com/lodash/lodash/4.17.21-npm/LICENSE
- * Modified for TypeScript type annotations.
- */
-/* --- */
-/** Detect free variable `global` from Node.js. */
-const freeGlobal = typeof global === "object" &&
- global !== null &&
- global.Object === Object &&
- global;
-/** Detect free variable `globalThis` */
-const freeGlobalThis = typeof globalThis === "object" &&
- globalThis !== null &&
- globalThis.Object == Object &&
- globalThis;
-/** Detect free variable `self`. */
-const freeSelf = typeof self === "object" && self !== null && self.Object === Object && self;
-/** Used as a reference to the global object. */
-const root = freeGlobalThis || freeGlobal || freeSelf || Function("return this")();
-/**
- * Checks if `value` is the
- * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
- * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * isObject({})
- * // => true
- *
- * isObject([1, 2, 3])
- * // => true
- *
- * isObject(Function)
- * // => true
- *
- * isObject(null)
- * // => false
- */
-function isObject(value) {
- const type = typeof value;
- return value != null && (type === "object" || type === "function");
-}
-/**
- * Creates a debounced function that delays invoking `func` until after `wait`
- * milliseconds have elapsed since the last time the debounced function was
- * invoked, or until the next browser frame is drawn. The debounced function
- * comes with a `cancel` method to cancel delayed `func` invocations and a
- * `flush` method to immediately invoke them. Provide `options` to indicate
- * whether `func` should be invoked on the leading and/or trailing edge of the
- * `wait` timeout. The `func` is invoked with the last arguments provided to the
- * debounced function. Subsequent calls to the debounced function return the
- * result of the last `func` invocation.
- *
- * **Note:** If `leading` and `trailing` options are `true`, `func` is
- * invoked on the trailing edge of the timeout only if the debounced function
- * is invoked more than once during the `wait` timeout.
- *
- * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
- * until the next tick, similar to `setTimeout` with a timeout of `0`.
- *
- * If `wait` is omitted in an environment with `requestAnimationFrame`, `func`
- * invocation will be deferred until the next frame is drawn (typically about
- * 16ms).
- *
- * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
- * for details over the differences between `debounce` and `throttle`.
- *
- * @since 0.1.0
- * @category Function
- * @param {Function} func The function to debounce.
- * @param {number} [wait=0]
- * The number of milliseconds to delay; if omitted, `requestAnimationFrame` is
- * used (if available).
- * @param {Object} [options={}] The options object.
- * @param {boolean} [options.leading=false]
- * Specify invoking on the leading edge of the timeout.
- * @param {number} [options.maxWait]
- * The maximum time `func` is allowed to be delayed before it's invoked.
- * @param {boolean} [options.trailing=true]
- * Specify invoking on the trailing edge of the timeout.
- * @returns {Function} Returns the new debounced function.
- * @example
- *
- * // Avoid costly calculations while the window size is in flux.
- * jQuery(window).on('resize', debounce(calculateLayout, 150))
- *
- * // Invoke `sendMail` when clicked, debouncing subsequent calls.
- * jQuery(element).on('click', debounce(sendMail, 300, {
- * 'leading': true,
- * 'trailing': false
- * }))
- *
- * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
- * const debounced = debounce(batchLog, 250, { 'maxWait': 1000 })
- * const source = new EventSource('/stream')
- * jQuery(source).on('message', debounced)
- *
- * // Cancel the trailing debounced invocation.
- * jQuery(window).on('popstate', debounced.cancel)
- *
- * // Check for pending invocations.
- * const status = debounced.pending() ? "Pending..." : "Ready"
- */
-function debounce(func, wait = 0, options = {}) {
- let lastArgs, lastThis, maxWait, result, timerId, lastCallTime;
- let lastInvokeTime = 0;
- let leading = false;
- let maxing = false;
- let trailing = true;
- // Bypass `requestAnimationFrame` by explicitly setting `wait=0`.
- const useRAF = !wait && wait !== 0 && typeof root.requestAnimationFrame === "function";
- if (typeof func !== "function") {
- throw new TypeError("Expected a function");
- }
- wait = +wait || 0;
- if (isObject(options)) {
- leading = !!options.leading;
- maxing = "maxWait" in options;
- maxWait = maxing ? Math.max(+options.maxWait || 0, wait) : maxWait;
- trailing = "trailing" in options ? !!options.trailing : trailing;
- }
- function invokeFunc(time) {
- const args = lastArgs;
- const thisArg = lastThis;
- lastArgs = lastThis = undefined;
- lastInvokeTime = time;
- result = func.apply(thisArg, args);
- return result;
- }
- function startTimer(pendingFunc, wait) {
- if (useRAF) {
- root.cancelAnimationFrame(timerId);
- return root.requestAnimationFrame(pendingFunc);
- }
- return setTimeout(pendingFunc, wait);
- }
- function cancelTimer(id) {
- if (useRAF) {
- return root.cancelAnimationFrame(id);
- }
- clearTimeout(id);
- }
- function leadingEdge(time) {
- // Reset any `maxWait` timer.
- lastInvokeTime = time;
- // Start the timer for the trailing edge.
- timerId = startTimer(timerExpired, wait);
- // Invoke the leading edge.
- return leading ? invokeFunc(time) : result;
- }
- function remainingWait(time) {
- const timeSinceLastCall = time - lastCallTime;
- const timeSinceLastInvoke = time - lastInvokeTime;
- const timeWaiting = wait - timeSinceLastCall;
- return maxing
- ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke)
- : timeWaiting;
- }
- function shouldInvoke(time) {
- const timeSinceLastCall = time - lastCallTime;
- const timeSinceLastInvoke = time - lastInvokeTime;
- // Either this is the first call, activity has stopped and we're at the
- // trailing edge, the system time has gone backwards and we're treating
- // it as the trailing edge, or we've hit the `maxWait` limit.
- return (lastCallTime === undefined ||
- timeSinceLastCall >= wait ||
- timeSinceLastCall < 0 ||
- (maxing && timeSinceLastInvoke >= maxWait));
- }
- function timerExpired() {
- const time = Date.now();
- if (shouldInvoke(time)) {
- return trailingEdge(time);
- }
- // Restart the timer.
- timerId = startTimer(timerExpired, remainingWait(time));
- }
- function trailingEdge(time) {
- timerId = undefined;
- // Only invoke if we have `lastArgs` which means `func` has been
- // debounced at least once.
- if (trailing && lastArgs) {
- return invokeFunc(time);
+ this.tree = tree;
+ this.id = id;
+ this.treeOpts = tree.options;
+ const opts = tree.options;
+ if (this.treeOpts[id] === undefined) {
+ opts[id] = this.extensionOpts = extend({}, defaults);
}
- lastArgs = lastThis = undefined;
- return result;
- }
- function cancel() {
- if (timerId !== undefined) {
- cancelTimer(timerId);
+ else {
+ // TODO: do we break existing object instance references here?
+ this.extensionOpts = extend({}, defaults, opts[id]);
+ opts[id] = this.extensionOpts;
}
- lastInvokeTime = 0;
- lastArgs = lastCallTime = lastThis = timerId = undefined;
+ this.enabled = this.getPluginOption("enabled", true);
}
- function flush() {
- return timerId === undefined ? result : trailingEdge(Date.now());
+ /** Called on tree (re)init after all extensions are added, but before loading.*/
+ init() {
+ this.tree.element.classList.add("wb-ext-" + this.id);
}
- function pending() {
- return timerId !== undefined;
+ // protected callEvent(type: string, extra?: any): any {
+ // let func = this.extensionOpts[type];
+ // if (func) {
+ // return func.call(
+ // this.tree,
+ // util.extend(
+ // {
+ // event: this.id + "." + type,
+ // },
+ // extra
+ // )
+ // );
+ // }
+ // }
+ getPluginOption(name, defaultValue) {
+ var _a;
+ return (_a = this.extensionOpts[name]) !== null && _a !== void 0 ? _a : defaultValue;
}
- function debounced(...args) {
- const time = Date.now();
- const isInvoking = shouldInvoke(time);
- lastArgs = args;
- // eslint-disable-next-line @typescript-eslint/no-this-alias
- lastThis = this;
- lastCallTime = time;
- if (isInvoking) {
- if (timerId === undefined) {
- return leadingEdge(lastCallTime);
- }
- if (maxing) {
- // Handle invocations in a tight loop.
- timerId = startTimer(timerExpired, wait);
- return invokeFunc(lastCallTime);
- }
- }
- if (timerId === undefined) {
- timerId = startTimer(timerExpired, wait);
- }
- return result;
+ setPluginOption(name, value) {
+ this.extensionOpts[name] = value;
}
- debounced.cancel = cancel;
- debounced.flush = flush;
- debounced.pending = pending;
- return debounced;
-}
-/**
- * Creates a throttled function that only invokes `func` at most once per
- * every `wait` milliseconds (or once per browser frame). The throttled function
- * comes with a `cancel` method to cancel delayed `func` invocations and a
- * `flush` method to immediately invoke them. Provide `options` to indicate
- * whether `func` should be invoked on the leading and/or trailing edge of the
- * `wait` timeout. The `func` is invoked with the last arguments provided to the
- * throttled function. Subsequent calls to the throttled function return the
- * result of the last `func` invocation.
- *
- * **Note:** If `leading` and `trailing` options are `true`, `func` is
- * invoked on the trailing edge of the timeout only if the throttled function
- * is invoked more than once during the `wait` timeout.
- *
- * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
- * until the next tick, similar to `setTimeout` with a timeout of `0`.
- *
- * If `wait` is omitted in an environment with `requestAnimationFrame`, `func`
- * invocation will be deferred until the next frame is drawn (typically about
- * 16ms).
- *
- * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
- * for details over the differences between `throttle` and `debounce`.
- *
- * @since 0.1.0
- * @category Function
- * @param {Function} func The function to throttle.
- * @param {number} [wait=0]
- * The number of milliseconds to throttle invocations to; if omitted,
- * `requestAnimationFrame` is used (if available).
- * @param {Object} [options={}] The options object.
- * @param {boolean} [options.leading=true]
- * Specify invoking on the leading edge of the timeout.
- * @param {boolean} [options.trailing=true]
- * Specify invoking on the trailing edge of the timeout.
- * @returns {Function} Returns the new throttled function.
- * @example
- *
- * // Avoid excessively updating the position while scrolling.
- * jQuery(window).on('scroll', throttle(updatePosition, 100))
- *
- * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
- * const throttled = throttle(renewToken, 300000, { 'trailing': false })
- * jQuery(element).on('click', throttled)
- *
- * // Cancel the trailing throttled invocation.
- * jQuery(window).on('popstate', throttled.cancel)
- */
-function throttle(func, wait = 0, options = {}) {
- let leading = true;
- let trailing = true;
- if (typeof func !== "function") {
- throw new TypeError("Expected a function");
+ setEnabled(flag = true) {
+ return this.setPluginOption("enabled", !!flag);
+ // this.enabled = !!flag;
}
- if (isObject(options)) {
- leading = "leading" in options ? !!options.leading : leading;
- trailing = "trailing" in options ? !!options.trailing : trailing;
+ onKeyEvent(data) {
+ return;
+ }
+ onRender(data) {
+ return;
}
- return debounce(func, wait, {
- leading,
- trailing,
- maxWait: wait,
- });
}
/*!
* Wunderbaum - ext-filter
* Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
*/
const START_MARKER = "\uFFF7";
const END_MARKER = "\uFFF8";
@@ -1367,7 +1401,12 @@ class FilterExtension extends WunderbaumExtension {
});
treeOpts.autoCollapse = prevAutoCollapse;
if (count === 0 && opts.noData && hideMode) {
- tree.root.setStatus(NodeStatusType.noData);
+ if (typeof opts.noData === "string") {
+ tree.root.setStatus(NodeStatusType.noData, { message: opts.noData });
+ }
+ else {
+ tree.root.setStatus(NodeStatusType.noData);
+ }
}
// Redraw whole tree
tree.logInfo(`Filter '${match}' found ${count} nodes in ${Date.now() - start} ms.`);
@@ -1485,7 +1524,7 @@ function _markFuzzyMatchedChars(text, matches, escapeTitles = true) {
/*!
* Wunderbaum - ext-keynav
* Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
*/
const QUICKSEARCH_DELAY = 500;
class KeynavExtension extends WunderbaumExtension {
@@ -1507,6 +1546,13 @@ class KeynavExtension extends WunderbaumExtension {
}
return input;
}
+ // /* Return the current cell's embedded input that has keyboard focus. */
+ // protected _getFocusedInputElem(): HTMLInputElement | null {
+ // const ace = this.tree
+ // .getActiveColElem()
+ // ?.querySelector("input:focus,select:focus");
+ // return ace || null;
+ // }
/* Return true if the current cell's embedded input has keyboard focus. */
_isCurInputFocused() {
var _a;
@@ -1522,7 +1568,6 @@ class KeynavExtension extends WunderbaumExtension {
const curInput = this._getEmbeddedInputElem(event.target);
const inputHasFocus = curInput && this._isCurInputFocused();
const navModeOption = opts.navigationModeOption;
- // isCellEditMode = tree.navMode === NavigationMode.cellEdit;
let focusNode, eventName = eventToString(event), node = data.node, handled = true;
// tree.log(`onKeyEvent: ${eventName}, curInput`, curInput);
if (!tree.isEnabled()) {
@@ -1667,22 +1712,34 @@ class KeynavExtension extends WunderbaumExtension {
}
}
else {
- const curInput = this._getEmbeddedInputElem(null);
+ // -----------------------------------------------------------------------
+ // --- Cell Mode ---
+ // -----------------------------------------------------------------------
+ // // Standard navigation (cell mode)
+ // if (isCellEditMode && INPUT_BREAKOUT_KEYS.has(eventName)) {
+ // }
+ // const curInput = this._getEmbeddedInputElem(null);
const curInputType = curInput ? curInput.type || curInput.tagName : "";
- const inputHasFocus = curInput && this._isCurInputFocused();
+ // const inputHasFocus = curInput && this._isCurInputFocused();
const inputCanFocus = curInput && curInputType !== "checkbox";
if (inputHasFocus) {
if (eventName === "Escape") {
- // Discard changes
+ node.logDebug(`Reset focused input on Escape`);
+ // Discard changes and reset input validation state
+ curInput.setCustomValidity("");
node._render();
// Keep cell-nav mode
- node.logDebug(`Reset focused input`);
tree.setFocus();
tree.setColumn(tree.activeColIdx);
return;
// } else if (!INPUT_BREAKOUT_KEYS.has(eventName)) {
}
else if (eventName !== "Enter") {
+ if (curInput && curInput.checkValidity && !curInput.checkValidity()) {
+ // Invalid input: ignore all keys except Enter and Escape
+ node.logDebug(`Ignored ${eventName} inside invalid input`);
+ return false;
+ }
// Let current ` ` handle it
node.logDebug(`Ignored ${eventName} inside focused input`);
return;
@@ -1697,9 +1754,10 @@ class KeynavExtension extends WunderbaumExtension {
else if (curInput) {
// On a cell that has an embedded, unfocused
if (eventName.length === 1 && inputCanFocus) {
+ // Typing a single char
curInput.focus();
curInput.value = "";
- node.logDebug(`Focus imput: ${eventName}`);
+ node.logDebug(`Focus input: ${eventName}`);
return false;
}
}
@@ -1711,7 +1769,6 @@ class KeynavExtension extends WunderbaumExtension {
eventName = tree.activeColIdx > 0 ? "ArrowLeft" : "";
handled = true;
}
- else ;
switch (eventName) {
case "+":
case "Add":
@@ -1831,7 +1888,7 @@ class KeynavExtension extends WunderbaumExtension {
/*!
* Wunderbaum - ext-logger
* Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
*/
class LoggerExtension extends WunderbaumExtension {
constructor(tree) {
@@ -1873,7 +1930,7 @@ class LoggerExtension extends WunderbaumExtension {
/*!
* Wunderbaum - common
* Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
*/
const DEFAULT_DEBUGLEVEL = 3; // Replaced by rollup script
/**
@@ -1992,7 +2049,7 @@ const KEY_TO_ACTION_DICT = {
};
/** Return a callback that returns true if the node title matches the string
* or regular expression.
- * @see {@link WunderbaumNode.findAll}
+ * @see {@link WunderbaumNode.findAll()}
*/
function makeNodeTitleMatcher(match) {
if (match instanceof RegExp) {
@@ -2196,7 +2253,7 @@ function decompressSourceData(source) {
/*!
* Wunderbaum - ext-dnd
* Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
*/
const nodeMimeType = "application/x-wunderbaum-node";
class DndExtension extends WunderbaumExtension {
@@ -2445,7 +2502,7 @@ class DndExtension extends WunderbaumExtension {
if (e.type === "dragstart") {
// Set a default definition of allowed effects
e.dataTransfer.effectAllowed = dndOpts.effectAllowed; //"copyMove"; // "all";
- if (srcNode.isEditing()) {
+ if (srcNode.isEditingTitle()) {
srcNode.logDebug("Prevented dragging node in edit mode.");
e.preventDefault();
return false;
@@ -2627,7 +2684,7 @@ class DndExtension extends WunderbaumExtension {
/*!
* Wunderbaum - drag_observer
* Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
*/
/**
* Convert mouse- and touch events to 'dragstart', 'drag', and 'dragstop'.
@@ -2763,7 +2820,7 @@ class DragObserver {
/*!
* Wunderbaum - ext-grid
* Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
*/
class GridExtension extends WunderbaumExtension {
constructor(tree) {
@@ -2800,7 +2857,7 @@ class GridExtension extends WunderbaumExtension {
/*!
* Wunderbaum - deferred
* Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
*/
/**
* Implement a ES6 Promise, that exposes a resolve() and reject() method.
@@ -2824,27 +2881,27 @@ class Deferred {
this._reject = reject;
});
}
- /** Resolve the [[Promise]]. */
+ /** Resolve the Promise. */
resolve(value) {
this._resolve(value);
}
- /** Reject the [[Promise]]. */
+ /** Reject the Promise. */
reject(reason) {
this._reject(reason);
}
- /** Return the native [[Promise]] instance.*/
+ /** Return the native Promise instance.*/
promise() {
return this._promise;
}
- /** Call [[Promise.then]] on the embedded promise instance.*/
+ /** Call Promise.then on the embedded promise instance.*/
then(cb) {
return this._promise.then(cb);
}
- /** Call [[Promise.catch]] on the embedded promise instance.*/
+ /** Call Promise.catch on the embedded promise instance.*/
catch(cb) {
return this._promise.catch(cb);
}
- /** Call [[Promise.finally]] on the embedded promise instance.*/
+ /** Call Promise.finally on the embedded promise instance.*/
finally(cb) {
return this._promise.finally(cb);
}
@@ -2853,7 +2910,7 @@ class Deferred {
/*!
* Wunderbaum - wunderbaum_node
* Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
*/
/** WunderbaumNode properties that can be passed with source data.
* (Any other source properties will be stored as `node.data.PROP`.)
@@ -3154,6 +3211,10 @@ class WunderbaumNode {
}
}
}
+ /** Start editing this node's title. */
+ startEditTitle() {
+ this.tree._callMethod("edit.startEditTitle", this);
+ }
/** Call `setExpanded()` on all descendant nodes. */
async expandAll(flag = true, options) {
const tree = this.tree;
@@ -3363,6 +3424,22 @@ class WunderbaumNode {
const colElems = (_a = this._rowElem) === null || _a === void 0 ? void 0 : _a.querySelectorAll("span.wb-col");
return colElems ? colElems[colIdx] : null;
}
+ /**
+ * Return all nodes with the same refKey.
+ *
+ * @param includeSelf Include this node itself.
+ * @see {@link Wunderbaum.findByRefKey}
+ */
+ getCloneList(includeSelf = false) {
+ if (!this.refKey) {
+ return [];
+ }
+ const clones = this.tree.findByRefKey(this.refKey);
+ if (includeSelf) {
+ return clones;
+ }
+ return [...clones].filter((n) => n !== this);
+ }
/** Return the first child node or null.
* @returns {WunderbaumNode | null}
*/
@@ -3467,17 +3544,22 @@ class WunderbaumNode {
return this.tree.activeNode === this;
}
/** Return true if this node is a direct or indirect parent of `other`.
- * (See also [[isParentOf]].)
+ * @see {@link WunderbaumNode.isParentOf}
*/
isAncestorOf(other) {
return other && other.isDescendantOf(this);
}
/** Return true if this node is a **direct** subnode of `other`.
- * (See also [[isDescendantOf]].)
+ * @see {@link WunderbaumNode.isDescendantOf}
*/
isChildOf(other) {
return other && this.parent === other;
}
+ /** Return true if this node's refKey is used by at least one other node.
+ */
+ isClone() {
+ return !!this.refKey && this.tree.findByRefKey(this.refKey).length > 1;
+ }
/** Return true if this node's title spans all columns, i.e. the node has no
* grid cells.
*/
@@ -3485,7 +3567,7 @@ class WunderbaumNode {
return !!this.getOption("colspan");
}
/** Return true if this node is a direct or indirect subnode of `other`.
- * (See also [[isChildOf]].)
+ * @see {@link WunderbaumNode.isChildOf}
*/
isDescendantOf(other) {
if (!other || other.tree !== this.tree) {
@@ -3520,8 +3602,11 @@ class WunderbaumNode {
}
return true;
}
- /** Return true if this node is currently in edit-title mode. */
- isEditing() {
+ /** Return true if _this_ node is currently in edit-title mode.
+ *
+ * See {@link Wunderbaum.startEditTitle} to check if any node is currently edited.
+ */
+ isEditingTitle() {
return this.tree._callMethod("edit.isEditingTitle", this);
}
/** Return true if this node is currently expanded. */
@@ -3555,7 +3640,7 @@ class WunderbaumNode {
return this.statusNodeType === "paging";
}
/** Return true if this node is a **direct** parent of `other`.
- * (See also [[isAncestorOf]].)
+ * @see {@link WunderbaumNode.isAncestorOf}
*/
isParentOf(other) {
return other && other.parent === this;
@@ -3577,7 +3662,7 @@ class WunderbaumNode {
return !!this._rowElem;
}
/** Return true if this node is the (invisible) system root node.
- * (See also [[isTopLevel()]].)
+ * @see {@link WunderbaumNode.isTopLevel}
*/
isRootNode() {
return this.tree.root === this;
@@ -4456,6 +4541,7 @@ class WunderbaumNode {
let i = 0;
for (const colSpan of rowDiv.children) {
colSpan.classList.toggle("wb-active", i++ === tree.activeColIdx);
+ colSpan.classList.remove("wb-error", "wb-invalid");
}
// Update icon (if not opts.isNew, which would rebuild markup anyway)
const iconSpan = nodeElem.querySelector("i.wb-icon");
@@ -4637,16 +4723,21 @@ class WunderbaumNode {
return this.tree.scrollTo(opts);
}
/**
- * Activate this node, deactivate previous, send events, activate column and scroll int viewport.
+ * Activate this node, deactivate previous, send events, activate column and
+ * scroll into viewport.
*/
async setActive(flag = true, options) {
const tree = this.tree;
const prev = tree.activeNode;
const retrigger = options === null || options === void 0 ? void 0 : options.retrigger; // Default: false
const focusTree = options === null || options === void 0 ? void 0 : options.focusTree; // Default: false
- const focusNode = (options === null || options === void 0 ? void 0 : options.focusNode) !== false; // Default: true
+ // const focusNode = options?.focusNode !== false; // Default: true
const noEvents = options === null || options === void 0 ? void 0 : options.noEvents; // Default: false
- const orgEvent = options === null || options === void 0 ? void 0 : options.event; // Default: false
+ const orgEvent = options === null || options === void 0 ? void 0 : options.event; // Default: null
+ const colIdx = options === null || options === void 0 ? void 0 : options.colIdx; // Default: null
+ const edit = options === null || options === void 0 ? void 0 : options.edit; // Default: false
+ assert(!colIdx || tree.isCellNav(), "colIdx requires cellNav");
+ assert(!edit || colIdx != null, "edit requires colIdx");
if (!noEvents) {
if (flag) {
if (prev !== this || retrigger) {
@@ -4671,32 +4762,36 @@ class WunderbaumNode {
if (prev !== this) {
if (flag) {
tree.activeNode = this;
- if (focusNode || focusTree) {
- tree.focusNode = this;
- }
- if (focusTree) {
- tree.setFocus();
- }
}
prev === null || prev === void 0 ? void 0 : prev.update(ChangeType.status);
this.update(ChangeType.status);
}
- if (options &&
- options.colIdx != null &&
- options.colIdx !== tree.activeColIdx &&
- tree.isCellNav()) {
- tree.setColumn(options.colIdx);
- }
- if (flag && !noEvents) {
- this._callEvent("activate", { prevNode: prev, event: orgEvent });
- }
- return this.makeVisible();
+ return this.makeVisible().then(() => {
+ if (flag) {
+ if (focusTree || edit) {
+ tree.setFocus();
+ tree.focusNode = this;
+ tree.focusNode.setFocus();
+ }
+ // if (focusNode || edit) {
+ // tree.focusNode = this;
+ // tree.focusNode.setFocus();
+ // }
+ if (colIdx != null && tree.isCellNav()) {
+ tree.setColumn(colIdx, { edit: edit });
+ }
+ if (!noEvents) {
+ this._callEvent("activate", { prevNode: prev, event: orgEvent });
+ }
+ }
+ });
}
/**
* Expand or collapse this node.
*/
async setExpanded(flag = true, options) {
const { force, scrollIntoView, immediate } = options !== null && options !== void 0 ? options : {};
+ const sendEvents = !(options === null || options === void 0 ? void 0 : options.noEvents); // Default: send events
if (!flag &&
this.isExpanded() &&
this.getLevel() <= this.tree.getOption("minExpandLevel") &&
@@ -4707,6 +4802,10 @@ class WunderbaumNode {
if (!flag === !this.expanded) {
return; // Nothing to do
}
+ if (sendEvents &&
+ this._callEvent("beforeExpand", { flag: flag }) === false) {
+ return;
+ }
// this.log("setExpanded()");
if (flag && this.getOption("autoCollapse")) {
this.collapseSiblings(options);
@@ -4725,13 +4824,16 @@ class WunderbaumNode {
lastChild.scrollIntoView({ topNode: this });
}
}
+ if (sendEvents) {
+ this._callEvent("expand", { flag: flag });
+ }
}
/**
* Set keyboard focus here.
* @see {@link setActive}
*/
setFocus(flag = true) {
- assert(!!flag, "blur is not yet implemented");
+ assert(!!flag, "Blur is not yet implemented");
const prev = this.tree.focusNode;
this.tree.focusNode = this;
prev === null || prev === void 0 ? void 0 : prev.update();
@@ -5186,7 +5288,7 @@ WunderbaumNode.sequence = 0;
/*!
* Wunderbaum - ext-edit
* Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
*/
// const START_MARKER = "\uFFF7";
class EditExtension extends WunderbaumExtension {
@@ -5211,40 +5313,62 @@ class EditExtension extends WunderbaumExtension {
this.debouncedOnChange = debounce(this._onChange.bind(this), this.getPluginOption("debounce"));
}
/*
- * Call an event handler, while marking the current node cell 'dirty'.
+ * Call an event handler, while marking the current node cell 'busy'.
+ * Deal with returned promises and ValidationError.
+ * Convert a ValidationError into a input.setCustomValidity() call and vice versa.
*/
- _applyChange(eventName, node, colElem, extra) {
- let res;
+ async _applyChange(eventName, node, colElem, inputElem, extra) {
node.log(`_applyChange(${eventName})`, extra);
colElem.classList.add("wb-busy");
- colElem.classList.remove("wb-error");
- try {
- res = node._callEvent(eventName, extra);
- }
- catch (err) {
- node.logError(`Error in ${eventName} event handler`, err);
- colElem.classList.add("wb-error");
- colElem.classList.remove("wb-busy");
- }
- // Convert scalar return value to a resolved promise
- if (!(res instanceof Promise)) {
- res = Promise.resolve(res);
- }
- res
+ colElem.classList.remove("wb-error", "wb-invalid");
+ inputElem.setCustomValidity("");
+ // Call event handler either ('change' or 'edit.appy'), which may return a
+ // promise or a scalar value or throw a ValidationError.
+ return new Promise((resolve, reject) => {
+ const res = node._callEvent(eventName, extra);
+ // normalize to promise, even if a scalar value was returned and await it
+ Promise.resolve(res)
+ .then((res) => {
+ resolve(res);
+ })
+ .catch((err) => {
+ reject(err);
+ });
+ })
+ .then((res) => {
+ if (!inputElem.checkValidity()) {
+ // Native validation failed or handler called 'inputElem.setCustomValidity()'
+ node.logWarn("inputElem.checkValidity() failed: throwing....");
+ throw new ValidationError(inputElem.validationMessage);
+ }
+ return res;
+ })
.catch((err) => {
- node.logError(`Error in ${eventName} event promise`, err);
- colElem.classList.add("wb-error");
+ if (err instanceof ValidationError) {
+ node.logWarn("catched ", err);
+ colElem.classList.add("wb-invalid");
+ if (inputElem.setCustomValidity && !inputElem.validationMessage) {
+ inputElem.setCustomValidity(err.message);
+ }
+ if (inputElem.validationMessage) {
+ inputElem.reportValidity();
+ }
+ // throw err;
+ }
+ else {
+ node.logError(`Error in ${eventName} event handler (throw e.util.ValidationError instead if this was intended)`, err);
+ colElem.classList.add("wb-error");
+ throw err;
+ }
})
.finally(() => {
colElem.classList.remove("wb-busy");
});
- return res;
}
/*
* Called for when a control that is embedded in a cell fires a `change` event.
*/
_onChange(e) {
- // let res;
const info = Wunderbaum.getEventInfo(e);
const node = info.node;
const colElem = info.colElem;
@@ -5252,16 +5376,15 @@ class EditExtension extends WunderbaumExtension {
this.tree.log("Ignored change event for removed element or node title");
return;
}
- this._applyChange("change", node, colElem, {
+ // See also WbChangeEventType
+ this._applyChange("change", node, colElem, e.target, {
info: info,
event: e,
inputElem: e.target,
inputValue: Wunderbaum.util.getValueFromElem(e.target),
+ inputValid: e.target.checkValidity(),
});
}
- // handleKey(e:KeyboardEvent):boolean {
- // if(this.tree.cellNavMode )
- // }
init() {
super.init();
onEvent(this.tree.element, "change", //"change input",
@@ -5308,7 +5431,6 @@ class EditExtension extends WunderbaumExtension {
break;
case "F2":
if (trigger.indexOf("F2") >= 0) {
- // tree.setNavigationMode(NavigationMode.cellEdit);
this.startEditTitle();
return false;
}
@@ -5333,14 +5455,21 @@ class EditExtension extends WunderbaumExtension {
this.tree.logDebug(`startEditTitle(node=${node})`);
let inputHtml = node._callEvent("edit.beforeEdit");
if (inputHtml === false) {
- node.logInfo("beforeEdit canceled operation.");
+ node.logDebug("beforeEdit canceled operation.");
return;
}
- // `beforeEdit(e)` may return an input HTML string. Otherwise use a default.
+ // `beforeEdit(e)` may return an input HTML string. Otherwise use a default
// (we also treat a `true` return value as 'use default'):
if (inputHtml === true || !inputHtml) {
const title = escapeHtml(node.title);
- inputHtml = ` `;
+ let opt = this.getPluginOption("maxlength");
+ const maxlength = opt ? ` maxlength="${opt}"` : "";
+ opt = this.getPluginOption("minlength");
+ const minlength = opt ? ` minlength="${opt}"` : "";
+ const required = opt > 0 ? " required" : "";
+ inputHtml =
+ ` `;
}
const titleSpan = node
.getColElem(0)
@@ -5351,7 +5480,9 @@ class EditExtension extends WunderbaumExtension {
// Permanently apply input validations (CSS and tooltip)
inputElem.addEventListener("keydown", (e) => {
inputElem.setCustomValidity("");
- if (!inputElem.reportValidity()) ;
+ if (!inputElem.reportValidity()) {
+ node.logWarn(`Invalid input: '${inputElem.value}'`);
+ }
});
}
inputElem.focus();
@@ -5398,12 +5529,12 @@ class EditExtension extends WunderbaumExtension {
throw new Error(`Input validation failed for "${newValue}": ${errMsg}.`);
}
const colElem = node.getColElem(0);
- this._applyChange("edit.apply", node, colElem, {
+ this._applyChange("edit.apply", node, colElem, focusElem, {
oldValue: node.title,
newValue: newValue,
inputElem: focusElem,
- })
- .then((value) => {
+ inputValid: focusElem.checkValidity(),
+ }).then((value) => {
const errMsg = focusElem.validationMessage;
if (validity && errMsg && value !== false) {
// Handler called 'inputElem.setCustomValidity()' to signal error
@@ -5422,10 +5553,10 @@ class EditExtension extends WunderbaumExtension {
this.curEditNode = null;
this.relatedNode = null;
this.tree.setFocus(); // restore focus that was in the input element
- })
- .catch((err) => {
- node.logError(err);
});
+ // .catch((err) => {
+ // node.logError(err);
+ // });
// Trigger 'change' event for embedded ` `
// focusElem.blur();
}
@@ -5486,8 +5617,8 @@ class EditExtension extends WunderbaumExtension {
* https://github.com/mar10/wunderbaum
*
* Released under the MIT license.
- * @version v0.7.0
- * @date Sat, 09 Dec 2023 13:47:27 GMT
+ * @version v0.8.0
+ * @date Thu, 11 Jan 2024 19:37:23 GMT
*/
// import "./wunderbaum.scss";
class WbSystemRoot extends WunderbaumNode {
@@ -5504,7 +5635,7 @@ class WbSystemRoot extends WunderbaumNode {
/**
* A persistent plain object or array.
*
- * See also [[WunderbaumOptions]].
+ * See also {@link WunderbaumOptions}.
*/
class Wunderbaum {
constructor(options) {
@@ -5537,7 +5668,7 @@ class Wunderbaum {
// --- FILTER ---
this.filterMode = null;
// --- KEYNAV ---
- /** @internal Use `setColumn()`/`getActiveColElem()`*/
+ /** @internal Use `setColumn()`/`getActiveColElem()` to access. */
this.activeColIdx = 0;
/** @internal */
this._cellNavMode = false;
@@ -5713,6 +5844,7 @@ class Wunderbaum {
else {
this.setNavigationOption(opts.navigationModeOption);
}
+ this.update(ChangeType.structure, { immediate: true });
readyDeferred.resolve();
})
.catch((error) => {
@@ -5764,7 +5896,7 @@ class Wunderbaum {
info.region === "title" &&
node.isActive() &&
(!slowClickDelay || Date.now() - this.lastClickTime < slowClickDelay)) {
- this._callMethod("edit.startEditTitle", node);
+ node.startEditTitle();
}
if (info.colIdx >= 0) {
node.setActive(true, { colIdx: info.colIdx, event: e });
@@ -5811,7 +5943,7 @@ class Wunderbaum {
const flag = e.type === "focusin";
const targetNode = Wunderbaum.getNode(e);
this._callEvent("focus", { flag: flag, event: e });
- if (flag && this.isRowNav() && !this.isEditing()) {
+ if (flag && this.isRowNav() && !this.isEditingTitle()) {
if (opts.navigationModeOption === NavModeEnum.row) {
targetNode === null || targetNode === void 0 ? void 0 : targetNode.setActive();
}
@@ -5835,7 +5967,7 @@ class Wunderbaum {
* getTree(1); // Get second Wunderbaum instance on page
* getTree(event); // Get tree for this mouse- or keyboard event
* getTree("foo"); // Get tree for this `tree.options.id`
- * getTree("#tree"); // Get tree for this matching element
+ * getTree("#tree"); // Get tree for first matching element selector
* ```
*/
static getTree(el) {
@@ -5942,31 +6074,33 @@ class Wunderbaum {
assert(key != null && !this.keyMap.has(key), `Missing or duplicate key: '${key}'.`);
this.keyMap.set(key, node);
const rk = node.refKey;
- if (rk) {
+ if (rk != null) {
const rks = this.refKeyMap.get(rk); // Set of nodes with this refKey
if (rks) {
rks.add(node);
}
else {
- this.refKeyMap.set(rk, new Set());
+ this.refKeyMap.set(rk, new Set([node]));
}
}
}
/** Remove node from tree's bookkeeping data structures. */
_unregisterNode(node) {
+ // Remove refKey reference from map (if any)
const rk = node.refKey;
- if (rk) {
+ if (rk != null) {
const rks = this.refKeyMap.get(rk);
if (rks && rks.delete(node) && !rks.size) {
// We just removed the last element
this.refKeyMap.delete(rk);
}
}
- // mark as disposed
+ // Remove key reference from map
+ this.keyMap.delete(node.key);
+ // Mark as disposed
node.tree = null;
node.parent = null;
- // node.title = "DISPOSED: " + node.title
- // this.viewNodes.delete(node);
+ // Remove HTML markup
node.removeMarkup();
}
/** Call all hook methods of all registered extensions.*/
@@ -6170,7 +6304,7 @@ class Wunderbaum {
this._callMethod("edit.createNode", "after");
break;
case "rename":
- this._callMethod("edit.startEditTitle");
+ node.startEditTitle();
break;
// Simple clipboard simulation:
// case "cut":
@@ -6217,7 +6351,6 @@ class Wunderbaum {
this.root.children = null;
this.keyMap.clear();
this.refKeyMap.clear();
- // this.viewNodes.clear();
this.treeRowCount = 0;
this.activeNode = null;
this.focusNode = null;
@@ -6410,14 +6543,31 @@ class Wunderbaum {
/**
* Find all nodes that match condition.
*
+ * @param match title string to search for, or a
+ * callback function that returns `true` if a node is matched.
* @see {@link WunderbaumNode.findAll}
*/
findAll(match) {
return this.root.findAll(match);
}
+ /**
+ * Find all nodes with a given _refKey_ (aka a list of clones).
+ *
+ * @param refKey a `node.refKey` value to search for.
+ * @returns an array of matching nodes with at least two element or `[]`
+ * if nothing found.
+ *
+ * @see {@link WunderbaumNode.getCloneList}
+ */
+ findByRefKey(refKey) {
+ const clones = this.refKeyMap.get(refKey);
+ return clones ? Array.from(clones) : [];
+ }
/**
* Find first node that matches condition.
*
+ * @param match title string to search for, or a
+ * callback function that returns `true` if a node is matched.
* @see {@link WunderbaumNode.findFirst}
*/
findFirst(match) {
@@ -6426,8 +6576,6 @@ class Wunderbaum {
/**
* Find first node that matches condition.
*
- * @param match title string to search for, or a
- * callback function that returns `true` if a node is matched.
* @see {@link WunderbaumNode.findFirst}
*
*/
@@ -6437,6 +6585,7 @@ class Wunderbaum {
/**
* Find the next visible node that starts with `match`, starting at `startNode`
* and wrap-around at the end.
+ * Used by quicksearch and keyboard navigation.
*/
findNextNode(match, startNode) {
//, visibleOnly) {
@@ -6604,6 +6753,9 @@ class Wunderbaum {
}
/**
* Return the currently active node or null.
+ * @see {@link WunderbaumNode.setActive}
+ * @see {@link WunderbaumNode.isActive}
+ * @see {@link WunderbaumNode.getFocusNode}
*/
getActiveNode() {
return this.activeNode;
@@ -6615,7 +6767,8 @@ class Wunderbaum {
return this.root.getFirstChild();
}
/**
- * Return the currently active node or null.
+ * Return the node that currently has keyboard focus or null.
+ * @see {@link WunderbaumNode.getActiveNode}
*/
getFocusNode() {
return this.focusNode;
@@ -6692,8 +6845,19 @@ class Wunderbaum {
toString() {
return `Wunderbaum<'${this.id}'>`;
}
- /** Return true if any node is currently in edit-title mode. */
+ /** Return true if any node title or grid cell is currently beeing edited.
+ *
+ * See also {@link Wunderbaum.isEditingTitle}.
+ */
isEditing() {
+ const focusElem = this.nodeListElement.querySelector("input:focus,select:focus");
+ return !!focusElem;
+ }
+ /** Return true if any node is currently in edit-title mode.
+ *
+ * See also {@link WunderbaumNode.isEditingTitle} and {@link Wunderbaum.isEditing}.
+ */
+ isEditingTitle() {
return this._callMethod("edit.isEditingTitle");
}
/**
@@ -6829,12 +6993,23 @@ class Wunderbaum {
/**
* Set column #colIdx to 'active'.
*
- * This higlights the column header and -cells by adding the `wb-active` class.
+ * This higlights the column header and -cells by adding the `wb-active`
+ * class to all grid cells of the active column.
* Available in cell-nav mode only.
+ *
+ * If _options.edit_ is true, the embedded input element is focused, or if
+ * colIdx is 0, the node title is put into edit mode.
*/
- setColumn(colIdx) {
- var _a;
- assert(this.isCellNav(), "Exected cellNav mode");
+ setColumn(colIdx, options) {
+ var _a, _b, _c;
+ const edit = options === null || options === void 0 ? void 0 : options.edit;
+ const scroll = (options === null || options === void 0 ? void 0 : options.scrollIntoView) !== false;
+ assert(this.isCellNav(), "Expected cellNav mode");
+ if (typeof colIdx === "string") {
+ const cid = colIdx;
+ colIdx = this.columns.findIndex((c) => c.id === colIdx);
+ assert(colIdx >= 0, `Invalid colId: ${cid}`);
+ }
assert(0 <= colIdx && colIdx < this.columns.length, `Invalid colIdx: ${colIdx}`);
this.activeColIdx = colIdx;
// Update `wb-active` class for all headers
@@ -6854,17 +7029,26 @@ class Wunderbaum {
colDiv.classList.toggle("wb-active", i++ === colIdx);
}
}
- // Vertical scroll into view
- // if (this.options.fixedCol) {
- this.scrollToHorz();
- // }
+ // Horizontically scroll into view
+ if (scroll || edit) {
+ this.scrollToHorz();
+ }
+ if (edit && this.activeNode) {
+ // this.activeNode.setFocus(); // Blur prev. input if any
+ if (colIdx === 0) {
+ this.activeNode.startEditTitle();
+ }
+ else {
+ (_c = (_b = this.getActiveColElem()) === null || _b === void 0 ? void 0 : _b.querySelector("input,select")) === null || _c === void 0 ? void 0 : _c.focus();
+ }
+ }
}
- /** Set or remove keybaord focus to the tree container. */
+ /** Set or remove keyboard focus to the tree container. */
setActiveNode(key, flag = true, options) {
var _a;
(_a = this.findKey(key)) === null || _a === void 0 ? void 0 : _a.setActive(flag, options);
}
- /** Set or remove keybaord focus to the tree container. */
+ /** Set or remove keyboard focus to the tree container. */
setFocus(flag = true) {
if (flag) {
this.element.focus();
@@ -6874,6 +7058,14 @@ class Wunderbaum {
}
}
update(change, node, options) {
+ // this.log(`update(${change}) node=${node}`);
+ if (!(node instanceof WunderbaumNode)) {
+ options = node;
+ node = undefined;
+ }
+ const immediate = !!getOption(options, "immediate");
+ const RF = RenderFlag;
+ const pending = this.pendingChangeTypes;
if (this._disableUpdateCount) {
// Assuming that we redraw all when enableUpdate() is re-enabled.
// this.log(
@@ -6882,14 +7074,6 @@ class Wunderbaum {
this._disableUpdateIgnoreCount++;
return;
}
- // this.log(`update(${change}) node=${node}`);
- if (!(node instanceof WunderbaumNode)) {
- options = node;
- node = null;
- }
- const immediate = !!getOption(options, "immediate");
- const RF = RenderFlag;
- const pending = this.pendingChangeTypes;
switch (change) {
case ChangeType.any:
case ChangeType.colStructure:
@@ -7217,10 +7401,14 @@ class Wunderbaum {
_updateViewportImmediately() {
var _a;
if (this._disableUpdateCount) {
- this.log(`_updateViewportImmediately() IGNORED (disable level: ${this._disableUpdateCount})`);
+ this.log(`_updateViewportImmediately() IGNORED (disable level: ${this._disableUpdateCount}).`);
this._disableUpdateIgnoreCount++;
return;
}
+ if (this._updateViewportThrottled.pending()) {
+ // this.logWarn(`_updateViewportImmediately() cancel pending timer.`);
+ this._updateViewportThrottled.cancel();
+ }
// Shorten container height to avoid v-scrollbar
const FIX_ADJUST_HEIGHT = 1;
const RF = RenderFlag;
@@ -7324,9 +7512,6 @@ class Wunderbaum {
}
let endIdx = Math.max(0, (ofs + vp_height) / row_height + prefetch);
endIdx = Math.ceil(endIdx);
- // const obsoleteViewNodes = this.viewNodes;
- // this.viewNodes = new Set();
- // const viewNodes = this.viewNodes;
// this.debug("render", opts);
const obsoleteNodes = new Set();
this.nodeListElement.childNodes.forEach((elem) => {
@@ -7582,37 +7767,31 @@ class Wunderbaum {
* FILTER
* -------------------------------------------------------------------------*/
/**
- * [ext-filter] Dim or hide nodes.
+ * Dim or hide nodes.
*/
filterNodes(filter, options) {
return this.extensions.filter.filterNodes(filter, options);
}
/**
- * [ext-filter] Dim or hide whole branches.
+ * Dim or hide whole branches.
*/
filterBranches(filter, options) {
return this.extensions.filter.filterBranches(filter, options);
}
/**
- * [ext-filter] Reset the filter.
- *
- * @requires [[FilterExtension]]
+ * Reset the filter.
*/
clearFilter() {
return this.extensions.filter.clearFilter();
}
/**
- * [ext-filter] Return true if a filter is currently applied.
- *
- * @requires [[FilterExtension]]
+ * Return true if a filter is currently applied.
*/
isFilterActive() {
return !!this.filterMode;
}
/**
- * [ext-filter] Re-apply current filter.
- *
- * @requires [[FilterExtension]]
+ * Re-apply current filter.
*/
updateFilter() {
return this.extensions.filter.updateFilter();
@@ -7620,7 +7799,7 @@ class Wunderbaum {
}
Wunderbaum.sequence = 0;
/** Wunderbaum release version number "MAJOR.MINOR.PATCH". */
-Wunderbaum.version = "v0.7.0"; // Set to semver by 'grunt release'
+Wunderbaum.version = "v0.8.0"; // Set to semver by 'grunt release'
/** Expose some useful methods of the util.ts module as `Wunderbaum.util`. */
Wunderbaum.util = util;
diff --git a/dist/wunderbaum.esm.min.js b/dist/wunderbaum.esm.min.js
index ca29aa94..979ac5cc 100644
--- a/dist/wunderbaum.esm.min.js
+++ b/dist/wunderbaum.esm.min.js
@@ -1,76 +1,76 @@
+/*!
+ * debounce & throttle, taken from https://github.com/lodash/lodash v4.17.21
+ * MIT License: https://raw.githubusercontent.com/lodash/lodash/4.17.21-npm/LICENSE
+ * Modified for TypeScript type annotations.
+ */
+const freeGlobal="object"==typeof global&&null!==global&&global.Object===Object&&global,freeGlobalThis="object"==typeof globalThis&&null!==globalThis&&globalThis.Object==Object&&globalThis,freeSelf="object"==typeof self&&null!==self&&self.Object===Object&&self,root=freeGlobalThis||freeGlobal||freeSelf||Function("return this")();function isObject(e){const t=typeof e;return null!=e&&("object"===t||"function"===t)}function debounce(e,t=0,i={}){let s,n,r,o,l,a,d=0,c=!1,h=!1,u=!0;const p=!t&&0!==t&&"function"==typeof root.requestAnimationFrame;if("function"!=typeof e)throw new TypeError("Expected a function");function f(t){const i=s,r=n;return s=n=void 0,d=t,o=e.apply(r,i),o}function g(e,t){return p?(root.cancelAnimationFrame(l),root.requestAnimationFrame(e)):setTimeout(e,t)}function m(e){const i=e-a;return void 0===a||i>=t||i<0||h&&e-d>=r}function v(){const e=Date.now();if(m(e))return y(e);l=g(v,function(e){const i=e-d,s=t-(e-a);return h?Math.min(s,r-i):s}(e))}function y(e){return l=void 0,u&&s?f(e):(s=n=void 0,o)}function b(...e){const i=Date.now(),r=m(i);if(s=e,n=this,a=i,r){if(void 0===l)return function(e){return d=e,l=g(v,t),c?f(e):o}(a);if(h)return l=g(v,t),f(a)}return void 0===l&&(l=g(v,t)),o}return t=+t||0,isObject(i)&&(c=!!i.leading,h="maxWait"in i,r=h?Math.max(+i.maxWait||0,t):r,u="trailing"in i?!!i.trailing:u),b.cancel=function(){void 0!==l&&function(e){if(p)return root.cancelAnimationFrame(e);clearTimeout(e)}(l),d=0,s=a=n=l=void 0},b.flush=function(){return void 0===l?o:y(Date.now())},b.pending=function(){return void 0!==l},b}function throttle(e,t=0,i={}){let s=!0,n=!0;if("function"!=typeof e)throw new TypeError("Expected a function");return isObject(i)&&(s="leading"in i?!!i.leading:s,n="trailing"in i?!!i.trailing:n),debounce(e,t,{leading:s,trailing:n,maxWait:t})}
/*!
* Wunderbaum - util
* Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */
-const MOUSE_BUTTONS={0:"",1:"left",2:"middle",3:"right",4:"back",5:"forward"},MAX_INT=9007199254740991,userInfo=_getUserInfo(),isMac=userInfo.isMac,REX_HTML=/[&<>"'/]/g,REX_TOOLTIP=/[<>"'/]/g,ENTITY_MAP={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};let Deferred$1=class{constructor(){this.thens=[],this.catches=[],this.status=""}resolve(e){if(this.status)throw new Error("already settled");this.status="resolved",this.resolvedValue=e,this.thens.forEach((t=>t(e))),this.thens=[]}reject(e){if(this.status)throw new Error("already settled");this.status="rejected",this.rejectedError=e,this.catches.forEach((t=>t(e))),this.catches=[]}then(e){"resolved"===status?e(this.resolvedValue):this.thens.unshift(e)}catch(e){"rejected"===this.status?e(this.rejectedError):this.catches.unshift(e)}promise(){return{then:this.then,catch:this.catch}}};function assert(e,t){if(!e)throw t=t||"Assertion failed.",new Error(t)}function _getUserInfo(){const e=navigator;return{isMac:/Mac/.test(e.platform)}}function documentReady(e){"loading"===document.readyState?document.addEventListener("DOMContentLoaded",e):e()}function documentReadyPromise(){return new Promise((e=>{documentReady(e)}))}function each(e,t){if(null==e)return e;const s=e.length;let i=0;if("number"==typeof s)for(;i")>=0&&error("Not implemented"),e}function getValueFromElem(e,t=!1){const s=e.tagName;let i=null;if("SPAN"===s&&e.classList.contains("wb-col")){const s=e,n=s.querySelector("input,select");if(n)return getValueFromElem(n,t);s.innerText=""+i}else if("INPUT"===s){const s=e;switch(s.type){case"button":case"reset":case"submit":case"image":break;case"checkbox":i=s.indeterminate?null:s.checked;break;case"date":case"datetime":case"datetime-local":case"month":case"time":case"week":i=t?s.valueAsDate:s.value;break;case"number":case"range":i=s.valueAsNumber;break;case"radio":{const e=s.name,t=s.parentElement.querySelector(`input[name="${e}"]:checked`);i=t?t.value:void 0}break;default:i=s.value}}else if("SELECT"===s){i=e.value}return i}function setValueToElem(e,t){const s=e.tagName;if("SPAN"===s&&e.classList.contains("wb-col")){const s=e,i=s.querySelector("input,select");if(i)return setValueToElem(i,t);s.innerText=""+t}else if("INPUT"===s){const s=e,i=s.type;switch(i){case"checkbox":s.indeterminate=null===t,s.checked=!!t;break;case"date":case"month":case"time":case"week":case"datetime":case"datetime-local":s.valueAsDate=new Date(t);break;case"number":case"range":null==t?s.value=t:s.valueAsNumber=t;break;case"radio":error(`Not yet implemented: ${i}`);break;case"button":case"reset":case"submit":case"image":break;default:s.value=null!=t?t:""}}else if("SELECT"===s){const s=e;null==t?s.selectedIndex=-1:s.value=t}}function setElemDisplay(e,t){const s=elemFromSelector(e).style;t?"none"===s.display&&(s.display=""):""===s.display&&(s.display="none")}function elemFromHtml(e){const t=document.createElement("template");return t.innerHTML=e.trim(),t.content.firstElementChild}const _IGNORE_KEYS=new Set(["Alt","Control","Meta","Shift"]);function elemFromSelector(e){return e?"string"==typeof e?document.querySelector(e):e:null}function eventTargetFromSelector(e){return e?"string"==typeof e?document.querySelector(e):e:null}function eventToString(e){const t=e.key,s=e.type,i=[];return e.altKey&&i.push("Alt"),e.ctrlKey&&i.push("Control"),e.metaKey&&i.push("Meta"),e.shiftKey&&i.push("Shift"),"click"===s||"dblclick"===s?i.push(MOUSE_BUTTONS[e.button]+s):"wheel"===s?i.push(s):_IGNORE_KEYS.has(t)||i.push(t),i.join("+")}function extend(...e){for(let t=1;t{e.addEventListener(t,(function(e){if(!n)return r(e);if(e.target){let t=e.target;if(t.matches(n))return r(e);if(t=t.closest(n),t)return r(e)}}))}))}function overrideMethod(e,t,s,i){let n,r;const o=i||e,l=e[t],a=(...e)=>l.apply(o,e),d=e=>l.apply(o,e);e[t]=(...e)=>{try{return n=o._super,r=o._superApply,o._super=a,o._superApply=d,s.apply(o,e)}finally{o._super=n,o._superApply=r}}}function setTimeoutPromise(e,t){return new Promise(((s,i)=>{setTimeout((()=>{try{s(e.apply(this))}catch(e){i(e)}}),t)}))}async function sleep(e){return new Promise((t=>setTimeout(t,e)))}function toggleCheckbox(e,t,s){const i=elemFromSelector(e);if(assert("checkbox"===i.type,`Expected a checkbox: ${i.type}`),null!=s||(s=i.classList.contains("wb-tristate")||i.indeterminate),void 0===t){switch(i.indeterminate?null:i.checked){case!0:t=!1;break;case!1:t=!s||null;break;case null:t=!0}}i.indeterminate=null==t,i.checked=!!t}function getOption(e,t,s=void 0){let i;e&&t.indexOf(".")>=0&&([i,t]=t.split("."),e=e[i]);const n=e?e[t]:null;return null!=n?n:s}function toSet(e){if(e instanceof Set)return e;if("string"==typeof e){const t=new Set;for(const s of e.split(" "))t.add(s.trim());return t}if(Array.isArray(e))return new Set(e);throw new Error("Cannot convert to Set: "+e)}function type(e){return Object.prototype.toString.call(e).replace(/^\[object (.+)\]$/,"$1").toLowerCase()}function adaptiveThrottle(e,t){let s=0,i=null;const n=Object.assign({minDelay:16,defaultDelay:200,maxDelay:5e3,delayFactor:2},t),r=Math.max(16,+n.minDelay),o=+n.maxDelay,l=(...t)=>{if(s)i=t,s+=1;else{s=1;const a=t;i=null;const d=Date.now();try{e.apply(this,a)}catch(e){console.error(e)}const c=Date.now()-d,h=Math.min(Math.max(r,c*n.delayFactor),o),u=Math.max(r,h-c);setTimeout((()=>{s=0,null!=i&&l.apply(this,i)}),u)}};return l}var ChangeType,RenderFlag,NodeStatusType,NodeRegion,NavModeEnum,util=Object.freeze({__proto__:null,Deferred:Deferred$1,MAX_INT:MAX_INT,MOUSE_BUTTONS:MOUSE_BUTTONS,adaptiveThrottle:adaptiveThrottle,assert:assert,documentReady:documentReady,documentReadyPromise:documentReadyPromise,each:each,elemFromHtml:elemFromHtml,elemFromSelector:elemFromSelector,error:error,escapeHtml:escapeHtml,escapeRegex:escapeRegex,escapeTooltip:escapeTooltip,eventTargetFromSelector:eventTargetFromSelector,eventToString:eventToString,extend:extend,extractHtmlText:extractHtmlText,getOption:getOption,getValueFromElem:getValueFromElem,isArray:isArray,isEmptyObject:isEmptyObject,isFunction:isFunction,isMac:isMac,isPlainObject:isPlainObject,noop:noop,onEvent:onEvent,overrideMethod:overrideMethod,setElemDisplay:setElemDisplay,setTimeoutPromise:setTimeoutPromise,setValueToElem:setValueToElem,sleep:sleep,toSet:toSet,toggleCheckbox:toggleCheckbox,type:type});
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */const MOUSE_BUTTONS={0:"",1:"left",2:"middle",3:"right",4:"back",5:"forward"},MAX_INT=9007199254740991,userInfo=_getUserInfo(),isMac=userInfo.isMac,REX_HTML=/[&<>"'/]/g,REX_TOOLTIP=/[<>"'/]/g,ENTITY_MAP={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};class ValidationError extends Error{constructor(e){super(e),this.name="ValidationError"}}let Deferred$1=class{constructor(){this.thens=[],this.catches=[],this.status=""}resolve(e){if(this.status)throw new Error("already settled");this.status="resolved",this.resolvedValue=e,this.thens.forEach((t=>t(e))),this.thens=[]}reject(e){if(this.status)throw new Error("already settled");this.status="rejected",this.rejectedError=e,this.catches.forEach((t=>t(e))),this.catches=[]}then(e){"resolved"===status?e(this.resolvedValue):this.thens.unshift(e)}catch(e){"rejected"===this.status?e(this.rejectedError):this.catches.unshift(e)}promise(){return{then:this.then,catch:this.catch}}};function assert(e,t){if(!e)throw t=t||"Assertion failed.",new Error(t)}function _getUserInfo(){const e=navigator;return{isMac:/Mac/.test(e.platform)}}function documentReady(e){"loading"===document.readyState?document.addEventListener("DOMContentLoaded",e):e()}function documentReadyPromise(){return new Promise((e=>{documentReady(e)}))}function each(e,t){if(null==e)return e;const i=e.length;let s=0;if("number"==typeof i)for(;s")>=0&&error("Not implemented"),e}function getValueFromElem(e,t=!1){const i=e.tagName;let s=null;if("SPAN"===i&&e.classList.contains("wb-col")){const i=e,n=i.querySelector("input,select");if(n)return getValueFromElem(n,t);i.innerText=""+s}else if("INPUT"===i){const i=e;switch(i.type){case"button":case"reset":case"submit":case"image":break;case"checkbox":s=i.indeterminate?null:i.checked;break;case"date":case"datetime":case"datetime-local":case"month":case"time":case"week":s=t?i.valueAsDate:i.value;break;case"number":case"range":s=i.valueAsNumber;break;case"radio":{const e=i.name,t=i.parentElement.querySelector(`input[name="${e}"]:checked`);s=t?t.value:void 0}break;default:s=i.value}}else if("SELECT"===i){s=e.value}return s}function setValueToElem(e,t){const i=e.tagName;if("SPAN"===i&&e.classList.contains("wb-col")){const i=e,s=i.querySelector("input,select");if(s)return setValueToElem(s,t);i.innerText=""+t}else if("INPUT"===i){const i=e,s=i.type;switch(s){case"checkbox":i.indeterminate=null===t,i.checked=!!t;break;case"date":case"month":case"time":case"week":case"datetime":case"datetime-local":i.valueAsDate=new Date(t);break;case"number":case"range":null==t?i.value=t:i.valueAsNumber=t;break;case"radio":error(`Not yet implemented: ${s}`);break;case"button":case"reset":case"submit":case"image":break;default:i.value=null!=t?t:""}}else if("SELECT"===i){const i=e;null==t?i.selectedIndex=-1:i.value=t}}function setElemDisplay(e,t){const i=elemFromSelector(e).style;t?"none"===i.display&&(i.display=""):""===i.display&&(i.display="none")}function elemFromHtml(e){const t=document.createElement("template");return t.innerHTML=e.trim(),t.content.firstElementChild}const _IGNORE_KEYS=new Set(["Alt","Control","Meta","Shift"]);function elemFromSelector(e){return e?"string"==typeof e?document.querySelector(e):e:null}function eventToString(e){const t=e.key,i=e.type,s=[];return e.altKey&&s.push("Alt"),e.ctrlKey&&s.push("Control"),e.metaKey&&s.push("Meta"),e.shiftKey&&s.push("Shift"),"click"===i||"dblclick"===i?s.push(MOUSE_BUTTONS[e.button]+i):"wheel"===i?s.push(i):_IGNORE_KEYS.has(t)||s.push(t),s.join("+")}function extend(...e){for(let t=1;t{e.addEventListener(t,(function(e){if(!n)return r(e);if(e.target){let t=e.target;if(t.matches(n))return r(e);if(t=t.closest(n),t)return r(e)}}))}))}function overrideMethod(e,t,i,s){let n,r;const o=s||e,l=e[t],a=(...e)=>l.apply(o,e),d=e=>l.apply(o,e);e[t]=(...e)=>{try{return n=o._super,r=o._superApply,o._super=a,o._superApply=d,i.apply(o,e)}finally{o._super=n,o._superApply=r}}}function setTimeoutPromise(e,t){return new Promise(((i,s)=>{setTimeout((()=>{try{i(e.apply(this))}catch(e){s(e)}}),t)}))}async function sleep(e){return new Promise((t=>setTimeout(t,e)))}function toggleCheckbox(e,t,i){const s=elemFromSelector(e);if(assert("checkbox"===s.type,`Expected a checkbox: ${s.type}`),null!=i||(i=s.classList.contains("wb-tristate")||s.indeterminate),void 0===t){switch(s.indeterminate?null:s.checked){case!0:t=!1;break;case!1:t=!i||null;break;case null:t=!0}}s.indeterminate=null==t,s.checked=!!t}function getOption(e,t,i=void 0){let s;e&&t.indexOf(".")>=0&&([s,t]=t.split("."),e=e[s]);const n=e?e[t]:null;return null!=n?n:i}function toSet(e){if(e instanceof Set)return e;if("string"==typeof e){const t=new Set;for(const i of e.split(" "))t.add(i.trim());return t}if(Array.isArray(e))return new Set(e);throw new Error("Cannot convert to Set: "+e)}function type(e){return Object.prototype.toString.call(e).replace(/^\[object (.+)\]$/,"$1").toLowerCase()}function adaptiveThrottle(e,t){const i=Object.assign({minDelay:16,defaultDelay:200,maxDelay:5e3,delayFactor:2},t),s=Math.max(16,+i.minDelay),n=+i.maxDelay;let r=0,o=null,l=null;const a=(...t)=>{if(r)o=t,r+=1;else{r=1;const d=t;o=null;const c=Date.now();try{e.apply(this,d)}catch(e){console.error(e)}const h=Date.now()-c,u=Math.min(Math.max(s,h*i.delayFactor),n),p=Math.max(s,u-h);l=setTimeout((()=>{l=null,r=0,null!=o&&a.apply(this,o)}),p)}};return a.cancel=()=>{l&&(clearTimeout(l),l=null),o=null,r=0},a.pending=()=>!!l,a.flush=()=>{throw new Error("Not implemented")},a}var ChangeType,RenderFlag,NodeStatusType,NodeRegion,NavModeEnum,util=Object.freeze({__proto__:null,Deferred:Deferred$1,MAX_INT:MAX_INT,MOUSE_BUTTONS:MOUSE_BUTTONS,ValidationError:ValidationError,adaptiveThrottle:adaptiveThrottle,assert:assert,debounce:debounce,documentReady:documentReady,documentReadyPromise:documentReadyPromise,each:each,elemFromHtml:elemFromHtml,elemFromSelector:elemFromSelector,error:error,escapeHtml:escapeHtml,escapeRegex:escapeRegex,escapeTooltip:escapeTooltip,eventToString:eventToString,extend:extend,extractHtmlText:extractHtmlText,getOption:getOption,getValueFromElem:getValueFromElem,isArray:isArray,isEmptyObject:isEmptyObject,isFunction:isFunction,isMac:isMac,isPlainObject:isPlainObject,noop:noop,onEvent:onEvent,overrideMethod:overrideMethod,setElemDisplay:setElemDisplay,setTimeoutPromise:setTimeoutPromise,setValueToElem:setValueToElem,sleep:sleep,throttle:throttle,toSet:toSet,toggleCheckbox:toggleCheckbox,type:type});
/*!
* Wunderbaum - types
* Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
*/!function(e){e.any="any",e.data="data",e.colStructure="colStructure",e.resize="resize",e.row="row",e.structure="structure",e.status="status",e.scroll="scroll"}(ChangeType||(ChangeType={})),function(e){e.clearMarkup="clearMarkup",e.header="header",e.redraw="redraw",e.scroll="scroll"}(RenderFlag||(RenderFlag={})),function(e){e.ok="ok",e.loading="loading",e.error="error",e.noData="noData",e.paging="paging"}(NodeStatusType||(NodeStatusType={})),function(e){e.unknown="",e.checkbox="checkbox",e.column="column",e.expander="expander",e.icon="icon",e.prefix="prefix",e.title="title"}(NodeRegion||(NodeRegion={})),function(e){e.startRow="startRow",e.cell="cell",e.startCell="startCell",e.row="row"}(NavModeEnum||(NavModeEnum={}));
/*!
* Wunderbaum - wb_extension_base
* Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
*/
-class WunderbaumExtension{constructor(e,t,s){this.enabled=!0,this.tree=e,this.id=t,this.treeOpts=e.options;const i=e.options;void 0===this.treeOpts[t]?i[t]=this.extensionOpts=extend({},s):(this.extensionOpts=extend({},s,i[t]),i[t]=this.extensionOpts),this.enabled=this.getPluginOption("enabled",!0)}init(){this.tree.element.classList.add("wb-ext-"+this.id)}getPluginOption(e,t){var s;return null!==(s=this.extensionOpts[e])&&void 0!==s?s:t}setPluginOption(e,t){this.extensionOpts[e]=t}setEnabled(e=!0){return this.setPluginOption("enabled",!!e)}onKeyEvent(e){}onRender(e){}}
-/*!
- * debounce & throttle, taken from https://github.com/lodash/lodash v4.17.21
- * MIT License: https://raw.githubusercontent.com/lodash/lodash/4.17.21-npm/LICENSE
- * Modified for TypeScript type annotations.
- */const freeGlobal="object"==typeof global&&null!==global&&global.Object===Object&&global,freeGlobalThis="object"==typeof globalThis&&null!==globalThis&&globalThis.Object==Object&&globalThis,freeSelf="object"==typeof self&&null!==self&&self.Object===Object&&self,root=freeGlobalThis||freeGlobal||freeSelf||Function("return this")();function isObject(e){const t=typeof e;return null!=e&&("object"===t||"function"===t)}function debounce(e,t=0,s={}){let i,n,r,o,l,a,d=0,c=!1,h=!1,u=!0;const p=!t&&0!==t&&"function"==typeof root.requestAnimationFrame;if("function"!=typeof e)throw new TypeError("Expected a function");function f(t){const s=i,r=n;return i=n=void 0,d=t,o=e.apply(r,s),o}function g(e,t){return p?(root.cancelAnimationFrame(l),root.requestAnimationFrame(e)):setTimeout(e,t)}function m(e){const s=e-a;return void 0===a||s>=t||s<0||h&&e-d>=r}function v(){const e=Date.now();if(m(e))return b(e);l=g(v,function(e){const s=e-d,i=t-(e-a);return h?Math.min(i,r-s):i}(e))}function b(e){return l=void 0,u&&i?f(e):(i=n=void 0,o)}function y(...e){const s=Date.now(),r=m(s);if(i=e,n=this,a=s,r){if(void 0===l)return function(e){return d=e,l=g(v,t),c?f(e):o}(a);if(h)return l=g(v,t),f(a)}return void 0===l&&(l=g(v,t)),o}return t=+t||0,isObject(s)&&(c=!!s.leading,h="maxWait"in s,r=h?Math.max(+s.maxWait||0,t):r,u="trailing"in s?!!s.trailing:u),y.cancel=function(){void 0!==l&&function(e){if(p)return root.cancelAnimationFrame(e);clearTimeout(e)}(l),d=0,i=a=n=l=void 0},y.flush=function(){return void 0===l?o:b(Date.now())},y.pending=function(){return void 0!==l},y}function throttle(e,t=0,s={}){let i=!0,n=!0;if("function"!=typeof e)throw new TypeError("Expected a function");return isObject(s)&&(i="leading"in s?!!s.leading:i,n="trailing"in s?!!s.trailing:n),debounce(e,t,{leading:i,trailing:n,maxWait:t})}
+class WunderbaumExtension{constructor(e,t,i){this.enabled=!0,this.tree=e,this.id=t,this.treeOpts=e.options;const s=e.options;void 0===this.treeOpts[t]?s[t]=this.extensionOpts=extend({},i):(this.extensionOpts=extend({},i,s[t]),s[t]=this.extensionOpts),this.enabled=this.getPluginOption("enabled",!0)}init(){this.tree.element.classList.add("wb-ext-"+this.id)}getPluginOption(e,t){var i;return null!==(i=this.extensionOpts[e])&&void 0!==i?i:t}setPluginOption(e,t){this.extensionOpts[e]=t}setEnabled(e=!0){return this.setPluginOption("enabled",!!e)}onKeyEvent(e){}onRender(e){}}
/*!
* Wunderbaum - ext-filter
* Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */const START_MARKER="￷",END_MARKER="￸",RE_START_MARKER=new RegExp(escapeRegex("￷"),"g"),RE_END_MARTKER=new RegExp(escapeRegex("￸"),"g");class FilterExtension extends WunderbaumExtension{constructor(e){super(e,"filter",{connectInput:null,autoApply:!0,autoExpand:!1,counter:!0,fuzzy:!1,hideExpandedCounter:!0,hideExpanders:!1,highlight:!0,leavesOnly:!1,mode:"dim",noData:!0}),this.lastFilterArgs=null}init(){super.init();const e=this.getPluginOption("connectInput");e&&(this.queryInput=elemFromSelector(e),onEvent(this.queryInput,"input",debounce((e=>{this.filterNodes(this.queryInput.value.trim(),{})}),700)))}setPluginOption(e,t){if(super.setPluginOption(e,t),"mode"===e)this.tree.filterMode="hide"===t?"hide":"dim",this.tree.updateFilter()}_applyFilterNoUpdate(e,t,s){return this.tree.runWithDeferredUpdate((()=>this._applyFilterImpl(e,t,s)))}_applyFilterImpl(e,t,s){let i,n,r=0;const o=Date.now(),l=this.tree,a=l.options,d=a.autoCollapse,c=extend({},a.filter,s),h="hide"===c.mode,u=!!c.leavesOnly&&!t;if("string"==typeof e){if(""===e)return l.logInfo("Passing an empty string as a filter is handled as clearFilter()."),void this.clearFilter();i=c.fuzzy?e.split("").map(escapeRegex).reduce((function(e,t){return e+"([^"+t+"]*)"+t}),""):escapeRegex(e);const t=new RegExp(i,"i"),s=new RegExp(escapeRegex(e),"gi");e=e=>{if(!e.title)return!1;const i=e.title,r=i.match(t);return r&&c.highlight&&(n=c.fuzzy?_markFuzzyMatchedChars(i,r,!0):i.replace(s,(function(e){return"￷"+e+"￸"})),e.titleWithHighlight=escapeHtml(n).replace(RE_START_MARKER,"").replace(RE_END_MARTKER," ")),!!r}}return l.filterMode=c.mode,this.lastFilterArgs=arguments,l.element.classList.toggle("wb-ext-filter-hide",!!h),l.element.classList.toggle("wb-ext-filter-dim",!h),l.element.classList.toggle("wb-ext-filter-hide-expanders",!!c.hideExpanders),l.root.subMatchCount=0,l.visit((e=>{delete e.match,delete e.titleWithHighlight,e.subMatchCount=0})),l.setStatus(NodeStatusType.ok),a.autoCollapse=!1,l.visit((s=>{if(u&&null!=s.children)return;let i=e(s);if("skip"===i)return s.visit((function(e){e.match=!1}),!0),"skip";let n=!1;(t||"branch"===i)&&s.parent.match&&(i=!0,n=!0),i&&(r++,s.match=!0,s.visitParents((e=>{e!==s&&(e.subMatchCount+=1),!c.autoExpand||n||e.expanded||(e.setExpanded(!0,{noAnimation:!0,noEvents:!0}),e._filterAutoExpanded=!0)}),!0))})),a.autoCollapse=d,0===r&&c.noData&&h&&l.root.setStatus(NodeStatusType.noData),l.logInfo(`Filter '${i}' found ${r} nodes in ${Date.now()-o} ms.`),r}filterNodes(e,t){return this._applyFilterNoUpdate(e,!1,t)}filterBranches(e,t){return this._applyFilterNoUpdate(e,!0,t)}updateFilter(){var e;const t=this.tree;t.filterMode&&this.lastFilterArgs&&(null===(e=t.options.filter)||void 0===e?void 0:e.autoApply)?this._applyFilterNoUpdate.apply(this,this.lastFilterArgs):t.logWarn("updateFilter(): no filter active.")}clearFilter(){const e=this.tree;e.enableUpdate(!1),e.setStatus(NodeStatusType.ok),delete e.root.match,delete e.root.subMatchCount,e.visit((e=>{delete e.match,delete e.subMatchCount,delete e.titleWithHighlight,e._filterAutoExpanded&&e.expanded&&e.setExpanded(!1,{noAnimation:!0,noEvents:!0}),delete e._filterAutoExpanded})),e.filterMode=null,this.lastFilterArgs=null,e.element.classList.remove("wb-ext-filter-dim","wb-ext-filter-hide"),e.enableUpdate(!0)}}function _markFuzzyMatchedChars(e,t,s=!0){const i=[];for(let e=1;e"+n[e]+""})),n.join("")}
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */const START_MARKER="￷",END_MARKER="￸",RE_START_MARKER=new RegExp(escapeRegex("￷"),"g"),RE_END_MARTKER=new RegExp(escapeRegex("￸"),"g");class FilterExtension extends WunderbaumExtension{constructor(e){super(e,"filter",{connectInput:null,autoApply:!0,autoExpand:!1,counter:!0,fuzzy:!1,hideExpandedCounter:!0,hideExpanders:!1,highlight:!0,leavesOnly:!1,mode:"dim",noData:!0}),this.lastFilterArgs=null}init(){super.init();const e=this.getPluginOption("connectInput");e&&(this.queryInput=elemFromSelector(e),onEvent(this.queryInput,"input",debounce((e=>{this.filterNodes(this.queryInput.value.trim(),{})}),700)))}setPluginOption(e,t){if(super.setPluginOption(e,t),"mode"===e)this.tree.filterMode="hide"===t?"hide":"dim",this.tree.updateFilter()}_applyFilterNoUpdate(e,t,i){return this.tree.runWithDeferredUpdate((()=>this._applyFilterImpl(e,t,i)))}_applyFilterImpl(e,t,i){let s,n,r=0;const o=Date.now(),l=this.tree,a=l.options,d=a.autoCollapse,c=extend({},a.filter,i),h="hide"===c.mode,u=!!c.leavesOnly&&!t;if("string"==typeof e){if(""===e)return l.logInfo("Passing an empty string as a filter is handled as clearFilter()."),void this.clearFilter();s=c.fuzzy?e.split("").map(escapeRegex).reduce((function(e,t){return e+"([^"+t+"]*)"+t}),""):escapeRegex(e);const t=new RegExp(s,"i"),i=new RegExp(escapeRegex(e),"gi");e=e=>{if(!e.title)return!1;const s=e.title,r=s.match(t);return r&&c.highlight&&(n=c.fuzzy?_markFuzzyMatchedChars(s,r,!0):s.replace(i,(function(e){return"￷"+e+"￸"})),e.titleWithHighlight=escapeHtml(n).replace(RE_START_MARKER,"").replace(RE_END_MARTKER," ")),!!r}}return l.filterMode=c.mode,this.lastFilterArgs=arguments,l.element.classList.toggle("wb-ext-filter-hide",!!h),l.element.classList.toggle("wb-ext-filter-dim",!h),l.element.classList.toggle("wb-ext-filter-hide-expanders",!!c.hideExpanders),l.root.subMatchCount=0,l.visit((e=>{delete e.match,delete e.titleWithHighlight,e.subMatchCount=0})),l.setStatus(NodeStatusType.ok),a.autoCollapse=!1,l.visit((i=>{if(u&&null!=i.children)return;let s=e(i);if("skip"===s)return i.visit((function(e){e.match=!1}),!0),"skip";let n=!1;(t||"branch"===s)&&i.parent.match&&(s=!0,n=!0),s&&(r++,i.match=!0,i.visitParents((e=>{e!==i&&(e.subMatchCount+=1),!c.autoExpand||n||e.expanded||(e.setExpanded(!0,{noAnimation:!0,noEvents:!0}),e._filterAutoExpanded=!0)}),!0))})),a.autoCollapse=d,0===r&&c.noData&&h&&("string"==typeof c.noData?l.root.setStatus(NodeStatusType.noData,{message:c.noData}):l.root.setStatus(NodeStatusType.noData)),l.logInfo(`Filter '${s}' found ${r} nodes in ${Date.now()-o} ms.`),r}filterNodes(e,t){return this._applyFilterNoUpdate(e,!1,t)}filterBranches(e,t){return this._applyFilterNoUpdate(e,!0,t)}updateFilter(){var e;const t=this.tree;t.filterMode&&this.lastFilterArgs&&(null===(e=t.options.filter)||void 0===e?void 0:e.autoApply)?this._applyFilterNoUpdate.apply(this,this.lastFilterArgs):t.logWarn("updateFilter(): no filter active.")}clearFilter(){const e=this.tree;e.enableUpdate(!1),e.setStatus(NodeStatusType.ok),delete e.root.match,delete e.root.subMatchCount,e.visit((e=>{delete e.match,delete e.subMatchCount,delete e.titleWithHighlight,e._filterAutoExpanded&&e.expanded&&e.setExpanded(!1,{noAnimation:!0,noEvents:!0}),delete e._filterAutoExpanded})),e.filterMode=null,this.lastFilterArgs=null,e.element.classList.remove("wb-ext-filter-dim","wb-ext-filter-hide"),e.enableUpdate(!0)}}function _markFuzzyMatchedChars(e,t,i=!0){const s=[];for(let e=1;e"+n[e]+""})),n.join("")}
/*!
* Wunderbaum - ext-keynav
* Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */const QUICKSEARCH_DELAY=500;class KeynavExtension extends WunderbaumExtension{constructor(e){super(e,"keynav",{})}_getEmbeddedInputElem(e){var t;let s=null;if(e&&null!=e.type)s=e;else{const e=null===(t=this.tree.getActiveColElem())||void 0===t?void 0:t.querySelector("input,select");e&&(s=e)}return s}_isCurInputFocused(){var e;return!!(null===(e=this.tree.getActiveColElem())||void 0===e?void 0:e.querySelector("input:focus,select:focus"))}onKeyEvent(e){const t=e.event,s=this.tree,i=e.options,n=!t.ctrlKey||i.autoActivate,r=this._getEmbeddedInputElem(t.target),o=r&&this._isCurInputFocused(),l=i.navigationModeOption;let a,d=eventToString(t),c=e.node,h=!0;if(!s.isEnabled())return!1;if(!1===s._callEvent("keydown",e))return!1;if(!1===s._callMethod("edit._preprocessKeyEvent",e))return!1;if(!c){const e=s.getFocusNode()||s.getActiveNode(),t=s.getFirstChild();if(!e&&t&&"ArrowDown"===d)return t.logInfo("Keydown: activate first node."),void t.setActive();a=e||t,a&&(a.setFocus(),c=s.getFocusNode(),c.logInfo("Keydown: force focus on active node."))}const u=c.isColspan();if(s.isRowNav()){if(o){switch(d){case"Enter":r.blur(),s.setFocus();break;case"Escape":c._render(),s.setFocus()}return}if(i.quicksearch&&1===d.length&&/^\w$/.test(d)&&!r){const e=Date.now();e-s.lastQuicksearchTime>500&&(s.lastQuicksearchTerm=""),s.lastQuicksearchTime=e,s.lastQuicksearchTerm+=d;const i=s.findNextNode(s.lastQuicksearchTerm,s.getActiveNode());return i&&i.setActive(!0,{event:t}),void t.preventDefault()}switch(d){case"Enter":c.isActive()&&(c.isExpanded()?d="Subtract":c.isExpandable(!0)&&(d="Add"));break;case"ArrowLeft":c.expanded&&(d="Subtract");break;case"ArrowRight":if(!c.expanded&&c.isExpandable(!0))d="Add";else if(l===NavModeEnum.startCell||l===NavModeEnum.startRow)return t.preventDefault(),s.setCellNav(),!1}switch(d){case"+":case"Add":c.setExpanded(!0);break;case"-":case"Subtract":c.setExpanded(!1);break;case" ":c.getOption("checkbox")?c.toggleSelected():c.setActive(!0,{event:t});break;case"Enter":c.setActive(!0,{event:t});break;case"ArrowDown":case"ArrowLeft":case"ArrowRight":case"ArrowUp":case"Backspace":case"End":case"Home":case"Control+End":case"Control+Home":case"Meta+ArrowDown":case"Meta+ArrowUp":case"PageDown":case"PageUp":c.navigate(d,{activate:n,event:t});break;default:h=!1}}else{const e=this._getEmbeddedInputElem(null),i=e?e.type||e.tagName:"",r=e&&this._isCurInputFocused(),o=e&&"checkbox"!==i;if(r){if("Escape"===d)return c._render(),c.logDebug("Reset focused input"),s.setFocus(),void s.setColumn(s.activeColIdx);if("Enter"!==d)return void c.logDebug(`Ignored ${d} inside focused input`)}else if(e&&1===d.length&&o)return e.focus(),e.value="",c.logDebug(`Focus imput: ${d}`),!1;switch("Tab"===d?(d="ArrowRight",h=!0):"Shift+Tab"===d&&(d=s.activeColIdx>0?"ArrowLeft":"",h=!0),d){case"+":case"Add":c.setExpanded(!0);break;case"-":case"Subtract":c.setExpanded(!1);break;case" ":0===s.activeColIdx&&c.getOption("checkbox")?(c.toggleSelected(),h=!0):e&&"checkbox"===i&&(e.click(),h=!0);break;case"F2":e&&!r&&o&&(e.focus(),h=!0);break;case"Enter":s.setFocus(),(0===s.activeColIdx||u)&&c.isExpandable()?(c.setExpanded(!c.isExpanded()),h=!0):e&&!r&&o&&(e.focus(),h=!0);break;case"Escape":s.setFocus(),c.log("keynav: focus tree..."),s.isCellNav()&&l!==NavModeEnum.cell&&(c.log("keynav: setCellNav(false)"),s.setCellNav(!1),s.setFocus(),h=!0);break;case"ArrowLeft":s.setFocus(),u&&c.isExpanded()?c.setExpanded(!1):!u&&s.activeColIdx>0?s.setColumn(s.activeColIdx-1):l!==NavModeEnum.cell&&s.setCellNav(!1),h=!0;break;case"ArrowRight":s.setFocus(),u&&!c.isExpanded()?c.setExpanded():!u&&s.activeColIdx0&&s.setColumn(0),h=!0;break;case"End":s.setFocus(),!u&&s.activeColIdx500&&(i.lastQuicksearchTerm=""),i.lastQuicksearchTime=e,i.lastQuicksearchTerm+=d;const s=i.findNextNode(i.lastQuicksearchTerm,i.getActiveNode());return s&&s.setActive(!0,{event:t}),void t.preventDefault()}switch(d){case"Enter":c.isActive()&&(c.isExpanded()?d="Subtract":c.isExpandable(!0)&&(d="Add"));break;case"ArrowLeft":c.expanded&&(d="Subtract");break;case"ArrowRight":if(!c.expanded&&c.isExpandable(!0))d="Add";else if(l===NavModeEnum.startCell||l===NavModeEnum.startRow)return t.preventDefault(),i.setCellNav(),!1}switch(d){case"+":case"Add":c.setExpanded(!0);break;case"-":case"Subtract":c.setExpanded(!1);break;case" ":c.getOption("checkbox")?c.toggleSelected():c.setActive(!0,{event:t});break;case"Enter":c.setActive(!0,{event:t});break;case"ArrowDown":case"ArrowLeft":case"ArrowRight":case"ArrowUp":case"Backspace":case"End":case"Home":case"Control+End":case"Control+Home":case"Meta+ArrowDown":case"Meta+ArrowUp":case"PageDown":case"PageUp":c.navigate(d,{activate:n,event:t});break;default:h=!1}}else{const e=r?r.type||r.tagName:"",s=r&&"checkbox"!==e;if(o){if("Escape"===d)return c.logDebug("Reset focused input on Escape"),r.setCustomValidity(""),c._render(),i.setFocus(),void i.setColumn(i.activeColIdx);if("Enter"!==d)return r&&r.checkValidity&&!r.checkValidity()?(c.logDebug(`Ignored ${d} inside invalid input`),!1):void c.logDebug(`Ignored ${d} inside focused input`)}else if(r&&1===d.length&&s)return r.focus(),r.value="",c.logDebug(`Focus input: ${d}`),!1;switch("Tab"===d?(d="ArrowRight",h=!0):"Shift+Tab"===d&&(d=i.activeColIdx>0?"ArrowLeft":"",h=!0),d){case"+":case"Add":c.setExpanded(!0);break;case"-":case"Subtract":c.setExpanded(!1);break;case" ":0===i.activeColIdx&&c.getOption("checkbox")?(c.toggleSelected(),h=!0):r&&"checkbox"===e&&(r.click(),h=!0);break;case"F2":r&&!o&&s&&(r.focus(),h=!0);break;case"Enter":i.setFocus(),(0===i.activeColIdx||u)&&c.isExpandable()?(c.setExpanded(!c.isExpanded()),h=!0):r&&!o&&s&&(r.focus(),h=!0);break;case"Escape":i.setFocus(),c.log("keynav: focus tree..."),i.isCellNav()&&l!==NavModeEnum.cell&&(c.log("keynav: setCellNav(false)"),i.setCellNav(!1),i.setFocus(),h=!0);break;case"ArrowLeft":i.setFocus(),u&&c.isExpanded()?c.setExpanded(!1):!u&&i.activeColIdx>0?i.setColumn(i.activeColIdx-1):l!==NavModeEnum.cell&&i.setCellNav(!1),h=!0;break;case"ArrowRight":i.setFocus(),u&&!c.isExpanded()?c.setExpanded():!u&&i.activeColIdx0&&i.setColumn(0),h=!0;break;case"End":i.setFocus(),!u&&i.activeColIdx=4){const t=this.ignoreEvents,s=this.prefix;overrideMethod(e,"callEvent",(function(i,n){if(t.has(i))return e._superApply(arguments);const r=Date.now(),o=e._superApply(arguments);return e.logDebug(`${s}: callEvent('${i}') took ${Date.now()-r} ms.`,arguments[1]),o}))}}onKeyEvent(e){this.tree.logDebug(`${this.prefix}: onKeyEvent()`,e)}}
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */class LoggerExtension extends WunderbaumExtension{constructor(e){super(e,"logger",{}),this.ignoreEvents=new Set(["iconBadge","render","discard"]),this.prefix=e+".ext-logger"}init(){const e=this.tree;if(e.getOption("debugLevel")>=4){const t=this.ignoreEvents,i=this.prefix;overrideMethod(e,"callEvent",(function(s,n){if(t.has(s))return e._superApply(arguments);const r=Date.now(),o=e._superApply(arguments);return e.logDebug(`${i}: callEvent('${s}') took ${Date.now()-r} ms.`,arguments[1]),o}))}}onKeyEvent(e){this.tree.logDebug(`${this.prefix}: onKeyEvent()`,e)}}
/*!
* Wunderbaum - common
* Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */const DEFAULT_DEBUGLEVEL=3,ROW_HEIGHT=22,ICON_WIDTH=20,TITLE_SPAN_PAD_Y=7,RENDER_MAX_PREFETCH=5,TEST_IMG=new RegExp(/\.|\//),iconMaps={bootstrap:{error:"bi bi-exclamation-triangle",loading:"bi bi-chevron-right wb-busy",noData:"bi bi-question-circle",expanderExpanded:"bi bi-chevron-down",expanderCollapsed:"bi bi-chevron-right",expanderLazy:"bi bi-chevron-right wb-helper-lazy-expander",checkChecked:"bi bi-check-square",checkUnchecked:"bi bi-square",checkUnknown:"bi bi-dash-square-dotted",radioChecked:"bi bi-circle-fill",radioUnchecked:"bi bi-circle",radioUnknown:"bi bi-record-circle",folder:"bi bi-folder2",folderOpen:"bi bi-folder2-open",folderLazy:"bi bi-folder-symlink",doc:"bi bi-file-earmark"},fontawesome6:{error:"fa-solid fa-triangle-exclamation",loading:"fa-solid fa-chevron-right fa-beat",noData:"fa-solid fa-circle-question",expanderExpanded:"fa-solid fa-chevron-down",expanderCollapsed:"fa-solid fa-chevron-right",expanderLazy:"fa-solid fa-chevron-right wb-helper-lazy-expander",checkChecked:"fa-regular fa-square-check",checkUnchecked:"fa-regular fa-square",checkUnknown:"fa-regular fa-square-minus",radioChecked:"fa-solid fa-circle",radioUnchecked:"fa-regular fa-circle",radioUnknown:"fa-regular fa-circle-question",folder:"fa-solid fa-folder-closed",folderOpen:"fa-regular fa-folder-open",folderLazy:"fa-solid fa-folder-plus",doc:"fa-regular fa-file"}},RESERVED_TREE_SOURCE_KEYS=new Set(["_format","_keyMap","_positional","_typeList","_valueMap","_version","children","columns","types"]),KEY_TO_ACTION_DICT={" ":"toggleSelect","+":"expand",Add:"expand",ArrowDown:"down",ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",Backspace:"parent","/":"collapseAll",Divide:"collapseAll",End:"lastCol",Home:"firstCol","Control+End":"last","Control+Home":"first","Meta+ArrowDown":"last","Meta+ArrowUp":"first","*":"expandAll",Multiply:"expandAll",PageDown:"pageDown",PageUp:"pageUp","-":"collapse",Subtract:"collapse"};function makeNodeTitleMatcher(e){return e instanceof RegExp?function(t){return e.test(t.title)}:(assert("string"==typeof e,`Expected a string or RegExp: ${e}`),function(t){return t.title===e})}function makeNodeTitleStartMatcher(e){e=escapeRegex(e);const t=new RegExp("^"+e,"i");return function(e){return t.test(e.title)}}function nodeTitleSorter(e,t){const s=e.title.toLowerCase(),i=t.title.toLowerCase();return s===i?0:s>i?1:-1}function unflattenSource(e){var t,s,i;const{_format:n,_keyMap:r={},_positional:o=[],children:l}=e;if("flat"!==n)throw new Error(`Expected source._format: "flat", but got ${n}`);if(o&&o.includes("children"))throw new Error(`source._positional must not include "children": ${o}`);let a=r;if(r.t){const e="source._keyMap maps from long to short since v0.7.0. Flip key/value!";console.warn(e),a={};for(const[e,t]of Object.entries(r))a[t]=e}const d=o.map((e=>a[e])),c=[],h={},u={},p=null!==(t=a.key)&&void 0!==t?t:"key",f=null!==(s=a.children)&&void 0!==s?s:"children";for(const[e,t]of l.entries()){const[s,n,r={}]=t;t[1]=null,null!=t[2]&&(t[2]=null),n.forEach(((e,t)=>{r[d[t]]=e})),u[e]=r;const o=r[p];null!=o&&(h[o]=r);let l=null;if(null===s);else if("number"==typeof s){if(l=u[s],void 0===l)throw new Error(`unflattenSource: Could not find parent node by index: ${s}.`)}else if(l=h[s],void 0===l)throw new Error(`unflattenSource: Could not find parent node by key: ${s}`);l?(null!==(i=l[f])&&void 0!==i||(l[f]=[]),l[f].push(r)):c.push(r)}e.children=c}function decompressSourceData(e){let{_format:t,_version:s=1,_keyMap:i,_valueMap:n}=e;assert(1===s,`Expected file version 1 instead of ${s}`);let r=i,o={};if(r)for(const[e,t]of Object.entries(r))o[t]=e;if(r&&r.t){const e="source._keyMap maps from long to short since v0.7.0. Flip key/value!";console.warn(e),[r,o]=[o,r]}if(null!=e._typeList){const t='source._typeList is deprecated since v0.7.0: use source._valueMap: {"type": [...]} instead.';if(null!=n)throw new Error(t);console.warn(t),n={type:e._typeList},delete e._typeList}"flat"===t&&unflattenSource(e),delete e._format,delete e._version,delete e._keyMap,delete e._valueMap,delete e._positional,(i||n)&&function e(t){for(const s of t)Object.getOwnPropertyNames(s).forEach((e=>{const t=s[e];let r=e;if(i&&null!=o[e]&&(r=o[e],r!==e&&(s[r]=t,delete s[e])),n&&"number"==typeof t&&null!=n[r]){const e=n[r][t];if(null==e)throw new Error(`Expected valueMap[${r}][${t}] entry in [${n[r]}]`);s[r]=e}})),s.children&&e(s.children)}(e.children)}
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */const DEFAULT_DEBUGLEVEL=3,ROW_HEIGHT=22,ICON_WIDTH=20,TITLE_SPAN_PAD_Y=7,RENDER_MAX_PREFETCH=5,TEST_IMG=new RegExp(/\.|\//),iconMaps={bootstrap:{error:"bi bi-exclamation-triangle",loading:"bi bi-chevron-right wb-busy",noData:"bi bi-question-circle",expanderExpanded:"bi bi-chevron-down",expanderCollapsed:"bi bi-chevron-right",expanderLazy:"bi bi-chevron-right wb-helper-lazy-expander",checkChecked:"bi bi-check-square",checkUnchecked:"bi bi-square",checkUnknown:"bi bi-dash-square-dotted",radioChecked:"bi bi-circle-fill",radioUnchecked:"bi bi-circle",radioUnknown:"bi bi-record-circle",folder:"bi bi-folder2",folderOpen:"bi bi-folder2-open",folderLazy:"bi bi-folder-symlink",doc:"bi bi-file-earmark"},fontawesome6:{error:"fa-solid fa-triangle-exclamation",loading:"fa-solid fa-chevron-right fa-beat",noData:"fa-solid fa-circle-question",expanderExpanded:"fa-solid fa-chevron-down",expanderCollapsed:"fa-solid fa-chevron-right",expanderLazy:"fa-solid fa-chevron-right wb-helper-lazy-expander",checkChecked:"fa-regular fa-square-check",checkUnchecked:"fa-regular fa-square",checkUnknown:"fa-regular fa-square-minus",radioChecked:"fa-solid fa-circle",radioUnchecked:"fa-regular fa-circle",radioUnknown:"fa-regular fa-circle-question",folder:"fa-solid fa-folder-closed",folderOpen:"fa-regular fa-folder-open",folderLazy:"fa-solid fa-folder-plus",doc:"fa-regular fa-file"}},RESERVED_TREE_SOURCE_KEYS=new Set(["_format","_keyMap","_positional","_typeList","_valueMap","_version","children","columns","types"]),KEY_TO_ACTION_DICT={" ":"toggleSelect","+":"expand",Add:"expand",ArrowDown:"down",ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",Backspace:"parent","/":"collapseAll",Divide:"collapseAll",End:"lastCol",Home:"firstCol","Control+End":"last","Control+Home":"first","Meta+ArrowDown":"last","Meta+ArrowUp":"first","*":"expandAll",Multiply:"expandAll",PageDown:"pageDown",PageUp:"pageUp","-":"collapse",Subtract:"collapse"};function makeNodeTitleMatcher(e){return e instanceof RegExp?function(t){return e.test(t.title)}:(assert("string"==typeof e,`Expected a string or RegExp: ${e}`),function(t){return t.title===e})}function makeNodeTitleStartMatcher(e){e=escapeRegex(e);const t=new RegExp("^"+e,"i");return function(e){return t.test(e.title)}}function nodeTitleSorter(e,t){const i=e.title.toLowerCase(),s=t.title.toLowerCase();return i===s?0:i>s?1:-1}function unflattenSource(e){var t,i,s;const{_format:n,_keyMap:r={},_positional:o=[],children:l}=e;if("flat"!==n)throw new Error(`Expected source._format: "flat", but got ${n}`);if(o&&o.includes("children"))throw new Error(`source._positional must not include "children": ${o}`);let a=r;if(r.t){const e="source._keyMap maps from long to short since v0.7.0. Flip key/value!";console.warn(e),a={};for(const[e,t]of Object.entries(r))a[t]=e}const d=o.map((e=>a[e])),c=[],h={},u={},p=null!==(t=a.key)&&void 0!==t?t:"key",f=null!==(i=a.children)&&void 0!==i?i:"children";for(const[e,t]of l.entries()){const[i,n,r={}]=t;t[1]=null,null!=t[2]&&(t[2]=null),n.forEach(((e,t)=>{r[d[t]]=e})),u[e]=r;const o=r[p];null!=o&&(h[o]=r);let l=null;if(null===i);else if("number"==typeof i){if(l=u[i],void 0===l)throw new Error(`unflattenSource: Could not find parent node by index: ${i}.`)}else if(l=h[i],void 0===l)throw new Error(`unflattenSource: Could not find parent node by key: ${i}`);l?(null!==(s=l[f])&&void 0!==s||(l[f]=[]),l[f].push(r)):c.push(r)}e.children=c}function decompressSourceData(e){let{_format:t,_version:i=1,_keyMap:s,_valueMap:n}=e;assert(1===i,`Expected file version 1 instead of ${i}`);let r=s,o={};if(r)for(const[e,t]of Object.entries(r))o[t]=e;if(r&&r.t){const e="source._keyMap maps from long to short since v0.7.0. Flip key/value!";console.warn(e),[r,o]=[o,r]}if(null!=e._typeList){const t='source._typeList is deprecated since v0.7.0: use source._valueMap: {"type": [...]} instead.';if(null!=n)throw new Error(t);console.warn(t),n={type:e._typeList},delete e._typeList}"flat"===t&&unflattenSource(e),delete e._format,delete e._version,delete e._keyMap,delete e._valueMap,delete e._positional,(s||n)&&function e(t){for(const i of t)Object.getOwnPropertyNames(i).forEach((e=>{const t=i[e];let r=e;if(s&&null!=o[e]&&(r=o[e],r!==e&&(i[r]=t,delete i[e])),n&&"number"==typeof t&&null!=n[r]){const e=n[r][t];if(null==e)throw new Error(`Expected valueMap[${r}][${t}] entry in [${n[r]}]`);i[r]=e}})),i.children&&e(i.children)}(e.children)}
/*!
* Wunderbaum - ext-dnd
* Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */const nodeMimeType="application/x-wunderbaum-node";class DndExtension extends WunderbaumExtension{constructor(e){super(e,"dnd",{autoExpandMS:1500,multiSource:!1,effectAllowed:"all",dropEffectDefault:"move",guessDropEffect:!0,preventForeignNodes:!1,preventLazyParents:!0,preventNonNodes:!1,preventRecursion:!0,preventSameParent:!1,preventVoidMoves:!0,serializeClipboardData:!0,scroll:!0,scrollSensitivity:20,scrollSpeed:5,sourceCopyHook:null,dragStart:null,drag:null,dragEnd:null,dragEnter:null,dragOver:null,dragExpand:null,drop:null,dragLeave:null}),this.srcNode=null,this.lastTargetNode=null,this.lastEnterStamp=0,this.lastAllowedDropRegions=null,this.lastDropEffect=null,this.lastDropRegion=!1,this.currentScrollDir=0,this.applyScrollDirThrottled=throttle(this._applyScrollDir,50)}init(){super.init();const e=this.tree,t=e.options.dnd;t.dragStart&&onEvent(e.element,"dragstart drag dragend",this.onDragEvent.bind(this)),t.dragEnter&&onEvent(e.element,"dragenter dragover dragleave drop",this.onDropEvent.bind(this))}_leaveNode(){const e=this.lastTargetNode;this.lastEnterStamp=0,e&&(e.setClass("wb-drop-target wb-drop-over wb-drop-after wb-drop-before",!1),this.lastTargetNode=null)}unifyDragover(e){if(!1===e)return!1;if(e instanceof Set)return e.size>0&&e;if(!0===e)return new Set(["over","before","after"]);if("string"==typeof e||isArray(e))return(e=toSet(e)).size>0&&e;throw new Error("Unsupported drop region definition: "+e)}_calcDropRegion(e,t){const s=e.offsetY;return!!t&&(3===t.size?s<5.5?"before":s>16.5?"after":"over":1===t.size&&t.has("over")?"over":s>11?"after":"before")}_guessDropEffect(e){var t;const s=this.treeOpts.dnd,i=null!==(t=s.effectAllowed)&&void 0!==t?t:"all",n=["all","copy","copyLink","copyMove"].includes(i),r=["all","link","copyLink","linkMove"].includes(i),o=["all","move","copyMove","linkMove"].includes(i);let l=s.dropEffectDefault;return s.guessDropEffect&&(isMac?(e.altKey&&n&&(l="copy"),e.metaKey&&o&&(l="move"),e.altKey&&e.metaKey&&r&&(l="link")):(e.ctrlKey&&n&&(l="copy"),e.shiftKey&&o&&(l="move"),e.altKey&&r&&(l="link"))),l}_isVoidDrop(e,t,s){return!(!this.treeOpts.dnd.preventVoidMoves||!t)&&("before"===s&&e===t.getNextSibling()||"after"===s&&e===t.getPrevSibling()||(t===e||t.parent===e))}_applyScrollDir(){if(this.isDragging()&&this.currentScrollDir){const e=this.tree.options.dnd,t=this.tree.element,s=t.scrollTop;this.currentScrollDir<0?t.scrollTop=Math.max(0,s-e.scrollSpeed):this.currentScrollDir>0&&(t.scrollTop=s+e.scrollSpeed)}}_autoScroll(e){const t=this.tree,s=t.options.dnd.scrollSensitivity,i=t.element,n=t.headerElement.clientHeight,r=i.offsetHeight,o=i.scrollTop;return this.currentScrollDir=0,o>0&&e>0&&e<=s+n?this.currentScrollDir=-1:o=r-s&&(this.currentScrollDir=1),this.currentScrollDir&&this.applyScrollDirThrottled(),i.scrollTop-o}isDragging(){return!!this.srcNode}onDragEvent(e){var t;const s=this.treeOpts.dnd,i=Wunderbaum.getNode(e);if(i){if(["dragstart","dragend"].includes(e.type)&&this.tree.logDebug(`onDragEvent.${e.type} srcNode: ${i}`,e),"dragstart"===e.type){if(e.dataTransfer.effectAllowed=s.effectAllowed,i.isEditing())return i.logDebug("Prevented dragging node in edit mode."),e.preventDefault(),!1;if(!i._callEvent("dnd.dragStart",{event:e}))return e.preventDefault(),!1;const n=i.toDict(!0,(e=>{e._orgKey=e.key,delete e.key}));n._treeId=i.tree.id,s.serializeClipboardData&&("function"==typeof s.serializeClipboardData?e.dataTransfer.setData(nodeMimeType,s.serializeClipboardData(n,i)):e.dataTransfer.setData(nodeMimeType,JSON.stringify(n))),(null===(t=e.dataTransfer)||void 0===t?void 0:t.types.includes("text/plain"))||e.dataTransfer.setData("text/plain",i.title),this.srcNode=i,setTimeout((()=>{i.setClass("wb-drag-source")}),0)}else"drag"===e.type?s.drag&&i._callEvent("dnd.drag",{event:e}):"dragend"===e.type&&(i.setClass("wb-drag-source",!1),this.srcNode=null,this.lastTargetNode&&this._leaveNode(),i._callEvent("dnd.dragEnd",{event:e}));return!0}this.tree.logWarn(`onDragEvent.${e.type} no node`)}onDropEvent(e){var t;const s=this.srcNode,i=s?s.tree:null,n=Wunderbaum.getNode(e),r=this.treeOpts.dnd,o=e.dataTransfer,l=this._calcDropRegion(e,this.lastAllowedDropRegions);if(n){if(["drop"].includes(e.type)&&this.tree.logDebug(`onDropEvent.${e.type} targetNode: ${n}, ea: ${null==o?void 0:o.effectAllowed}, de: ${null==o?void 0:o.dropEffect}, cy: ${e.offsetY}, r: ${l}, srcNode: ${s}`,e),"dragenter"===e.type){if(this.lastAllowedDropRegions=null,this.lastTargetNode&&this.lastTargetNode!==n&&this._leaveNode(),this.lastTargetNode=n,this.lastEnterStamp=Date.now(),n.isStatusNode()||r.preventForeignNodes&&n.tree!==i||r.preventLazyParents&&!n.isLoaded()||r.preventNonNodes&&!s||r.preventRecursion&&(null==s?void 0:s.isAncestorOf(n))||r.preventSameParent&&s&&n.parent===s.parent||r.preventVoidMoves&&n===s)return o.dropEffect="none",this.tree.log("Prevented drop operation"),!0;o.dropEffect=this._guessDropEffect(e)||"none";let t=n._callEvent("dnd.dragEnter",{event:e});return t=this.unifyDragover(t),t?(this.lastAllowedDropRegions=t,this.lastDropEffect=o.dropEffect,n.setClass("wb-drop-target"),e.preventDefault(),!1):(o.dropEffect="none",!0)}if("dragover"===e.type){const t=e.clientY-this.tree.element.offsetTop;this._autoScroll(t),o.dropEffect=this._guessDropEffect(e)||"none",n._callEvent("dnd.dragOver",{event:e});const i=this._calcDropRegion(e,this.lastAllowedDropRegions);if(this.lastDropRegion=i,this.lastDropEffect=o.dropEffect,r.autoExpandMS>0&&n.isExpandable(!0)&&!n._isLoading&&Date.now()-this.lastEnterStamp>r.autoExpandMS&&!1!==n._callEvent("dnd.dragExpand",{event:e})&&n.setExpanded(),!i||this._isVoidDrop(n,s,i))return;return n.setClass("wb-drop-over","over"===i),n.setClass("wb-drop-before","before"===i),n.setClass("wb-drop-after","after"===i),e.preventDefault(),!1}if("dragleave"===e.type)n._callEvent("dnd.dragLeave",{event:e});else if("drop"===e.type){e.stopPropagation(),e.preventDefault(),this._leaveNode();const s=this.lastDropRegion;let i=null===(t=e.dataTransfer)||void 0===t?void 0:t.getData(nodeMimeType);i=i?JSON.parse(i):null;const r=this.srcNode,o=this.lastDropEffect;setTimeout((()=>{n._callEvent("dnd.drop",{event:e,region:s,suggestedDropMode:"over"===s?"appendChild":s,suggestedDropEffect:o,sourceNode:r,sourceNodeData:i})}),10)}return!1}this._leaveNode()}}
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */const nodeMimeType="application/x-wunderbaum-node";class DndExtension extends WunderbaumExtension{constructor(e){super(e,"dnd",{autoExpandMS:1500,multiSource:!1,effectAllowed:"all",dropEffectDefault:"move",guessDropEffect:!0,preventForeignNodes:!1,preventLazyParents:!0,preventNonNodes:!1,preventRecursion:!0,preventSameParent:!1,preventVoidMoves:!0,serializeClipboardData:!0,scroll:!0,scrollSensitivity:20,scrollSpeed:5,sourceCopyHook:null,dragStart:null,drag:null,dragEnd:null,dragEnter:null,dragOver:null,dragExpand:null,drop:null,dragLeave:null}),this.srcNode=null,this.lastTargetNode=null,this.lastEnterStamp=0,this.lastAllowedDropRegions=null,this.lastDropEffect=null,this.lastDropRegion=!1,this.currentScrollDir=0,this.applyScrollDirThrottled=throttle(this._applyScrollDir,50)}init(){super.init();const e=this.tree,t=e.options.dnd;t.dragStart&&onEvent(e.element,"dragstart drag dragend",this.onDragEvent.bind(this)),t.dragEnter&&onEvent(e.element,"dragenter dragover dragleave drop",this.onDropEvent.bind(this))}_leaveNode(){const e=this.lastTargetNode;this.lastEnterStamp=0,e&&(e.setClass("wb-drop-target wb-drop-over wb-drop-after wb-drop-before",!1),this.lastTargetNode=null)}unifyDragover(e){if(!1===e)return!1;if(e instanceof Set)return e.size>0&&e;if(!0===e)return new Set(["over","before","after"]);if("string"==typeof e||isArray(e))return(e=toSet(e)).size>0&&e;throw new Error("Unsupported drop region definition: "+e)}_calcDropRegion(e,t){const i=e.offsetY;return!!t&&(3===t.size?i<5.5?"before":i>16.5?"after":"over":1===t.size&&t.has("over")?"over":i>11?"after":"before")}_guessDropEffect(e){var t;const i=this.treeOpts.dnd,s=null!==(t=i.effectAllowed)&&void 0!==t?t:"all",n=["all","copy","copyLink","copyMove"].includes(s),r=["all","link","copyLink","linkMove"].includes(s),o=["all","move","copyMove","linkMove"].includes(s);let l=i.dropEffectDefault;return i.guessDropEffect&&(isMac?(e.altKey&&n&&(l="copy"),e.metaKey&&o&&(l="move"),e.altKey&&e.metaKey&&r&&(l="link")):(e.ctrlKey&&n&&(l="copy"),e.shiftKey&&o&&(l="move"),e.altKey&&r&&(l="link"))),l}_isVoidDrop(e,t,i){return!(!this.treeOpts.dnd.preventVoidMoves||!t)&&("before"===i&&e===t.getNextSibling()||"after"===i&&e===t.getPrevSibling()||(t===e||t.parent===e))}_applyScrollDir(){if(this.isDragging()&&this.currentScrollDir){const e=this.tree.options.dnd,t=this.tree.element,i=t.scrollTop;this.currentScrollDir<0?t.scrollTop=Math.max(0,i-e.scrollSpeed):this.currentScrollDir>0&&(t.scrollTop=i+e.scrollSpeed)}}_autoScroll(e){const t=this.tree,i=t.options.dnd.scrollSensitivity,s=t.element,n=t.headerElement.clientHeight,r=s.offsetHeight,o=s.scrollTop;return this.currentScrollDir=0,o>0&&e>0&&e<=i+n?this.currentScrollDir=-1:o=r-i&&(this.currentScrollDir=1),this.currentScrollDir&&this.applyScrollDirThrottled(),s.scrollTop-o}isDragging(){return!!this.srcNode}onDragEvent(e){var t;const i=this.treeOpts.dnd,s=Wunderbaum.getNode(e);if(s){if(["dragstart","dragend"].includes(e.type)&&this.tree.logDebug(`onDragEvent.${e.type} srcNode: ${s}`,e),"dragstart"===e.type){if(e.dataTransfer.effectAllowed=i.effectAllowed,s.isEditingTitle())return s.logDebug("Prevented dragging node in edit mode."),e.preventDefault(),!1;if(!s._callEvent("dnd.dragStart",{event:e}))return e.preventDefault(),!1;const n=s.toDict(!0,(e=>{e._orgKey=e.key,delete e.key}));n._treeId=s.tree.id,i.serializeClipboardData&&("function"==typeof i.serializeClipboardData?e.dataTransfer.setData(nodeMimeType,i.serializeClipboardData(n,s)):e.dataTransfer.setData(nodeMimeType,JSON.stringify(n))),(null===(t=e.dataTransfer)||void 0===t?void 0:t.types.includes("text/plain"))||e.dataTransfer.setData("text/plain",s.title),this.srcNode=s,setTimeout((()=>{s.setClass("wb-drag-source")}),0)}else"drag"===e.type?i.drag&&s._callEvent("dnd.drag",{event:e}):"dragend"===e.type&&(s.setClass("wb-drag-source",!1),this.srcNode=null,this.lastTargetNode&&this._leaveNode(),s._callEvent("dnd.dragEnd",{event:e}));return!0}this.tree.logWarn(`onDragEvent.${e.type} no node`)}onDropEvent(e){var t;const i=this.srcNode,s=i?i.tree:null,n=Wunderbaum.getNode(e),r=this.treeOpts.dnd,o=e.dataTransfer,l=this._calcDropRegion(e,this.lastAllowedDropRegions);if(n){if(["drop"].includes(e.type)&&this.tree.logDebug(`onDropEvent.${e.type} targetNode: ${n}, ea: ${null==o?void 0:o.effectAllowed}, de: ${null==o?void 0:o.dropEffect}, cy: ${e.offsetY}, r: ${l}, srcNode: ${i}`,e),"dragenter"===e.type){if(this.lastAllowedDropRegions=null,this.lastTargetNode&&this.lastTargetNode!==n&&this._leaveNode(),this.lastTargetNode=n,this.lastEnterStamp=Date.now(),n.isStatusNode()||r.preventForeignNodes&&n.tree!==s||r.preventLazyParents&&!n.isLoaded()||r.preventNonNodes&&!i||r.preventRecursion&&(null==i?void 0:i.isAncestorOf(n))||r.preventSameParent&&i&&n.parent===i.parent||r.preventVoidMoves&&n===i)return o.dropEffect="none",this.tree.log("Prevented drop operation"),!0;o.dropEffect=this._guessDropEffect(e)||"none";let t=n._callEvent("dnd.dragEnter",{event:e});return t=this.unifyDragover(t),t?(this.lastAllowedDropRegions=t,this.lastDropEffect=o.dropEffect,n.setClass("wb-drop-target"),e.preventDefault(),!1):(o.dropEffect="none",!0)}if("dragover"===e.type){const t=e.clientY-this.tree.element.offsetTop;this._autoScroll(t),o.dropEffect=this._guessDropEffect(e)||"none",n._callEvent("dnd.dragOver",{event:e});const s=this._calcDropRegion(e,this.lastAllowedDropRegions);if(this.lastDropRegion=s,this.lastDropEffect=o.dropEffect,r.autoExpandMS>0&&n.isExpandable(!0)&&!n._isLoading&&Date.now()-this.lastEnterStamp>r.autoExpandMS&&!1!==n._callEvent("dnd.dragExpand",{event:e})&&n.setExpanded(),!s||this._isVoidDrop(n,i,s))return;return n.setClass("wb-drop-over","over"===s),n.setClass("wb-drop-before","before"===s),n.setClass("wb-drop-after","after"===s),e.preventDefault(),!1}if("dragleave"===e.type)n._callEvent("dnd.dragLeave",{event:e});else if("drop"===e.type){e.stopPropagation(),e.preventDefault(),this._leaveNode();const i=this.lastDropRegion;let s=null===(t=e.dataTransfer)||void 0===t?void 0:t.getData(nodeMimeType);s=s?JSON.parse(s):null;const r=this.srcNode,o=this.lastDropEffect;setTimeout((()=>{n._callEvent("dnd.drop",{event:e,region:i,suggestedDropMode:"over"===i?"appendChild":i,suggestedDropEffect:o,sourceNode:r,sourceNodeData:s})}),10)}return!1}this._leaveNode()}}
/*!
* Wunderbaum - drag_observer
* Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */class DragObserver{constructor(e){if(this.start={x:0,y:0,altKey:!1,ctrlKey:!1,metaKey:!1,shiftKey:!1},this.dragElem=null,this.dragging=!1,this.events=["mousedown","mouseup","mousemove","keydown"],!e.root)throw new Error("Missing `root` option.");this.opts=Object.assign({thresh:5},e),this.root=e.root,this._handler=this.handleEvent.bind(this),this.events.forEach((e=>{this.root.addEventListener(e,this._handler)}))}disconnect(){this.events.forEach((e=>{this.root.removeEventListener(e,this._handler)}))}getDragElem(){return this.dragElem}isDragging(){return this.dragging}stopDrag(e){this.dragging&&this.opts.dragstop&&e&&(e.type="dragstop",this.opts.dragstop(e)),this.dragElem=null,this.dragging=!1}handleEvent(e){const t=e.type,s=this.opts,i={type:e.type,event:e,dragElem:this.dragElem,dx:e.pageX-this.start.x,dy:e.pageY-this.start.y,apply:void 0};switch(t){case"keydown":this.stopDrag(i);break;case"mousedown":if(this.dragElem){this.stopDrag(i);break}if(s.selector){let t=e.target;if(t.matches(s.selector))this.dragElem=t;else{if(t=t.closest(s.selector),!t)break;this.dragElem=t}}this.start.x=e.pageX,this.start.y=e.pageY,this.start.altKey=e.altKey,this.start.ctrlKey=e.ctrlKey,this.start.metaKey=e.metaKey,this.start.shiftKey=e.shiftKey;break;case"mousemove":if(!this.dragElem)break;if(!this.dragging){if(s.thresh){if(i.dx*i.dx+i.dy*i.dy{this.root.addEventListener(e,this._handler)}))}disconnect(){this.events.forEach((e=>{this.root.removeEventListener(e,this._handler)}))}getDragElem(){return this.dragElem}isDragging(){return this.dragging}stopDrag(e){this.dragging&&this.opts.dragstop&&e&&(e.type="dragstop",this.opts.dragstop(e)),this.dragElem=null,this.dragging=!1}handleEvent(e){const t=e.type,i=this.opts,s={type:e.type,event:e,dragElem:this.dragElem,dx:e.pageX-this.start.x,dy:e.pageY-this.start.y,apply:void 0};switch(t){case"keydown":this.stopDrag(s);break;case"mousedown":if(this.dragElem){this.stopDrag(s);break}if(i.selector){let t=e.target;if(t.matches(i.selector))this.dragElem=t;else{if(t=t.closest(i.selector),!t)break;this.dragElem=t}}this.start.x=e.pageX,this.start.y=e.pageY,this.start.altKey=e.altKey,this.start.ctrlKey=e.ctrlKey,this.start.metaKey=e.metaKey,this.start.shiftKey=e.shiftKey;break;case"mousemove":if(!this.dragElem)break;if(!this.dragging){if(i.thresh){if(s.dx*s.dx+s.dy*s.dythis.tree.element.contains(e.dragElem),drag:e=>this.handleDrag(e),dragstop:e=>this.handleDrag(e)})}init(){super.init()}handleDrag(e){const t=Wunderbaum.getEventInfo(e.event);this.tree.log(`${e.type}(${e.dx})`,e,t)}}
/*!
* Wunderbaum - deferred
* Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
*/class Deferred{constructor(){this._promise=new Promise(((e,t)=>{this._resolve=e,this._reject=t}))}resolve(e){this._resolve(e)}reject(e){this._reject(e)}promise(){return this._promise}then(e){return this._promise.then(e)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}}
/*!
* Wunderbaum - wunderbaum_node
* Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */const NODE_PROPS=new Set(["checkbox","classes","expanded","icon","iconTooltip","key","lazy","_partsel","radiogroup","refKey","selected","statusNodeType","title","tooltip","type","unselectable"]),NODE_DICT_PROPS=new Set(NODE_PROPS);NODE_DICT_PROPS.delete("_partsel"),NODE_DICT_PROPS.delete("unselectable");class WunderbaumNode{constructor(e,t,s){var i,n;this.refKey=void 0,this.children=null,this.classes=null,this.data={},this._isLoading=!1,this._requestId=0,this._errorInfo=null,this._partsel=!1,this._partload=!1,this.subMatchCount=0,this._rowIdx=0,this._rowElem=void 0,assert(!t||t.tree===e,`Invalid parent: ${t}`),assert(!s.children,"'children' not allowed here"),this.tree=e,this.parent=t,this.key=""+(null!==(i=s.key)&&void 0!==i?i:++WunderbaumNode.sequence),this.title=""+(null!==(n=s.title)&&void 0!==n?n:"<"+this.key+">"),null!=s.refKey&&(this.refKey=""+s.refKey),null!=s.type&&(this.type=""+s.type),this.expanded=!0===s.expanded,null!=s.icon&&(this.icon=s.icon),this.lazy=!0===s.lazy,null!=s.statusNodeType&&(this.statusNodeType=""+s.statusNodeType),null!=s.colspan&&(this.colspan=!!s.colspan),null!=s.checkbox&&(this.checkbox=!!s.checkbox),null!=s.radiogroup&&(this.radiogroup=!!s.radiogroup),this.selected=!0===s.selected,!0===s.unselectable&&(this.unselectable=!0),s.classes&&this.setClass(s.classes);for(const[e,t]of Object.entries(s))NODE_PROPS.has(e)||(this.data[e]=t);t&&!this.statusNodeType&&e._registerNode(this)}toString(){return`WunderbaumNode@${this.key}<'${this.title}'>`}*[Symbol.iterator](){const e=this.children;if(e)for(let t=0,s=e.length;t=0,`options.before must be a direct child of ${this}`),this.children.splice(e,0,...o)}else this.children=o;s.update(ChangeType.structure)}finally{s.enableUpdate(!0)}return o[0]}addNode(e,t="appendChild"){switch("over"===t&&(t="appendChild"),t){case"after":return this.parent.addChildren(e,{before:this.getNextSibling()});case"before":return this.parent.addChildren(e,{before:this});case"prependChild":return this.addChildren(e,{before:0});case"appendChild":return this.addChildren(e)}assert(!1,`Invalid mode: ${t}`)}applyCommand(e,t){return this.tree.applyCommand(e,this,t)}collapseSiblings(e){for(const t of this.parent.children)t!==this&&t.expanded&&t.setExpanded(!1,e)}setClass(e,t=!0){const s=toSet(e);if(t)null===this.classes&&(this.classes=new Set),s.forEach((e=>{var s;this.classes.add(e),null===(s=this._rowElem)||void 0===s||s.classList.toggle(e,t)}));else{if(null===this.classes)return;s.forEach((e=>{var s;this.classes.delete(e),null===(s=this._rowElem)||void 0===s||s.classList.toggle(e,t)})),0===this.classes.size&&(this.classes=null)}}async expandAll(e=!0,t){const s=this.tree,i=this.tree.options.minExpandLevel,{depth:n=99,loadLazy:r,force:o,keepActiveNodeVisible:l=!0}=null!=t?t:{},a={scrollIntoView:!1,force:o,loadLazy:r};const d=s.logTime(`${this}.expandAll(${e})`);try{s.enableUpdate(!1),await async function t(s,n){var l;if(0===n)return;const d=null==n?null:n-1,c=[];return null===(l=s.children)||void 0===l||l.forEach((s=>{if(e)if(!s.expanded&&(s.children||r&&s.lazy)){const e=s.setExpanded(!0,a);c.push(e),e.then((async()=>{await t(s,d)}))}else c.push(t(s,d));else(!i||o||s.getLevel()>i)&&s.setExpanded(!1,a),t(s,d)})),new Promise((e=>{Promise.all(c).then((()=>{e(!0)}))}))}(this,n)}finally{s.enableUpdate(!0),s.logTimeEnd(d)}s.activeNode&&l&&s.activeNode.scrollIntoView()}findAll(e){const t="function"==typeof e?e:makeNodeTitleMatcher(e),s=[];return this.visit((e=>{t(e)&&s.push(e)})),s}findDirectChild(e){const t=this.children;if(!t)return null;if("string"==typeof e){for(let s=0,i=t.length;s{if(t(e))return s=e,!1})),s}findRelatedNode(e,t=!1){return this.tree.findRelatedNode(this,e,t)}*format_iter(e,t){function s(e){const t=e.parent.children;return e===t[t.length-1]}null!=t||(t=[" "," | "," ╰─ "," ├─ "]),null!=e||(e=e=>""+e);const i=i=>{const n=[e(i)];n.unshift(t[s(i)?2:3]);let r=i.parent;for(;r&&r!==this;)n.unshift(t[s(r)?0:1]),r=r.parent;return n.join("")};yield e(this);for(const e of this)yield i(e)}format(e,t){const s=[];for(const i of this.format_iter(e,t))s.push(i);return s.join("\n")}getColElem(e){var t;"string"==typeof e&&(e=this.tree.columns.findIndex((t=>t.id===e)));const s=null===(t=this._rowElem)||void 0===t?void 0:t.querySelectorAll("span.wb-col");return s?s[e]:null}getFirstChild(){return this.children?this.children[0]:null}getLastChild(){return this.children?this.children[this.children.length-1]:null}getLevel(){let e=0,t=this.parent;for(;t;)e++,t=t.parent;return e}getNextSibling(){const e=this.parent.children,t=e.indexOf(this);return e[t+1]||null}getParent(){return this.parent}getParentList(e=!1,t=!1){const s=[];let i=t?this:this.parent;for(;i;)(e||i.parent)&&s.unshift(i),i=i.parent;return s}getPath(e=!0,t="title",s="/"){let i;const n=[],r="function"==typeof t;return this.visitParents((e=>{e.parent&&(i=r?t(e):e[t],n.unshift(i))}),e),n.join(s)}getPrevSibling(){const e=this.parent.children,t=e.indexOf(this);return e[t-1]||null}hasChildren(){if(this.lazy){if(null==this.children)return;if(0===this.children.length)return!1;if(1===this.children.length&&this.children[0].isStatusNode())return;return!0}return!(!this.children||!this.children.length)}hasClass(e){return!!this.classes&&this.classes.has(e)}isActive(){return this.tree.activeNode===this}isAncestorOf(e){return e&&e.isDescendantOf(this)}isChildOf(e){return e&&this.parent===e}isColspan(){return!!this.getOption("colspan")}isDescendantOf(e){if(!e||e.tree!==this.tree)return!1;let t=this.parent;for(;t;){if(t===e)return!0;t===t.parent&&error(`Recursive parent link: ${t}`),t=t.parent}return!1}isExpandable(e=!1){return!(e&&this.expanded||!1===this.children)&&(null==this.children?!!this.lazy:0!==this.children.length||!!this.tree.options.emptyChildListExpandable)}isEditing(){return this.tree._callMethod("edit.isEditingTitle",this)}isExpanded(){return!!this.expanded}isFirstSibling(){const e=this.parent;return!e||e.children[0]===this}isLastSibling(){const e=this.parent;return!e||e.children[e.children.length-1]===this}isLazy(){return!!this.lazy}isLoaded(){return!this.lazy||void 0!==this.hasChildren()}isLoading(){return this._isLoading}isPagingNode(){return"paging"===this.statusNodeType}isParentOf(e){return e&&e.parent===this}isPartload(){return!!this._partload}isPartsel(){return!this.selected&&!!this._partsel}isRadio(){return!!this.parent.radiogroup||"radio"===this.getOption("checkbox")}isRendered(){return!!this._rowElem}isRootNode(){return this.tree.root===this}isSelected(){return!!this.selected||!!this._partsel&&void 0}isStatusNode(){return!!this.statusNodeType}isTopLevel(){return this.tree.root===this.parent}isUnloaded(){return void 0===this.hasChildren()}isVisible(){const e="hide"===this.tree.filterMode,t=this.getParentList(!1,!1);if(e&&!this.match&&!this.subMatchCount)return!1;for(let e=0,s=t.length;es)return void this.logWarn(`Ignored load response #${s} because #${this._requestId} is pending.`);if(this.logDebug(`Received response for load request #${s}`),null===this.parent&&null!==i)return void this.logWarn("Lazy parent node was removed while loading: discarding response.");this.setStatus(NodeStatusType.ok);const r=Date.now();this._loadSourceObject(t),l=Date.now()-r}else{if("function"==typeof e.then){const s=t.logTime(`Resolve thenable ${e}`);e=await Promise.resolve(e),t.logTimeEnd(s)}this._loadSourceObject(e),l=Date.now()-n}}catch(t){throw this.logError("Error during load()",e,t),this._callEvent("error",{error:t}),this.setStatus(NodeStatusType.error,{message:""+t}),t}finally{this._requestId=0,r=Date.now()-n,t.options.debugLevel>=3&&t.logInfo(`Load source took ${r/1e3} seconds (transfer: ${o/1e3}s, processing: ${l/1e3}s)`)}}async loadLazy(e=!1){const t=this.expanded;if(assert(this.lazy,"load() requires a lazy node"),e||this.isUnloaded()){this.isLoaded()&&this.resetLazy(),this.setStatus(NodeStatusType.loading);try{const e=await this._callEvent("lazyLoad");if(!1===e)return void this.setStatus(NodeStatusType.ok);assert(isArray(e)||e&&e.url,"The lazyLoad event must return a node list, `{url: ...}`, or false."),await this.load(e),this.setStatus(NodeStatusType.ok),t?(this.expanded=!0,this.tree.update(ChangeType.structure)):this.update()}catch(e){this.logError("Error during loadLazy()",e),this._callEvent("error",{error:e}),this.setStatus(NodeStatusType.error,{message:""+e})}}}log(...e){this.logDebug(...e)}logDebug(...e){this.tree.options.debugLevel>=4&&console.log(this.toString(),...e)}logError(...e){this.tree.options.debugLevel>=1&&console.error(this.toString(),...e)}logInfo(...e){this.tree.options.debugLevel>=3&&console.info(this.toString(),...e)}logWarn(...e){this.tree.options.debugLevel>=2&&console.warn(this.toString(),...e)}async makeVisible(e){let t;const s=new Deferred,i=[],n=this.getParentList(!1,!1),r=n.length,o=getOption(e,"noAnimation",!1),l=getOption(e,"scrollIntoView",!0);for(t=r-1;t>=0;t--){const e={noAnimation:o};i.push(n[t].setExpanded(!0,e))}return Promise.all(i).then((()=>{l&&this.tree?(this.tree.updatePendingModifications(),this.scrollIntoView().then((()=>{s.resolve()}))):s.resolve()})),s.promise()}moveTo(e,t="appendChild",s){let i;"over"===t&&(t="appendChild"),"prependChild"===t&&(e.children&&e.children.length?(t="before",e=e.children[0]):t="appendChild");const n=this.tree,r=this.parent,o="appendChild"===t?e:e.parent;if(this!==e){if(this.parent?o.isDescendantOf(this)&&error("Cannot move a node to its own descendant"):error("Cannot move system root"),o!==r&&r.triggerModifyChild("remove",this),1===this.parent.children.length){if(this.parent===o)return;this.parent.children=this.parent.lazy?[]:null,this.parent.expanded=!1}else i=this.parent.children.indexOf(this),assert(i>=0,"invalid source parent"),this.parent.children.splice(i,1);if(this.parent=o,o.hasChildren())switch(t){case"appendChild":o.children.push(this);break;case"before":i=o.children.indexOf(e),assert(i>=0,"invalid target parent"),o.children.splice(i,0,this);break;case"after":i=o.children.indexOf(e),assert(i>=0,"invalid target parent"),o.children.splice(i+1,0,this);break;default:error(`Invalid mode '${t}'.`)}else o.children=[this];s&&e.visit(s,!0),o===r?o.triggerModifyChild("move",this):o.triggerModifyChild("add",this),n!==e.tree&&(this.logWarn("Cross-tree moveTo is experimental!"),this.visit((t=>{t.tree=e.tree}),!0)),setTimeout((()=>{n.update(ChangeType.any)}),0)}}async navigate(e,t){e=KEY_TO_ACTION_DICT[e]||e;const s=this.findRelatedNode(e);if(!s)return this.logWarn(`Could not find related node '${e}'.`),Promise.resolve(this);try{s.makeVisible({scrollIntoView:!1})}catch(e){}return s.setFocus(),!1===(null==t?void 0:t.activate)?Promise.resolve(this):s.setActive(!0,{event:null==t?void 0:t.event})}remove(){const e=this.tree,t=this.parent.children.indexOf(this);this.triggerModify("remove"),this.parent.children.splice(t,1),this.visit((t=>{t.removeMarkup(),e._unregisterNode(t)}),!0),e.update(ChangeType.structure)}removeChildren(){const e=this.tree;this.children&&(e.activeNode&&e.activeNode.isDescendantOf(this)&&e.activeNode.setActive(!1),e.focusNode&&e.focusNode.isDescendantOf(this)&&(e.focusNode=null),this.triggerModifyChild("remove",null),this.visit((t=>{e._unregisterNode(t)})),this.lazy?this.children=[]:this.children=null,this.isRootNode()||(this.expanded=!1),this.tree.update(ChangeType.structure))}removeMarkup(){this._rowElem&&(delete this._rowElem._wb_node,this._rowElem.remove(),this._rowElem=void 0)}_getRenderInfo(){const e={},t={},s=this.isColspan(),i=this._rowElem?this._rowElem.querySelectorAll("span.wb-col"):null;let n=0;for(const r of this.tree.columns)e[r.id]={id:r.id,idx:n,elem:i?i[n]:null,info:r},s||"*"===r.id||(t[r.id]=e[r.id]),n++;return{allColInfosById:e,renderColInfosById:t}}_createIcon(e,t,s,i){let n,r=this.getOption("icon");if(this._errorInfo?r=e.error:this._isLoading&&i&&(r=e.loading),!1===r)return null;"string"==typeof r||(r=this.statusNodeType?e[this.statusNodeType]:this.expanded?e.folderOpen:this.children?e.folder:this.lazy?e.folderLazy:e.doc),r?r.indexOf("<")>=0?n=elemFromHtml(r):TEST_IMG.test(r)?n=elemFromHtml(``):(n=document.createElement("i"),n.className="wb-icon "+r):(n=document.createElement("i"),n.className="wb-icon"),s?t.replaceChild(n,s):t.appendChild(n);const o=this._callEvent("iconBadge",{iconSpan:n});let l=null;if(null!=o&&!1!==o){let e="",t="";isPlainObject(o)?(l=""+o.badge,e=o.badgeClass?" "+o.badgeClass:"",t=o.badgeTooltip?` title="${o.badgeTooltip}"`:""):l="number"==typeof o?""+o:o,"string"==typeof l&&(l=elemFromHtml(`${escapeHtml(l)} `)),l&&n.append(l)}return n}_render_markup(e){const t=this.tree,s=t.options,i=this.getOption("checkbox"),n=t.columns,r=this.getLevel(),o=t.isRowNav()?null:t.activeColIdx;let l,a=this._rowElem,d=null,c=null;const h=!a;assert(h,"Expected unrendered node"),assert(!h||e&&e.after,"opts.after expected, unless updating"),assert(!this.isRootNode(),"Root node not allowed"),a=document.createElement("div"),a.classList.add("wb-row"),a.style.top=22*this._rowIdx+"px",this._rowElem=a,a._wb_node=this;const u=document.createElement("span");u.classList.add("wb-node","wb-col"),a.appendChild(u);let p=0;i&&(d=document.createElement("i"),d.classList.add("wb-checkbox"),("radio"===i||this.parent.radiogroup)&&d.classList.add("wb-radio"),u.appendChild(d),p+=20);for(let e=r-1;e>0;e--)l=document.createElement("i"),l.classList.add("wb-indent"),u.appendChild(l),p+=20;(!s.minExpandLevel||r>s.minExpandLevel)&&(c=document.createElement("i"),c.classList.add("wb-expander"),u.appendChild(c),p+=20);this._createIcon(t.iconMap,u,null,!c)&&(p+=20);const f=document.createElement("span");f.classList.add("wb-title"),u.appendChild(f),u._ofsTitlePx=p,t.options.dnd.dragStart&&(u.draggable=!0);if(!this.isColspan()&&n.length>1){let e=0;for(const t of n){let s;e++,"*"===t.id?s=u:(s=document.createElement("span"),s.classList.add("wb-col"),a.appendChild(s)),e===o&&s.classList.add("wb-active"),t.classes&&s.classList.add(...t.classes.split(" ")),s.style.left=t._ofsPx+"px",s.style.width=t._widthPx+"px",h&&t.html&&"string"==typeof t.html&&(s.innerHTML=t.html)}}switch(e?e.after:"last"){case"first":t.nodeListElement.prepend(a);break;case"last":t.nodeListElement.appendChild(a);break;default:e.after.after(a)}e.isNew=!0,this._render_data(e)}_render_data(e){assert(this._rowElem,"No _rowElem");const t=this.tree,s=t.options,i=this._rowElem,n=!!e.isNew,r=!!e.preventScroll,o=t.columns,l=this.isColspan(),a=i.querySelector("span.wb-node"),d=a.querySelector("span.wb-title"),c=t.element.scrollTop;if(this.titleWithHighlight?d.innerHTML=this.titleWithHighlight:d.textContent=this.title,r&&(t.element.scrollTop=c),!s.skeleton)if(l){const e=t.element.clientWidth;d.style.width=e-a._ofsTitlePx-7+"px"}else d.style.width=o[0]._widthPx-a._ofsTitlePx-7+"px";if(e.isDataChange=!0,this._render_status(e),this.statusNodeType)this._callEvent("renderStatusNode",{isNew:n,nodeElem:a,isColspan:l});else if(this.parent){const e=this._getRenderInfo();this._callEvent("render",{isNew:n,nodeElem:a,isColspan:l,allColInfosById:e.allColInfosById,renderColInfosById:e.renderColInfosById})}}_render_status(e){const t=this.tree,s=t.iconMap,i=t.options,n=this.type?t.types[this.type]:null,r=this._rowElem,o=r.querySelector("span.wb-node"),l=o.querySelector("i.wb-expander"),a=o.querySelector("i.wb-checkbox"),d=["wb-row"];if(this.expanded&&d.push("wb-expanded"),this.lazy&&d.push("wb-lazy"),this.selected&&d.push("wb-selected"),this._partsel&&d.push("wb-partsel"),this===t.activeNode&&d.push("wb-active"),this===t.focusNode&&d.push("wb-focus"),this._errorInfo&&d.push("wb-error"),this._isLoading&&d.push("wb-loading"),this.isColspan()&&d.push("wb-colspan"),this.statusNodeType&&d.push("wb-status-"+this.statusNodeType),this.match&&d.push("wb-match"),this.subMatchCount&&d.push("wb-submatch"),i.skeleton&&d.push("wb-skeleton"),r.className=d.join(" "),this.classes&&r.classList.add(...this.classes),n&&n.classes&&r.classList.add(...n.classes),l){let e=null;this._isLoading?e=s.loading:this.isExpandable(!1)?e=this.expanded?s.expanderExpanded:s.expanderCollapsed:this.lazy&&null==this.children&&(e=s.expanderLazy),null==e?l.classList.add("wb-indent"):TEST_IMG.test(e)?l.style.backgroundImage=`url('${e}')`:l.className="wb-expander "+e}if(a){let e="wb-checkbox ";this.isRadio()?(e+="wb-radio ",this.selected?e+=s.radioChecked:e+=s.radioUnchecked):this.selected?e+=s.checkChecked:this._partsel?e+=s.checkUnknown:e+=s.checkUnchecked,a.className=e}if(!e.isNew){let e=0;for(const s of r.children)s.classList.toggle("wb-active",e++===t.activeColIdx);const s=o.querySelector("i.wb-icon");s&&this._createIcon(t.iconMap,o,s,!l)}if(!1!==e.resizeCols&&!this.isColspan()){const e=r.querySelectorAll("span.wb-col");let t=0,s=0;for(const i of this.tree.columns){const n=e[t];n.style.left=`${s}px`,n.style.width=`${i._widthPx}px`,t++,s+=i._widthPx}}}_render(e){const t=Object.assign({change:ChangeType.data},e);switch(this._rowElem||(t.change=ChangeType.row),t.change){case"status":this._render_status(t);break;case"data":this._render_data(t);break;case"row":this._render_markup(t);break;default:error(`Invalid change type '${t.change}'.`)}}resetLazy(){this.removeChildren(),this.expanded=!1,this.lazy=!0,this.children=null,this.tree.update(ChangeType.structure)}toDict(e=!1,t){const s={};if(NODE_DICT_PROPS.forEach((e=>{const t=this[e];t instanceof Set?t.size&&(s[e]=Array.prototype.join.call(t.keys()," ")):(t||!1===t||0===t)&&(s[e]=t)})),isEmptyObject(this.data)||(s.data=extend({},this.data),isEmptyObject(s.data)&&delete s.data),t){const i=t(s,this);if(!1===i)return!1;"skip"===i&&(e=!1)}if(e&&isArray(this.children)){s.children=[];for(let e=0,i=this.children.length;e=0&&([i,e]=e.split("."));const n=i[e];if("function"==typeof n){const e=n.call(s,{type:"resolve",tree:s,node:this});if(void 0!==e)return e}if(void 0!==this[e])return this[e];const r=this.type?s.types[this.type]:void 0,o=r?r[e]:void 0;return void 0!==o?o:null!=n?n:t}async scrollIntoView(e){const t=Object.assign({node:this},e);return this.tree.scrollTo(t)}async setActive(e=!0,t){const s=this.tree,i=s.activeNode,n=null==t?void 0:t.retrigger,r=null==t?void 0:t.focusTree,o=!1!==(null==t?void 0:t.focusNode),l=null==t?void 0:t.noEvents,a=null==t?void 0:t.event;if(!l)if(e){if(i!==this||n){if(!1===(null==i?void 0:i._callEvent("deactivate",{nextNode:this,event:a}))||!1===this._callEvent("beforeActivate",{prevNode:i,event:a}))return;s.activeNode=null,null==i||i.update(ChangeType.status)}}else(i===this||n)&&this._callEvent("deactivate",{nextNode:null,event:a});return i!==this&&(e&&(s.activeNode=this,(o||r)&&(s.focusNode=this),r&&s.setFocus()),null==i||i.update(ChangeType.status),this.update(ChangeType.status)),t&&null!=t.colIdx&&t.colIdx!==s.activeColIdx&&s.isCellNav()&&s.setColumn(t.colIdx),e&&!l&&this._callEvent("activate",{prevNode:i,event:a}),this.makeVisible()}async setExpanded(e=!0,t){const{force:s,scrollIntoView:i,immediate:n}=null!=t?t:{};if(!e&&this.isExpanded()&&this.getLevel()<=this.tree.getOption("minExpandLevel")&&!s)return void this.logDebug("Ignored collapse request below expandLevel.");if(!e==!this.expanded)return;e&&this.getOption("autoCollapse")&&this.collapseSiblings(t),e&&this.lazy&&null==this.children&&await this.loadLazy(),this.expanded=e;const r={immediate:n};if(this.tree.update(ChangeType.structure,r),e&&i){const e=this.getLastChild();e&&(this.tree.updatePendingModifications(),e.scrollIntoView({topNode:this}))}}setFocus(e=!0){assert(!!e,"blur is not yet implemented");const t=this.tree.focusNode;this.tree.focusNode=this,null==t||t.update(),this.update()}setIcon(e){this.icon=e,this.update()}setKey(e,t){throw new Error("Not yet implemented")}update(e=ChangeType.data){assert(e===ChangeType.status||e===ChangeType.data,`Invalid change type ${e}`),this.tree.update(e,this)}getSelectedNodes(e=!1){const t=[];return this.visit((s=>{if(s.selected&&(t.push(s),!0===e))return"skip"})),t}toggleSelected(e){let t=this.isSelected();return t=void 0!==t||this.isRadio()?!t:this._anySelectable(),this.setSelected(t,e)}_anySelectable(){let e=!1;return this.visit((t=>{if(!1===t.selected&&!t.unselectable&&!t.hasChildren()&&!t.parent.radiogroup)return e=!0,!1})),e}_changeSelectStatusProps(e){let t=!1;switch(e){case!1:t=this.selected||this._partsel,this.selected=!1,this._partsel=!1;break;case!0:t=!this.selected||!this._partsel,this.selected=!0,this._partsel=!0;break;case void 0:t=this.selected||!this._partsel,this.selected=!1,this._partsel=!0;break;default:error(`Invalid state: ${e}`)}return t&&this.update(),t}fixSelection3AfterClick(e){const t=!!(null==e?void 0:e.force),s=this.isSelected();this.visit((e=>{if(e.radiogroup)return"skip";!t&&e.getOption("unselectable")||e._changeSelectStatusProps(s)})),this.fixSelection3FromEndNodes()}fixSelection3FromEndNodes(e){const t=!!(null==e?void 0:e.force);assert("hier"===this.tree.options.selectMode,"expected selectMode 'hier'");const s=e=>{let i;const n=e.children;if(n&&n.length){let e=!0,t=!1;for(let i=0,r=n.length;i{let t;const s=e.children;let i=!0,n=!1;for(let e=0,r=s.length;e{this.visit((t=>{t.setSelected(e)}))})),n):(e===n||i&&!1===this._callEvent("beforeSelect",{flag:e})||(s.runWithDeferredUpdate((()=>{if(r){if(!e&&!(null==t?void 0:t.force))return n;for(const e of this.parent.children)e.selected=e===this}else this.selected=e,"hier"===o?this.fixSelection3AfterClick():"single"===o&&s.visit((e=>{e.selected=!1}))})),i&&this._callEvent("select",{flag:e})),n):n}setStatus(e,t){const s=this.tree,i=null==t?void 0:t.message,n=null==t?void 0:t.details;let r=null;const o=e=>{const t=this.children,i=t?t[0]:null;return assert(e.statusNodeType,"Not a status node"),assert(!i||!i.isStatusNode(),"Child must not be a status node"),r=this.addNode(e,"prependChild"),r.match=!0,s.update(ChangeType.structure),r};switch((()=>{const e=this.children;e&&e.length&&e[0].isStatusNode()&&e[0].remove()})(),e){case"ok":this._isLoading=!1,this._errorInfo=null;break;case"loading":this._isLoading=!0,this._errorInfo=null,this.parent?this.update(ChangeType.status):o({statusNodeType:e,title:s.options.strings.loading+(i?" ("+i+")":""),checkbox:!1,colspan:!0,tooltip:n});break;case"error":o({statusNodeType:e,title:s.options.strings.loadError+(i?" ("+i+")":""),checkbox:!1,colspan:!0,tooltip:n}),this._isLoading=!1,this._errorInfo={message:i,details:n};break;case"noData":o({statusNodeType:e,title:i||s.options.strings.noData,checkbox:!1,colspan:!0,tooltip:n}),this._isLoading=!1,this._errorInfo=null;break;default:error("invalid node status "+e)}return s.update(ChangeType.structure),r}setTitle(e){this.title=e,this.update()}_sortChildren(e,t){const s=this.children;if(s&&(s.sort(e),t))for(let i=0,n=s.length;i"),null!=i.refKey&&(this.refKey=""+i.refKey),null!=i.type&&(this.type=""+i.type),this.expanded=!0===i.expanded,null!=i.icon&&(this.icon=i.icon),this.lazy=!0===i.lazy,null!=i.statusNodeType&&(this.statusNodeType=""+i.statusNodeType),null!=i.colspan&&(this.colspan=!!i.colspan),null!=i.checkbox&&(this.checkbox=!!i.checkbox),null!=i.radiogroup&&(this.radiogroup=!!i.radiogroup),this.selected=!0===i.selected,!0===i.unselectable&&(this.unselectable=!0),i.classes&&this.setClass(i.classes);for(const[e,t]of Object.entries(i))NODE_PROPS.has(e)||(this.data[e]=t);t&&!this.statusNodeType&&e._registerNode(this)}toString(){return`WunderbaumNode@${this.key}<'${this.title}'>`}*[Symbol.iterator](){const e=this.children;if(e)for(let t=0,i=e.length;t=0,`options.before must be a direct child of ${this}`),this.children.splice(e,0,...o)}else this.children=o;i.update(ChangeType.structure)}finally{i.enableUpdate(!0)}return o[0]}addNode(e,t="appendChild"){switch("over"===t&&(t="appendChild"),t){case"after":return this.parent.addChildren(e,{before:this.getNextSibling()});case"before":return this.parent.addChildren(e,{before:this});case"prependChild":return this.addChildren(e,{before:0});case"appendChild":return this.addChildren(e)}assert(!1,`Invalid mode: ${t}`)}applyCommand(e,t){return this.tree.applyCommand(e,this,t)}collapseSiblings(e){for(const t of this.parent.children)t!==this&&t.expanded&&t.setExpanded(!1,e)}setClass(e,t=!0){const i=toSet(e);if(t)null===this.classes&&(this.classes=new Set),i.forEach((e=>{var i;this.classes.add(e),null===(i=this._rowElem)||void 0===i||i.classList.toggle(e,t)}));else{if(null===this.classes)return;i.forEach((e=>{var i;this.classes.delete(e),null===(i=this._rowElem)||void 0===i||i.classList.toggle(e,t)})),0===this.classes.size&&(this.classes=null)}}startEditTitle(){this.tree._callMethod("edit.startEditTitle",this)}async expandAll(e=!0,t){const i=this.tree,s=this.tree.options.minExpandLevel,{depth:n=99,loadLazy:r,force:o,keepActiveNodeVisible:l=!0}=null!=t?t:{},a={scrollIntoView:!1,force:o,loadLazy:r};const d=i.logTime(`${this}.expandAll(${e})`);try{i.enableUpdate(!1),await async function t(i,n){var l;if(0===n)return;const d=null==n?null:n-1,c=[];return null===(l=i.children)||void 0===l||l.forEach((i=>{if(e)if(!i.expanded&&(i.children||r&&i.lazy)){const e=i.setExpanded(!0,a);c.push(e),e.then((async()=>{await t(i,d)}))}else c.push(t(i,d));else(!s||o||i.getLevel()>s)&&i.setExpanded(!1,a),t(i,d)})),new Promise((e=>{Promise.all(c).then((()=>{e(!0)}))}))}(this,n)}finally{i.enableUpdate(!0),i.logTimeEnd(d)}i.activeNode&&l&&i.activeNode.scrollIntoView()}findAll(e){const t="function"==typeof e?e:makeNodeTitleMatcher(e),i=[];return this.visit((e=>{t(e)&&i.push(e)})),i}findDirectChild(e){const t=this.children;if(!t)return null;if("string"==typeof e){for(let i=0,s=t.length;i{if(t(e))return i=e,!1})),i}findRelatedNode(e,t=!1){return this.tree.findRelatedNode(this,e,t)}*format_iter(e,t){function i(e){const t=e.parent.children;return e===t[t.length-1]}null!=t||(t=[" "," | "," ╰─ "," ├─ "]),null!=e||(e=e=>""+e);const s=s=>{const n=[e(s)];n.unshift(t[i(s)?2:3]);let r=s.parent;for(;r&&r!==this;)n.unshift(t[i(r)?0:1]),r=r.parent;return n.join("")};yield e(this);for(const e of this)yield s(e)}format(e,t){const i=[];for(const s of this.format_iter(e,t))i.push(s);return i.join("\n")}getColElem(e){var t;"string"==typeof e&&(e=this.tree.columns.findIndex((t=>t.id===e)));const i=null===(t=this._rowElem)||void 0===t?void 0:t.querySelectorAll("span.wb-col");return i?i[e]:null}getCloneList(e=!1){if(!this.refKey)return[];const t=this.tree.findByRefKey(this.refKey);return e?t:[...t].filter((e=>e!==this))}getFirstChild(){return this.children?this.children[0]:null}getLastChild(){return this.children?this.children[this.children.length-1]:null}getLevel(){let e=0,t=this.parent;for(;t;)e++,t=t.parent;return e}getNextSibling(){const e=this.parent.children,t=e.indexOf(this);return e[t+1]||null}getParent(){return this.parent}getParentList(e=!1,t=!1){const i=[];let s=t?this:this.parent;for(;s;)(e||s.parent)&&i.unshift(s),s=s.parent;return i}getPath(e=!0,t="title",i="/"){let s;const n=[],r="function"==typeof t;return this.visitParents((e=>{e.parent&&(s=r?t(e):e[t],n.unshift(s))}),e),n.join(i)}getPrevSibling(){const e=this.parent.children,t=e.indexOf(this);return e[t-1]||null}hasChildren(){if(this.lazy){if(null==this.children)return;if(0===this.children.length)return!1;if(1===this.children.length&&this.children[0].isStatusNode())return;return!0}return!(!this.children||!this.children.length)}hasClass(e){return!!this.classes&&this.classes.has(e)}isActive(){return this.tree.activeNode===this}isAncestorOf(e){return e&&e.isDescendantOf(this)}isChildOf(e){return e&&this.parent===e}isClone(){return!!this.refKey&&this.tree.findByRefKey(this.refKey).length>1}isColspan(){return!!this.getOption("colspan")}isDescendantOf(e){if(!e||e.tree!==this.tree)return!1;let t=this.parent;for(;t;){if(t===e)return!0;t===t.parent&&error(`Recursive parent link: ${t}`),t=t.parent}return!1}isExpandable(e=!1){return!(e&&this.expanded||!1===this.children)&&(null==this.children?!!this.lazy:0!==this.children.length||!!this.tree.options.emptyChildListExpandable)}isEditingTitle(){return this.tree._callMethod("edit.isEditingTitle",this)}isExpanded(){return!!this.expanded}isFirstSibling(){const e=this.parent;return!e||e.children[0]===this}isLastSibling(){const e=this.parent;return!e||e.children[e.children.length-1]===this}isLazy(){return!!this.lazy}isLoaded(){return!this.lazy||void 0!==this.hasChildren()}isLoading(){return this._isLoading}isPagingNode(){return"paging"===this.statusNodeType}isParentOf(e){return e&&e.parent===this}isPartload(){return!!this._partload}isPartsel(){return!this.selected&&!!this._partsel}isRadio(){return!!this.parent.radiogroup||"radio"===this.getOption("checkbox")}isRendered(){return!!this._rowElem}isRootNode(){return this.tree.root===this}isSelected(){return!!this.selected||!!this._partsel&&void 0}isStatusNode(){return!!this.statusNodeType}isTopLevel(){return this.tree.root===this.parent}isUnloaded(){return void 0===this.hasChildren()}isVisible(){const e="hide"===this.tree.filterMode,t=this.getParentList(!1,!1);if(e&&!this.match&&!this.subMatchCount)return!1;for(let e=0,i=t.length;ei)return void this.logWarn(`Ignored load response #${i} because #${this._requestId} is pending.`);if(this.logDebug(`Received response for load request #${i}`),null===this.parent&&null!==s)return void this.logWarn("Lazy parent node was removed while loading: discarding response.");this.setStatus(NodeStatusType.ok);const r=Date.now();this._loadSourceObject(t),l=Date.now()-r}else{if("function"==typeof e.then){const i=t.logTime(`Resolve thenable ${e}`);e=await Promise.resolve(e),t.logTimeEnd(i)}this._loadSourceObject(e),l=Date.now()-n}}catch(t){throw this.logError("Error during load()",e,t),this._callEvent("error",{error:t}),this.setStatus(NodeStatusType.error,{message:""+t}),t}finally{this._requestId=0,r=Date.now()-n,t.options.debugLevel>=3&&t.logInfo(`Load source took ${r/1e3} seconds (transfer: ${o/1e3}s, processing: ${l/1e3}s)`)}}async loadLazy(e=!1){const t=this.expanded;if(assert(this.lazy,"load() requires a lazy node"),e||this.isUnloaded()){this.isLoaded()&&this.resetLazy(),this.setStatus(NodeStatusType.loading);try{const e=await this._callEvent("lazyLoad");if(!1===e)return void this.setStatus(NodeStatusType.ok);assert(isArray(e)||e&&e.url,"The lazyLoad event must return a node list, `{url: ...}`, or false."),await this.load(e),this.setStatus(NodeStatusType.ok),t?(this.expanded=!0,this.tree.update(ChangeType.structure)):this.update()}catch(e){this.logError("Error during loadLazy()",e),this._callEvent("error",{error:e}),this.setStatus(NodeStatusType.error,{message:""+e})}}}log(...e){this.logDebug(...e)}logDebug(...e){this.tree.options.debugLevel>=4&&console.log(this.toString(),...e)}logError(...e){this.tree.options.debugLevel>=1&&console.error(this.toString(),...e)}logInfo(...e){this.tree.options.debugLevel>=3&&console.info(this.toString(),...e)}logWarn(...e){this.tree.options.debugLevel>=2&&console.warn(this.toString(),...e)}async makeVisible(e){let t;const i=new Deferred,s=[],n=this.getParentList(!1,!1),r=n.length,o=getOption(e,"noAnimation",!1),l=getOption(e,"scrollIntoView",!0);for(t=r-1;t>=0;t--){const e={noAnimation:o};s.push(n[t].setExpanded(!0,e))}return Promise.all(s).then((()=>{l&&this.tree?(this.tree.updatePendingModifications(),this.scrollIntoView().then((()=>{i.resolve()}))):i.resolve()})),i.promise()}moveTo(e,t="appendChild",i){let s;"over"===t&&(t="appendChild"),"prependChild"===t&&(e.children&&e.children.length?(t="before",e=e.children[0]):t="appendChild");const n=this.tree,r=this.parent,o="appendChild"===t?e:e.parent;if(this!==e){if(this.parent?o.isDescendantOf(this)&&error("Cannot move a node to its own descendant"):error("Cannot move system root"),o!==r&&r.triggerModifyChild("remove",this),1===this.parent.children.length){if(this.parent===o)return;this.parent.children=this.parent.lazy?[]:null,this.parent.expanded=!1}else s=this.parent.children.indexOf(this),assert(s>=0,"invalid source parent"),this.parent.children.splice(s,1);if(this.parent=o,o.hasChildren())switch(t){case"appendChild":o.children.push(this);break;case"before":s=o.children.indexOf(e),assert(s>=0,"invalid target parent"),o.children.splice(s,0,this);break;case"after":s=o.children.indexOf(e),assert(s>=0,"invalid target parent"),o.children.splice(s+1,0,this);break;default:error(`Invalid mode '${t}'.`)}else o.children=[this];i&&e.visit(i,!0),o===r?o.triggerModifyChild("move",this):o.triggerModifyChild("add",this),n!==e.tree&&(this.logWarn("Cross-tree moveTo is experimental!"),this.visit((t=>{t.tree=e.tree}),!0)),setTimeout((()=>{n.update(ChangeType.any)}),0)}}async navigate(e,t){e=KEY_TO_ACTION_DICT[e]||e;const i=this.findRelatedNode(e);if(!i)return this.logWarn(`Could not find related node '${e}'.`),Promise.resolve(this);try{i.makeVisible({scrollIntoView:!1})}catch(e){}return i.setFocus(),!1===(null==t?void 0:t.activate)?Promise.resolve(this):i.setActive(!0,{event:null==t?void 0:t.event})}remove(){const e=this.tree,t=this.parent.children.indexOf(this);this.triggerModify("remove"),this.parent.children.splice(t,1),this.visit((t=>{t.removeMarkup(),e._unregisterNode(t)}),!0),e.update(ChangeType.structure)}removeChildren(){const e=this.tree;this.children&&(e.activeNode&&e.activeNode.isDescendantOf(this)&&e.activeNode.setActive(!1),e.focusNode&&e.focusNode.isDescendantOf(this)&&(e.focusNode=null),this.triggerModifyChild("remove",null),this.visit((t=>{e._unregisterNode(t)})),this.lazy?this.children=[]:this.children=null,this.isRootNode()||(this.expanded=!1),this.tree.update(ChangeType.structure))}removeMarkup(){this._rowElem&&(delete this._rowElem._wb_node,this._rowElem.remove(),this._rowElem=void 0)}_getRenderInfo(){const e={},t={},i=this.isColspan(),s=this._rowElem?this._rowElem.querySelectorAll("span.wb-col"):null;let n=0;for(const r of this.tree.columns)e[r.id]={id:r.id,idx:n,elem:s?s[n]:null,info:r},i||"*"===r.id||(t[r.id]=e[r.id]),n++;return{allColInfosById:e,renderColInfosById:t}}_createIcon(e,t,i,s){let n,r=this.getOption("icon");if(this._errorInfo?r=e.error:this._isLoading&&s&&(r=e.loading),!1===r)return null;"string"==typeof r||(r=this.statusNodeType?e[this.statusNodeType]:this.expanded?e.folderOpen:this.children?e.folder:this.lazy?e.folderLazy:e.doc),r?r.indexOf("<")>=0?n=elemFromHtml(r):TEST_IMG.test(r)?n=elemFromHtml(``):(n=document.createElement("i"),n.className="wb-icon "+r):(n=document.createElement("i"),n.className="wb-icon"),i?t.replaceChild(n,i):t.appendChild(n);const o=this._callEvent("iconBadge",{iconSpan:n});let l=null;if(null!=o&&!1!==o){let e="",t="";isPlainObject(o)?(l=""+o.badge,e=o.badgeClass?" "+o.badgeClass:"",t=o.badgeTooltip?` title="${o.badgeTooltip}"`:""):l="number"==typeof o?""+o:o,"string"==typeof l&&(l=elemFromHtml(`${escapeHtml(l)} `)),l&&n.append(l)}return n}_render_markup(e){const t=this.tree,i=t.options,s=this.getOption("checkbox"),n=t.columns,r=this.getLevel(),o=t.isRowNav()?null:t.activeColIdx;let l,a=this._rowElem,d=null,c=null;const h=!a;assert(h,"Expected unrendered node"),assert(!h||e&&e.after,"opts.after expected, unless updating"),assert(!this.isRootNode(),"Root node not allowed"),a=document.createElement("div"),a.classList.add("wb-row"),a.style.top=22*this._rowIdx+"px",this._rowElem=a,a._wb_node=this;const u=document.createElement("span");u.classList.add("wb-node","wb-col"),a.appendChild(u);let p=0;s&&(d=document.createElement("i"),d.classList.add("wb-checkbox"),("radio"===s||this.parent.radiogroup)&&d.classList.add("wb-radio"),u.appendChild(d),p+=20);for(let e=r-1;e>0;e--)l=document.createElement("i"),l.classList.add("wb-indent"),u.appendChild(l),p+=20;(!i.minExpandLevel||r>i.minExpandLevel)&&(c=document.createElement("i"),c.classList.add("wb-expander"),u.appendChild(c),p+=20);this._createIcon(t.iconMap,u,null,!c)&&(p+=20);const f=document.createElement("span");f.classList.add("wb-title"),u.appendChild(f),u._ofsTitlePx=p,t.options.dnd.dragStart&&(u.draggable=!0);if(!this.isColspan()&&n.length>1){let e=0;for(const t of n){let i;e++,"*"===t.id?i=u:(i=document.createElement("span"),i.classList.add("wb-col"),a.appendChild(i)),e===o&&i.classList.add("wb-active"),t.classes&&i.classList.add(...t.classes.split(" ")),i.style.left=t._ofsPx+"px",i.style.width=t._widthPx+"px",h&&t.html&&"string"==typeof t.html&&(i.innerHTML=t.html)}}switch(e?e.after:"last"){case"first":t.nodeListElement.prepend(a);break;case"last":t.nodeListElement.appendChild(a);break;default:e.after.after(a)}e.isNew=!0,this._render_data(e)}_render_data(e){assert(this._rowElem,"No _rowElem");const t=this.tree,i=t.options,s=this._rowElem,n=!!e.isNew,r=!!e.preventScroll,o=t.columns,l=this.isColspan(),a=s.querySelector("span.wb-node"),d=a.querySelector("span.wb-title"),c=t.element.scrollTop;if(this.titleWithHighlight?d.innerHTML=this.titleWithHighlight:d.textContent=this.title,r&&(t.element.scrollTop=c),!i.skeleton)if(l){const e=t.element.clientWidth;d.style.width=e-a._ofsTitlePx-7+"px"}else d.style.width=o[0]._widthPx-a._ofsTitlePx-7+"px";if(e.isDataChange=!0,this._render_status(e),this.statusNodeType)this._callEvent("renderStatusNode",{isNew:n,nodeElem:a,isColspan:l});else if(this.parent){const e=this._getRenderInfo();this._callEvent("render",{isNew:n,nodeElem:a,isColspan:l,allColInfosById:e.allColInfosById,renderColInfosById:e.renderColInfosById})}}_render_status(e){const t=this.tree,i=t.iconMap,s=t.options,n=this.type?t.types[this.type]:null,r=this._rowElem,o=r.querySelector("span.wb-node"),l=o.querySelector("i.wb-expander"),a=o.querySelector("i.wb-checkbox"),d=["wb-row"];if(this.expanded&&d.push("wb-expanded"),this.lazy&&d.push("wb-lazy"),this.selected&&d.push("wb-selected"),this._partsel&&d.push("wb-partsel"),this===t.activeNode&&d.push("wb-active"),this===t.focusNode&&d.push("wb-focus"),this._errorInfo&&d.push("wb-error"),this._isLoading&&d.push("wb-loading"),this.isColspan()&&d.push("wb-colspan"),this.statusNodeType&&d.push("wb-status-"+this.statusNodeType),this.match&&d.push("wb-match"),this.subMatchCount&&d.push("wb-submatch"),s.skeleton&&d.push("wb-skeleton"),r.className=d.join(" "),this.classes&&r.classList.add(...this.classes),n&&n.classes&&r.classList.add(...n.classes),l){let e=null;this._isLoading?e=i.loading:this.isExpandable(!1)?e=this.expanded?i.expanderExpanded:i.expanderCollapsed:this.lazy&&null==this.children&&(e=i.expanderLazy),null==e?l.classList.add("wb-indent"):TEST_IMG.test(e)?l.style.backgroundImage=`url('${e}')`:l.className="wb-expander "+e}if(a){let e="wb-checkbox ";this.isRadio()?(e+="wb-radio ",this.selected?e+=i.radioChecked:e+=i.radioUnchecked):this.selected?e+=i.checkChecked:this._partsel?e+=i.checkUnknown:e+=i.checkUnchecked,a.className=e}if(!e.isNew){let e=0;for(const i of r.children)i.classList.toggle("wb-active",e++===t.activeColIdx),i.classList.remove("wb-error","wb-invalid");const i=o.querySelector("i.wb-icon");i&&this._createIcon(t.iconMap,o,i,!l)}if(!1!==e.resizeCols&&!this.isColspan()){const e=r.querySelectorAll("span.wb-col");let t=0,i=0;for(const s of this.tree.columns){const n=e[t];n.style.left=`${i}px`,n.style.width=`${s._widthPx}px`,t++,i+=s._widthPx}}}_render(e){const t=Object.assign({change:ChangeType.data},e);switch(this._rowElem||(t.change=ChangeType.row),t.change){case"status":this._render_status(t);break;case"data":this._render_data(t);break;case"row":this._render_markup(t);break;default:error(`Invalid change type '${t.change}'.`)}}resetLazy(){this.removeChildren(),this.expanded=!1,this.lazy=!0,this.children=null,this.tree.update(ChangeType.structure)}toDict(e=!1,t){const i={};if(NODE_DICT_PROPS.forEach((e=>{const t=this[e];t instanceof Set?t.size&&(i[e]=Array.prototype.join.call(t.keys()," ")):(t||!1===t||0===t)&&(i[e]=t)})),isEmptyObject(this.data)||(i.data=extend({},this.data),isEmptyObject(i.data)&&delete i.data),t){const s=t(i,this);if(!1===s)return!1;"skip"===s&&(e=!1)}if(e&&isArray(this.children)){i.children=[];for(let e=0,s=this.children.length;e=0&&([s,e]=e.split("."));const n=s[e];if("function"==typeof n){const e=n.call(i,{type:"resolve",tree:i,node:this});if(void 0!==e)return e}if(void 0!==this[e])return this[e];const r=this.type?i.types[this.type]:void 0,o=r?r[e]:void 0;return void 0!==o?o:null!=n?n:t}async scrollIntoView(e){const t=Object.assign({node:this},e);return this.tree.scrollTo(t)}async setActive(e=!0,t){const i=this.tree,s=i.activeNode,n=null==t?void 0:t.retrigger,r=null==t?void 0:t.focusTree,o=null==t?void 0:t.noEvents,l=null==t?void 0:t.event,a=null==t?void 0:t.colIdx,d=null==t?void 0:t.edit;if(assert(!a||i.isCellNav(),"colIdx requires cellNav"),assert(!d||null!=a,"edit requires colIdx"),!o)if(e){if(s!==this||n){if(!1===(null==s?void 0:s._callEvent("deactivate",{nextNode:this,event:l}))||!1===this._callEvent("beforeActivate",{prevNode:s,event:l}))return;i.activeNode=null,null==s||s.update(ChangeType.status)}}else(s===this||n)&&this._callEvent("deactivate",{nextNode:null,event:l});return s!==this&&(e&&(i.activeNode=this),null==s||s.update(ChangeType.status),this.update(ChangeType.status)),this.makeVisible().then((()=>{e&&((r||d)&&(i.setFocus(),i.focusNode=this,i.focusNode.setFocus()),null!=a&&i.isCellNav()&&i.setColumn(a,{edit:d}),o||this._callEvent("activate",{prevNode:s,event:l}))}))}async setExpanded(e=!0,t){const{force:i,scrollIntoView:s,immediate:n}=null!=t?t:{},r=!(null==t?void 0:t.noEvents);if(!e&&this.isExpanded()&&this.getLevel()<=this.tree.getOption("minExpandLevel")&&!i)return void this.logDebug("Ignored collapse request below expandLevel.");if(!e==!this.expanded)return;if(r&&!1===this._callEvent("beforeExpand",{flag:e}))return;e&&this.getOption("autoCollapse")&&this.collapseSiblings(t),e&&this.lazy&&null==this.children&&await this.loadLazy(),this.expanded=e;const o={immediate:n};if(this.tree.update(ChangeType.structure,o),e&&s){const e=this.getLastChild();e&&(this.tree.updatePendingModifications(),e.scrollIntoView({topNode:this}))}r&&this._callEvent("expand",{flag:e})}setFocus(e=!0){assert(!!e,"Blur is not yet implemented");const t=this.tree.focusNode;this.tree.focusNode=this,null==t||t.update(),this.update()}setIcon(e){this.icon=e,this.update()}setKey(e,t){throw new Error("Not yet implemented")}update(e=ChangeType.data){assert(e===ChangeType.status||e===ChangeType.data,`Invalid change type ${e}`),this.tree.update(e,this)}getSelectedNodes(e=!1){const t=[];return this.visit((i=>{if(i.selected&&(t.push(i),!0===e))return"skip"})),t}toggleSelected(e){let t=this.isSelected();return t=void 0!==t||this.isRadio()?!t:this._anySelectable(),this.setSelected(t,e)}_anySelectable(){let e=!1;return this.visit((t=>{if(!1===t.selected&&!t.unselectable&&!t.hasChildren()&&!t.parent.radiogroup)return e=!0,!1})),e}_changeSelectStatusProps(e){let t=!1;switch(e){case!1:t=this.selected||this._partsel,this.selected=!1,this._partsel=!1;break;case!0:t=!this.selected||!this._partsel,this.selected=!0,this._partsel=!0;break;case void 0:t=this.selected||!this._partsel,this.selected=!1,this._partsel=!0;break;default:error(`Invalid state: ${e}`)}return t&&this.update(),t}fixSelection3AfterClick(e){const t=!!(null==e?void 0:e.force),i=this.isSelected();this.visit((e=>{if(e.radiogroup)return"skip";!t&&e.getOption("unselectable")||e._changeSelectStatusProps(i)})),this.fixSelection3FromEndNodes()}fixSelection3FromEndNodes(e){const t=!!(null==e?void 0:e.force);assert("hier"===this.tree.options.selectMode,"expected selectMode 'hier'");const i=e=>{let s;const n=e.children;if(n&&n.length){let e=!0,t=!1;for(let s=0,r=n.length;s{let t;const i=e.children;let s=!0,n=!1;for(let e=0,r=i.length;e{this.visit((t=>{t.setSelected(e)}))})),n):(e===n||s&&!1===this._callEvent("beforeSelect",{flag:e})||(i.runWithDeferredUpdate((()=>{if(r){if(!e&&!(null==t?void 0:t.force))return n;for(const e of this.parent.children)e.selected=e===this}else this.selected=e,"hier"===o?this.fixSelection3AfterClick():"single"===o&&i.visit((e=>{e.selected=!1}))})),s&&this._callEvent("select",{flag:e})),n):n}setStatus(e,t){const i=this.tree,s=null==t?void 0:t.message,n=null==t?void 0:t.details;let r=null;const o=e=>{const t=this.children,s=t?t[0]:null;return assert(e.statusNodeType,"Not a status node"),assert(!s||!s.isStatusNode(),"Child must not be a status node"),r=this.addNode(e,"prependChild"),r.match=!0,i.update(ChangeType.structure),r};switch((()=>{const e=this.children;e&&e.length&&e[0].isStatusNode()&&e[0].remove()})(),e){case"ok":this._isLoading=!1,this._errorInfo=null;break;case"loading":this._isLoading=!0,this._errorInfo=null,this.parent?this.update(ChangeType.status):o({statusNodeType:e,title:i.options.strings.loading+(s?" ("+s+")":""),checkbox:!1,colspan:!0,tooltip:n});break;case"error":o({statusNodeType:e,title:i.options.strings.loadError+(s?" ("+s+")":""),checkbox:!1,colspan:!0,tooltip:n}),this._isLoading=!1,this._errorInfo={message:s,details:n};break;case"noData":o({statusNodeType:e,title:s||i.options.strings.noData,checkbox:!1,colspan:!0,tooltip:n}),this._isLoading=!1,this._errorInfo=null;break;default:error("invalid node status "+e)}return i.update(ChangeType.structure),r}setTitle(e){this.title=e,this.update()}_sortChildren(e,t){const i=this.children;if(i&&(i.sort(e),t))for(let s=0,n=i.length;s{t.logError(`Error in ${e} event promise`,i),s.classList.add("wb-error")})).finally((()=>{s.classList.remove("wb-busy")})),n}_onChange(e){const t=Wunderbaum.getEventInfo(e),s=t.node,i=t.colElem;s&&0!==t.colIdx?this._applyChange("change",s,i,{info:t,event:e,inputElem:e.target,inputValue:Wunderbaum.util.getValueFromElem(e.target)}):this.tree.log("Ignored change event for removed element or node title")}init(){super.init(),onEvent(this.tree.element,"change",".contenteditable,input,textarea,select",(e=>this._onChange(e)))}_preprocessKeyEvent(e){const t=e.event,s=eventToString(t),i=this.tree,n=this.getPluginOption("trigger");if(this.isEditingTitle()){switch(s){case"Enter":return this._stopEditTitle(!0,{event:t}),!1;case"Escape":return this._stopEditTitle(!1,{event:t}),!1}return!1}if(i.isRowNav()||0===i.activeColIdx){switch(s){case"Enter":if(n.indexOf("macEnter")>=0&&isMac)return this.startEditTitle(),!1;break;case"F2":if(n.indexOf("F2")>=0)return this.startEditTitle(),!1}return!0}return!0}isEditingTitle(e){return e?this.curEditNode===e:!!this.curEditNode}startEditTitle(e){e=null!=e?e:this.tree.getActiveNode();const t=this.getPluginOption("validity"),s=this.getPluginOption("select");if(!e)return;this.tree.logDebug(`startEditTitle(node=${e})`);let i=e._callEvent("edit.beforeEdit");if(!1===i)return void e.logInfo("beforeEdit canceled operation.");if(!0===i||!i){i=` `}const n=e.getColElem(0).querySelector(".wb-title");n.innerHTML=i;const r=n.firstElementChild;t&&r.addEventListener("keydown",(e=>{r.setCustomValidity(""),r.reportValidity()})),r.focus(),s&&r.select(),this.curEditNode=e,e._callEvent("edit.edit",{inputElem:r})}stopEditTitle(e){return this._stopEditTitle(e,{})}_stopEditTitle(e,t){null!=t||(t={});const s=document.activeElement;let i=s?getValueFromElem(s):null;const n=this.curEditNode,r=!!t.forceClose,o=this.getPluginOption("validity");if(i&&this.getPluginOption("trim")&&(i=i.trim()),n)if(n.logDebug(`stopEditTitle(${e})`,t,s,i),e&&null!==i&&i!==n.title){const e=s.validationMessage;if(e)throw new Error(`Input validation failed for "${i}": ${e}.`);const t=n.getColElem(0);this._applyChange("edit.apply",n,t,{oldValue:n.title,newValue:i,inputElem:s}).then((e=>{const t=s.validationMessage;if(o&&t&&!1!==e)throw new Error(`Edit apply validation failed for "${i}": ${t}.`);(r||!1!==e)&&(null==n||n.setTitle(i),this.curEditNode._render({preventScroll:!0}),this.curEditNode=null,this.relatedNode=null,this.tree.setFocus())})).catch((e=>{n.logError(e)}))}else this.curEditNode._render({preventScroll:!0}),this.curEditNode=null,this.relatedNode=null,this.tree.setFocus();else this.tree.logDebug("stopEditTitle: not in edit mode.")}createNode(e="after",t,s){const i=this.tree;if(assert(t=null!=t?t:i.getActiveNode(),"No node was passed, or no node is currently active."),e=e||"prependChild",null==s?s={title:""}:"string"==typeof s?s={title:s}:assert(isPlainObject(s),`Expected a plain object: ${s}`),("prependChild"===e||"appendChild"===e)&&(null==t?void 0:t.isExpandable(!0)))return void t.setExpanded().then((()=>{this.createNode(e,t,s)}));const n=t.addNode(s,e);n.setClass("wb-edit-new"),this.relatedNode=t,n.match=!0,n.makeVisible({noAnimation:!0}).then((()=>{this.startEditTitle(n)}))}}
+class EditExtension extends WunderbaumExtension{constructor(e){super(e,"edit",{debounce:100,minlength:1,maxlength:null,trigger:[],trim:!0,select:!0,slowClickDelay:1e3,validity:!0,beforeEdit:null,edit:null,apply:null}),this.curEditNode=null,this.relatedNode=null,this.debouncedOnChange=debounce(this._onChange.bind(this),this.getPluginOption("debounce"))}async _applyChange(e,t,i,s,n){return t.log(`_applyChange(${e})`,n),i.classList.add("wb-busy"),i.classList.remove("wb-error","wb-invalid"),s.setCustomValidity(""),new Promise(((i,s)=>{const r=t._callEvent(e,n);Promise.resolve(r).then((e=>{i(e)})).catch((e=>{s(e)}))})).then((e=>{if(!s.checkValidity())throw t.logWarn("inputElem.checkValidity() failed: throwing...."),new ValidationError(s.validationMessage);return e})).catch((n=>{if(!(n instanceof ValidationError))throw t.logError(`Error in ${e} event handler (throw e.util.ValidationError instead if this was intended)`,n),i.classList.add("wb-error"),n;t.logWarn("catched ",n),i.classList.add("wb-invalid"),s.setCustomValidity&&!s.validationMessage&&s.setCustomValidity(n.message),s.validationMessage&&s.reportValidity()})).finally((()=>{i.classList.remove("wb-busy")}))}_onChange(e){const t=Wunderbaum.getEventInfo(e),i=t.node,s=t.colElem;i&&0!==t.colIdx?this._applyChange("change",i,s,e.target,{info:t,event:e,inputElem:e.target,inputValue:Wunderbaum.util.getValueFromElem(e.target),inputValid:e.target.checkValidity()}):this.tree.log("Ignored change event for removed element or node title")}init(){super.init(),onEvent(this.tree.element,"change",".contenteditable,input,textarea,select",(e=>this._onChange(e)))}_preprocessKeyEvent(e){const t=e.event,i=eventToString(t),s=this.tree,n=this.getPluginOption("trigger");if(this.isEditingTitle()){switch(i){case"Enter":return this._stopEditTitle(!0,{event:t}),!1;case"Escape":return this._stopEditTitle(!1,{event:t}),!1}return!1}if(s.isRowNav()||0===s.activeColIdx){switch(i){case"Enter":if(n.indexOf("macEnter")>=0&&isMac)return this.startEditTitle(),!1;break;case"F2":if(n.indexOf("F2")>=0)return this.startEditTitle(),!1}return!0}return!0}isEditingTitle(e){return e?this.curEditNode===e:!!this.curEditNode}startEditTitle(e){e=null!=e?e:this.tree.getActiveNode();const t=this.getPluginOption("validity"),i=this.getPluginOption("select");if(!e)return;this.tree.logDebug(`startEditTitle(node=${e})`);let s=e._callEvent("edit.beforeEdit");if(!1===s)return void e.logDebug("beforeEdit canceled operation.");if(!0===s||!s){const t=escapeHtml(e.title);let i=this.getPluginOption("maxlength");const n=i?` maxlength="${i}"`:"";i=this.getPluginOption("minlength");s=` 0?" required":""}${i?` minlength="${i}"`:""}${n} >`}const n=e.getColElem(0).querySelector(".wb-title");n.innerHTML=s;const r=n.firstElementChild;t&&r.addEventListener("keydown",(t=>{r.setCustomValidity(""),r.reportValidity()||e.logWarn(`Invalid input: '${r.value}'`)})),r.focus(),i&&r.select(),this.curEditNode=e,e._callEvent("edit.edit",{inputElem:r})}stopEditTitle(e){return this._stopEditTitle(e,{})}_stopEditTitle(e,t){null!=t||(t={});const i=document.activeElement;let s=i?getValueFromElem(i):null;const n=this.curEditNode,r=!!t.forceClose,o=this.getPluginOption("validity");if(s&&this.getPluginOption("trim")&&(s=s.trim()),n)if(n.logDebug(`stopEditTitle(${e})`,t,i,s),e&&null!==s&&s!==n.title){const e=i.validationMessage;if(e)throw new Error(`Input validation failed for "${s}": ${e}.`);const t=n.getColElem(0);this._applyChange("edit.apply",n,t,i,{oldValue:n.title,newValue:s,inputElem:i,inputValid:i.checkValidity()}).then((e=>{const t=i.validationMessage;if(o&&t&&!1!==e)throw new Error(`Edit apply validation failed for "${s}": ${t}.`);(r||!1!==e)&&(null==n||n.setTitle(s),this.curEditNode._render({preventScroll:!0}),this.curEditNode=null,this.relatedNode=null,this.tree.setFocus())}))}else this.curEditNode._render({preventScroll:!0}),this.curEditNode=null,this.relatedNode=null,this.tree.setFocus();else this.tree.logDebug("stopEditTitle: not in edit mode.")}createNode(e="after",t,i){const s=this.tree;if(assert(t=null!=t?t:s.getActiveNode(),"No node was passed, or no node is currently active."),e=e||"prependChild",null==i?i={title:""}:"string"==typeof i?i={title:i}:assert(isPlainObject(i),`Expected a plain object: ${i}`),("prependChild"===e||"appendChild"===e)&&(null==t?void 0:t.isExpandable(!0)))return void t.setExpanded().then((()=>{this.createNode(e,t,i)}));const n=t.addNode(i,e);n.setClass("wb-edit-new"),this.relatedNode=t,n.match=!0,n.makeVisible({noAnimation:!0}).then((()=>{this.startEditTitle(n)}))}}
/*!
* wunderbaum.ts
*
@@ -80,7 +80,7 @@ class EditExtension extends WunderbaumExtension{constructor(e){super(e,"edit",{d
* https://github.com/mar10/wunderbaum
*
* Released under the MIT license.
- * @version v0.7.0
- * @date Sat, 09 Dec 2023 13:47:27 GMT
- */class WbSystemRoot extends WunderbaumNode{constructor(e){super(e,null,{key:"__root__",title:e.id})}toString(){return`WbSystemRoot@${this.key}<'${this.tree.id}'>`}}class Wunderbaum{constructor(e){this.enabled=!0,this.data={},this.extensionList=[],this.extensions={},this.keyMap=new Map,this.refKeyMap=new Map,this.treeRowCount=0,this._disableUpdateCount=0,this._disableUpdateIgnoreCount=0,this.activeNode=null,this.focusNode=null,this.types={},this.columns=[],this._columnsById={},this.pendingChangeTypes=new Set,this._util=util,this.filterMode=null,this.activeColIdx=0,this._cellNavMode=!1,this.lastQuicksearchTime=0,this.lastQuicksearchTerm="",this.lastClickTime=0,this.log=this.logDebug;const t=this.options=extend({id:null,source:null,element:null,debugLevel:3,header:null,rowHeightPx:22,iconMap:"bootstrap",columns:null,types:null,enabled:!0,fixedCol:!1,showSpinner:!1,checkbox:!1,minExpandLevel:0,emptyChildListExpandable:!1,skeleton:!1,connectTopBreadcrumb:null,selectMode:"multi",navigationModeOption:null,quicksearch:!0,iconBadge:null,change:null,error:null,receive:null,strings:{loadError:"Error",loading:"Loading...",noData:"No data"}},e),s=new Deferred;this.ready=s.promise();let i=!1;if(this.ready.then((()=>{i=!0;try{this._callEvent("init")}catch(e){this.logError("Exception inside `init(e)` event:",e)}})).catch((e=>{if(i)throw e;this._callEvent("init",{error:e})})),this.id=t.id||"wb_"+ ++Wunderbaum.sequence,this.root=new WbSystemRoot(this),this._registerExtension(new KeynavExtension(this)),this._registerExtension(new EditExtension(this)),this._registerExtension(new FilterExtension(this)),this._registerExtension(new DndExtension(this)),this._registerExtension(new GridExtension(this)),this._registerExtension(new LoggerExtension(this)),this._updateViewportThrottled=adaptiveThrottle(this._updateViewportImmediately.bind(this),{}),this.columns=t.columns,delete t.columns,!this.columns||!this.columns.length){const e="string"==typeof t.header?t.header:this.id;this.columns=[{id:"*",title:e,width:"*"}]}t.types&&this.setTypes(t.types,!0),delete t.types,this.element=elemFromSelector(t.element),assert(!!this.element,`Invalid 'element' option: ${t.element}`),this.element.classList.add("wunderbaum"),this.element.getAttribute("tabindex")||(this.element.tabIndex=0),this.element._wb_tree=this,this.headerElement=this.element.querySelector("div.wb-header");const n=null==t.header?this.columns.length>1:!!t.header;if(this.headerElement){assert(!this.columns,"`opts.columns` must not be set if markup already contains a header"),this.columns=[];const e=this.headerElement.querySelector("div.wb-row");for(const t of e.querySelectorAll("div"))this.columns.push({id:t.dataset.id||`col_${this.columns.length}`,title:""+t.textContent,width:"*"})}else{const e=" ".repeat(this.columns.length);if(this.element.innerHTML=`\n `,!n){this.element.querySelector("div.wb-header").style.display="none"}}this.element.innerHTML+='\n ',this.listContainerElement=this.element.querySelector("div.wb-list-container"),this.nodeListElement=this.listContainerElement.querySelector("div.wb-node-list"),this.headerElement=this.element.querySelector("div.wb-header"),this.element.classList.toggle("wb-grid",this.columns.length>1),this._initExtensions(),["enabled","fixedCol"].forEach((e=>{null!=t[e]&&this.setOption(e,t[e])})),t.source?(t.showSpinner&&(this.nodeListElement.innerHTML="loading... "),this.load(t.source).then((()=>{null==t.navigationModeOption?this.isGrid()?this.setNavigationOption(NavModeEnum.cell):this.setNavigationOption(NavModeEnum.row):this.setNavigationOption(t.navigationModeOption),s.resolve()})).catch((e=>{s.reject(e)})).finally((()=>{var e;null===(e=this.element.querySelector("progress.spinner"))||void 0===e||e.remove(),this.element.classList.remove("wb-initializing")}))):s.resolve(),this.update(ChangeType.any),this.element.addEventListener("scroll",(e=>{this.update(ChangeType.scroll)})),this.resizeObserver=new ResizeObserver((e=>{this.update(ChangeType.resize)})),this.resizeObserver.observe(this.element),onEvent(this.nodeListElement,"click","div.wb-row",(t=>{const s=Wunderbaum.getEventInfo(t),i=s.node,n=t;if(!1===this._callEvent("click",{event:t,node:i,info:s}))return this.lastClickTime=Date.now(),!1;if(i){if(n.ctrlKey)return void i.toggleSelected();const r=this.getOption("edit.trigger"),o=this.getOption("edit.slowClickDelay");r.indexOf("clickActive")>=0&&"title"===s.region&&i.isActive()&&(!o||Date.now()-this.lastClickTime=0?i.setActive(!0,{colIdx:s.colIdx,event:t}):i.setActive(!0,{event:t}),s.region===NodeRegion.expander?i.setExpanded(!i.isExpanded(),{scrollIntoView:!1!==e.scrollIntoViewOnExpandClick}):s.region===NodeRegion.checkbox&&i.toggleSelected()}this.lastClickTime=Date.now()})),onEvent(this.nodeListElement,"dblclick","div.wb-row",(e=>{const t=Wunderbaum.getEventInfo(e),s=t.node;if(!1===this._callEvent("dblclick",{event:e,node:s,info:t}))return!1;s&&0===t.colIdx&&s.isExpandable()&&(this._callMethod("edit._stopEditTitle"),s.setExpanded(!s.isExpanded()))})),onEvent(this.element,"keydown",(e=>{const t=Wunderbaum.getEventInfo(e),s=eventToString(e),i=t.node||this.getFocusNode();this._callHook("onKeyEvent",{event:e,node:i,info:t,eventName:s})})),onEvent(this.element,"focusin focusout",(e=>{const s="focusin"===e.type,i=Wunderbaum.getNode(e);this._callEvent("focus",{flag:s,event:e}),s&&this.isRowNav()&&!this.isEditing()&&(t.navigationModeOption===NavModeEnum.row?null==i||i.setActive():this.setCellNav()),s||this._callMethod("edit._stopEditTitle",!0,{event:e,forceClose:!0})}))}static getTree(e){if(e instanceof Wunderbaum)return e;if(e instanceof WunderbaumNode)return e.tree;if(void 0===e&&(e=0),"number"==typeof e)e=document.querySelectorAll(".wunderbaum")[e];else if("string"==typeof e){for(const t of document.querySelectorAll(".wunderbaum")){const s=t._wb_tree;if(s&&s.id===e)return s}if(!(e=document.querySelector(e)))return null}else e.target&&(e=e.target);return assert(e instanceof Element,`Invalid el type: ${e}`),e.matches(".wunderbaum")||(e=e.closest(".wunderbaum")),e&&e._wb_tree?e._wb_tree:null}get iconMap(){const e=this.options.iconMap;return"string"==typeof e?iconMaps[e]:e}static getNode(e){if(!e)return null;if(e instanceof WunderbaumNode)return e;for(void 0!==e.target&&(e=e.target);e;){if(e._wb_node)return e._wb_node;e=e.parentElement}return null}*[Symbol.iterator](){yield*this.root}_registerExtension(e){this.extensionList.push(e),this.extensions[e.id]=e}_initExtensions(){for(const e of this.extensionList)e.init()}_registerNode(e){const t=e.key;assert(null!=t&&!this.keyMap.has(t),`Missing or duplicate key: '${t}'.`),this.keyMap.set(t,e);const s=e.refKey;if(s){const t=this.refKeyMap.get(s);t?t.add(e):this.refKeyMap.set(s,new Set)}}_unregisterNode(e){const t=e.refKey;if(t){const s=this.refKeyMap.get(t);s&&s.delete(e)&&!s.size&&this.refKeyMap.delete(t)}e.tree=null,e.parent=null,e.removeMarkup()}_callHook(e,t={}){let s;const i=extend({},{tree:this,options:this.options,result:void 0},t);for(const t of this.extensionList){if(s=t[e].call(t,i),!1===s)break;void 0!==i.result&&(s=i.result)}return s}_callMethod(e,...t){const[s,i]=e.split("."),n=i?this.extensions[s]:this,r=n[i];if(r)return r.apply(n,t);this.logError(`Calling undefined method '${e}()'.`)}_callEvent(e,t){const[s,i]=e.split("."),n=this.options,r=i?n[s][i]:n[s];if(r)return r.call(this,extend({type:e,tree:this,util:this._util},t))}_getNodeByRowIdx(e){let t=null;return this.visitRows((s=>{if(s._rowIdx===e)return t=s,!1})),t}getTopmostVpNode(e=!0){const t=this.element.scrollTop;let s;return s=e?Math.ceil((t-1)/22):Math.floor(t/22),this._getNodeByRowIdx(s)}getLowestVpNode(e=!0){const t=this.element,s=this.headerElement.clientHeight,i=t.scrollTop,n=t.clientHeight-s;let r;return r=e?Math.floor((i+n)/22)-1:Math.ceil((i+n)/22)-1,r=Math.min(r,this.count(!0)-1),this._getNodeByRowIdx(r)}_getPrevNodeInView(e,t=1){return this.visitRows((s=>{if(e=s,t--<=0)return!1}),{reverse:!0,start:e||this.getActiveNode()}),e}_getNextNodeInView(e,t=1){return this.visitRows((s=>{if(e=s,t--<=0)return!1}),{reverse:!1,start:e||this.getActiveNode()}),e}addChildren(e,t){return this.root.addChildren(e,t)}applyCommand(e,t,s){let i,n;switch(t instanceof WunderbaumNode?i=t:(i=this.getActiveNode(),assert(void 0===s,`Unexpected options: ${s}`),s=t),e){case"moveUp":n=i.getPrevSibling(),n&&(i.moveTo(n,"before"),i.setActive());break;case"moveDown":n=i.getNextSibling(),n&&(i.moveTo(n,"after"),i.setActive());break;case"indent":n=i.getPrevSibling(),n&&(i.moveTo(n,"appendChild"),n.setExpanded(),i.setActive());break;case"outdent":i.isTopLevel()||(i.moveTo(i.getParent(),"after"),i.setActive());break;case"remove":n=i.getPrevSibling()||i.getParent(),i.remove(),n&&n.setActive();break;case"addChild":this._callMethod("edit.createNode","prependChild");break;case"addSibling":this._callMethod("edit.createNode","after");break;case"rename":this._callMethod("edit.startEditTitle");break;case"down":case"first":case"last":case"left":case"pageDown":case"pageUp":case"parent":case"right":case"up":return i.navigate(e);default:error(`Unhandled command: '${e}'`)}}clear(){this.root.removeChildren(),this.root.children=null,this.keyMap.clear(),this.refKeyMap.clear(),this.treeRowCount=0,this.activeNode=null,this.focusNode=null,this.update(ChangeType.structure)}destroy(){this.logInfo("destroy()..."),this.clear(),this.resizeObserver.disconnect(),this.element.innerHTML="",this.element.outerHTML=this.element.outerHTML}getOption(e,t){let s,i=this.options;e.indexOf(".")>=0&&([s,e]=e.split("."),i=i[s]);let n=i[e];return"function"==typeof n&&(n=n({type:"resolve",tree:this})),null!=n?n:t}setOption(e,t){if(e.indexOf(".")>=0){const s=e.split(".");this.extensions[s[0]].setPluginOption(s[1],t)}else switch(this.options[e]=t,e){case"checkbox":this.update(ChangeType.any);break;case"enabled":this.setEnabled(!!t);break;case"fixedCol":this.element.classList.toggle("wb-fixed-col",!!t)}}hasFocus(){return this.element.contains(document.activeElement)}hasHeader(){const e=this.options.header;return this.isGrid()?!1!==e:!!e}runWithDeferredUpdate(e,t=null){try{this.enableUpdate(!1);const t=e();return assert(!(t instanceof Promise),`Promise return not allowed: ${t}`),t}finally{this.enableUpdate(!0)}}async expandAll(e=!0,t){await this.root.expandAll(e,t)}selectAll(e=!0){return this.root.setSelected(e,{propagateDown:!0})}toggleSelect(){this.selectAll(this.root._anySelectable())}getSelectedNodes(e=!1){return this.root.getSelectedNodes(e)}_selectRange(e){this.logDebug("_selectRange",e),error("Not yet implemented.")}count(e=!1){return e?this.treeRowCount:this.keyMap.size}_check(){let e=0;this.visit((t=>{e++})),this.keyMap.size!==e&&this.logWarn(`_check failed: ${this.keyMap.size} !== ${e}`)}findAll(e){return this.root.findAll(e)}findFirst(e){return this.root.findFirst(e)}findKey(e){return this.keyMap.get(e)||null}findNextNode(e,t){let s=null;const i=this.getFirstChild(),n="string"==typeof e?makeNodeTitleStartMatcher(e):e;function r(e){if(n(e)&&(s=e),s||e===t)return!1}return t=t||i,this.visitRows(r,{start:t,includeSelf:!1}),s||t===i||this.visitRows(r,{start:i,includeSelf:!0}),s}findRelatedNode(e,t,s=!1){let i=null;const n=Math.floor(this.listContainerElement.clientHeight/22);switch(t){case"parent":case"left":e.parent&&e.parent.parent&&(i=e.parent);break;case"first":this.visit((e=>{if(e.isVisible())return i=e,!1}));break;case"last":this.visit((e=>{e.isVisible()&&(i=e)}));break;case"right":e.children&&e.children.length&&(i=e.children[0]);break;case"up":i=this._getPrevNodeInView(e);break;case"down":i=this._getNextNodeInView(e);break;case"pageDown":{const t=this.getLowestVpNode();i=e._rowIdxt._rowIdx?t:this._getPrevNodeInView(e,n)}break;default:this.logWarn("Unknown relation '"+t+"'.")}return i}*format_iter(e,t){yield*this.root.format_iter(e,t)}format(e,t){return this.root.format(e,t)}getActiveColElem(){return this.activeNode&&this.activeColIdx>=0?this.activeNode.getColElem(this.activeColIdx):null}getActiveNode(){return this.activeNode}getFirstChild(){return this.root.getFirstChild()}getFocusNode(){return this.focusNode}static getEventInfo(e){const t=e.target,s=t.classList,i=t.closest("span.wb-col"),n=Wunderbaum.getNode(t),r=n?n.tree:Wunderbaum.getTree(e),o={event:e,canonicalName:eventToString(e),tree:r,node:n,region:NodeRegion.unknown,colDef:void 0,colIdx:-1,colId:void 0,colElem:i};if(s.contains("wb-title"))o.region=NodeRegion.title;else if(s.contains("wb-expander"))o.region=n.isExpandable()?NodeRegion.expander:NodeRegion.prefix;else if(s.contains("wb-checkbox"))o.region=NodeRegion.checkbox;else if(s.contains("wb-icon"))o.region=NodeRegion.icon;else if(s.contains("wb-node"))o.region=NodeRegion.title;else if(i){o.region=NodeRegion.column;const e=Array.prototype.indexOf.call(i.parentNode.children,i);o.colIdx=e}else{if(!s.contains("wb-row"))return"mousemove"===e.type||e instanceof KeyboardEvent||null==r||r.logWarn("getEventInfo(): not found",e,o),o;o.region=NodeRegion.title}return-1===o.colIdx&&(o.colIdx=0),o.colDef=null==r?void 0:r.columns[o.colIdx],null!=o.colDef&&(o.colId=o.colDef.id),o}toString(){return`Wunderbaum<'${this.id}'>`}isEditing(){return this._callMethod("edit.isEditingTitle")}isLoading(){let e=!1;return this.root.visit((t=>{if(t._isLoading||t._requestId)return e=!0,!1}),!0),e}logDebug(...e){this.options.debugLevel>=4&&console.log(this.toString(),...e)}logError(...e){this.options.debugLevel>=1&&console.error(this.toString(),...e)}logInfo(...e){this.options.debugLevel>=3&&console.info(this.toString(),...e)}logTime(e){return this.options.debugLevel>=4&&console.time(this+": "+e),e}logTimeEnd(e){this.options.debugLevel>=4&&console.timeEnd(this+": "+e)}logWarn(...e){this.options.debugLevel>=2&&console.warn(this.toString(),...e)}scrollTo(e){let t,s;e instanceof WunderbaumNode?t=e:(s=e,t=s.node),assert(t&&null!=t._rowIdx,`Invalid node: ${t}`);const i=this.element,n=this.headerElement.clientHeight,r=i.scrollTop,o=i.clientHeight,l=22*t._rowIdx+n,a=n,d=l-r,c=d+22,h=null==s?void 0:s.topNode;let u=null;d>=a?c<=o||(u=l+22-o+2):u=l-a-2,null!=u&&(this.log(`scrollTo(${l}): ${r} => ${u}`),i.scrollTop=u,h&&this.scrollTo(h))}scrollToHorz(){const e=this.columns[0]._widthPx,t=this.element.clientWidth,s=this.element.scrollLeft,i=this.getActiveColElem(),n=Number.parseInt(null==i?void 0:i.style.left,10),r=n+Number.parseInt(null==i?void 0:i.style.width,10);let o=s;n-st&&(o=r-t),o=Math.max(0,o),this.log(`scrollToHorz(${this.activeColIdx}): ${n}..${r}, fixedOfs=${e}, vpWidth=${t}, curLeft=${s} -> ${o}`),this.element.scrollLeft=o}setColumn(e){var t;if(assert(this.isCellNav(),"Exected cellNav mode"),assert(0<=e&&e0&&(i?this._updateViewportImmediately():this._updateViewportThrottled())}setEnabled(e=!0){const t=this.enabled;return this.enabled=!!e,this.element.classList.toggle("wb-disabled",!e),t}isEnabled(){return this.enabled}isGrid(){return this.columns&&this.columns.length>1}isCellNav(){return!!this._cellNavMode}isRowNav(){return!this._cellNavMode}setCellNav(e=!0){var t;const s=this._cellNavMode;this._cellNavMode=!!e,e&&!s&&this.setColumn(0),this.element.classList.toggle("wb-cell-mode",e),null===(t=this.activeNode)||void 0===t||t.update(ChangeType.status)}setNavigationOption(e,t=!1){if(this.isGrid()||e===NavModeEnum.row)switch(this.options.navigationModeOption=e,e){case NavModeEnum.cell:this.setCellNav(!0);break;case NavModeEnum.row:this.setCellNav(!1);break;case NavModeEnum.startCell:t&&this.setCellNav(!0);break;case NavModeEnum.startRow:t&&this.setCellNav(!1);break;default:error(`Invalid mode '${e}'.`)}else this.logWarn("Plain trees only support row navigation mode.")}setStatus(e,t){return this.root.setStatus(e,t)}setTypes(e,t=!0){assert(isPlainObject(e),`Expected plain objext: ${e}`),t?this.types=e:extend(this.types,e);for(const e of Object.values(this.types))e.classes&&(e.classes=toSet(e.classes))}sortChildren(e=nodeTitleSorter,t=!1){this.root.sortChildren(e,t)}toDictArray(e){var t;return null!==(t=this.root.toDict(!0,e).children)&&void 0!==t?t:[]}_updateColumnWidths(){const e=this.element.clientWidth,t=this.columns,s=t[0];let i=0,n=0,r=0,o=!1;if("*"!==s.id)throw new Error(`First column must have id '*': got '${s.id}'.`);this._columnsById={};for(const e of t){this._columnsById[e.id]=e;const t=e.width;if("*"===e.id&&e!==s)throw new Error(`Column id '*' must be defined only once: '${e.title}'.`);if(t&&"*"!==t)if("number"==typeof t)e._weight=t,n+=t;else if("string"==typeof t&&t.endsWith("px")){e._weight=0;const s=parseFloat(t.slice(0,-2));e._widthPx!=s&&(o=!0,e._widthPx=s),r+=s}else error(`Invalid column width: ${t} (expected string ending with 'px' or number, e.g. "px" or ).`);else e._weight=1,n+=1}const l=Math.max(0,e-r);let a=0;for(const e of t){let t;if(e._weight){const s=e.minWidth;t="number"==typeof s?s:"string"==typeof s&&s.endsWith("px")?parseFloat(s.slice(0,-2)):4;const i=Math.max(t,l*e._weight/n);e._widthPx!=i&&(o=!0,e._widthPx=i)}e._ofsPx=a,a+=e._widthPx}t[t.length-1]._widthPx-=1,i=a-1;const d=`${i}px`;return this.headerElement.style.width=d,this.listContainerElement.style.width=d,o}_renderHeaderMarkup(){assert(this.headerElement,"Expected a headerElement");const e=this.hasHeader();if(setElemDisplay(this.headerElement,e),!e)return;const t=this.columns.length,s=this.headerElement.querySelector(".wb-row");assert(s,"Expected a row in header element"),s.innerHTML=" ".repeat(t);for(let e=0;e '),n.innerHTML=`${r} ${l}`,this.isCellNav()&&n.classList.toggle("wb-active",e===this.activeColIdx)}}updatePendingModifications(){this.pendingChangeTypes.size>0&&this._updateViewportImmediately()}_updateViewportImmediately(){var e;if(this._disableUpdateCount)return this.log(`_updateViewportImmediately() IGNORED (disable level: ${this._disableUpdateCount})`),void this._disableUpdateIgnoreCount++;const t=RenderFlag,s=new Set(this.pendingChangeTypes);this.pendingChangeTypes.clear();if(s.has(t.scroll)&&1===s.size)this._updateRows({newNodesOnly:!0});else{if(this.log("_updateViewportImmediately():",s),!1!==this.options.adjustHeight){let e=this.listContainerElement.clientHeight;const t=this.headerElement.clientHeight,s=this.element.clientHeight-t-1;Math.abs(e-s)>1&&(this.listContainerElement.style.height=s+"px",e=s)}s.has(t.clearMarkup)&&this.visit((e=>{e.removeMarkup()})),s.has(t.header)&&(this._updateColumnWidths(),this._renderHeaderMarkup()),this._updateRows()}if(this.options.connectTopBreadcrumb){let t=null===(e=this.getTopmostVpNode(!0))||void 0===e?void 0:e.getPath(!1,"title"," > ");t=t?t+" >":"",this.options.connectTopBreadcrumb.textContent=t}this._callEvent("update")}_updateRows(e){const t=!!(e=Object.assign({newNodesOnly:!1},e)).newNodesOnly,s=this.element.clientHeight,i=this.element.scrollTop;let n=Math.max(0,i/22-5);n=Math.floor(n),n%2&&n--;let r=Math.max(0,(i+s)/22+5);r=Math.ceil(r);const o=new Set;this.nodeListElement.childNodes.forEach((e=>{const t=e;o.add(t._wb_node)}));let l=0,a=0,d=!1,c="first";this.visitRows((function(e){const s=e._rowElem;e._rowIdx!==l&&(e._rowIdx=l,d=!0),lr?s&&(c=s):s&&t?(o.delete(e),s.style.top=22*l+"px",c=s):(o.delete(e),s&&(s.style.top=22*l+"px"),e._render({top:a,after:c}),c=e._rowElem),l++,a+=22})),this.treeRowCount=l;for(const e of o)e._callEvent("discard"),e.removeMarkup();return this.nodeListElement.style.height=`${a}px`,d}visit(e){return this.root.visit(e,!1)}visitRows(e,t){if(!this.root.hasChildren())return!1;if(t&&t.reverse)return delete t.reverse,this._visitRowsUp(e,t);let s,i,n,r,o,l,a=0,d=!1===(t=t||{}).includeSelf,c=t.start||this.root.children[0];const h=!!t.includeHidden,u=!h&&"hide"===this.filterMode;for(n=c.parent;n;){for(o=n.children,i=o.indexOf(c)+a,assert(i>=0,`Could not find ${c} in parent's children: ${n}`),s=i;st!==l&&(!u||t.match||t.subMatchCount?!1!==e(t)&&(h||!t.children||t.expanded?void 0:"skip"):"skip")),!1),!1===r))return!1}}c=n,n=n.parent,a=1,!n&&t.wrap&&(this.logDebug("visitRows(): wrap around"),assert(t.start,"`wrap` option requires `start`"),l=t.start,t.wrap=!1,n=this.root,a=0)}return!0}_visitRowsUp(e,t){let s,i,n,r=t.start||this.root.children[0];const o=!!t.includeHidden;if(!1!==t.includeSelf&&!1===e(r))return!1;for(;;){if(n=r.parent,s=n.children,s[0]===r){if(r=n,!r.parent)break;s=n.children}else for(i=s.indexOf(r),r=s[i-1];(o||r.expanded)&&r.children&&r.children.length;)s=r.children,n=r,r=s[s.length-1];if((o||r.isVisible())&&!1===e(r))return!1}return!0}load(e){return this.clear(),this.root.load(e)}enableUpdate(e){e?(assert(this._disableUpdateCount>0,"enableUpdate(true) was called too often"),this._disableUpdateCount--,0===this._disableUpdateCount&&(this.logDebug(`enableUpdate(): active again. Re-painting to catch up with ${this._disableUpdateIgnoreCount} ignored update requests...`),this._disableUpdateIgnoreCount=0,this.update(ChangeType.any,{immediate:!0}))):this._disableUpdateCount++}filterNodes(e,t){return this.extensions.filter.filterNodes(e,t)}filterBranches(e,t){return this.extensions.filter.filterBranches(e,t)}clearFilter(){return this.extensions.filter.clearFilter()}isFilterActive(){return!!this.filterMode}updateFilter(){return this.extensions.filter.updateFilter()}}Wunderbaum.sequence=0,Wunderbaum.version="v0.7.0",Wunderbaum.util=util;export{Wunderbaum};
+ * @version v0.8.0
+ * @date Thu, 11 Jan 2024 19:37:23 GMT
+ */class WbSystemRoot extends WunderbaumNode{constructor(e){super(e,null,{key:"__root__",title:e.id})}toString(){return`WbSystemRoot@${this.key}<'${this.tree.id}'>`}}class Wunderbaum{constructor(e){this.enabled=!0,this.data={},this.extensionList=[],this.extensions={},this.keyMap=new Map,this.refKeyMap=new Map,this.treeRowCount=0,this._disableUpdateCount=0,this._disableUpdateIgnoreCount=0,this.activeNode=null,this.focusNode=null,this.types={},this.columns=[],this._columnsById={},this.pendingChangeTypes=new Set,this._util=util,this.filterMode=null,this.activeColIdx=0,this._cellNavMode=!1,this.lastQuicksearchTime=0,this.lastQuicksearchTerm="",this.lastClickTime=0,this.log=this.logDebug;const t=this.options=extend({id:null,source:null,element:null,debugLevel:3,header:null,rowHeightPx:22,iconMap:"bootstrap",columns:null,types:null,enabled:!0,fixedCol:!1,showSpinner:!1,checkbox:!1,minExpandLevel:0,emptyChildListExpandable:!1,skeleton:!1,connectTopBreadcrumb:null,selectMode:"multi",navigationModeOption:null,quicksearch:!0,iconBadge:null,change:null,error:null,receive:null,strings:{loadError:"Error",loading:"Loading...",noData:"No data"}},e),i=new Deferred;this.ready=i.promise();let s=!1;if(this.ready.then((()=>{s=!0;try{this._callEvent("init")}catch(e){this.logError("Exception inside `init(e)` event:",e)}})).catch((e=>{if(s)throw e;this._callEvent("init",{error:e})})),this.id=t.id||"wb_"+ ++Wunderbaum.sequence,this.root=new WbSystemRoot(this),this._registerExtension(new KeynavExtension(this)),this._registerExtension(new EditExtension(this)),this._registerExtension(new FilterExtension(this)),this._registerExtension(new DndExtension(this)),this._registerExtension(new GridExtension(this)),this._registerExtension(new LoggerExtension(this)),this._updateViewportThrottled=adaptiveThrottle(this._updateViewportImmediately.bind(this),{}),this.columns=t.columns,delete t.columns,!this.columns||!this.columns.length){const e="string"==typeof t.header?t.header:this.id;this.columns=[{id:"*",title:e,width:"*"}]}t.types&&this.setTypes(t.types,!0),delete t.types,this.element=elemFromSelector(t.element),assert(!!this.element,`Invalid 'element' option: ${t.element}`),this.element.classList.add("wunderbaum"),this.element.getAttribute("tabindex")||(this.element.tabIndex=0),this.element._wb_tree=this,this.headerElement=this.element.querySelector("div.wb-header");const n=null==t.header?this.columns.length>1:!!t.header;if(this.headerElement){assert(!this.columns,"`opts.columns` must not be set if markup already contains a header"),this.columns=[];const e=this.headerElement.querySelector("div.wb-row");for(const t of e.querySelectorAll("div"))this.columns.push({id:t.dataset.id||`col_${this.columns.length}`,title:""+t.textContent,width:"*"})}else{const e=" ".repeat(this.columns.length);if(this.element.innerHTML=`\n `,!n){this.element.querySelector("div.wb-header").style.display="none"}}this.element.innerHTML+='\n ',this.listContainerElement=this.element.querySelector("div.wb-list-container"),this.nodeListElement=this.listContainerElement.querySelector("div.wb-node-list"),this.headerElement=this.element.querySelector("div.wb-header"),this.element.classList.toggle("wb-grid",this.columns.length>1),this._initExtensions(),["enabled","fixedCol"].forEach((e=>{null!=t[e]&&this.setOption(e,t[e])})),t.source?(t.showSpinner&&(this.nodeListElement.innerHTML="loading... "),this.load(t.source).then((()=>{null==t.navigationModeOption?this.isGrid()?this.setNavigationOption(NavModeEnum.cell):this.setNavigationOption(NavModeEnum.row):this.setNavigationOption(t.navigationModeOption),this.update(ChangeType.structure,{immediate:!0}),i.resolve()})).catch((e=>{i.reject(e)})).finally((()=>{var e;null===(e=this.element.querySelector("progress.spinner"))||void 0===e||e.remove(),this.element.classList.remove("wb-initializing")}))):i.resolve(),this.update(ChangeType.any),this.element.addEventListener("scroll",(e=>{this.update(ChangeType.scroll)})),this.resizeObserver=new ResizeObserver((e=>{this.update(ChangeType.resize)})),this.resizeObserver.observe(this.element),onEvent(this.nodeListElement,"click","div.wb-row",(t=>{const i=Wunderbaum.getEventInfo(t),s=i.node,n=t;if(!1===this._callEvent("click",{event:t,node:s,info:i}))return this.lastClickTime=Date.now(),!1;if(s){if(n.ctrlKey)return void s.toggleSelected();const r=this.getOption("edit.trigger"),o=this.getOption("edit.slowClickDelay");r.indexOf("clickActive")>=0&&"title"===i.region&&s.isActive()&&(!o||Date.now()-this.lastClickTime=0?s.setActive(!0,{colIdx:i.colIdx,event:t}):s.setActive(!0,{event:t}),i.region===NodeRegion.expander?s.setExpanded(!s.isExpanded(),{scrollIntoView:!1!==e.scrollIntoViewOnExpandClick}):i.region===NodeRegion.checkbox&&s.toggleSelected()}this.lastClickTime=Date.now()})),onEvent(this.nodeListElement,"dblclick","div.wb-row",(e=>{const t=Wunderbaum.getEventInfo(e),i=t.node;if(!1===this._callEvent("dblclick",{event:e,node:i,info:t}))return!1;i&&0===t.colIdx&&i.isExpandable()&&(this._callMethod("edit._stopEditTitle"),i.setExpanded(!i.isExpanded()))})),onEvent(this.element,"keydown",(e=>{const t=Wunderbaum.getEventInfo(e),i=eventToString(e),s=t.node||this.getFocusNode();this._callHook("onKeyEvent",{event:e,node:s,info:t,eventName:i})})),onEvent(this.element,"focusin focusout",(e=>{const i="focusin"===e.type,s=Wunderbaum.getNode(e);this._callEvent("focus",{flag:i,event:e}),i&&this.isRowNav()&&!this.isEditingTitle()&&(t.navigationModeOption===NavModeEnum.row?null==s||s.setActive():this.setCellNav()),i||this._callMethod("edit._stopEditTitle",!0,{event:e,forceClose:!0})}))}static getTree(e){if(e instanceof Wunderbaum)return e;if(e instanceof WunderbaumNode)return e.tree;if(void 0===e&&(e=0),"number"==typeof e)e=document.querySelectorAll(".wunderbaum")[e];else if("string"==typeof e){for(const t of document.querySelectorAll(".wunderbaum")){const i=t._wb_tree;if(i&&i.id===e)return i}if(!(e=document.querySelector(e)))return null}else e.target&&(e=e.target);return assert(e instanceof Element,`Invalid el type: ${e}`),e.matches(".wunderbaum")||(e=e.closest(".wunderbaum")),e&&e._wb_tree?e._wb_tree:null}get iconMap(){const e=this.options.iconMap;return"string"==typeof e?iconMaps[e]:e}static getNode(e){if(!e)return null;if(e instanceof WunderbaumNode)return e;for(void 0!==e.target&&(e=e.target);e;){if(e._wb_node)return e._wb_node;e=e.parentElement}return null}*[Symbol.iterator](){yield*this.root}_registerExtension(e){this.extensionList.push(e),this.extensions[e.id]=e}_initExtensions(){for(const e of this.extensionList)e.init()}_registerNode(e){const t=e.key;assert(null!=t&&!this.keyMap.has(t),`Missing or duplicate key: '${t}'.`),this.keyMap.set(t,e);const i=e.refKey;if(null!=i){const t=this.refKeyMap.get(i);t?t.add(e):this.refKeyMap.set(i,new Set([e]))}}_unregisterNode(e){const t=e.refKey;if(null!=t){const i=this.refKeyMap.get(t);i&&i.delete(e)&&!i.size&&this.refKeyMap.delete(t)}this.keyMap.delete(e.key),e.tree=null,e.parent=null,e.removeMarkup()}_callHook(e,t={}){let i;const s=extend({},{tree:this,options:this.options,result:void 0},t);for(const t of this.extensionList){if(i=t[e].call(t,s),!1===i)break;void 0!==s.result&&(i=s.result)}return i}_callMethod(e,...t){const[i,s]=e.split("."),n=s?this.extensions[i]:this,r=n[s];if(r)return r.apply(n,t);this.logError(`Calling undefined method '${e}()'.`)}_callEvent(e,t){const[i,s]=e.split("."),n=this.options,r=s?n[i][s]:n[i];if(r)return r.call(this,extend({type:e,tree:this,util:this._util},t))}_getNodeByRowIdx(e){let t=null;return this.visitRows((i=>{if(i._rowIdx===e)return t=i,!1})),t}getTopmostVpNode(e=!0){const t=this.element.scrollTop;let i;return i=e?Math.ceil((t-1)/22):Math.floor(t/22),this._getNodeByRowIdx(i)}getLowestVpNode(e=!0){const t=this.element,i=this.headerElement.clientHeight,s=t.scrollTop,n=t.clientHeight-i;let r;return r=e?Math.floor((s+n)/22)-1:Math.ceil((s+n)/22)-1,r=Math.min(r,this.count(!0)-1),this._getNodeByRowIdx(r)}_getPrevNodeInView(e,t=1){return this.visitRows((i=>{if(e=i,t--<=0)return!1}),{reverse:!0,start:e||this.getActiveNode()}),e}_getNextNodeInView(e,t=1){return this.visitRows((i=>{if(e=i,t--<=0)return!1}),{reverse:!1,start:e||this.getActiveNode()}),e}addChildren(e,t){return this.root.addChildren(e,t)}applyCommand(e,t,i){let s,n;switch(t instanceof WunderbaumNode?s=t:(s=this.getActiveNode(),assert(void 0===i,`Unexpected options: ${i}`),i=t),e){case"moveUp":n=s.getPrevSibling(),n&&(s.moveTo(n,"before"),s.setActive());break;case"moveDown":n=s.getNextSibling(),n&&(s.moveTo(n,"after"),s.setActive());break;case"indent":n=s.getPrevSibling(),n&&(s.moveTo(n,"appendChild"),n.setExpanded(),s.setActive());break;case"outdent":s.isTopLevel()||(s.moveTo(s.getParent(),"after"),s.setActive());break;case"remove":n=s.getPrevSibling()||s.getParent(),s.remove(),n&&n.setActive();break;case"addChild":this._callMethod("edit.createNode","prependChild");break;case"addSibling":this._callMethod("edit.createNode","after");break;case"rename":s.startEditTitle();break;case"down":case"first":case"last":case"left":case"pageDown":case"pageUp":case"parent":case"right":case"up":return s.navigate(e);default:error(`Unhandled command: '${e}'`)}}clear(){this.root.removeChildren(),this.root.children=null,this.keyMap.clear(),this.refKeyMap.clear(),this.treeRowCount=0,this.activeNode=null,this.focusNode=null,this.update(ChangeType.structure)}destroy(){this.logInfo("destroy()..."),this.clear(),this.resizeObserver.disconnect(),this.element.innerHTML="",this.element.outerHTML=this.element.outerHTML}getOption(e,t){let i,s=this.options;e.indexOf(".")>=0&&([i,e]=e.split("."),s=s[i]);let n=s[e];return"function"==typeof n&&(n=n({type:"resolve",tree:this})),null!=n?n:t}setOption(e,t){if(e.indexOf(".")>=0){const i=e.split(".");this.extensions[i[0]].setPluginOption(i[1],t)}else switch(this.options[e]=t,e){case"checkbox":this.update(ChangeType.any);break;case"enabled":this.setEnabled(!!t);break;case"fixedCol":this.element.classList.toggle("wb-fixed-col",!!t)}}hasFocus(){return this.element.contains(document.activeElement)}hasHeader(){const e=this.options.header;return this.isGrid()?!1!==e:!!e}runWithDeferredUpdate(e,t=null){try{this.enableUpdate(!1);const t=e();return assert(!(t instanceof Promise),`Promise return not allowed: ${t}`),t}finally{this.enableUpdate(!0)}}async expandAll(e=!0,t){await this.root.expandAll(e,t)}selectAll(e=!0){return this.root.setSelected(e,{propagateDown:!0})}toggleSelect(){this.selectAll(this.root._anySelectable())}getSelectedNodes(e=!1){return this.root.getSelectedNodes(e)}_selectRange(e){this.logDebug("_selectRange",e),error("Not yet implemented.")}count(e=!1){return e?this.treeRowCount:this.keyMap.size}_check(){let e=0;this.visit((t=>{e++})),this.keyMap.size!==e&&this.logWarn(`_check failed: ${this.keyMap.size} !== ${e}`)}findAll(e){return this.root.findAll(e)}findByRefKey(e){const t=this.refKeyMap.get(e);return t?Array.from(t):[]}findFirst(e){return this.root.findFirst(e)}findKey(e){return this.keyMap.get(e)||null}findNextNode(e,t){let i=null;const s=this.getFirstChild(),n="string"==typeof e?makeNodeTitleStartMatcher(e):e;function r(e){if(n(e)&&(i=e),i||e===t)return!1}return t=t||s,this.visitRows(r,{start:t,includeSelf:!1}),i||t===s||this.visitRows(r,{start:s,includeSelf:!0}),i}findRelatedNode(e,t,i=!1){let s=null;const n=Math.floor(this.listContainerElement.clientHeight/22);switch(t){case"parent":case"left":e.parent&&e.parent.parent&&(s=e.parent);break;case"first":this.visit((e=>{if(e.isVisible())return s=e,!1}));break;case"last":this.visit((e=>{e.isVisible()&&(s=e)}));break;case"right":e.children&&e.children.length&&(s=e.children[0]);break;case"up":s=this._getPrevNodeInView(e);break;case"down":s=this._getNextNodeInView(e);break;case"pageDown":{const t=this.getLowestVpNode();s=e._rowIdxt._rowIdx?t:this._getPrevNodeInView(e,n)}break;default:this.logWarn("Unknown relation '"+t+"'.")}return s}*format_iter(e,t){yield*this.root.format_iter(e,t)}format(e,t){return this.root.format(e,t)}getActiveColElem(){return this.activeNode&&this.activeColIdx>=0?this.activeNode.getColElem(this.activeColIdx):null}getActiveNode(){return this.activeNode}getFirstChild(){return this.root.getFirstChild()}getFocusNode(){return this.focusNode}static getEventInfo(e){const t=e.target,i=t.classList,s=t.closest("span.wb-col"),n=Wunderbaum.getNode(t),r=n?n.tree:Wunderbaum.getTree(e),o={event:e,canonicalName:eventToString(e),tree:r,node:n,region:NodeRegion.unknown,colDef:void 0,colIdx:-1,colId:void 0,colElem:s};if(i.contains("wb-title"))o.region=NodeRegion.title;else if(i.contains("wb-expander"))o.region=n.isExpandable()?NodeRegion.expander:NodeRegion.prefix;else if(i.contains("wb-checkbox"))o.region=NodeRegion.checkbox;else if(i.contains("wb-icon"))o.region=NodeRegion.icon;else if(i.contains("wb-node"))o.region=NodeRegion.title;else if(s){o.region=NodeRegion.column;const e=Array.prototype.indexOf.call(s.parentNode.children,s);o.colIdx=e}else{if(!i.contains("wb-row"))return"mousemove"===e.type||e instanceof KeyboardEvent||null==r||r.logWarn("getEventInfo(): not found",e,o),o;o.region=NodeRegion.title}return-1===o.colIdx&&(o.colIdx=0),o.colDef=null==r?void 0:r.columns[o.colIdx],null!=o.colDef&&(o.colId=o.colDef.id),o}toString(){return`Wunderbaum<'${this.id}'>`}isEditing(){return!!this.nodeListElement.querySelector("input:focus,select:focus")}isEditingTitle(){return this._callMethod("edit.isEditingTitle")}isLoading(){let e=!1;return this.root.visit((t=>{if(t._isLoading||t._requestId)return e=!0,!1}),!0),e}logDebug(...e){this.options.debugLevel>=4&&console.log(this.toString(),...e)}logError(...e){this.options.debugLevel>=1&&console.error(this.toString(),...e)}logInfo(...e){this.options.debugLevel>=3&&console.info(this.toString(),...e)}logTime(e){return this.options.debugLevel>=4&&console.time(this+": "+e),e}logTimeEnd(e){this.options.debugLevel>=4&&console.timeEnd(this+": "+e)}logWarn(...e){this.options.debugLevel>=2&&console.warn(this.toString(),...e)}scrollTo(e){let t,i;e instanceof WunderbaumNode?t=e:(i=e,t=i.node),assert(t&&null!=t._rowIdx,`Invalid node: ${t}`);const s=this.element,n=this.headerElement.clientHeight,r=s.scrollTop,o=s.clientHeight,l=22*t._rowIdx+n,a=n,d=l-r,c=d+22,h=null==i?void 0:i.topNode;let u=null;d>=a?c<=o||(u=l+22-o+2):u=l-a-2,null!=u&&(this.log(`scrollTo(${l}): ${r} => ${u}`),s.scrollTop=u,h&&this.scrollTo(h))}scrollToHorz(){const e=this.columns[0]._widthPx,t=this.element.clientWidth,i=this.element.scrollLeft,s=this.getActiveColElem(),n=Number.parseInt(null==s?void 0:s.style.left,10),r=n+Number.parseInt(null==s?void 0:s.style.width,10);let o=i;n-it&&(o=r-t),o=Math.max(0,o),this.log(`scrollToHorz(${this.activeColIdx}): ${n}..${r}, fixedOfs=${e}, vpWidth=${t}, curLeft=${i} -> ${o}`),this.element.scrollLeft=o}setColumn(e,t){var i,s,n;const r=null==t?void 0:t.edit,o=!1!==(null==t?void 0:t.scrollIntoView);if(assert(this.isCellNav(),"Expected cellNav mode"),"string"==typeof e){const t=e;assert((e=this.columns.findIndex((t=>t.id===e)))>=0,`Invalid colId: ${t}`)}if(assert(0<=e&&e0&&(s?this._updateViewportImmediately():this._updateViewportThrottled())}}setEnabled(e=!0){const t=this.enabled;return this.enabled=!!e,this.element.classList.toggle("wb-disabled",!e),t}isEnabled(){return this.enabled}isGrid(){return this.columns&&this.columns.length>1}isCellNav(){return!!this._cellNavMode}isRowNav(){return!this._cellNavMode}setCellNav(e=!0){var t;const i=this._cellNavMode;this._cellNavMode=!!e,e&&!i&&this.setColumn(0),this.element.classList.toggle("wb-cell-mode",e),null===(t=this.activeNode)||void 0===t||t.update(ChangeType.status)}setNavigationOption(e,t=!1){if(this.isGrid()||e===NavModeEnum.row)switch(this.options.navigationModeOption=e,e){case NavModeEnum.cell:this.setCellNav(!0);break;case NavModeEnum.row:this.setCellNav(!1);break;case NavModeEnum.startCell:t&&this.setCellNav(!0);break;case NavModeEnum.startRow:t&&this.setCellNav(!1);break;default:error(`Invalid mode '${e}'.`)}else this.logWarn("Plain trees only support row navigation mode.")}setStatus(e,t){return this.root.setStatus(e,t)}setTypes(e,t=!0){assert(isPlainObject(e),`Expected plain objext: ${e}`),t?this.types=e:extend(this.types,e);for(const e of Object.values(this.types))e.classes&&(e.classes=toSet(e.classes))}sortChildren(e=nodeTitleSorter,t=!1){this.root.sortChildren(e,t)}toDictArray(e){var t;return null!==(t=this.root.toDict(!0,e).children)&&void 0!==t?t:[]}_updateColumnWidths(){const e=this.element.clientWidth,t=this.columns,i=t[0];let s=0,n=0,r=0,o=!1;if("*"!==i.id)throw new Error(`First column must have id '*': got '${i.id}'.`);this._columnsById={};for(const e of t){this._columnsById[e.id]=e;const t=e.width;if("*"===e.id&&e!==i)throw new Error(`Column id '*' must be defined only once: '${e.title}'.`);if(t&&"*"!==t)if("number"==typeof t)e._weight=t,n+=t;else if("string"==typeof t&&t.endsWith("px")){e._weight=0;const i=parseFloat(t.slice(0,-2));e._widthPx!=i&&(o=!0,e._widthPx=i),r+=i}else error(`Invalid column width: ${t} (expected string ending with 'px' or number, e.g. "px" or ).`);else e._weight=1,n+=1}const l=Math.max(0,e-r);let a=0;for(const e of t){let t;if(e._weight){const i=e.minWidth;t="number"==typeof i?i:"string"==typeof i&&i.endsWith("px")?parseFloat(i.slice(0,-2)):4;const s=Math.max(t,l*e._weight/n);e._widthPx!=s&&(o=!0,e._widthPx=s)}e._ofsPx=a,a+=e._widthPx}t[t.length-1]._widthPx-=1,s=a-1;const d=`${s}px`;return this.headerElement.style.width=d,this.listContainerElement.style.width=d,o}_renderHeaderMarkup(){assert(this.headerElement,"Expected a headerElement");const e=this.hasHeader();if(setElemDisplay(this.headerElement,e),!e)return;const t=this.columns.length,i=this.headerElement.querySelector(".wb-row");assert(i,"Expected a row in header element"),i.innerHTML=" ".repeat(t);for(let e=0;e '),n.innerHTML=`${r} ${l}`,this.isCellNav()&&n.classList.toggle("wb-active",e===this.activeColIdx)}}updatePendingModifications(){this.pendingChangeTypes.size>0&&this._updateViewportImmediately()}_updateViewportImmediately(){var e;if(this._disableUpdateCount)return this.log(`_updateViewportImmediately() IGNORED (disable level: ${this._disableUpdateCount}).`),void this._disableUpdateIgnoreCount++;this._updateViewportThrottled.pending()&&this._updateViewportThrottled.cancel();const t=RenderFlag,i=new Set(this.pendingChangeTypes);this.pendingChangeTypes.clear();if(i.has(t.scroll)&&1===i.size)this._updateRows({newNodesOnly:!0});else{if(this.log("_updateViewportImmediately():",i),!1!==this.options.adjustHeight){let e=this.listContainerElement.clientHeight;const t=this.headerElement.clientHeight,i=this.element.clientHeight-t-1;Math.abs(e-i)>1&&(this.listContainerElement.style.height=i+"px",e=i)}i.has(t.clearMarkup)&&this.visit((e=>{e.removeMarkup()})),i.has(t.header)&&(this._updateColumnWidths(),this._renderHeaderMarkup()),this._updateRows()}if(this.options.connectTopBreadcrumb){let t=null===(e=this.getTopmostVpNode(!0))||void 0===e?void 0:e.getPath(!1,"title"," > ");t=t?t+" >":"",this.options.connectTopBreadcrumb.textContent=t}this._callEvent("update")}_updateRows(e){const t=!!(e=Object.assign({newNodesOnly:!1},e)).newNodesOnly,i=this.element.clientHeight,s=this.element.scrollTop;let n=Math.max(0,s/22-5);n=Math.floor(n),n%2&&n--;let r=Math.max(0,(s+i)/22+5);r=Math.ceil(r);const o=new Set;this.nodeListElement.childNodes.forEach((e=>{const t=e;o.add(t._wb_node)}));let l=0,a=0,d=!1,c="first";this.visitRows((function(e){const i=e._rowElem;e._rowIdx!==l&&(e._rowIdx=l,d=!0),lr?i&&(c=i):i&&t?(o.delete(e),i.style.top=22*l+"px",c=i):(o.delete(e),i&&(i.style.top=22*l+"px"),e._render({top:a,after:c}),c=e._rowElem),l++,a+=22})),this.treeRowCount=l;for(const e of o)e._callEvent("discard"),e.removeMarkup();return this.nodeListElement.style.height=`${a}px`,d}visit(e){return this.root.visit(e,!1)}visitRows(e,t){if(!this.root.hasChildren())return!1;if(t&&t.reverse)return delete t.reverse,this._visitRowsUp(e,t);let i,s,n,r,o,l,a=0,d=!1===(t=t||{}).includeSelf,c=t.start||this.root.children[0];const h=!!t.includeHidden,u=!h&&"hide"===this.filterMode;for(n=c.parent;n;){for(o=n.children,s=o.indexOf(c)+a,assert(s>=0,`Could not find ${c} in parent's children: ${n}`),i=s;it!==l&&(!u||t.match||t.subMatchCount?!1!==e(t)&&(h||!t.children||t.expanded?void 0:"skip"):"skip")),!1),!1===r))return!1}}c=n,n=n.parent,a=1,!n&&t.wrap&&(this.logDebug("visitRows(): wrap around"),assert(t.start,"`wrap` option requires `start`"),l=t.start,t.wrap=!1,n=this.root,a=0)}return!0}_visitRowsUp(e,t){let i,s,n,r=t.start||this.root.children[0];const o=!!t.includeHidden;if(!1!==t.includeSelf&&!1===e(r))return!1;for(;;){if(n=r.parent,i=n.children,i[0]===r){if(r=n,!r.parent)break;i=n.children}else for(s=i.indexOf(r),r=i[s-1];(o||r.expanded)&&r.children&&r.children.length;)i=r.children,n=r,r=i[i.length-1];if((o||r.isVisible())&&!1===e(r))return!1}return!0}load(e){return this.clear(),this.root.load(e)}enableUpdate(e){e?(assert(this._disableUpdateCount>0,"enableUpdate(true) was called too often"),this._disableUpdateCount--,0===this._disableUpdateCount&&(this.logDebug(`enableUpdate(): active again. Re-painting to catch up with ${this._disableUpdateIgnoreCount} ignored update requests...`),this._disableUpdateIgnoreCount=0,this.update(ChangeType.any,{immediate:!0}))):this._disableUpdateCount++}filterNodes(e,t){return this.extensions.filter.filterNodes(e,t)}filterBranches(e,t){return this.extensions.filter.filterBranches(e,t)}clearFilter(){return this.extensions.filter.clearFilter()}isFilterActive(){return!!this.filterMode}updateFilter(){return this.extensions.filter.updateFilter()}}Wunderbaum.sequence=0,Wunderbaum.version="v0.8.0",Wunderbaum.util=util;export{Wunderbaum};
//# sourceMappingURL=wunderbaum.esm.min.js.map
\ No newline at end of file
diff --git a/dist/wunderbaum.esm.min.js.map b/dist/wunderbaum.esm.min.js.map
index 4be77e6b..50e684a2 100644
--- a/dist/wunderbaum.esm.min.js.map
+++ b/dist/wunderbaum.esm.min.js.map
@@ -1 +1 @@
-{"version":3,"file":"wunderbaum.esm.js","names":["MOUSE_BUTTONS","MAX_INT","userInfo","_getUserInfo","isMac","REX_HTML","REX_TOOLTIP","ENTITY_MAP","Deferred$1","constructor","this","thens","catches","status","resolve","value","Error","resolvedValue","forEach","t","reject","error","rejectedError","c","then","cb","unshift","promise","catch","assert","cond","msg","nav","navigator","test","platform","documentReady","callback","document","readyState","addEventListener","documentReadyPromise","Promise","each","obj","length","i","call","k","escapeHtml","s","replace","escapeRegex","escapeTooltip","extractHtmlText","indexOf","getValueFromElem","elem","coerce","tag","tagName","classList","contains","span","embeddedInput","querySelector","innerText","input","type","indeterminate","checked","valueAsDate","valueAsNumber","name","parentElement","undefined","setValueToElem","Date","select","selectedIndex","setElemDisplay","flag","style","elemFromSelector","display","elemFromHtml","html","createElement","innerHTML","trim","content","firstElementChild","_IGNORE_KEYS","Set","eventTargetFromSelector","eventToString","event","key","et","altKey","push","ctrlKey","metaKey","shiftKey","button","has","join","extend","args","arg","Object","prototype","hasOwnProperty","isArray","Array","isEmptyObject","keys","isFunction","isPlainObject","toString","noop","onEvent","rootTarget","eventNames","selectorOrHandler","handlerOrNone","selector","handler","split","evn","e","target","matches","closest","overrideMethod","instance","methodName","ctx","prevSuper","prevSuperApply","self","prevFunc","_super","apply","_superApply","argsArray","setTimeoutPromise","ms","setTimeout","err","async","sleep","toggleCheckbox","element","tristate","getOption","opts","defaultValue","ext","toSet","val","set","add","toLowerCase","adaptiveThrottle","options","waiting","pendingArgs","assign","minDelay","defaultDelay","maxDelay","delayFactor","Math","max","throttledFn","useArgs","start","now","console","elap","curDelay","min","useDelay","ChangeType","RenderFlag","NodeStatusType","NodeRegion","NavModeEnum","util","freeze","__proto__","Deferred","WunderbaumExtension","tree","id","defaults","enabled","treeOpts","extensionOpts","getPluginOption","init","_a","setPluginOption","setEnabled","onKeyEvent","data","onRender","freeGlobal","global","freeGlobalThis","globalThis","freeSelf","root","Function","isObject","debounce","func","wait","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","useRAF","requestAnimationFrame","TypeError","invokeFunc","time","thisArg","startTimer","pendingFunc","cancelAnimationFrame","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","timeSinceLastInvoke","timeWaiting","remainingWait","debounced","isInvoking","leadingEdge","cancel","clearTimeout","cancelTimer","flush","pending","throttle","START_MARKER","END_MARKER","RE_START_MARKER","RegExp","RE_END_MARTKER","FilterExtension","super","connectInput","autoApply","autoExpand","counter","fuzzy","hideExpandedCounter","hideExpanders","highlight","leavesOnly","mode","noData","lastFilterArgs","queryInput","filterNodes","filterMode","updateFilter","_applyFilterNoUpdate","filter","branchMode","_opts","runWithDeferredUpdate","_applyFilterImpl","match","temp","count","prevAutoCollapse","autoCollapse","hideMode","logInfo","clearFilter","map","reduce","a","b","re","reHighlight","node","title","text","res","_markFuzzyMatchedChars","titleWithHighlight","arguments","toggle","subMatchCount","visit","setStatus","ok","children","matchedByBranch","parent","visitParents","p","expanded","setExpanded","noAnimation","noEvents","_filterAutoExpanded","filterBranches","logWarn","enableUpdate","remove","escapeTitles","matchingIndices","_matchingArrIdx","_mIdx","textPoses","v","QUICKSEARCH_DELAY","KeynavExtension","_getEmbeddedInputElem","ace","getActiveColElem","_isCurInputFocused","activate","autoActivate","curInput","inputHasFocus","navModeOption","navigationModeOption","focusNode","eventName","handled","isEnabled","_callEvent","_callMethod","currentNode","getFocusNode","getActiveNode","firstNode","getFirstChild","setActive","setFocus","isColspan","isRowNav","blur","_render","quicksearch","stamp","lastQuicksearchTime","lastQuicksearchTerm","matchNode","findNextNode","preventDefault","isActive","isExpanded","isExpandable","startCell","startRow","setCellNav","toggleSelected","navigate","curInputType","inputCanFocus","logDebug","setColumn","activeColIdx","focus","click","log","isCellNav","cell","columns","LoggerExtension","ignoreEvents","prefix","extra","DEFAULT_DEBUGLEVEL","ROW_HEIGHT","ICON_WIDTH","TITLE_SPAN_PAD_Y","RENDER_MAX_PREFETCH","TEST_IMG","iconMaps","bootstrap","loading","expanderExpanded","expanderCollapsed","expanderLazy","checkChecked","checkUnchecked","checkUnknown","radioChecked","radioUnchecked","radioUnknown","folder","folderOpen","folderLazy","doc","fontawesome6","RESERVED_TREE_SOURCE_KEYS","KEY_TO_ACTION_DICT","Add","ArrowDown","ArrowLeft","ArrowRight","ArrowUp","Backspace","Divide","End","Home","Multiply","PageDown","PageUp","Subtract","makeNodeTitleMatcher","makeNodeTitleStartMatcher","reMatch","nodeTitleSorter","x","y","unflattenSource","source","_b","_c","_format","_keyMap","_positional","includes","longToShort","warn","entries","positionalShort","newChildren","keyToNodeMap","indexToNodeMap","keyAttrName","childrenAttrName","index","nodeTuple","parentId","kwargs","positionalIdx","parentNode","decompressSourceData","_version","_valueMap","shortToLong","_typeList","_iter","childList","getOwnPropertyNames","propName","longName","newValue","nodeMimeType","DndExtension","autoExpandMS","multiSource","effectAllowed","dropEffectDefault","guessDropEffect","preventForeignNodes","preventLazyParents","preventNonNodes","preventRecursion","preventSameParent","preventVoidMoves","serializeClipboardData","scroll","scrollSensitivity","scrollSpeed","sourceCopyHook","dragStart","drag","dragEnd","dragEnter","dragOver","dragExpand","drop","dragLeave","srcNode","lastTargetNode","lastEnterStamp","lastAllowedDropRegions","lastDropEffect","lastDropRegion","currentScrollDir","applyScrollDirThrottled","_applyScrollDir","dndOpts","dnd","onDragEvent","bind","onDropEvent","_leaveNode","ltn","setClass","unifyDragover","size","_calcDropRegion","allowed","dy","offsetY","_guessDropEffect","ea","canCopy","canLink","canMove","_isVoidDrop","targetNode","dropRegion","getNextSibling","getPrevSibling","isDragging","sp","scrollTop","_autoScroll","viewportY","sensitivity","headerHeight","headerElement","clientHeight","height","offsetHeight","scrollHeight","Wunderbaum","getNode","dataTransfer","isEditing","nodeData","toDict","n","_orgKey","_treeId","setData","JSON","stringify","types","srcTree","dt","dropEffect","isStatusNode","isLoaded","isAncestorOf","regionSet","clientY","offsetTop","region","_isLoading","stopPropagation","getData","parse","suggestedDropMode","suggestedDropEffect","sourceNode","sourceNodeData","DragObserver","dragElem","dragging","events","thresh","_handler","handleEvent","disconnect","removeEventListener","getDragElem","stopDrag","cb_event","dragstop","dx","pageX","pageY","dragstart","GridExtension","observer","window","handleDrag","info","getEventInfo","_promise","_resolve","_reject","reason","finally","NODE_PROPS","NODE_DICT_PROPS","delete","WunderbaumNode","refKey","classes","_requestId","_errorInfo","_partsel","_partload","_rowIdx","_rowElem","sequence","icon","lazy","statusNodeType","colspan","checkbox","radiogroup","selected","unselectable","_registerNode","Symbol","iterator","cl","l","typeInfo","addChildren","before","applyMinExpanLevel","_level","getLevel","nodeList","forceExpand","minExpandLevel","child","subChildren","isUnloaded","concat","findDirectChild","pos","splice","update","structure","addNode","applyCommand","cmd","collapseSiblings","className","cnSet","cn","expandAll","depth","loadLazy","force","keepActiveNodeVisible","expandOpts","scrollIntoView","logTime","level","level_1","promises","all","logTimeEnd","activeNode","findAll","matcher","ptr","findFirst","findRelatedNode","where","includeHidden","format_iter","name_cb","connectors","_is_last","ca","_format_line","parts","format","line","getColElem","colIdx","findIndex","colElems","querySelectorAll","getLastChild","ac","idx","getParent","getParentList","includeRoot","includeSelf","dtn","getPath","part","separator","path","isFunc","hasChildren","hasClass","other","isDescendantOf","isChildOf","andCollapsed","emptyChildListExpandable","isFirstSibling","isLastSibling","isLazy","isLoading","isPagingNode","isParentOf","isPartload","isPartsel","isRadio","isRendered","isRootNode","isSelected","isTopLevel","isVisible","hasFilter","parents","_loadSourceObject","response","setTypes","colStructure","selectMode","fixSelection3FromEndNodes","_fetchWithOptions","url","params","body","rest","fetchOpts","method","URLSearchParams","fetch","json","load","requestId","prevParent","elapLoad","elapProcess","startProcess","logError","message","debugLevel","forceReload","wasExpanded","resetLazy","makeVisible","dfd","deferreds","len","seOpts","updatePendingModifications","moveTo","targetParent","triggerModifyChild","any","triggerModify","removeMarkup","_unregisterNode","removeChildren","_wb_node","_getRenderInfo","allColInfosById","renderColInfosById","col","_createIcon","iconMap","parentElem","replaceChild","showLoading","iconSpan","appendChild","cbRes","badge","tooltip","badgeClass","badgeTooltip","append","_render_markup","treeOptions","rowDiv","checkboxSpan","expanderSpan","isNew","after","top","nodeElem","ofsTitlePx","titleSpan","_ofsTitlePx","draggable","colElem","left","_ofsPx","width","_widthPx","nodeListElement","prepend","_render_data","preventScroll","textContent","skeleton","vpWidth","clientWidth","isDataChange","_render_status","renderInfo","rowClasses","image","backgroundImage","cbclass","colSpan","resizeCols","ofs","colDef","change","row","recursive","dict","scrollTo","prev","retrigger","focusTree","orgEvent","nextNode","prevNode","immediate","updateOpts","lastChild","topNode","setIcon","setKey","getSelectedNodes","stopOnParents","_anySelectable","setSelected","found","_changeSelectStatusProps","state","changed","fixSelection3AfterClick","_walk","allSelected","someSelected","sendEvents","canSelect","propagateDown","sibling","details","statusNode","_setStatusNode","firstChild","_clearStatusNode","strings","loadError","setTitle","_sortChildren","cmp","deep","sort","sortChildren","operation","modifyChild","visitSiblings","isMatched","EditExtension","minlength","maxlength","trigger","slowClickDelay","validity","beforeEdit","edit","curEditNode","relatedNode","debouncedOnChange","_onChange","_applyChange","inputElem","inputValue","_preprocessKeyEvent","isEditingTitle","_stopEditTitle","startEditTitle","inputHtml","setCustomValidity","reportValidity","stopEditTitle","focusElem","activeElement","forceClose","errMsg","validationMessage","oldValue","createNode","newNode","WbSystemRoot","extensionList","extensions","keyMap","Map","refKeyMap","treeRowCount","_disableUpdateCount","_disableUpdateIgnoreCount","_columnsById","pendingChangeTypes","_util","_cellNavMode","lastClickTime","header","rowHeightPx","fixedCol","showSpinner","connectTopBreadcrumb","iconBadge","receive","readyDeferred","ready","readyOk","_registerExtension","_updateViewportThrottled","_updateViewportImmediately","getAttribute","tabIndex","_wb_tree","wantHeader","rowElement","colDiv","dataset","coldivs","repeat","listContainerElement","_initExtensions","optName","setOption","isGrid","setNavigationOption","resizeObserver","ResizeObserver","resize","observe","mouseEvent","expander","scrollIntoViewOnExpandClick","_callHook","getTree","el","treeElem","Element","extension","rk","rks","get","hook","d","_getNodeByRowIdx","visitRows","getTopmostVpNode","complete","topIdx","ceil","floor","getLowestVpNode","scrollParent","bottomIdx","_getPrevNodeInView","reverse","_getNextNodeInView","nodeOrOpts","refNode","clear","destroy","outerHTML","hasFocus","hasHeader","hint","selectAll","toggleSelect","_selectRange","eventInfo","visible","_check","findKey","startNode","_checkNode","pageSize","bottomNode","parentCol","canonicalName","unknown","colId","column","KeyboardEvent","label","timeEnd","vpHeight","rowTop","vpTop","vpRowTop","vpRowBottom","newScrollTop","scrollToHorz","fixedWidth","scrollLeft","colLeft","Number","parseInt","colRight","newLeft","setActiveNode","RF","clearMarkup","redraw","reset","values","toDictArray","_updateColumnWidths","col0","totalWidth","totalWeight","modified","cw","_weight","endsWith","px","parseFloat","slice","restPx","ofsPx","minWidth","cmw","tw","_renderHeaderMarkup","colCount","headerRow","headerClasses","resizer","_updateRows","newNodesOnly","adjustHeight","wantHeight","abs","vp_height","startIdx","endIdx","obsoleteNodes","childNodes","tr","prevElem","_visitRowsUp","nextIdx","siblings","stopNode","siblingOfs","skipFirstNode","checkFilter","wrap","isFilterActive","version"],"sources":["wunderbaum.esm.js"],"mappings":";;;;;AAOA,MAAMA,cAAgB,CAClB,EAAG,GACH,EAAG,OACH,EAAG,SACH,EAAG,QACH,EAAG,OACH,EAAG,WAEDC,QAAU,iBACVC,SAAWC,eAEXC,MAAQF,SAASE,MACjBC,SAAW,YACXC,YAAc,WACdC,WAAa,CACf,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,QACL,IAAK,UAKT,IAAIC,WAAa,MACb,WAAAC,GACIC,KAAKC,MAAQ,GACbD,KAAKE,QAAU,GACfF,KAAKG,OAAS,EAClB,CACA,OAAAC,CAAQC,GACJ,GAAIL,KAAKG,OACL,MAAM,IAAIG,MAAM,mBAEpBN,KAAKG,OAAS,WACdH,KAAKO,cAAgBF,EACrBL,KAAKC,MAAMO,SAASC,GAAMA,EAAEJ,KAC5BL,KAAKC,MAAQ,EACjB,CACA,MAAAS,CAAOC,GACH,GAAIX,KAAKG,OACL,MAAM,IAAIG,MAAM,mBAEpBN,KAAKG,OAAS,WACdH,KAAKY,cAAgBD,EACrBX,KAAKE,QAAQM,SAASK,GAAMA,EAAEF,KAC9BX,KAAKE,QAAU,EACnB,CACA,IAAAY,CAAKC,GACc,aAAXZ,OACAY,EAAGf,KAAKO,eAGRP,KAAKC,MAAMe,QAAQD,EAE3B,CACA,MAAMA,GACkB,aAAhBf,KAAKG,OACLY,EAAGf,KAAKY,eAGRZ,KAAKE,QAAQc,QAAQD,EAE7B,CACA,OAAAE,GACI,MAAO,CACHH,KAAMd,KAAKc,KACXI,MAAOlB,KAAKkB,MAEpB,GAGJ,SAASC,OAAOC,EAAMC,GAClB,IAAKD,EAED,MADAC,EAAMA,GAAO,oBACP,IAAIf,MAAMe,EAExB,CACA,SAAS5B,eACL,MAAM6B,EAAMC,UAKZ,MAHY,CACR7B,MAAO,MAAM8B,KAAKF,EAAIG,UAG9B,CAEA,SAASC,cAAcC,GACS,YAAxBC,SAASC,WACTD,SAASE,iBAAiB,mBAAoBH,GAG9CA,GAER,CAEA,SAASI,uBACL,OAAO,IAAIC,SAAS5B,IAChBsB,cAActB,EAAQ,GAE9B,CASA,SAAS6B,KAAKC,EAAKP,GACf,GAAW,MAAPO,EAEA,OAAOA,EAEX,MAAMC,EAASD,EAAIC,OACnB,IAAIC,EAAI,EACR,GAAsB,iBAAXD,EACP,KAAOC,EAAID,IACkC,IAArCR,EAASU,KAAKH,EAAIE,GAAIA,EAAGF,EAAIE,IADlBA,UAOnB,IAAK,MAAME,KAAKJ,EACZ,IAAyC,IAArCP,EAASU,KAAKH,EAAIE,GAAIE,EAAGJ,EAAII,IAC7B,MAIZ,OAAOJ,CACX,CAEA,SAASvB,MAAMU,GACX,MAAM,IAAIf,MAAMe,EACpB,CAEA,SAASkB,WAAWC,GAChB,OAAQ,GAAKA,GAAGC,QAAQ9C,UAAU,SAAU6C,GACxC,OAAO3C,WAAW2C,EACtB,GACJ,CAKA,SAASE,YAAYF,GACjB,OAAQ,GAAKA,GAAGC,QAAQ,yBAA0B,OACtD,CAEA,SAASE,cAAcH,GACnB,OAAQ,GAAKA,GAAGC,QAAQ7C,aAAa,SAAU4C,GAC3C,OAAO3C,WAAW2C,EACtB,GACJ,CAEA,SAASI,gBAAgBJ,GAKrB,OAJIA,EAAEK,QAAQ,MAAQ,GAClBlC,MAAM,mBAGH6B,CACX,CA0BA,SAASM,iBAAiBC,EAAMC,GAAS,GACrC,MAAMC,EAAMF,EAAKG,QACjB,IAAI7C,EAAQ,KACZ,GAAY,SAAR4C,GAAkBF,EAAKI,UAAUC,SAAS,UAAW,CACrD,MAAMC,EAAON,EACPO,EAAgBD,EAAKE,cAAc,gBACzC,GAAID,EACA,OAAOR,iBAAiBQ,EAAeN,GAE3CK,EAAKG,UAAY,GAAKnD,CAC1B,MACK,GAAY,UAAR4C,EAAiB,CACtB,MAAMQ,EAAQV,EAEd,OADaU,EAAMC,MAEf,IAAK,SACL,IAAK,QACL,IAAK,SACL,IAAK,QACD,MACJ,IAAK,WACDrD,EAAQoD,EAAME,cAAgB,KAAOF,EAAMG,QAC3C,MACJ,IAAK,OACL,IAAK,WACL,IAAK,iBACL,IAAK,QACL,IAAK,OACL,IAAK,OACDvD,EAAQ2C,EAASS,EAAMI,YAAcJ,EAAMpD,MAC3C,MACJ,IAAK,SACL,IAAK,QACDA,EAAQoD,EAAMK,cACd,MACJ,IAAK,QACD,CACI,MAAMC,EAAON,EAAMM,KACbH,EAAUH,EAAMO,cAAcT,cAAc,eAAeQ,eACjE1D,EAAQuD,EAAUA,EAAQvD,WAAQ4D,CACtC,CACA,MAEJ,QACI5D,EAAQoD,EAAMpD,MAE1B,MACK,GAAY,WAAR4C,EAAkB,CAEvB5C,EADe0C,EACA1C,KACnB,CACA,OAAOA,CACX,CA8BA,SAAS6D,eAAenB,EAAM1C,GAC1B,MAAM4C,EAAMF,EAAKG,QACjB,GAAY,SAARD,GAAkBF,EAAKI,UAAUC,SAAS,UAAW,CACrD,MAAMC,EAAON,EACPO,EAAgBD,EAAKE,cAAc,gBACzC,GAAID,EACA,OAAOY,eAAeZ,EAAejD,GAGzCgD,EAAKG,UAAY,GAAKnD,CAC1B,MACK,GAAY,UAAR4C,EAAiB,CACtB,MAAMQ,EAAQV,EACRW,EAAOD,EAAMC,KACnB,OAAQA,GACJ,IAAK,WAGDD,EAAME,cAA0B,OAAVtD,EACtBoD,EAAMG,UAAYvD,EAClB,MACJ,IAAK,OACL,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,WACL,IAAK,iBACDoD,EAAMI,YAAc,IAAIM,KAAK9D,GAC7B,MACJ,IAAK,SACL,IAAK,QACY,MAATA,EACAoD,EAAMpD,MAAQA,EAGdoD,EAAMK,cAAgBzD,EAE1B,MACJ,IAAK,QACDM,MAAM,wBAAwB+C,KAM9B,MACJ,IAAK,SACL,IAAK,QACL,IAAK,SACL,IAAK,QACD,MAEJ,QACID,EAAMpD,MAAQA,QAAqCA,EAAQ,GAEvE,MACK,GAAY,WAAR4C,EAAkB,CACvB,MAAMmB,EAASrB,EACF,MAAT1C,EACA+D,EAAOC,eAAiB,EAGxBD,EAAO/D,MAAQA,CAEvB,CACJ,CAEA,SAASiE,eAAevB,EAAMwB,GAC1B,MAAMC,EAAQC,iBAAiB1B,GAAMyB,MACjCD,EACsB,SAAlBC,EAAME,UACNF,EAAME,QAAU,IAGG,KAAlBF,EAAME,UACXF,EAAME,QAAU,OAExB,CAEA,SAASC,aAAaC,GAClB,MAAMnE,EAAImB,SAASiD,cAAc,YAEjC,OADApE,EAAEqE,UAAYF,EAAKG,OACZtE,EAAEuE,QAAQC,iBACrB,CACA,MAAMC,aAAe,IAAIC,IAAI,CAAC,MAAO,UAAW,OAAQ,UAExD,SAASV,iBAAiBvC,GACtB,OAAKA,EAGc,iBAARA,EACAN,SAAS2B,cAAcrB,GAE3BA,EALI,IAMf,CAEA,SAASkD,wBAAwBlD,GAC7B,OAAKA,EAGc,iBAARA,EACAN,SAAS2B,cAAcrB,GAE3BA,EALI,IAMf,CAyBA,SAASmD,cAAcC,GACnB,MAAMC,EAAMD,EAAMC,IACZC,EAAKF,EAAM5B,KACXlB,EAAI,GA2BV,OA1BI8C,EAAMG,QACNjD,EAAEkD,KAAK,OAEPJ,EAAMK,SACNnD,EAAEkD,KAAK,WAEPJ,EAAMM,SACNpD,EAAEkD,KAAK,QAEPJ,EAAMO,UACNrD,EAAEkD,KAAK,SAEA,UAAPF,GAAyB,aAAPA,EAClBhD,EAAEkD,KAAKpG,cAAcgG,EAAMQ,QAAUN,GAEzB,UAAPA,EACLhD,EAAEkD,KAAKF,GAODN,aAAaa,IAAIR,IACvB/C,EAAEkD,KAAKH,GAEJ/C,EAAEwD,KAAK,IAClB,CAQA,SAASC,UAAUC,GACf,IAAK,IAAI9D,EAAI,EAAGA,EAAI8D,EAAK/D,OAAQC,IAAK,CAClC,MAAM+D,EAAMD,EAAK9D,GACjB,GAAW,MAAP+D,EAGJ,IAAK,MAAMZ,KAAOY,EACVC,OAAOC,UAAUC,eAAejE,KAAK8D,EAAKZ,KAC1CW,EAAK,GAAGX,GAAOY,EAAIZ,GAG/B,CACA,OAAOW,EAAK,EAChB,CAEA,SAASK,QAAQrE,GACb,OAAOsE,MAAMD,QAAQrE,EACzB,CAEA,SAASuE,cAAcvE,GACnB,OAAmC,IAA5BkE,OAAOM,KAAKxE,GAAKC,QAAgBD,EAAInC,cAAgBqG,MAChE,CAEA,SAASO,WAAWzE,GAChB,MAAsB,mBAARA,CAClB,CAEA,SAAS0E,cAAc1E,GACnB,MAA+C,oBAAxCkE,OAAOC,UAAUQ,SAASxE,KAAKH,EAC1C,CAEA,SAAS4E,QAAQZ,GAAQ,CACzB,SAASa,QAAQC,EAAYC,EAAYC,EAAmBC,GACxD,IAAIC,EAAUC,EACdL,EAAa5B,wBAAwB4B,GACjCG,GACAC,EAAWF,EACXG,EAAUF,IAGVC,EAAW,GACXC,EAAUH,GAEdD,EAAWK,MAAM,KAAK9G,SAAS+G,IAC3BP,EAAWlF,iBAAiByF,GAAK,SAAUC,GACvC,IAAKJ,EACD,OAAOC,EAAQG,GAEd,GAAIA,EAAEC,OAAQ,CACf,IAAI1E,EAAOyE,EAAEC,OACb,GAAI1E,EAAK2E,QAAQN,GACb,OAAOC,EAAQG,GAGnB,GADAzE,EAAOA,EAAK4E,QAAQP,GAChBrE,EACA,OAAOsE,EAAQG,EAEvB,CACJ,GAAE,GAEV,CAaA,SAASI,eAAeC,EAAUC,EAAYT,EAASU,GACnD,IAAIC,EAAWC,EACf,MAAMC,EAAOH,GAAOF,EACdM,EAAWN,EAASC,GACpBM,EAAS,IAAIlC,IACRiC,EAASE,MAAMH,EAAMhC,GAE1BoC,EAAeC,GACVJ,EAASE,MAAMH,EAAMK,GAehCV,EAASC,GAbO,IAAI5B,KAChB,IAKI,OAJA8B,EAAYE,EAAKE,OACjBH,EAAiBC,EAAKI,YACtBJ,EAAKE,OAASA,EACdF,EAAKI,YAAcA,EACZjB,EAAQgB,MAAMH,EAAMhC,EAC/B,CACA,QACIgC,EAAKE,OAASJ,EACdE,EAAKI,YAAcL,CACvB,EAGR,CAEA,SAASO,kBAAkB7G,EAAU8G,GACjC,OAAO,IAAIzG,SAAQ,CAAC5B,EAASM,KACzBgI,YAAW,KACP,IACItI,EAAQuB,EAAS0G,MAAMrI,MAC3B,CACA,MAAO2I,GACHjI,EAAOiI,EACX,IACDF,EAAG,GAEd,CAWAG,eAAeC,MAAMJ,GACjB,OAAO,IAAIzG,SAAS5B,GAAYsI,WAAWtI,EAASqI,IACxD,CAWA,SAASK,eAAeC,EAAS1I,EAAO2I,GACpC,MAAMvF,EAAQgB,iBAAiBsE,GAG/B,GAFA5H,OAAsB,aAAfsC,EAAMC,KAAqB,wBAAwBD,EAAMC,QAChEsF,UAAuDA,EAAWvF,EAAMN,UAAUC,SAAS,gBAAkBK,EAAME,oBACrGM,IAAV5D,EAAqB,CAErB,OADiBoD,EAAME,cAAgB,KAAOF,EAAMG,SAEhD,KAAK,EACDvD,GAAQ,EACR,MACJ,KAAK,EACDA,GAAQ2I,GAAW,KACnB,MACJ,KAAK,KACD3I,GAAQ,EAGpB,CACAoD,EAAME,cAAyB,MAATtD,EACtBoD,EAAMG,UAAYvD,CACtB,CAQA,SAAS4I,UAAUC,EAAMnF,EAAMoF,OAAelF,GAC1C,IAAImF,EAEAF,GAAQnF,EAAKlB,QAAQ,MAAQ,KAC5BuG,EAAKrF,GAAQA,EAAKuD,MAAM,KACzB4B,EAAOA,EAAKE,IAEhB,MAAM/I,EAAQ6I,EAAOA,EAAKnF,GAAQ,KAElC,OAAO1D,QAAqCA,EAAQ8I,CACxD,CAEA,SAASE,MAAMC,GACX,GAAIA,aAAenE,IACf,OAAOmE,EAEX,GAAmB,iBAARA,EAAkB,CACzB,MAAMC,EAAM,IAAIpE,IAChB,IAAK,MAAMtE,KAAKyI,EAAIhC,MAAM,KACtBiC,EAAIC,IAAI3I,EAAEkE,QAEd,OAAOwE,CACX,CACA,GAAI/C,MAAMD,QAAQ+C,GACd,OAAO,IAAInE,IAAImE,GAEnB,MAAM,IAAIhJ,MAAM,kCAAoCgJ,EACxD,CAiBA,SAAS5F,KAAKxB,GACV,OAAOkE,OAAOC,UAAUQ,SACnBxE,KAAKH,GACLO,QAAQ,oBAAqB,MAC7BgH,aACT,CAaA,SAASC,iBAAiB/H,EAAUgI,GAChC,IAAIC,EAAU,EACVC,EAAc,KAClB,MAAMX,EAAO9C,OAAO0D,OAAO,CACvBC,SAAU,GACVC,aAAc,IACdC,SAAU,IACVC,YAAa,GACdP,GACGI,EAAWI,KAAKC,IAAI,IAAKlB,EAAKa,UAC9BE,GAAYf,EAAKe,SACjBI,EAAc,IAAInE,KACpB,GAAI0D,EACAC,EAAc3D,EAEd0D,GAAW,MAEV,CAEDA,EAAU,EACV,MAAMU,EAAUpE,EAChB2D,EAAc,KAEd,MAAMU,EAAQpG,KAAKqG,MACnB,IACI7I,EAAS0G,MAAMrI,KAAMsK,EACzB,CACA,MAAO3J,GACH8J,QAAQ9J,MAAMA,EAClB,CACA,MAAM+J,EAAOvG,KAAKqG,MAAQD,EACpBI,EAAWR,KAAKS,IAAIT,KAAKC,IAAIL,EAAUW,EAAOxB,EAAKgB,aAAcD,GACjEY,EAAWV,KAAKC,IAAIL,EAAUY,EAAWD,GAK/ChC,YAAW,KAGPkB,EAAU,EACS,MAAfC,GAMAQ,EAAYhC,MAAMrI,KAAM6J,EAC5B,GACDgB,EACP,GAEJ,OAAOR,CACX,CAEA,IA+CIS,WAoBAC,WAQAC,eASAC,WAWAC,YA/FAC,KAAoB/E,OAAOgF,OAAO,CACpCC,UAAW,KACXC,SAAUxL,WACVP,QAASA,QACTD,cAAeA,cACfoK,iBAAkBA,iBAClBvI,OAAQA,OACRO,cAAeA,cACfK,qBAAsBA,qBACtBE,KAAMA,KACN0C,aAAcA,aACdF,iBAAkBA,iBAClB9D,MAAOA,MACP4B,WAAYA,WACZG,YAAaA,YACbC,cAAeA,cACfyC,wBAAyBA,wBACzBC,cAAeA,cACfY,OAAQA,OACRrD,gBAAiBA,gBACjBqG,UAAWA,UACXnG,iBAAkBA,iBAClByD,QAASA,QACTE,cAAeA,cACfE,WAAYA,WACZjH,MAAOA,MACPkH,cAAeA,cACfE,KAAMA,KACNC,QAASA,QACTa,eAAgBA,eAChBtD,eAAgBA,eAChBkE,kBAAmBA,kBACnBtE,eAAgBA,eAChB2E,MAAOA,MACPQ,MAAOA,MACPP,eAAgBA,eAChBpF,KAAMA;;;;;IAYR,SAAWoH,GAEPA,EAAgB,IAAI,MAEpBA,EAAiB,KAAI,OAErBA,EAAyB,aAAI,eAE7BA,EAAmB,OAAI,SAEvBA,EAAgB,IAAI,MAEpBA,EAAsB,UAAI,YAE1BA,EAAmB,OAAI,SAEvBA,EAAmB,OAAI,QAC1B,CAjBD,CAiBGA,aAAeA,WAAa,CAAC,IAGhC,SAAWC,GACPA,EAAwB,YAAI,cAC5BA,EAAmB,OAAI,SACvBA,EAAmB,OAAI,SACvBA,EAAmB,OAAI,QAC1B,CALD,CAKGA,aAAeA,WAAa,CAAC,IAGhC,SAAWC,GACPA,EAAmB,GAAI,KACvBA,EAAwB,QAAI,UAC5BA,EAAsB,MAAI,QAC1BA,EAAuB,OAAI,SAC3BA,EAAuB,OAAI,QAC9B,CAND,CAMGA,iBAAmBA,eAAiB,CAAC,IAGxC,SAAWC,GACPA,EAAoB,QAAI,GACxBA,EAAqB,SAAI,WACzBA,EAAmB,OAAI,SACvBA,EAAqB,SAAI,WACzBA,EAAiB,KAAI,OACrBA,EAAmB,OAAI,SACvBA,EAAkB,MAAI,OACzB,CARD,CAQGA,aAAeA,WAAa,CAAC,IAGhC,SAAWC,GACPA,EAAsB,SAAI,WAC1BA,EAAkB,KAAI,OACtBA,EAAuB,UAAI,YAC3BA,EAAiB,IAAI,KACxB,CALD,CAKGA,cAAgBA,YAAc,CAAC;;;;;;AAOlC,MAAMK,oBACF,WAAAxL,CAAYyL,EAAMC,EAAIC,GAClB1L,KAAK2L,SAAU,EACf3L,KAAKwL,KAAOA,EACZxL,KAAKyL,GAAKA,EACVzL,KAAK4L,SAAWJ,EAAK7B,QACrB,MAAMT,EAAOsC,EAAK7B,aACQ1F,IAAtBjE,KAAK4L,SAASH,GACdvC,EAAKuC,GAAMzL,KAAK6L,cAAgB5F,OAAO,CAAC,EAAGyF,IAI3C1L,KAAK6L,cAAgB5F,OAAO,CAAC,EAAGyF,EAAUxC,EAAKuC,IAC/CvC,EAAKuC,GAAMzL,KAAK6L,eAEpB7L,KAAK2L,QAAU3L,KAAK8L,gBAAgB,WAAW,EACnD,CAEA,IAAAC,GACI/L,KAAKwL,KAAKzC,QAAQ5F,UAAUqG,IAAI,UAAYxJ,KAAKyL,GACrD,CAeA,eAAAK,CAAgB/H,EAAMoF,GAClB,IAAI6C,EACJ,OAA2C,QAAnCA,EAAKhM,KAAK6L,cAAc9H,UAA0B,IAAPiI,EAAgBA,EAAK7C,CAC5E,CACA,eAAA8C,CAAgBlI,EAAM1D,GAClBL,KAAK6L,cAAc9H,GAAQ1D,CAC/B,CACA,UAAA6L,CAAW3H,GAAO,GACd,OAAOvE,KAAKiM,gBAAgB,YAAa1H,EAE7C,CACA,UAAA4H,CAAWC,GAEX,CACA,QAAAC,CAASD,GAET;;;;;GAUJ,MAAME,WAA+B,iBAAXC,QACX,OAAXA,QACAA,OAAOnG,SAAWA,QAClBmG,OAEEC,eAAuC,iBAAfC,YACX,OAAfA,YACAA,WAAWrG,QAAUA,QACrBqG,WAEEC,SAA2B,iBAATxE,MAA8B,OAATA,MAAiBA,KAAK9B,SAAWA,QAAU8B,KAElFyE,KAAOH,gBAAkBF,YAAcI,UAAYE,SAAS,cAATA,GAwBzD,SAASC,SAASxM,GACd,MAAMqD,SAAcrD,EACpB,OAAgB,MAATA,IAA2B,WAATqD,GAA8B,aAATA,EAClD,CA8DA,SAASoJ,SAASC,EAAMC,EAAO,EAAGrD,EAAU,CAAC,GACzC,IAAIsD,EAAUC,EAAUC,EAASC,EAAQC,EAASC,EAC9CC,EAAiB,EACjBC,GAAU,EACVC,GAAS,EACTC,GAAW,EAEf,MAAMC,GAAUX,GAAiB,IAATA,GAAoD,mBAA/BL,KAAKiB,sBAClD,GAAoB,mBAATb,EACP,MAAM,IAAIc,UAAU,uBASxB,SAASC,EAAWC,GAChB,MAAM7H,EAAO+G,EACPe,EAAUd,EAIhB,OAHAD,EAAWC,OAAWjJ,EACtBsJ,EAAiBQ,EACjBX,EAASL,EAAK1E,MAAM2F,EAAS9H,GACtBkH,CACX,CACA,SAASa,EAAWC,EAAalB,GAC7B,OAAIW,GACAhB,KAAKwB,qBAAqBd,GACnBV,KAAKiB,sBAAsBM,IAE/BxF,WAAWwF,EAAalB,EACnC,CAuBA,SAASoB,EAAaL,GAClB,MAAMM,EAAoBN,EAAOT,EAKjC,YAAyBrJ,IAAjBqJ,GACJe,GAAqBrB,GACrBqB,EAAoB,GACnBZ,GAPuBM,EAAOR,GAOGJ,CAC1C,CACA,SAASmB,IACL,MAAMP,EAAO5J,KAAKqG,MAClB,GAAI4D,EAAaL,GACb,OAAOQ,EAAaR,GAGxBV,EAAUY,EAAWK,EAzBzB,SAAuBP,GACnB,MACMS,EAAsBT,EAAOR,EAC7BkB,EAAczB,GAFMe,EAAOT,GAGjC,OAAOG,EACDtD,KAAKS,IAAI6D,EAAatB,EAAUqB,GAChCC,CACV,CAkBuCC,CAAcX,GACrD,CACA,SAASQ,EAAaR,GAIlB,OAHAV,OAAUpJ,EAGNyJ,GAAYT,EACLa,EAAWC,IAEtBd,EAAWC,OAAWjJ,EACfmJ,EACX,CAcA,SAASuB,KAAazI,GAClB,MAAM6H,EAAO5J,KAAKqG,MACZoE,EAAaR,EAAaL,GAKhC,GAJAd,EAAW/G,EAEXgH,EAAWlN,KACXsN,EAAeS,EACXa,EAAY,CACZ,QAAgB3K,IAAZoJ,EACA,OAnEZ,SAAqBU,GAMjB,OAJAR,EAAiBQ,EAEjBV,EAAUY,EAAWK,EAActB,GAE5BQ,EAAUM,EAAWC,GAAQX,CACxC,CA4DmByB,CAAYvB,GAEvB,GAAIG,EAGA,OADAJ,EAAUY,EAAWK,EAActB,GAC5Bc,EAAWR,EAE1B,CAIA,YAHgBrJ,IAAZoJ,IACAA,EAAUY,EAAWK,EAActB,IAEhCI,CACX,CAIA,OA/GAJ,GAAQA,GAAQ,EACZH,SAASlD,KACT6D,IAAY7D,EAAQ6D,QACpBC,EAAS,YAAa9D,EACtBwD,EAAUM,EAAStD,KAAKC,KAAKT,EAAQwD,SAAW,EAAGH,GAAQG,EAC3DO,EAAW,aAAc/D,IAAYA,EAAQ+D,SAAWA,GAuG5DiB,EAAUG,OAnCV,gBACoB7K,IAAZoJ,GApDR,SAAqB5B,GACjB,GAAIkC,EACA,OAAOhB,KAAKwB,qBAAqB1C,GAErCsD,aAAatD,EACjB,CAgDQuD,CAAY3B,GAEhBE,EAAiB,EACjBN,EAAWK,EAAeJ,EAAWG,OAAUpJ,CACnD,EA8BA0K,EAAUM,MA7BV,WACI,YAAmBhL,IAAZoJ,EAAwBD,EAASmB,EAAapK,KAAKqG,MAC9D,EA4BAmE,EAAUO,QA3BV,WACI,YAAmBjL,IAAZoJ,CACX,EA0BOsB,CACX,CAiDA,SAASQ,SAASpC,EAAMC,EAAO,EAAGrD,EAAU,CAAC,GACzC,IAAI6D,GAAU,EACVE,GAAW,EACf,GAAoB,mBAATX,EACP,MAAM,IAAIc,UAAU,uBAMxB,OAJIhB,SAASlD,KACT6D,EAAU,YAAa7D,IAAYA,EAAQ6D,QAAUA,EACrDE,EAAW,aAAc/D,IAAYA,EAAQ+D,SAAWA,GAErDZ,SAASC,EAAMC,EAAM,CACxBQ,UACAE,WACAP,QAASH,GAEjB;;;;;GAOA,MAAMoC,aAAe,IACfC,WAAa,IACbC,gBAAkB,IAAIC,OAAO7M,YAFd,KAEyC,KACxD8M,eAAiB,IAAID,OAAO7M,YAFf,KAEwC,KAC3D,MAAM+M,wBAAwBlE,oBAC1B,WAAAxL,CAAYyL,GACRkE,MAAMlE,EAAM,SAAU,CAClBmE,aAAc,KACdC,WAAW,EACXC,YAAY,EACZC,SAAS,EACTC,OAAO,EACPC,qBAAqB,EACrBC,eAAe,EACfC,WAAW,EACXC,YAAY,EACZC,KAAM,MACNC,QAAQ,IAEZrQ,KAAKsQ,eAAiB,IAC1B,CACA,IAAAvE,GACI2D,MAAM3D,OACN,MAAM4D,EAAe3P,KAAK8L,gBAAgB,gBACtC6D,IACA3P,KAAKuQ,WAAa9L,iBAAiBkL,GACnC5I,QAAQ/G,KAAKuQ,WAAY,QAASzD,UAAUtF,IAExCxH,KAAKwQ,YAAYxQ,KAAKuQ,WAAWlQ,MAAM0E,OAAQ,CAAC,EAAE,GACnD,MAEX,CACA,eAAAkH,CAAgBlI,EAAM1D,GAGlB,GADAqP,MAAMzD,gBAAgBlI,EAAM1D,GAEnB,SADD0D,EAEA/D,KAAKwL,KAAKiF,WAAuB,SAAVpQ,EAAmB,OAAS,MACnDL,KAAKwL,KAAKkF,cAGtB,CACA,oBAAAC,CAAqBC,EAAQC,EAAYC,GACrC,OAAO9Q,KAAKwL,KAAKuF,uBAAsB,IAC5B/Q,KAAKgR,iBAAiBJ,EAAQC,EAAYC,IAEzD,CACA,gBAAAE,CAAiBJ,EAAQC,EAAYC,GACjC,IAAIG,EAAOC,EAAMC,EAAQ,EACzB,MAAM5G,EAAQpG,KAAKqG,MACbgB,EAAOxL,KAAKwL,KACZI,EAAWJ,EAAK7B,QAEhByH,EAAmBxF,EAASyF,aAC5BnI,EAAOjD,OAAO,CAAC,EAAG2F,EAASgF,OAAQE,GACnCQ,EAAyB,SAAdpI,EAAKkH,KAChBD,IAAejH,EAAKiH,aAAeU,EAEzC,GAAsB,iBAAXD,EAAqB,CAC5B,GAAe,KAAXA,EAGA,OAFApF,EAAK+F,QAAQ,yEACbvR,KAAKwR,cAOLP,EAJA/H,EAAK6G,MAIGa,EACHtJ,MAAM,IAINmK,IAAI/O,aACJgP,QAAO,SAAUC,EAAGC,GAGrB,OAAOD,EAAI,MAAQC,EAAI,MAAQA,CACnC,GAAG,IAGKlP,YAAYkO,GAExB,MAAMiB,EAAK,IAAItC,OAAO0B,EAAO,KACvBa,EAAc,IAAIvC,OAAO7M,YAAYkO,GAAS,MACpDA,EAAUmB,IACN,IAAKA,EAAKC,MACN,OAAO,EAGX,MAAMC,EAAOF,EAAKC,MAEZE,EAAMD,EAAKhB,MAAMY,GA6BvB,OA5BIK,GAAOhJ,EAAKgH,YAGRgB,EADAhI,EAAK6G,MACEoC,uBAAuBF,EAAMC,GAAK,GAKlCD,EAAKxP,QAAQqP,GAAa,SAAUtP,GACvC,MAtGP,IAsG6BA,EArG/B,GAsGK,IAGJuP,EAAKK,mBAAqB7P,WAAW2O,GAEhCzO,QAAQ6M,gBAAiB,UACzB7M,QAAQ+M,eAAgB,cAYxB0C,CAAG,CAEpB,CA6DA,OA5DA1G,EAAKiF,WAAavH,EAAKkH,KAEvBpQ,KAAKsQ,eAAiB+B,UACtB7G,EAAKzC,QAAQ5F,UAAUmP,OAAO,uBAAwBhB,GACtD9F,EAAKzC,QAAQ5F,UAAUmP,OAAO,qBAAsBhB,GACpD9F,EAAKzC,QAAQ5F,UAAUmP,OAAO,iCAAkCpJ,EAAK+G,eAErEzE,EAAKmB,KAAK4F,cAAgB,EAC1B/G,EAAKgH,OAAOT,WACDA,EAAKd,aACLc,EAAKK,mBACZL,EAAKQ,cAAgB,CAAC,IAM1B/G,EAAKiH,UAAUzH,eAAe0H,IAE9B9G,EAASyF,cAAe,EACxB7F,EAAKgH,OAAOT,IACR,GAAI5B,GAA+B,MAAjB4B,EAAKY,SACnB,OAEJ,IAAIT,EAAMtB,EAAOmB,GACjB,GAAY,SAARG,EAIA,OAHAH,EAAKS,OAAM,SAAU3R,GACjBA,EAAEoQ,OAAQ,CACd,IAAG,GACI,OAEX,IAAI2B,GAAkB,GACjB/B,GAAsB,WAARqB,IAAqBH,EAAKc,OAAO5B,QAChDiB,GAAM,EACNU,GAAkB,GAElBV,IACAf,IACAY,EAAKd,OAAQ,EACbc,EAAKe,cAAcC,IACXA,IAAMhB,IACNgB,EAAER,eAAiB,IAGnBrJ,EAAK2G,YAAe+C,GAAoBG,EAAEC,WAC1CD,EAAEE,aAAY,EAAM,CAChBC,aAAa,EACbC,UAAU,IAEdJ,EAAEK,qBAAsB,EAC5B,IACD,GACP,IAEJxH,EAASyF,aAAeD,EACV,IAAVD,GAAejI,EAAKmH,QAAUiB,GAC9B9F,EAAKmB,KAAK8F,UAAUzH,eAAeqF,QAGvC7E,EAAK+F,QAAQ,WAAWN,YAAgBE,cAAkBhN,KAAKqG,MAAQD,SAChE4G,CACX,CAIA,WAAAX,CAAYI,EAAQjH,GAChB,OAAO3J,KAAK2Q,qBAAqBC,GAAQ,EAAOjH,EACpD,CAIA,cAAA0J,CAAezC,EAAQjH,GACnB,OAAO3J,KAAK2Q,qBAAqBC,GAAQ,EAAMjH,EACnD,CAIA,YAAA+G,GACI,IAAI1E,EACJ,MAAMR,EAAOxL,KAAKwL,KACdA,EAAKiF,YACLzQ,KAAKsQ,iBAC2B,QAA9BtE,EAAKR,EAAK7B,QAAQiH,cAA2B,IAAP5E,OAAgB,EAASA,EAAG4D,WAEpE5P,KAAK2Q,qBAAqBtI,MAAMrI,KAAMA,KAAKsQ,gBAG3C9E,EAAK8H,QAAQ,oCAErB,CAIA,WAAA9B,GACI,MAAMhG,EAAOxL,KAAKwL,KAGlBA,EAAK+H,cAAa,GAIlB/H,EAAKiH,UAAUzH,eAAe0H,WAEvBlH,EAAKmB,KAAKsE,aACVzF,EAAKmB,KAAK4F,cACjB/G,EAAKgH,OAAOT,WAKDA,EAAKd,aACLc,EAAKQ,qBACLR,EAAKK,mBAKRL,EAAKqB,qBAAuBrB,EAAKiB,UACjCjB,EAAKkB,aAAY,EAAO,CACpBC,aAAa,EACbC,UAAU,WAGXpB,EAAKqB,mBAAmB,IAEnC5H,EAAKiF,WAAa,KAClBzQ,KAAKsQ,eAAiB,KACtB9E,EAAKzC,QAAQ5F,UAAUqQ,OAEvB,oBAAqB,sBAErBhI,EAAK+H,cAAa,EACtB,EASJ,SAASpB,uBAAuBF,EAAMvK,EAAS+L,GAAe,GAC1D,MAAMC,EAAkB,GAExB,IAAK,IAAIC,EAAkB,EAAGA,EAAkBjM,EAAQvF,OAAQwR,IAAmB,CAC/E,MAAMC,EAGNlM,EAAQiM,GAAiBxR,QACA,IAApBwR,EAAwB,EAAI,IAC5BD,EAAgBA,EAAgBvR,OAAS,IAAM,GACpDuR,EAAgBhO,KAAKkO,EACzB,CAEA,MAAMC,EAAY5B,EAAK3K,MAAM,IAc7B,OAbImM,EAEAC,EAAgBlT,SAAQ,SAAUsT,GAC9BD,EAAUC,GA1RD,IA0RqBD,EAAUC,GAzRjC,GA0RX,IAIAJ,EAAgBlT,SAAQ,SAAUsT,GAC9BD,EAAUC,GAAK,SAAWD,EAAUC,GAAK,SAC7C,IAGGD,EAAU7N,KAAK,GAC1B;;;;;GAOA,MAAM+N,kBAAoB,IAC1B,MAAMC,wBAAwBzI,oBAC1B,WAAAxL,CAAYyL,GACRkE,MAAMlE,EAAM,SAAU,CAAC,EAC3B,CACA,qBAAAyI,CAAsBlR,GAClB,IAAIiJ,EACJ,IAAIvI,EAAQ,KACZ,GAAIV,GAAqB,MAAbA,EAAKW,KACbD,EAAQV,MAEP,CAED,MAAMmR,EAA8C,QAAvClI,EAAKhM,KAAKwL,KAAK2I,0BAAuC,IAAPnI,OAAgB,EAASA,EAAGzI,cAAc,gBAClG2Q,IACAzQ,EAAQyQ,EAEhB,CACA,OAAOzQ,CACX,CAEA,kBAAA2Q,GACI,IAAIpI,EAGJ,SAD6B,QADhBA,EAAKhM,KAAKwL,KAClB2I,0BAAuC,IAAPnI,OAAgB,EAASA,EAAGzI,cAAc,4BAEnF,CACA,UAAA4I,CAAWC,GACP,MAAM9G,EAAQ8G,EAAK9G,MACbkG,EAAOxL,KAAKwL,KACZtC,EAAOkD,EAAKzC,QACZ0K,GAAY/O,EAAMK,SAAWuD,EAAKoL,aAClCC,EAAWvU,KAAKiU,sBAAsB3O,EAAMmC,QAC5C+M,EAAgBD,GAAYvU,KAAKoU,qBACjCK,EAAgBvL,EAAKwL,qBAE3B,IAAIC,EAAWC,EAAYvP,cAAcC,GAAQyM,EAAO3F,EAAK2F,KAAM8C,GAAU,EAE7E,IAAKrJ,EAAKsJ,YAEN,OAAO,EAGX,IAAyC,IAArCtJ,EAAKuJ,WAAW,UAAW3I,GAC3B,OAAO,EAGX,IAA2D,IAAvDZ,EAAKwJ,YAAY,2BAA4B5I,GAC7C,OAAO,EAGX,IAAK2F,EAAM,CACP,MAAMkD,EAAczJ,EAAK0J,gBAAkB1J,EAAK2J,gBAC1CC,EAAY5J,EAAK6J,gBACvB,IAAKJ,GAAeG,GAA2B,cAAdR,EAG7B,OAFAQ,EAAU7D,QAAQ,sCAClB6D,EAAUE,YAGdX,EAAYM,GAAeG,EACvBT,IACAA,EAAUY,WACVxD,EAAOvG,EAAK0J,eACZnD,EAAKR,QAAQ,wCAErB,CACA,MAAMiE,EAAYzD,EAAKyD,YACvB,GAAIhK,EAAKiK,WAAY,CAIjB,GAAIjB,EAAe,CAIf,OAAQI,GACJ,IAAK,QACDL,EAASmB,OACTlK,EAAK+J,WACL,MACJ,IAAK,SACDxD,EAAK4D,UACLnK,EAAK+J,WAGb,MACJ,CAEA,GAAIrM,EAAK0M,aACgB,IAArBhB,EAAUzS,QACV,OAAOX,KAAKoT,KACXL,EAAU,CAEX,MAAMsB,EAAQ1R,KAAKqG,MACfqL,EAAQrK,EAAKsK,oBA9FP,MA+FNtK,EAAKuK,oBAAsB,IAE/BvK,EAAKsK,oBAAsBD,EAC3BrK,EAAKuK,qBAAuBnB,EAC5B,MAAMoB,EAAYxK,EAAKyK,aAAazK,EAAKuK,oBAAqBvK,EAAK2J,iBAKnE,OAJIa,GACAA,EAAUV,WAAU,EAAM,CAAEhQ,MAAOA,SAEvCA,EAAM4Q,gBAEV,CAEA,OAAQtB,GACJ,IAAK,QACG7C,EAAKoE,aACDpE,EAAKqE,aACLxB,EAAY,WAEP7C,EAAKsE,cAAa,KACvBzB,EAAY,QAGpB,MACJ,IAAK,YACG7C,EAAKiB,WACL4B,EAAY,YAEhB,MACJ,IAAK,aACD,IAAK7C,EAAKiB,UAAYjB,EAAKsE,cAAa,GACpCzB,EAAY,WAEX,GAAIH,IAAkBvJ,YAAYoL,WACnC7B,IAAkBvJ,YAAYqL,SAG9B,OAFAjR,EAAM4Q,iBACN1K,EAAKgL,cACE,EAKnB,OAAQ5B,GACJ,IAAK,IACL,IAAK,MAED7C,EAAKkB,aAAY,GACjB,MACJ,IAAK,IACL,IAAK,WACDlB,EAAKkB,aAAY,GACjB,MACJ,IAAK,IAIGlB,EAAK9I,UAAU,YACf8I,EAAK0E,iBAGL1E,EAAKuD,WAAU,EAAM,CAAEhQ,MAAOA,IAElC,MACJ,IAAK,QACDyM,EAAKuD,WAAU,EAAM,CAAEhQ,MAAOA,IAC9B,MACJ,IAAK,YACL,IAAK,YACL,IAAK,aACL,IAAK,UACL,IAAK,YACL,IAAK,MACL,IAAK,OACL,IAAK,cACL,IAAK,eACL,IAAK,iBACL,IAAK,eACL,IAAK,WACL,IAAK,SACDyM,EAAK2E,SAAS9B,EAAW,CAAEP,SAAUA,EAAU/O,MAAOA,IACtD,MACJ,QACIuP,GAAU,EAEtB,KACK,CACD,MAAMN,EAAWvU,KAAKiU,sBAAsB,MACtC0C,EAAepC,EAAWA,EAAS7Q,MAAQ6Q,EAASrR,QAAU,GAC9DsR,EAAgBD,GAAYvU,KAAKoU,qBACjCwC,EAAgBrC,GAA6B,aAAjBoC,EAClC,GAAInC,EAAe,CACf,GAAkB,WAAdI,EAOA,OALA7C,EAAK4D,UAEL5D,EAAK8E,SAAS,uBACdrL,EAAK+J,gBACL/J,EAAKsL,UAAUtL,EAAKuL,cAInB,GAAkB,UAAdnC,EAGL,YADA7C,EAAK8E,SAAS,WAAWjC,yBASjC,MACK,GAAIL,GAEoB,IAArBK,EAAUzS,QAAgByU,EAI1B,OAHArC,EAASyC,QACTzC,EAASlU,MAAQ,GACjB0R,EAAK8E,SAAS,gBAAgBjC,MACvB,EAYf,OATkB,QAAdA,GACAA,EAAY,aACZC,GAAU,GAES,cAAdD,IACLA,EAAYpJ,EAAKuL,aAAe,EAAI,YAAc,GAClDlC,GAAU,GAGND,GACJ,IAAK,IACL,IAAK,MAED7C,EAAKkB,aAAY,GACjB,MACJ,IAAK,IACL,IAAK,WACDlB,EAAKkB,aAAY,GACjB,MACJ,IAAK,IACyB,IAAtBzH,EAAKuL,cAAsBhF,EAAK9I,UAAU,aAC1C8I,EAAK0E,iBACL5B,GAAU,GAELN,GAA6B,aAAjBoC,IACjBpC,EAAS0C,QAITpC,GAAU,GAEd,MACJ,IAAK,KACGN,IAAaC,GAAiBoC,IAC9BrC,EAASyC,QACTnC,GAAU,GAEd,MACJ,IAAK,QACDrJ,EAAK+J,YACsB,IAAtB/J,EAAKuL,cAAsBvB,IAAczD,EAAKsE,gBAC/CtE,EAAKkB,aAAalB,EAAKqE,cACvBvB,GAAU,GAELN,IAAaC,GAAiBoC,IACnCrC,EAASyC,QACTnC,GAAU,GAEd,MACJ,IAAK,SACDrJ,EAAK+J,WACLxD,EAAKmF,IAAI,yBACL1L,EAAK2L,aAAe1C,IAAkBvJ,YAAYkM,OAClDrF,EAAKmF,IAAI,6BACT1L,EAAKgL,YAAW,GAChBhL,EAAK+J,WACLV,GAAU,GAEd,MACJ,IAAK,YACDrJ,EAAK+J,WACDC,GAAazD,EAAKqE,aAClBrE,EAAKkB,aAAY,IAEXuC,GAAahK,EAAKuL,aAAe,EACvCvL,EAAKsL,UAAUtL,EAAKuL,aAAe,GAE9BtC,IAAkBvJ,YAAYkM,MACnC5L,EAAKgL,YAAW,GAEpB3B,GAAU,EACV,MACJ,IAAK,aACDrJ,EAAK+J,WACDC,IAAczD,EAAKqE,aACnBrE,EAAKkB,eAECuC,GACNhK,EAAKuL,aAAevL,EAAK6L,QAAQlV,OAAS,GAC1CqJ,EAAKsL,UAAUtL,EAAKuL,aAAe,GAEvClC,GAAU,EACV,MACJ,IAAK,OAEDrJ,EAAK+J,YACAC,GAAahK,EAAKuL,aAAe,GAClCvL,EAAKsL,UAAU,GAEnBjC,GAAU,EACV,MACJ,IAAK,MAEDrJ,EAAK+J,YACAC,GAAahK,EAAKuL,aAAevL,EAAK6L,QAAQlV,OAAS,GACxDqJ,EAAKsL,UAAUtL,EAAK6L,QAAQlV,OAAS,GAEzC0S,GAAU,EACV,MACJ,IAAK,YACL,IAAK,UACL,IAAK,YACL,IAAK,cACL,IAAK,eACL,IAAK,iBACL,IAAK,eACL,IAAK,WACL,IAAK,SACD9C,EAAK2E,SAAS9B,EAAW,CAAEP,SAAUA,EAAU/O,MAAOA,IAItDuP,GAAU,EACV,MACJ,QACIA,GAAU,EAEtB,CACIA,GACAvP,EAAM4Q,gBAGd;;;;;GAQJ,MAAMoB,wBAAwB/L,oBAC1B,WAAAxL,CAAYyL,GACRkE,MAAMlE,EAAM,SAAU,CAAC,GACvBxL,KAAKuX,aAAe,IAAIpS,IAAI,CACxB,YAEA,SACA,YAEJnF,KAAKwX,OAAShM,EAAO,aACzB,CACA,IAAAO,GACI,MAAMP,EAAOxL,KAAKwL,KAElB,GAAIA,EAAKvC,UAAU,eAAiB,EAAG,CAEnC,MAAMsO,EAAevX,KAAKuX,aACpBC,EAASxX,KAAKwX,OACpB5P,eAAe4D,EAAM,aAAa,SAAUzH,EAAM0T,GAE9C,GAAIF,EAAaxR,IAAIhC,GACjB,OAAOyH,EAAKlD,YAAY+J,WAE5B,MAAM9H,EAAQpG,KAAKqG,MACb0H,EAAM1G,EAAKlD,YAAY+J,WAE7B,OADA7G,EAAKqL,SAAS,GAAGW,iBAAsBzT,YAAeI,KAAKqG,MAAQD,QAAa8H,UAAU,IACnFH,CACX,GACJ,CACJ,CACA,UAAA/F,CAAWC,GAEPpM,KAAKwL,KAAKqL,SAAS,GAAG7W,KAAKwX,uBAAwBpL,EAEvD;;;;;GAQJ,MAAMsL,mBAAqB,EAIrBC,WAAa,GAIbC,WAAa,GAKbC,iBAAmB,EAEnBC,oBAAsB,EAItBC,SAAW,IAAIxI,OAAO,SAOtByI,SAAW,CACbC,UAAW,CACPtX,MAAO,6BAEPuX,QAAS,8BAIT7H,OAAQ,wBACR8H,iBAAkB,qBAElBC,kBAAmB,sBAEnBC,aAAc,8CAEdC,aAAc,qBACdC,eAAgB,eAChBC,aAAc,2BACdC,aAAc,oBACdC,eAAgB,eAChBC,aAAc,sBACdC,OAAQ,gBACRC,WAAY,qBACZC,WAAY,uBACZC,IAAK,sBAETC,aAAc,CACVrY,MAAO,mCACPuX,QAAS,oCACT7H,OAAQ,8BACR8H,iBAAkB,2BAClBC,kBAAmB,4BACnBC,aAAc,oDACdC,aAAc,6BACdC,eAAgB,uBAChBC,aAAc,6BACdC,aAAc,qBACdC,eAAgB,uBAChBC,aAAc,gCACdC,OAAQ,4BACRC,WAAY,4BACZC,WAAY,0BACZC,IAAK,uBAIPE,0BAA4B,IAAI9T,IAAI,CACtC,UACA,UACA,cACA,YACA,YACA,WACA,WACA,UACA,UAUE+T,mBAAqB,CACvB,IAAK,eACL,IAAK,SACLC,IAAK,SACLC,UAAW,OACXC,UAAW,OACXC,WAAY,QACZC,QAAS,KACTC,UAAW,SACX,IAAK,cACLC,OAAQ,cACRC,IAAK,UACLC,KAAM,WACN,cAAe,OACf,eAAgB,QAChB,iBAAkB,OAClB,eAAgB,QAChB,IAAK,YACLC,SAAU,YACVC,SAAU,WACVC,OAAQ,SACR,IAAK,WACLC,SAAU,YAMd,SAASC,qBAAqB/I,GAC1B,OAAIA,aAAiB1B,OACV,SAAUwC,GACb,OAAOd,EAAMzP,KAAKuQ,EAAKC,MAC3B,GAEJ7Q,OAAwB,iBAAV8P,EAAoB,gCAAgCA,KAE3D,SAAUc,GACb,OAAOA,EAAKC,QAAUf,CAG1B,EACJ,CAEA,SAASgJ,0BAA0BzX,GAC/BA,EAAIE,YAAYF,GAChB,MAAM0X,EAAU,IAAI3K,OAAO,IAAM/M,EAAG,KACpC,OAAO,SAAUuP,GACb,OAAOmI,EAAQ1Y,KAAKuQ,EAAKC,MAC7B,CACJ,CAEA,SAASmI,gBAAgBxI,EAAGC,GACxB,MAAMwI,EAAIzI,EAAEK,MAAMvI,cACZ4Q,EAAIzI,EAAEI,MAAMvI,cAClB,OAAO2Q,IAAMC,EAAI,EAAID,EAAIC,EAAI,GAAK,CACtC,CAaA,SAASC,gBAAgBC,GACrB,IAAIvO,EAAIwO,EAAIC,EACZ,MAAMC,QAAEA,EAAOC,QAAEA,EAAU,CAAC,EAACC,YAAEA,EAAc,GAAEjI,SAAEA,GAAa4H,EAC9D,GAAgB,SAAZG,EACA,MAAM,IAAIpa,MAAM,4CAA4Coa,KAEhE,GAAIE,GAAeA,EAAYC,SAAS,YACpC,MAAM,IAAIva,MAAM,mDAAmDsa,KAEvE,IAAIE,EAAcH,EAClB,GAAIA,EAAQla,EAAG,CAGX,MAAMY,EAAM,uEACZoJ,QAAQsQ,KAAK1Z,GACbyZ,EAAc,CAAC,EACf,IAAK,MAAOvV,EAAKlF,KAAU+F,OAAO4U,QAAQL,GACtCG,EAAYza,GAASkF,CAE7B,CACA,MAAM0V,EAAkBL,EAAYnJ,KAAKjK,GAAMsT,EAAYtT,KACrD0T,EAAc,GACdC,EAAe,CAAC,EAChBC,EAAiB,CAAC,EAClBC,EAA4C,QAA7BrP,EAAK8O,EAAiB,WAAsB,IAAP9O,EAAgBA,EAAK,MACzEsP,EAAsD,QAAlCd,EAAKM,EAAsB,gBAAsB,IAAPN,EAAgBA,EAAK,WACzF,IAAK,MAAOe,EAAOC,KAAc7I,EAASqI,UAAW,CAKjD,MAAOS,EAAUvV,EAAMwV,EAAS,CAAC,GAAKF,EAEtCA,EAAU,GAAK,KACK,MAAhBA,EAAU,KACVA,EAAU,GAAK,MAKnBtV,EAAK1F,SAAQ,CAAC8I,EAAKqS,KACfD,EAAOT,EAAgBU,IAAkBrS,CAAG,IAKhD8R,EAAeG,GAASG,EACxB,MAAMnW,EAAMmW,EAAOL,GACR,MAAP9V,IACA4V,EAAa5V,GAAOmW,GAExB,IAAIE,EAAa,KACjB,GAAiB,OAAbH,QACC,GAAwB,iBAAbA,GAEZ,GADAG,EAAaR,EAAeK,QACTxX,IAAf2X,EACA,MAAM,IAAItb,MAAM,yDAAyDmb,WAK7E,GADAG,EAAaT,EAAaM,QACPxX,IAAf2X,EACA,MAAM,IAAItb,MAAM,uDAAuDmb,KAG3EG,GACwC,QAAvCnB,EAAKmB,EAAWN,UAAsC,IAAPb,IAAsBmB,EAAWN,GAAoB,IACrGM,EAAWN,GAAkB5V,KAAKgW,IAGlCR,EAAYxV,KAAKgW,EAEzB,CACAnB,EAAO5H,SAAWuI,CACtB,CAUA,SAASW,qBAAqBtB,GAC1B,IAAIG,QAAEA,EAAOoB,SAAEA,EAAW,EAACnB,QAAEA,EAAOoB,UAAEA,GAAcxB,EACpDpZ,OAAoB,IAAb2a,EAAgB,sCAAsCA,KAC7D,IAAIhB,EAAcH,EACdqB,EAAc,CAAC,EACnB,GAAIlB,EACA,IAAK,MAAOvV,EAAKlF,KAAU+F,OAAO4U,QAAQF,GACtCkB,EAAY3b,GAASkF,EAK7B,GAAIuV,GAAeA,EAAYra,EAAG,CAC9B,MAAMY,EAAM,uEACZoJ,QAAQsQ,KAAK1Z,IACZyZ,EAAakB,GAAe,CAACA,EAAalB,EAC/C,CAGA,GAAwB,MAApBP,EAAO0B,UAAmB,CAC1B,MAAM5a,EAAM,8FACZ,GAAiB,MAAb0a,EACA,MAAM,IAAIzb,MAAMe,GAGhBoJ,QAAQsQ,KAAK1Z,GACb0a,EAAY,CAAErY,KAAM6W,EAAO0B,kBACpB1B,EAAO0B,SAEtB,CACgB,SAAZvB,GACAJ,gBAAgBC,UAEbA,EAAOG,eACPH,EAAOuB,gBACPvB,EAAOI,eACPJ,EAAOwB,iBACPxB,EAAOK,aAiCVD,GAAWoB,IAhCf,SAASG,EAAMC,GACX,IAAK,MAAMpK,KAAQoK,EAGf/V,OAAOgW,oBAAoBrK,GAAMvR,SAAS6b,IACtC,MAAMhc,EAAQ0R,EAAKsK,GAEnB,IAAIC,EAAWD,EASf,GARI1B,GAAoC,MAAzBqB,EAAYK,KACvBC,EAAWN,EAAYK,GACnBC,IAAaD,IACbtK,EAAKuK,GAAYjc,SACV0R,EAAKsK,KAIhBN,GACiB,iBAAV1b,GACgB,MAAvB0b,EAAUO,GAAmB,CAC7B,MAAMC,EAAWR,EAAUO,GAAUjc,GACrC,GAAgB,MAAZkc,EACA,MAAM,IAAIjc,MAAM,qBAAqBgc,MAAajc,gBAAoB0b,EAAUO,OAEpFvK,EAAKuK,GAAYC,CACrB,KAGAxK,EAAKY,UACLuJ,EAAMnK,EAAKY,SAGvB,CAEIuJ,CAAM3B,EAAO5H,SAErB;;;;;GAOA,MAAM6J,aAAe,gCACrB,MAAMC,qBAAqBlR,oBACvB,WAAAxL,CAAYyL,GACRkE,MAAMlE,EAAM,MAAO,CACfkR,aAAc,KAKdC,aAAa,EACbC,cAAe,MACfC,kBAAmB,OACnBC,iBAAiB,EACjBC,qBAAqB,EACrBC,oBAAoB,EACpBC,iBAAiB,EACjBC,kBAAkB,EAClBC,mBAAmB,EACnBC,kBAAkB,EAClBC,wBAAwB,EACxBC,QAAQ,EACRC,kBAAmB,GAEnBC,YAAa,EAEbC,eAAgB,KAEhBC,UAAW,KACXC,KAAM,KACNC,QAAS,KAETC,UAAW,KACXC,SAAU,KACVC,WAAY,KACZC,KAAM,KACNC,UAAW,OAGfje,KAAKke,QAAU,KACfle,KAAKme,eAAiB,KACtBne,KAAKoe,eAAiB,EACtBpe,KAAKqe,uBAAyB,KAC9Bre,KAAKse,eAAiB,KACtBte,KAAKue,gBAAiB,EACtBve,KAAKwe,iBAAmB,EACxBxe,KAAKye,wBAA0BtP,SAASnP,KAAK0e,gBAAiB,GAClE,CACA,IAAA3S,GACI2D,MAAM3D,OAON,MAAMP,EAAOxL,KAAKwL,KACZmT,EAAUnT,EAAK7B,QAAQiV,IAEzBD,EAAQjB,WACR3W,QAAQyE,EAAKzC,QAAS,yBAA0B/I,KAAK6e,YAAYC,KAAK9e,OAGtE2e,EAAQd,WACR9W,QAAQyE,EAAKzC,QAAS,oCAAqC/I,KAAK+e,YAAYD,KAAK9e,MAEzF,CAEA,UAAAgf,GAEI,MAAMC,EAAMjf,KAAKme,eACjBne,KAAKoe,eAAiB,EAClBa,IACAA,EAAIC,SAAS,4DAA4D,GACzElf,KAAKme,eAAiB,KAE9B,CAEA,aAAAgB,CAAcjN,GACV,IAAY,IAARA,EACA,OAAO,EAEN,GAAIA,aAAe/M,IACpB,OAAO+M,EAAIkN,KAAO,GAAIlN,EAErB,IAAY,IAARA,EACL,OAAO,IAAI/M,IAAI,CAAC,OAAQ,SAAU,UAEjC,GAAmB,iBAAR+M,GAAoB3L,QAAQ2L,GAExC,OADAA,EAAM7I,MAAM6I,IACDkN,KAAO,GAAIlN,EAE1B,MAAM,IAAI5R,MAAM,uCAAyC4R,EAC7D,CAIA,eAAAmN,CAAgB7X,EAAG8X,GACf,MAAMC,EAAK/X,EAAEgY,QACb,QAAKF,IAGqB,IAAjBA,EAAQF,KACNG,EAAK,IACN,SACAA,EAAK,KACD,QACA,OAEY,IAAjBD,EAAQF,MAAcE,EAAQvZ,IAAI,QAChC,OAIAwZ,EAAK5H,GAAiB,QAAU,SAG/C,CAMA,gBAAA8H,CAAiBjY,GAEb,IAAIwE,EAIJ,MAAM2S,EAAU3e,KAAK4L,SAASgT,IACxBc,EAAsC,QAAhC1T,EAAK2S,EAAQ/B,qBAAkC,IAAP5Q,EAAgBA,EAAK,MACnE2T,EAAU,CAAC,MAAO,OAAQ,WAAY,YAAY9E,SAAS6E,GAC3DE,EAAU,CAAC,MAAO,OAAQ,WAAY,YAAY/E,SAAS6E,GAC3DG,EAAU,CAAC,MAAO,OAAQ,WAAY,YAAYhF,SAAS6E,GACjE,IAAIxN,EAAMyM,EAAQ9B,kBAyBlB,OAxBI8B,EAAQ7B,kBACJpd,OACI8H,EAAE/B,QAAUka,IACZzN,EAAM,QAEN1K,EAAE5B,SAAWia,IACb3N,EAAM,QAEN1K,EAAE/B,QAAU+B,EAAE5B,SAAWga,IACzB1N,EAAM,UAIN1K,EAAE7B,SAAWga,IACbzN,EAAM,QAEN1K,EAAE3B,UAAYga,IACd3N,EAAM,QAEN1K,EAAE/B,QAAUma,IACZ1N,EAAM,UAIXA,CACX,CAEA,WAAA4N,CAAYC,EAAY7B,EAAS8B,GAK7B,SAAKhgB,KAAK4L,SAASgT,IAAIxB,mBAAqBc,KAGxB,WAAf8B,GAA2BD,IAAe7B,EAAQ+B,kBACnC,UAAfD,GAA0BD,IAAe7B,EAAQgC,mBAK/ChC,IAAY6B,GAAc7B,EAAQrL,SAAWkN,GACxD,CAEA,eAAArB,GACI,GAAI1e,KAAKmgB,cAAgBngB,KAAKwe,iBAAkB,CAC5C,MAAMG,EAAU3e,KAAKwL,KAAK7B,QAAQiV,IAC5BwB,EAAKpgB,KAAKwL,KAAKzC,QACfsX,EAAYD,EAAGC,UACjBrgB,KAAKwe,iBAAmB,EACxB4B,EAAGC,UAAYlW,KAAKC,IAAI,EAAGiW,EAAY1B,EAAQnB,aAE1Cxd,KAAKwe,iBAAmB,IAC7B4B,EAAGC,UAAYA,EAAY1B,EAAQnB,YAE3C,CACJ,CAEA,WAAA8C,CAAYC,GACR,MAAM/U,EAAOxL,KAAKwL,KAEZgV,EADUhV,EAAK7B,QAAQiV,IACDrB,kBACtB6C,EAAK5U,EAAKzC,QACV0X,EAAejV,EAAKkV,cAAcC,aAGlCC,EAASR,EAAGS,aACZR,EAAYD,EAAGC,UAqBrB,OAjBArgB,KAAKwe,iBAAmB,EACpB6B,EAAY,GACZE,EAAY,GACZA,GAAaC,EAAcC,EAG3BzgB,KAAKwe,kBAAoB,EAEpB6B,EAAYD,EAAGU,aAAeF,GACnCL,GAAaK,EAASJ,IAGtBxgB,KAAKwe,iBAAmB,GAExBxe,KAAKwe,kBACLxe,KAAKye,0BAEF2B,EAAGC,UAAYA,CAC1B,CAEA,UAAAF,GACI,QAASngB,KAAKke,OAClB,CAIA,WAAAW,CAAYrX,GACR,IAAIwE,EAEJ,MAAM2S,EAAU3e,KAAK4L,SAASgT,IACxBV,EAAU6C,WAAWC,QAAQxZ,GACnC,GAAK0W,EAAL,CAQA,GAJI,CAAC,YAAa,WAAWrD,SAASrT,EAAE9D,OACpC1D,KAAKwL,KAAKqL,SAAS,eAAerP,EAAE9D,iBAAiBwa,IAAW1W,GAGrD,cAAXA,EAAE9D,KAAsB,CAGxB,GADA8D,EAAEyZ,aAAarE,cAAgB+B,EAAQ/B,cACnCsB,EAAQgD,YAGR,OAFAhD,EAAQrH,SAAS,yCACjBrP,EAAE0O,kBACK,EAIX,IADYgI,EAAQnJ,WAAW,gBAAiB,CAAEzP,MAAOkC,IAGrD,OADAA,EAAE0O,kBACK,EAEX,MAAMiL,EAAWjD,EAAQkD,QAAO,GAAOC,IAEnCA,EAAEC,QAAUD,EAAE9b,WACP8b,EAAE9b,GAAG,IAEhB4b,EAASI,QAAUrD,EAAQ1S,KAAKC,GAC5BkT,EAAQtB,yBACsC,mBAAnCsB,EAAQtB,uBACf7V,EAAEyZ,aAAaO,QAAQhF,aAAcmC,EAAQtB,uBAAuB8D,EAAUjD,IAG9E1W,EAAEyZ,aAAaO,QAAQhF,aAAciF,KAAKC,UAAUP,MAI5B,QAAzBnV,EAAKxE,EAAEyZ,oBAAiC,IAAPjV,OAAgB,EAASA,EAAG2V,MAAM9G,SAAS,gBAC/ErT,EAAEyZ,aAAaO,QAAQ,aAActD,EAAQlM,OAEjDhS,KAAKke,QAAUA,EACfxV,YAAW,KAGPwV,EAAQgB,SAAS,iBAAiB,GACnC,EAEP,KACoB,SAAX1X,EAAE9D,KACHib,EAAQhB,MACRO,EAAQnJ,WAAW,WAAY,CAAEzP,MAAOkC,IAI5B,YAAXA,EAAE9D,OACPwa,EAAQgB,SAAS,kBAAkB,GACnClf,KAAKke,QAAU,KACXle,KAAKme,gBACLne,KAAKgf,aAETd,EAAQnJ,WAAW,cAAe,CAAEzP,MAAOkC,KAE/C,OAAO,CA3DP,CAFIxH,KAAKwL,KAAK8H,QAAQ,eAAe9L,EAAE9D,eA8D3C,CAIA,WAAAqb,CAAYvX,GACR,IAAIwE,EAEJ,MAAMkS,EAAUle,KAAKke,QACf0D,EAAU1D,EAAUA,EAAQ1S,KAAO,KACnCuU,EAAagB,WAAWC,QAAQxZ,GAChCmX,EAAU3e,KAAK4L,SAASgT,IACxBiD,EAAKra,EAAEyZ,aACPjB,EAAahgB,KAAKqf,gBAAgB7X,EAAGxH,KAAKqe,wBAChD,GAAK0B,EAAL,CASA,GALI,CAAC,QAAQlF,SAASrT,EAAE9D,OACpB1D,KAAKwL,KAAKqL,SAAS,eAAerP,EAAE9D,oBAAoBqc,UAAmB8B,aAA+B,EAASA,EAAGjF,sBAC3GiF,aAA+B,EAASA,EAAGC,mBAAmBta,EAAEgY,eAAeQ,eAAwB9B,IAAW1W,GAGlH,cAAXA,EAAE9D,KAAsB,CASxB,GARA1D,KAAKqe,uBAAyB,KAG1Bre,KAAKme,gBAAkBne,KAAKme,iBAAmB4B,GAC/C/f,KAAKgf,aAEThf,KAAKme,eAAiB4B,EACtB/f,KAAKoe,eAAiBja,KAAKqG,MAG3BuV,EAAWgC,gBAENpD,EAAQ5B,qBAAuBgD,EAAWvU,OAASoW,GAEnDjD,EAAQ3B,qBAAuB+C,EAAWiC,YAE1CrD,EAAQ1B,kBAAoBiB,GAE5BS,EAAQzB,mBAAqBgB,aAAyC,EAASA,EAAQ+D,aAAalC,KAEpGpB,EAAQxB,mBACLe,GACA6B,EAAWlN,SAAWqL,EAAQrL,QAEjC8L,EAAQvB,kBAAoB2C,IAAe7B,EAG5C,OAFA2D,EAAGC,WAAa,OAChB9hB,KAAKwL,KAAK0L,IAAI,6BACP,EAIX2K,EAAGC,WAAa9hB,KAAKyf,iBAAiBjY,IAAM,OAC5C,IAAI0a,EAAYnC,EAAWhL,WAAW,gBAAiB,CAAEzP,MAAOkC,IAGhE,OADA0a,EAAYliB,KAAKmf,cAAc+C,GAC1BA,GAILliB,KAAKqe,uBAAyB6D,EAC9BliB,KAAKse,eAAiBuD,EAAGC,WACzB/B,EAAWb,SAAS,kBACpB1X,EAAE0O,kBACK,IAPH2L,EAAGC,WAAa,QACT,EAQf,CACK,GAAe,aAAXta,EAAE9D,KAAqB,CAC5B,MAAM6c,EAAY/Y,EAAE2a,QAAUniB,KAAKwL,KAAKzC,QAAQqZ,UAChDpiB,KAAKsgB,YAAYC,GACjBsB,EAAGC,WAAa9hB,KAAKyf,iBAAiBjY,IAAM,OAC5CuY,EAAWhL,WAAW,eAAgB,CAAEzP,MAAOkC,IAC/C,MAAM6a,EAASriB,KAAKqf,gBAAgB7X,EAAGxH,KAAKqe,wBAU5C,GATAre,KAAKue,eAAiB8D,EACtBriB,KAAKse,eAAiBuD,EAAGC,WACrBnD,EAAQjC,aAAe,GACvBqD,EAAW1J,cAAa,KACvB0J,EAAWuC,YACZne,KAAKqG,MAAQxK,KAAKoe,eAAiBO,EAAQjC,eACe,IAA1DqD,EAAWhL,WAAW,iBAAkB,CAAEzP,MAAOkC,KACjDuY,EAAW9M,eAEVoP,GAAUriB,KAAK8f,YAAYC,EAAY7B,EAASmE,GACjD,OAMJ,OAJAtC,EAAWb,SAAS,eAA2B,SAAXmD,GACpCtC,EAAWb,SAAS,iBAA6B,WAAXmD,GACtCtC,EAAWb,SAAS,gBAA4B,UAAXmD,GACrC7a,EAAE0O,kBACK,CAEX,CACK,GAAe,cAAX1O,EAAE9D,KAGPqc,EAAWhL,WAAW,gBAAiB,CAAEzP,MAAOkC,SAG/C,GAAe,SAAXA,EAAE9D,KAAiB,CACxB8D,EAAE+a,kBACF/a,EAAE0O,iBACFlW,KAAKgf,aACL,MAAMqD,EAASriB,KAAKue,eACpB,IAAI4C,EAAqC,QAAzBnV,EAAKxE,EAAEyZ,oBAAiC,IAAPjV,OAAgB,EAASA,EAAGwW,QAAQhG,cACrF2E,EAAWA,EAAWM,KAAKgB,MAAMtB,GAAY,KAC7C,MAAMjD,EAAUle,KAAKke,QACfI,EAAiBte,KAAKse,eAC5B5V,YAAW,KAGPqX,EAAWhL,WAAW,WAAY,CAC9BzP,MAAOkC,EACP6a,OAAQA,EACRK,kBAA8B,SAAXL,EAAoB,cAAgBA,EACvDM,oBAAqBrE,EAErBsE,WAAY1E,EACZ2E,eAAgB1B,GAClB,GACH,GACP,CACA,OAAO,CA3GP,CAFInhB,KAAKgf,YA8Gb;;;;;GAWJ,MAAM8D,aACF,WAAA/iB,CAAYmJ,GAaR,GAZAlJ,KAAKuK,MAAQ,CACT6P,EAAG,EACHC,EAAG,EACH5U,QAAQ,EACRE,SAAS,EACTC,SAAS,EACTC,UAAU,GAEd7F,KAAK+iB,SAAW,KAChB/iB,KAAKgjB,UAAW,EAEhBhjB,KAAKijB,OAAS,CAAC,YAAa,UAAW,YAAa,YAC/C/Z,EAAKyD,KACN,MAAM,IAAIrM,MAAM,0BAEpBN,KAAKkJ,KAAO9C,OAAO0D,OAAO,CAAEoZ,OAAQ,GAAKha,GACzClJ,KAAK2M,KAAOzD,EAAKyD,KACjB3M,KAAKmjB,SAAWnjB,KAAKojB,YAAYtE,KAAK9e,MACtCA,KAAKijB,OAAOziB,SAASkD,IACjB1D,KAAK2M,KAAK7K,iBAAiB4B,EAAM1D,KAAKmjB,SAAS,GAEvD,CAEA,UAAAE,GACIrjB,KAAKijB,OAAOziB,SAASkD,IACjB1D,KAAK2M,KAAK2W,oBAAoB5f,EAAM1D,KAAKmjB,SAAS,GAE1D,CACA,WAAAI,GACI,OAAOvjB,KAAK+iB,QAChB,CACA,UAAA5C,GACI,OAAOngB,KAAKgjB,QAChB,CACA,QAAAQ,CAASC,GACDzjB,KAAKgjB,UAAYhjB,KAAKkJ,KAAKwa,UAAYD,IACvCA,EAAS/f,KAAO,WAChB1D,KAAKkJ,KAAKwa,SAASD,IAEvBzjB,KAAK+iB,SAAW,KAChB/iB,KAAKgjB,UAAW,CACpB,CACA,WAAAI,CAAY5b,GACR,MAAM9D,EAAO8D,EAAE9D,KACTwF,EAAOlJ,KAAKkJ,KACZua,EAAW,CACb/f,KAAM8D,EAAE9D,KACR4B,MAAOkC,EACPub,SAAU/iB,KAAK+iB,SACfY,GAAInc,EAAEoc,MAAQ5jB,KAAKuK,MAAM6P,EACzBmF,GAAI/X,EAAEqc,MAAQ7jB,KAAKuK,MAAM8P,EACzBhS,WAAOpE,GAEX,OAAQP,GACJ,IAAK,UACD1D,KAAKwjB,SAASC,GACd,MACJ,IAAK,YACD,GAAIzjB,KAAK+iB,SAAU,CACf/iB,KAAKwjB,SAASC,GACd,KACJ,CACA,GAAIva,EAAK9B,SAAU,CACf,IAAIrE,EAAOyE,EAAEC,OACb,GAAI1E,EAAK2E,QAAQwB,EAAK9B,UAClBpH,KAAK+iB,SAAWhgB,MAEf,CAED,GADAA,EAAOA,EAAK4E,QAAQuB,EAAK9B,WACrBrE,EAIA,MAHA/C,KAAK+iB,SAAWhgB,CAKxB,CACJ,CACA/C,KAAKuK,MAAM6P,EAAI5S,EAAEoc,MACjB5jB,KAAKuK,MAAM8P,EAAI7S,EAAEqc,MACjB7jB,KAAKuK,MAAM9E,OAAS+B,EAAE/B,OACtBzF,KAAKuK,MAAM5E,QAAU6B,EAAE7B,QACvB3F,KAAKuK,MAAM3E,QAAU4B,EAAE5B,QACvB5F,KAAKuK,MAAM1E,SAAW2B,EAAE3B,SACxB,MACJ,IAAK,YAGD,IAAK7F,KAAK+iB,SACN,MAEJ,IAAK/iB,KAAKgjB,SAAU,CAChB,GAAI9Z,EAAKga,OAAQ,CAEb,GADcO,EAASE,GAAKF,EAASE,GAAKF,EAASlE,GAAKkE,EAASlE,GACrDrW,EAAKga,OAASha,EAAKga,OAC3B,KAER,CAEA,GADAO,EAAS/f,KAAO,aACiB,IAA7BwF,EAAK4a,UAAUL,GAAqB,CACpCzjB,KAAKwjB,SAASC,GACd,KACJ,CACAzjB,KAAKgjB,UAAW,CACpB,CACIhjB,KAAKgjB,UAAYhjB,KAAKkJ,KAAKyU,OAC3B8F,EAAS/f,KAAO,OAChB1D,KAAKkJ,KAAKyU,KAAK8F,IAEnB,MACJ,IAAK,UACD,IAAKzjB,KAAKgjB,SAAU,CAChBhjB,KAAKwjB,SAASC,GACd,KACJ,CACiB,IAAbjc,EAAE1B,OACF2d,EAASpb,OAAQ,EAGjBob,EAASpb,OAAQ,EAErBrI,KAAKwjB,SAASC,GAG1B;;;;;GAQJ,MAAMM,sBAAsBxY,oBACxB,WAAAxL,CAAYyL,GACRkE,MAAMlE,EAAM,OAAQ,CAEpB,GACAxL,KAAKgkB,SAAW,IAAIlB,aAAa,CAC7BnW,KAAMsX,OAAOriB,SACbwF,SAAU,sBACV8b,OAAQ,EAERY,UAAYtc,GACDxH,KAAKwL,KAAKzC,QAAQ3F,SAASoE,EAAEub,UAExCpF,KAAOnW,GAEIxH,KAAKkkB,WAAW1c,GAE3Bkc,SAAWlc,GACAxH,KAAKkkB,WAAW1c,IAGnC,CACA,IAAAuE,GACI2D,MAAM3D,MACV,CACA,UAAAmY,CAAW1c,GACP,MAAM2c,EAAOpD,WAAWqD,aAAa5c,EAAElC,OAEvCtF,KAAKwL,KAAK0L,IAAI,GAAG1P,EAAE9D,QAAQ8D,EAAEmc,MAAOnc,EAAG2c,EAC3C;;;;;GAuBJ,MAAM7Y,SACF,WAAAvL,GACIC,KAAKqkB,SAAW,IAAIriB,SAAQ,CAAC5B,EAASM,KAClCV,KAAKskB,SAAWlkB,EAChBJ,KAAKukB,QAAU7jB,CAAM,GAE7B,CAEA,OAAAN,CAAQC,GACJL,KAAKskB,SAASjkB,EAClB,CAEA,MAAAK,CAAO8jB,GACHxkB,KAAKukB,QAAQC,EACjB,CAEA,OAAAvjB,GACI,OAAOjB,KAAKqkB,QAChB,CAEA,IAAAvjB,CAAKC,GACD,OAAOf,KAAKqkB,SAASvjB,KAAKC,EAC9B,CAEA,MAAMA,GACF,OAAOf,KAAKqkB,SAASnjB,MAAMH,EAC/B,CAEA,QAAQA,GACJ,OAAOf,KAAKqkB,SAASI,QAAQ1jB,EACjC;;;;;GAWJ,MAAM2jB,WAAa,IAAIvf,IAAI,CACvB,WACA,UACA,WACA,OACA,cACA,MACA,OACA,WACA,aACA,SACA,WACA,iBACA,QACA,UACA,OACA,iBAIEwf,gBAAkB,IAAIxf,IAAIuf,YAChCC,gBAAgBC,OAAO,YACvBD,gBAAgBC,OAAO,gBAQvB,MAAMC,eACF,WAAA9kB,CAAYyL,EAAMqH,EAAQzG,GACtB,IAAIJ,EAAIwO,EAKRxa,KAAK8kB,YAAS7gB,EACdjE,KAAK2S,SAAW,KAGhB3S,KAAK+kB,QAAU,KAEf/kB,KAAKoM,KAAO,CAAC,EACbpM,KAAKsiB,YAAa,EAClBtiB,KAAKglB,WAAa,EAClBhlB,KAAKilB,WAAa,KAClBjlB,KAAKklB,UAAW,EAChBllB,KAAKmlB,WAAY,EACjBnlB,KAAKuS,cAAgB,EACrBvS,KAAKolB,QAAU,EACfplB,KAAKqlB,cAAWphB,EAChB9C,QAAQ0R,GAAUA,EAAOrH,OAASA,EAAM,mBAAmBqH,KAC3D1R,QAAQiL,EAAKuG,SAAU,+BACvB3S,KAAKwL,KAAOA,EACZxL,KAAK6S,OAASA,EACd7S,KAAKuF,IAAM,IAA0B,QAAnByG,EAAKI,EAAK7G,WAAwB,IAAPyG,EAAgBA,IAAO6Y,eAAeS,UACnFtlB,KAAKgS,MAAQ,IAA4B,QAArBwI,EAAKpO,EAAK4F,aAA0B,IAAPwI,EAAgBA,EAAK,IAAMxa,KAAKuF,IAAM,KACxE,MAAf6G,EAAK0Y,SAAkB9kB,KAAK8kB,OAAS,GAAK1Y,EAAK0Y,QAClC,MAAb1Y,EAAK1I,OAAgB1D,KAAK0D,KAAO,GAAK0I,EAAK1I,MAC3C1D,KAAKgT,UAA6B,IAAlB5G,EAAK4G,SACR,MAAb5G,EAAKmZ,OAAgBvlB,KAAKulB,KAAOnZ,EAAKmZ,MACtCvlB,KAAKwlB,MAAqB,IAAdpZ,EAAKoZ,KACM,MAAvBpZ,EAAKqZ,iBACEzlB,KAAKylB,eAAkB,GAAKrZ,EAAKqZ,gBAExB,MAAhBrZ,EAAKsZ,UAAmB1lB,KAAK0lB,UAAYtZ,EAAKsZ,SAE7B,MAAjBtZ,EAAKuZ,WAAoB3lB,KAAK2lB,WAAavZ,EAAKuZ,UAC7B,MAAnBvZ,EAAKwZ,aAAsB5lB,KAAK4lB,aAAexZ,EAAKwZ,YACpD5lB,KAAK6lB,UAA6B,IAAlBzZ,EAAKyZ,UACC,IAAtBzZ,EAAK0Z,eAAyB9lB,KAAK8lB,cAAe,GAC9C1Z,EAAK2Y,SACL/kB,KAAKkf,SAAS9S,EAAK2Y,SAGvB,IAAK,MAAOxf,EAAKlF,KAAU+F,OAAO4U,QAAQ5O,GACjCsY,WAAW3e,IAAIR,KAChBvF,KAAKoM,KAAK7G,GAAOlF,GAGrBwS,IAAW7S,KAAKylB,gBAEhBja,EAAKua,cAAc/lB,KAE3B,CAKA,QAAA6G,GACI,MAAO,kBAAkB7G,KAAKuF,QAAQvF,KAAKgS,SAC/C,CAYA,EAAEgU,OAAOC,YAEL,MAAMC,EAAKlmB,KAAK2S,SAChB,GAAIuT,EACA,IAAK,IAAI9jB,EAAI,EAAG+jB,EAAID,EAAG/jB,OAAQC,EAAI+jB,EAAG/jB,IAAK,CACvC,MAAMif,EAAI6E,EAAG9jB,SACPif,EACFA,EAAE1O,iBACK0O,EAEf,CAOR,CAsBA,UAAAtM,CAAWrR,EAAM+T,GACb,OAAOzX,KAAKwL,KAAKuJ,WAAWrR,EAAMuC,OAAO,CACrC8L,KAAM/R,KACNomB,SAAUpmB,KAAK0D,KAAO1D,KAAKwL,KAAKmW,MAAM3hB,KAAK0D,MAAQ,CAAC,GACrD+T,GACP,CAQA,WAAA4O,CAAYlF,EAAUxX,GAClB,MAAM6B,EAAOxL,KAAKwL,KAClB,IAAI8a,OAAEA,EAAS,KAAIC,mBAAEA,GAAqB,EAAIC,OAAEA,GAAW7c,QAAyCA,EAAU,CAAC,EAG/G6c,UAAiDA,EAASxmB,KAAKymB,YAC/D,MAAMC,EAAW,GACjB,IACIlb,EAAK+H,cAAa,GACd3M,cAAcua,KACdA,EAAW,CAACA,IAEhB,MAAMwF,EAAcJ,GAAsBC,EAAShb,EAAK7B,QAAQid,eAChE,IAAK,MAAMC,KAAS1F,EAAU,CAC1B,MAAM2F,EAAcD,EAAMlU,gBACnBkU,EAAMlU,SACb,MAAM0O,EAAI,IAAIwD,eAAerZ,EAAMxL,KAAM6mB,GACrCF,IAAgBtF,EAAE0F,eAClB1F,EAAErO,UAAW,GAEjB0T,EAAShhB,KAAK2b,GACVyF,GACAzF,EAAEgF,YAAYS,EAAa,CAAEN,OAAQA,EAAS,GAEtD,CACA,GAAKxmB,KAAK2S,SAGL,GAAc,MAAV2T,GAA2C,IAAzBtmB,KAAK2S,SAASxQ,OACrCnC,KAAK2S,SAAW3S,KAAK2S,SAASqU,OAAON,OAEpC,CAEDJ,EAAStmB,KAAKinB,gBAAgBX,GAC9B,MAAMY,EAAMlnB,KAAK2S,SAAS9P,QAAQyjB,GAClCnlB,OAAO+lB,GAAO,EAAG,4CAA4ClnB,QAE7DA,KAAK2S,SAASwU,OAAOD,EAAK,KAAMR,EACpC,MAZI1mB,KAAK2S,SAAW+T,EAcpBlb,EAAK4b,OAAOtc,WAAWuc,UAC3B,CACA,QAQI7b,EAAK+H,cAAa,EACtB,CAIA,OAAOmT,EAAS,EACpB,CAUA,OAAAY,CAAQnG,EAAU/Q,EAAO,eAIrB,OAHa,SAATA,IACAA,EAAO,eAEHA,GACJ,IAAK,QACD,OAAOpQ,KAAK6S,OAAOwT,YAAYlF,EAAU,CACrCmF,OAAQtmB,KAAKigB,mBAErB,IAAK,SACD,OAAOjgB,KAAK6S,OAAOwT,YAAYlF,EAAU,CAAEmF,OAAQtmB,OACvD,IAAK,eAGD,OAAOA,KAAKqmB,YAAYlF,EAAU,CAAEmF,OAAQ,IAChD,IAAK,cACD,OAAOtmB,KAAKqmB,YAAYlF,GAEhChgB,QAAO,EAAO,iBAAiBiP,IAEnC,CAMA,YAAAmX,CAAaC,EAAK7d,GACd,OAAO3J,KAAKwL,KAAK+b,aAAaC,EAAKxnB,KAAM2J,EAC7C,CAKA,gBAAA8d,CAAiB9d,GACb,IAAK,MAAMoI,KAAQ/R,KAAK6S,OAAOF,SACvBZ,IAAS/R,MAAQ+R,EAAKiB,UACtBjB,EAAKkB,aAAY,EAAOtJ,EAGpC,CASA,QAAAuV,CAASwI,EAAWnjB,GAAO,GACvB,MAAMojB,EAAQte,MAAMqe,GACpB,GAAInjB,EACqB,OAAjBvE,KAAK+kB,UACL/kB,KAAK+kB,QAAU,IAAI5f,KAEvBwiB,EAAMnnB,SAASonB,IACX,IAAI5b,EACJhM,KAAK+kB,QAAQvb,IAAIoe,GACQ,QAAxB5b,EAAKhM,KAAKqlB,gBAA6B,IAAPrZ,GAAyBA,EAAG7I,UAAUmP,OAAOsV,EAAIrjB,EAAK,QAG1F,CACD,GAAqB,OAAjBvE,KAAK+kB,QACL,OAEJ4C,EAAMnnB,SAASonB,IACX,IAAI5b,EACJhM,KAAK+kB,QAAQH,OAAOgD,GACK,QAAxB5b,EAAKhM,KAAKqlB,gBAA6B,IAAPrZ,GAAyBA,EAAG7I,UAAUmP,OAAOsV,EAAIrjB,EAAK,IAEjE,IAAtBvE,KAAK+kB,QAAQ3F,OACbpf,KAAK+kB,QAAU,KAEvB,CACJ,CAEA,eAAM8C,CAAUtjB,GAAO,EAAMoF,GACzB,MAAM6B,EAAOxL,KAAKwL,KACZob,EAAiB5mB,KAAKwL,KAAK7B,QAAQid,gBACnCkB,MAAEA,EAAQ,GAAEC,SAAEA,EAAQC,MAAEA,EAAKC,sBAAEA,GAAwB,GAAUte,QAAyCA,EAAU,CAAC,EACrHue,EAAa,CACfC,gBAAgB,EAChBH,MAAOA,EACPD,SAAUA,GAgDd,MAAM9kB,EAAMuI,EAAK4c,QAAQ,GAAGpoB,kBAAkBuE,MAC9C,IACIiH,EAAK+H,cAAa,SA9CtB3K,eAAesT,EAAMmF,EAAGgH,GACpB,IAAIrc,EAEJ,GAAc,IAAVqc,EACA,OAKJ,MAAMC,EAAmB,MAATD,EAAgB,KAAOA,EAAQ,EACzCE,EAAW,GA4BjB,OA3BsB,QAArBvc,EAAKqV,EAAE1O,gBAA6B,IAAP3G,GAAyBA,EAAGxL,SAASonB,IAC/D,GAAIrjB,EACA,IAAKqjB,EAAG5U,WAAa4U,EAAGjV,UAAaoV,GAAYH,EAAGpC,MAAQ,CAIxD,MAAMzS,EAAI6U,EAAG3U,aAAY,EAAMiV,GAC/BK,EAAS7iB,KAAKqN,GACdA,EAAEjS,MAAK8H,gBACGsT,EAAM0L,EAAIU,EAAQ,GAEhC,MAIIC,EAAS7iB,KAAKwW,EAAM0L,EAAIU,UAKvB1B,GAAkBoB,GAASJ,EAAGnB,WAAaG,IAE5CgB,EAAG3U,aAAY,EAAOiV,GAE1BhM,EAAM0L,EAAIU,EACd,IAEG,IAAItmB,SAAS5B,IAChB4B,QAAQwmB,IAAID,GAAUznB,MAAK,KACvBV,GAAQ,EAAK,GACf,GAEV,CAIU8b,CAAMlc,KAAM8nB,EACtB,CACA,QACItc,EAAK+H,cAAa,GAClB/H,EAAKid,WAAWxlB,EACpB,CACIuI,EAAKkd,YAAcT,GACnBzc,EAAKkd,WAAWP,gBAExB,CAyBA,OAAAQ,CAAQ1X,GACJ,MAAM2X,EAA2B,mBAAV3X,EAAuBA,EAAQ+I,qBAAqB/I,GACrEiB,EAAM,GAMZ,OALAlS,KAAKwS,OAAO6O,IACJuH,EAAQvH,IACRnP,EAAIxM,KAAK2b,EACb,IAEGnP,CACX,CAEA,eAAA+U,CAAgB4B,GACZ,MAAM3C,EAAKlmB,KAAK2S,SAChB,IAAKuT,EACD,OAAO,KAEX,GAAmB,iBAAR2C,GACP,IAAK,IAAIzmB,EAAI,EAAG+jB,EAAID,EAAG/jB,OAAQC,EAAI+jB,EAAG/jB,IAClC,GAAI8jB,EAAG9jB,GAAGmD,MAAQsjB,EACd,OAAO3C,EAAG9jB,OAIjB,IAAmB,iBAARymB,EACZ,OAAO3C,EAAG2C,GAET,GAAIA,EAAIhW,SAAW7S,KAEpB,OAAO6oB,CACX,CACA,OAAO,IACX,CAMA,SAAAC,CAAU7X,GACN,MAAM2X,EAA2B,mBAAV3X,EAAuBA,EAAQ+I,qBAAqB/I,GAC3E,IAAIiB,EAAM,KAOV,OANAlS,KAAKwS,OAAO6O,IACR,GAAIuH,EAAQvH,GAER,OADAnP,EAAMmP,GACC,CACX,IAEGnP,CACX,CAKA,eAAA6W,CAAgBC,EAAOC,GAAgB,GACnC,OAAOjpB,KAAKwL,KAAKud,gBAAgB/oB,KAAMgpB,EAAOC,EAClD,CAIA,YAACC,CAAYC,EAASC,GAGlB,SAASC,EAAStX,GACd,MAAMuX,EAAKvX,EAAKc,OAAOF,SACvB,OAAOZ,IAASuX,EAAGA,EAAGnnB,OAAS,EACnC,CALAinB,UAA6DA,EAAa,CAAC,OAAQ,OAAQ,OAAQ,SACnGD,UAAoDA,EAAWpX,GAAS,GAAKA,GAK7E,MAAMwX,EAAgBxX,IAElB,MAAMyX,EAAQ,CAACL,EAAQpX,IACvByX,EAAMxoB,QAAQooB,EAAWC,EAAStX,GAAQ,EAAI,IAC9C,IAAIgB,EAAIhB,EAAKc,OACb,KAAOE,GAAKA,IAAM/S,MAEdwpB,EAAMxoB,QAAQooB,EAAWC,EAAStW,GAAK,EAAI,IAC3CA,EAAIA,EAAEF,OAEV,OAAO2W,EAAMxjB,KAAK,GAAG,QAEnBmjB,EAAQnpB,MACd,IAAK,MAAM+R,KAAQ/R,WACTupB,EAAaxX,EAE3B,CAiBA,MAAA0X,CAAON,EAASC,GACZ,MAAMzX,EAAI,GACV,IAAK,MAAM+X,KAAQ1pB,KAAKkpB,YAAYC,EAASC,GACzCzX,EAAEjM,KAAKgkB,GAEX,OAAO/X,EAAE3L,KAAK,KAClB,CAIA,UAAA2jB,CAAWC,GACP,IAAI5d,EACkB,iBAAX4d,IACPA,EAAS5pB,KAAKwL,KAAK6L,QAAQwS,WAAWxpB,GAAUA,EAAMoL,KAAOme,KAEjE,MAAME,EAAoC,QAAxB9d,EAAKhM,KAAKqlB,gBAA6B,IAAPrZ,OAAgB,EAASA,EAAG+d,iBAAiB,eAC/F,OAAOD,EAAWA,EAASF,GAAU,IACzC,CAIA,aAAAvU,GACI,OAAOrV,KAAK2S,SAAW3S,KAAK2S,SAAS,GAAK,IAC9C,CAIA,YAAAqX,GACI,OAAOhqB,KAAK2S,SAAW3S,KAAK2S,SAAS3S,KAAK2S,SAASxQ,OAAS,GAAK,IACrE,CAEA,QAAAskB,GACI,IAAIrkB,EAAI,EAAG2Q,EAAI/S,KAAK6S,OACpB,KAAOE,GACH3Q,IACA2Q,EAAIA,EAAEF,OAEV,OAAOzQ,CACX,CAEA,cAAA6d,GACI,MAAMgK,EAAKjqB,KAAK6S,OAAOF,SACjBuX,EAAMD,EAAGpnB,QAAQ7C,MACvB,OAAOiqB,EAAGC,EAAM,IAAM,IAC1B,CAEA,SAAAC,GAEI,OAAOnqB,KAAK6S,MAChB,CAKA,aAAAuX,CAAcC,GAAc,EAAOC,GAAc,GAC7C,MAAMnE,EAAI,GACV,IAAIoE,EAAMD,EAActqB,KAAOA,KAAK6S,OACpC,KAAO0X,IACCF,GAAeE,EAAI1X,SACnBsT,EAAEnlB,QAAQupB,GAEdA,EAAMA,EAAI1X,OAEd,OAAOsT,CACX,CAMA,OAAAqE,CAAQF,GAAc,EAAMG,EAAO,QAASC,EAAY,KAIpD,IAAIphB,EACJ,MAAMqhB,EAAO,GACPC,EAAyB,mBAATH,EAUtB,OATAzqB,KAAK8S,cAAcuO,IACXA,EAAExO,SACFvJ,EAAMshB,EACAH,EAAKpJ,GACLA,EAAEoJ,GACRE,EAAK3pB,QAAQsI,GAED,GACjBghB,GACIK,EAAK3kB,KAAK0kB,EACrB,CAEA,cAAAxK,GACI,MAAM+J,EAAKjqB,KAAK6S,OAAOF,SACjBuX,EAAMD,EAAGpnB,QAAQ7C,MACvB,OAAOiqB,EAAGC,EAAM,IAAM,IAC1B,CAIA,WAAAW,GACI,GAAI7qB,KAAKwlB,KAAM,CACX,GAAqB,MAAjBxlB,KAAK2S,SACL,OAEC,GAA6B,IAAzB3S,KAAK2S,SAASxQ,OACnB,OAAO,EAEN,GAA6B,IAAzBnC,KAAK2S,SAASxQ,QACnBnC,KAAK2S,SAAS,GAAGoP,eACjB,OAEJ,OAAO,CACX,CACA,SAAU/hB,KAAK2S,WAAY3S,KAAK2S,SAASxQ,OAC7C,CAEA,QAAA2oB,CAASpD,GACL,QAAO1nB,KAAK+kB,SAAU/kB,KAAK+kB,QAAQhf,IAAI2hB,EAC3C,CAEA,QAAAvR,GACI,OAAOnW,KAAKwL,KAAKkd,aAAe1oB,IACpC,CAIA,YAAAiiB,CAAa8I,GACT,OAAOA,GAASA,EAAMC,eAAehrB,KACzC,CAIA,SAAAirB,CAAUF,GACN,OAAOA,GAAS/qB,KAAK6S,SAAWkY,CACpC,CAIA,SAAAvV,GACI,QAASxV,KAAKiJ,UAAU,UAC5B,CAIA,cAAA+hB,CAAeD,GACX,IAAKA,GAASA,EAAMvf,OAASxL,KAAKwL,KAC9B,OAAO,EAEX,IAAIuH,EAAI/S,KAAK6S,OACb,KAAOE,GAAG,CACN,GAAIA,IAAMgY,EACN,OAAO,EAEPhY,IAAMA,EAAEF,QACRlS,MAAM,0BAA0BoS,KAEpCA,EAAIA,EAAEF,MACV,CACA,OAAO,CACX,CAKA,YAAAwD,CAAa6U,GAAe,GAExB,QAAKA,GAAgBlrB,KAAKgT,WAA+B,IAAlBhT,KAAK2S,YAGvB,MAAjB3S,KAAK2S,WACI3S,KAAKwlB,KAEW,IAAzBxlB,KAAK2S,SAASxQ,UACLnC,KAAKwL,KAAK7B,QAAQwhB,yBAGnC,CAEA,SAAAjK,GACI,OAAOlhB,KAAKwL,KAAKwJ,YAAY,sBAAuBhV,KACxD,CAEA,UAAAoW,GACI,QAASpW,KAAKgT,QAClB,CAEA,cAAAoY,GACI,MAAMrY,EAAI/S,KAAK6S,OACf,OAAQE,GAAKA,EAAEJ,SAAS,KAAO3S,IACnC,CAEA,aAAAqrB,GACI,MAAMtY,EAAI/S,KAAK6S,OACf,OAAQE,GAAKA,EAAEJ,SAASI,EAAEJ,SAASxQ,OAAS,KAAOnC,IACvD,CAEA,MAAAsrB,GACI,QAAStrB,KAAKwlB,IAClB,CAEA,QAAAxD,GACI,OAAQhiB,KAAKwlB,WAA+BvhB,IAAvBjE,KAAK6qB,aAC9B,CAEA,SAAAU,GACI,OAAOvrB,KAAKsiB,UAChB,CAEA,YAAAkJ,GACI,MAA+B,WAAxBxrB,KAAKylB,cAChB,CAIA,UAAAgG,CAAWV,GACP,OAAOA,GAASA,EAAMlY,SAAW7S,IACrC,CAEA,UAAA0rB,GACI,QAAS1rB,KAAKmlB,SAClB,CAEA,SAAAwG,GACI,OAAQ3rB,KAAK6lB,YAAc7lB,KAAKklB,QACpC,CAEA,OAAA0G,GACI,QAAS5rB,KAAK6S,OAAO+S,YAA6C,UAA/B5lB,KAAKiJ,UAAU,WACtD,CAEA,UAAA4iB,GACI,QAAS7rB,KAAKqlB,QAClB,CAIA,UAAAyG,GACI,OAAO9rB,KAAKwL,KAAKmB,OAAS3M,IAC9B,CAIA,UAAA+rB,GACI,QAAO/rB,KAAK6lB,YAAkB7lB,KAAKklB,eAAWjhB,CAClD,CAIA,YAAA8d,GACI,QAAS/hB,KAAKylB,cAClB,CAEA,UAAAuG,GACI,OAAOhsB,KAAKwL,KAAKmB,OAAS3M,KAAK6S,MACnC,CAIA,UAAAkU,GAEI,YAA8B9iB,IAAvBjE,KAAK6qB,aAChB,CAIA,SAAAoB,GACI,MAAMC,EAAqC,SAAzBlsB,KAAKwL,KAAKiF,WACtB0b,EAAUnsB,KAAKoqB,eAAc,GAAO,GAI1C,GAAI8B,IAAclsB,KAAKiR,QAAUjR,KAAKuS,cAElC,OAAO,EAEX,IAAK,IAAInQ,EAAI,EAAG+jB,EAAIgG,EAAQhqB,OAAQC,EAAI+jB,EAAG/jB,IAAK,CAE5C,IADU+pB,EAAQ/pB,GACX4Q,SAEH,OAAO,CAMf,CAEA,OAAO,CACX,CACA,iBAAAoZ,CAAkB7R,EAAQ8N,GACtB,IAAIrc,EACJ,MAAMR,EAAOxL,KAAKwL,KAClB6c,UAA8CA,EAAQroB,KAAKymB,YAE3D,MAAMvU,EAAMlS,KAAK+U,WAAW,UAAW,CAAEsX,SAAU9R,IACxC,MAAPrI,IACAqI,EAASrI,GAET3L,QAAQgU,KACRA,EAAS,CAAE5H,SAAU4H,IAEzBpZ,OAAOyF,cAAc2T,GAAS,sCAAsCA,KACpE,MAAMkP,EAAkC,QAAxBzd,EAAKuO,EAAOkP,cAA2B,IAAPzd,EAAgBA,EAAK,SACrE7K,OAAkB,WAAXsoB,GAAkC,SAAXA,EAAmB,gDAAgDA,KAEjG5N,qBAAqBtB,GACrBpZ,OAAOoZ,EAAO5H,SAAU,gEACpB4H,EAAOoH,QACPnW,EAAK+F,QAAQ,iBAAkBgJ,EAAOlD,SACtC7L,EAAK8gB,SAAS/R,EAAOoH,OAAO,UACrBpH,EAAOoH,OAEdpH,EAAOlD,UACP7L,EAAK+F,QAAQ,mBAAoBgJ,EAAOlD,SACxC7L,EAAK6L,QAAUkD,EAAOlD,eACfkD,EAAOlD,QACd7L,EAAK4b,OAAOtc,WAAWyhB,eAE3BvsB,KAAKqmB,YAAY9L,EAAO5H,UAExB,IAAK,MAAOpN,EAAKlF,KAAU+F,OAAO4U,QAAQT,GACjCtB,0BAA0BlT,IAAIR,KAC/BiG,EAAKY,KAAK7G,GAAOlF,GAIO,SAA5BmL,EAAK7B,QAAQ6iB,YACbxsB,KAAKysB,4BAETzsB,KAAK+U,WAAW,OACpB,CACA,uBAAM2X,CAAkBnS,GACpB,IAAIvO,EAAIwO,EAER,IAAImS,EAAKC,EAAQC,EAAMljB,EAASmjB,EAC5BC,EAAY,CAAC,EACK,iBAAXxS,GAEPoS,EAAMpS,EACNwS,EAAUC,OAAS,OAEdpmB,cAAc2T,MAEhBoS,MAAKC,SAAQC,OAAMljB,aAAYmjB,GAASvS,GAC3CpZ,QAAQ2rB,GAAqC,IAA7B1mB,OAAOM,KAAKomB,GAAM3qB,OAAc,iCAAiCiE,OAAOM,KAAKomB,8BAC7F3rB,OAAsB,iBAARwrB,EAAkB,iCAC5B/lB,cAAc+C,KACdojB,EAAYpjB,GAEZ/C,cAAcimB,KAEd1rB,QAAQ4rB,EAAUF,KAAM,gDACxBE,EAAUF,KAAOpL,KAAKC,UAAUqL,EAAUF,MACd,QAA3B7gB,EAAK+gB,EAAUC,cAA2B,IAAPhhB,IAAsB+gB,EAAUC,OAAS,SAE7EpmB,cAAcgmB,KACdD,GAAO,IAAM,IAAIM,gBAAgBL,GACL,QAA3BpS,EAAKuS,EAAUC,cAA2B,IAAPxS,IAAsBuS,EAAUC,OAAS,UAIjFL,EAAM,GACNhsB,MAAM,8BAA8B4Z,MAExCva,KAAKyS,UAAUzH,eAAekN,SAC9B,MAAMmU,QAAiBa,MAAMP,EAAKI,GAIlC,OAHKV,EAAS3Z,IACV/R,MAAM,OAAOgsB,cAAgBN,EAASlsB,WAAWksB,WAExCA,EAASc,MAC1B,CAEA,UAAMC,CAAK7S,GACP,MAAM/O,EAAOxL,KAAKwL,KACZ6hB,EAAYlpB,KAAKqG,MACjB8iB,EAAattB,KAAK6S,OAClBtI,EAAQpG,KAAKqG,MACnB,IAAIE,EAAO,EAAG6iB,EAAW,EAAGC,EAAc,EAEtCxtB,KAAKglB,YACLhlB,KAAKsT,QAAQ,2BAA2B+Z,YAAoBrtB,KAAKglB,0BAGrEhlB,KAAKglB,WAAaqI,EAElB,IAEI,GAD8B,iBAAX9S,EAAsBA,EAASA,EAAOoS,IAYpD,CAED,MAAMvgB,QAAapM,KAAK0sB,kBAAkBnS,GAE1C,GADAgT,EAAWppB,KAAKqG,MAAQD,EACpBvK,KAAKglB,YAAchlB,KAAKglB,WAAaqI,EAErC,YADArtB,KAAKsT,QAAQ,0BAA0B+Z,cAAsBrtB,KAAKglB,0BAMtE,GAFIhlB,KAAK6W,SAAS,uCAAuCwW,KAErC,OAAhBrtB,KAAK6S,QAAkC,OAAfya,EAExB,YADAttB,KAAKsT,QAAQ,oEAGjBtT,KAAKyS,UAAUzH,eAAe0H,IAQ9B,MAAM+a,EAAetpB,KAAKqG,MAC1BxK,KAAKosB,kBAAkBhgB,GACvBohB,EAAcrpB,KAAKqG,MAAQijB,CAC/B,KArCU,CAGN,GAA2B,mBAAhBlT,EAAOzZ,KAAqB,CACnC,MAAMO,EAAMmK,EAAK4c,QAAQ,oBAAoB7N,KAC7CA,QAAevY,QAAQ5B,QAAQma,GAC/B/O,EAAKid,WAAWpnB,EACpB,CACArB,KAAKosB,kBAAkB7R,GACvBiT,EAAcrpB,KAAKqG,MAAQD,CAC/B,CA4BJ,CACA,MAAO5J,GAIH,MAHAX,KAAK0tB,SAAS,sBAAuBnT,EAAQ5Z,GAC7CX,KAAK+U,WAAW,QAAS,CAAEpU,MAAOA,IAClCX,KAAKyS,UAAUzH,eAAerK,MAAO,CAAEgtB,QAAS,GAAKhtB,IAC/CA,CACV,CACA,QACIX,KAAKglB,WAAa,EAClBta,EAAOvG,KAAKqG,MAAQD,EAChBiB,EAAK7B,QAAQikB,YAAc,GAC3BpiB,EAAK+F,QAAQ,oBAAoB7G,EAAO,0BACtB6iB,EAAW,qBACVC,EAAc,QAEzC,CACJ,CAEA,cAAMzF,CAAS8F,GAAc,GACzB,MAAMC,EAAc9tB,KAAKgT,SAGzB,GAFA7R,OAAOnB,KAAKwlB,KAAM,+BAEbqI,GAAgB7tB,KAAK+mB,aAA1B,CAGI/mB,KAAKgiB,YACLhiB,KAAK+tB,YAIT/tB,KAAKyS,UAAUzH,eAAekN,SAC9B,IACI,MAAMqC,QAAeva,KAAK+U,WAAW,YACrC,IAAe,IAAXwF,EAEA,YADAva,KAAKyS,UAAUzH,eAAe0H,IAGlCvR,OAAOoF,QAAQgU,IAAYA,GAAUA,EAAOoS,IAAM,6EAC5C3sB,KAAKotB,KAAK7S,GAChBva,KAAKyS,UAAUzH,eAAe0H,IAC1Bob,GACA9tB,KAAKgT,UAAW,EAChBhT,KAAKwL,KAAK4b,OAAOtc,WAAWuc,YAG5BrnB,KAAKonB,QAEb,CACA,MAAO5f,GACHxH,KAAK0tB,SAAS,0BAA2BlmB,GACzCxH,KAAK+U,WAAW,QAAS,CAAEpU,MAAO6G,IAClCxH,KAAKyS,UAAUzH,eAAerK,MAAO,CAAEgtB,QAAS,GAAKnmB,GACzD,CA5BA,CA8BJ,CAEA,GAAA0P,IAAOhR,GACHlG,KAAK6W,YAAY3Q,EACrB,CAEA,QAAA2Q,IAAY3Q,GACJlG,KAAKwL,KAAK7B,QAAQikB,YAAc,GAChCnjB,QAAQyM,IAAIlX,KAAK6G,cAAeX,EAExC,CAEA,QAAAwnB,IAAYxnB,GACJlG,KAAKwL,KAAK7B,QAAQikB,YAAc,GAChCnjB,QAAQ9J,MAAMX,KAAK6G,cAAeX,EAE1C,CAEA,OAAAqL,IAAWrL,GACHlG,KAAKwL,KAAK7B,QAAQikB,YAAc,GAChCnjB,QAAQ0Z,KAAKnkB,KAAK6G,cAAeX,EAEzC,CAEA,OAAAoN,IAAWpN,GACHlG,KAAKwL,KAAK7B,QAAQikB,YAAc,GAChCnjB,QAAQsQ,KAAK/a,KAAK6G,cAAeX,EAEzC,CAMA,iBAAM8nB,CAAYrkB,GACd,IAAIvH,EACJ,MAAM6rB,EAAM,IAAI3iB,SACV4iB,EAAY,GACZ/B,EAAUnsB,KAAKoqB,eAAc,GAAO,GACpC+D,EAAMhC,EAAQhqB,OACd+Q,EAAcjK,UAAUU,EAAS,eAAe,GAChD2T,EAASrU,UAAUU,EAAS,kBAAkB,GAEpD,IAAKvH,EAAI+rB,EAAM,EAAG/rB,GAAK,EAAGA,IAAK,CAE3B,MAAMgsB,EAAS,CAAElb,YAAaA,GAC9Bgb,EAAUxoB,KAAKymB,EAAQ/pB,GAAG6Q,aAAY,EAAMmb,GAChD,CAiBA,OAhBApsB,QAAQwmB,IAAI0F,GAAWptB,MAAK,KAIpBwc,GAAUtd,KAAKwL,MAEfxL,KAAKwL,KAAK6iB,6BACVruB,KAAKmoB,iBAAiBrnB,MAAK,KAEvBmtB,EAAI7tB,SAAS,KAIjB6tB,EAAI7tB,SACR,IAEG6tB,EAAIhtB,SACf,CAEA,MAAAqtB,CAAOvO,EAAY3P,EAAO,cAAeqB,GAarC,IAAIyV,EAZS,SAAT9W,IACAA,EAAO,eAEE,iBAATA,IACI2P,EAAWpN,UAAYoN,EAAWpN,SAASxQ,QAC3CiO,EAAO,SACP2P,EAAaA,EAAWpN,SAAS,IAGjCvC,EAAO,eAIf,MAAM5E,EAAOxL,KAAKwL,KACZ8hB,EAAattB,KAAK6S,OAClB0b,EAAwB,gBAATne,EAAyB2P,EAAaA,EAAWlN,OACtE,GAAI7S,OAAS+f,EAAb,CAaA,GAVU/f,KAAK6S,OAGN0b,EAAavD,eAAehrB,OACjCW,MAAM,4CAHNA,MAAM,2BAKN4tB,IAAiBjB,GACjBA,EAAWkB,mBAAmB,SAAUxuB,MAGR,IAAhCA,KAAK6S,OAAOF,SAASxQ,OAAc,CACnC,GAAInC,KAAK6S,SAAW0b,EAChB,OAEJvuB,KAAK6S,OAAOF,SAAW3S,KAAK6S,OAAO2S,KAAO,GAAK,KAC/CxlB,KAAK6S,OAAOG,UAAW,CAC3B,MAEIkU,EAAMlnB,KAAK6S,OAAOF,SAAS9P,QAAQ7C,MACnCmB,OAAO+lB,GAAO,EAAG,yBACjBlnB,KAAK6S,OAAOF,SAASwU,OAAOD,EAAK,GAIrC,GADAlnB,KAAK6S,OAAS0b,EACVA,EAAa1D,cACb,OAAQza,GACJ,IAAK,cAEDme,EAAa5b,SAASjN,KAAK1F,MAC3B,MACJ,IAAK,SAEDknB,EAAMqH,EAAa5b,SAAS9P,QAAQkd,GACpC5e,OAAO+lB,GAAO,EAAG,yBACjBqH,EAAa5b,SAASwU,OAAOD,EAAK,EAAGlnB,MACrC,MACJ,IAAK,QAEDknB,EAAMqH,EAAa5b,SAAS9P,QAAQkd,GACpC5e,OAAO+lB,GAAO,EAAG,yBACjBqH,EAAa5b,SAASwU,OAAOD,EAAM,EAAG,EAAGlnB,MACzC,MACJ,QACIW,MAAM,iBAAiByP,YAI/Bme,EAAa5b,SAAW,CAAC3S,MAGzByR,GACAsO,EAAWvN,MAAMf,GAAK,GAEtB8c,IAAiBjB,EACjBiB,EAAaC,mBAAmB,OAAQxuB,MAIxCuuB,EAAaC,mBAAmB,MAAOxuB,MAGvCwL,IAASuU,EAAWvU,OAGpBxL,KAAKsT,QAAQ,sCACbtT,KAAKwS,OAAO6O,IAERA,EAAE7V,KAAOuU,EAAWvU,IAAI,IACzB,IAIP9C,YAAW,KAEP8C,EAAK4b,OAAOtc,WAAW2jB,IAAI,GAC5B,EAtEH,CAyEJ,CAaA,cAAM/X,CAASsS,EAAOrf,GAElBqf,EAAQ9P,mBAAmB8P,IAAUA,EAErC,MAAMjX,EAAO/R,KAAK+oB,gBAAgBC,GAClC,IAAKjX,EAED,OADA/R,KAAKsT,QAAQ,gCAAgC0V,OACtChnB,QAAQ5B,QAAQJ,MAG3B,IACI+R,EAAKic,YAAY,CAAE7F,gBAAgB,GACvC,CACA,MAAO3gB,GAEP,CAEA,OADAuK,EAAKwD,YACwE,KAAxE5L,aAAyC,EAASA,EAAQ0K,UACpDrS,QAAQ5B,QAAQJ,MAEpB+R,EAAKuD,WAAU,EAAM,CAAEhQ,MAAOqE,aAAyC,EAASA,EAAQrE,OACnG,CAEA,MAAAkO,GACI,MAAMhI,EAAOxL,KAAKwL,KACZ0b,EAAMlnB,KAAK6S,OAAOF,SAAS9P,QAAQ7C,MACzCA,KAAK0uB,cAAc,UACnB1uB,KAAK6S,OAAOF,SAASwU,OAAOD,EAAK,GACjClnB,KAAKwS,OAAO6O,IACRA,EAAEsN,eACFnjB,EAAKojB,gBAAgBvN,EAAE,IACxB,GACH7V,EAAK4b,OAAOtc,WAAWuc,UAC3B,CAEA,cAAAwH,GACI,MAAMrjB,EAAOxL,KAAKwL,KACbxL,KAAK2S,WAGNnH,EAAKkd,YAAcld,EAAKkd,WAAWsC,eAAehrB,OAClDwL,EAAKkd,WAAWpT,WAAU,GAE1B9J,EAAKmJ,WAAanJ,EAAKmJ,UAAUqW,eAAehrB,QAChDwL,EAAKmJ,UAAY,MAKrB3U,KAAKwuB,mBAAmB,SAAU,MAClCxuB,KAAKwS,OAAO6O,IACR7V,EAAKojB,gBAAgBvN,EAAE,IAEvBrhB,KAAKwlB,KAELxlB,KAAK2S,SAAW,GAGhB3S,KAAK2S,SAAW,KAGf3S,KAAK8rB,eACN9rB,KAAKgT,UAAW,GAEpBhT,KAAKwL,KAAK4b,OAAOtc,WAAWuc,WAChC,CAEA,YAAAsH,GACQ3uB,KAAKqlB,kBACErlB,KAAKqlB,SAASyJ,SACrB9uB,KAAKqlB,SAAS7R,SACdxT,KAAKqlB,cAAWphB,EAExB,CACA,cAAA8qB,GACI,MAAMC,EAAkB,CAAC,EACnBC,EAAqB,CAAC,EACtBzZ,EAAYxV,KAAKwV,YACjBsU,EAAW9pB,KAAKqlB,SACfrlB,KAAKqlB,SAAS0E,iBAAiB,eAChC,KACN,IAAIG,EAAM,EACV,IAAK,MAAMgF,KAAOlvB,KAAKwL,KAAK6L,QACxB2X,EAAgBE,EAAIzjB,IAAM,CACtBA,GAAIyjB,EAAIzjB,GACRye,IAAKA,EACLnnB,KAAM+mB,EAAWA,EAASI,GAAO,KACjC/F,KAAM+K,GAGL1Z,GAAwB,MAAX0Z,EAAIzjB,KAClBwjB,EAAmBC,EAAIzjB,IAAMujB,EAAgBE,EAAIzjB,KAErDye,IAEJ,MAAO,CACH8E,gBAAiBA,EACjBC,mBAAoBA,EAE5B,CACA,WAAAE,CAAYC,EAASC,EAAYC,EAAcC,GAC3C,IAAIC,EACAjK,EAAOvlB,KAAKiJ,UAAU,QAS1B,GARIjJ,KAAKilB,WACLM,EAAO6J,EAAQzuB,MAEVX,KAAKsiB,YAAciN,IAGxBhK,EAAO6J,EAAQlX,UAEN,IAATqN,EACA,OAAO,KAES,iBAATA,IAEPA,EADKvlB,KAAKylB,eACH2J,EAAQpvB,KAAKylB,gBAEfzlB,KAAKgT,SACHoc,EAAQvW,WAEV7Y,KAAK2S,SACHyc,EAAQxW,OAEV5Y,KAAKwlB,KACH4J,EAAQtW,WAGRsW,EAAQrW,KAGdwM,EAIIA,EAAK1iB,QAAQ,MAAQ,EAE1B2sB,EAAW7qB,aAAa4gB,GAEnBxN,SAASvW,KAAK+jB,GAEnBiK,EAAW7qB,aAAa,oDAAoD4gB,WAI5EiK,EAAW5tB,SAASiD,cAAc,KAClC2qB,EAAS9H,UAAY,WAAanC,IAdlCiK,EAAW5tB,SAASiD,cAAc,KAClC2qB,EAAS9H,UAAY,WAerB4H,EACAD,EAAWC,aAAaE,EAAUF,GAGlCD,EAAWI,YAAYD,GAG3B,MAAME,EAAQ1vB,KAAK+U,WAAW,YAAa,CAAEya,SAAUA,IACvD,IAAIG,EAAQ,KACZ,GAAa,MAATD,IAA2B,IAAVA,EAAiB,CAClC,IAAI3K,EAAU,GACV6K,EAAU,GACVhpB,cAAc8oB,IACdC,EAAQ,GAAKD,EAAMC,MACnB5K,EAAU2K,EAAMG,WAAa,IAAMH,EAAMG,WAAa,GACtDD,EAAUF,EAAMI,aAAe,WAAWJ,EAAMI,gBAAkB,IAGlEH,EADsB,iBAAVD,EACJ,GAAKA,EAGLA,EAES,iBAAVC,IACPA,EAAQhrB,aAAa,wBAAwBogB,KAAW6K,KAAWrtB,WAAWotB,cAE9EA,GACAH,EAASO,OAAOJ,EAExB,CAEA,OAAOH,CACX,CAKA,cAAAQ,CAAe9mB,GACX,MAAMsC,EAAOxL,KAAKwL,KACZykB,EAAczkB,EAAK7B,QACnBgc,EAAW3lB,KAAKiJ,UAAU,YAC1BoO,EAAU7L,EAAK6L,QACfgR,EAAQroB,KAAKymB,WACb1P,EAAevL,EAAKiK,WAAa,KAAOjK,EAAKuL,aACnD,IAAIhU,EACAmtB,EAASlwB,KAAKqlB,SACd8K,EAAe,KACfC,EAAe,KACnB,MAAMC,GAASH,EACf/uB,OAAOkvB,EAAO,4BACdlvB,QAAQkvB,GAAUnnB,GAAQA,EAAKonB,MAAQ,wCACvCnvB,QAAQnB,KAAK8rB,aAAc,yBAC3BoE,EAAStuB,SAASiD,cAAc,OAChCqrB,EAAO/sB,UAAUqG,IAAI,UACrB0mB,EAAO1rB,MAAM+rB,IAnxEF,GAmxEQvwB,KAAKolB,QAAuB,KAC/CplB,KAAKqlB,SAAW6K,EAEhBA,EAAOpB,SAAW9uB,KAClB,MAAMwwB,EAAW5uB,SAASiD,cAAc,QACxC2rB,EAASrtB,UAAUqG,IAAI,UAAW,UAClC0mB,EAAOT,YAAYe,GACnB,IAAIC,EAAa,EACb9K,IACAwK,EAAevuB,SAASiD,cAAc,KACtCsrB,EAAahtB,UAAUqG,IAAI,gBACV,UAAbmc,GAAwB3lB,KAAK6S,OAAO+S,aACpCuK,EAAahtB,UAAUqG,IAAI,YAE/BgnB,EAASf,YAAYU,GACrBM,GA9xEO,IAgyEX,IAAK,IAAIruB,EAAIimB,EAAQ,EAAGjmB,EAAI,EAAGA,IAC3BW,EAAOnB,SAASiD,cAAc,KAC9B9B,EAAKI,UAAUqG,IAAI,aACnBgnB,EAASf,YAAY1sB,GACrB0tB,GApyEO,KAsyENR,EAAYrJ,gBAAkByB,EAAQ4H,EAAYrJ,kBACnDwJ,EAAexuB,SAASiD,cAAc,KACtCurB,EAAajtB,UAAUqG,IAAI,eAC3BgnB,EAASf,YAAYW,GACrBK,GA1yEO,IA8yEMzwB,KAAKmvB,YAAY3jB,EAAK4jB,QAASoB,EAAU,MAAOJ,KAE7DK,GAhzEO,IAkzEX,MAAMC,EAAY9uB,SAASiD,cAAc,QACzC6rB,EAAUvtB,UAAUqG,IAAI,YACxBgnB,EAASf,YAAYiB,GAIrBF,EAASG,YAAcF,EAEnBjlB,EAAK7B,QAAQiV,IAAIlB,YACjB8S,EAASI,WAAY,GAIzB,IADkB5wB,KAAKwV,aACL6B,EAAQlV,OAAS,EAAG,CAClC,IAAIynB,EAAS,EACb,IAAK,MAAMsF,KAAO7X,EAAS,CAEvB,IAAIwZ,EADJjH,IAEe,MAAXsF,EAAIzjB,GACJolB,EAAUL,GAGVK,EAAUjvB,SAASiD,cAAc,QACjCgsB,EAAQ1tB,UAAUqG,IAAI,UACtB0mB,EAAOT,YAAYoB,IAEnBjH,IAAW7S,GACX8Z,EAAQ1tB,UAAUqG,IAAI,aAG1B0lB,EAAInK,SAAU8L,EAAQ1tB,UAAUqG,OAAO0lB,EAAInK,QAAQzd,MAAM,MACzDupB,EAAQrsB,MAAMssB,KAAO5B,EAAI6B,OAAS,KAClCF,EAAQrsB,MAAMwsB,MAAQ9B,EAAI+B,SAAW,KACjCZ,GAASnB,EAAItqB,MACW,iBAAbsqB,EAAItqB,OACXisB,EAAQ/rB,UAAYoqB,EAAItqB,KAGpC,CACJ,CAGA,OADcsE,EAAOA,EAAKonB,MAAQ,QAE9B,IAAK,QACD9kB,EAAK0lB,gBAAgBC,QAAQjB,GAC7B,MACJ,IAAK,OACD1kB,EAAK0lB,gBAAgBzB,YAAYS,GACjC,MACJ,QACIhnB,EAAKonB,MAAMA,MAAMJ,GAGzBhnB,EAAKmnB,OAAQ,EACbrwB,KAAKoxB,aAAaloB,EACtB,CAMA,YAAAkoB,CAAaloB,GACT/H,OAAOnB,KAAKqlB,SAAU,eACtB,MAAM7Z,EAAOxL,KAAKwL,KACZykB,EAAczkB,EAAK7B,QACnBumB,EAASlwB,KAAKqlB,SACdgL,IAAUnnB,EAAKmnB,MACfgB,IAAkBnoB,EAAKmoB,cACvBha,EAAU7L,EAAK6L,QACf7B,EAAYxV,KAAKwV,YAEjBgb,EAAWN,EAAO3sB,cAAc,gBAChCmtB,EAAYF,EAASjtB,cAAc,iBACnC8c,EAAY7U,EAAKzC,QAAQsX,UAa/B,GAZIrgB,KAAKoS,mBACLse,EAAU5rB,UAAY9E,KAAKoS,mBAG3Bse,EAAUY,YAActxB,KAAKgS,MAI7Bqf,IACA7lB,EAAKzC,QAAQsX,UAAYA,IAGxB4P,EAAYsB,SACb,GAAI/b,EAAW,CACX,MAAMgc,EAAUhmB,EAAKzC,QAAQ0oB,YAC7Bf,EAAUlsB,MAAMwsB,MACZQ,EAAUhB,EAASG,YAv4Ed,EAu4E+C,IAC5D,MAEID,EAAUlsB,MAAMwsB,MACZ3Z,EAAQ,GAAG4Z,SACPT,EAASG,YA54ER,EA84ED,KAOhB,GAHAznB,EAAKwoB,cAAe,EACpB1xB,KAAK2xB,eAAezoB,GAEhBlJ,KAAKylB,eACLzlB,KAAK+U,WAAW,mBAAoB,CAChCsb,MAAOA,EACPG,SAAUA,EACVhb,UAAWA,SAGd,GAAIxV,KAAK6S,OAAQ,CAElB,MAAM+e,EAAa5xB,KAAK+uB,iBACxB/uB,KAAK+U,WAAW,SAAU,CACtBsb,MAAOA,EACPG,SAAUA,EACVhb,UAAWA,EACXwZ,gBAAiB4C,EAAW5C,gBAC5BC,mBAAoB2C,EAAW3C,oBAEvC,CACJ,CAKA,cAAA0C,CAAezoB,GAEX,MAAMsC,EAAOxL,KAAKwL,KACZ4jB,EAAU5jB,EAAK4jB,QACfa,EAAczkB,EAAK7B,QACnByc,EAAWpmB,KAAK0D,KAAO8H,EAAKmW,MAAM3hB,KAAK0D,MAAQ,KAC/CwsB,EAASlwB,KAAKqlB,SAEdmL,EAAWN,EAAO3sB,cAAc,gBAChC6sB,EAAeI,EAASjtB,cAAc,iBACtC4sB,EAAeK,EAASjtB,cAAc,iBACtCsuB,EAAa,CAAC,UAwBpB,GAvBA7xB,KAAKgT,UAAW6e,EAAWnsB,KAAK,eAChC1F,KAAKwlB,MAAOqM,EAAWnsB,KAAK,WAC5B1F,KAAK6lB,UAAWgM,EAAWnsB,KAAK,eAChC1F,KAAKklB,UAAW2M,EAAWnsB,KAAK,cAChC1F,OAASwL,EAAKkd,YAAamJ,EAAWnsB,KAAK,aAC3C1F,OAASwL,EAAKmJ,WAAYkd,EAAWnsB,KAAK,YAC1C1F,KAAKilB,YAAa4M,EAAWnsB,KAAK,YAClC1F,KAAKsiB,YAAauP,EAAWnsB,KAAK,cAClC1F,KAAKwV,aAAcqc,EAAWnsB,KAAK,cACnC1F,KAAKylB,gBACCoM,EAAWnsB,KAAK,aAAe1F,KAAKylB,gBAE1CzlB,KAAKiR,OAAQ4gB,EAAWnsB,KAAK,YAC7B1F,KAAKuS,eAAgBsf,EAAWnsB,KAAK,eACrCuqB,EAAYsB,UAAWM,EAAWnsB,KAAK,eAEvCwqB,EAAOxI,UAAYmK,EAAW7rB,KAAK,KAEnChG,KAAK+kB,SAAUmL,EAAO/sB,UAAUqG,OAAOxJ,KAAK+kB,SAExCqB,GAAYA,EAASrB,SACrBmL,EAAO/sB,UAAUqG,OAAO4c,EAASrB,SAEjCqL,EAAc,CACd,IAAI0B,EAAQ,KACR9xB,KAAKsiB,WACLwP,EAAQ1C,EAAQlX,QAEXlY,KAAKqW,cAAa,GAEnByb,EADA9xB,KAAKgT,SACGoc,EAAQjX,iBAGRiX,EAAQhX,kBAGfpY,KAAKwlB,MAAyB,MAAjBxlB,KAAK2S,WACvBmf,EAAQ1C,EAAQ/W,cAEP,MAATyZ,EACA1B,EAAajtB,UAAUqG,IAAI,aAEtBuO,SAASvW,KAAKswB,GACnB1B,EAAa5rB,MAAMutB,gBAAkB,QAAQD,MAG7C1B,EAAa1I,UAAY,eAAiBoK,CAElD,CACA,GAAI3B,EAAc,CACd,IAAI6B,EAAU,eACVhyB,KAAK4rB,WACLoG,GAAW,YACPhyB,KAAK6lB,SACLmM,GAAW5C,EAAQ3W,aAKnBuZ,GAAW5C,EAAQ1W,gBAInB1Y,KAAK6lB,SACLmM,GAAW5C,EAAQ9W,aAEdtY,KAAKklB,SACV8M,GAAW5C,EAAQ5W,aAGnBwZ,GAAW5C,EAAQ7W,eAG3B4X,EAAazI,UAAYsK,CAC7B,CAEA,IAAK9oB,EAAKmnB,MAAO,CACb,IAAIjuB,EAAI,EACR,IAAK,MAAM6vB,KAAW/B,EAAOvd,SACzBsf,EAAQ9uB,UAAUmP,OAAO,YAAalQ,MAAQoJ,EAAKuL,cAGvD,MAAMyY,EAAWgB,EAASjtB,cAAc,aACpCisB,GACAxvB,KAAKmvB,YAAY3jB,EAAK4jB,QAASoB,EAAUhB,GAAWY,EAE5D,CAEA,IAAwB,IAApBlnB,EAAKgpB,aAAyBlyB,KAAKwV,YAAa,CAChD,MAAMsU,EAAWoG,EAAOnG,iBAAiB,eACzC,IAAIG,EAAM,EACNiI,EAAM,EACV,IAAK,MAAMC,KAAUpyB,KAAKwL,KAAK6L,QAAS,CACpC,MAAMwZ,EAAU/G,EAASI,GACzB2G,EAAQrsB,MAAMssB,KAAO,GAAGqB,MACxBtB,EAAQrsB,MAAMwsB,MAAQ,GAAGoB,EAAOnB,aAChC/G,IACAiI,GAAOC,EAAOnB,QAClB,CACJ,CACJ,CAeA,OAAAtb,CAAQhM,GAEJ,MAAMT,EAAO9C,OAAO0D,OAAO,CAAEuoB,OAAQvnB,WAAWsB,MAAQzC,GAIxD,OAHK3J,KAAKqlB,WACNnc,EAAKmpB,OAASvnB,WAAWwnB,KAErBppB,EAAKmpB,QACT,IAAK,SACDryB,KAAK2xB,eAAezoB,GACpB,MACJ,IAAK,OACDlJ,KAAKoxB,aAAaloB,GAClB,MACJ,IAAK,MAEDlJ,KAAKgwB,eAAe9mB,GACpB,MACJ,QACIvI,MAAM,wBAAwBuI,EAAKmpB,YAE/C,CAKA,SAAAtE,GACI/tB,KAAK6uB,iBACL7uB,KAAKgT,UAAW,EAChBhT,KAAKwlB,MAAO,EACZxlB,KAAK2S,SAAW,KAChB3S,KAAKwL,KAAK4b,OAAOtc,WAAWuc,UAChC,CAYA,MAAAjG,CAAOmR,GAAY,EAAO5wB,GACtB,MAAM6wB,EAAO,CAAC,EAmBd,GAlBA7N,gBAAgBnkB,SAAS6b,IACrB,MAAM/S,EAAMtJ,KAAKqc,GACb/S,aAAenE,IAEfmE,EAAI8V,OACGoT,EAAKnW,GAAY7V,MAAMH,UAAUL,KAAK3D,KAAKiH,EAAI5C,OAAQ,OAGzD4C,IAAe,IAARA,GAAyB,IAARA,KAC7BkpB,EAAKnW,GAAY/S,EACrB,IAEC7C,cAAczG,KAAKoM,QACpBomB,EAAKpmB,KAAOnG,OAAO,CAAC,EAAGjG,KAAKoM,MACxB3F,cAAc+rB,EAAKpmB,cACZomB,EAAKpmB,MAGhBzK,EAAU,CACV,MAAMuQ,EAAMvQ,EAAS6wB,EAAMxyB,MAC3B,IAAY,IAARkS,EAEA,OAAO,EAEC,SAARA,IACAqgB,GAAY,EAEpB,CACA,GAAIA,GACIhsB,QAAQvG,KAAK2S,UAAW,CACxB6f,EAAK7f,SAAW,GAChB,IAAK,IAAIvQ,EAAI,EAAG+jB,EAAInmB,KAAK2S,SAASxQ,OAAQC,EAAI+jB,EAAG/jB,IAAK,CAClD,MAAM2P,EAAO/R,KAAK2S,SAASvQ,GAC3B,IAAK2P,EAAKgQ,eAAgB,CAEtB,MAAM7P,EAAMH,EAAKqP,QAAO,EAAMzf,IAClB,IAARuQ,GACAsgB,EAAK7f,SAASjN,KAAKwM,EAE3B,CACJ,CACJ,CAEJ,OAAOsgB,CACX,CAgBA,SAAAvpB,CAAUlF,EAAMoF,GACZ,MAAMqC,EAAOxL,KAAKwL,KAClB,IAAItC,EAAOsC,EAAK7B,QAEZ5F,EAAKlB,QAAQ,MAAQ,KACpBqG,EAAMnF,GAAQA,EAAKuD,MAAM,MAE9B,MAAMjH,EAAQ6I,EAAKnF,GAEnB,GAAqB,mBAAV1D,EAAsB,CAC7B,MAAM6R,EAAM7R,EAAMgC,KAAKmJ,EAAM,CACzB9H,KAAM,UACN8H,KAAMA,EACNuG,KAAM/R,OAGV,QAAYiE,IAARiO,EACA,OAAOA,CAEf,CAEA,QAAmBjO,IAAfjE,KAAK+D,GACL,OAAO/D,KAAK+D,GAGhB,MAAMqiB,EAAWpmB,KAAK0D,KAAO8H,EAAKmW,MAAM3hB,KAAK0D,WAAQO,EAC/CiO,EAAMkU,EAAWA,EAASriB,QAAQE,EACxC,YAAYA,IAARiO,EACOA,EAGJ7R,QAAqCA,EAAQ8I,CACxD,CAIA,oBAAMgf,CAAexe,GACjB,MAAMT,EAAO9C,OAAO0D,OAAO,CAAEiI,KAAM/R,MAAQ2J,GAC3C,OAAO3J,KAAKwL,KAAKinB,SAASvpB,EAC9B,CAIA,eAAMoM,CAAU/Q,GAAO,EAAMoF,GACzB,MAAM6B,EAAOxL,KAAKwL,KACZknB,EAAOlnB,EAAKkd,WACZiK,EAAYhpB,aAAyC,EAASA,EAAQgpB,UACtEC,EAAYjpB,aAAyC,EAASA,EAAQipB,UACtEje,GAAsF,KAAzEhL,aAAyC,EAASA,EAAQgL,WACvExB,EAAWxJ,aAAyC,EAASA,EAAQwJ,SACrE0f,EAAWlpB,aAAyC,EAASA,EAAQrE,MAC3E,IAAK6N,EACD,GAAI5O,GACA,GAAImuB,IAAS1yB,MAAQ2yB,EAAW,CAC5B,IAGQ,KAHHD,aAAmC,EAASA,EAAK3d,WAAW,aAAc,CAC3E+d,SAAU9yB,KACVsF,MAAOutB,OAKA,IAHP7yB,KAAK+U,WAAW,iBAAkB,CAC9Bge,SAAUL,EACVptB,MAAOutB,IAEX,OAEJrnB,EAAKkd,WAAa,KAClBgK,SAA4CA,EAAKtL,OAAOtc,WAAW3K,OACvE,OAEKuyB,IAAS1yB,MAAQ2yB,IACtB3yB,KAAK+U,WAAW,aAAc,CAAE+d,SAAU,KAAMxtB,MAAOutB,IAyB/D,OAtBIH,IAAS1yB,OACLuE,IACAiH,EAAKkd,WAAa1oB,MACd2U,GAAaie,KACbpnB,EAAKmJ,UAAY3U,MAEjB4yB,GACApnB,EAAK+J,YAGbmd,SAA4CA,EAAKtL,OAAOtc,WAAW3K,QACnEH,KAAKonB,OAAOtc,WAAW3K,SAEvBwJ,GACkB,MAAlBA,EAAQigB,QACRjgB,EAAQigB,SAAWpe,EAAKuL,cACxBvL,EAAK2L,aACL3L,EAAKsL,UAAUnN,EAAQigB,QAEvBrlB,IAAS4O,GACTnT,KAAK+U,WAAW,WAAY,CAAEge,SAAUL,EAAMptB,MAAOutB,IAElD7yB,KAAKguB,aAChB,CAIA,iBAAM/a,CAAY1O,GAAO,EAAMoF,GAC3B,MAAMqe,MAAEA,EAAKG,eAAEA,EAAc6K,UAAEA,GAAcrpB,QAAyCA,EAAU,CAAC,EACjG,IAAKpF,GACDvE,KAAKoW,cACLpW,KAAKymB,YAAczmB,KAAKwL,KAAKvC,UAAU,oBACtC+e,EAED,YADAhoB,KAAK6W,SAAS,+CAGlB,IAAKtS,IAAUvE,KAAKgT,SAChB,OAGAzO,GAAQvE,KAAKiJ,UAAU,iBACvBjJ,KAAKynB,iBAAiB9d,GAEtBpF,GAAQvE,KAAKwlB,MAAyB,MAAjBxlB,KAAK2S,gBACpB3S,KAAK+nB,WAEf/nB,KAAKgT,SAAWzO,EAChB,MAAM0uB,EAAa,CAAED,UAAWA,GAGhC,GADAhzB,KAAKwL,KAAK4b,OAAOtc,WAAWuc,UAAW4L,GACnC1uB,GAAQ4jB,EAAgB,CACxB,MAAM+K,EAAYlzB,KAAKgqB,eACnBkJ,IACAlzB,KAAKwL,KAAK6iB,6BACV6E,EAAU/K,eAAe,CAAEgL,QAASnzB,OAE5C,CACJ,CAKA,QAAAuV,CAAShR,GAAO,GACZpD,SAASoD,EAAM,+BACf,MAAMmuB,EAAO1yB,KAAKwL,KAAKmJ,UACvB3U,KAAKwL,KAAKmJ,UAAY3U,KACtB0yB,SAA4CA,EAAKtL,SACjDpnB,KAAKonB,QACT,CAEA,OAAAgM,CAAQ7N,GACJvlB,KAAKulB,KAAOA,EACZvlB,KAAKonB,QACT,CAEA,MAAAiM,CAAO9tB,EAAKuf,GACR,MAAM,IAAIxkB,MAAM,sBACpB,CAYA,MAAA8mB,CAAOiL,EAASvnB,WAAWsB,MACvBjL,OAAOkxB,IAAWvnB,WAAW3K,QAAUkyB,IAAWvnB,WAAWsB,KAAM,uBAAuBimB,KAC1FryB,KAAKwL,KAAK4b,OAAOiL,EAAQryB,KAC7B,CAKA,gBAAAszB,CAAiBC,GAAgB,GAC7B,MAAM7M,EAAW,GASjB,OARA1mB,KAAKwS,OAAOT,IACR,GAAIA,EAAK8T,WACLa,EAAShhB,KAAKqM,IACQ,IAAlBwhB,GACA,MAAO,MAEf,IAEG7M,CACX,CAEA,cAAAjQ,CAAe9M,GACX,IAAIpF,EAAOvE,KAAK+rB,aAOhB,OAFIxnB,OAJSN,IAATM,GAAuBvE,KAAK4rB,WAIpBrnB,EAHDvE,KAAKwzB,iBAKTxzB,KAAKyzB,YAAYlvB,EAAMoF,EAClC,CAEA,cAAA6pB,GACI,IAAIE,GAAQ,EAUZ,OATA1zB,KAAKwS,OAAOT,IACR,IAAsB,IAAlBA,EAAK8T,WACJ9T,EAAK+T,eACL/T,EAAK8Y,gBACL9Y,EAAKc,OAAO+S,WAEb,OADA8N,GAAQ,GACD,CACX,IAEGA,CACX,CAEA,wBAAAC,CAAyBC,GACrB,IAAIC,GAAU,EACd,OAAQD,GACJ,KAAK,EACDC,EAAU7zB,KAAK6lB,UAAY7lB,KAAKklB,SAChCllB,KAAK6lB,UAAW,EAChB7lB,KAAKklB,UAAW,EAChB,MACJ,KAAK,EACD2O,GAAW7zB,KAAK6lB,WAAa7lB,KAAKklB,SAClCllB,KAAK6lB,UAAW,EAChB7lB,KAAKklB,UAAW,EAChB,MACJ,UAAKjhB,EACD4vB,EAAU7zB,KAAK6lB,WAAa7lB,KAAKklB,SACjCllB,KAAK6lB,UAAW,EAChB7lB,KAAKklB,UAAW,EAChB,MACJ,QACIvkB,MAAM,kBAAkBizB,KAKhC,OAHIC,GACA7zB,KAAKonB,SAEFyM,CACX,CAKA,uBAAAC,CAAwB5qB,GACpB,MAAM8e,KAAW9e,aAAmC,EAASA,EAAK8e,OAC5DzjB,EAAOvE,KAAK+rB,aAClB/rB,KAAKwS,OAAOT,IACR,GAAIA,EAAK6T,WACL,MAAO,QAEPoC,GAAUjW,EAAK9I,UAAU,iBACzB8I,EAAK4hB,yBAAyBpvB,EAClC,IAEJvE,KAAKysB,2BACT,CAOA,yBAAAA,CAA0BvjB,GACtB,MAAM8e,KAAW9e,aAAmC,EAASA,EAAK8e,OAClE7mB,OAAwC,SAAjCnB,KAAKwL,KAAK7B,QAAQ6iB,WAAuB,8BAGhD,MAAMuH,EAAShiB,IACX,IAAI6hB,EACJ,MAAMjhB,EAAWZ,EAAKY,SACtB,GAAIA,GAAYA,EAASxQ,OAAQ,CAE7B,IAAI6xB,GAAc,EACdC,GAAe,EACnB,IAAK,IAAI7xB,EAAI,EAAG+jB,EAAIxT,EAASxQ,OAAQC,EAAI+jB,EAAG/jB,IAAK,CAC7C,MAAMykB,EAAQlU,EAASvQ,GAEjBI,EAAIuxB,EAAMlN,IACN,IAANrkB,IACAyxB,GAAe,IAET,IAANzxB,IACAwxB,GAAc,EAEtB,CACAJ,IAAQI,KAAqBC,QAAehwB,CAChD,MAGI2vB,IAAU7hB,EAAK8T,SAYnB,OATI9T,EAAKmT,WACJnT,EAAK8T,UACN9T,EAAKyT,MACY,MAAjBzT,EAAKY,WACLihB,OAAQ3vB,IAER+jB,GAAUjW,EAAK9I,UAAU,iBACzB8I,EAAK4hB,yBAAyBC,GAE3BA,CAAK,EAEhBG,EAAM/zB,MAENA,KAAK8S,cAAcf,IACf,IAAI6hB,EACJ,MAAMjhB,EAAWZ,EAAKY,SACtB,IAAIqhB,GAAc,EACdC,GAAe,EACnB,IAAK,IAAI7xB,EAAI,EAAG+jB,EAAIxT,EAASxQ,OAAQC,EAAI+jB,EAAG/jB,IAAK,CAC7C,MAAMykB,EAAQlU,EAASvQ,GACvBwxB,IAAU/M,EAAMhB,UAEZ+N,GAAS/M,EAAM3B,YACf+O,GAAe,GAEdL,IACDI,GAAc,EAEtB,CACAJ,IAAQI,KAAqBC,QAAehwB,EAC5C8N,EAAK4hB,yBAAyBC,EAAM,GAE5C,CAEA,WAAAH,CAAYlvB,GAAO,EAAMoF,GACrB,MAAM6B,EAAOxL,KAAKwL,KACZ0oB,IAAevqB,aAAyC,EAASA,EAAQwJ,UACzEuf,EAAO1yB,KAAK+rB,aACZH,EAAU5rB,KAAK6S,QAAU7S,KAAK6S,OAAO+S,WACrC4G,EAAahhB,EAAK7B,QAAQ6iB,WAC1B2H,GAAaxqB,aAAyC,EAASA,EAAQqe,SAAWhoB,KAAKiJ,UAAU,gBAGvG,OAFA1E,IAASA,EAEJ4vB,GAGAxqB,aAAyC,EAASA,EAAQyqB,gBAAiC,UAAf5H,GAC7EhhB,EAAKuF,uBAAsB,KACvB/Q,KAAKwS,OAAOT,IACRA,EAAK0hB,YAAYlvB,EAAK,GACxB,IAECmuB,IAEPnuB,IAASmuB,GACRwB,IAAkE,IAApDl0B,KAAK+U,WAAW,eAAgB,CAAExQ,KAAMA,MAG3DiH,EAAKuF,uBAAsB,KACvB,GAAI6a,EAAS,CAET,IAAKrnB,KAAUoF,aAAyC,EAASA,EAAQqe,OACrE,OAAO0K,EAEX,IAAK,MAAM2B,KAAWr0B,KAAK6S,OAAOF,SAC9B0hB,EAAQxO,SAAWwO,IAAYr0B,IAEvC,MAEIA,KAAK6lB,SAAWthB,EACG,SAAfioB,EACAxsB,KAAK8zB,0BAEe,WAAftH,GACLhhB,EAAKgH,OAAO6O,IACRA,EAAEwE,UAAW,CAAK,GAG9B,IAEAqO,GACAl0B,KAAK+U,WAAW,SAAU,CAAExQ,KAAMA,KAzB3BmuB,GAZAA,CAwCf,CAEA,SAAAjgB,CAAUtS,EAAQwJ,GACd,MAAM6B,EAAOxL,KAAKwL,KACZmiB,EAAUhkB,aAAyC,EAASA,EAAQgkB,QACpE2G,EAAU3qB,aAAyC,EAASA,EAAQ2qB,QAC1E,IAAIC,EAAa,KACjB,MAOMC,EAAkBpoB,IAIpB,MAAMuG,EAAW3S,KAAK2S,SAChB8hB,EAAa9hB,EAAWA,EAAS,GAAK,KAM5C,OALAxR,OAAOiL,EAAKqZ,eAAgB,qBAC5BtkB,QAAQszB,IAAeA,EAAW1S,eAAgB,mCAClDwS,EAAav0B,KAAKsnB,QAAQlb,EAAM,gBAChCmoB,EAAWtjB,OAAQ,EACnBzF,EAAK4b,OAAOtc,WAAWuc,WAChBkN,CAAU,EAGrB,OArByB,MAErB,MAAM5hB,EAAW3S,KAAK2S,SAClBA,GAAYA,EAASxQ,QAAUwQ,EAAS,GAAGoP,gBAC3CpP,EAAS,GAAGa,QAChB,EAeJkhB,GACQv0B,GACJ,IAAK,KACDH,KAAKsiB,YAAa,EAClBtiB,KAAKilB,WAAa,KAClB,MACJ,IAAK,UACDjlB,KAAKsiB,YAAa,EAClBtiB,KAAKilB,WAAa,KACdjlB,KAAK6S,OACL7S,KAAKonB,OAAOtc,WAAW3K,QAIvBq0B,EAAe,CACX/O,eAAgBtlB,EAChB6R,MAAOxG,EAAK7B,QAAQgrB,QAAQzc,SACvByV,EAAU,KAAOA,EAAU,IAAM,IACtChI,UAAU,EACVD,SAAS,EACTkK,QAAS0E,IAIjB,MACJ,IAAK,QACDE,EAAe,CACX/O,eAAgBtlB,EAChB6R,MAAOxG,EAAK7B,QAAQgrB,QAAQC,WACvBjH,EAAU,KAAOA,EAAU,IAAM,IACtChI,UAAU,EACVD,SAAS,EAETkK,QAAS0E,IAEbt0B,KAAKsiB,YAAa,EAClBtiB,KAAKilB,WAAa,CAAE0I,QAASA,EAAS2G,QAASA,GAC/C,MACJ,IAAK,SACDE,EAAe,CACX/O,eAAgBtlB,EAChB6R,MAAO2b,GAAWniB,EAAK7B,QAAQgrB,QAAQtkB,OACvCsV,UAAU,EACVD,SAAS,EACTkK,QAAS0E,IAEbt0B,KAAKsiB,YAAa,EAClBtiB,KAAKilB,WAAa,KAClB,MACJ,QACItkB,MAAM,uBAAyBR,GAGvC,OADAqL,EAAK4b,OAAOtc,WAAWuc,WAChBkN,CACX,CAEA,QAAAM,CAAS7iB,GACLhS,KAAKgS,MAAQA,EACbhS,KAAKonB,QAET,CACA,aAAA0N,CAAcC,EAAKC,GACf,MAAM9O,EAAKlmB,KAAK2S,SAChB,GAAKuT,IAGLA,EAAG+O,KAAKF,GACJC,GACA,IAAK,IAAI5yB,EAAI,EAAG+jB,EAAID,EAAG/jB,OAAQC,EAAI+jB,EAAG/jB,IAC9B8jB,EAAG9jB,GAAGuQ,UACNuT,EAAG9jB,GAAG0yB,cAAcC,EAAKC,EAIzC,CAOA,YAAAE,CAAaH,EAAM5a,gBAAiB6a,GAAO,GACvCh1B,KAAK80B,cAAcC,GAAO5a,gBAAiB6a,GAC3Ch1B,KAAKwL,KAAK4b,OAAOtc,WAAWuc,UAEhC,CAKA,kBAAAmH,CAAmB2G,EAAWtO,EAAOpP,GACjCzX,KAAK6W,SAAS,eAAese,KAAc1d,EAAOoP,GAC7C7mB,KAAKwL,KAAK7B,QAAQyrB,cAGnBvO,GAASA,EAAMhU,SAAW7S,MAC1BW,MAAM,SAAWkmB,EAAQ,sBAAwB7mB,MAErDA,KAAK+U,WAAW,cAAe9O,OAAO,CAAEkvB,UAAWA,EAAWtO,MAAOA,GAASpP,IAClF,CAMA,aAAAiX,CAAcyG,EAAW1d,GAIrBzX,KAAK6S,OAAO2b,mBAAmB2G,EAAWn1B,KAAMyX,EACpD,CAaA,KAAAjF,CAAM7Q,EAAU2oB,GAAc,GAC1B,IAAIpY,GAAM,EACV,MAAMS,EAAW3S,KAAK2S,SACtB,IAAoB,IAAhB2X,IACApY,EAAMvQ,EAAS3B,OACH,IAARkS,GAAyB,SAARA,GACjB,OAAOA,EAGf,GAAIS,EACA,IAAK,IAAIvQ,EAAI,EAAG+jB,EAAIxT,EAASxQ,OAAQC,EAAI+jB,IACrCjU,EAAMS,EAASvQ,GAAGoQ,MAAM7Q,GAAU,IACtB,IAARuQ,GAFoC9P,KAOhD,OAAO8P,CACX,CAOA,YAAAY,CAAanR,EAAU2oB,GAAc,GACjC,GAAIA,IAAkC,IAAnB3oB,EAAS3B,MACxB,OAAO,EAEX,IAAI+S,EAAI/S,KAAK6S,OACb,KAAOE,GAAG,CACN,IAAoB,IAAhBpR,EAASoR,GACT,OAAO,EAEXA,EAAIA,EAAEF,MACV,CACA,OAAO,CACX,CASA,aAAAwiB,CAAc1zB,EAAU2oB,GAAc,GAClC,MAAML,EAAKjqB,KAAK6S,OAAOF,SACvB,IAAK,IAAIvQ,EAAI,EAAG+jB,EAAI8D,EAAG9nB,OAAQC,EAAI+jB,EAAG/jB,IAAK,CACvC,MAAMif,EAAI4I,EAAG7nB,GACb,IAAIkoB,GAAejJ,IAAMrhB,QACD,IAAhB2B,EAAS0f,GACT,OAAO,CAGnB,CACA,OAAO,CACX,CAIA,SAAAiU,GACI,QAASt1B,KAAKwL,KAAKiF,aAAezQ,KAAKiR,MAC3C,EAEJ4T,eAAeS,SAAW;;;;;;AAQ1B,MAAMiQ,sBAAsBhqB,oBACxB,WAAAxL,CAAYyL,GACRkE,MAAMlE,EAAM,OAAQ,CAChBsB,SAAU,IACV0oB,UAAW,EACXC,UAAW,KACXC,QAAS,GACT3wB,MAAM,EACNX,QAAQ,EACRuxB,eAAgB,IAChBC,UAAU,EAGVC,WAAY,KACZC,KAAM,KACNztB,MAAO,OAEXrI,KAAK+1B,YAAc,KACnB/1B,KAAKg2B,YAAc,KACnBh2B,KAAKi2B,kBAAoBnpB,SAAS9M,KAAKk2B,UAAUpX,KAAK9e,MAAOA,KAAK8L,gBAAgB,YACtF,CAIA,YAAAqqB,CAAavhB,EAAW7C,EAAM8e,EAASpZ,GACnC,IAAIvF,EACJH,EAAKmF,IAAI,gBAAgBtC,KAAc6C,GACvCoZ,EAAQ1tB,UAAUqG,IAAI,WACtBqnB,EAAQ1tB,UAAUqQ,OAAO,YACzB,IACItB,EAAMH,EAAKgD,WAAWH,EAAW6C,EACrC,CACA,MAAO9O,GACHoJ,EAAK2b,SAAS,YAAY9Y,kBAA2BjM,GACrDkoB,EAAQ1tB,UAAUqG,IAAI,YACtBqnB,EAAQ1tB,UAAUqQ,OAAO,UAC7B,CAaA,OAXMtB,aAAelQ,UACjBkQ,EAAMlQ,QAAQ5B,QAAQ8R,IAE1BA,EACKhR,OAAOyH,IACRoJ,EAAK2b,SAAS,YAAY9Y,kBAA2BjM,GACrDkoB,EAAQ1tB,UAAUqG,IAAI,WAAW,IAEhCib,SAAQ,KACToM,EAAQ1tB,UAAUqQ,OAAO,UAAU,IAEhCtB,CACX,CAIA,SAAAgkB,CAAU1uB,GAEN,MAAM2c,EAAOpD,WAAWqD,aAAa5c,GAC/BuK,EAAOoS,EAAKpS,KACZ8e,EAAU1M,EAAK0M,QAChB9e,GAAwB,IAAhBoS,EAAKyF,OAIlB5pB,KAAKm2B,aAAa,SAAUpkB,EAAM8e,EAAS,CACvC1M,KAAMA,EACN7e,MAAOkC,EACP4uB,UAAW5uB,EAAEC,OACb4uB,WAAYtV,WAAW5V,KAAKrI,iBAAiB0E,EAAEC,UAP/CzH,KAAKwL,KAAK0L,IAAI,yDAStB,CAIA,IAAAnL,GACI2D,MAAM3D,OACNhF,QAAQ/G,KAAKwL,KAAKzC,QAAS,SAC3B,0CAMCvB,GAAMxH,KAAKk2B,UAAU1uB,IAC1B,CAEA,mBAAA8uB,CAAoBlqB,GAChB,MAAM9G,EAAQ8G,EAAK9G,MACbsP,EAAYvP,cAAcC,GAC1BkG,EAAOxL,KAAKwL,KACZkqB,EAAU11B,KAAK8L,gBAAgB,WAMrC,GAAI9L,KAAKu2B,iBAAkB,CACvB,OAAQ3hB,GACJ,IAAK,QAED,OADA5U,KAAKw2B,gBAAe,EAAM,CAAElxB,MAAOA,KAC5B,EACX,IAAK,SAED,OADAtF,KAAKw2B,gBAAe,EAAO,CAAElxB,MAAOA,KAC7B,EAIf,OAAO,CACX,CAEA,GAAIkG,EAAKiK,YAAoC,IAAtBjK,EAAKuL,aAAoB,CAC5C,OAAQnC,GACJ,IAAK,QACD,GAAI8gB,EAAQ7yB,QAAQ,aAAe,GAAKnD,MAEpC,OADAM,KAAKy2B,kBACE,EAEX,MACJ,IAAK,KACD,GAAIf,EAAQ7yB,QAAQ,OAAS,EAGzB,OADA7C,KAAKy2B,kBACE,EAInB,OAAO,CACX,CACA,OAAO,CACX,CAEA,cAAAF,CAAexkB,GACX,OAAOA,EAAO/R,KAAK+1B,cAAgBhkB,IAAS/R,KAAK+1B,WACrD,CAEA,cAAAU,CAAe1kB,GACXA,EAAOA,QAAmCA,EAAO/R,KAAKwL,KAAK2J,gBAC3D,MAAMygB,EAAW51B,KAAK8L,gBAAgB,YAChC1H,EAASpE,KAAK8L,gBAAgB,UACpC,IAAKiG,EACD,OAEJ/R,KAAKwL,KAAKqL,SAAS,uBAAuB9E,MAC1C,IAAI2kB,EAAY3kB,EAAKgD,WAAW,mBAChC,IAAkB,IAAd2hB,EAEA,YADA3kB,EAAKR,QAAQ,kCAKjB,IAAkB,IAAdmlB,IAAuBA,EAAW,CAElCA,EAAY,6DADEn0B,WAAWwP,EAAKC,mCAElC,CACA,MAAM0e,EAAY3e,EACb4X,WAAW,GACXpmB,cAAc,aACnBmtB,EAAU5rB,UAAY4xB,EACtB,MAAMN,EAAY1F,EAAUzrB,kBACxB2wB,GAEAQ,EAAUt0B,iBAAiB,WAAY0F,IACnC4uB,EAAUO,kBAAkB,IACvBP,EAAUQ,gBAAkB,IAGzCR,EAAUpf,QACN5S,GACAgyB,EAAUhyB,SAEdpE,KAAK+1B,YAAchkB,EACnBA,EAAKgD,WAAW,YAAa,CACzBqhB,UAAWA,GAEnB,CAMA,aAAAS,CAAcxuB,GACV,OAAOrI,KAAKw2B,eAAenuB,EAAO,CAAC,EACvC,CAMA,cAAAmuB,CAAenuB,EAAOsB,GAClBA,UAAoDA,EAAU,CAAC,GAC/D,MAAMmtB,EAAYl1B,SAASm1B,cAC3B,IAAIxa,EAAWua,EAAYh0B,iBAAiBg0B,GAAa,KACzD,MAAM/kB,EAAO/R,KAAK+1B,YACZiB,IAAertB,EAAQqtB,WACvBpB,EAAW51B,KAAK8L,gBAAgB,YAItC,GAHIyQ,GAAYvc,KAAK8L,gBAAgB,UACjCyQ,EAAWA,EAASxX,QAEnBgN,EAKL,GADAA,EAAK8E,SAAS,iBAAiBxO,KAAUsB,EAASmtB,EAAWva,GACzDlU,GAAsB,OAAbkU,GAAqBA,IAAaxK,EAAKC,MAAO,CACvD,MAAMilB,EAASH,EAAUI,kBACzB,GAAID,EAEA,MAAM,IAAI32B,MAAM,gCAAgCic,OAAc0a,MAElE,MAAMpG,EAAU9e,EAAK4X,WAAW,GAChC3pB,KAAKm2B,aAAa,aAAcpkB,EAAM8e,EAAS,CAC3CsG,SAAUplB,EAAKC,MACfuK,SAAUA,EACV6Z,UAAWU,IAEVh2B,MAAMT,IACP,MAAM42B,EAASH,EAAUI,kBACzB,GAAItB,GAAYqB,IAAoB,IAAV52B,EAEtB,MAAM,IAAIC,MAAM,qCAAqCic,OAAc0a,OAIlED,IAAwB,IAAV32B,KAInB0R,SAA4CA,EAAK8iB,SAAStY,GAG1Dvc,KAAK+1B,YAAYpgB,QAAQ,CAAE0b,eAAe,IAC1CrxB,KAAK+1B,YAAc,KACnB/1B,KAAKg2B,YAAc,KACnBh2B,KAAKwL,KAAK+J,WAAU,IAEnBrU,OAAOyH,IACRoJ,EAAK2b,SAAS/kB,EAAI,GAI1B,MAKI3I,KAAK+1B,YAAYpgB,QAAQ,CAAE0b,eAAe,IAC1CrxB,KAAK+1B,YAAc,KACnB/1B,KAAKg2B,YAAc,KAEnBh2B,KAAKwL,KAAK+J,gBAlDVvV,KAAKwL,KAAKqL,SAAS,mCAoD3B,CAIA,UAAAugB,CAAWhnB,EAAO,QAAS2B,EAAMhG,GAC7B,MAAMP,EAAOxL,KAAKwL,KAelB,GAbArK,OADA4Q,EAAOA,QAAmCA,EAAOvG,EAAK2J,gBACzC,uDAEb/E,EAAOA,GAAQ,eACH,MAARrE,EACAA,EAAO,CAAEiG,MAAO,IAEK,iBAATjG,EACZA,EAAO,CAAEiG,MAAOjG,GAGhB5K,OAAOyF,cAAcmF,GAAO,4BAA4BA,MAG9C,iBAATqE,GAAoC,gBAATA,KAC3B2B,aAAmC,EAASA,EAAKsE,cAAa,IAI/D,YAHAtE,EAAKkB,cAAcnS,MAAK,KACpBd,KAAKo3B,WAAWhnB,EAAM2B,EAAMhG,EAAK,IAIzC,MAAMsrB,EAAUtlB,EAAKuV,QAAQvb,EAAMqE,GACnCinB,EAAQnY,SAAS,eACjBlf,KAAKg2B,YAAcjkB,EAEnBslB,EAAQpmB,OAAQ,EAChBomB,EAAQrJ,YAAY,CAAE9a,aAAa,IAAQpS,MAAK,KAC5Cd,KAAKy2B,eAAeY,EAAQ,GAEpC;;;;;;;;;;;;GAgBJ,MAAMC,qBAAqBzS,eACvB,WAAA9kB,CAAYyL,GACRkE,MAAMlE,EAAM,KAAM,CACdjG,IAAK,WACLyM,MAAOxG,EAAKC,IAEpB,CACA,QAAA5E,GACI,MAAO,gBAAgB7G,KAAKuF,QAAQvF,KAAKwL,KAAKC,MAClD,EAOJ,MAAMsV,WACF,WAAAhhB,CAAY4J,GACR3J,KAAK2L,SAAU,EAEf3L,KAAKoM,KAAO,CAAC,EACbpM,KAAKu3B,cAAgB,GACrBv3B,KAAKw3B,WAAa,CAAC,EACnBx3B,KAAKy3B,OAAS,IAAIC,IAClB13B,KAAK23B,UAAY,IAAID,IACrB13B,KAAK43B,aAAe,EACpB53B,KAAK63B,oBAAsB,EAC3B73B,KAAK83B,0BAA4B,EAEjC93B,KAAK0oB,WAAa,KAElB1oB,KAAK2U,UAAY,KAEjB3U,KAAK2hB,MAAQ,CAAC,EAEd3hB,KAAKqX,QAAU,GACfrX,KAAK+3B,aAAe,CAAC,EAErB/3B,KAAKg4B,mBAAqB,IAAI7yB,IAE9BnF,KAAKi4B,MAAQ9sB,KAKbnL,KAAKyQ,WAAa,KAGlBzQ,KAAK+W,aAAe,EAEpB/W,KAAKk4B,cAAe,EAEpBl4B,KAAK8V,oBAAsB,EAE3B9V,KAAK+V,oBAAsB,GAE3B/V,KAAKm4B,cAAgB,EAIrBn4B,KAAKkX,IAAMlX,KAAK6W,SAChB,MAAM3N,EAAQlJ,KAAK2J,QAAU1D,OAAO,CAChCwF,GAAI,KACJ8O,OAAQ,KACRxR,QAAS,KACT6kB,WAhmHe,EAimHfwK,OAAQ,KAERC,YA/lHO,GAgmHPjJ,QAAS,YACT/X,QAAS,KACTsK,MAAO,KAEPhW,SAAS,EACT2sB,UAAU,EACVC,aAAa,EACb5S,UAAU,EACViB,eAAgB,EAChBuE,0BAA0B,EAE1BoG,UAAU,EACViH,qBAAsB,KACtBhM,WAAY,QAEZ9X,qBAAsB,KACtBkB,aAAa,EAEb6iB,UAAW,KACXpG,OAAQ,KAER1xB,MAAO,KACP+3B,QAAS,KAET/D,QAAS,CACLC,UAAW,QACX1c,QAAS,aAET7H,OAAQ,YAEb1G,GACGgvB,EAAgB,IAAIrtB,SAC1BtL,KAAK44B,MAAQD,EAAc13B,UAC3B,IAAI43B,GAAU,EAoCd,GAnCA74B,KAAK44B,MACA93B,MAAK,KACN+3B,GAAU,EACV,IACI74B,KAAK+U,WAAW,OACpB,CACA,MAAOpU,GAGHX,KAAK0tB,SAAS,oCAAqC/sB,EACvD,KAECO,OAAOyH,IACR,GAAIkwB,EAGA,MAAMlwB,EAIN3I,KAAK+U,WAAW,OAAQ,CAAEpU,MAAOgI,GACrC,IAEJ3I,KAAKyL,GAAKvC,EAAKuC,IAAM,SAAUsV,WAAWuE,SAC1CtlB,KAAK2M,KAAO,IAAI2qB,aAAat3B,MAC7BA,KAAK84B,mBAAmB,IAAI9kB,gBAAgBhU,OAC5CA,KAAK84B,mBAAmB,IAAIvD,cAAcv1B,OAC1CA,KAAK84B,mBAAmB,IAAIrpB,gBAAgBzP,OAC5CA,KAAK84B,mBAAmB,IAAIrc,aAAazc,OACzCA,KAAK84B,mBAAmB,IAAI/U,cAAc/jB,OAC1CA,KAAK84B,mBAAmB,IAAIxhB,gBAAgBtX,OAC5CA,KAAK+4B,yBAA2BrvB,iBAAiB1J,KAAKg5B,2BAA2Bla,KAAK9e,MAAO,CAAC,GAE9FA,KAAKqX,QAAUnO,EAAKmO,eACbnO,EAAKmO,SACPrX,KAAKqX,UAAYrX,KAAKqX,QAAQlV,OAAQ,CACvC,MAAM6P,EAA+B,iBAAhB9I,EAAKkvB,OAAsBlvB,EAAKkvB,OAASp4B,KAAKyL,GACnEzL,KAAKqX,QAAU,CAAC,CAAE5L,GAAI,IAAKuG,MAAOA,EAAOgf,MAAO,KACpD,CACI9nB,EAAKyY,OACL3hB,KAAKssB,SAASpjB,EAAKyY,OAAO,UAEvBzY,EAAKyY,MAEZ3hB,KAAK+I,QAAUtE,iBAAiByE,EAAKH,SACrC5H,SAASnB,KAAK+I,QAAS,6BAA6BG,EAAKH,WACzD/I,KAAK+I,QAAQ5F,UAAUqG,IAAI,cACtBxJ,KAAK+I,QAAQkwB,aAAa,cAC3Bj5B,KAAK+I,QAAQmwB,SAAW,GAG5Bl5B,KAAK+I,QAAQowB,SAAWn5B,KAExBA,KAAK0gB,cAAgB1gB,KAAK+I,QAAQxF,cAAc,iBAChD,MAAM61B,EAA4B,MAAflwB,EAAKkvB,OAAiBp4B,KAAKqX,QAAQlV,OAAS,IAAM+G,EAAKkvB,OAC1E,GAAIp4B,KAAK0gB,cAAe,CAEpBvf,QAAQnB,KAAKqX,QAAS,sEACtBrX,KAAKqX,QAAU,GACf,MAAMgiB,EAAar5B,KAAK0gB,cAAcnd,cAAc,cACpD,IAAK,MAAM+1B,KAAUD,EAAWtP,iBAAiB,OAC7C/pB,KAAKqX,QAAQ3R,KAAK,CACd+F,GAAI6tB,EAAOC,QAAQ9tB,IAAM,OAAOzL,KAAKqX,QAAQlV,SAE7C6P,MAAO,GAAKsnB,EAAOhI,YAEnBN,MAAO,KAGnB,KACK,CAED,MAAMwI,EAAU,+BAA+BC,OAAOz5B,KAAKqX,QAAQlV,QAOnE,GANAnC,KAAK+I,QAAQjE,UAAY,kFAGvB00B,uCAGGJ,EAAY,CACFp5B,KAAK+I,QAAQxF,cAAc,iBACnCiB,MAAME,QAAU,MACvB,CACJ,CAEA1E,KAAK+I,QAAQjE,WAAa,kGAI1B9E,KAAK05B,qBAAuB15B,KAAK+I,QAAQxF,cAAc,yBACvDvD,KAAKkxB,gBAAkBlxB,KAAK05B,qBAAqBn2B,cAAc,oBAC/DvD,KAAK0gB,cAAgB1gB,KAAK+I,QAAQxF,cAAc,iBAChDvD,KAAK+I,QAAQ5F,UAAUmP,OAAO,UAAWtS,KAAKqX,QAAQlV,OAAS,GAC/DnC,KAAK25B,kBAEL,CAAC,UAAW,YAAYn5B,SAASo5B,IACR,MAAjB1wB,EAAK0wB,IACL55B,KAAK65B,UAAUD,EAAS1wB,EAAK0wB,GACjC,IAGA1wB,EAAKqR,QACDrR,EAAKqvB,cACLv4B,KAAKkxB,gBAAgBpsB,UACjB,mDAER9E,KAAKotB,KAAKlkB,EAAKqR,QACVzZ,MAAK,KAE2B,MAA7BoI,EAAKwL,qBACD1U,KAAK85B,SACL95B,KAAK+5B,oBAAoB7uB,YAAYkM,MAGrCpX,KAAK+5B,oBAAoB7uB,YAAYonB,KAIzCtyB,KAAK+5B,oBAAoB7wB,EAAKwL,sBAElCikB,EAAcv4B,SAAS,IAEtBc,OAAOP,IACRg4B,EAAcj4B,OAAOC,EAAM,IAE1B8jB,SAAQ,KACT,IAAIzY,EACsD,QAAzDA,EAAKhM,KAAK+I,QAAQxF,cAAc,2BAAwC,IAAPyI,GAAyBA,EAAGwH,SAC9FxT,KAAK+I,QAAQ5F,UAAUqQ,OAAO,kBAAkB,KAIpDmlB,EAAcv4B,UAIlBJ,KAAKonB,OAAOtc,WAAW2jB,KAEvBzuB,KAAK+I,QAAQjH,iBAAiB,UAAW0F,IAErCxH,KAAKonB,OAAOtc,WAAWwS,OAAO,IAElCtd,KAAKg6B,eAAiB,IAAIC,gBAAgBjf,IAEtChb,KAAKonB,OAAOtc,WAAWovB,OAAO,IAElCl6B,KAAKg6B,eAAeG,QAAQn6B,KAAK+I,SACjChC,QAAQ/G,KAAKkxB,gBAAiB,QAAS,cAAe1pB,IAClD,MAAM2c,EAAOpD,WAAWqD,aAAa5c,GAC/BuK,EAAOoS,EAAKpS,KACZqoB,EAAa5yB,EAKnB,IAAuE,IAAnExH,KAAK+U,WAAW,QAAS,CAAEzP,MAAOkC,EAAGuK,KAAMA,EAAMoS,KAAMA,IAEvD,OADAnkB,KAAKm4B,cAAgBh0B,KAAKqG,OACnB,EAEX,GAAIuH,EAAM,CACN,GAAIqoB,EAAWz0B,QAEX,YADAoM,EAAK0E,iBAIT,MAAMif,EAAU11B,KAAKiJ,UAAU,gBACzB0sB,EAAiB31B,KAAKiJ,UAAU,uBAClCysB,EAAQ7yB,QAAQ,gBAAkB,GAClB,UAAhBshB,EAAK9B,QACLtQ,EAAKoE,cACHwf,GAAkBxxB,KAAKqG,MAAQxK,KAAKm4B,cAAgBxC,IACtD31B,KAAKgV,YAAY,sBAAuBjD,GAExCoS,EAAKyF,QAAU,EACf7X,EAAKuD,WAAU,EAAM,CAAEsU,OAAQzF,EAAKyF,OAAQtkB,MAAOkC,IAGnDuK,EAAKuD,WAAU,EAAM,CAAEhQ,MAAOkC,IAE9B2c,EAAK9B,SAAWpX,WAAWovB,SAC3BtoB,EAAKkB,aAAalB,EAAKqE,aAAc,CACjC+R,gBAAwD,IAAxCxe,EAAQ2wB,8BAGvBnW,EAAK9B,SAAWpX,WAAW0a,UAChC5T,EAAK0E,gBAEb,CACAzW,KAAKm4B,cAAgBh0B,KAAKqG,KAAK,IAEnCzD,QAAQ/G,KAAKkxB,gBAAiB,WAAY,cAAe1pB,IACrD,MAAM2c,EAAOpD,WAAWqD,aAAa5c,GAC/BuK,EAAOoS,EAAKpS,KAElB,IACI,IADA/R,KAAK+U,WAAW,WAAY,CAAEzP,MAAOkC,EAAGuK,KAAMA,EAAMoS,KAAMA,IAE1D,OAAO,EAEPpS,GAAwB,IAAhBoS,EAAKyF,QAAgB7X,EAAKsE,iBAClCrW,KAAKgV,YAAY,uBACjBjD,EAAKkB,aAAalB,EAAKqE,cAC3B,IAEJrP,QAAQ/G,KAAK+I,QAAS,WAAYvB,IAC9B,MAAM2c,EAAOpD,WAAWqD,aAAa5c,GAC/BoN,EAAYvP,cAAcmC,GAC1BuK,EAAOoS,EAAKpS,MAAQ/R,KAAKkV,eAC/BlV,KAAKu6B,UAAU,aAAc,CACzBj1B,MAAOkC,EACPuK,KAAMA,EACNoS,KAAMA,EACNvP,UAAWA,GACb,IAEN7N,QAAQ/G,KAAK+I,QAAS,oBAAqBvB,IACvC,MAAMjD,EAAkB,YAAXiD,EAAE9D,KACTqc,EAAagB,WAAWC,QAAQxZ,GACtCxH,KAAK+U,WAAW,QAAS,CAAExQ,KAAMA,EAAMe,MAAOkC,IAC1CjD,GAAQvE,KAAKyV,aAAezV,KAAKkhB,cAC7BhY,EAAKwL,uBAAyBxJ,YAAYonB,IAC1CvS,SAAwDA,EAAWzK,YAGnEtV,KAAKwW,cAGRjS,GACDvE,KAAKgV,YAAY,uBAAuB,EAAM,CAC1C1P,MAAOkC,EACPwvB,YAAY,GAEpB,GAER,CAYA,cAAOwD,CAAQC,GACX,GAAIA,aAAc1Z,WACd,OAAO0Z,EAEN,GAAIA,aAAc5V,eACnB,OAAO4V,EAAGjvB,KAKd,QAHWvH,IAAPw2B,IACAA,EAAK,GAES,iBAAPA,EACPA,EAAK74B,SAASmoB,iBAAiB,eAAe0Q,QAE7C,GAAkB,iBAAPA,EAAiB,CAE7B,IAAK,MAAMC,KAAY94B,SAASmoB,iBAAiB,eAAgB,CAC7D,MAAMve,EAAOkvB,EAASvB,SACtB,GAAI3tB,GAAQA,EAAKC,KAAOgvB,EACpB,OAAOjvB,CAEf,CAGA,KADAivB,EAAK74B,SAAS2B,cAAck3B,IAExB,OAAO,IAEf,MACSA,EAAGhzB,SACRgzB,EAAKA,EAAGhzB,QAMZ,OAJAtG,OAAOs5B,aAAcE,QAAS,oBAAoBF,KAC7CA,EAAG/yB,QAAQ,iBACZ+yB,EAAKA,EAAG9yB,QAAQ,gBAEhB8yB,GAAMA,EAAGtB,SACFsB,EAAGtB,SAEP,IACX,CAIA,WAAI/J,GACA,MAAM3d,EAAMzR,KAAK2J,QAAQylB,QACzB,MAAmB,iBAAR3d,EACAuG,SAASvG,GAEbA,CACX,CAIA,cAAOuP,CAAQyZ,GACX,IAAKA,EACD,OAAO,KAEN,GAAIA,aAAc5V,eACnB,OAAO4V,EAOX,SALuBx2B,IAAdw2B,EAAGhzB,SACRgzB,EAAKA,EAAGhzB,QAILgzB,GAAI,CACP,GAAIA,EAAG3L,SACH,OAAO2L,EAAG3L,SAEd2L,EAAKA,EAAGz2B,aACZ,CACA,OAAO,IACX,CAYA,EAAEgiB,OAAOC,kBACEjmB,KAAK2M,IAChB,CAEA,kBAAAmsB,CAAmB8B,GACf56B,KAAKu3B,cAAc7xB,KAAKk1B,GACxB56B,KAAKw3B,WAAWoD,EAAUnvB,IAAMmvB,CAEpC,CAEA,eAAAjB,GACI,IAAK,MAAMvwB,KAAOpJ,KAAKu3B,cACnBnuB,EAAI2C,MAEZ,CAEA,aAAAga,CAAchU,GACV,MAAMxM,EAAMwM,EAAKxM,IACjBpE,OAAc,MAAPoE,IAAgBvF,KAAKy3B,OAAO1xB,IAAIR,GAAM,8BAA8BA,OAC3EvF,KAAKy3B,OAAOluB,IAAIhE,EAAKwM,GACrB,MAAM8oB,EAAK9oB,EAAK+S,OAChB,GAAI+V,EAAI,CACJ,MAAMC,EAAM96B,KAAK23B,UAAUoD,IAAIF,GAC3BC,EACAA,EAAItxB,IAAIuI,GAGR/R,KAAK23B,UAAUpuB,IAAIsxB,EAAI,IAAI11B,IAEnC,CACJ,CAEA,eAAAypB,CAAgB7c,GACZ,MAAM8oB,EAAK9oB,EAAK+S,OAChB,GAAI+V,EAAI,CACJ,MAAMC,EAAM96B,KAAK23B,UAAUoD,IAAIF,GAC3BC,GAAOA,EAAIlW,OAAO7S,KAAU+oB,EAAI1b,MAEhCpf,KAAK23B,UAAU/S,OAAOiW,EAE9B,CAEA9oB,EAAKvG,KAAO,KACZuG,EAAKc,OAAS,KAGdd,EAAK4c,cACT,CAEA,SAAA4L,CAAUS,EAAM5uB,EAAO,CAAC,GACpB,IAAI8F,EACJ,MAAM+oB,EAAIh1B,OAAO,CAAC,EAAG,CAAEuF,KAAMxL,KAAM2J,QAAS3J,KAAK2J,QAASyD,YAAQnJ,GAAamI,GAC/E,IAAK,MAAMhD,KAAOpJ,KAAKu3B,cAAe,CAElC,GADArlB,EAAM9I,EAAI4xB,GAAM34B,KAAK+G,EAAK6xB,IACd,IAAR/oB,EACA,WAEajO,IAAbg3B,EAAE7tB,SACF8E,EAAM+oB,EAAE7tB,OAEhB,CACA,OAAO8E,CACX,CASA,WAAA8C,CAAYjR,KAASmC,GACjB,MAAO6M,EAAGsO,GAAKtd,EAAKuD,MAAM,KACpBpF,EAAMmf,EAAIrhB,KAAKw3B,WAAWzkB,GAAK/S,KAC/B+M,EAAO7K,EAAImf,GACjB,GAAItU,EACA,OAAOA,EAAK1E,MAAMnG,EAAKgE,GAGvBlG,KAAK0tB,SAAS,6BAA6B3pB,QAEnD,CASA,UAAAgR,CAAWrR,EAAM+T,GACb,MAAO1E,EAAGsO,GAAK3d,EAAK4D,MAAM,KACpB4B,EAAOlJ,KAAK2J,QACZoD,EAAOsU,EAAInY,EAAK6J,GAAGsO,GAAKnY,EAAK6J,GACnC,GAAIhG,EACA,OAAOA,EAAK1K,KAAKrC,KAAMiG,OAAO,CAAEvC,KAAMA,EAAM8H,KAAMxL,KAAMmL,KAAMnL,KAAKi4B,OAASxgB,GAIpF,CAEA,gBAAAyjB,CAAiBhR,GAEb,IAAInY,EAAO,KAOX,OANA/R,KAAKm7B,WAAW9Z,IACZ,GAAIA,EAAE+D,UAAY8E,EAEd,OADAnY,EAAOsP,GACA,CACX,IAEGtP,CACX,CAEA,gBAAAqpB,CAAiBC,GAAW,GACxB,MAGMhb,EAFergB,KAAK+I,QAEKsX,UAC/B,IAAIib,EAOJ,OALIA,EADAD,EACSlxB,KAAKoxB,MAAMlb,EANR,GA5jIL,IAqkIElW,KAAKqxB,MAAMnb,EArkIb,IAukIJrgB,KAAKk7B,iBAAiBI,EACjC,CAEA,eAAAG,CAAgBJ,GAAW,GACvB,MAAMK,EAAe17B,KAAK+I,QACpB0X,EAAezgB,KAAK0gB,cAAcC,aAClCN,EAAYqb,EAAarb,UACzBM,EAAe+a,EAAa/a,aAAeF,EACjD,IAAIkb,EAQJ,OANIA,EADAN,EACYlxB,KAAKqxB,OAAOnb,EAAYM,GAjlI7B,IAilI2D,EAGtDxW,KAAKoxB,MAAMlb,EAAYM,GAplI5B,IAolI0D,EAErEgb,EAAYxxB,KAAKS,IAAI+wB,EAAW37B,KAAKmR,OAAM,GAAQ,GAC5CnR,KAAKk7B,iBAAiBS,EACjC,CAEA,kBAAAC,CAAmB7pB,EAAMogB,EAAM,GAO3B,OANAnyB,KAAKm7B,WAAW9Z,IAEZ,GADAtP,EAAOsP,EACH8Q,KAAS,EACT,OAAO,CACX,GACD,CAAE0J,SAAS,EAAMtxB,MAAOwH,GAAQ/R,KAAKmV,kBACjCpD,CACX,CAEA,kBAAA+pB,CAAmB/pB,EAAMogB,EAAM,GAO3B,OANAnyB,KAAKm7B,WAAW9Z,IAEZ,GADAtP,EAAOsP,EACH8Q,KAAS,EACT,OAAO,CACX,GACD,CAAE0J,SAAS,EAAOtxB,MAAOwH,GAAQ/R,KAAKmV,kBAClCpD,CACX,CAMA,WAAAsU,CAAYlF,EAAUxX,GAClB,OAAO3J,KAAK2M,KAAK0Z,YAAYlF,EAAUxX,EAC3C,CAiBA,YAAA4d,CAAaC,EAAKuU,EAAYpyB,GAC1B,IACAoI,EAAMiqB,EAcN,OATID,aAAsBlX,eACtB9S,EAAOgqB,GAGPhqB,EAAO/R,KAAKmV,gBACZhU,YAAmB8C,IAAZ0F,EAAuB,uBAAuBA,KACrDA,EAAUoyB,GAGNvU,GAEJ,IAAK,SACDwU,EAAUjqB,EAAKmO,iBACX8b,IACAjqB,EAAKuc,OAAO0N,EAAS,UACrBjqB,EAAKuD,aAET,MACJ,IAAK,WACD0mB,EAAUjqB,EAAKkO,iBACX+b,IACAjqB,EAAKuc,OAAO0N,EAAS,SACrBjqB,EAAKuD,aAET,MACJ,IAAK,SACD0mB,EAAUjqB,EAAKmO,iBACX8b,IACAjqB,EAAKuc,OAAO0N,EAAS,eACrBA,EAAQ/oB,cACRlB,EAAKuD,aAET,MACJ,IAAK,UACIvD,EAAKia,eACNja,EAAKuc,OAAOvc,EAAKoY,YAAa,SAC9BpY,EAAKuD,aAET,MAEJ,IAAK,SACD0mB,EAAUjqB,EAAKmO,kBAAoBnO,EAAKoY,YACxCpY,EAAKyB,SACDwoB,GACAA,EAAQ1mB,YAEZ,MAEJ,IAAK,WACDtV,KAAKgV,YAAY,kBAAmB,gBACpC,MACJ,IAAK,aACDhV,KAAKgV,YAAY,kBAAmB,SACpC,MACJ,IAAK,SACDhV,KAAKgV,YAAY,uBACjB,MA0BJ,IAAK,OACL,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,WACL,IAAK,SACL,IAAK,SACL,IAAK,QACL,IAAK,KACD,OAAOjD,EAAK2E,SAAS8Q,GACzB,QACI7mB,MAAM,uBAAuB6mB,MAEzC,CAEA,KAAAyU,GACIj8B,KAAK2M,KAAKkiB,iBACV7uB,KAAK2M,KAAKgG,SAAW,KACrB3S,KAAKy3B,OAAOwE,QACZj8B,KAAK23B,UAAUsE,QAEfj8B,KAAK43B,aAAe,EACpB53B,KAAK0oB,WAAa,KAClB1oB,KAAK2U,UAAY,KAejB3U,KAAKonB,OAAOtc,WAAWuc,UAC3B,CAQA,OAAA6U,GACIl8B,KAAKuR,QAAQ,gBACbvR,KAAKi8B,QACLj8B,KAAKg6B,eAAe3W,aACpBrjB,KAAK+I,QAAQjE,UAAY,GAEzB9E,KAAK+I,QAAQozB,UAAYn8B,KAAK+I,QAAQozB,SAC1C,CAUA,SAAAlzB,CAAUlF,EAAMoF,GACZ,IAAIC,EACAF,EAAOlJ,KAAK2J,QAEZ5F,EAAKlB,QAAQ,MAAQ,KACpBuG,EAAKrF,GAAQA,EAAKuD,MAAM,KACzB4B,EAAOA,EAAKE,IAEhB,IAAI/I,EAAQ6I,EAAKnF,GAOjB,MALqB,mBAAV1D,IACPA,EAAQA,EAAM,CAAEqD,KAAM,UAAW8H,KAAMxL,QAIpCK,QAAqCA,EAAQ8I,CACxD,CAKA,SAAA0wB,CAAU91B,EAAM1D,GAEZ,GAAI0D,EAAKlB,QAAQ,MAAQ,EAAzB,CACI,MAAM2mB,EAAQzlB,EAAKuD,MAAM,KACbtH,KAAKw3B,WAAWhO,EAAM,IAC9Bvd,gBAAgBud,EAAM,GAAInpB,EAElC,MAEA,OADAL,KAAK2J,QAAQ5F,GAAQ1D,EACb0D,GACJ,IAAK,WACD/D,KAAKonB,OAAOtc,WAAW2jB,KACvB,MACJ,IAAK,UACDzuB,KAAKkM,aAAa7L,GAClB,MACJ,IAAK,WACDL,KAAK+I,QAAQ5F,UAAUmP,OAAO,iBAAkBjS,GAG5D,CAEA,QAAA+7B,GACI,OAAOp8B,KAAK+I,QAAQ3F,SAASxB,SAASm1B,cAC1C,CAMA,SAAAsF,GACI,MAAMjE,EAASp4B,KAAK2J,QAAQyuB,OAC5B,OAAOp4B,KAAK85B,UAAsB,IAAX1B,IAAqBA,CAChD,CASA,qBAAArnB,CAAsBhE,EAAMuvB,EAAO,MAC/B,IACIt8B,KAAKuT,cAAa,GAClB,MAAMrB,EAAMnF,IAEZ,OADA5L,SAAS+Q,aAAelQ,SAAU,+BAA+BkQ,KAC1DA,CACX,CACA,QACIlS,KAAKuT,cAAa,EACtB,CACJ,CAEA,eAAMsU,CAAUtjB,GAAO,EAAMoF,SACnB3J,KAAK2M,KAAKkb,UAAUtjB,EAAMoF,EACpC,CAEA,SAAA4yB,CAAUh4B,GAAO,GACb,OAAOvE,KAAK2M,KAAK8mB,YAAYlvB,EAAM,CAAE6vB,eAAe,GACxD,CAEA,YAAAoI,GACIx8B,KAAKu8B,UAAUv8B,KAAK2M,KAAK6mB,iBAC7B,CAKA,gBAAAF,CAAiBC,GAAgB,GAC7B,OAAOvzB,KAAK2M,KAAK2mB,iBAAiBC,EACtC,CAIA,YAAAkJ,CAAaC,GACT18B,KAAK6W,SAAS,eAAgB6lB,GAC9B/7B,MAAM,uBA8BV,CAIA,KAAAwQ,CAAMwrB,GAAU,GACZ,OAAOA,EAAU38B,KAAK43B,aAAe53B,KAAKy3B,OAAOrY,IACrD,CAEA,MAAAwd,GACI,IAAIx6B,EAAI,EACRpC,KAAKwS,OAAO6O,IACRjf,GAAG,IAEHpC,KAAKy3B,OAAOrY,OAAShd,GACrBpC,KAAKsT,QAAQ,kBAAkBtT,KAAKy3B,OAAOrY,YAAYhd,IAG/D,CAMA,OAAAumB,CAAQ1X,GACJ,OAAOjR,KAAK2M,KAAKgc,QAAQ1X,EAC7B,CAMA,SAAA6X,CAAU7X,GACN,OAAOjR,KAAK2M,KAAKmc,UAAU7X,EAC/B,CASA,OAAA4rB,CAAQt3B,GACJ,OAAOvF,KAAKy3B,OAAOsD,IAAIx1B,IAAQ,IACnC,CAKA,YAAA0Q,CAAahF,EAAO6rB,GAEhB,IAAI5qB,EAAM,KACV,MAAMkD,EAAYpV,KAAKqV,gBACjBuT,EAA2B,iBAAV3X,EAAqBgJ,0BAA0BhJ,GAASA,EAE/E,SAAS8rB,EAAW1b,GAKhB,GAHIuH,EAAQvH,KACRnP,EAAMmP,GAENnP,GAAOmP,IAAMyb,EACb,OAAO,CAEf,CAYA,OArBAA,EAAYA,GAAa1nB,EAUzBpV,KAAKm7B,UAAU4B,EAAY,CACvBxyB,MAAOuyB,EACPxS,aAAa,IAGZpY,GAAO4qB,IAAc1nB,GACtBpV,KAAKm7B,UAAU4B,EAAY,CACvBxyB,MAAO6K,EACPkV,aAAa,IAGdpY,CACX,CAUA,eAAA6W,CAAgBhX,EAAMiX,EAAOC,GAAgB,GACzC,IAAI/W,EAAM,KACV,MAAM8qB,EAAW7yB,KAAKqxB,MAAMx7B,KAAK05B,qBAAqB/Y,aAt/I3C,IAu/IX,OAAQqI,GACJ,IAAK,SAsBL,IAAK,OACGjX,EAAKc,QAAUd,EAAKc,OAAOA,SAC3BX,EAAMH,EAAKc,QAOf,MA1BJ,IAAK,QAED7S,KAAKwS,OAAO6O,IACR,GAAIA,EAAE4K,YAEF,OADA/Z,EAAMmP,GACC,CACX,IAEJ,MACJ,IAAK,OACDrhB,KAAKwS,OAAO6O,IAEJA,EAAE4K,cACF/Z,EAAMmP,EACV,IAEJ,MAWJ,IAAK,QACGtP,EAAKY,UAAYZ,EAAKY,SAASxQ,SAC/B+P,EAAMH,EAAKY,SAAS,IAYxB,MACJ,IAAK,KACDT,EAAMlS,KAAK47B,mBAAmB7pB,GAC9B,MACJ,IAAK,OACDG,EAAMlS,KAAK87B,mBAAmB/pB,GAC9B,MACJ,IAAK,WACD,CACI,MAAMkrB,EAAaj9B,KAAKy7B,kBAGpBvpB,EADAH,EAAKqT,QAAU6X,EAAW7X,QACpB6X,EAGAj9B,KAAK87B,mBAAmB/pB,EAAMirB,EAE5C,CACA,MACJ,IAAK,SACD,GAAqB,IAAjBjrB,EAAKqT,QACLlT,EAAMH,MAEL,CACD,MAAMohB,EAAUnzB,KAAKo7B,mBAGjBlpB,EADAH,EAAKqT,QAAU+N,EAAQ/N,QACjB+N,EAGAnzB,KAAK47B,mBAAmB7pB,EAAMirB,EAE5C,CACA,MACJ,QACIh9B,KAAKsT,QAAQ,qBAAuB0V,EAAQ,MAEpD,OAAO9W,CACX,CAIA,YAACgX,CAAYC,EAASC,SACXppB,KAAK2M,KAAKuc,YAAYC,EAASC,EAC1C,CAqBA,MAAAK,CAAON,EAASC,GACZ,OAAOppB,KAAK2M,KAAK8c,OAAON,EAASC,EACrC,CAIA,gBAAAjV,GACI,OAAInU,KAAK0oB,YAAc1oB,KAAK+W,cAAgB,EACjC/W,KAAK0oB,WAAWiB,WAAW3pB,KAAK+W,cAEpC,IACX,CAIA,aAAA5B,GACI,OAAOnV,KAAK0oB,UAChB,CAIA,aAAArT,GACI,OAAOrV,KAAK2M,KAAK0I,eACrB,CAIA,YAAAH,GACI,OAAOlV,KAAK2U,SAChB,CAOA,mBAAOyP,CAAa9e,GAChB,MAAMmC,EAASnC,EAAMmC,OACfye,EAAKze,EAAOtE,UACZ+5B,EAAYz1B,EAAOE,QAAQ,eAC3BoK,EAAOgP,WAAWC,QAAQvZ,GAC1B+D,EAAOuG,EAAOA,EAAKvG,KAAOuV,WAAWyZ,QAAQl1B,GAC7C4M,EAAM,CACR5M,MAAOA,EACP63B,cAAe93B,cAAcC,GAC7BkG,KAAMA,EACNuG,KAAMA,EACNsQ,OAAQpX,WAAWmyB,QACnBhL,YAAQnuB,EACR2lB,QAAS,EACTyT,WAAOp5B,EACP4sB,QAASqM,GAEb,GAAIhX,EAAG9iB,SAAS,YACZ8O,EAAImQ,OAASpX,WAAW+G,WAEvB,GAAIkU,EAAG9iB,SAAS,eACjB8O,EAAImQ,OAAStQ,EAAKsE,eACZpL,WAAWovB,SACXpvB,WAAWuM,YAEhB,GAAI0O,EAAG9iB,SAAS,eACjB8O,EAAImQ,OAASpX,WAAW0a,cAEvB,GAAIO,EAAG9iB,SAAS,WAEjB8O,EAAImQ,OAASpX,WAAWsa,UAEvB,GAAIW,EAAG9iB,SAAS,WACjB8O,EAAImQ,OAASpX,WAAW+G,WAEvB,GAAIkrB,EAAW,CAChBhrB,EAAImQ,OAASpX,WAAWqyB,OACxB,MAAMpT,EAAM1jB,MAAMH,UAAUxD,QAAQR,KAAK66B,EAAUthB,WAAWjJ,SAAUuqB,GACxEhrB,EAAI0X,OAASM,CACjB,KACK,KAAIhE,EAAG9iB,SAAS,UASjB,MAHmB,cAAfkC,EAAM5B,MAA0B4B,aAAiBi4B,eACjD/xB,SAA4CA,EAAK8H,QAAQ,4BAA6BhO,EAAO4M,GAE1FA,EAPPA,EAAImQ,OAASpX,WAAW+G,KAQ5B,CAOA,OANoB,IAAhBE,EAAI0X,SACJ1X,EAAI0X,OAAS,GAEjB1X,EAAIkgB,OAAS5mB,aAAmC,EAASA,EAAK6L,QAAQnF,EAAI0X,QAC5D,MAAd1X,EAAIkgB,SAAkBlgB,EAAImrB,MAAQnrB,EAAIkgB,OAAO3mB,IAEtCyG,CACX,CAKA,QAAArL,GACI,MAAO,eAAe7G,KAAKyL,MAC/B,CAEA,SAAAyV,GACI,OAAOlhB,KAAKgV,YAAY,sBAC5B,CAIA,SAAAuW,GACI,IAAIrZ,GAAM,EAQV,OAPAlS,KAAK2M,KAAK6F,OAAO6O,IAEb,GAAIA,EAAEiB,YAAcjB,EAAE2D,WAElB,OADA9S,GAAM,GACC,CACX,IACD,GACIA,CACX,CAEA,QAAA2E,IAAY3Q,GACJlG,KAAK2J,QAAQikB,YAAc,GAC3BnjB,QAAQyM,IAAIlX,KAAK6G,cAAeX,EAExC,CAEA,QAAAwnB,IAAYxnB,GACJlG,KAAK2J,QAAQikB,YAAc,GAC3BnjB,QAAQ9J,MAAMX,KAAK6G,cAAeX,EAE1C,CAEA,OAAAqL,IAAWrL,GACHlG,KAAK2J,QAAQikB,YAAc,GAC3BnjB,QAAQ0Z,KAAKnkB,KAAK6G,cAAeX,EAEzC,CAEA,OAAAkiB,CAAQoV,GAIJ,OAHIx9B,KAAK2J,QAAQikB,YAAc,GAC3BnjB,QAAQsD,KAAK/N,KAAO,KAAOw9B,GAExBA,CACX,CAEA,UAAA/U,CAAW+U,GACHx9B,KAAK2J,QAAQikB,YAAc,GAC3BnjB,QAAQgzB,QAAQz9B,KAAO,KAAOw9B,EAEtC,CAEA,OAAAlqB,IAAWpN,GACHlG,KAAK2J,QAAQikB,YAAc,GAC3BnjB,QAAQsQ,KAAK/a,KAAK6G,cAAeX,EAEzC,CAOA,QAAAusB,CAASsJ,GAEL,IAAIhqB,EACApI,EACAoyB,aAAsBlX,eACtB9S,EAAOgqB,GAGPpyB,EAAUoyB,EACVhqB,EAAOpI,EAAQoI,MAEnB5Q,OAAO4Q,GAAwB,MAAhBA,EAAKqT,QAAiB,iBAAiBrT,KACtD,MAAM2pB,EAAe17B,KAAK+I,QACpB0X,EAAezgB,KAAK0gB,cAAcC,aAClCN,EAAYqb,EAAarb,UACzBqd,EAAWhC,EAAa/a,aACxBgd,EA1xJK,GA0xJI5rB,EAAKqT,QAAuB3E,EACrCmd,EAAQnd,EACRod,EAAWF,EAAStd,EACpByd,EAAcD,EA7xJT,GA8xJL1K,EAAUxpB,aAAyC,EAASA,EAAQwpB,QAE1E,IAAI4K,EAAe,KACfF,GAAYD,EACRE,GAAeJ,IAIfK,EAAeJ,EAtyJZ,GAsyJkCD,EA3B7B,GAiCZK,EAAeJ,EAASC,EAjCZ,EAmCI,MAAhBG,IACA/9B,KAAKkX,IAAI,YAAYymB,OAAYtd,QAAgB0d,KACjDrC,EAAarb,UAAY0d,EACrB5K,GAEAnzB,KAAKyyB,SAASU,GAI1B,CAKA,YAAA6K,GAEI,MAAMC,EAAaj+B,KAAKqX,QAAQ,GAAG4Z,SAC7BO,EAAUxxB,KAAK+I,QAAQ0oB,YACvByM,EAAal+B,KAAK+I,QAAQm1B,WAC1BrN,EAAU7wB,KAAKmU,mBACfgqB,EAAUC,OAAOC,SAASxN,aAAyC,EAASA,EAAQrsB,MAAMssB,KAAM,IAChGwN,EAAWH,EAAUC,OAAOC,SAASxN,aAAyC,EAASA,EAAQrsB,MAAMwsB,MAAO,IAClH,IAAIuN,EAAUL,EACVC,EAAUD,EAAaD,EAEvBM,EAAUJ,EAAUF,EAEfK,EAAWJ,EAAa1M,IAE7B+M,EAAUD,EAAW9M,GAEzB+M,EAAUp0B,KAAKC,IAAI,EAAGm0B,GAEtBv+B,KAAKkX,IAAI,gBAAgBlX,KAAK+W,kBAAkBonB,MAAYG,eAAsBL,cAAuBzM,cAAoB0M,QAAiBK,KAC9Iv+B,KAAK+I,QAAQm1B,WAAaK,CAE9B,CAOA,SAAAznB,CAAU8S,GACN,IAAI5d,EAKJ,GAJA7K,OAAOnB,KAAKmX,YAAa,wBACzBhW,OAAO,GAAKyoB,GAAUA,EAAS5pB,KAAKqX,QAAQlV,OAAQ,mBAAmBynB,KACvE5pB,KAAK+W,aAAe6S,EAEhB5pB,KAAKq8B,YACL,IAAK,MAAMnM,KAAUlwB,KAAK0gB,cAAc/N,SAAU,CAC9C,IAAIvQ,EAAI,EACR,IAAK,MAAMk3B,KAAUpJ,EAAOvd,SACxB2mB,EAAOn2B,UAAUmP,OAAO,YAAalQ,MAAQwnB,EAErD,CAEuB,QAA1B5d,EAAKhM,KAAK0oB,kBAA+B,IAAP1c,GAAyBA,EAAGob,OAAOtc,WAAW3K,QAEjF,IAAK,MAAM+vB,KAAUlwB,KAAKkxB,gBAAgBve,SAAU,CAChD,IAAIvQ,EAAI,EACR,IAAK,MAAMk3B,KAAUpJ,EAAOvd,SACxB2mB,EAAOn2B,UAAUmP,OAAO,YAAalQ,MAAQwnB,EAErD,CAGA5pB,KAAKg+B,cAET,CAEA,aAAAQ,CAAcj5B,EAAKhB,GAAO,EAAMoF,GAC5B,IAAIqC,EACyB,QAA5BA,EAAKhM,KAAK68B,QAAQt3B,UAAyB,IAAPyG,GAAyBA,EAAGsJ,UAAU/Q,EAAMoF,EACrF,CAEA,QAAA4L,CAAShR,GAAO,GACRA,EACAvE,KAAK+I,QAAQiO,QAGbhX,KAAK+I,QAAQ2M,MAErB,CACA,MAAA0R,CAAOiL,EAAQtgB,EAAMpI,GACjB,GAAI3J,KAAK63B,oBAML,YADA73B,KAAK83B,4BAIH/lB,aAAgB8S,iBAClBlb,EAAUoI,EACVA,EAAO,MAEX,MAAMihB,IAAc/pB,UAAUU,EAAS,aACjC80B,EAAK1zB,WACLmE,EAAUlP,KAAKg4B,mBACrB,OAAQ3F,GACJ,KAAKvnB,WAAW2jB,IAChB,KAAK3jB,WAAWyhB,aACZrd,EAAQ1F,IAAIi1B,EAAGrG,QACflpB,EAAQ1F,IAAIi1B,EAAGC,aACfxvB,EAAQ1F,IAAIi1B,EAAGE,QACfzvB,EAAQ1F,IAAIi1B,EAAGnhB,QACf,MACJ,KAAKxS,WAAWovB,OAEZhrB,EAAQ1F,IAAIi1B,EAAGrG,QACflpB,EAAQ1F,IAAIi1B,EAAGE,QACf,MACJ,KAAK7zB,WAAWuc,UACZnY,EAAQ1F,IAAIi1B,EAAGE,QACf,MACJ,KAAK7zB,WAAWwS,OACZpO,EAAQ1F,IAAIi1B,EAAGnhB,QACf,MACJ,KAAKxS,WAAWwnB,IAChB,KAAKxnB,WAAWsB,KAChB,KAAKtB,WAAW3K,OACZgB,OAAO4Q,EAAM,WAAWsgB,uBAGpBtgB,EAAKsT,UACLtT,EAAK4D,QAAQ,CAAE0c,OAAQA,IAE3B,MACJ,QACI1xB,MAAM,wBAAwB0xB,OAEtC,GAAIA,IAAWvnB,WAAWyhB,aAAc,CACpC,MAAMuN,EAAS95B,KAAK85B,SACpB95B,KAAK+I,QAAQ5F,UAAUmP,OAAO,UAAWwnB,IACpCA,GAAU95B,KAAKmX,aAChBnX,KAAKwW,YAAW,EAExB,CACItH,EAAQkQ,KAAO,IACX4T,EACAhzB,KAAKg5B,6BAGLh5B,KAAK+4B,2BAGjB,CAEA,UAAA7sB,CAAW3H,GAAO,GACd,MAAMmuB,EAAO1yB,KAAK2L,QAGlB,OAFA3L,KAAK2L,UAAYpH,EACjBvE,KAAK+I,QAAQ5F,UAAUmP,OAAO,eAAgB/N,GACvCmuB,CACX,CAEA,SAAA5d,GACI,OAAO9U,KAAK2L,OAChB,CAEA,MAAAmuB,GACI,OAAO95B,KAAKqX,SAAWrX,KAAKqX,QAAQlV,OAAS,CACjD,CAEA,SAAAgV,GACI,QAASnX,KAAKk4B,YAClB,CAEA,QAAAziB,GACI,OAAQzV,KAAKk4B,YACjB,CAEA,UAAA1hB,CAAWjS,GAAO,GACd,IAAIyH,EACJ,MAAM0mB,EAAO1yB,KAAKk4B,aAIlBl4B,KAAKk4B,eAAiB3zB,EAClBA,IAASmuB,GAET1yB,KAAK8W,UAAU,GAEnB9W,KAAK+I,QAAQ5F,UAAUmP,OAAO,eAAgB/N,GACnB,QAA1ByH,EAAKhM,KAAK0oB,kBAA+B,IAAP1c,GAAyBA,EAAGob,OAAOtc,WAAW3K,OACrF,CAEA,mBAAA45B,CAAoB3pB,EAAMwuB,GAAQ,GAC9B,GAAK5+B,KAAK85B,UAAY1pB,IAASlF,YAAYonB,IAK3C,OADAtyB,KAAK2J,QAAQ+K,qBAAuBtE,EAC5BA,GACJ,KAAKlF,YAAYkM,KACbpX,KAAKwW,YAAW,GAChB,MACJ,KAAKtL,YAAYonB,IACbtyB,KAAKwW,YAAW,GAChB,MACJ,KAAKtL,YAAYoL,UACTsoB,GACA5+B,KAAKwW,YAAW,GAEpB,MACJ,KAAKtL,YAAYqL,SACTqoB,GACA5+B,KAAKwW,YAAW,GAEpB,MACJ,QACI7V,MAAM,iBAAiByP,YAtB3BpQ,KAAKsT,QAAQ,gDAwBrB,CAEA,SAAAb,CAAUtS,EAAQwJ,GACd,OAAO3J,KAAK2M,KAAK8F,UAAUtS,EAAQwJ,EACvC,CAEA,QAAA2iB,CAAS3K,EAAOlf,GAAU,GACtBtB,OAAOyF,cAAc+a,GAAQ,0BAA0BA,KACnDlf,EACAzC,KAAK2hB,MAAQA,EAGb1b,OAAOjG,KAAK2hB,MAAOA,GAGvB,IAAK,MAAMlhB,KAAK2F,OAAOy4B,OAAO7+B,KAAK2hB,OAC3BlhB,EAAEskB,UACFtkB,EAAEskB,QAAU1b,MAAM5I,EAAEskB,SAGhC,CAOA,YAAAmQ,CAAaH,EAAM5a,gBAAiB6a,GAAO,GACvCh1B,KAAK2M,KAAKuoB,aAAaH,EAAKC,EAChC,CASA,WAAA8J,CAAYn9B,GACR,IAAIqK,EAEJ,OAA+B,QAAvBA,EADIhM,KAAK2M,KAAKyU,QAAO,EAAMzf,GAClBgR,gBAA6B,IAAP3G,EAAgBA,EAAK,EAChE,CAMA,mBAAA+yB,GAEI,MACMvN,EAAUxxB,KAAK+I,QAAQ0oB,YAIvBpa,EAAUrX,KAAKqX,QACf2nB,EAAO3nB,EAAQ,GACrB,IAAI4nB,EAAa,EACbC,EAAc,EACdjB,EAAa,EACbkB,GAAW,EAMf,GAAgB,MAAZH,EAAKvzB,GACL,MAAM,IAAInL,MAAM,wCAAwC0+B,EAAKvzB,QAGjEzL,KAAK+3B,aAAe,CAAC,EACrB,IAAK,MAAM7I,KAAO7X,EAAS,CACvBrX,KAAK+3B,aAAa7I,EAAIzjB,IAAMyjB,EAC5B,MAAMkQ,EAAKlQ,EAAI8B,MACf,GAAe,MAAX9B,EAAIzjB,IAAcyjB,IAAQ8P,EAC1B,MAAM,IAAI1+B,MAAM,6CAA6C4uB,EAAIld,WAErE,GAAKotB,GAAa,MAAPA,EAIN,GAAkB,iBAAPA,EACZlQ,EAAImQ,QAAUD,EACdF,GAAeE,OAEd,GAAkB,iBAAPA,GAAmBA,EAAGE,SAAS,MAAO,CAClDpQ,EAAImQ,QAAU,EACd,MAAME,EAAKC,WAAWJ,EAAGK,MAAM,GAAI,IAC/BvQ,EAAI+B,UAAYsO,IAChBJ,GAAW,EACXjQ,EAAI+B,SAAWsO,GAEnBtB,GAAcsB,CAClB,MAEI5+B,MAAM,yBAAyBy+B,iFAjB/BlQ,EAAImQ,QAAU,EACdH,GAAe,CAkBvB,CAEA,MAAMQ,EAASv1B,KAAKC,IAAI,EAAGonB,EAAUyM,GACrC,IAAI0B,EAAQ,EACZ,IAAK,MAAMzQ,KAAO7X,EAAS,CACvB,IAAIuoB,EACJ,GAAI1Q,EAAImQ,QAAS,CACb,MAAMQ,EAAM3Q,EAAI0Q,SAEZA,EADe,iBAARC,EACIA,EAES,iBAARA,GAAoBA,EAAIP,SAAS,MAClCE,WAAWK,EAAIJ,MAAM,GAAI,IA3DxB,EAgEhB,MAAMF,EAAKp1B,KAAKC,IAAIw1B,EAAWF,EAASxQ,EAAImQ,QAAWH,GACnDhQ,EAAI+B,UAAYsO,IAChBJ,GAAW,EACXjQ,EAAI+B,SAAWsO,EAEvB,CACArQ,EAAI6B,OAAS4O,EACbA,GAASzQ,EAAI+B,QACjB,CACA5Z,EAAQA,EAAQlV,OAAS,GAAG8uB,UArEA,EAsE5BgO,EAAaU,EAtEe,EAuE5B,MAAMG,EAAK,GAAGb,MAgBd,OAfAj/B,KAAK0gB,cAAclc,MAAMwsB,MAAQ8O,EACjC9/B,KAAK05B,qBAAqBl1B,MAAMwsB,MAAQ8O,EAcjCX,CACX,CAIA,mBAAAY,GACI5+B,OAAOnB,KAAK0gB,cAAe,4BAC3B,MAAM0Y,EAAap5B,KAAKq8B,YAExB,GADA/3B,eAAetE,KAAK0gB,cAAe0Y,IAC9BA,EACD,OAEJ,MAAM4G,EAAWhgC,KAAKqX,QAAQlV,OACxB89B,EAAYjgC,KAAK0gB,cAAcnd,cAAc,WACnDpC,OAAO8+B,EAAW,oCAClBA,EAAUn7B,UAAY,+BAA+B20B,OAAOuG,GAC5D,IAAK,IAAI59B,EAAI,EAAGA,EAAI49B,EAAU59B,IAAK,CAC/B,MAAM8sB,EAAMlvB,KAAKqX,QAAQjV,GACnByuB,EAAUoP,EAAUttB,SAASvQ,GACnCyuB,EAAQrsB,MAAMssB,KAAO5B,EAAI6B,OAAS,KAClCF,EAAQrsB,MAAMwsB,MAAQ9B,EAAI+B,SAAW,KAEJ,iBAAtB/B,EAAIgR,cACXhR,EAAIgR,eACErP,EAAQ1tB,UAAUqG,OAAO0lB,EAAIgR,cAAc54B,MAAM,MAIvD4nB,EAAInK,SAAU8L,EAAQ1tB,UAAUqG,OAAO0lB,EAAInK,QAAQzd,MAAM,MAE7D,MAAM0K,EAAQzP,WAAW2sB,EAAIld,OAASkd,EAAIzjB,IAC1C,IAAImkB,EAAU,GACVV,EAAIU,UACJA,EAAUjtB,cAAcusB,EAAIU,SAC5BA,EAAU,WAAWA,MAEzB,IAAIuQ,EAAU,GACV/9B,EAAI49B,EAAW,IACfG,EAAU,wCAEdtP,EAAQ/rB,UAAY,6BAA6B8qB,KAAW5d,WAAemuB,IACvEngC,KAAKmX,aACL0Z,EAAQ1tB,UAAUmP,OAAO,YAAalQ,IAAMpC,KAAK+W,aAEzD,CACJ,CAWA,0BAAAsX,GACQruB,KAAKg4B,mBAAmB5Y,KAAO,GAC/Bpf,KAAKg5B,4BAEb,CAUA,0BAAAA,GACI,IAAIhtB,EACJ,GAAIhM,KAAK63B,oBAGL,OAFA73B,KAAKkX,IAAI,wDAAwDlX,KAAK63B,6BACtE73B,KAAK83B,4BAIT,MACM2G,EAAK1zB,WACLmE,EAAU,IAAI/J,IAAInF,KAAKg4B,oBAC7Bh4B,KAAKg4B,mBAAmBiE,QAExB,GADmB/sB,EAAQnJ,IAAI04B,EAAGnhB,SAA4B,IAAjBpO,EAAQkQ,KAEjDpf,KAAKogC,YAAY,CAAEC,cAAc,QAGhC,CAED,GADArgC,KAAKkX,IAAI,gCAAiChI,IACR,IAA9BlP,KAAK2J,QAAQ22B,aAAwB,CACrC,IAAI1f,EAAS5gB,KAAK05B,qBAAqB/Y,aACvC,MAAMF,EAAezgB,KAAK0gB,cAAcC,aAClC4f,EAAavgC,KAAK+I,QAAQ4X,aAAeF,EAd7B,EAedtW,KAAKq2B,IAAI5f,EAAS2f,GAAc,IAEhCvgC,KAAK05B,qBAAqBl1B,MAAMoc,OAAS2f,EAAa,KACtD3f,EAAS2f,EAEjB,CAEIrxB,EAAQnJ,IAAI04B,EAAGC,cACf1+B,KAAKwS,OAAO6O,IACRA,EAAEsN,cAAc,IAIpBzf,EAAQnJ,IAAI04B,EAAGrG,UAEfp4B,KAAK++B,sBACL/+B,KAAK+/B,uBAET//B,KAAKogC,aAET,CACA,GAAIpgC,KAAK2J,QAAQ6uB,qBAAsB,CACnC,IAAI7N,EAA8C,QAAtC3e,EAAKhM,KAAKo7B,kBAAiB,UAA0B,IAAPpvB,OAAgB,EAASA,EAAGwe,SAAQ,EAAO,QAAS,OAC9GG,EAAOA,EAAOA,EAAO,KAAO,GAC5B3qB,KAAK2J,QAAQ6uB,qBAAqBlH,YAAc3G,CACpD,CACA3qB,KAAK+U,WAAW,SACpB,CAyCA,WAAAqrB,CAAYz2B,GAIR,MAAM02B,KADN12B,EAAUvD,OAAO0D,OAAO,CAAEu2B,cAAc,GAAS12B,IAClB02B,aAEzBI,EAAYzgC,KAAK+I,QAAQ4X,aAGzBwR,EAAMnyB,KAAK+I,QAAQsX,UACzB,IAAIqgB,EAAWv2B,KAAKC,IAAI,EAAG+nB,EA5zKhB,GAWS,GAkzKpBuO,EAAWv2B,KAAKqxB,MAAMkF,GAGlBA,EAAW,GACXA,IAEJ,IAAIC,EAASx2B,KAAKC,IAAI,GAAI+nB,EAAMsO,GAn0KrB,GAWS,GAyzKpBE,EAASx2B,KAAKoxB,KAAKoF,GAKnB,MAAMC,EAAgB,IAAIz7B,IAC1BnF,KAAKkxB,gBAAgB2P,WAAWrgC,SAASuC,IACrC,MAAM+9B,EAAK/9B,EACX69B,EAAcp3B,IAAIs3B,EAAGhS,SAAS,IAElC,IAAI5E,EAAM,EACNqG,EAAM,EACN4O,GAAW,EACX4B,EAAW,QACf/gC,KAAKm7B,WAAU,SAAUppB,GAErB,MAAMme,EAASne,EAAKsT,SAEhBtT,EAAKqT,UAAY8E,IACjBnY,EAAKqT,QAAU8E,EACfiV,GAAW,GAEXjV,EAAMwW,GAAYxW,EAAMyW,EAEpBzQ,IACA6Q,EAAW7Q,GAGVA,GAAUmQ,GACfO,EAAchc,OAAO7S,GAErBme,EAAO1rB,MAAM+rB,IAn2KV,GAm2KgBrG,EAAmB,KACtC6W,EAAW7Q,IAGX0Q,EAAchc,OAAO7S,GAEjBme,IACAA,EAAO1rB,MAAM+rB,IA12Kd,GA02KoBrG,EAAmB,MAE1CnY,EAAK4D,QAAQ,CAAE4a,IAAKA,EAAKD,MAAOyQ,IAEhCA,EAAWhvB,EAAKsT,UAEpB6E,IACAqG,GAj3KO,EAk3KX,IACAvwB,KAAK43B,aAAe1N,EACpB,IAAK,MAAM7I,KAAKuf,EACZvf,EAAEtM,WAAW,WACbsM,EAAEsN,eAUN,OAPA3uB,KAAKkxB,gBAAgB1sB,MAAMoc,OAAS,GAAG2P,MAOhC4O,CACX,CAUA,KAAA3sB,CAAM7Q,GACF,OAAO3B,KAAK2M,KAAK6F,MAAM7Q,GAAU,EACrC,CAYA,SAAAw5B,CAAUx5B,EAAUgI,GAChB,IAAK3J,KAAK2M,KAAKke,cACX,OAAO,EAEX,GAAIlhB,GAAWA,EAAQkyB,QAEnB,cADOlyB,EAAQkyB,QACR77B,KAAKghC,aAAar/B,EAAUgI,GAGvC,IAAIvH,EAAG6+B,EAASpuB,EAAQX,EAAKgvB,EAAUC,EAAUC,EAAa,EAAGC,GAAwC,KADzG13B,EAAUA,GAAW,CAAC,GACmE2gB,YAAuBvY,EAAOpI,EAAQY,OAASvK,KAAK2M,KAAKgG,SAAS,GAC3J,MAAMsW,IAAkBtf,EAAQsf,cAC1BqY,GAAerY,GAAqC,SAApBjpB,KAAKyQ,WAE3C,IADAoC,EAASd,EAAKc,OACPA,GAAQ,CAKX,IAHAquB,EAAWruB,EAAOF,SAClBsuB,EAAUC,EAASr+B,QAAQkP,GAAQqvB,EACnCjgC,OAAO8/B,GAAW,EAAG,kBAAkBlvB,2BAA8Bc,KAChEzQ,EAAI6+B,EAAS7+B,EAAI8+B,EAAS/+B,OAAQC,IAAK,CAExC,GADA2P,EAAOmvB,EAAS9+B,GACZ2P,IAASovB,EACT,OAAO,EAEX,IAAIG,GACCvvB,EAAK0T,gBACL1T,EAAKd,OACLc,EAAKQ,cAHV,CAMA,IAAK8uB,IAAoC,IAAnB1/B,EAASoQ,GAC3B,OAAO,EAIX,GAFAsvB,GAAgB,EAEZtvB,EAAKY,UACLZ,EAAKY,SAASxQ,SACb8mB,GAAiBlX,EAAKiB,YACvBd,EAAMH,EAAKS,OAAO6O,GACVA,IAAM8f,KAGNG,GAAgBjgB,EAAEpQ,OAAUoQ,EAAE9O,eAGd,IAAhB5Q,EAAS0f,KAGR4H,IAAiB5H,EAAE1O,UAAa0O,EAAErO,cAAvC,EACW,QANA,UAQZ,IACS,IAARd,GACA,OAAO,CAxBf,CA2BJ,CAEAH,EAAOc,EACPA,EAASA,EAAOA,OAChBuuB,EAAa,GACRvuB,GAAUlJ,EAAQ43B,OACnBvhC,KAAK6W,SAAS,4BACd1V,OAAOwI,EAAQY,MAAO,kCACtB42B,EAAWx3B,EAAQY,MACnBZ,EAAQ43B,MAAO,EACf1uB,EAAS7S,KAAK2M,KACdy0B,EAAa,EAErB,CACA,OAAO,CACX,CAKA,YAAAJ,CAAar/B,EAAUgI,GACnB,IAAIgJ,EAAUuX,EAAKrX,EAAQd,EAAOpI,EAAQY,OAASvK,KAAK2M,KAAKgG,SAAS,GACtE,MAAMsW,IAAkBtf,EAAQsf,cAChC,IAA4B,IAAxBtf,EAAQ2gB,cACe,IAAnB3oB,EAASoQ,GACT,OAAO,EAGf,OAAa,CAGT,GAFAc,EAASd,EAAKc,OACdF,EAAWE,EAAOF,SACdA,EAAS,KAAOZ,EAAM,CAGtB,GADAA,EAAOc,GACFd,EAAKc,OACN,MAEJF,EAAWE,EAAOF,QACtB,MAMI,IAHAuX,EAAMvX,EAAS9P,QAAQkP,GACvBA,EAAOY,EAASuX,EAAM,IAEdjB,GAAiBlX,EAAKiB,WAC1BjB,EAAKY,UACLZ,EAAKY,SAASxQ,QACdwQ,EAAWZ,EAAKY,SAChBE,EAASd,EACTA,EAAOY,EAASA,EAASxQ,OAAS,GAI1C,IAAK8mB,GAAkBlX,EAAKka,eAGL,IAAnBtqB,EAASoQ,GACT,OAAO,CAEf,CACA,OAAO,CACX,CAOA,IAAAqb,CAAK7S,GAED,OADAva,KAAKi8B,QACEj8B,KAAK2M,KAAKygB,KAAK7S,EAC1B,CAgBA,YAAAhH,CAAahP,GAOLA,GACApD,OAAOnB,KAAK63B,oBAAsB,EAAG,2CACrC73B,KAAK63B,sBAI4B,IAA7B73B,KAAK63B,sBACL73B,KAAK6W,SAAS,8DAA8D7W,KAAK83B,wDACjF93B,KAAK83B,0BAA4B,EACjC93B,KAAKonB,OAAOtc,WAAW2jB,IAAK,CAAEuE,WAAW,MAI7ChzB,KAAK63B,qBAOb,CAOA,WAAArnB,CAAYI,EAAQjH,GAChB,OAAO3J,KAAKw3B,WAAW5mB,OAAOJ,YAAYI,EAAQjH,EACtD,CAIA,cAAA0J,CAAezC,EAAQjH,GACnB,OAAO3J,KAAKw3B,WAAW5mB,OAAOyC,eAAezC,EAAQjH,EACzD,CAMA,WAAA6H,GACI,OAAOxR,KAAKw3B,WAAW5mB,OAAOY,aAClC,CAMA,cAAAgwB,GACI,QAASxhC,KAAKyQ,UAClB,CAMA,YAAAC,GACI,OAAO1Q,KAAKw3B,WAAW5mB,OAAOF,cAClC,EAEJqQ,WAAWuE,SAAW,EAEtBvE,WAAW0gB,QAAU,SAErB1gB,WAAW5V,KAAOA,YAET4V"}
\ No newline at end of file
+{"version":3,"file":"wunderbaum.esm.js","names":["freeGlobal","global","Object","freeGlobalThis","globalThis","freeSelf","self","root","Function","isObject","value","type","debounce","func","wait","options","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","useRAF","requestAnimationFrame","TypeError","invokeFunc","time","args","thisArg","undefined","apply","startTimer","pendingFunc","cancelAnimationFrame","setTimeout","shouldInvoke","timeSinceLastCall","timerExpired","Date","now","trailingEdge","timeSinceLastInvoke","timeWaiting","Math","min","remainingWait","debounced","isInvoking","this","leadingEdge","max","cancel","id","clearTimeout","cancelTimer","flush","pending","throttle","MOUSE_BUTTONS","MAX_INT","userInfo","_getUserInfo","isMac","REX_HTML","REX_TOOLTIP","ENTITY_MAP","ValidationError","Error","constructor","message","super","name","Deferred$1","thens","catches","status","resolve","resolvedValue","forEach","t","reject","error","rejectedError","c","then","cb","unshift","promise","catch","assert","cond","msg","nav","navigator","test","platform","documentReady","callback","document","readyState","addEventListener","documentReadyPromise","Promise","each","obj","length","i","call","k","escapeHtml","s","replace","escapeRegex","escapeTooltip","extractHtmlText","indexOf","getValueFromElem","elem","coerce","tag","tagName","classList","contains","span","embeddedInput","querySelector","innerText","input","indeterminate","checked","valueAsDate","valueAsNumber","parentElement","setValueToElem","select","selectedIndex","setElemDisplay","flag","style","elemFromSelector","display","elemFromHtml","html","createElement","innerHTML","trim","content","firstElementChild","_IGNORE_KEYS","Set","eventToString","event","key","et","altKey","push","ctrlKey","metaKey","shiftKey","button","has","join","extend","arg","prototype","hasOwnProperty","isArray","Array","isEmptyObject","keys","isFunction","isPlainObject","toString","noop","onEvent","rootTarget","eventNames","selectorOrHandler","handlerOrNone","selector","handler","split","evn","e","target","matches","closest","overrideMethod","instance","methodName","ctx","prevSuper","prevSuperApply","prevFunc","_super","_superApply","argsArray","setTimeoutPromise","ms","err","async","sleep","toggleCheckbox","element","tristate","getOption","opts","defaultValue","ext","toSet","val","set","add","toLowerCase","adaptiveThrottle","assign","minDelay","defaultDelay","maxDelay","delayFactor","waiting","pendingArgs","pendingTimer","throttledFn","useArgs","start","console","elap","curDelay","useDelay","ChangeType","RenderFlag","NodeStatusType","NodeRegion","NavModeEnum","util","freeze","__proto__","Deferred","WunderbaumExtension","tree","defaults","enabled","treeOpts","extensionOpts","getPluginOption","init","_a","setPluginOption","setEnabled","onKeyEvent","data","onRender","START_MARKER","END_MARKER","RE_START_MARKER","RegExp","RE_END_MARTKER","FilterExtension","connectInput","autoApply","autoExpand","counter","fuzzy","hideExpandedCounter","hideExpanders","highlight","leavesOnly","mode","noData","lastFilterArgs","queryInput","filterNodes","filterMode","updateFilter","_applyFilterNoUpdate","filter","branchMode","_opts","runWithDeferredUpdate","_applyFilterImpl","match","temp","count","prevAutoCollapse","autoCollapse","hideMode","logInfo","clearFilter","map","reduce","a","b","re","reHighlight","node","title","text","res","_markFuzzyMatchedChars","titleWithHighlight","arguments","toggle","subMatchCount","visit","setStatus","ok","children","matchedByBranch","parent","visitParents","p","expanded","setExpanded","noAnimation","noEvents","_filterAutoExpanded","filterBranches","logWarn","enableUpdate","remove","escapeTitles","matchingIndices","_matchingArrIdx","_mIdx","textPoses","v","QUICKSEARCH_DELAY","KeynavExtension","_getEmbeddedInputElem","ace","getActiveColElem","_isCurInputFocused","activate","autoActivate","curInput","inputHasFocus","navModeOption","navigationModeOption","focusNode","eventName","handled","isEnabled","_callEvent","_callMethod","currentNode","getFocusNode","getActiveNode","firstNode","getFirstChild","setActive","setFocus","isColspan","isRowNav","blur","_render","quicksearch","stamp","lastQuicksearchTime","lastQuicksearchTerm","matchNode","findNextNode","preventDefault","isActive","isExpanded","isExpandable","startCell","startRow","setCellNav","toggleSelected","navigate","curInputType","inputCanFocus","logDebug","setCustomValidity","setColumn","activeColIdx","checkValidity","focus","click","log","isCellNav","cell","columns","LoggerExtension","ignoreEvents","prefix","extra","DEFAULT_DEBUGLEVEL","ROW_HEIGHT","ICON_WIDTH","TITLE_SPAN_PAD_Y","RENDER_MAX_PREFETCH","TEST_IMG","iconMaps","bootstrap","loading","expanderExpanded","expanderCollapsed","expanderLazy","checkChecked","checkUnchecked","checkUnknown","radioChecked","radioUnchecked","radioUnknown","folder","folderOpen","folderLazy","doc","fontawesome6","RESERVED_TREE_SOURCE_KEYS","KEY_TO_ACTION_DICT","Add","ArrowDown","ArrowLeft","ArrowRight","ArrowUp","Backspace","Divide","End","Home","Multiply","PageDown","PageUp","Subtract","makeNodeTitleMatcher","makeNodeTitleStartMatcher","reMatch","nodeTitleSorter","x","y","unflattenSource","source","_b","_c","_format","_keyMap","_positional","includes","longToShort","warn","entries","positionalShort","newChildren","keyToNodeMap","indexToNodeMap","keyAttrName","childrenAttrName","index","nodeTuple","parentId","kwargs","positionalIdx","parentNode","decompressSourceData","_version","_valueMap","shortToLong","_typeList","_iter","childList","getOwnPropertyNames","propName","longName","newValue","nodeMimeType","DndExtension","autoExpandMS","multiSource","effectAllowed","dropEffectDefault","guessDropEffect","preventForeignNodes","preventLazyParents","preventNonNodes","preventRecursion","preventSameParent","preventVoidMoves","serializeClipboardData","scroll","scrollSensitivity","scrollSpeed","sourceCopyHook","dragStart","drag","dragEnd","dragEnter","dragOver","dragExpand","drop","dragLeave","srcNode","lastTargetNode","lastEnterStamp","lastAllowedDropRegions","lastDropEffect","lastDropRegion","currentScrollDir","applyScrollDirThrottled","_applyScrollDir","dndOpts","dnd","onDragEvent","bind","onDropEvent","_leaveNode","ltn","setClass","unifyDragover","size","_calcDropRegion","allowed","dy","offsetY","_guessDropEffect","ea","canCopy","canLink","canMove","_isVoidDrop","targetNode","dropRegion","getNextSibling","getPrevSibling","isDragging","sp","scrollTop","_autoScroll","viewportY","sensitivity","headerHeight","headerElement","clientHeight","height","offsetHeight","scrollHeight","Wunderbaum","getNode","dataTransfer","isEditingTitle","nodeData","toDict","n","_orgKey","_treeId","setData","JSON","stringify","types","srcTree","dt","dropEffect","isStatusNode","isLoaded","isAncestorOf","regionSet","clientY","offsetTop","region","_isLoading","stopPropagation","getData","parse","suggestedDropMode","suggestedDropEffect","sourceNode","sourceNodeData","DragObserver","dragElem","dragging","events","thresh","_handler","handleEvent","disconnect","removeEventListener","getDragElem","stopDrag","cb_event","dragstop","dx","pageX","pageY","dragstart","GridExtension","observer","window","handleDrag","info","getEventInfo","_promise","_resolve","_reject","reason","finally","NODE_PROPS","NODE_DICT_PROPS","delete","WunderbaumNode","refKey","classes","_requestId","_errorInfo","_partsel","_partload","_rowIdx","_rowElem","sequence","icon","lazy","statusNodeType","colspan","checkbox","radiogroup","selected","unselectable","_registerNode","Symbol","iterator","cl","l","typeInfo","addChildren","before","applyMinExpanLevel","_level","getLevel","nodeList","forceExpand","minExpandLevel","child","subChildren","isUnloaded","concat","findDirectChild","pos","splice","update","structure","addNode","applyCommand","cmd","collapseSiblings","className","cnSet","cn","startEditTitle","expandAll","depth","loadLazy","force","keepActiveNodeVisible","expandOpts","scrollIntoView","logTime","level","level_1","promises","all","logTimeEnd","activeNode","findAll","matcher","ptr","findFirst","findRelatedNode","where","includeHidden","format_iter","name_cb","connectors","_is_last","ca","_format_line","parts","format","line","getColElem","colIdx","findIndex","colElems","querySelectorAll","getCloneList","includeSelf","clones","findByRefKey","getLastChild","ac","idx","getParent","getParentList","includeRoot","dtn","getPath","part","separator","path","isFunc","hasChildren","hasClass","other","isDescendantOf","isChildOf","isClone","andCollapsed","emptyChildListExpandable","isFirstSibling","isLastSibling","isLazy","isLoading","isPagingNode","isParentOf","isPartload","isPartsel","isRadio","isRendered","isRootNode","isSelected","isTopLevel","isVisible","hasFilter","parents","_loadSourceObject","response","setTypes","colStructure","selectMode","fixSelection3FromEndNodes","_fetchWithOptions","url","params","body","rest","fetchOpts","method","URLSearchParams","fetch","json","load","requestId","prevParent","elapLoad","elapProcess","startProcess","logError","debugLevel","forceReload","wasExpanded","resetLazy","makeVisible","dfd","deferreds","len","seOpts","updatePendingModifications","moveTo","targetParent","triggerModifyChild","any","triggerModify","removeMarkup","_unregisterNode","removeChildren","_wb_node","_getRenderInfo","allColInfosById","renderColInfosById","col","_createIcon","iconMap","parentElem","replaceChild","showLoading","iconSpan","appendChild","cbRes","badge","tooltip","badgeClass","badgeTooltip","append","_render_markup","treeOptions","rowDiv","checkboxSpan","expanderSpan","isNew","after","top","nodeElem","ofsTitlePx","titleSpan","_ofsTitlePx","draggable","colElem","left","_ofsPx","width","_widthPx","nodeListElement","prepend","_render_data","preventScroll","textContent","skeleton","vpWidth","clientWidth","isDataChange","_render_status","renderInfo","rowClasses","image","backgroundImage","cbclass","colSpan","resizeCols","ofs","colDef","change","row","recursive","dict","scrollTo","prev","retrigger","focusTree","orgEvent","edit","nextNode","prevNode","immediate","sendEvents","updateOpts","lastChild","topNode","setIcon","setKey","getSelectedNodes","stopOnParents","_anySelectable","setSelected","found","_changeSelectStatusProps","state","changed","fixSelection3AfterClick","_walk","allSelected","someSelected","canSelect","propagateDown","sibling","details","statusNode","_setStatusNode","firstChild","_clearStatusNode","strings","loadError","setTitle","_sortChildren","cmp","deep","sort","sortChildren","operation","modifyChild","visitSiblings","isMatched","EditExtension","minlength","maxlength","trigger","slowClickDelay","validity","beforeEdit","curEditNode","relatedNode","debouncedOnChange","_onChange","_applyChange","inputElem","validationMessage","reportValidity","inputValue","inputValid","_preprocessKeyEvent","_stopEditTitle","inputHtml","opt","stopEditTitle","focusElem","activeElement","forceClose","errMsg","oldValue","createNode","newNode","WbSystemRoot","extensionList","extensions","keyMap","Map","refKeyMap","treeRowCount","_disableUpdateCount","_disableUpdateIgnoreCount","_columnsById","pendingChangeTypes","_util","_cellNavMode","lastClickTime","header","rowHeightPx","fixedCol","showSpinner","connectTopBreadcrumb","iconBadge","receive","readyDeferred","ready","readyOk","_registerExtension","_updateViewportThrottled","_updateViewportImmediately","getAttribute","tabIndex","_wb_tree","wantHeader","rowElement","colDiv","dataset","coldivs","repeat","listContainerElement","_initExtensions","optName","setOption","isGrid","setNavigationOption","resizeObserver","ResizeObserver","resize","observe","mouseEvent","expander","scrollIntoViewOnExpandClick","_callHook","getTree","el","treeElem","Element","extension","rk","rks","get","hook","d","_getNodeByRowIdx","visitRows","getTopmostVpNode","complete","topIdx","ceil","floor","getLowestVpNode","scrollParent","bottomIdx","_getPrevNodeInView","reverse","_getNextNodeInView","nodeOrOpts","refNode","clear","destroy","outerHTML","hasFocus","hasHeader","hint","selectAll","toggleSelect","_selectRange","eventInfo","visible","_check","from","findKey","startNode","_checkNode","pageSize","bottomNode","parentCol","canonicalName","unknown","colId","column","KeyboardEvent","isEditing","label","timeEnd","vpHeight","rowTop","vpTop","vpRowTop","vpRowBottom","newScrollTop","scrollToHorz","fixedWidth","scrollLeft","colLeft","Number","parseInt","colRight","newLeft","cid","setActiveNode","RF","clearMarkup","redraw","reset","values","toDictArray","_updateColumnWidths","col0","totalWidth","totalWeight","modified","cw","_weight","endsWith","px","parseFloat","slice","restPx","ofsPx","minWidth","cmw","tw","_renderHeaderMarkup","colCount","headerRow","headerClasses","resizer","_updateRows","newNodesOnly","adjustHeight","wantHeight","abs","vp_height","startIdx","endIdx","obsoleteNodes","childNodes","tr","prevElem","_visitRowsUp","nextIdx","siblings","stopNode","siblingOfs","skipFirstNode","checkFilter","wrap","isFilterActive","version"],"sources":["wunderbaum.esm.js"],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/wunderbaum.umd.js b/dist/wunderbaum.umd.js
index 59a24825..501bd344 100644
--- a/dist/wunderbaum.umd.js
+++ b/dist/wunderbaum.umd.js
@@ -1,7635 +1,7814 @@
(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
- typeof define === 'function' && define.amd ? define(['exports'], factory) :
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.mar10 = {}));
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.mar10 = {}));
})(this, (function (exports) { 'use strict';
- /*!
- * Wunderbaum - util
- * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */
- /** @module util */
- /** Readable names for `MouseEvent.button` */
- const MOUSE_BUTTONS = {
- 0: "",
- 1: "left",
- 2: "middle",
- 3: "right",
- 4: "back",
- 5: "forward",
- };
- const MAX_INT = 9007199254740991;
- const userInfo = _getUserInfo();
- /**True if the client is using a macOS platform. */
- const isMac = userInfo.isMac;
- const REX_HTML = /[&<>"'/]/g; // Escape those characters
- const REX_TOOLTIP = /[<>"'/]/g; // Don't escape `&` in tooltips
- const ENTITY_MAP = {
- "&": "&",
- "<": "<",
- ">": ">",
- '"': """,
- "'": "'",
- "/": "/",
- };
- /**
- * A ES6 Promise, that exposes the resolve()/reject() methods.
- */
- let Deferred$1 = class Deferred {
- constructor() {
- this.thens = [];
- this.catches = [];
- this.status = "";
- }
- resolve(value) {
- if (this.status) {
- throw new Error("already settled");
- }
- this.status = "resolved";
- this.resolvedValue = value;
- this.thens.forEach((t) => t(value));
- this.thens = []; // Avoid memleaks.
- }
- reject(error) {
- if (this.status) {
- throw new Error("already settled");
- }
- this.status = "rejected";
- this.rejectedError = error;
- this.catches.forEach((c) => c(error));
- this.catches = []; // Avoid memleaks.
- }
- then(cb) {
- if (status === "resolved") {
- cb(this.resolvedValue);
- }
- else {
- this.thens.unshift(cb);
- }
- }
- catch(cb) {
- if (this.status === "rejected") {
- cb(this.rejectedError);
- }
- else {
- this.catches.unshift(cb);
- }
- }
- promise() {
- return {
- then: this.then,
- catch: this.catch,
- };
- }
- };
- /**Throw an `Error` if `cond` is falsey. */
- function assert(cond, msg) {
- if (!cond) {
- msg = msg || "Assertion failed.";
- throw new Error(msg);
- }
- }
- function _getUserInfo() {
- const nav = navigator;
- // const ua = nav.userAgentData;
- const res = {
- isMac: /Mac/.test(nav.platform),
- };
- return res;
- }
- /** Run `callback` when document was loaded. */
- function documentReady(callback) {
- if (document.readyState === "loading") {
- document.addEventListener("DOMContentLoaded", callback);
- }
- else {
- callback();
- }
- }
- /** Resolve when document was loaded. */
- function documentReadyPromise() {
- return new Promise((resolve) => {
- documentReady(resolve);
- });
- }
- /**
- * Iterate over Object properties or array elements.
- *
- * @param obj `Object`, `Array` or null
- * @param callback(index, item) called for every item.
- * `this` also contains the item.
- * Return `false` to stop the iteration.
- */
- function each(obj, callback) {
- if (obj == null) {
- // accept `null` or `undefined`
- return obj;
- }
- const length = obj.length;
- let i = 0;
- if (typeof length === "number") {
- for (; i < length; i++) {
- if (callback.call(obj[i], i, obj[i]) === false) {
- break;
- }
- }
- }
- else {
- for (const k in obj) {
- if (callback.call(obj[i], k, obj[k]) === false) {
- break;
- }
- }
- }
- return obj;
- }
- /** Shortcut for `throw new Error(msg)`.*/
- function error(msg) {
- throw new Error(msg);
- }
- /** Convert `<`, `>`, `&`, `"`, `'`, and `/` to the equivalent entities. */
- function escapeHtml(s) {
- return ("" + s).replace(REX_HTML, function (s) {
- return ENTITY_MAP[s];
- });
- }
- // export function escapeRegExp(s: string) {
- // return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
- // }
- /**Convert a regular expression string by escaping special characters (e.g. `"$"` -> `"\$"`) */
- function escapeRegex(s) {
- return ("" + s).replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
- }
- /** Convert `<`, `>`, `"`, `'`, and `/` (but not `&`) to the equivalent entities. */
- function escapeTooltip(s) {
- return ("" + s).replace(REX_TOOLTIP, function (s) {
- return ENTITY_MAP[s];
- });
- }
- /** TODO */
- function extractHtmlText(s) {
- if (s.indexOf(">") >= 0) {
- error("Not implemented");
- // return $("
").html(s).text();
- }
- return s;
- }
- /**
- * Read the value from an HTML input element.
- *
- * If a `` is passed, the first child input is used.
- * Depending on the target element type, `value` is interpreted accordingly.
- * For example for a checkbox, a value of true, false, or null is returned if
- * the element is checked, unchecked, or indeterminate.
- * For datetime input control a numerical value is assumed, etc.
- *
- * Common use case: store the new user input in a `change` event handler:
- *
- * ```ts
- * change: (e) => {
- * const tree = e.tree;
- * const node = e.node;
- * // Read the value from the input control that triggered the change event:
- * let value = tree.getValueFromElem(e.element);
- * // and store it to the node model (assuming the column id matches the property name)
- * node.data[e.info.colId] = value;
- * },
- * ```
- * @param elem ` ` or `` element. Also a parent `span.wb-col` is accepted.
- * @param coerce pass true to convert date/time inputs to `Date`.
- * @returns the value
- */
- function getValueFromElem(elem, coerce = false) {
- const tag = elem.tagName;
- let value = null;
- if (tag === "SPAN" && elem.classList.contains("wb-col")) {
- const span = elem;
- const embeddedInput = span.querySelector("input,select");
- if (embeddedInput) {
- return getValueFromElem(embeddedInput, coerce);
- }
- span.innerText = "" + value;
- }
- else if (tag === "INPUT") {
- const input = elem;
- const type = input.type;
- switch (type) {
- case "button":
- case "reset":
- case "submit":
- case "image":
- break;
- case "checkbox":
- value = input.indeterminate ? null : input.checked;
- break;
- case "date":
- case "datetime":
- case "datetime-local":
- case "month":
- case "time":
- case "week":
- value = coerce ? input.valueAsDate : input.value;
- break;
- case "number":
- case "range":
- value = input.valueAsNumber;
- break;
- case "radio":
- {
- const name = input.name;
- const checked = input.parentElement.querySelector(`input[name="${name}"]:checked`);
- value = checked ? checked.value : undefined;
- }
- break;
- case "text":
- default:
- value = input.value;
- }
- }
- else if (tag === "SELECT") {
- const select = elem;
- value = select.value;
- }
- return value;
- }
- /**
- * Set the value of an HTML input element.
- *
- * If a `` is passed, the first child input is used.
- * Depending on the target element type, `value` is interpreted accordingly.
- * For example a checkbox is set to checked, unchecked, or indeterminate if the
- * value is truethy, falsy, or `null`.
- * For datetime input control a numerical value is assumed, etc.
- *
- * Common use case: update embedded input controls in a `render` event handler:
- *
- * ```ts
- * render: (e) => {
- * // e.node.log(e.type, e, e.node.data);
- *
- * for (const col of Object.values(e.renderColInfosById)) {
- * switch (col.id) {
- * default:
- * // Assumption: we named column.id === node.data.NAME
- * util.setValueToElem(col.elem, e.node.data[col.id]);
- * break;
- * }
- * }
- * },
- * ```
- *
- * @param elem ` ` or `` element Also a parent `span.wb-col` is accepted.
- * @param value a value that matches the target element.
- */
- function setValueToElem(elem, value) {
- const tag = elem.tagName;
- if (tag === "SPAN" && elem.classList.contains("wb-col")) {
- const span = elem;
- const embeddedInput = span.querySelector("input,select");
- if (embeddedInput) {
- return setValueToElem(embeddedInput, value);
- }
- // No embedded input: simply write as escaped html
- span.innerText = "" + value;
- }
- else if (tag === "INPUT") {
- const input = elem;
- const type = input.type;
- switch (type) {
- case "checkbox":
- // An explicit `null` value is interpreted as 'indeterminate'.
- // `undefined` is interpreted as 'unchecked'
- input.indeterminate = value === null;
- input.checked = !!value;
- break;
- case "date":
- case "month":
- case "time":
- case "week":
- case "datetime":
- case "datetime-local":
- input.valueAsDate = new Date(value);
- break;
- case "number":
- case "range":
- if (value == null) {
- input.value = value;
- }
- else {
- input.valueAsNumber = value;
- }
- break;
- case "radio":
- error(`Not yet implemented: ${type}`);
- // const name = input.name;
- // const checked = input.parentElement!.querySelector(
- // `input[name="${name}"]:checked`
- // );
- // value = checked ? (checked).value : undefined;
- break;
- case "button":
- case "reset":
- case "submit":
- case "image":
- break;
- case "text":
- default:
- input.value = value !== null && value !== void 0 ? value : "";
- }
- }
- else if (tag === "SELECT") {
- const select = elem;
- if (value == null) {
- select.selectedIndex = -1;
- }
- else {
- select.value = value;
- }
- }
- }
- /** Show/hide element by setting the `display` style to 'none'. */
- function setElemDisplay(elem, flag) {
- const style = elemFromSelector(elem).style;
- if (flag) {
- if (style.display === "none") {
- style.display = "";
- }
- }
- else if (style.display === "") {
- style.display = "none";
- }
- }
- /** Create and return an unconnected `HTMLElement` from a HTML string. */
- function elemFromHtml(html) {
- const t = document.createElement("template");
- t.innerHTML = html.trim();
- return t.content.firstElementChild;
- }
- const _IGNORE_KEYS = new Set(["Alt", "Control", "Meta", "Shift"]);
- /** Return a HtmlElement from selector or cast an existing element. */
- function elemFromSelector(obj) {
- if (!obj) {
- return null; //(null as unknown) as HTMLElement;
- }
- if (typeof obj === "string") {
- return document.querySelector(obj);
- }
- return obj;
- }
- /** Return a EventTarget from selector or cast an existing element. */
- function eventTargetFromSelector(obj) {
- if (!obj) {
- return null;
- }
- if (typeof obj === "string") {
- return document.querySelector(obj);
- }
- return obj;
- }
- /**
- * Return a canonical descriptive string for a keyboard or mouse event.
- *
- * The result also contains a prefix for modifiers if any, for example
- * `"x"`, `"F2"`, `"Control+Home"`, or `"Shift+clickright"`.
- * This is especially useful in `switch` statements, to make sure that modifier
- * keys are considered and handled correctly:
- * ```ts
- * const eventName = util.eventToString(e);
- * switch (eventName) {
- * case "+":
- * case "Add":
- * ...
- * break;
- * case "Enter":
- * case "End":
- * case "Control+End":
- * case "Meta+ArrowDown":
- * case "PageDown":
- * ...
- * break;
- * }
- * ```
- */
- function eventToString(event) {
- const key = event.key;
- const et = event.type;
- const s = [];
- if (event.altKey) {
- s.push("Alt");
- }
- if (event.ctrlKey) {
- s.push("Control");
- }
- if (event.metaKey) {
- s.push("Meta");
- }
- if (event.shiftKey) {
- s.push("Shift");
- }
- if (et === "click" || et === "dblclick") {
- s.push(MOUSE_BUTTONS[event.button] + et);
- }
- else if (et === "wheel") {
- s.push(et);
- // } else if (!IGNORE_KEYCODES[key]) {
- // s.push(
- // SPECIAL_KEYCODES[key] ||
- // String.fromCharCode(key).toLowerCase()
- // );
- }
- else if (!_IGNORE_KEYS.has(key)) {
- s.push(key);
- }
- return s.join("+");
- }
- /**
- * Copy allproperties from one or more source objects to a target object.
- *
- * @returns the modified target object.
- */
- // TODO: use Object.assign()? --> https://stackoverflow.com/a/42740894
- // TODO: support deep merge --> https://stackoverflow.com/a/42740894
- function extend(...args) {
- for (let i = 1; i < args.length; i++) {
- const arg = args[i];
- if (arg == null) {
- continue;
- }
- for (const key in arg) {
- if (Object.prototype.hasOwnProperty.call(arg, key)) {
- args[0][key] = arg[key];
- }
- }
- }
- return args[0];
- }
- /** Return true if `obj` is of type `array`. */
- function isArray(obj) {
- return Array.isArray(obj);
- }
- /** Return true if `obj` is of type `Object` and has no propertied. */
- function isEmptyObject(obj) {
- return Object.keys(obj).length === 0 && obj.constructor === Object;
- }
- /** Return true if `obj` is of type `function`. */
- function isFunction(obj) {
- return typeof obj === "function";
- }
- /** Return true if `obj` is of type `Object`. */
- function isPlainObject(obj) {
- return Object.prototype.toString.call(obj) === "[object Object]";
- }
- /** A dummy function that does nothing ('no operation'). */
- function noop(...args) { }
- function onEvent(rootTarget, eventNames, selectorOrHandler, handlerOrNone) {
- let selector, handler;
- rootTarget = eventTargetFromSelector(rootTarget);
- if (handlerOrNone) {
- selector = selectorOrHandler;
- handler = handlerOrNone;
- }
- else {
- selector = "";
- handler = selectorOrHandler;
- }
- eventNames.split(" ").forEach((evn) => {
- rootTarget.addEventListener(evn, function (e) {
- if (!selector) {
- return handler(e); // no event delegation
- }
- else if (e.target) {
- let elem = e.target;
- if (elem.matches(selector)) {
- return handler(e);
- }
- elem = elem.closest(selector);
- if (elem) {
- return handler(e);
- }
- }
- });
- });
- }
- /** Return a wrapped handler method, that provides `this._super` and `this._superApply`.
- *
- * ```ts
- // Implement `opts.createNode` event to add the 'draggable' attribute
- overrideMethod(ctx.options, "createNode", (event, data) => {
- // Default processing if any
- this._super.apply(this, event, data);
- // Add 'draggable' attribute
- data.node.span.draggable = true;
- });
- ```
- */
- function overrideMethod(instance, methodName, handler, ctx) {
- let prevSuper, prevSuperApply;
- const self = ctx || instance;
- const prevFunc = instance[methodName];
- const _super = (...args) => {
- return prevFunc.apply(self, args);
- };
- const _superApply = (argsArray) => {
- return prevFunc.apply(self, argsArray);
- };
- const wrapper = (...args) => {
- try {
- prevSuper = self._super;
- prevSuperApply = self._superApply;
- self._super = _super;
- self._superApply = _superApply;
- return handler.apply(self, args);
- }
- finally {
- self._super = prevSuper;
- self._superApply = prevSuperApply;
- }
- };
- instance[methodName] = wrapper;
- }
- /** Run function after ms milliseconds and return a promise that resolves when done. */
- function setTimeoutPromise(callback, ms) {
- return new Promise((resolve, reject) => {
- setTimeout(() => {
- try {
- resolve(callback.apply(this));
- }
- catch (err) {
- reject(err);
- }
- }, ms);
- });
- }
- /**
- * Wait `ms` microseconds.
- *
- * Example:
- * ```js
- * await sleep(1000);
- * ```
- * @param ms duration
- * @returns
- */
- async function sleep(ms) {
- return new Promise((resolve) => setTimeout(resolve, ms));
- }
- /**
- * Set or rotate checkbox status with support for tri-state.
- *
- * An initial 'indeterminate' state becomes 'checked' on the first call.
- *
- * If the input element has the class 'wb-tristate' assigned, the sequence is:
- * 'indeterminate' -> 'checked' -> 'unchecked' -> 'indeterminate' -> ...
- * Otherwise we toggle like
- * 'checked' -> 'unchecked' -> 'checked' -> ...
- */
- function toggleCheckbox(element, value, tristate) {
- const input = elemFromSelector(element);
- assert(input.type === "checkbox", `Expected a checkbox: ${input.type}`);
- tristate !== null && tristate !== void 0 ? tristate : (tristate = input.classList.contains("wb-tristate") || input.indeterminate);
- if (value === undefined) {
- const curValue = input.indeterminate ? null : input.checked;
- switch (curValue) {
- case true:
- value = false;
- break;
- case false:
- value = tristate ? null : true;
- break;
- case null:
- value = true;
- break;
- }
- }
- input.indeterminate = value == null;
- input.checked = !!value;
- }
- /**
- * Return `opts.NAME` if opts is valid and
- *
- * @param opts dict, object, or null
- * @param name option name (use dot notation to access extension option, e.g. `filter.mode`)
- * @param defaultValue returned when `opts` is not an object, or does not have a NAME property
- */
- function getOption(opts, name, defaultValue = undefined) {
- let ext;
- // Lookup `name` in options dict
- if (opts && name.indexOf(".") >= 0) {
- [ext, name] = name.split(".");
- opts = opts[ext];
- }
- const value = opts ? opts[name] : null;
- // Use value from value options dict, fallback do default
- return value !== null && value !== void 0 ? value : defaultValue;
- }
- /** Convert an Array or space-separated string to a Set. */
- function toSet(val) {
- if (val instanceof Set) {
- return val;
- }
- if (typeof val === "string") {
- const set = new Set();
- for (const c of val.split(" ")) {
- set.add(c.trim());
- }
- return set;
- }
- if (Array.isArray(val)) {
- return new Set(val);
- }
- throw new Error("Cannot convert to Set: " + val);
- }
- // /** Check if a string is contained in an Array or Set. */
- // export function isAnyOf(s: string, items: Array|Set): boolean {
- // return Array.prototype.includes.call(items, s)
- // }
- // /** Check if an Array or Set has at least one matching entry. */
- // export function hasAnyOf(container: Array|Set, items: Array): boolean {
- // if (Array.isArray(container)) {
- // return container.some(v => )
- // }
- // return container.some(v => {})
- // // const container = toSet(items);
- // // const itemSet = toSet(items);
- // // Array.prototype.includes
- // // throw new Error("Cannot convert to Set: " + val);
- // }
- /** Return a canonical string representation for an object's type (e.g. 'array', 'number', ...). */
- function type(obj) {
- return Object.prototype.toString
- .call(obj)
- .replace(/^\[object (.+)\]$/, "$1")
- .toLowerCase();
- }
- /**
- * Return a function that can be called instead of `callback`, but guarantees
- * a limited execution rate.
- * The execution rate is calculated based on the runtime duration of the
- * previous call.
- * Example:
- * ```js
- * throttledFoo = util.adaptiveThrottle(foo.bind(this), {});
- * throttledFoo();
- * throttledFoo();
- * ```
- */
- function adaptiveThrottle(callback, options) {
- let waiting = 0; // Initially, we're not waiting
- let pendingArgs = null;
- const opts = Object.assign({
- minDelay: 16,
- defaultDelay: 200,
- maxDelay: 5000,
- delayFactor: 2.0,
- }, options);
- const minDelay = Math.max(16, +opts.minDelay);
- const maxDelay = +opts.maxDelay;
- const throttledFn = (...args) => {
- if (waiting) {
- pendingArgs = args;
- // console.log(`adaptiveThrottle() queing request #${waiting}...`, args);
- waiting += 1;
- }
- else {
- // Prevent invocations while running or blocking
- waiting = 1;
- const useArgs = args; // pendingArgs || args;
- pendingArgs = null;
- // console.log(`adaptiveThrottle() execute...`, useArgs);
- const start = Date.now();
- try {
- callback.apply(this, useArgs);
- }
- catch (error) {
- console.error(error); // eslint-disable-line no-console
- }
- const elap = Date.now() - start;
- const curDelay = Math.min(Math.max(minDelay, elap * opts.delayFactor), maxDelay);
- const useDelay = Math.max(minDelay, curDelay - elap);
- // console.log(
- // `adaptiveThrottle() calling worker took ${elap}ms. delay = ${curDelay}ms, using ${useDelay}ms`,
- // pendingArgs
- // );
- setTimeout(() => {
- // Unblock, and trigger pending requests if any
- // const skipped = waiting - 1;
- waiting = 0; // And allow future invocations
- if (pendingArgs != null) {
- // There was another request while running or waiting
- // console.log(
- // `adaptiveThrottle() re-trigger (missed ${skipped})...`,
- // pendingArgs
- // );
- throttledFn.apply(this, pendingArgs);
- }
- }, useDelay);
- }
- };
- return throttledFn;
- }
+ /*!
+ * debounce & throttle, taken from https://github.com/lodash/lodash v4.17.21
+ * MIT License: https://raw.githubusercontent.com/lodash/lodash/4.17.21-npm/LICENSE
+ * Modified for TypeScript type annotations.
+ */
+ /* --- */
+ /** Detect free variable `global` from Node.js. */
+ const freeGlobal = typeof global === "object" &&
+ global !== null &&
+ global.Object === Object &&
+ global;
+ /** Detect free variable `globalThis` */
+ const freeGlobalThis = typeof globalThis === "object" &&
+ globalThis !== null &&
+ globalThis.Object == Object &&
+ globalThis;
+ /** Detect free variable `self`. */
+ const freeSelf = typeof self === "object" && self !== null && self.Object === Object && self;
+ /** Used as a reference to the global object. */
+ const root = freeGlobalThis || freeGlobal || freeSelf || Function("return this")();
+ /**
+ * Checks if `value` is the
+ * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
+ * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * isObject({})
+ * // => true
+ *
+ * isObject([1, 2, 3])
+ * // => true
+ *
+ * isObject(Function)
+ * // => true
+ *
+ * isObject(null)
+ * // => false
+ */
+ function isObject(value) {
+ const type = typeof value;
+ return value != null && (type === "object" || type === "function");
+ }
+ /**
+ * Creates a debounced function that delays invoking `func` until after `wait`
+ * milliseconds have elapsed since the last time the debounced function was
+ * invoked, or until the next browser frame is drawn. The debounced function
+ * comes with a `cancel` method to cancel delayed `func` invocations and a
+ * `flush` method to immediately invoke them. Provide `options` to indicate
+ * whether `func` should be invoked on the leading and/or trailing edge of the
+ * `wait` timeout. The `func` is invoked with the last arguments provided to the
+ * debounced function. Subsequent calls to the debounced function return the
+ * result of the last `func` invocation.
+ *
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is
+ * invoked on the trailing edge of the timeout only if the debounced function
+ * is invoked more than once during the `wait` timeout.
+ *
+ * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+ * until the next tick, similar to `setTimeout` with a timeout of `0`.
+ *
+ * If `wait` is omitted in an environment with `requestAnimationFrame`, `func`
+ * invocation will be deferred until the next frame is drawn (typically about
+ * 16ms).
+ *
+ * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+ * for details over the differences between `debounce` and `throttle`.
+ *
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to debounce.
+ * @param {number} [wait=0]
+ * The number of milliseconds to delay; if omitted, `requestAnimationFrame` is
+ * used (if available).
+ * @param {Object} [options={}] The options object.
+ * @param {boolean} [options.leading=false]
+ * Specify invoking on the leading edge of the timeout.
+ * @param {number} [options.maxWait]
+ * The maximum time `func` is allowed to be delayed before it's invoked.
+ * @param {boolean} [options.trailing=true]
+ * Specify invoking on the trailing edge of the timeout.
+ * @returns {Function} Returns the new debounced function.
+ * @example
+ *
+ * // Avoid costly calculations while the window size is in flux.
+ * jQuery(window).on('resize', debounce(calculateLayout, 150))
+ *
+ * // Invoke `sendMail` when clicked, debouncing subsequent calls.
+ * jQuery(element).on('click', debounce(sendMail, 300, {
+ * 'leading': true,
+ * 'trailing': false
+ * }))
+ *
+ * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
+ * const debounced = debounce(batchLog, 250, { 'maxWait': 1000 })
+ * const source = new EventSource('/stream')
+ * jQuery(source).on('message', debounced)
+ *
+ * // Cancel the trailing debounced invocation.
+ * jQuery(window).on('popstate', debounced.cancel)
+ *
+ * // Check for pending invocations.
+ * const status = debounced.pending() ? "Pending..." : "Ready"
+ */
+ function debounce(func, wait = 0, options = {}) {
+ let lastArgs, lastThis, maxWait, result, timerId, lastCallTime;
+ let lastInvokeTime = 0;
+ let leading = false;
+ let maxing = false;
+ let trailing = true;
+ // Bypass `requestAnimationFrame` by explicitly setting `wait=0`.
+ const useRAF = !wait && wait !== 0 && typeof root.requestAnimationFrame === "function";
+ if (typeof func !== "function") {
+ throw new TypeError("Expected a function");
+ }
+ wait = +wait || 0;
+ if (isObject(options)) {
+ leading = !!options.leading;
+ maxing = "maxWait" in options;
+ maxWait = maxing ? Math.max(+options.maxWait || 0, wait) : maxWait;
+ trailing = "trailing" in options ? !!options.trailing : trailing;
+ }
+ function invokeFunc(time) {
+ const args = lastArgs;
+ const thisArg = lastThis;
+ lastArgs = lastThis = undefined;
+ lastInvokeTime = time;
+ result = func.apply(thisArg, args);
+ return result;
+ }
+ function startTimer(pendingFunc, wait) {
+ if (useRAF) {
+ root.cancelAnimationFrame(timerId);
+ return root.requestAnimationFrame(pendingFunc);
+ }
+ return setTimeout(pendingFunc, wait);
+ }
+ function cancelTimer(id) {
+ if (useRAF) {
+ return root.cancelAnimationFrame(id);
+ }
+ clearTimeout(id);
+ }
+ function leadingEdge(time) {
+ // Reset any `maxWait` timer.
+ lastInvokeTime = time;
+ // Start the timer for the trailing edge.
+ timerId = startTimer(timerExpired, wait);
+ // Invoke the leading edge.
+ return leading ? invokeFunc(time) : result;
+ }
+ function remainingWait(time) {
+ const timeSinceLastCall = time - lastCallTime;
+ const timeSinceLastInvoke = time - lastInvokeTime;
+ const timeWaiting = wait - timeSinceLastCall;
+ return maxing
+ ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke)
+ : timeWaiting;
+ }
+ function shouldInvoke(time) {
+ const timeSinceLastCall = time - lastCallTime;
+ const timeSinceLastInvoke = time - lastInvokeTime;
+ // Either this is the first call, activity has stopped and we're at the
+ // trailing edge, the system time has gone backwards and we're treating
+ // it as the trailing edge, or we've hit the `maxWait` limit.
+ return (lastCallTime === undefined ||
+ timeSinceLastCall >= wait ||
+ timeSinceLastCall < 0 ||
+ (maxing && timeSinceLastInvoke >= maxWait));
+ }
+ function timerExpired() {
+ const time = Date.now();
+ if (shouldInvoke(time)) {
+ return trailingEdge(time);
+ }
+ // Restart the timer.
+ timerId = startTimer(timerExpired, remainingWait(time));
+ }
+ function trailingEdge(time) {
+ timerId = undefined;
+ // Only invoke if we have `lastArgs` which means `func` has been
+ // debounced at least once.
+ if (trailing && lastArgs) {
+ return invokeFunc(time);
+ }
+ lastArgs = lastThis = undefined;
+ return result;
+ }
+ function cancel() {
+ if (timerId !== undefined) {
+ cancelTimer(timerId);
+ }
+ lastInvokeTime = 0;
+ lastArgs = lastCallTime = lastThis = timerId = undefined;
+ }
+ function flush() {
+ return timerId === undefined ? result : trailingEdge(Date.now());
+ }
+ function pending() {
+ return timerId !== undefined;
+ }
+ function debounced(...args) {
+ const time = Date.now();
+ const isInvoking = shouldInvoke(time);
+ lastArgs = args;
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
+ lastThis = this;
+ lastCallTime = time;
+ if (isInvoking) {
+ if (timerId === undefined) {
+ return leadingEdge(lastCallTime);
+ }
+ if (maxing) {
+ // Handle invocations in a tight loop.
+ timerId = startTimer(timerExpired, wait);
+ return invokeFunc(lastCallTime);
+ }
+ }
+ if (timerId === undefined) {
+ timerId = startTimer(timerExpired, wait);
+ }
+ return result;
+ }
+ debounced.cancel = cancel;
+ debounced.flush = flush;
+ debounced.pending = pending;
+ return debounced;
+ }
+ /**
+ * Creates a throttled function that only invokes `func` at most once per
+ * every `wait` milliseconds (or once per browser frame). The throttled function
+ * comes with a `cancel` method to cancel delayed `func` invocations and a
+ * `flush` method to immediately invoke them. Provide `options` to indicate
+ * whether `func` should be invoked on the leading and/or trailing edge of the
+ * `wait` timeout. The `func` is invoked with the last arguments provided to the
+ * throttled function. Subsequent calls to the throttled function return the
+ * result of the last `func` invocation.
+ *
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is
+ * invoked on the trailing edge of the timeout only if the throttled function
+ * is invoked more than once during the `wait` timeout.
+ *
+ * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+ * until the next tick, similar to `setTimeout` with a timeout of `0`.
+ *
+ * If `wait` is omitted in an environment with `requestAnimationFrame`, `func`
+ * invocation will be deferred until the next frame is drawn (typically about
+ * 16ms).
+ *
+ * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+ * for details over the differences between `throttle` and `debounce`.
+ *
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to throttle.
+ * @param {number} [wait=0]
+ * The number of milliseconds to throttle invocations to; if omitted,
+ * `requestAnimationFrame` is used (if available).
+ * @param {Object} [options={}] The options object.
+ * @param {boolean} [options.leading=true]
+ * Specify invoking on the leading edge of the timeout.
+ * @param {boolean} [options.trailing=true]
+ * Specify invoking on the trailing edge of the timeout.
+ * @returns {Function} Returns the new throttled function.
+ * @example
+ *
+ * // Avoid excessively updating the position while scrolling.
+ * jQuery(window).on('scroll', throttle(updatePosition, 100))
+ *
+ * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
+ * const throttled = throttle(renewToken, 300000, { 'trailing': false })
+ * jQuery(element).on('click', throttled)
+ *
+ * // Cancel the trailing throttled invocation.
+ * jQuery(window).on('popstate', throttled.cancel)
+ */
+ function throttle(func, wait = 0, options = {}) {
+ let leading = true;
+ let trailing = true;
+ if (typeof func !== "function") {
+ throw new TypeError("Expected a function");
+ }
+ if (isObject(options)) {
+ leading = "leading" in options ? !!options.leading : leading;
+ trailing = "trailing" in options ? !!options.trailing : trailing;
+ }
+ return debounce(func, wait, {
+ leading,
+ trailing,
+ maxWait: wait,
+ });
+ }
- var util = /*#__PURE__*/Object.freeze({
- __proto__: null,
- Deferred: Deferred$1,
- MAX_INT: MAX_INT,
- MOUSE_BUTTONS: MOUSE_BUTTONS,
- adaptiveThrottle: adaptiveThrottle,
- assert: assert,
- documentReady: documentReady,
- documentReadyPromise: documentReadyPromise,
- each: each,
- elemFromHtml: elemFromHtml,
- elemFromSelector: elemFromSelector,
- error: error,
- escapeHtml: escapeHtml,
- escapeRegex: escapeRegex,
- escapeTooltip: escapeTooltip,
- eventTargetFromSelector: eventTargetFromSelector,
- eventToString: eventToString,
- extend: extend,
- extractHtmlText: extractHtmlText,
- getOption: getOption,
- getValueFromElem: getValueFromElem,
- isArray: isArray,
- isEmptyObject: isEmptyObject,
- isFunction: isFunction,
- isMac: isMac,
- isPlainObject: isPlainObject,
- noop: noop,
- onEvent: onEvent,
- overrideMethod: overrideMethod,
- setElemDisplay: setElemDisplay,
- setTimeoutPromise: setTimeoutPromise,
- setValueToElem: setValueToElem,
- sleep: sleep,
- toSet: toSet,
- toggleCheckbox: toggleCheckbox,
- type: type
- });
+ /*!
+ * Wunderbaum - util
+ * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */
+ /** @module util */
+ /** Readable names for `MouseEvent.button` */
+ const MOUSE_BUTTONS = {
+ 0: "",
+ 1: "left",
+ 2: "middle",
+ 3: "right",
+ 4: "back",
+ 5: "forward",
+ };
+ const MAX_INT = 9007199254740991;
+ const userInfo = _getUserInfo();
+ /**True if the client is using a macOS platform. */
+ const isMac = userInfo.isMac;
+ const REX_HTML = /[&<>"'/]/g; // Escape those characters
+ const REX_TOOLTIP = /[<>"'/]/g; // Don't escape `&` in tooltips
+ const ENTITY_MAP = {
+ "&": "&",
+ "<": "<",
+ ">": ">",
+ '"': """,
+ "'": "'",
+ "/": "/",
+ };
+ /** A generic error that can be thrown to indicate a validation error when
+ * handling the `apply` event for a node title or the `change` event for a
+ * grid cell.
+ */
+ class ValidationError extends Error {
+ constructor(message) {
+ super(message);
+ this.name = "ValidationError";
+ }
+ }
+ /**
+ * A ES6 Promise, that exposes the resolve()/reject() methods.
+ *
+ * TODO: See [Promise.withResolvers()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers#description)
+ * , a proposed standard, but not yet implemented in any browser.
+ */
+ let Deferred$1 = class Deferred {
+ constructor() {
+ this.thens = [];
+ this.catches = [];
+ this.status = "";
+ }
+ resolve(value) {
+ if (this.status) {
+ throw new Error("already settled");
+ }
+ this.status = "resolved";
+ this.resolvedValue = value;
+ this.thens.forEach((t) => t(value));
+ this.thens = []; // Avoid memleaks.
+ }
+ reject(error) {
+ if (this.status) {
+ throw new Error("already settled");
+ }
+ this.status = "rejected";
+ this.rejectedError = error;
+ this.catches.forEach((c) => c(error));
+ this.catches = []; // Avoid memleaks.
+ }
+ then(cb) {
+ if (status === "resolved") {
+ cb(this.resolvedValue);
+ }
+ else {
+ this.thens.unshift(cb);
+ }
+ }
+ catch(cb) {
+ if (this.status === "rejected") {
+ cb(this.rejectedError);
+ }
+ else {
+ this.catches.unshift(cb);
+ }
+ }
+ promise() {
+ return {
+ then: this.then,
+ catch: this.catch,
+ };
+ }
+ };
+ /**Throw an `Error` if `cond` is falsey. */
+ function assert(cond, msg) {
+ if (!cond) {
+ msg = msg || "Assertion failed.";
+ throw new Error(msg);
+ }
+ }
+ function _getUserInfo() {
+ const nav = navigator;
+ // const ua = nav.userAgentData;
+ const res = {
+ isMac: /Mac/.test(nav.platform),
+ };
+ return res;
+ }
+ /** Run `callback` when document was loaded. */
+ function documentReady(callback) {
+ if (document.readyState === "loading") {
+ document.addEventListener("DOMContentLoaded", callback);
+ }
+ else {
+ callback();
+ }
+ }
+ /** Resolve when document was loaded. */
+ function documentReadyPromise() {
+ return new Promise((resolve) => {
+ documentReady(resolve);
+ });
+ }
+ /**
+ * Iterate over Object properties or array elements.
+ *
+ * @param obj `Object`, `Array` or null
+ * @param callback(index, item) called for every item.
+ * `this` also contains the item.
+ * Return `false` to stop the iteration.
+ */
+ function each(obj, callback) {
+ if (obj == null) {
+ // accept `null` or `undefined`
+ return obj;
+ }
+ const length = obj.length;
+ let i = 0;
+ if (typeof length === "number") {
+ for (; i < length; i++) {
+ if (callback.call(obj[i], i, obj[i]) === false) {
+ break;
+ }
+ }
+ }
+ else {
+ for (const k in obj) {
+ if (callback.call(obj[i], k, obj[k]) === false) {
+ break;
+ }
+ }
+ }
+ return obj;
+ }
+ /** Shortcut for `throw new Error(msg)`.*/
+ function error(msg) {
+ throw new Error(msg);
+ }
+ /** Convert `<`, `>`, `&`, `"`, `'`, and `/` to the equivalent entities. */
+ function escapeHtml(s) {
+ return ("" + s).replace(REX_HTML, function (s) {
+ return ENTITY_MAP[s];
+ });
+ }
+ // export function escapeRegExp(s: string) {
+ // return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
+ // }
+ /**Convert a regular expression string by escaping special characters (e.g. `"$"` -> `"\$"`) */
+ function escapeRegex(s) {
+ return ("" + s).replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
+ }
+ /** Convert `<`, `>`, `"`, `'`, and `/` (but not `&`) to the equivalent entities. */
+ function escapeTooltip(s) {
+ return ("" + s).replace(REX_TOOLTIP, function (s) {
+ return ENTITY_MAP[s];
+ });
+ }
+ /** TODO */
+ function extractHtmlText(s) {
+ if (s.indexOf(">") >= 0) {
+ error("Not implemented");
+ // return $("
").html(s).text();
+ }
+ return s;
+ }
+ /**
+ * Read the value from an HTML input element.
+ *
+ * If a `` is passed, the first child input is used.
+ * Depending on the target element type, `value` is interpreted accordingly.
+ * For example for a checkbox, a value of true, false, or null is returned if
+ * the element is checked, unchecked, or indeterminate.
+ * For datetime input control a numerical value is assumed, etc.
+ *
+ * Common use case: store the new user input in a `change` event handler:
+ *
+ * ```ts
+ * change: (e) => {
+ * const tree = e.tree;
+ * const node = e.node;
+ * // Read the value from the input control that triggered the change event:
+ * let value = tree.getValueFromElem(e.element);
+ * // and store it to the node model (assuming the column id matches the property name)
+ * node.data[e.info.colId] = value;
+ * },
+ * ```
+ * @param elem ` ` or `` element. Also a parent `span.wb-col` is accepted.
+ * @param coerce pass true to convert date/time inputs to `Date`.
+ * @returns the value
+ */
+ function getValueFromElem(elem, coerce = false) {
+ const tag = elem.tagName;
+ let value = null;
+ if (tag === "SPAN" && elem.classList.contains("wb-col")) {
+ const span = elem;
+ const embeddedInput = span.querySelector("input,select");
+ if (embeddedInput) {
+ return getValueFromElem(embeddedInput, coerce);
+ }
+ span.innerText = "" + value;
+ }
+ else if (tag === "INPUT") {
+ const input = elem;
+ const type = input.type;
+ switch (type) {
+ case "button":
+ case "reset":
+ case "submit":
+ case "image":
+ break;
+ case "checkbox":
+ value = input.indeterminate ? null : input.checked;
+ break;
+ case "date":
+ case "datetime":
+ case "datetime-local":
+ case "month":
+ case "time":
+ case "week":
+ value = coerce ? input.valueAsDate : input.value;
+ break;
+ case "number":
+ case "range":
+ value = input.valueAsNumber;
+ break;
+ case "radio":
+ {
+ const name = input.name;
+ const checked = input.parentElement.querySelector(`input[name="${name}"]:checked`);
+ value = checked ? checked.value : undefined;
+ }
+ break;
+ case "text":
+ default:
+ value = input.value;
+ }
+ }
+ else if (tag === "SELECT") {
+ const select = elem;
+ value = select.value;
+ }
+ return value;
+ }
+ /**
+ * Set the value of an HTML input element.
+ *
+ * If a `` is passed, the first child input is used.
+ * Depending on the target element type, `value` is interpreted accordingly.
+ * For example a checkbox is set to checked, unchecked, or indeterminate if the
+ * value is truethy, falsy, or `null`.
+ * For datetime input control a numerical value is assumed, etc.
+ *
+ * Common use case: update embedded input controls in a `render` event handler:
+ *
+ * ```ts
+ * render: (e) => {
+ * // e.node.log(e.type, e, e.node.data);
+ *
+ * for (const col of Object.values(e.renderColInfosById)) {
+ * switch (col.id) {
+ * default:
+ * // Assumption: we named column.id === node.data.NAME
+ * util.setValueToElem(col.elem, e.node.data[col.id]);
+ * break;
+ * }
+ * }
+ * },
+ * ```
+ *
+ * @param elem ` ` or `` element Also a parent `span.wb-col` is accepted.
+ * @param value a value that matches the target element.
+ */
+ function setValueToElem(elem, value) {
+ const tag = elem.tagName;
+ if (tag === "SPAN" && elem.classList.contains("wb-col")) {
+ const span = elem;
+ const embeddedInput = span.querySelector("input,select");
+ if (embeddedInput) {
+ return setValueToElem(embeddedInput, value);
+ }
+ // No embedded input: simply write as escaped html
+ span.innerText = "" + value;
+ }
+ else if (tag === "INPUT") {
+ const input = elem;
+ const type = input.type;
+ switch (type) {
+ case "checkbox":
+ // An explicit `null` value is interpreted as 'indeterminate'.
+ // `undefined` is interpreted as 'unchecked'
+ input.indeterminate = value === null;
+ input.checked = !!value;
+ break;
+ case "date":
+ case "month":
+ case "time":
+ case "week":
+ case "datetime":
+ case "datetime-local":
+ input.valueAsDate = new Date(value);
+ break;
+ case "number":
+ case "range":
+ if (value == null) {
+ input.value = value;
+ }
+ else {
+ input.valueAsNumber = value;
+ }
+ break;
+ case "radio":
+ error(`Not yet implemented: ${type}`);
+ // const name = input.name;
+ // const checked = input.parentElement!.querySelector(
+ // `input[name="${name}"]:checked`
+ // );
+ // value = checked ? (checked).value : undefined;
+ break;
+ case "button":
+ case "reset":
+ case "submit":
+ case "image":
+ break;
+ case "text":
+ default:
+ input.value = value !== null && value !== void 0 ? value : "";
+ }
+ }
+ else if (tag === "SELECT") {
+ const select = elem;
+ if (value == null) {
+ select.selectedIndex = -1;
+ }
+ else {
+ select.value = value;
+ }
+ }
+ }
+ /** Show/hide element by setting the `display` style to 'none'. */
+ function setElemDisplay(elem, flag) {
+ const style = elemFromSelector(elem).style;
+ if (flag) {
+ if (style.display === "none") {
+ style.display = "";
+ }
+ }
+ else if (style.display === "") {
+ style.display = "none";
+ }
+ }
+ /** Create and return an unconnected `HTMLElement` from a HTML string. */
+ function elemFromHtml(html) {
+ const t = document.createElement("template");
+ t.innerHTML = html.trim();
+ return t.content.firstElementChild;
+ }
+ const _IGNORE_KEYS = new Set(["Alt", "Control", "Meta", "Shift"]);
+ /** Return a HtmlElement from selector or cast an existing element. */
+ function elemFromSelector(obj) {
+ if (!obj) {
+ return null; //(null as unknown) as HTMLElement;
+ }
+ if (typeof obj === "string") {
+ return document.querySelector(obj);
+ }
+ return obj;
+ }
+ // /** Return a EventTarget from selector or cast an existing element. */
+ // export function eventTargetFromSelector(
+ // obj: string | EventTarget
+ // ): EventTarget | null {
+ // if (!obj) {
+ // return null;
+ // }
+ // if (typeof obj === "string") {
+ // return document.querySelector(obj) as EventTarget;
+ // }
+ // return obj as EventTarget;
+ // }
+ /**
+ * Return a canonical descriptive string for a keyboard or mouse event.
+ *
+ * The result also contains a prefix for modifiers if any, for example
+ * `"x"`, `"F2"`, `"Control+Home"`, or `"Shift+clickright"`.
+ * This is especially useful in `switch` statements, to make sure that modifier
+ * keys are considered and handled correctly:
+ * ```ts
+ * const eventName = util.eventToString(e);
+ * switch (eventName) {
+ * case "+":
+ * case "Add":
+ * ...
+ * break;
+ * case "Enter":
+ * case "End":
+ * case "Control+End":
+ * case "Meta+ArrowDown":
+ * case "PageDown":
+ * ...
+ * break;
+ * }
+ * ```
+ */
+ function eventToString(event) {
+ const key = event.key;
+ const et = event.type;
+ const s = [];
+ if (event.altKey) {
+ s.push("Alt");
+ }
+ if (event.ctrlKey) {
+ s.push("Control");
+ }
+ if (event.metaKey) {
+ s.push("Meta");
+ }
+ if (event.shiftKey) {
+ s.push("Shift");
+ }
+ if (et === "click" || et === "dblclick") {
+ s.push(MOUSE_BUTTONS[event.button] + et);
+ }
+ else if (et === "wheel") {
+ s.push(et);
+ // } else if (!IGNORE_KEYCODES[key]) {
+ // s.push(
+ // SPECIAL_KEYCODES[key] ||
+ // String.fromCharCode(key).toLowerCase()
+ // );
+ }
+ else if (!_IGNORE_KEYS.has(key)) {
+ s.push(key);
+ }
+ return s.join("+");
+ }
+ /**
+ * Copy allproperties from one or more source objects to a target object.
+ *
+ * @returns the modified target object.
+ */
+ // TODO: use Object.assign()? --> https://stackoverflow.com/a/42740894
+ // TODO: support deep merge --> https://stackoverflow.com/a/42740894
+ function extend(...args) {
+ for (let i = 1; i < args.length; i++) {
+ const arg = args[i];
+ if (arg == null) {
+ continue;
+ }
+ for (const key in arg) {
+ if (Object.prototype.hasOwnProperty.call(arg, key)) {
+ args[0][key] = arg[key];
+ }
+ }
+ }
+ return args[0];
+ }
+ /** Return true if `obj` is of type `array`. */
+ function isArray(obj) {
+ return Array.isArray(obj);
+ }
+ /** Return true if `obj` is of type `Object` and has no propertied. */
+ function isEmptyObject(obj) {
+ return Object.keys(obj).length === 0 && obj.constructor === Object;
+ }
+ /** Return true if `obj` is of type `function`. */
+ function isFunction(obj) {
+ return typeof obj === "function";
+ }
+ /** Return true if `obj` is of type `Object`. */
+ function isPlainObject(obj) {
+ return Object.prototype.toString.call(obj) === "[object Object]";
+ }
+ /** A dummy function that does nothing ('no operation'). */
+ function noop(...args) { }
+ function onEvent(rootTarget, eventNames, selectorOrHandler, handlerOrNone) {
+ let selector, handler;
+ rootTarget = elemFromSelector(rootTarget);
+ // rootTarget = eventTargetFromSelector(rootTarget)!;
+ if (handlerOrNone) {
+ selector = selectorOrHandler;
+ handler = handlerOrNone;
+ }
+ else {
+ selector = "";
+ handler = selectorOrHandler;
+ }
+ eventNames.split(" ").forEach((evn) => {
+ rootTarget.addEventListener(evn, function (e) {
+ if (!selector) {
+ return handler(e); // no event delegation
+ }
+ else if (e.target) {
+ let elem = e.target;
+ if (elem.matches(selector)) {
+ return handler(e);
+ }
+ elem = elem.closest(selector);
+ if (elem) {
+ return handler(e);
+ }
+ }
+ });
+ });
+ }
+ /** Return a wrapped handler method, that provides `this._super` and `this._superApply`.
+ *
+ * ```ts
+ // Implement `opts.createNode` event to add the 'draggable' attribute
+ overrideMethod(ctx.options, "createNode", (event, data) => {
+ // Default processing if any
+ this._super.apply(this, event, data);
+ // Add 'draggable' attribute
+ data.node.span.draggable = true;
+ });
+ ```
+ */
+ function overrideMethod(instance, methodName, handler, ctx) {
+ let prevSuper, prevSuperApply;
+ const self = ctx || instance;
+ const prevFunc = instance[methodName];
+ const _super = (...args) => {
+ return prevFunc.apply(self, args);
+ };
+ const _superApply = (argsArray) => {
+ return prevFunc.apply(self, argsArray);
+ };
+ const wrapper = (...args) => {
+ try {
+ prevSuper = self._super;
+ prevSuperApply = self._superApply;
+ self._super = _super;
+ self._superApply = _superApply;
+ return handler.apply(self, args);
+ }
+ finally {
+ self._super = prevSuper;
+ self._superApply = prevSuperApply;
+ }
+ };
+ instance[methodName] = wrapper;
+ }
+ /** Run function after ms milliseconds and return a promise that resolves when done. */
+ function setTimeoutPromise(callback, ms) {
+ return new Promise((resolve, reject) => {
+ setTimeout(() => {
+ try {
+ resolve(callback.apply(this));
+ }
+ catch (err) {
+ reject(err);
+ }
+ }, ms);
+ });
+ }
+ /**
+ * Wait `ms` microseconds.
+ *
+ * Example:
+ * ```js
+ * await sleep(1000);
+ * ```
+ * @param ms duration
+ * @returns
+ */
+ async function sleep(ms) {
+ return new Promise((resolve) => setTimeout(resolve, ms));
+ }
+ /**
+ * Set or rotate checkbox status with support for tri-state.
+ *
+ * An initial 'indeterminate' state becomes 'checked' on the first call.
+ *
+ * If the input element has the class 'wb-tristate' assigned, the sequence is:
+ * 'indeterminate' -> 'checked' -> 'unchecked' -> 'indeterminate' -> ...
+ * Otherwise we toggle like
+ * 'checked' -> 'unchecked' -> 'checked' -> ...
+ */
+ function toggleCheckbox(element, value, tristate) {
+ const input = elemFromSelector(element);
+ assert(input.type === "checkbox", `Expected a checkbox: ${input.type}`);
+ tristate !== null && tristate !== void 0 ? tristate : (tristate = input.classList.contains("wb-tristate") || input.indeterminate);
+ if (value === undefined) {
+ const curValue = input.indeterminate ? null : input.checked;
+ switch (curValue) {
+ case true:
+ value = false;
+ break;
+ case false:
+ value = tristate ? null : true;
+ break;
+ case null:
+ value = true;
+ break;
+ }
+ }
+ input.indeterminate = value == null;
+ input.checked = !!value;
+ }
+ /**
+ * Return `opts.NAME` if opts is valid and
+ *
+ * @param opts dict, object, or null
+ * @param name option name (use dot notation to access extension option, e.g. `filter.mode`)
+ * @param defaultValue returned when `opts` is not an object, or does not have a NAME property
+ */
+ function getOption(opts, name, defaultValue = undefined) {
+ let ext;
+ // Lookup `name` in options dict
+ if (opts && name.indexOf(".") >= 0) {
+ [ext, name] = name.split(".");
+ opts = opts[ext];
+ }
+ const value = opts ? opts[name] : null;
+ // Use value from value options dict, fallback do default
+ return value !== null && value !== void 0 ? value : defaultValue;
+ }
+ /** Convert an Array or space-separated string to a Set. */
+ function toSet(val) {
+ if (val instanceof Set) {
+ return val;
+ }
+ if (typeof val === "string") {
+ const set = new Set();
+ for (const c of val.split(" ")) {
+ set.add(c.trim());
+ }
+ return set;
+ }
+ if (Array.isArray(val)) {
+ return new Set(val);
+ }
+ throw new Error("Cannot convert to Set: " + val);
+ }
+ // /** Check if a string is contained in an Array or Set. */
+ // export function isAnyOf(s: string, items: Array|Set): boolean {
+ // return Array.prototype.includes.call(items, s)
+ // }
+ // /** Check if an Array or Set has at least one matching entry. */
+ // export function hasAnyOf(container: Array|Set, items: Array): boolean {
+ // if (Array.isArray(container)) {
+ // return container.some(v => )
+ // }
+ // return container.some(v => {})
+ // // const container = toSet(items);
+ // // const itemSet = toSet(items);
+ // // Array.prototype.includes
+ // // throw new Error("Cannot convert to Set: " + val);
+ // }
+ /** Return a canonical string representation for an object's type (e.g. 'array', 'number', ...). */
+ function type(obj) {
+ return Object.prototype.toString
+ .call(obj)
+ .replace(/^\[object (.+)\]$/, "$1")
+ .toLowerCase();
+ }
+ /**
+ * Return a function that can be called instead of `callback`, but guarantees
+ * a limited execution rate.
+ * The execution rate is calculated based on the runtime duration of the
+ * previous call.
+ * Example:
+ * ```js
+ * throttledFoo = util.adaptiveThrottle(foo.bind(this), {});
+ * throttledFoo();
+ * throttledFoo();
+ * ```
+ */
+ function adaptiveThrottle(callback, options) {
+ const opts = Object.assign({
+ minDelay: 16,
+ defaultDelay: 200,
+ maxDelay: 5000,
+ delayFactor: 2.0,
+ }, options);
+ const minDelay = Math.max(16, +opts.minDelay);
+ const maxDelay = +opts.maxDelay;
+ let waiting = 0; // Initially, we're not waiting
+ let pendingArgs = null;
+ let pendingTimer = null;
+ const throttledFn = (...args) => {
+ if (waiting) {
+ pendingArgs = args;
+ // console.log(`adaptiveThrottle() queing request #${waiting}...`, args);
+ waiting += 1;
+ }
+ else {
+ // Prevent invocations while running or blocking
+ waiting = 1;
+ const useArgs = args; // pendingArgs || args;
+ pendingArgs = null;
+ // console.log(`adaptiveThrottle() execute...`, useArgs);
+ const start = Date.now();
+ try {
+ callback.apply(this, useArgs);
+ }
+ catch (error) {
+ console.error(error); // eslint-disable-line no-console
+ }
+ const elap = Date.now() - start;
+ const curDelay = Math.min(Math.max(minDelay, elap * opts.delayFactor), maxDelay);
+ const useDelay = Math.max(minDelay, curDelay - elap);
+ // console.log(
+ // `adaptiveThrottle() calling worker took ${elap}ms. delay = ${curDelay}ms, using ${useDelay}ms`,
+ // pendingArgs
+ // );
+ pendingTimer = setTimeout(() => {
+ // Unblock, and trigger pending requests if any
+ // const skipped = waiting - 1;
+ pendingTimer = null;
+ waiting = 0; // And allow future invocations
+ if (pendingArgs != null) {
+ // There was another request while running or waiting
+ // console.log(
+ // `adaptiveThrottle() re-trigger (missed ${skipped})...`,
+ // pendingArgs
+ // );
+ throttledFn.apply(this, pendingArgs);
+ }
+ }, useDelay);
+ }
+ };
+ throttledFn.cancel = () => {
+ if (pendingTimer) {
+ clearTimeout(pendingTimer);
+ pendingTimer = null;
+ }
+ pendingArgs = null;
+ waiting = 0;
+ };
+ throttledFn.pending = () => {
+ return !!pendingTimer;
+ };
+ throttledFn.flush = () => {
+ throw new Error("Not implemented");
+ };
+ return throttledFn;
+ }
- /*!
- * Wunderbaum - types
- * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */
- /**
- * Possible values for {@link WunderbaumNode.update()} and {@link Wunderbaum.update()}.
- */
- var ChangeType;
- (function (ChangeType) {
- /** Re-render the whole viewport, headers, and all rows. */
- ChangeType["any"] = "any";
- /** A node's title, icon, columns, or status have changed. Update the existing row markup. */
- ChangeType["data"] = "data";
- /** The `tree.columns` definition has changed beyond simple width adjustments. */
- ChangeType["colStructure"] = "colStructure";
- /** The viewport/window was resized. Adjust layout attributes for all elements. */
- ChangeType["resize"] = "resize";
- /** A node's definition has changed beyond status and data. Re-render the whole row's markup. */
- ChangeType["row"] = "row";
- /** Nodes have been added, removed, etc. Update markup. */
- ChangeType["structure"] = "structure";
- /** A node's status has changed. Update current row's classes, to reflect active, selected, ... */
- ChangeType["status"] = "status";
- /** Vertical scroll event. Update the 'top' property of all rows. */
- ChangeType["scroll"] = "scroll";
- })(ChangeType || (ChangeType = {}));
- /* Internal use. */
- var RenderFlag;
- (function (RenderFlag) {
- RenderFlag["clearMarkup"] = "clearMarkup";
- RenderFlag["header"] = "header";
- RenderFlag["redraw"] = "redraw";
- RenderFlag["scroll"] = "scroll";
- })(RenderFlag || (RenderFlag = {}));
- /** Possible values for {@link WunderbaumNode.setStatus()}. */
- var NodeStatusType;
- (function (NodeStatusType) {
- NodeStatusType["ok"] = "ok";
- NodeStatusType["loading"] = "loading";
- NodeStatusType["error"] = "error";
- NodeStatusType["noData"] = "noData";
- NodeStatusType["paging"] = "paging";
- })(NodeStatusType || (NodeStatusType = {}));
- /** Define the subregion of a node, where an event occurred. */
- var NodeRegion;
- (function (NodeRegion) {
- NodeRegion["unknown"] = "";
- NodeRegion["checkbox"] = "checkbox";
- NodeRegion["column"] = "column";
- NodeRegion["expander"] = "expander";
- NodeRegion["icon"] = "icon";
- NodeRegion["prefix"] = "prefix";
- NodeRegion["title"] = "title";
- })(NodeRegion || (NodeRegion = {}));
- /** Initial navigation mode and possible transition. */
- var NavModeEnum;
- (function (NavModeEnum) {
- NavModeEnum["startRow"] = "startRow";
- NavModeEnum["cell"] = "cell";
- NavModeEnum["startCell"] = "startCell";
- NavModeEnum["row"] = "row";
- })(NavModeEnum || (NavModeEnum = {}));
+ var util = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ Deferred: Deferred$1,
+ MAX_INT: MAX_INT,
+ MOUSE_BUTTONS: MOUSE_BUTTONS,
+ ValidationError: ValidationError,
+ adaptiveThrottle: adaptiveThrottle,
+ assert: assert,
+ debounce: debounce,
+ documentReady: documentReady,
+ documentReadyPromise: documentReadyPromise,
+ each: each,
+ elemFromHtml: elemFromHtml,
+ elemFromSelector: elemFromSelector,
+ error: error,
+ escapeHtml: escapeHtml,
+ escapeRegex: escapeRegex,
+ escapeTooltip: escapeTooltip,
+ eventToString: eventToString,
+ extend: extend,
+ extractHtmlText: extractHtmlText,
+ getOption: getOption,
+ getValueFromElem: getValueFromElem,
+ isArray: isArray,
+ isEmptyObject: isEmptyObject,
+ isFunction: isFunction,
+ isMac: isMac,
+ isPlainObject: isPlainObject,
+ noop: noop,
+ onEvent: onEvent,
+ overrideMethod: overrideMethod,
+ setElemDisplay: setElemDisplay,
+ setTimeoutPromise: setTimeoutPromise,
+ setValueToElem: setValueToElem,
+ sleep: sleep,
+ throttle: throttle,
+ toSet: toSet,
+ toggleCheckbox: toggleCheckbox,
+ type: type
+ });
- /*!
- * Wunderbaum - wb_extension_base
- * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */
- class WunderbaumExtension {
- constructor(tree, id, defaults) {
- this.enabled = true;
- this.tree = tree;
- this.id = id;
- this.treeOpts = tree.options;
- const opts = tree.options;
- if (this.treeOpts[id] === undefined) {
- opts[id] = this.extensionOpts = extend({}, defaults);
- }
- else {
- // TODO: do we break existing object instance references here?
- this.extensionOpts = extend({}, defaults, opts[id]);
- opts[id] = this.extensionOpts;
- }
- this.enabled = this.getPluginOption("enabled", true);
- }
- /** Called on tree (re)init after all extensions are added, but before loading.*/
- init() {
- this.tree.element.classList.add("wb-ext-" + this.id);
- }
- // protected callEvent(type: string, extra?: any): any {
- // let func = this.extensionOpts[type];
- // if (func) {
- // return func.call(
- // this.tree,
- // util.extend(
- // {
- // event: this.id + "." + type,
- // },
- // extra
- // )
- // );
- // }
- // }
- getPluginOption(name, defaultValue) {
- var _a;
- return (_a = this.extensionOpts[name]) !== null && _a !== void 0 ? _a : defaultValue;
- }
- setPluginOption(name, value) {
- this.extensionOpts[name] = value;
- }
- setEnabled(flag = true) {
- return this.setPluginOption("enabled", !!flag);
- // this.enabled = !!flag;
- }
- onKeyEvent(data) {
- return;
- }
- onRender(data) {
- return;
- }
- }
+ /*!
+ * Wunderbaum - types
+ * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */
+ /**
+ * Possible values for {@link WunderbaumNode.update()} and {@link Wunderbaum.update()}.
+ */
+ var ChangeType;
+ (function (ChangeType) {
+ /** Re-render the whole viewport, headers, and all rows. */
+ ChangeType["any"] = "any";
+ /** A node's title, icon, columns, or status have changed. Update the existing row markup. */
+ ChangeType["data"] = "data";
+ /** The `tree.columns` definition has changed beyond simple width adjustments. */
+ ChangeType["colStructure"] = "colStructure";
+ /** The viewport/window was resized. Adjust layout attributes for all elements. */
+ ChangeType["resize"] = "resize";
+ /** A node's definition has changed beyond status and data. Re-render the whole row's markup. */
+ ChangeType["row"] = "row";
+ /** Nodes have been added, removed, etc. Update markup. */
+ ChangeType["structure"] = "structure";
+ /** A node's status has changed. Update current row's classes, to reflect active, selected, ... */
+ ChangeType["status"] = "status";
+ /** Vertical scroll event. Update the 'top' property of all rows. */
+ ChangeType["scroll"] = "scroll";
+ })(ChangeType || (ChangeType = {}));
+ /* Internal use. */
+ var RenderFlag;
+ (function (RenderFlag) {
+ RenderFlag["clearMarkup"] = "clearMarkup";
+ RenderFlag["header"] = "header";
+ RenderFlag["redraw"] = "redraw";
+ RenderFlag["scroll"] = "scroll";
+ })(RenderFlag || (RenderFlag = {}));
+ /** Possible values for {@link WunderbaumNode.setStatus()}. */
+ var NodeStatusType;
+ (function (NodeStatusType) {
+ NodeStatusType["ok"] = "ok";
+ NodeStatusType["loading"] = "loading";
+ NodeStatusType["error"] = "error";
+ NodeStatusType["noData"] = "noData";
+ NodeStatusType["paging"] = "paging";
+ })(NodeStatusType || (NodeStatusType = {}));
+ /** Define the subregion of a node, where an event occurred. */
+ var NodeRegion;
+ (function (NodeRegion) {
+ NodeRegion["unknown"] = "";
+ NodeRegion["checkbox"] = "checkbox";
+ NodeRegion["column"] = "column";
+ NodeRegion["expander"] = "expander";
+ NodeRegion["icon"] = "icon";
+ NodeRegion["prefix"] = "prefix";
+ NodeRegion["title"] = "title";
+ })(NodeRegion || (NodeRegion = {}));
+ /** Initial navigation mode and possible transition. */
+ var NavModeEnum;
+ (function (NavModeEnum) {
+ NavModeEnum["startRow"] = "startRow";
+ NavModeEnum["cell"] = "cell";
+ NavModeEnum["startCell"] = "startCell";
+ NavModeEnum["row"] = "row";
+ })(NavModeEnum || (NavModeEnum = {}));
- /*!
- * debounce & throttle, taken from https://github.com/lodash/lodash v4.17.21
- * MIT License: https://raw.githubusercontent.com/lodash/lodash/4.17.21-npm/LICENSE
- * Modified for TypeScript type annotations.
- */
- /* --- */
- /** Detect free variable `global` from Node.js. */
- const freeGlobal = typeof global === "object" &&
- global !== null &&
- global.Object === Object &&
- global;
- /** Detect free variable `globalThis` */
- const freeGlobalThis = typeof globalThis === "object" &&
- globalThis !== null &&
- globalThis.Object == Object &&
- globalThis;
- /** Detect free variable `self`. */
- const freeSelf = typeof self === "object" && self !== null && self.Object === Object && self;
- /** Used as a reference to the global object. */
- const root = freeGlobalThis || freeGlobal || freeSelf || Function("return this")();
- /**
- * Checks if `value` is the
- * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
- * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * isObject({})
- * // => true
- *
- * isObject([1, 2, 3])
- * // => true
- *
- * isObject(Function)
- * // => true
- *
- * isObject(null)
- * // => false
- */
- function isObject(value) {
- const type = typeof value;
- return value != null && (type === "object" || type === "function");
- }
- /**
- * Creates a debounced function that delays invoking `func` until after `wait`
- * milliseconds have elapsed since the last time the debounced function was
- * invoked, or until the next browser frame is drawn. The debounced function
- * comes with a `cancel` method to cancel delayed `func` invocations and a
- * `flush` method to immediately invoke them. Provide `options` to indicate
- * whether `func` should be invoked on the leading and/or trailing edge of the
- * `wait` timeout. The `func` is invoked with the last arguments provided to the
- * debounced function. Subsequent calls to the debounced function return the
- * result of the last `func` invocation.
- *
- * **Note:** If `leading` and `trailing` options are `true`, `func` is
- * invoked on the trailing edge of the timeout only if the debounced function
- * is invoked more than once during the `wait` timeout.
- *
- * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
- * until the next tick, similar to `setTimeout` with a timeout of `0`.
- *
- * If `wait` is omitted in an environment with `requestAnimationFrame`, `func`
- * invocation will be deferred until the next frame is drawn (typically about
- * 16ms).
- *
- * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
- * for details over the differences between `debounce` and `throttle`.
- *
- * @since 0.1.0
- * @category Function
- * @param {Function} func The function to debounce.
- * @param {number} [wait=0]
- * The number of milliseconds to delay; if omitted, `requestAnimationFrame` is
- * used (if available).
- * @param {Object} [options={}] The options object.
- * @param {boolean} [options.leading=false]
- * Specify invoking on the leading edge of the timeout.
- * @param {number} [options.maxWait]
- * The maximum time `func` is allowed to be delayed before it's invoked.
- * @param {boolean} [options.trailing=true]
- * Specify invoking on the trailing edge of the timeout.
- * @returns {Function} Returns the new debounced function.
- * @example
- *
- * // Avoid costly calculations while the window size is in flux.
- * jQuery(window).on('resize', debounce(calculateLayout, 150))
- *
- * // Invoke `sendMail` when clicked, debouncing subsequent calls.
- * jQuery(element).on('click', debounce(sendMail, 300, {
- * 'leading': true,
- * 'trailing': false
- * }))
- *
- * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
- * const debounced = debounce(batchLog, 250, { 'maxWait': 1000 })
- * const source = new EventSource('/stream')
- * jQuery(source).on('message', debounced)
- *
- * // Cancel the trailing debounced invocation.
- * jQuery(window).on('popstate', debounced.cancel)
- *
- * // Check for pending invocations.
- * const status = debounced.pending() ? "Pending..." : "Ready"
- */
- function debounce(func, wait = 0, options = {}) {
- let lastArgs, lastThis, maxWait, result, timerId, lastCallTime;
- let lastInvokeTime = 0;
- let leading = false;
- let maxing = false;
- let trailing = true;
- // Bypass `requestAnimationFrame` by explicitly setting `wait=0`.
- const useRAF = !wait && wait !== 0 && typeof root.requestAnimationFrame === "function";
- if (typeof func !== "function") {
- throw new TypeError("Expected a function");
- }
- wait = +wait || 0;
- if (isObject(options)) {
- leading = !!options.leading;
- maxing = "maxWait" in options;
- maxWait = maxing ? Math.max(+options.maxWait || 0, wait) : maxWait;
- trailing = "trailing" in options ? !!options.trailing : trailing;
- }
- function invokeFunc(time) {
- const args = lastArgs;
- const thisArg = lastThis;
- lastArgs = lastThis = undefined;
- lastInvokeTime = time;
- result = func.apply(thisArg, args);
- return result;
- }
- function startTimer(pendingFunc, wait) {
- if (useRAF) {
- root.cancelAnimationFrame(timerId);
- return root.requestAnimationFrame(pendingFunc);
- }
- return setTimeout(pendingFunc, wait);
- }
- function cancelTimer(id) {
- if (useRAF) {
- return root.cancelAnimationFrame(id);
- }
- clearTimeout(id);
- }
- function leadingEdge(time) {
- // Reset any `maxWait` timer.
- lastInvokeTime = time;
- // Start the timer for the trailing edge.
- timerId = startTimer(timerExpired, wait);
- // Invoke the leading edge.
- return leading ? invokeFunc(time) : result;
- }
- function remainingWait(time) {
- const timeSinceLastCall = time - lastCallTime;
- const timeSinceLastInvoke = time - lastInvokeTime;
- const timeWaiting = wait - timeSinceLastCall;
- return maxing
- ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke)
- : timeWaiting;
- }
- function shouldInvoke(time) {
- const timeSinceLastCall = time - lastCallTime;
- const timeSinceLastInvoke = time - lastInvokeTime;
- // Either this is the first call, activity has stopped and we're at the
- // trailing edge, the system time has gone backwards and we're treating
- // it as the trailing edge, or we've hit the `maxWait` limit.
- return (lastCallTime === undefined ||
- timeSinceLastCall >= wait ||
- timeSinceLastCall < 0 ||
- (maxing && timeSinceLastInvoke >= maxWait));
- }
- function timerExpired() {
- const time = Date.now();
- if (shouldInvoke(time)) {
- return trailingEdge(time);
- }
- // Restart the timer.
- timerId = startTimer(timerExpired, remainingWait(time));
- }
- function trailingEdge(time) {
- timerId = undefined;
- // Only invoke if we have `lastArgs` which means `func` has been
- // debounced at least once.
- if (trailing && lastArgs) {
- return invokeFunc(time);
- }
- lastArgs = lastThis = undefined;
- return result;
- }
- function cancel() {
- if (timerId !== undefined) {
- cancelTimer(timerId);
- }
- lastInvokeTime = 0;
- lastArgs = lastCallTime = lastThis = timerId = undefined;
- }
- function flush() {
- return timerId === undefined ? result : trailingEdge(Date.now());
- }
- function pending() {
- return timerId !== undefined;
- }
- function debounced(...args) {
- const time = Date.now();
- const isInvoking = shouldInvoke(time);
- lastArgs = args;
- // eslint-disable-next-line @typescript-eslint/no-this-alias
- lastThis = this;
- lastCallTime = time;
- if (isInvoking) {
- if (timerId === undefined) {
- return leadingEdge(lastCallTime);
- }
- if (maxing) {
- // Handle invocations in a tight loop.
- timerId = startTimer(timerExpired, wait);
- return invokeFunc(lastCallTime);
- }
- }
- if (timerId === undefined) {
- timerId = startTimer(timerExpired, wait);
- }
- return result;
- }
- debounced.cancel = cancel;
- debounced.flush = flush;
- debounced.pending = pending;
- return debounced;
- }
- /**
- * Creates a throttled function that only invokes `func` at most once per
- * every `wait` milliseconds (or once per browser frame). The throttled function
- * comes with a `cancel` method to cancel delayed `func` invocations and a
- * `flush` method to immediately invoke them. Provide `options` to indicate
- * whether `func` should be invoked on the leading and/or trailing edge of the
- * `wait` timeout. The `func` is invoked with the last arguments provided to the
- * throttled function. Subsequent calls to the throttled function return the
- * result of the last `func` invocation.
- *
- * **Note:** If `leading` and `trailing` options are `true`, `func` is
- * invoked on the trailing edge of the timeout only if the throttled function
- * is invoked more than once during the `wait` timeout.
- *
- * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
- * until the next tick, similar to `setTimeout` with a timeout of `0`.
- *
- * If `wait` is omitted in an environment with `requestAnimationFrame`, `func`
- * invocation will be deferred until the next frame is drawn (typically about
- * 16ms).
- *
- * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
- * for details over the differences between `throttle` and `debounce`.
- *
- * @since 0.1.0
- * @category Function
- * @param {Function} func The function to throttle.
- * @param {number} [wait=0]
- * The number of milliseconds to throttle invocations to; if omitted,
- * `requestAnimationFrame` is used (if available).
- * @param {Object} [options={}] The options object.
- * @param {boolean} [options.leading=true]
- * Specify invoking on the leading edge of the timeout.
- * @param {boolean} [options.trailing=true]
- * Specify invoking on the trailing edge of the timeout.
- * @returns {Function} Returns the new throttled function.
- * @example
- *
- * // Avoid excessively updating the position while scrolling.
- * jQuery(window).on('scroll', throttle(updatePosition, 100))
- *
- * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
- * const throttled = throttle(renewToken, 300000, { 'trailing': false })
- * jQuery(element).on('click', throttled)
- *
- * // Cancel the trailing throttled invocation.
- * jQuery(window).on('popstate', throttled.cancel)
- */
- function throttle(func, wait = 0, options = {}) {
- let leading = true;
- let trailing = true;
- if (typeof func !== "function") {
- throw new TypeError("Expected a function");
- }
- if (isObject(options)) {
- leading = "leading" in options ? !!options.leading : leading;
- trailing = "trailing" in options ? !!options.trailing : trailing;
- }
- return debounce(func, wait, {
- leading,
- trailing,
- maxWait: wait,
- });
- }
+ /*!
+ * Wunderbaum - wb_extension_base
+ * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */
+ class WunderbaumExtension {
+ constructor(tree, id, defaults) {
+ this.enabled = true;
+ this.tree = tree;
+ this.id = id;
+ this.treeOpts = tree.options;
+ const opts = tree.options;
+ if (this.treeOpts[id] === undefined) {
+ opts[id] = this.extensionOpts = extend({}, defaults);
+ }
+ else {
+ // TODO: do we break existing object instance references here?
+ this.extensionOpts = extend({}, defaults, opts[id]);
+ opts[id] = this.extensionOpts;
+ }
+ this.enabled = this.getPluginOption("enabled", true);
+ }
+ /** Called on tree (re)init after all extensions are added, but before loading.*/
+ init() {
+ this.tree.element.classList.add("wb-ext-" + this.id);
+ }
+ // protected callEvent(type: string, extra?: any): any {
+ // let func = this.extensionOpts[type];
+ // if (func) {
+ // return func.call(
+ // this.tree,
+ // util.extend(
+ // {
+ // event: this.id + "." + type,
+ // },
+ // extra
+ // )
+ // );
+ // }
+ // }
+ getPluginOption(name, defaultValue) {
+ var _a;
+ return (_a = this.extensionOpts[name]) !== null && _a !== void 0 ? _a : defaultValue;
+ }
+ setPluginOption(name, value) {
+ this.extensionOpts[name] = value;
+ }
+ setEnabled(flag = true) {
+ return this.setPluginOption("enabled", !!flag);
+ // this.enabled = !!flag;
+ }
+ onKeyEvent(data) {
+ return;
+ }
+ onRender(data) {
+ return;
+ }
+ }
- /*!
- * Wunderbaum - ext-filter
- * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */
- const START_MARKER = "\uFFF7";
- const END_MARKER = "\uFFF8";
- const RE_START_MARKER = new RegExp(escapeRegex(START_MARKER), "g");
- const RE_END_MARTKER = new RegExp(escapeRegex(END_MARKER), "g");
- class FilterExtension extends WunderbaumExtension {
- constructor(tree) {
- super(tree, "filter", {
- connectInput: null,
- autoApply: true,
- autoExpand: false,
- counter: true,
- fuzzy: false,
- hideExpandedCounter: true,
- hideExpanders: false,
- highlight: true,
- leavesOnly: false,
- mode: "dim",
- noData: true, // Display a 'no data' status node if result is empty
- });
- this.lastFilterArgs = null;
- }
- init() {
- super.init();
- const connectInput = this.getPluginOption("connectInput");
- if (connectInput) {
- this.queryInput = elemFromSelector(connectInput);
- onEvent(this.queryInput, "input", debounce((e) => {
- // this.tree.log("query", e);
- this.filterNodes(this.queryInput.value.trim(), {});
- }, 700));
- }
- }
- setPluginOption(name, value) {
- // alert("filter opt=" + name + ", " + value)
- super.setPluginOption(name, value);
- switch (name) {
- case "mode":
- this.tree.filterMode = value === "hide" ? "hide" : "dim";
- this.tree.updateFilter();
- break;
- }
- }
- _applyFilterNoUpdate(filter, branchMode, _opts) {
- return this.tree.runWithDeferredUpdate(() => {
- return this._applyFilterImpl(filter, branchMode, _opts);
- });
- }
- _applyFilterImpl(filter, branchMode, _opts) {
- let match, temp, count = 0;
- const start = Date.now();
- const tree = this.tree;
- const treeOpts = tree.options;
- // escapeTitles = treeOpts.escapeTitles,
- const prevAutoCollapse = treeOpts.autoCollapse;
- const opts = extend({}, treeOpts.filter, _opts);
- const hideMode = opts.mode === "hide";
- const leavesOnly = !!opts.leavesOnly && !branchMode;
- // Default to 'match title substring (case insensitive)'
- if (typeof filter === "string") {
- if (filter === "") {
- tree.logInfo("Passing an empty string as a filter is handled as clearFilter().");
- this.clearFilter();
- return;
- }
- if (opts.fuzzy) {
- // See https://codereview.stackexchange.com/questions/23899/faster-javascript-fuzzy-string-matching-function/23905#23905
- // and http://www.quora.com/How-is-the-fuzzy-search-algorithm-in-Sublime-Text-designed
- // and http://www.dustindiaz.com/autocomplete-fuzzy-matching
- match = filter
- .split("")
- // Escaping the `filter` will not work because,
- // it gets further split into individual characters. So,
- // escape each character after splitting
- .map(escapeRegex)
- .reduce(function (a, b) {
- // create capture groups for parts that comes before
- // the character
- return a + "([^" + b + "]*)" + b;
- }, "");
- }
- else {
- match = escapeRegex(filter); // make sure a '.' is treated literally
- }
- const re = new RegExp(match, "i");
- const reHighlight = new RegExp(escapeRegex(filter), "gi");
- filter = (node) => {
- if (!node.title) {
- return false;
- }
- // let text = escapeTitles ? node.title : extractHtmlText(node.title);
- const text = node.title;
- // `.match` instead of `.test` to get the capture groups
- const res = text.match(re);
- if (res && opts.highlight) {
- // if (escapeTitles) {
- if (opts.fuzzy) {
- temp = _markFuzzyMatchedChars(text, res, true);
- }
- else {
- // #740: we must not apply the marks to escaped entity names, e.g. `"`
- // Use some exotic characters to mark matches:
- temp = text.replace(reHighlight, function (s) {
- return START_MARKER + s + END_MARKER;
- });
- }
- // now we can escape the title...
- node.titleWithHighlight = escapeHtml(temp)
- // ... and finally insert the desired `` tags
- .replace(RE_START_MARKER, "")
- .replace(RE_END_MARTKER, " ");
- // } else {
- // if (opts.fuzzy) {
- // node.titleWithHighlight = _markFuzzyMatchedChars(text, res);
- // } else {
- // node.titleWithHighlight = text.replace(reHighlight, function (s) {
- // return "" + s + " ";
- // });
- // }
- // }
- // node.debug("filter", escapeTitles, text, node.titleWithHighlight);
- }
- return !!res;
- };
- }
- tree.filterMode = opts.mode;
- // eslint-disable-next-line prefer-rest-params, prefer-spread
- this.lastFilterArgs = arguments;
- tree.element.classList.toggle("wb-ext-filter-hide", !!hideMode);
- tree.element.classList.toggle("wb-ext-filter-dim", !hideMode);
- tree.element.classList.toggle("wb-ext-filter-hide-expanders", !!opts.hideExpanders);
- // Reset current filter
- tree.root.subMatchCount = 0;
- tree.visit((node) => {
- delete node.match;
- delete node.titleWithHighlight;
- node.subMatchCount = 0;
- });
- // statusNode = tree.root.findDirectChild(KEY_NODATA);
- // if (statusNode) {
- // statusNode.remove();
- // }
- tree.setStatus(NodeStatusType.ok);
- // Adjust node.hide, .match, and .subMatchCount properties
- treeOpts.autoCollapse = false; // #528
- tree.visit((node) => {
- if (leavesOnly && node.children != null) {
- return;
- }
- let res = filter(node);
- if (res === "skip") {
- node.visit(function (c) {
- c.match = false;
- }, true);
- return "skip";
- }
- let matchedByBranch = false;
- if ((branchMode || res === "branch") && node.parent.match) {
- res = true;
- matchedByBranch = true;
- }
- if (res) {
- count++;
- node.match = true;
- node.visitParents((p) => {
- if (p !== node) {
- p.subMatchCount += 1;
- }
- // Expand match (unless this is no real match, but only a node in a matched branch)
- if (opts.autoExpand && !matchedByBranch && !p.expanded) {
- p.setExpanded(true, {
- noAnimation: true,
- noEvents: true,
- });
- p._filterAutoExpanded = true;
- }
- }, true);
- }
- });
- treeOpts.autoCollapse = prevAutoCollapse;
- if (count === 0 && opts.noData && hideMode) {
- tree.root.setStatus(NodeStatusType.noData);
- }
- // Redraw whole tree
- tree.logInfo(`Filter '${match}' found ${count} nodes in ${Date.now() - start} ms.`);
- return count;
- }
- /**
- * [ext-filter] Dim or hide nodes.
- */
- filterNodes(filter, options) {
- return this._applyFilterNoUpdate(filter, false, options);
- }
- /**
- * [ext-filter] Dim or hide whole branches.
- */
- filterBranches(filter, options) {
- return this._applyFilterNoUpdate(filter, true, options);
- }
- /**
- * [ext-filter] Re-apply current filter.
- */
- updateFilter() {
- var _a;
- const tree = this.tree;
- if (tree.filterMode &&
- this.lastFilterArgs &&
- ((_a = tree.options.filter) === null || _a === void 0 ? void 0 : _a.autoApply)) {
- // eslint-disable-next-line prefer-spread
- this._applyFilterNoUpdate.apply(this, this.lastFilterArgs);
- }
- else {
- tree.logWarn("updateFilter(): no filter active.");
- }
- }
- /**
- * [ext-filter] Reset the filter.
- */
- clearFilter() {
- const tree = this.tree;
- // statusNode = tree.root.findDirectChild(KEY_NODATA),
- // escapeTitles = tree.options.escapeTitles;
- tree.enableUpdate(false);
- // if (statusNode) {
- // statusNode.remove();
- // }
- tree.setStatus(NodeStatusType.ok);
- // we also counted root node's subMatchCount
- delete tree.root.match;
- delete tree.root.subMatchCount;
- tree.visit((node) => {
- // if (node.match && node._rowElem) {
- // let titleElem = node._rowElem.querySelector("span.wb-title")!;
- // node._callEvent("enhanceTitle", { titleElem: titleElem });
- // }
- delete node.match;
- delete node.subMatchCount;
- delete node.titleWithHighlight;
- // if (node.subMatchBadge) {
- // node.subMatchBadge.remove();
- // delete node.subMatchBadge;
- // }
- if (node._filterAutoExpanded && node.expanded) {
- node.setExpanded(false, {
- noAnimation: true,
- noEvents: true,
- });
- }
- delete node._filterAutoExpanded;
- });
- tree.filterMode = null;
- this.lastFilterArgs = null;
- tree.element.classList.remove(
- // "wb-ext-filter",
- "wb-ext-filter-dim", "wb-ext-filter-hide");
- // tree._callHook("treeStructureChanged", this, "clearFilter");
- tree.enableUpdate(true);
- }
- }
- /**
- * @description Marks the matching charecters of `text` either by `mark` or
- * by exotic*Chars (if `escapeTitles` is `true`) based on `matches`
- * which is an array of matching groups.
- * @param {string} text
- * @param {RegExpMatchArray} matches
- */
- function _markFuzzyMatchedChars(text, matches, escapeTitles = true) {
- const matchingIndices = [];
- // get the indices of matched characters (Iterate through `RegExpMatchArray`)
- for (let _matchingArrIdx = 1; _matchingArrIdx < matches.length; _matchingArrIdx++) {
- const _mIdx =
- // get matching char index by cumulatively adding
- // the matched group length
- matches[_matchingArrIdx].length +
- (_matchingArrIdx === 1 ? 0 : 1) +
- (matchingIndices[matchingIndices.length - 1] || 0);
- matchingIndices.push(_mIdx);
- }
- // Map each `text` char to its position and store in `textPoses`.
- const textPoses = text.split("");
- if (escapeTitles) {
- // If escaping the title, then wrap the matching char within exotic chars
- matchingIndices.forEach(function (v) {
- textPoses[v] = START_MARKER + textPoses[v] + END_MARKER;
- });
- }
- else {
- // Otherwise, Wrap the matching chars within `mark`.
- matchingIndices.forEach(function (v) {
- textPoses[v] = "" + textPoses[v] + " ";
- });
- }
- // Join back the modified `textPoses` to create final highlight markup.
- return textPoses.join("");
- }
+ /*!
+ * Wunderbaum - ext-filter
+ * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */
+ const START_MARKER = "\uFFF7";
+ const END_MARKER = "\uFFF8";
+ const RE_START_MARKER = new RegExp(escapeRegex(START_MARKER), "g");
+ const RE_END_MARTKER = new RegExp(escapeRegex(END_MARKER), "g");
+ class FilterExtension extends WunderbaumExtension {
+ constructor(tree) {
+ super(tree, "filter", {
+ connectInput: null,
+ autoApply: true,
+ autoExpand: false,
+ counter: true,
+ fuzzy: false,
+ hideExpandedCounter: true,
+ hideExpanders: false,
+ highlight: true,
+ leavesOnly: false,
+ mode: "dim",
+ noData: true, // Display a 'no data' status node if result is empty
+ });
+ this.lastFilterArgs = null;
+ }
+ init() {
+ super.init();
+ const connectInput = this.getPluginOption("connectInput");
+ if (connectInput) {
+ this.queryInput = elemFromSelector(connectInput);
+ onEvent(this.queryInput, "input", debounce((e) => {
+ // this.tree.log("query", e);
+ this.filterNodes(this.queryInput.value.trim(), {});
+ }, 700));
+ }
+ }
+ setPluginOption(name, value) {
+ // alert("filter opt=" + name + ", " + value)
+ super.setPluginOption(name, value);
+ switch (name) {
+ case "mode":
+ this.tree.filterMode = value === "hide" ? "hide" : "dim";
+ this.tree.updateFilter();
+ break;
+ }
+ }
+ _applyFilterNoUpdate(filter, branchMode, _opts) {
+ return this.tree.runWithDeferredUpdate(() => {
+ return this._applyFilterImpl(filter, branchMode, _opts);
+ });
+ }
+ _applyFilterImpl(filter, branchMode, _opts) {
+ let match, temp, count = 0;
+ const start = Date.now();
+ const tree = this.tree;
+ const treeOpts = tree.options;
+ // escapeTitles = treeOpts.escapeTitles,
+ const prevAutoCollapse = treeOpts.autoCollapse;
+ const opts = extend({}, treeOpts.filter, _opts);
+ const hideMode = opts.mode === "hide";
+ const leavesOnly = !!opts.leavesOnly && !branchMode;
+ // Default to 'match title substring (case insensitive)'
+ if (typeof filter === "string") {
+ if (filter === "") {
+ tree.logInfo("Passing an empty string as a filter is handled as clearFilter().");
+ this.clearFilter();
+ return;
+ }
+ if (opts.fuzzy) {
+ // See https://codereview.stackexchange.com/questions/23899/faster-javascript-fuzzy-string-matching-function/23905#23905
+ // and http://www.quora.com/How-is-the-fuzzy-search-algorithm-in-Sublime-Text-designed
+ // and http://www.dustindiaz.com/autocomplete-fuzzy-matching
+ match = filter
+ .split("")
+ // Escaping the `filter` will not work because,
+ // it gets further split into individual characters. So,
+ // escape each character after splitting
+ .map(escapeRegex)
+ .reduce(function (a, b) {
+ // create capture groups for parts that comes before
+ // the character
+ return a + "([^" + b + "]*)" + b;
+ }, "");
+ }
+ else {
+ match = escapeRegex(filter); // make sure a '.' is treated literally
+ }
+ const re = new RegExp(match, "i");
+ const reHighlight = new RegExp(escapeRegex(filter), "gi");
+ filter = (node) => {
+ if (!node.title) {
+ return false;
+ }
+ // let text = escapeTitles ? node.title : extractHtmlText(node.title);
+ const text = node.title;
+ // `.match` instead of `.test` to get the capture groups
+ const res = text.match(re);
+ if (res && opts.highlight) {
+ // if (escapeTitles) {
+ if (opts.fuzzy) {
+ temp = _markFuzzyMatchedChars(text, res, true);
+ }
+ else {
+ // #740: we must not apply the marks to escaped entity names, e.g. `"`
+ // Use some exotic characters to mark matches:
+ temp = text.replace(reHighlight, function (s) {
+ return START_MARKER + s + END_MARKER;
+ });
+ }
+ // now we can escape the title...
+ node.titleWithHighlight = escapeHtml(temp)
+ // ... and finally insert the desired `` tags
+ .replace(RE_START_MARKER, "")
+ .replace(RE_END_MARTKER, " ");
+ // } else {
+ // if (opts.fuzzy) {
+ // node.titleWithHighlight = _markFuzzyMatchedChars(text, res);
+ // } else {
+ // node.titleWithHighlight = text.replace(reHighlight, function (s) {
+ // return "" + s + " ";
+ // });
+ // }
+ // }
+ // node.debug("filter", escapeTitles, text, node.titleWithHighlight);
+ }
+ return !!res;
+ };
+ }
+ tree.filterMode = opts.mode;
+ // eslint-disable-next-line prefer-rest-params, prefer-spread
+ this.lastFilterArgs = arguments;
+ tree.element.classList.toggle("wb-ext-filter-hide", !!hideMode);
+ tree.element.classList.toggle("wb-ext-filter-dim", !hideMode);
+ tree.element.classList.toggle("wb-ext-filter-hide-expanders", !!opts.hideExpanders);
+ // Reset current filter
+ tree.root.subMatchCount = 0;
+ tree.visit((node) => {
+ delete node.match;
+ delete node.titleWithHighlight;
+ node.subMatchCount = 0;
+ });
+ // statusNode = tree.root.findDirectChild(KEY_NODATA);
+ // if (statusNode) {
+ // statusNode.remove();
+ // }
+ tree.setStatus(NodeStatusType.ok);
+ // Adjust node.hide, .match, and .subMatchCount properties
+ treeOpts.autoCollapse = false; // #528
+ tree.visit((node) => {
+ if (leavesOnly && node.children != null) {
+ return;
+ }
+ let res = filter(node);
+ if (res === "skip") {
+ node.visit(function (c) {
+ c.match = false;
+ }, true);
+ return "skip";
+ }
+ let matchedByBranch = false;
+ if ((branchMode || res === "branch") && node.parent.match) {
+ res = true;
+ matchedByBranch = true;
+ }
+ if (res) {
+ count++;
+ node.match = true;
+ node.visitParents((p) => {
+ if (p !== node) {
+ p.subMatchCount += 1;
+ }
+ // Expand match (unless this is no real match, but only a node in a matched branch)
+ if (opts.autoExpand && !matchedByBranch && !p.expanded) {
+ p.setExpanded(true, {
+ noAnimation: true,
+ noEvents: true,
+ });
+ p._filterAutoExpanded = true;
+ }
+ }, true);
+ }
+ });
+ treeOpts.autoCollapse = prevAutoCollapse;
+ if (count === 0 && opts.noData && hideMode) {
+ if (typeof opts.noData === "string") {
+ tree.root.setStatus(NodeStatusType.noData, { message: opts.noData });
+ }
+ else {
+ tree.root.setStatus(NodeStatusType.noData);
+ }
+ }
+ // Redraw whole tree
+ tree.logInfo(`Filter '${match}' found ${count} nodes in ${Date.now() - start} ms.`);
+ return count;
+ }
+ /**
+ * [ext-filter] Dim or hide nodes.
+ */
+ filterNodes(filter, options) {
+ return this._applyFilterNoUpdate(filter, false, options);
+ }
+ /**
+ * [ext-filter] Dim or hide whole branches.
+ */
+ filterBranches(filter, options) {
+ return this._applyFilterNoUpdate(filter, true, options);
+ }
+ /**
+ * [ext-filter] Re-apply current filter.
+ */
+ updateFilter() {
+ var _a;
+ const tree = this.tree;
+ if (tree.filterMode &&
+ this.lastFilterArgs &&
+ ((_a = tree.options.filter) === null || _a === void 0 ? void 0 : _a.autoApply)) {
+ // eslint-disable-next-line prefer-spread
+ this._applyFilterNoUpdate.apply(this, this.lastFilterArgs);
+ }
+ else {
+ tree.logWarn("updateFilter(): no filter active.");
+ }
+ }
+ /**
+ * [ext-filter] Reset the filter.
+ */
+ clearFilter() {
+ const tree = this.tree;
+ // statusNode = tree.root.findDirectChild(KEY_NODATA),
+ // escapeTitles = tree.options.escapeTitles;
+ tree.enableUpdate(false);
+ // if (statusNode) {
+ // statusNode.remove();
+ // }
+ tree.setStatus(NodeStatusType.ok);
+ // we also counted root node's subMatchCount
+ delete tree.root.match;
+ delete tree.root.subMatchCount;
+ tree.visit((node) => {
+ // if (node.match && node._rowElem) {
+ // let titleElem = node._rowElem.querySelector("span.wb-title")!;
+ // node._callEvent("enhanceTitle", { titleElem: titleElem });
+ // }
+ delete node.match;
+ delete node.subMatchCount;
+ delete node.titleWithHighlight;
+ // if (node.subMatchBadge) {
+ // node.subMatchBadge.remove();
+ // delete node.subMatchBadge;
+ // }
+ if (node._filterAutoExpanded && node.expanded) {
+ node.setExpanded(false, {
+ noAnimation: true,
+ noEvents: true,
+ });
+ }
+ delete node._filterAutoExpanded;
+ });
+ tree.filterMode = null;
+ this.lastFilterArgs = null;
+ tree.element.classList.remove(
+ // "wb-ext-filter",
+ "wb-ext-filter-dim", "wb-ext-filter-hide");
+ // tree._callHook("treeStructureChanged", this, "clearFilter");
+ tree.enableUpdate(true);
+ }
+ }
+ /**
+ * @description Marks the matching charecters of `text` either by `mark` or
+ * by exotic*Chars (if `escapeTitles` is `true`) based on `matches`
+ * which is an array of matching groups.
+ * @param {string} text
+ * @param {RegExpMatchArray} matches
+ */
+ function _markFuzzyMatchedChars(text, matches, escapeTitles = true) {
+ const matchingIndices = [];
+ // get the indices of matched characters (Iterate through `RegExpMatchArray`)
+ for (let _matchingArrIdx = 1; _matchingArrIdx < matches.length; _matchingArrIdx++) {
+ const _mIdx =
+ // get matching char index by cumulatively adding
+ // the matched group length
+ matches[_matchingArrIdx].length +
+ (_matchingArrIdx === 1 ? 0 : 1) +
+ (matchingIndices[matchingIndices.length - 1] || 0);
+ matchingIndices.push(_mIdx);
+ }
+ // Map each `text` char to its position and store in `textPoses`.
+ const textPoses = text.split("");
+ if (escapeTitles) {
+ // If escaping the title, then wrap the matching char within exotic chars
+ matchingIndices.forEach(function (v) {
+ textPoses[v] = START_MARKER + textPoses[v] + END_MARKER;
+ });
+ }
+ else {
+ // Otherwise, Wrap the matching chars within `mark`.
+ matchingIndices.forEach(function (v) {
+ textPoses[v] = "" + textPoses[v] + " ";
+ });
+ }
+ // Join back the modified `textPoses` to create final highlight markup.
+ return textPoses.join("");
+ }
- /*!
- * Wunderbaum - ext-keynav
- * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */
- const QUICKSEARCH_DELAY = 500;
- class KeynavExtension extends WunderbaumExtension {
- constructor(tree) {
- super(tree, "keynav", {});
- }
- _getEmbeddedInputElem(elem) {
- var _a;
- let input = null;
- if (elem && elem.type != null) {
- input = elem;
- }
- else {
- // ,[contenteditable]
- const ace = (_a = this.tree.getActiveColElem()) === null || _a === void 0 ? void 0 : _a.querySelector("input,select");
- if (ace) {
- input = ace;
- }
- }
- return input;
- }
- /* Return true if the current cell's embedded input has keyboard focus. */
- _isCurInputFocused() {
- var _a;
- const ace = (_a = this.tree
- .getActiveColElem()) === null || _a === void 0 ? void 0 : _a.querySelector("input:focus,select:focus");
- return !!ace;
- }
- onKeyEvent(data) {
- const event = data.event;
- const tree = this.tree;
- const opts = data.options;
- const activate = !event.ctrlKey || opts.autoActivate;
- const curInput = this._getEmbeddedInputElem(event.target);
- const inputHasFocus = curInput && this._isCurInputFocused();
- const navModeOption = opts.navigationModeOption;
- // isCellEditMode = tree.navMode === NavigationMode.cellEdit;
- let focusNode, eventName = eventToString(event), node = data.node, handled = true;
- // tree.log(`onKeyEvent: ${eventName}, curInput`, curInput);
- if (!tree.isEnabled()) {
- // tree.logDebug(`onKeyEvent ignored for disabled tree: ${eventName}`);
- return false;
- }
- // Let callback prevent default processing
- if (tree._callEvent("keydown", data) === false) {
- return false;
- }
- // Let ext-edit trigger editing
- if (tree._callMethod("edit._preprocessKeyEvent", data) === false) {
- return false;
- }
- // Set focus to active (or first node) if no other node has the focus yet
- if (!node) {
- const currentNode = tree.getFocusNode() || tree.getActiveNode();
- const firstNode = tree.getFirstChild();
- if (!currentNode && firstNode && eventName === "ArrowDown") {
- firstNode.logInfo("Keydown: activate first node.");
- firstNode.setActive();
- return;
- }
- focusNode = currentNode || firstNode;
- if (focusNode) {
- focusNode.setFocus();
- node = tree.getFocusNode();
- node.logInfo("Keydown: force focus on active node.");
- }
- }
- const isColspan = node.isColspan();
- if (tree.isRowNav()) {
- // -----------------------------------------------------------------------
- // --- Row Mode ---
- // -----------------------------------------------------------------------
- if (inputHasFocus) {
- // If editing an embedded input control, let the control handle all
- // keys. Only Enter and Escape should apply / discard, but keep the
- // keyboard focus.
- switch (eventName) {
- case "Enter":
- curInput.blur();
- tree.setFocus();
- break;
- case "Escape":
- node._render();
- tree.setFocus();
- break;
- }
- return;
- }
- // --- Quick-Search
- if (opts.quicksearch &&
- eventName.length === 1 &&
- /^\w$/.test(eventName) &&
- !curInput) {
- // Allow to search for longer streaks if typed in quickly
- const stamp = Date.now();
- if (stamp - tree.lastQuicksearchTime > QUICKSEARCH_DELAY) {
- tree.lastQuicksearchTerm = "";
- }
- tree.lastQuicksearchTime = stamp;
- tree.lastQuicksearchTerm += eventName;
- const matchNode = tree.findNextNode(tree.lastQuicksearchTerm, tree.getActiveNode());
- if (matchNode) {
- matchNode.setActive(true, { event: event });
- }
- event.preventDefault();
- return;
- }
- // Pre-Evaluate expand/collapse action for LEFT/RIGHT
- switch (eventName) {
- case "Enter":
- if (node.isActive()) {
- if (node.isExpanded()) {
- eventName = "Subtract"; // callapse
- }
- else if (node.isExpandable(true)) {
- eventName = "Add"; // expand
- }
- }
- break;
- case "ArrowLeft":
- if (node.expanded) {
- eventName = "Subtract"; // collapse
- }
- break;
- case "ArrowRight":
- if (!node.expanded && node.isExpandable(true)) {
- eventName = "Add"; // expand
- }
- else if (navModeOption === NavModeEnum.startCell ||
- navModeOption === NavModeEnum.startRow) {
- event.preventDefault();
- tree.setCellNav();
- return false;
- }
- break;
- }
- // Standard navigation (row mode)
- switch (eventName) {
- case "+":
- case "Add":
- // case "=": // 187: '+' @ Chrome, Safari
- node.setExpanded(true);
- break;
- case "-":
- case "Subtract":
- node.setExpanded(false);
- break;
- case " ": // Space
- // if (node.isPagingNode()) {
- // tree._triggerNodeEvent("clickPaging", ctx, event);
- // } else
- if (node.getOption("checkbox")) {
- node.toggleSelected();
- }
- else {
- node.setActive(true, { event: event });
- }
- break;
- case "Enter":
- node.setActive(true, { event: event });
- break;
- case "ArrowDown":
- case "ArrowLeft":
- case "ArrowRight":
- case "ArrowUp":
- case "Backspace":
- case "End":
- case "Home":
- case "Control+End":
- case "Control+Home":
- case "Meta+ArrowDown":
- case "Meta+ArrowUp":
- case "PageDown":
- case "PageUp":
- node.navigate(eventName, { activate: activate, event: event });
- break;
- default:
- handled = false;
- }
- }
- else {
- const curInput = this._getEmbeddedInputElem(null);
- const curInputType = curInput ? curInput.type || curInput.tagName : "";
- const inputHasFocus = curInput && this._isCurInputFocused();
- const inputCanFocus = curInput && curInputType !== "checkbox";
- if (inputHasFocus) {
- if (eventName === "Escape") {
- // Discard changes
- node._render();
- // Keep cell-nav mode
- node.logDebug(`Reset focused input`);
- tree.setFocus();
- tree.setColumn(tree.activeColIdx);
- return;
- // } else if (!INPUT_BREAKOUT_KEYS.has(eventName)) {
- }
- else if (eventName !== "Enter") {
- // Let current ` ` handle it
- node.logDebug(`Ignored ${eventName} inside focused input`);
- return;
- }
- // const curInputType = curInput.type || curInput.tagName;
- // const breakoutKeys = INPUT_KEYS[curInputType];
- // if (!breakoutKeys.includes(eventName)) {
- // node.logDebug(`Ignored ${eventName} inside ${curInputType} input`);
- // return;
- // }
- }
- else if (curInput) {
- // On a cell that has an embedded, unfocused
- if (eventName.length === 1 && inputCanFocus) {
- curInput.focus();
- curInput.value = "";
- node.logDebug(`Focus imput: ${eventName}`);
- return false;
- }
- }
- if (eventName === "Tab") {
- eventName = "ArrowRight";
- handled = true;
- }
- else if (eventName === "Shift+Tab") {
- eventName = tree.activeColIdx > 0 ? "ArrowLeft" : "";
- handled = true;
- }
- else ;
- switch (eventName) {
- case "+":
- case "Add":
- // case "=": // 187: '+' @ Chrome, Safari
- node.setExpanded(true);
- break;
- case "-":
- case "Subtract":
- node.setExpanded(false);
- break;
- case " ": // Space
- if (tree.activeColIdx === 0 && node.getOption("checkbox")) {
- node.toggleSelected();
- handled = true;
- }
- else if (curInput && curInputType === "checkbox") {
- curInput.click();
- // toggleCheckbox(curInput)
- // new Event("change")
- // curInput.change
- handled = true;
- }
- break;
- case "F2":
- if (curInput && !inputHasFocus && inputCanFocus) {
- curInput.focus();
- handled = true;
- }
- break;
- case "Enter":
- tree.setFocus(); // Blur prev. input if any
- if ((tree.activeColIdx === 0 || isColspan) && node.isExpandable()) {
- node.setExpanded(!node.isExpanded());
- handled = true;
- }
- else if (curInput && !inputHasFocus && inputCanFocus) {
- curInput.focus();
- handled = true;
- }
- break;
- case "Escape":
- tree.setFocus(); // Blur prev. input if any
- node.log(`keynav: focus tree...`);
- if (tree.isCellNav() && navModeOption !== NavModeEnum.cell) {
- node.log(`keynav: setCellNav(false)`);
- tree.setCellNav(false); // row-nav mode
- tree.setFocus(); //
- handled = true;
- }
- break;
- case "ArrowLeft":
- tree.setFocus(); // Blur prev. input if any
- if (isColspan && node.isExpanded()) {
- node.setExpanded(false);
- }
- else if (!isColspan && tree.activeColIdx > 0) {
- tree.setColumn(tree.activeColIdx - 1);
- }
- else if (navModeOption !== NavModeEnum.cell) {
- tree.setCellNav(false); // row-nav mode
- }
- handled = true;
- break;
- case "ArrowRight":
- tree.setFocus(); // Blur prev. input if any
- if (isColspan && !node.isExpanded()) {
- node.setExpanded();
- }
- else if (!isColspan &&
- tree.activeColIdx < tree.columns.length - 1) {
- tree.setColumn(tree.activeColIdx + 1);
- }
- handled = true;
- break;
- case "Home": // Generated by [Fn] + ArrowLeft on Mac
- // case "Meta+ArrowLeft":
- tree.setFocus(); // Blur prev. input if any
- if (!isColspan && tree.activeColIdx > 0) {
- tree.setColumn(0);
- }
- handled = true;
- break;
- case "End": // Generated by [Fn] + ArrowRight on Mac
- // case "Meta+ArrowRight":
- tree.setFocus(); // Blur prev. input if any
- if (!isColspan && tree.activeColIdx < tree.columns.length - 1) {
- tree.setColumn(tree.columns.length - 1);
- }
- handled = true;
- break;
- case "ArrowDown":
- case "ArrowUp":
- case "Backspace":
- case "Control+End": // Generated by Control + [Fn] + ArrowRight on Mac
- case "Control+Home": // Generated by Control + [Fn] + Arrowleft on Mac
- case "Meta+ArrowDown": // [⌘] + ArrowDown on Mac
- case "Meta+ArrowUp": // [⌘] + ArrowUp on Mac
- case "PageDown": // Generated by [Fn] + ArrowDown on Mac
- case "PageUp": // Generated by [Fn] + ArrowUp on Mac
- node.navigate(eventName, { activate: activate, event: event });
- // if (isCellEditMode) {
- // this._getEmbeddedInputElem(null, true); // set focus to input
- // }
- handled = true;
- break;
- default:
- handled = false;
- }
- }
- if (handled) {
- event.preventDefault();
- }
- return;
- }
- }
+ /*!
+ * Wunderbaum - ext-keynav
+ * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */
+ const QUICKSEARCH_DELAY = 500;
+ class KeynavExtension extends WunderbaumExtension {
+ constructor(tree) {
+ super(tree, "keynav", {});
+ }
+ _getEmbeddedInputElem(elem) {
+ var _a;
+ let input = null;
+ if (elem && elem.type != null) {
+ input = elem;
+ }
+ else {
+ // ,[contenteditable]
+ const ace = (_a = this.tree.getActiveColElem()) === null || _a === void 0 ? void 0 : _a.querySelector("input,select");
+ if (ace) {
+ input = ace;
+ }
+ }
+ return input;
+ }
+ // /* Return the current cell's embedded input that has keyboard focus. */
+ // protected _getFocusedInputElem(): HTMLInputElement | null {
+ // const ace = this.tree
+ // .getActiveColElem()
+ // ?.querySelector("input:focus,select:focus");
+ // return ace || null;
+ // }
+ /* Return true if the current cell's embedded input has keyboard focus. */
+ _isCurInputFocused() {
+ var _a;
+ const ace = (_a = this.tree
+ .getActiveColElem()) === null || _a === void 0 ? void 0 : _a.querySelector("input:focus,select:focus");
+ return !!ace;
+ }
+ onKeyEvent(data) {
+ const event = data.event;
+ const tree = this.tree;
+ const opts = data.options;
+ const activate = !event.ctrlKey || opts.autoActivate;
+ const curInput = this._getEmbeddedInputElem(event.target);
+ const inputHasFocus = curInput && this._isCurInputFocused();
+ const navModeOption = opts.navigationModeOption;
+ let focusNode, eventName = eventToString(event), node = data.node, handled = true;
+ // tree.log(`onKeyEvent: ${eventName}, curInput`, curInput);
+ if (!tree.isEnabled()) {
+ // tree.logDebug(`onKeyEvent ignored for disabled tree: ${eventName}`);
+ return false;
+ }
+ // Let callback prevent default processing
+ if (tree._callEvent("keydown", data) === false) {
+ return false;
+ }
+ // Let ext-edit trigger editing
+ if (tree._callMethod("edit._preprocessKeyEvent", data) === false) {
+ return false;
+ }
+ // Set focus to active (or first node) if no other node has the focus yet
+ if (!node) {
+ const currentNode = tree.getFocusNode() || tree.getActiveNode();
+ const firstNode = tree.getFirstChild();
+ if (!currentNode && firstNode && eventName === "ArrowDown") {
+ firstNode.logInfo("Keydown: activate first node.");
+ firstNode.setActive();
+ return;
+ }
+ focusNode = currentNode || firstNode;
+ if (focusNode) {
+ focusNode.setFocus();
+ node = tree.getFocusNode();
+ node.logInfo("Keydown: force focus on active node.");
+ }
+ }
+ const isColspan = node.isColspan();
+ if (tree.isRowNav()) {
+ // -----------------------------------------------------------------------
+ // --- Row Mode ---
+ // -----------------------------------------------------------------------
+ if (inputHasFocus) {
+ // If editing an embedded input control, let the control handle all
+ // keys. Only Enter and Escape should apply / discard, but keep the
+ // keyboard focus.
+ switch (eventName) {
+ case "Enter":
+ curInput.blur();
+ tree.setFocus();
+ break;
+ case "Escape":
+ node._render();
+ tree.setFocus();
+ break;
+ }
+ return;
+ }
+ // --- Quick-Search
+ if (opts.quicksearch &&
+ eventName.length === 1 &&
+ /^\w$/.test(eventName) &&
+ !curInput) {
+ // Allow to search for longer streaks if typed in quickly
+ const stamp = Date.now();
+ if (stamp - tree.lastQuicksearchTime > QUICKSEARCH_DELAY) {
+ tree.lastQuicksearchTerm = "";
+ }
+ tree.lastQuicksearchTime = stamp;
+ tree.lastQuicksearchTerm += eventName;
+ const matchNode = tree.findNextNode(tree.lastQuicksearchTerm, tree.getActiveNode());
+ if (matchNode) {
+ matchNode.setActive(true, { event: event });
+ }
+ event.preventDefault();
+ return;
+ }
+ // Pre-Evaluate expand/collapse action for LEFT/RIGHT
+ switch (eventName) {
+ case "Enter":
+ if (node.isActive()) {
+ if (node.isExpanded()) {
+ eventName = "Subtract"; // callapse
+ }
+ else if (node.isExpandable(true)) {
+ eventName = "Add"; // expand
+ }
+ }
+ break;
+ case "ArrowLeft":
+ if (node.expanded) {
+ eventName = "Subtract"; // collapse
+ }
+ break;
+ case "ArrowRight":
+ if (!node.expanded && node.isExpandable(true)) {
+ eventName = "Add"; // expand
+ }
+ else if (navModeOption === NavModeEnum.startCell ||
+ navModeOption === NavModeEnum.startRow) {
+ event.preventDefault();
+ tree.setCellNav();
+ return false;
+ }
+ break;
+ }
+ // Standard navigation (row mode)
+ switch (eventName) {
+ case "+":
+ case "Add":
+ // case "=": // 187: '+' @ Chrome, Safari
+ node.setExpanded(true);
+ break;
+ case "-":
+ case "Subtract":
+ node.setExpanded(false);
+ break;
+ case " ": // Space
+ // if (node.isPagingNode()) {
+ // tree._triggerNodeEvent("clickPaging", ctx, event);
+ // } else
+ if (node.getOption("checkbox")) {
+ node.toggleSelected();
+ }
+ else {
+ node.setActive(true, { event: event });
+ }
+ break;
+ case "Enter":
+ node.setActive(true, { event: event });
+ break;
+ case "ArrowDown":
+ case "ArrowLeft":
+ case "ArrowRight":
+ case "ArrowUp":
+ case "Backspace":
+ case "End":
+ case "Home":
+ case "Control+End":
+ case "Control+Home":
+ case "Meta+ArrowDown":
+ case "Meta+ArrowUp":
+ case "PageDown":
+ case "PageUp":
+ node.navigate(eventName, { activate: activate, event: event });
+ break;
+ default:
+ handled = false;
+ }
+ }
+ else {
+ // -----------------------------------------------------------------------
+ // --- Cell Mode ---
+ // -----------------------------------------------------------------------
+ // // Standard navigation (cell mode)
+ // if (isCellEditMode && INPUT_BREAKOUT_KEYS.has(eventName)) {
+ // }
+ // const curInput = this._getEmbeddedInputElem(null);
+ const curInputType = curInput ? curInput.type || curInput.tagName : "";
+ // const inputHasFocus = curInput && this._isCurInputFocused();
+ const inputCanFocus = curInput && curInputType !== "checkbox";
+ if (inputHasFocus) {
+ if (eventName === "Escape") {
+ node.logDebug(`Reset focused input on Escape`);
+ // Discard changes and reset input validation state
+ curInput.setCustomValidity("");
+ node._render();
+ // Keep cell-nav mode
+ tree.setFocus();
+ tree.setColumn(tree.activeColIdx);
+ return;
+ // } else if (!INPUT_BREAKOUT_KEYS.has(eventName)) {
+ }
+ else if (eventName !== "Enter") {
+ if (curInput && curInput.checkValidity && !curInput.checkValidity()) {
+ // Invalid input: ignore all keys except Enter and Escape
+ node.logDebug(`Ignored ${eventName} inside invalid input`);
+ return false;
+ }
+ // Let current ` ` handle it
+ node.logDebug(`Ignored ${eventName} inside focused input`);
+ return;
+ }
+ // const curInputType = curInput.type || curInput.tagName;
+ // const breakoutKeys = INPUT_KEYS[curInputType];
+ // if (!breakoutKeys.includes(eventName)) {
+ // node.logDebug(`Ignored ${eventName} inside ${curInputType} input`);
+ // return;
+ // }
+ }
+ else if (curInput) {
+ // On a cell that has an embedded, unfocused
+ if (eventName.length === 1 && inputCanFocus) {
+ // Typing a single char
+ curInput.focus();
+ curInput.value = "";
+ node.logDebug(`Focus input: ${eventName}`);
+ return false;
+ }
+ }
+ if (eventName === "Tab") {
+ eventName = "ArrowRight";
+ handled = true;
+ }
+ else if (eventName === "Shift+Tab") {
+ eventName = tree.activeColIdx > 0 ? "ArrowLeft" : "";
+ handled = true;
+ }
+ switch (eventName) {
+ case "+":
+ case "Add":
+ // case "=": // 187: '+' @ Chrome, Safari
+ node.setExpanded(true);
+ break;
+ case "-":
+ case "Subtract":
+ node.setExpanded(false);
+ break;
+ case " ": // Space
+ if (tree.activeColIdx === 0 && node.getOption("checkbox")) {
+ node.toggleSelected();
+ handled = true;
+ }
+ else if (curInput && curInputType === "checkbox") {
+ curInput.click();
+ // toggleCheckbox(curInput)
+ // new Event("change")
+ // curInput.change
+ handled = true;
+ }
+ break;
+ case "F2":
+ if (curInput && !inputHasFocus && inputCanFocus) {
+ curInput.focus();
+ handled = true;
+ }
+ break;
+ case "Enter":
+ tree.setFocus(); // Blur prev. input if any
+ if ((tree.activeColIdx === 0 || isColspan) && node.isExpandable()) {
+ node.setExpanded(!node.isExpanded());
+ handled = true;
+ }
+ else if (curInput && !inputHasFocus && inputCanFocus) {
+ curInput.focus();
+ handled = true;
+ }
+ break;
+ case "Escape":
+ tree.setFocus(); // Blur prev. input if any
+ node.log(`keynav: focus tree...`);
+ if (tree.isCellNav() && navModeOption !== NavModeEnum.cell) {
+ node.log(`keynav: setCellNav(false)`);
+ tree.setCellNav(false); // row-nav mode
+ tree.setFocus(); //
+ handled = true;
+ }
+ break;
+ case "ArrowLeft":
+ tree.setFocus(); // Blur prev. input if any
+ if (isColspan && node.isExpanded()) {
+ node.setExpanded(false);
+ }
+ else if (!isColspan && tree.activeColIdx > 0) {
+ tree.setColumn(tree.activeColIdx - 1);
+ }
+ else if (navModeOption !== NavModeEnum.cell) {
+ tree.setCellNav(false); // row-nav mode
+ }
+ handled = true;
+ break;
+ case "ArrowRight":
+ tree.setFocus(); // Blur prev. input if any
+ if (isColspan && !node.isExpanded()) {
+ node.setExpanded();
+ }
+ else if (!isColspan &&
+ tree.activeColIdx < tree.columns.length - 1) {
+ tree.setColumn(tree.activeColIdx + 1);
+ }
+ handled = true;
+ break;
+ case "Home": // Generated by [Fn] + ArrowLeft on Mac
+ // case "Meta+ArrowLeft":
+ tree.setFocus(); // Blur prev. input if any
+ if (!isColspan && tree.activeColIdx > 0) {
+ tree.setColumn(0);
+ }
+ handled = true;
+ break;
+ case "End": // Generated by [Fn] + ArrowRight on Mac
+ // case "Meta+ArrowRight":
+ tree.setFocus(); // Blur prev. input if any
+ if (!isColspan && tree.activeColIdx < tree.columns.length - 1) {
+ tree.setColumn(tree.columns.length - 1);
+ }
+ handled = true;
+ break;
+ case "ArrowDown":
+ case "ArrowUp":
+ case "Backspace":
+ case "Control+End": // Generated by Control + [Fn] + ArrowRight on Mac
+ case "Control+Home": // Generated by Control + [Fn] + Arrowleft on Mac
+ case "Meta+ArrowDown": // [⌘] + ArrowDown on Mac
+ case "Meta+ArrowUp": // [⌘] + ArrowUp on Mac
+ case "PageDown": // Generated by [Fn] + ArrowDown on Mac
+ case "PageUp": // Generated by [Fn] + ArrowUp on Mac
+ node.navigate(eventName, { activate: activate, event: event });
+ // if (isCellEditMode) {
+ // this._getEmbeddedInputElem(null, true); // set focus to input
+ // }
+ handled = true;
+ break;
+ default:
+ handled = false;
+ }
+ }
+ if (handled) {
+ event.preventDefault();
+ }
+ return;
+ }
+ }
- /*!
- * Wunderbaum - ext-logger
- * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */
- class LoggerExtension extends WunderbaumExtension {
- constructor(tree) {
- super(tree, "logger", {});
- this.ignoreEvents = new Set([
- "iconBadge",
- // "enhanceTitle",
- "render",
- "discard",
- ]);
- this.prefix = tree + ".ext-logger";
- }
- init() {
- const tree = this.tree;
- // this.ignoreEvents.add();
- if (tree.getOption("debugLevel") >= 4) {
- // const self = this;
- const ignoreEvents = this.ignoreEvents;
- const prefix = this.prefix;
- overrideMethod(tree, "callEvent", function (name, extra) {
- /* eslint-disable prefer-rest-params */
- if (ignoreEvents.has(name)) {
- return tree._superApply(arguments);
- }
- const start = Date.now();
- const res = tree._superApply(arguments);
- tree.logDebug(`${prefix}: callEvent('${name}') took ${Date.now() - start} ms.`, arguments[1]);
- return res;
- });
- }
- }
- onKeyEvent(data) {
- // this.tree.logInfo("onKeyEvent", eventToString(data.event), data);
- this.tree.logDebug(`${this.prefix}: onKeyEvent()`, data);
- return;
- }
- }
+ /*!
+ * Wunderbaum - ext-logger
+ * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */
+ class LoggerExtension extends WunderbaumExtension {
+ constructor(tree) {
+ super(tree, "logger", {});
+ this.ignoreEvents = new Set([
+ "iconBadge",
+ // "enhanceTitle",
+ "render",
+ "discard",
+ ]);
+ this.prefix = tree + ".ext-logger";
+ }
+ init() {
+ const tree = this.tree;
+ // this.ignoreEvents.add();
+ if (tree.getOption("debugLevel") >= 4) {
+ // const self = this;
+ const ignoreEvents = this.ignoreEvents;
+ const prefix = this.prefix;
+ overrideMethod(tree, "callEvent", function (name, extra) {
+ /* eslint-disable prefer-rest-params */
+ if (ignoreEvents.has(name)) {
+ return tree._superApply(arguments);
+ }
+ const start = Date.now();
+ const res = tree._superApply(arguments);
+ tree.logDebug(`${prefix}: callEvent('${name}') took ${Date.now() - start} ms.`, arguments[1]);
+ return res;
+ });
+ }
+ }
+ onKeyEvent(data) {
+ // this.tree.logInfo("onKeyEvent", eventToString(data.event), data);
+ this.tree.logDebug(`${this.prefix}: onKeyEvent()`, data);
+ return;
+ }
+ }
- /*!
- * Wunderbaum - common
- * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */
- const DEFAULT_DEBUGLEVEL = 3; // Replaced by rollup script
- /**
- * Fixed height of a row in pixel. Must match the SCSS variable `$row-outer-height`.
- */
- const ROW_HEIGHT = 22;
- /**
- * Fixed width of node icons in pixel. Must match the SCSS variable `$icon-outer-width`.
- */
- const ICON_WIDTH = 20;
- /**
- * Adjust the width of the title span, so overflow ellipsis work.
- * (2 x `$col-padding-x` + 3px rounding errors).
- */
- const TITLE_SPAN_PAD_Y = 7;
- /** Render row markup for N nodes above and below the visible viewport. */
- const RENDER_MAX_PREFETCH = 5;
- /** Regular expression to detect if a string describes an image URL (in contrast
- * to a class name). Strings are considered image urls if they contain '.' or '/'.
- */
- const TEST_IMG = new RegExp(/\.|\//);
- // export const RECURSIVE_REQUEST_ERROR = "$recursive_request";
- // export const INVALID_REQUEST_TARGET_ERROR = "$request_target_invalid";
- /**
- * Default node icons.
- * Requires bootstrap icons https://icons.getbootstrap.com
- */
- const iconMaps = {
- bootstrap: {
- error: "bi bi-exclamation-triangle",
- // loading: "bi bi-hourglass-split wb-busy",
- loading: "bi bi-chevron-right wb-busy",
- // loading: "bi bi-arrow-repeat wb-spin",
- // loading: ' Loading...
',
- // noData: "bi bi-search",
- noData: "bi bi-question-circle",
- expanderExpanded: "bi bi-chevron-down",
- // expanderExpanded: "bi bi-dash-square",
- expanderCollapsed: "bi bi-chevron-right",
- // expanderCollapsed: "bi bi-plus-square",
- expanderLazy: "bi bi-chevron-right wb-helper-lazy-expander",
- // expanderLazy: "bi bi-chevron-bar-right",
- checkChecked: "bi bi-check-square",
- checkUnchecked: "bi bi-square",
- checkUnknown: "bi bi-dash-square-dotted",
- radioChecked: "bi bi-circle-fill",
- radioUnchecked: "bi bi-circle",
- radioUnknown: "bi bi-record-circle",
- folder: "bi bi-folder2",
- folderOpen: "bi bi-folder2-open",
- folderLazy: "bi bi-folder-symlink",
- doc: "bi bi-file-earmark",
- },
- fontawesome6: {
- error: "fa-solid fa-triangle-exclamation",
- loading: "fa-solid fa-chevron-right fa-beat",
- noData: "fa-solid fa-circle-question",
- expanderExpanded: "fa-solid fa-chevron-down",
- expanderCollapsed: "fa-solid fa-chevron-right",
- expanderLazy: "fa-solid fa-chevron-right wb-helper-lazy-expander",
- checkChecked: "fa-regular fa-square-check",
- checkUnchecked: "fa-regular fa-square",
- checkUnknown: "fa-regular fa-square-minus",
- radioChecked: "fa-solid fa-circle",
- radioUnchecked: "fa-regular fa-circle",
- radioUnknown: "fa-regular fa-circle-question",
- folder: "fa-solid fa-folder-closed",
- folderOpen: "fa-regular fa-folder-open",
- folderLazy: "fa-solid fa-folder-plus",
- doc: "fa-regular fa-file",
- },
- };
- /** Dict keys that are evaluated by source loader (others are added to `tree.data` instead). */
- const RESERVED_TREE_SOURCE_KEYS = new Set([
- "_format",
- "_keyMap",
- "_positional",
- "_typeList",
- "_valueMap",
- "_version",
- "children",
- "columns",
- "types",
- ]);
- // /** Key codes that trigger grid navigation, even when inside an input element. */
- // export const INPUT_BREAKOUT_KEYS: Set = new Set([
- // // "ArrowDown",
- // // "ArrowUp",
- // "Enter",
- // "Escape",
- // ]);
- /** Map `KeyEvent.key` to navigation action. */
- const KEY_TO_ACTION_DICT = {
- " ": "toggleSelect",
- "+": "expand",
- Add: "expand",
- ArrowDown: "down",
- ArrowLeft: "left",
- ArrowRight: "right",
- ArrowUp: "up",
- Backspace: "parent",
- "/": "collapseAll",
- Divide: "collapseAll",
- End: "lastCol",
- Home: "firstCol",
- "Control+End": "last",
- "Control+Home": "first",
- "Meta+ArrowDown": "last",
- "Meta+ArrowUp": "first",
- "*": "expandAll",
- Multiply: "expandAll",
- PageDown: "pageDown",
- PageUp: "pageUp",
- "-": "collapse",
- Subtract: "collapse",
- };
- /** Return a callback that returns true if the node title matches the string
- * or regular expression.
- * @see {@link WunderbaumNode.findAll}
- */
- function makeNodeTitleMatcher(match) {
- if (match instanceof RegExp) {
- return function (node) {
- return match.test(node.title);
- };
- }
- assert(typeof match === "string", `Expected a string or RegExp: ${match}`);
- // s = escapeRegex(s.toLowerCase());
- return function (node) {
- return node.title === match;
- // console.log("match " + node, node.title.toLowerCase().indexOf(match))
- // return node.title.toLowerCase().indexOf(match) >= 0;
- };
- }
- /** Return a callback that returns true if the node title starts with a string (case-insensitive). */
- function makeNodeTitleStartMatcher(s) {
- s = escapeRegex(s);
- const reMatch = new RegExp("^" + s, "i");
- return function (node) {
- return reMatch.test(node.title);
- };
- }
- /** Compare two nodes by title (case-insensitive). */
- function nodeTitleSorter(a, b) {
- const x = a.title.toLowerCase();
- const y = b.title.toLowerCase();
- return x === y ? 0 : x > y ? 1 : -1;
- }
- /**
- * Convert 'flat' to 'nested' format.
- *
- * Flat node entry format:
- * [PARENT_ID, [POSITIONAL_ARGS]]
- * or
- * [PARENT_ID, [POSITIONAL_ARGS], {KEY_VALUE_ARGS}]
- *
- * 1. Parent-referencing list is converted to a list of nested dicts with
- * optional `children` properties.
- * 2. `[POSITIONAL_ARGS]` are added as dict attributes.
- */
- function unflattenSource(source) {
- var _a, _b, _c;
- const { _format, _keyMap = {}, _positional = [], children } = source;
- if (_format !== "flat") {
- throw new Error(`Expected source._format: "flat", but got ${_format}`);
- }
- if (_positional && _positional.includes("children")) {
- throw new Error(`source._positional must not include "children": ${_positional}`);
- }
- let longToShort = _keyMap;
- if (_keyMap.t) {
- // Inverse keyMap was used (pre 0.7.0)
- // TODO: raise Error on final 1.x release
- const msg = `source._keyMap maps from long to short since v0.7.0. Flip key/value!`;
- console.warn(msg); // eslint-disable-line no-console
- longToShort = {};
- for (const [key, value] of Object.entries(_keyMap)) {
- longToShort[value] = key;
- }
- }
- const positionalShort = _positional.map((e) => longToShort[e]);
- const newChildren = [];
- const keyToNodeMap = {};
- const indexToNodeMap = {};
- const keyAttrName = (_a = longToShort["key"]) !== null && _a !== void 0 ? _a : "key";
- const childrenAttrName = (_b = longToShort["children"]) !== null && _b !== void 0 ? _b : "children";
- for (const [index, nodeTuple] of children.entries()) {
- // Node entry format:
- // [PARENT_ID, [POSITIONAL_ARGS]]
- // or
- // [PARENT_ID, [POSITIONAL_ARGS], {KEY_VALUE_ARGS}]
- const [parentId, args, kwargs = {}] = nodeTuple;
- // Free up some memory as we go
- nodeTuple[1] = null;
- if (nodeTuple[2] != null) {
- nodeTuple[2] = null;
- }
- // console.log("flatten", parentId, args, kwargs)
- // We keep `kwargs` as our new node definition. Then we add all positional
- // values to this object:
- args.forEach((val, positionalIdx) => {
- kwargs[positionalShort[positionalIdx]] = val;
- });
- // Find the parent node. `null` means 'toplevel'. PARENT_ID may be the numeric
- // index of the source.children list. If PARENT_ID is a string, we search
- // a parent with node.key of this value.
- indexToNodeMap[index] = kwargs;
- const key = kwargs[keyAttrName];
- if (key != null) {
- keyToNodeMap[key] = kwargs;
- }
- let parentNode = null;
- if (parentId === null) ;
- else if (typeof parentId === "number") {
- parentNode = indexToNodeMap[parentId];
- if (parentNode === undefined) {
- throw new Error(`unflattenSource: Could not find parent node by index: ${parentId}.`);
- }
- }
- else {
- parentNode = keyToNodeMap[parentId];
- if (parentNode === undefined) {
- throw new Error(`unflattenSource: Could not find parent node by key: ${parentId}`);
- }
- }
- if (parentNode) {
- (_c = parentNode[childrenAttrName]) !== null && _c !== void 0 ? _c : (parentNode[childrenAttrName] = []);
- parentNode[childrenAttrName].push(kwargs);
- }
- else {
- newChildren.push(kwargs);
- }
- }
- source.children = newChildren;
- }
- /**
- * Decompresses the source data by
- * - converting from 'flat' to 'nested' format
- * - expanding short alias names to long names (if defined in _keyMap)
- * - resolving value indexes to value strings (if defined in _valueMap)
- *
- * @param source - The source object to be decompressed.
- * @returns void
- */
- function decompressSourceData(source) {
- let { _format, _version = 1, _keyMap, _valueMap } = source;
- assert(_version === 1, `Expected file version 1 instead of ${_version}`);
- let longToShort = _keyMap;
- let shortToLong = {};
- if (longToShort) {
- for (const [key, value] of Object.entries(longToShort)) {
- shortToLong[value] = key;
- }
- }
- // Fallback for old format (pre 0.7.0, using _keyMap in reverse direction)
- // TODO: raise Error on final 1.x release
- if (longToShort && longToShort.t) {
- const msg = `source._keyMap maps from long to short since v0.7.0. Flip key/value!`;
- console.warn(msg); // eslint-disable-line no-console
- [longToShort, shortToLong] = [shortToLong, longToShort];
- }
- // Fallback for old format (pre 0.7.0, using _typeList instead of _valueMap)
- // TODO: raise Error on final 1.x release
- if (source._typeList != null) {
- const msg = `source._typeList is deprecated since v0.7.0: use source._valueMap: {"type": [...]} instead.`;
- if (_valueMap != null) {
- throw new Error(msg);
- }
- else {
- console.warn(msg); // eslint-disable-line no-console
- _valueMap = { type: source._typeList };
- delete source._typeList;
- }
- }
- if (_format === "flat") {
- unflattenSource(source);
- }
- delete source._format;
- delete source._version;
- delete source._keyMap;
- delete source._valueMap;
- delete source._positional;
- function _iter(childList) {
- for (const node of childList) {
- // Iterate over a list of names, because we modify inside the loop
- // (for ... of ... does not allow this)
- Object.getOwnPropertyNames(node).forEach((propName) => {
- const value = node[propName];
- // Replace short names with long names if defined in _keyMap
- let longName = propName;
- if (_keyMap && shortToLong[propName] != null) {
- longName = shortToLong[propName];
- if (longName !== propName) {
- node[longName] = value;
- delete node[propName];
- }
- }
- // Replace type index with type name if defined in _valueMap
- if (_valueMap &&
- typeof value === "number" &&
- _valueMap[longName] != null) {
- const newValue = _valueMap[longName][value];
- if (newValue == null) {
- throw new Error(`Expected valueMap[${longName}][${value}] entry in [${_valueMap[longName]}]`);
- }
- node[longName] = newValue;
- }
- });
- // Recursion
- if (node.children) {
- _iter(node.children);
- }
- }
- }
- if (_keyMap || _valueMap) {
- _iter(source.children);
- }
- }
+ /*!
+ * Wunderbaum - common
+ * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */
+ const DEFAULT_DEBUGLEVEL = 3; // Replaced by rollup script
+ /**
+ * Fixed height of a row in pixel. Must match the SCSS variable `$row-outer-height`.
+ */
+ const ROW_HEIGHT = 22;
+ /**
+ * Fixed width of node icons in pixel. Must match the SCSS variable `$icon-outer-width`.
+ */
+ const ICON_WIDTH = 20;
+ /**
+ * Adjust the width of the title span, so overflow ellipsis work.
+ * (2 x `$col-padding-x` + 3px rounding errors).
+ */
+ const TITLE_SPAN_PAD_Y = 7;
+ /** Render row markup for N nodes above and below the visible viewport. */
+ const RENDER_MAX_PREFETCH = 5;
+ /** Regular expression to detect if a string describes an image URL (in contrast
+ * to a class name). Strings are considered image urls if they contain '.' or '/'.
+ */
+ const TEST_IMG = new RegExp(/\.|\//);
+ // export const RECURSIVE_REQUEST_ERROR = "$recursive_request";
+ // export const INVALID_REQUEST_TARGET_ERROR = "$request_target_invalid";
+ /**
+ * Default node icons.
+ * Requires bootstrap icons https://icons.getbootstrap.com
+ */
+ const iconMaps = {
+ bootstrap: {
+ error: "bi bi-exclamation-triangle",
+ // loading: "bi bi-hourglass-split wb-busy",
+ loading: "bi bi-chevron-right wb-busy",
+ // loading: "bi bi-arrow-repeat wb-spin",
+ // loading: ' Loading...
',
+ // noData: "bi bi-search",
+ noData: "bi bi-question-circle",
+ expanderExpanded: "bi bi-chevron-down",
+ // expanderExpanded: "bi bi-dash-square",
+ expanderCollapsed: "bi bi-chevron-right",
+ // expanderCollapsed: "bi bi-plus-square",
+ expanderLazy: "bi bi-chevron-right wb-helper-lazy-expander",
+ // expanderLazy: "bi bi-chevron-bar-right",
+ checkChecked: "bi bi-check-square",
+ checkUnchecked: "bi bi-square",
+ checkUnknown: "bi bi-dash-square-dotted",
+ radioChecked: "bi bi-circle-fill",
+ radioUnchecked: "bi bi-circle",
+ radioUnknown: "bi bi-record-circle",
+ folder: "bi bi-folder2",
+ folderOpen: "bi bi-folder2-open",
+ folderLazy: "bi bi-folder-symlink",
+ doc: "bi bi-file-earmark",
+ },
+ fontawesome6: {
+ error: "fa-solid fa-triangle-exclamation",
+ loading: "fa-solid fa-chevron-right fa-beat",
+ noData: "fa-solid fa-circle-question",
+ expanderExpanded: "fa-solid fa-chevron-down",
+ expanderCollapsed: "fa-solid fa-chevron-right",
+ expanderLazy: "fa-solid fa-chevron-right wb-helper-lazy-expander",
+ checkChecked: "fa-regular fa-square-check",
+ checkUnchecked: "fa-regular fa-square",
+ checkUnknown: "fa-regular fa-square-minus",
+ radioChecked: "fa-solid fa-circle",
+ radioUnchecked: "fa-regular fa-circle",
+ radioUnknown: "fa-regular fa-circle-question",
+ folder: "fa-solid fa-folder-closed",
+ folderOpen: "fa-regular fa-folder-open",
+ folderLazy: "fa-solid fa-folder-plus",
+ doc: "fa-regular fa-file",
+ },
+ };
+ /** Dict keys that are evaluated by source loader (others are added to `tree.data` instead). */
+ const RESERVED_TREE_SOURCE_KEYS = new Set([
+ "_format",
+ "_keyMap",
+ "_positional",
+ "_typeList",
+ "_valueMap",
+ "_version",
+ "children",
+ "columns",
+ "types",
+ ]);
+ // /** Key codes that trigger grid navigation, even when inside an input element. */
+ // export const INPUT_BREAKOUT_KEYS: Set = new Set([
+ // // "ArrowDown",
+ // // "ArrowUp",
+ // "Enter",
+ // "Escape",
+ // ]);
+ /** Map `KeyEvent.key` to navigation action. */
+ const KEY_TO_ACTION_DICT = {
+ " ": "toggleSelect",
+ "+": "expand",
+ Add: "expand",
+ ArrowDown: "down",
+ ArrowLeft: "left",
+ ArrowRight: "right",
+ ArrowUp: "up",
+ Backspace: "parent",
+ "/": "collapseAll",
+ Divide: "collapseAll",
+ End: "lastCol",
+ Home: "firstCol",
+ "Control+End": "last",
+ "Control+Home": "first",
+ "Meta+ArrowDown": "last",
+ "Meta+ArrowUp": "first",
+ "*": "expandAll",
+ Multiply: "expandAll",
+ PageDown: "pageDown",
+ PageUp: "pageUp",
+ "-": "collapse",
+ Subtract: "collapse",
+ };
+ /** Return a callback that returns true if the node title matches the string
+ * or regular expression.
+ * @see {@link WunderbaumNode.findAll()}
+ */
+ function makeNodeTitleMatcher(match) {
+ if (match instanceof RegExp) {
+ return function (node) {
+ return match.test(node.title);
+ };
+ }
+ assert(typeof match === "string", `Expected a string or RegExp: ${match}`);
+ // s = escapeRegex(s.toLowerCase());
+ return function (node) {
+ return node.title === match;
+ // console.log("match " + node, node.title.toLowerCase().indexOf(match))
+ // return node.title.toLowerCase().indexOf(match) >= 0;
+ };
+ }
+ /** Return a callback that returns true if the node title starts with a string (case-insensitive). */
+ function makeNodeTitleStartMatcher(s) {
+ s = escapeRegex(s);
+ const reMatch = new RegExp("^" + s, "i");
+ return function (node) {
+ return reMatch.test(node.title);
+ };
+ }
+ /** Compare two nodes by title (case-insensitive). */
+ function nodeTitleSorter(a, b) {
+ const x = a.title.toLowerCase();
+ const y = b.title.toLowerCase();
+ return x === y ? 0 : x > y ? 1 : -1;
+ }
+ /**
+ * Convert 'flat' to 'nested' format.
+ *
+ * Flat node entry format:
+ * [PARENT_ID, [POSITIONAL_ARGS]]
+ * or
+ * [PARENT_ID, [POSITIONAL_ARGS], {KEY_VALUE_ARGS}]
+ *
+ * 1. Parent-referencing list is converted to a list of nested dicts with
+ * optional `children` properties.
+ * 2. `[POSITIONAL_ARGS]` are added as dict attributes.
+ */
+ function unflattenSource(source) {
+ var _a, _b, _c;
+ const { _format, _keyMap = {}, _positional = [], children } = source;
+ if (_format !== "flat") {
+ throw new Error(`Expected source._format: "flat", but got ${_format}`);
+ }
+ if (_positional && _positional.includes("children")) {
+ throw new Error(`source._positional must not include "children": ${_positional}`);
+ }
+ let longToShort = _keyMap;
+ if (_keyMap.t) {
+ // Inverse keyMap was used (pre 0.7.0)
+ // TODO: raise Error on final 1.x release
+ const msg = `source._keyMap maps from long to short since v0.7.0. Flip key/value!`;
+ console.warn(msg); // eslint-disable-line no-console
+ longToShort = {};
+ for (const [key, value] of Object.entries(_keyMap)) {
+ longToShort[value] = key;
+ }
+ }
+ const positionalShort = _positional.map((e) => longToShort[e]);
+ const newChildren = [];
+ const keyToNodeMap = {};
+ const indexToNodeMap = {};
+ const keyAttrName = (_a = longToShort["key"]) !== null && _a !== void 0 ? _a : "key";
+ const childrenAttrName = (_b = longToShort["children"]) !== null && _b !== void 0 ? _b : "children";
+ for (const [index, nodeTuple] of children.entries()) {
+ // Node entry format:
+ // [PARENT_ID, [POSITIONAL_ARGS]]
+ // or
+ // [PARENT_ID, [POSITIONAL_ARGS], {KEY_VALUE_ARGS}]
+ const [parentId, args, kwargs = {}] = nodeTuple;
+ // Free up some memory as we go
+ nodeTuple[1] = null;
+ if (nodeTuple[2] != null) {
+ nodeTuple[2] = null;
+ }
+ // console.log("flatten", parentId, args, kwargs)
+ // We keep `kwargs` as our new node definition. Then we add all positional
+ // values to this object:
+ args.forEach((val, positionalIdx) => {
+ kwargs[positionalShort[positionalIdx]] = val;
+ });
+ // Find the parent node. `null` means 'toplevel'. PARENT_ID may be the numeric
+ // index of the source.children list. If PARENT_ID is a string, we search
+ // a parent with node.key of this value.
+ indexToNodeMap[index] = kwargs;
+ const key = kwargs[keyAttrName];
+ if (key != null) {
+ keyToNodeMap[key] = kwargs;
+ }
+ let parentNode = null;
+ if (parentId === null) ;
+ else if (typeof parentId === "number") {
+ parentNode = indexToNodeMap[parentId];
+ if (parentNode === undefined) {
+ throw new Error(`unflattenSource: Could not find parent node by index: ${parentId}.`);
+ }
+ }
+ else {
+ parentNode = keyToNodeMap[parentId];
+ if (parentNode === undefined) {
+ throw new Error(`unflattenSource: Could not find parent node by key: ${parentId}`);
+ }
+ }
+ if (parentNode) {
+ (_c = parentNode[childrenAttrName]) !== null && _c !== void 0 ? _c : (parentNode[childrenAttrName] = []);
+ parentNode[childrenAttrName].push(kwargs);
+ }
+ else {
+ newChildren.push(kwargs);
+ }
+ }
+ source.children = newChildren;
+ }
+ /**
+ * Decompresses the source data by
+ * - converting from 'flat' to 'nested' format
+ * - expanding short alias names to long names (if defined in _keyMap)
+ * - resolving value indexes to value strings (if defined in _valueMap)
+ *
+ * @param source - The source object to be decompressed.
+ * @returns void
+ */
+ function decompressSourceData(source) {
+ let { _format, _version = 1, _keyMap, _valueMap } = source;
+ assert(_version === 1, `Expected file version 1 instead of ${_version}`);
+ let longToShort = _keyMap;
+ let shortToLong = {};
+ if (longToShort) {
+ for (const [key, value] of Object.entries(longToShort)) {
+ shortToLong[value] = key;
+ }
+ }
+ // Fallback for old format (pre 0.7.0, using _keyMap in reverse direction)
+ // TODO: raise Error on final 1.x release
+ if (longToShort && longToShort.t) {
+ const msg = `source._keyMap maps from long to short since v0.7.0. Flip key/value!`;
+ console.warn(msg); // eslint-disable-line no-console
+ [longToShort, shortToLong] = [shortToLong, longToShort];
+ }
+ // Fallback for old format (pre 0.7.0, using _typeList instead of _valueMap)
+ // TODO: raise Error on final 1.x release
+ if (source._typeList != null) {
+ const msg = `source._typeList is deprecated since v0.7.0: use source._valueMap: {"type": [...]} instead.`;
+ if (_valueMap != null) {
+ throw new Error(msg);
+ }
+ else {
+ console.warn(msg); // eslint-disable-line no-console
+ _valueMap = { type: source._typeList };
+ delete source._typeList;
+ }
+ }
+ if (_format === "flat") {
+ unflattenSource(source);
+ }
+ delete source._format;
+ delete source._version;
+ delete source._keyMap;
+ delete source._valueMap;
+ delete source._positional;
+ function _iter(childList) {
+ for (const node of childList) {
+ // Iterate over a list of names, because we modify inside the loop
+ // (for ... of ... does not allow this)
+ Object.getOwnPropertyNames(node).forEach((propName) => {
+ const value = node[propName];
+ // Replace short names with long names if defined in _keyMap
+ let longName = propName;
+ if (_keyMap && shortToLong[propName] != null) {
+ longName = shortToLong[propName];
+ if (longName !== propName) {
+ node[longName] = value;
+ delete node[propName];
+ }
+ }
+ // Replace type index with type name if defined in _valueMap
+ if (_valueMap &&
+ typeof value === "number" &&
+ _valueMap[longName] != null) {
+ const newValue = _valueMap[longName][value];
+ if (newValue == null) {
+ throw new Error(`Expected valueMap[${longName}][${value}] entry in [${_valueMap[longName]}]`);
+ }
+ node[longName] = newValue;
+ }
+ });
+ // Recursion
+ if (node.children) {
+ _iter(node.children);
+ }
+ }
+ }
+ if (_keyMap || _valueMap) {
+ _iter(source.children);
+ }
+ }
- /*!
- * Wunderbaum - ext-dnd
- * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */
- const nodeMimeType = "application/x-wunderbaum-node";
- class DndExtension extends WunderbaumExtension {
- constructor(tree) {
- super(tree, "dnd", {
- autoExpandMS: 1500,
- // dropMarkerInsertOffsetX: -16, // Additional offset for drop-marker with hitMode = "before"/"after"
- // dropMarkerOffsetX: -24, // Absolute position offset for .fancytree-drop-marker relatively to ..fancytree-title (icon/img near a node accepting drop)
- // #1021 `document.body` is not available yet
- // dropMarkerParent: "body", // Root Container used for drop marker (could be a shadow root)
- multiSource: false,
- effectAllowed: "all",
- dropEffectDefault: "move",
- guessDropEffect: true,
- preventForeignNodes: false,
- preventLazyParents: true,
- preventNonNodes: false,
- preventRecursion: true,
- preventSameParent: false,
- preventVoidMoves: true,
- serializeClipboardData: true,
- scroll: true,
- scrollSensitivity: 20,
- // scrollnterval: 50, // Generate event every 50 ms
- scrollSpeed: 5,
- // setTextTypeJson: false, // Allow dragging of nodes to different IE windows
- sourceCopyHook: null,
- // Events (drag support)
- dragStart: null,
- drag: null,
- dragEnd: null,
- // Events (drop support)
- dragEnter: null,
- dragOver: null,
- dragExpand: null,
- drop: null,
- dragLeave: null, // Callback(targetNode, data)
- });
- // public dropMarkerElem?: HTMLElement;
- this.srcNode = null;
- this.lastTargetNode = null;
- this.lastEnterStamp = 0;
- this.lastAllowedDropRegions = null;
- this.lastDropEffect = null;
- this.lastDropRegion = false;
- this.currentScrollDir = 0;
- this.applyScrollDirThrottled = throttle(this._applyScrollDir, 50);
- }
- init() {
- super.init();
- // Store the current scroll parent, which may be the tree
- // container, any enclosing div, or the document.
- // #761: scrollParent() always needs a container child
- // $temp = $("").appendTo(this.$container);
- // this.$scrollParent = $temp.scrollParent();
- // $temp.remove();
- const tree = this.tree;
- const dndOpts = tree.options.dnd;
- // Enable drag support if dragStart() is specified:
- if (dndOpts.dragStart) {
- onEvent(tree.element, "dragstart drag dragend", this.onDragEvent.bind(this));
- }
- // Enable drop support if dragEnter() is specified:
- if (dndOpts.dragEnter) {
- onEvent(tree.element, "dragenter dragover dragleave drop", this.onDropEvent.bind(this));
- }
- }
- /** Cleanup classes after target node is no longer hovered. */
- _leaveNode() {
- // We remove the marker on dragenter from the previous target:
- const ltn = this.lastTargetNode;
- this.lastEnterStamp = 0;
- if (ltn) {
- ltn.setClass("wb-drop-target wb-drop-over wb-drop-after wb-drop-before", false);
- this.lastTargetNode = null;
- }
- }
- /** */
- unifyDragover(res) {
- if (res === false) {
- return false;
- }
- else if (res instanceof Set) {
- return res.size > 0 ? res : false;
- }
- else if (res === true) {
- return new Set(["over", "before", "after"]);
- }
- else if (typeof res === "string" || isArray(res)) {
- res = toSet(res);
- return res.size > 0 ? res : false;
- }
- throw new Error("Unsupported drop region definition: " + res);
- }
- /**
- * Calculates the drop region based on the drag event and the allowed drop regions.
- */
- _calcDropRegion(e, allowed) {
- const dy = e.offsetY;
- if (!allowed) {
- return false;
- }
- else if (allowed.size === 3) {
- return dy < 0.25 * ROW_HEIGHT
- ? "before"
- : dy > 0.75 * ROW_HEIGHT
- ? "after"
- : "over";
- }
- else if (allowed.size === 1 && allowed.has("over")) {
- return "over";
- }
- else {
- // Only 'before' and 'after':
- return dy > ROW_HEIGHT / 2 ? "after" : "before";
- }
- // return "over";
- }
- /**
- * Guess drop effect (copy/link/move) using opinionated conventions.
- *
- * Default: dnd.dropEffectDefault
- */
- _guessDropEffect(e) {
- // const nativeDropEffect = e.dataTransfer?.dropEffect;
- var _a;
- // if (nativeDropEffect && nativeDropEffect !== "none") {
- // return nativeDropEffect;
- // }
- const dndOpts = this.treeOpts.dnd;
- const ea = (_a = dndOpts.effectAllowed) !== null && _a !== void 0 ? _a : "all";
- const canCopy = ["all", "copy", "copyLink", "copyMove"].includes(ea);
- const canLink = ["all", "link", "copyLink", "linkMove"].includes(ea);
- const canMove = ["all", "move", "copyMove", "linkMove"].includes(ea);
- let res = dndOpts.dropEffectDefault;
- if (dndOpts.guessDropEffect) {
- if (isMac) {
- if (e.altKey && canCopy) {
- res = "copy";
- }
- if (e.metaKey && canMove) {
- res = "move"; // command key
- }
- if (e.altKey && e.metaKey && canLink) {
- res = "link";
- }
- }
- else {
- if (e.ctrlKey && canCopy) {
- res = "copy";
- }
- if (e.shiftKey && canMove) {
- res = "move";
- }
- if (e.altKey && canLink) {
- res = "link";
- }
- }
- }
- return res;
- }
- /** Don't allow void operation ('drop on self').*/
- _isVoidDrop(targetNode, srcNode, dropRegion) {
- // this.tree.logDebug(
- // `_isVoidDrop: ${srcNode} -> ${dropRegion} ${targetNode}`
- // );
- // TODO: should be checked on move only
- if (!this.treeOpts.dnd.preventVoidMoves || !srcNode) {
- return false;
- }
- if ((dropRegion === "before" && targetNode === srcNode.getNextSibling()) ||
- (dropRegion === "after" && targetNode === srcNode.getPrevSibling())) {
- // this.tree.logDebug("Prevented before/after self");
- return true;
- }
- // Don't allow dropping nodes on own parent (or self)
- return srcNode === targetNode || srcNode.parent === targetNode;
- }
- /* Implement auto scrolling when drag cursor is in top/bottom area of scroll parent. */
- _applyScrollDir() {
- if (this.isDragging() && this.currentScrollDir) {
- const dndOpts = this.tree.options.dnd;
- const sp = this.tree.element; // scroll parent
- const scrollTop = sp.scrollTop;
- if (this.currentScrollDir < 0) {
- sp.scrollTop = Math.max(0, scrollTop - dndOpts.scrollSpeed);
- }
- else if (this.currentScrollDir > 0) {
- sp.scrollTop = scrollTop + dndOpts.scrollSpeed;
- }
- }
- }
- /* Implement auto scrolling when drag cursor is in top/bottom area of scroll parent. */
- _autoScroll(viewportY) {
- const tree = this.tree;
- const dndOpts = tree.options.dnd;
- const sensitivity = dndOpts.scrollSensitivity;
- const sp = tree.element; // scroll parent
- const headerHeight = tree.headerElement.clientHeight; // May be 0
- // const height = sp.clientHeight - headerHeight;
- // const height = sp.offsetHeight + headerHeight;
- const height = sp.offsetHeight;
- const scrollTop = sp.scrollTop;
- // tree.logDebug(
- // `autoScroll: height=${height}, scrollTop=${scrollTop}, viewportY=${viewportY}`
- // );
- this.currentScrollDir = 0;
- if (scrollTop > 0 &&
- viewportY > 0 &&
- viewportY <= sensitivity + headerHeight) {
- // Mouse in top 20px area: scroll up
- // sp.scrollTop = Math.max(0, scrollTop - dndOpts.scrollSpeed);
- this.currentScrollDir = -1;
- }
- else if (scrollTop < sp.scrollHeight - height &&
- viewportY >= height - sensitivity) {
- // Mouse in bottom 20px area: scroll down
- // sp.scrollTop = scrollTop + dndOpts.scrollSpeed;
- this.currentScrollDir = +1;
- }
- if (this.currentScrollDir) {
- this.applyScrollDirThrottled();
- }
- return sp.scrollTop - scrollTop;
- }
- /** Return true if a drag operation currently in progress. */
- isDragging() {
- return !!this.srcNode;
- }
- /**
- * Handle dragstart, drag and dragend events for the source node.
- */
- onDragEvent(e) {
- var _a;
- // const tree = this.tree;
- const dndOpts = this.treeOpts.dnd;
- const srcNode = Wunderbaum.getNode(e);
- if (!srcNode) {
- this.tree.logWarn(`onDragEvent.${e.type} no node`);
- return;
- }
- if (["dragstart", "dragend"].includes(e.type)) {
- this.tree.logDebug(`onDragEvent.${e.type} srcNode: ${srcNode}`, e);
- }
- // --- dragstart ---
- if (e.type === "dragstart") {
- // Set a default definition of allowed effects
- e.dataTransfer.effectAllowed = dndOpts.effectAllowed; //"copyMove"; // "all";
- if (srcNode.isEditing()) {
- srcNode.logDebug("Prevented dragging node in edit mode.");
- e.preventDefault();
- return false;
- }
- // Let user cancel the drag operation, override effectAllowed, etc.:
- const res = srcNode._callEvent("dnd.dragStart", { event: e });
- if (!res) {
- e.preventDefault();
- return false;
- }
- const nodeData = srcNode.toDict(true, (n) => {
- // We don't want to re-use the key on drop:
- n._orgKey = n.key;
- delete n.key;
- });
- nodeData._treeId = srcNode.tree.id;
- if (dndOpts.serializeClipboardData) {
- if (typeof dndOpts.serializeClipboardData === "function") {
- e.dataTransfer.setData(nodeMimeType, dndOpts.serializeClipboardData(nodeData, srcNode));
- }
- else {
- e.dataTransfer.setData(nodeMimeType, JSON.stringify(nodeData));
- }
- }
- // e.dataTransfer!.setData("text/html", $(node.span).html());
- if (!((_a = e.dataTransfer) === null || _a === void 0 ? void 0 : _a.types.includes("text/plain"))) {
- e.dataTransfer.setData("text/plain", srcNode.title);
- }
- this.srcNode = srcNode;
- setTimeout(() => {
- // Decouple this call, so the CSS is applied to the node, but not to
- // the system generated drag image
- srcNode.setClass("wb-drag-source");
- }, 0);
- // --- drag ---
- }
- else if (e.type === "drag") {
- if (dndOpts.drag) {
- srcNode._callEvent("dnd.drag", { event: e });
- }
- // --- dragend ---
- }
- else if (e.type === "dragend") {
- srcNode.setClass("wb-drag-source", false);
- this.srcNode = null;
- if (this.lastTargetNode) {
- this._leaveNode();
- }
- srcNode._callEvent("dnd.dragEnd", { event: e });
- }
- return true;
- }
- /**
- * Handle dragenter, dragover, dragleave, drop events.
- */
- onDropEvent(e) {
- var _a;
- // const isLink = event.dataTransfer.types.includes("text/uri-list");
- const srcNode = this.srcNode;
- const srcTree = srcNode ? srcNode.tree : null;
- const targetNode = Wunderbaum.getNode(e);
- const dndOpts = this.treeOpts.dnd;
- const dt = e.dataTransfer;
- const dropRegion = this._calcDropRegion(e, this.lastAllowedDropRegions);
- if (!targetNode) {
- this._leaveNode();
- return;
- }
- if (["drop"].includes(e.type)) {
- this.tree.logDebug(`onDropEvent.${e.type} targetNode: ${targetNode}, ea: ${dt === null || dt === void 0 ? void 0 : dt.effectAllowed}, ` +
- `de: ${dt === null || dt === void 0 ? void 0 : dt.dropEffect}, cy: ${e.offsetY}, r: ${dropRegion}, srcNode: ${srcNode}`, e);
- }
- // --- dragenter ---
- if (e.type === "dragenter") {
- this.lastAllowedDropRegions = null;
- // `dragleave` is not reliable with event delegation, so we generate it
- // from dragenter:
- if (this.lastTargetNode && this.lastTargetNode !== targetNode) {
- this._leaveNode();
- }
- this.lastTargetNode = targetNode;
- this.lastEnterStamp = Date.now();
- if (
- // Don't drop on status node:
- targetNode.isStatusNode() ||
- // Prevent dropping nodes from different Wunderbaum trees:
- (dndOpts.preventForeignNodes && targetNode.tree !== srcTree) ||
- // Prevent dropping items on unloaded lazy Wunderbaum tree nodes:
- (dndOpts.preventLazyParents && !targetNode.isLoaded()) ||
- // Prevent dropping items other than Wunderbaum tree nodes:
- (dndOpts.preventNonNodes && !srcNode) ||
- // Prevent dropping nodes on own descendants:
- (dndOpts.preventRecursion && (srcNode === null || srcNode === void 0 ? void 0 : srcNode.isAncestorOf(targetNode))) ||
- // Prevent dropping nodes under same direct parent:
- (dndOpts.preventSameParent &&
- srcNode &&
- targetNode.parent === srcNode.parent) ||
- // Don't allow void operation ('drop on self'): TODO: should be checked on move only
- (dndOpts.preventVoidMoves && targetNode === srcNode)) {
- dt.dropEffect = "none";
- this.tree.log("Prevented drop operation");
- return true; // Prevent drop operation
- }
- // User may return a set of regions (or `false` to prevent drop)
- // Figure out a drop effect (copy/link/move) using opinated conventions.
- dt.dropEffect = this._guessDropEffect(e) || "none";
- let regionSet = targetNode._callEvent("dnd.dragEnter", { event: e });
- //
- regionSet = this.unifyDragover(regionSet);
- if (!regionSet) {
- dt.dropEffect = "none";
- return true; // Prevent drop operation
- }
- this.lastAllowedDropRegions = regionSet;
- this.lastDropEffect = dt.dropEffect;
- targetNode.setClass("wb-drop-target");
- e.preventDefault(); // Allow drop (Drop operation is denied by default)
- return false;
- // --- dragover ---
- }
- else if (e.type === "dragover") {
- const viewportY = e.clientY - this.tree.element.offsetTop;
- this._autoScroll(viewportY);
- dt.dropEffect = this._guessDropEffect(e) || "none";
- targetNode._callEvent("dnd.dragOver", { event: e });
- const region = this._calcDropRegion(e, this.lastAllowedDropRegions);
- this.lastDropRegion = region;
- this.lastDropEffect = dt.dropEffect;
- if (dndOpts.autoExpandMS > 0 &&
- targetNode.isExpandable(true) &&
- !targetNode._isLoading &&
- Date.now() - this.lastEnterStamp > dndOpts.autoExpandMS &&
- targetNode._callEvent("dnd.dragExpand", { event: e }) !== false) {
- targetNode.setExpanded();
- }
- if (!region || this._isVoidDrop(targetNode, srcNode, region)) {
- return; // We already rejected in dragenter
- }
- targetNode.setClass("wb-drop-over", region === "over");
- targetNode.setClass("wb-drop-before", region === "before");
- targetNode.setClass("wb-drop-after", region === "after");
- e.preventDefault(); // Allow drop (Drop operation is denied by default)
- return false;
- // --- dragleave ---
- }
- else if (e.type === "dragleave") {
- // NOTE: we cannot trust this event, since it is always fired,
- // Instead we remove the marker on dragenter
- targetNode._callEvent("dnd.dragLeave", { event: e });
- // --- drop ---
- }
- else if (e.type === "drop") {
- e.stopPropagation(); // prevent browser from opening links?
- e.preventDefault(); // #69 prevent iOS browser from opening links
- this._leaveNode();
- const region = this.lastDropRegion;
- let nodeData = (_a = e.dataTransfer) === null || _a === void 0 ? void 0 : _a.getData(nodeMimeType);
- nodeData = nodeData ? JSON.parse(nodeData) : null;
- const srcNode = this.srcNode;
- const lastDropEffect = this.lastDropEffect;
- setTimeout(() => {
- // Decouple this call, because drop actions may prevent the dragend event
- // from being fired on some browsers
- targetNode._callEvent("dnd.drop", {
- event: e,
- region: region,
- suggestedDropMode: region === "over" ? "appendChild" : region,
- suggestedDropEffect: lastDropEffect,
- // suggestedDropEffect: e.dataTransfer?.dropEffect,
- sourceNode: srcNode,
- sourceNodeData: nodeData,
- });
- }, 10);
- }
- return false;
- }
- }
+ /*!
+ * Wunderbaum - ext-dnd
+ * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */
+ const nodeMimeType = "application/x-wunderbaum-node";
+ class DndExtension extends WunderbaumExtension {
+ constructor(tree) {
+ super(tree, "dnd", {
+ autoExpandMS: 1500,
+ // dropMarkerInsertOffsetX: -16, // Additional offset for drop-marker with hitMode = "before"/"after"
+ // dropMarkerOffsetX: -24, // Absolute position offset for .fancytree-drop-marker relatively to ..fancytree-title (icon/img near a node accepting drop)
+ // #1021 `document.body` is not available yet
+ // dropMarkerParent: "body", // Root Container used for drop marker (could be a shadow root)
+ multiSource: false,
+ effectAllowed: "all",
+ dropEffectDefault: "move",
+ guessDropEffect: true,
+ preventForeignNodes: false,
+ preventLazyParents: true,
+ preventNonNodes: false,
+ preventRecursion: true,
+ preventSameParent: false,
+ preventVoidMoves: true,
+ serializeClipboardData: true,
+ scroll: true,
+ scrollSensitivity: 20,
+ // scrollnterval: 50, // Generate event every 50 ms
+ scrollSpeed: 5,
+ // setTextTypeJson: false, // Allow dragging of nodes to different IE windows
+ sourceCopyHook: null,
+ // Events (drag support)
+ dragStart: null,
+ drag: null,
+ dragEnd: null,
+ // Events (drop support)
+ dragEnter: null,
+ dragOver: null,
+ dragExpand: null,
+ drop: null,
+ dragLeave: null, // Callback(targetNode, data)
+ });
+ // public dropMarkerElem?: HTMLElement;
+ this.srcNode = null;
+ this.lastTargetNode = null;
+ this.lastEnterStamp = 0;
+ this.lastAllowedDropRegions = null;
+ this.lastDropEffect = null;
+ this.lastDropRegion = false;
+ this.currentScrollDir = 0;
+ this.applyScrollDirThrottled = throttle(this._applyScrollDir, 50);
+ }
+ init() {
+ super.init();
+ // Store the current scroll parent, which may be the tree
+ // container, any enclosing div, or the document.
+ // #761: scrollParent() always needs a container child
+ // $temp = $("").appendTo(this.$container);
+ // this.$scrollParent = $temp.scrollParent();
+ // $temp.remove();
+ const tree = this.tree;
+ const dndOpts = tree.options.dnd;
+ // Enable drag support if dragStart() is specified:
+ if (dndOpts.dragStart) {
+ onEvent(tree.element, "dragstart drag dragend", this.onDragEvent.bind(this));
+ }
+ // Enable drop support if dragEnter() is specified:
+ if (dndOpts.dragEnter) {
+ onEvent(tree.element, "dragenter dragover dragleave drop", this.onDropEvent.bind(this));
+ }
+ }
+ /** Cleanup classes after target node is no longer hovered. */
+ _leaveNode() {
+ // We remove the marker on dragenter from the previous target:
+ const ltn = this.lastTargetNode;
+ this.lastEnterStamp = 0;
+ if (ltn) {
+ ltn.setClass("wb-drop-target wb-drop-over wb-drop-after wb-drop-before", false);
+ this.lastTargetNode = null;
+ }
+ }
+ /** */
+ unifyDragover(res) {
+ if (res === false) {
+ return false;
+ }
+ else if (res instanceof Set) {
+ return res.size > 0 ? res : false;
+ }
+ else if (res === true) {
+ return new Set(["over", "before", "after"]);
+ }
+ else if (typeof res === "string" || isArray(res)) {
+ res = toSet(res);
+ return res.size > 0 ? res : false;
+ }
+ throw new Error("Unsupported drop region definition: " + res);
+ }
+ /**
+ * Calculates the drop region based on the drag event and the allowed drop regions.
+ */
+ _calcDropRegion(e, allowed) {
+ const dy = e.offsetY;
+ if (!allowed) {
+ return false;
+ }
+ else if (allowed.size === 3) {
+ return dy < 0.25 * ROW_HEIGHT
+ ? "before"
+ : dy > 0.75 * ROW_HEIGHT
+ ? "after"
+ : "over";
+ }
+ else if (allowed.size === 1 && allowed.has("over")) {
+ return "over";
+ }
+ else {
+ // Only 'before' and 'after':
+ return dy > ROW_HEIGHT / 2 ? "after" : "before";
+ }
+ // return "over";
+ }
+ /**
+ * Guess drop effect (copy/link/move) using opinionated conventions.
+ *
+ * Default: dnd.dropEffectDefault
+ */
+ _guessDropEffect(e) {
+ // const nativeDropEffect = e.dataTransfer?.dropEffect;
+ var _a;
+ // if (nativeDropEffect && nativeDropEffect !== "none") {
+ // return nativeDropEffect;
+ // }
+ const dndOpts = this.treeOpts.dnd;
+ const ea = (_a = dndOpts.effectAllowed) !== null && _a !== void 0 ? _a : "all";
+ const canCopy = ["all", "copy", "copyLink", "copyMove"].includes(ea);
+ const canLink = ["all", "link", "copyLink", "linkMove"].includes(ea);
+ const canMove = ["all", "move", "copyMove", "linkMove"].includes(ea);
+ let res = dndOpts.dropEffectDefault;
+ if (dndOpts.guessDropEffect) {
+ if (isMac) {
+ if (e.altKey && canCopy) {
+ res = "copy";
+ }
+ if (e.metaKey && canMove) {
+ res = "move"; // command key
+ }
+ if (e.altKey && e.metaKey && canLink) {
+ res = "link";
+ }
+ }
+ else {
+ if (e.ctrlKey && canCopy) {
+ res = "copy";
+ }
+ if (e.shiftKey && canMove) {
+ res = "move";
+ }
+ if (e.altKey && canLink) {
+ res = "link";
+ }
+ }
+ }
+ return res;
+ }
+ /** Don't allow void operation ('drop on self').*/
+ _isVoidDrop(targetNode, srcNode, dropRegion) {
+ // this.tree.logDebug(
+ // `_isVoidDrop: ${srcNode} -> ${dropRegion} ${targetNode}`
+ // );
+ // TODO: should be checked on move only
+ if (!this.treeOpts.dnd.preventVoidMoves || !srcNode) {
+ return false;
+ }
+ if ((dropRegion === "before" && targetNode === srcNode.getNextSibling()) ||
+ (dropRegion === "after" && targetNode === srcNode.getPrevSibling())) {
+ // this.tree.logDebug("Prevented before/after self");
+ return true;
+ }
+ // Don't allow dropping nodes on own parent (or self)
+ return srcNode === targetNode || srcNode.parent === targetNode;
+ }
+ /* Implement auto scrolling when drag cursor is in top/bottom area of scroll parent. */
+ _applyScrollDir() {
+ if (this.isDragging() && this.currentScrollDir) {
+ const dndOpts = this.tree.options.dnd;
+ const sp = this.tree.element; // scroll parent
+ const scrollTop = sp.scrollTop;
+ if (this.currentScrollDir < 0) {
+ sp.scrollTop = Math.max(0, scrollTop - dndOpts.scrollSpeed);
+ }
+ else if (this.currentScrollDir > 0) {
+ sp.scrollTop = scrollTop + dndOpts.scrollSpeed;
+ }
+ }
+ }
+ /* Implement auto scrolling when drag cursor is in top/bottom area of scroll parent. */
+ _autoScroll(viewportY) {
+ const tree = this.tree;
+ const dndOpts = tree.options.dnd;
+ const sensitivity = dndOpts.scrollSensitivity;
+ const sp = tree.element; // scroll parent
+ const headerHeight = tree.headerElement.clientHeight; // May be 0
+ // const height = sp.clientHeight - headerHeight;
+ // const height = sp.offsetHeight + headerHeight;
+ const height = sp.offsetHeight;
+ const scrollTop = sp.scrollTop;
+ // tree.logDebug(
+ // `autoScroll: height=${height}, scrollTop=${scrollTop}, viewportY=${viewportY}`
+ // );
+ this.currentScrollDir = 0;
+ if (scrollTop > 0 &&
+ viewportY > 0 &&
+ viewportY <= sensitivity + headerHeight) {
+ // Mouse in top 20px area: scroll up
+ // sp.scrollTop = Math.max(0, scrollTop - dndOpts.scrollSpeed);
+ this.currentScrollDir = -1;
+ }
+ else if (scrollTop < sp.scrollHeight - height &&
+ viewportY >= height - sensitivity) {
+ // Mouse in bottom 20px area: scroll down
+ // sp.scrollTop = scrollTop + dndOpts.scrollSpeed;
+ this.currentScrollDir = +1;
+ }
+ if (this.currentScrollDir) {
+ this.applyScrollDirThrottled();
+ }
+ return sp.scrollTop - scrollTop;
+ }
+ /** Return true if a drag operation currently in progress. */
+ isDragging() {
+ return !!this.srcNode;
+ }
+ /**
+ * Handle dragstart, drag and dragend events for the source node.
+ */
+ onDragEvent(e) {
+ var _a;
+ // const tree = this.tree;
+ const dndOpts = this.treeOpts.dnd;
+ const srcNode = Wunderbaum.getNode(e);
+ if (!srcNode) {
+ this.tree.logWarn(`onDragEvent.${e.type} no node`);
+ return;
+ }
+ if (["dragstart", "dragend"].includes(e.type)) {
+ this.tree.logDebug(`onDragEvent.${e.type} srcNode: ${srcNode}`, e);
+ }
+ // --- dragstart ---
+ if (e.type === "dragstart") {
+ // Set a default definition of allowed effects
+ e.dataTransfer.effectAllowed = dndOpts.effectAllowed; //"copyMove"; // "all";
+ if (srcNode.isEditingTitle()) {
+ srcNode.logDebug("Prevented dragging node in edit mode.");
+ e.preventDefault();
+ return false;
+ }
+ // Let user cancel the drag operation, override effectAllowed, etc.:
+ const res = srcNode._callEvent("dnd.dragStart", { event: e });
+ if (!res) {
+ e.preventDefault();
+ return false;
+ }
+ const nodeData = srcNode.toDict(true, (n) => {
+ // We don't want to re-use the key on drop:
+ n._orgKey = n.key;
+ delete n.key;
+ });
+ nodeData._treeId = srcNode.tree.id;
+ if (dndOpts.serializeClipboardData) {
+ if (typeof dndOpts.serializeClipboardData === "function") {
+ e.dataTransfer.setData(nodeMimeType, dndOpts.serializeClipboardData(nodeData, srcNode));
+ }
+ else {
+ e.dataTransfer.setData(nodeMimeType, JSON.stringify(nodeData));
+ }
+ }
+ // e.dataTransfer!.setData("text/html", $(node.span).html());
+ if (!((_a = e.dataTransfer) === null || _a === void 0 ? void 0 : _a.types.includes("text/plain"))) {
+ e.dataTransfer.setData("text/plain", srcNode.title);
+ }
+ this.srcNode = srcNode;
+ setTimeout(() => {
+ // Decouple this call, so the CSS is applied to the node, but not to
+ // the system generated drag image
+ srcNode.setClass("wb-drag-source");
+ }, 0);
+ // --- drag ---
+ }
+ else if (e.type === "drag") {
+ if (dndOpts.drag) {
+ srcNode._callEvent("dnd.drag", { event: e });
+ }
+ // --- dragend ---
+ }
+ else if (e.type === "dragend") {
+ srcNode.setClass("wb-drag-source", false);
+ this.srcNode = null;
+ if (this.lastTargetNode) {
+ this._leaveNode();
+ }
+ srcNode._callEvent("dnd.dragEnd", { event: e });
+ }
+ return true;
+ }
+ /**
+ * Handle dragenter, dragover, dragleave, drop events.
+ */
+ onDropEvent(e) {
+ var _a;
+ // const isLink = event.dataTransfer.types.includes("text/uri-list");
+ const srcNode = this.srcNode;
+ const srcTree = srcNode ? srcNode.tree : null;
+ const targetNode = Wunderbaum.getNode(e);
+ const dndOpts = this.treeOpts.dnd;
+ const dt = e.dataTransfer;
+ const dropRegion = this._calcDropRegion(e, this.lastAllowedDropRegions);
+ if (!targetNode) {
+ this._leaveNode();
+ return;
+ }
+ if (["drop"].includes(e.type)) {
+ this.tree.logDebug(`onDropEvent.${e.type} targetNode: ${targetNode}, ea: ${dt === null || dt === void 0 ? void 0 : dt.effectAllowed}, ` +
+ `de: ${dt === null || dt === void 0 ? void 0 : dt.dropEffect}, cy: ${e.offsetY}, r: ${dropRegion}, srcNode: ${srcNode}`, e);
+ }
+ // --- dragenter ---
+ if (e.type === "dragenter") {
+ this.lastAllowedDropRegions = null;
+ // `dragleave` is not reliable with event delegation, so we generate it
+ // from dragenter:
+ if (this.lastTargetNode && this.lastTargetNode !== targetNode) {
+ this._leaveNode();
+ }
+ this.lastTargetNode = targetNode;
+ this.lastEnterStamp = Date.now();
+ if (
+ // Don't drop on status node:
+ targetNode.isStatusNode() ||
+ // Prevent dropping nodes from different Wunderbaum trees:
+ (dndOpts.preventForeignNodes && targetNode.tree !== srcTree) ||
+ // Prevent dropping items on unloaded lazy Wunderbaum tree nodes:
+ (dndOpts.preventLazyParents && !targetNode.isLoaded()) ||
+ // Prevent dropping items other than Wunderbaum tree nodes:
+ (dndOpts.preventNonNodes && !srcNode) ||
+ // Prevent dropping nodes on own descendants:
+ (dndOpts.preventRecursion && (srcNode === null || srcNode === void 0 ? void 0 : srcNode.isAncestorOf(targetNode))) ||
+ // Prevent dropping nodes under same direct parent:
+ (dndOpts.preventSameParent &&
+ srcNode &&
+ targetNode.parent === srcNode.parent) ||
+ // Don't allow void operation ('drop on self'): TODO: should be checked on move only
+ (dndOpts.preventVoidMoves && targetNode === srcNode)) {
+ dt.dropEffect = "none";
+ this.tree.log("Prevented drop operation");
+ return true; // Prevent drop operation
+ }
+ // User may return a set of regions (or `false` to prevent drop)
+ // Figure out a drop effect (copy/link/move) using opinated conventions.
+ dt.dropEffect = this._guessDropEffect(e) || "none";
+ let regionSet = targetNode._callEvent("dnd.dragEnter", { event: e });
+ //
+ regionSet = this.unifyDragover(regionSet);
+ if (!regionSet) {
+ dt.dropEffect = "none";
+ return true; // Prevent drop operation
+ }
+ this.lastAllowedDropRegions = regionSet;
+ this.lastDropEffect = dt.dropEffect;
+ targetNode.setClass("wb-drop-target");
+ e.preventDefault(); // Allow drop (Drop operation is denied by default)
+ return false;
+ // --- dragover ---
+ }
+ else if (e.type === "dragover") {
+ const viewportY = e.clientY - this.tree.element.offsetTop;
+ this._autoScroll(viewportY);
+ dt.dropEffect = this._guessDropEffect(e) || "none";
+ targetNode._callEvent("dnd.dragOver", { event: e });
+ const region = this._calcDropRegion(e, this.lastAllowedDropRegions);
+ this.lastDropRegion = region;
+ this.lastDropEffect = dt.dropEffect;
+ if (dndOpts.autoExpandMS > 0 &&
+ targetNode.isExpandable(true) &&
+ !targetNode._isLoading &&
+ Date.now() - this.lastEnterStamp > dndOpts.autoExpandMS &&
+ targetNode._callEvent("dnd.dragExpand", { event: e }) !== false) {
+ targetNode.setExpanded();
+ }
+ if (!region || this._isVoidDrop(targetNode, srcNode, region)) {
+ return; // We already rejected in dragenter
+ }
+ targetNode.setClass("wb-drop-over", region === "over");
+ targetNode.setClass("wb-drop-before", region === "before");
+ targetNode.setClass("wb-drop-after", region === "after");
+ e.preventDefault(); // Allow drop (Drop operation is denied by default)
+ return false;
+ // --- dragleave ---
+ }
+ else if (e.type === "dragleave") {
+ // NOTE: we cannot trust this event, since it is always fired,
+ // Instead we remove the marker on dragenter
+ targetNode._callEvent("dnd.dragLeave", { event: e });
+ // --- drop ---
+ }
+ else if (e.type === "drop") {
+ e.stopPropagation(); // prevent browser from opening links?
+ e.preventDefault(); // #69 prevent iOS browser from opening links
+ this._leaveNode();
+ const region = this.lastDropRegion;
+ let nodeData = (_a = e.dataTransfer) === null || _a === void 0 ? void 0 : _a.getData(nodeMimeType);
+ nodeData = nodeData ? JSON.parse(nodeData) : null;
+ const srcNode = this.srcNode;
+ const lastDropEffect = this.lastDropEffect;
+ setTimeout(() => {
+ // Decouple this call, because drop actions may prevent the dragend event
+ // from being fired on some browsers
+ targetNode._callEvent("dnd.drop", {
+ event: e,
+ region: region,
+ suggestedDropMode: region === "over" ? "appendChild" : region,
+ suggestedDropEffect: lastDropEffect,
+ // suggestedDropEffect: e.dataTransfer?.dropEffect,
+ sourceNode: srcNode,
+ sourceNodeData: nodeData,
+ });
+ }, 10);
+ }
+ return false;
+ }
+ }
- /*!
- * Wunderbaum - drag_observer
- * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */
- /**
- * Convert mouse- and touch events to 'dragstart', 'drag', and 'dragstop'.
- */
- class DragObserver {
- constructor(opts) {
- this.start = {
- x: 0,
- y: 0,
- altKey: false,
- ctrlKey: false,
- metaKey: false,
- shiftKey: false,
- };
- this.dragElem = null;
- this.dragging = false;
- // TODO: touch events
- this.events = ["mousedown", "mouseup", "mousemove", "keydown"];
- if (!opts.root) {
- throw new Error("Missing `root` option.");
- }
- this.opts = Object.assign({ thresh: 5 }, opts);
- this.root = opts.root;
- this._handler = this.handleEvent.bind(this);
- this.events.forEach((type) => {
- this.root.addEventListener(type, this._handler);
- });
- }
- /** Unregister all event listeners. */
- disconnect() {
- this.events.forEach((type) => {
- this.root.removeEventListener(type, this._handler);
- });
- }
- getDragElem() {
- return this.dragElem;
- }
- isDragging() {
- return this.dragging;
- }
- stopDrag(cb_event) {
- if (this.dragging && this.opts.dragstop && cb_event) {
- cb_event.type = "dragstop";
- this.opts.dragstop(cb_event);
- }
- this.dragElem = null;
- this.dragging = false;
- }
- handleEvent(e) {
- const type = e.type;
- const opts = this.opts;
- const cb_event = {
- type: e.type,
- event: e,
- dragElem: this.dragElem,
- dx: e.pageX - this.start.x,
- dy: e.pageY - this.start.y,
- apply: undefined,
- };
- switch (type) {
- case "keydown":
- this.stopDrag(cb_event);
- break;
- case "mousedown":
- if (this.dragElem) {
- this.stopDrag(cb_event);
- break;
- }
- if (opts.selector) {
- let elem = e.target;
- if (elem.matches(opts.selector)) {
- this.dragElem = elem;
- }
- else {
- elem = elem.closest(opts.selector);
- if (elem) {
- this.dragElem = elem;
- }
- else {
- break; // no event delegation selector matched
- }
- }
- }
- this.start.x = e.pageX;
- this.start.y = e.pageY;
- this.start.altKey = e.altKey;
- this.start.ctrlKey = e.ctrlKey;
- this.start.metaKey = e.metaKey;
- this.start.shiftKey = e.shiftKey;
- break;
- case "mousemove":
- // TODO: debounce/throttle?
- // TODO: horizontal mode: ignore if dx unchanged
- if (!this.dragElem) {
- break;
- }
- if (!this.dragging) {
- if (opts.thresh) {
- const dist2 = cb_event.dx * cb_event.dx + cb_event.dy * cb_event.dy;
- if (dist2 < opts.thresh * opts.thresh) {
- break;
- }
- }
- cb_event.type = "dragstart";
- if (opts.dragstart(cb_event) === false) {
- this.stopDrag(cb_event);
- break;
- }
- this.dragging = true;
- }
- if (this.dragging && this.opts.drag) {
- cb_event.type = "drag";
- this.opts.drag(cb_event);
- }
- break;
- case "mouseup":
- if (!this.dragging) {
- this.stopDrag(cb_event);
- break;
- }
- if (e.button === 0) {
- cb_event.apply = true;
- }
- else {
- cb_event.apply = false;
- }
- this.stopDrag(cb_event);
- break;
- }
- }
- }
+ /*!
+ * Wunderbaum - drag_observer
+ * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */
+ /**
+ * Convert mouse- and touch events to 'dragstart', 'drag', and 'dragstop'.
+ */
+ class DragObserver {
+ constructor(opts) {
+ this.start = {
+ x: 0,
+ y: 0,
+ altKey: false,
+ ctrlKey: false,
+ metaKey: false,
+ shiftKey: false,
+ };
+ this.dragElem = null;
+ this.dragging = false;
+ // TODO: touch events
+ this.events = ["mousedown", "mouseup", "mousemove", "keydown"];
+ if (!opts.root) {
+ throw new Error("Missing `root` option.");
+ }
+ this.opts = Object.assign({ thresh: 5 }, opts);
+ this.root = opts.root;
+ this._handler = this.handleEvent.bind(this);
+ this.events.forEach((type) => {
+ this.root.addEventListener(type, this._handler);
+ });
+ }
+ /** Unregister all event listeners. */
+ disconnect() {
+ this.events.forEach((type) => {
+ this.root.removeEventListener(type, this._handler);
+ });
+ }
+ getDragElem() {
+ return this.dragElem;
+ }
+ isDragging() {
+ return this.dragging;
+ }
+ stopDrag(cb_event) {
+ if (this.dragging && this.opts.dragstop && cb_event) {
+ cb_event.type = "dragstop";
+ this.opts.dragstop(cb_event);
+ }
+ this.dragElem = null;
+ this.dragging = false;
+ }
+ handleEvent(e) {
+ const type = e.type;
+ const opts = this.opts;
+ const cb_event = {
+ type: e.type,
+ event: e,
+ dragElem: this.dragElem,
+ dx: e.pageX - this.start.x,
+ dy: e.pageY - this.start.y,
+ apply: undefined,
+ };
+ switch (type) {
+ case "keydown":
+ this.stopDrag(cb_event);
+ break;
+ case "mousedown":
+ if (this.dragElem) {
+ this.stopDrag(cb_event);
+ break;
+ }
+ if (opts.selector) {
+ let elem = e.target;
+ if (elem.matches(opts.selector)) {
+ this.dragElem = elem;
+ }
+ else {
+ elem = elem.closest(opts.selector);
+ if (elem) {
+ this.dragElem = elem;
+ }
+ else {
+ break; // no event delegation selector matched
+ }
+ }
+ }
+ this.start.x = e.pageX;
+ this.start.y = e.pageY;
+ this.start.altKey = e.altKey;
+ this.start.ctrlKey = e.ctrlKey;
+ this.start.metaKey = e.metaKey;
+ this.start.shiftKey = e.shiftKey;
+ break;
+ case "mousemove":
+ // TODO: debounce/throttle?
+ // TODO: horizontal mode: ignore if dx unchanged
+ if (!this.dragElem) {
+ break;
+ }
+ if (!this.dragging) {
+ if (opts.thresh) {
+ const dist2 = cb_event.dx * cb_event.dx + cb_event.dy * cb_event.dy;
+ if (dist2 < opts.thresh * opts.thresh) {
+ break;
+ }
+ }
+ cb_event.type = "dragstart";
+ if (opts.dragstart(cb_event) === false) {
+ this.stopDrag(cb_event);
+ break;
+ }
+ this.dragging = true;
+ }
+ if (this.dragging && this.opts.drag) {
+ cb_event.type = "drag";
+ this.opts.drag(cb_event);
+ }
+ break;
+ case "mouseup":
+ if (!this.dragging) {
+ this.stopDrag(cb_event);
+ break;
+ }
+ if (e.button === 0) {
+ cb_event.apply = true;
+ }
+ else {
+ cb_event.apply = false;
+ }
+ this.stopDrag(cb_event);
+ break;
+ }
+ }
+ }
- /*!
- * Wunderbaum - ext-grid
- * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */
- class GridExtension extends WunderbaumExtension {
- constructor(tree) {
- super(tree, "grid", {
- // throttle: 200,
- });
- this.observer = new DragObserver({
- root: window.document,
- selector: "span.wb-col-resizer",
- thresh: 4,
- // throttle: 400,
- dragstart: (e) => {
- return this.tree.element.contains(e.dragElem);
- },
- drag: (e) => {
- // TODO: throttle
- return this.handleDrag(e);
- },
- dragstop: (e) => {
- return this.handleDrag(e);
- },
- });
- }
- init() {
- super.init();
- }
- handleDrag(e) {
- const info = Wunderbaum.getEventInfo(e.event);
- // this.tree.options.
- this.tree.log(`${e.type}(${e.dx})`, e, info);
- }
- }
+ /*!
+ * Wunderbaum - ext-grid
+ * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */
+ class GridExtension extends WunderbaumExtension {
+ constructor(tree) {
+ super(tree, "grid", {
+ // throttle: 200,
+ });
+ this.observer = new DragObserver({
+ root: window.document,
+ selector: "span.wb-col-resizer",
+ thresh: 4,
+ // throttle: 400,
+ dragstart: (e) => {
+ return this.tree.element.contains(e.dragElem);
+ },
+ drag: (e) => {
+ // TODO: throttle
+ return this.handleDrag(e);
+ },
+ dragstop: (e) => {
+ return this.handleDrag(e);
+ },
+ });
+ }
+ init() {
+ super.init();
+ }
+ handleDrag(e) {
+ const info = Wunderbaum.getEventInfo(e.event);
+ // this.tree.options.
+ this.tree.log(`${e.type}(${e.dx})`, e, info);
+ }
+ }
- /*!
- * Wunderbaum - deferred
- * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */
- /**
- * Implement a ES6 Promise, that exposes a resolve() and reject() method.
- *
- * Loosely mimics {@link https://api.jquery.com/category/deferred-object/ | jQuery.Deferred}.
- * Example:
- * ```js
- * function foo() {
- * let dfd = new Deferred(),
- * ...
- * dfd.resolve('foo')
- * ...
- * return dfd.promise();
- * }
- * ```
- */
- class Deferred {
- constructor() {
- this._promise = new Promise((resolve, reject) => {
- this._resolve = resolve;
- this._reject = reject;
- });
- }
- /** Resolve the [[Promise]]. */
- resolve(value) {
- this._resolve(value);
- }
- /** Reject the [[Promise]]. */
- reject(reason) {
- this._reject(reason);
- }
- /** Return the native [[Promise]] instance.*/
- promise() {
- return this._promise;
- }
- /** Call [[Promise.then]] on the embedded promise instance.*/
- then(cb) {
- return this._promise.then(cb);
- }
- /** Call [[Promise.catch]] on the embedded promise instance.*/
- catch(cb) {
- return this._promise.catch(cb);
- }
- /** Call [[Promise.finally]] on the embedded promise instance.*/
- finally(cb) {
- return this._promise.finally(cb);
- }
- }
+ /*!
+ * Wunderbaum - deferred
+ * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */
+ /**
+ * Implement a ES6 Promise, that exposes a resolve() and reject() method.
+ *
+ * Loosely mimics {@link https://api.jquery.com/category/deferred-object/ | jQuery.Deferred}.
+ * Example:
+ * ```js
+ * function foo() {
+ * let dfd = new Deferred(),
+ * ...
+ * dfd.resolve('foo')
+ * ...
+ * return dfd.promise();
+ * }
+ * ```
+ */
+ class Deferred {
+ constructor() {
+ this._promise = new Promise((resolve, reject) => {
+ this._resolve = resolve;
+ this._reject = reject;
+ });
+ }
+ /** Resolve the Promise. */
+ resolve(value) {
+ this._resolve(value);
+ }
+ /** Reject the Promise. */
+ reject(reason) {
+ this._reject(reason);
+ }
+ /** Return the native Promise instance.*/
+ promise() {
+ return this._promise;
+ }
+ /** Call Promise.then on the embedded promise instance.*/
+ then(cb) {
+ return this._promise.then(cb);
+ }
+ /** Call Promise.catch on the embedded promise instance.*/
+ catch(cb) {
+ return this._promise.catch(cb);
+ }
+ /** Call Promise.finally on the embedded promise instance.*/
+ finally(cb) {
+ return this._promise.finally(cb);
+ }
+ }
- /*!
- * Wunderbaum - wunderbaum_node
- * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */
- /** WunderbaumNode properties that can be passed with source data.
- * (Any other source properties will be stored as `node.data.PROP`.)
- */
- const NODE_PROPS = new Set([
- "checkbox",
- "classes",
- "expanded",
- "icon",
- "iconTooltip",
- "key",
- "lazy",
- "_partsel",
- "radiogroup",
- "refKey",
- "selected",
- "statusNodeType",
- "title",
- "tooltip",
- "type",
- "unselectable",
- ]);
- /** WunderbaumNode properties that will be returned by `node.toDict()`.)
- */
- const NODE_DICT_PROPS = new Set(NODE_PROPS);
- NODE_DICT_PROPS.delete("_partsel");
- NODE_DICT_PROPS.delete("unselectable");
- /**
- * A single tree node.
- *
- * **NOTE:**
- * Generally you should not modify properties directly, since this may break
- * the internal bookkeeping.
- */
- class WunderbaumNode {
- constructor(tree, parent, data) {
- var _a, _b;
- /** Reference key. Unlike {@link key}, a `refKey` may occur multiple
- * times within a tree (in this case we have 'clone nodes').
- * @see Use {@link setKey} to modify.
- */
- this.refKey = undefined;
- this.children = null;
- /** Additional classes added to `div.wb-row`.
- * @see {@link hasClass}, {@link setClass}. */
- this.classes = null; //new Set();
- /** Custom data that was passed to the constructor */
- this.data = {};
- this._isLoading = false;
- this._requestId = 0;
- this._errorInfo = null;
- this._partsel = false;
- this._partload = false;
- this.subMatchCount = 0;
- this._rowIdx = 0;
- this._rowElem = undefined;
- assert(!parent || parent.tree === tree, `Invalid parent: ${parent}`);
- assert(!data.children, "'children' not allowed here");
- this.tree = tree;
- this.parent = parent;
- this.key = "" + ((_a = data.key) !== null && _a !== void 0 ? _a : ++WunderbaumNode.sequence);
- this.title = "" + ((_b = data.title) !== null && _b !== void 0 ? _b : "<" + this.key + ">");
- data.refKey != null ? (this.refKey = "" + data.refKey) : 0;
- data.type != null ? (this.type = "" + data.type) : 0;
- this.expanded = data.expanded === true;
- data.icon != null ? (this.icon = data.icon) : 0;
- this.lazy = data.lazy === true;
- data.statusNodeType != null
- ? (this.statusNodeType = ("" + data.statusNodeType))
- : 0;
- data.colspan != null ? (this.colspan = !!data.colspan) : 0;
- // Selection
- data.checkbox != null ? (this.checkbox = !!data.checkbox) : 0;
- data.radiogroup != null ? (this.radiogroup = !!data.radiogroup) : 0;
- this.selected = data.selected === true;
- data.unselectable === true ? (this.unselectable = true) : 0;
- if (data.classes) {
- this.setClass(data.classes);
- }
- // Store custom fields as `node.data`
- for (const [key, value] of Object.entries(data)) {
- if (!NODE_PROPS.has(key)) {
- this.data[key] = value;
- }
- }
- if (parent && !this.statusNodeType) {
- // Don't register root node or status nodes
- tree._registerNode(this);
- }
- }
- /**
- * Return readable string representation for this instance.
- * @internal
- */
- toString() {
- return `WunderbaumNode@${this.key}<'${this.title}'>`;
- }
- /**
- * Iterate all descendant nodes depth-first, pre-order using `for ... of ...` syntax.
- * More concise, but slightly slower than {@link WunderbaumNode.visit}.
- *
- * Example:
- * ```js
- * for(const n of node) {
- * ...
- * }
- * ```
- */
- *[Symbol.iterator]() {
- // let node: WunderbaumNode | null = this;
- const cl = this.children;
- if (cl) {
- for (let i = 0, l = cl.length; i < l; i++) {
- const n = cl[i];
- yield n;
- if (n.children) {
- yield* n;
- }
- }
- // Slower:
- // for (let node of this.children) {
- // yield node;
- // yield* node : 0;
- // }
- }
- }
- // /** Return an option value. */
- // protected _getOpt(
- // name: string,
- // nodeObject: any = null,
- // treeOptions: any = null,
- // defaultValue: any = null
- // ): any {
- // return evalOption(
- // name,
- // this,
- // nodeObject || this,
- // treeOptions || this.tree.options,
- // defaultValue
- // );
- // }
- /** Call event handler if defined in tree.options.
- * Example:
- * ```js
- * node._callEvent("edit.beforeEdit", {foo: 42})
- * ```
- */
- _callEvent(type, extra) {
- return this.tree._callEvent(type, extend({
- node: this,
- typeInfo: this.type ? this.tree.types[this.type] : {},
- }, extra));
- }
- /**
- * Append (or insert) a list of child nodes.
- *
- * Tip: pass `{ before: 0 }` to prepend new nodes as first children.
- *
- * @returns first child added
- */
- addChildren(nodeData, options) {
- const tree = this.tree;
- let { before = null, applyMinExpanLevel = true, _level } = options !== null && options !== void 0 ? options : {};
- // let { before, loadLazy=true, _level } = options ?? {};
- // const isTopCall = _level == null;
- _level !== null && _level !== void 0 ? _level : (_level = this.getLevel());
- const nodeList = [];
- try {
- tree.enableUpdate(false);
- if (isPlainObject(nodeData)) {
- nodeData = [nodeData];
- }
- const forceExpand = applyMinExpanLevel && _level < tree.options.minExpandLevel;
- for (const child of nodeData) {
- const subChildren = child.children;
- delete child.children;
- const n = new WunderbaumNode(tree, this, child);
- if (forceExpand && !n.isUnloaded()) {
- n.expanded = true;
- }
- nodeList.push(n);
- if (subChildren) {
- n.addChildren(subChildren, { _level: _level + 1 });
- }
- }
- if (!this.children) {
- this.children = nodeList;
- }
- else if (before == null || this.children.length === 0) {
- this.children = this.children.concat(nodeList);
- }
- else {
- // Returns null if before is not a direct child:
- before = this.findDirectChild(before);
- const pos = this.children.indexOf(before);
- assert(pos >= 0, `options.before must be a direct child of ${this}`);
- // insert nodeList after children[pos]
- this.children.splice(pos, 0, ...nodeList);
- }
- // this.triggerModifyChild("add", nodeList.length === 1 ? nodeList[0] : null);
- tree.update(ChangeType.structure);
- }
- finally {
- // if (tree.options.selectMode === "hier") {
- // if (this.parent && this.parent.children) {
- // this.fixSelection3FromEndNodes();
- // } else {
- // // may happen when loading __root__;
- // }
- // }
- tree.enableUpdate(true);
- }
- // if(isTopCall && loadLazy){
- // this.logWarn("addChildren(): loadLazy is not yet implemented.")
- // }
- return nodeList[0];
- }
- /**
- * Append or prepend a node, or append a child node.
- *
- * This a convenience function that calls addChildren()
- *
- * @param nodeData node definition
- * @param [mode=child] 'before', 'after', 'firstChild', or 'child' ('over' is a synonym for 'child')
- * @returns new node
- */
- addNode(nodeData, mode = "appendChild") {
- if (mode === "over") {
- mode = "appendChild"; // compatible with drop region
- }
- switch (mode) {
- case "after":
- return this.parent.addChildren(nodeData, {
- before: this.getNextSibling(),
- });
- case "before":
- return this.parent.addChildren(nodeData, { before: this });
- case "prependChild":
- // Insert before the first child if any
- // let insertBefore = this.children ? this.children[0] : undefined;
- return this.addChildren(nodeData, { before: 0 });
- case "appendChild":
- return this.addChildren(nodeData);
- }
- assert(false, `Invalid mode: ${mode}`);
- return undefined;
- }
- /**
- * Apply a modification (or navigation) operation.
- *
- * @see {@link Wunderbaum.applyCommand}
- */
- applyCommand(cmd, options) {
- return this.tree.applyCommand(cmd, this, options);
- }
- /**
- * Collapse all expanded sibling nodes if any.
- * (Automatically called when `autoCollapse` is true.)
- */
- collapseSiblings(options) {
- for (const node of this.parent.children) {
- if (node !== this && node.expanded) {
- node.setExpanded(false, options);
- }
- }
- }
- /**
- * Add/remove one or more classes to ``.
- *
- * This also maintains `node.classes`, so the class will survive a re-render.
- *
- * @param className one or more class names. Multiple classes can be passed
- * as space-separated string, array of strings, or set of strings.
- */
- setClass(className, flag = true) {
- const cnSet = toSet(className);
- if (flag) {
- if (this.classes === null) {
- this.classes = new Set();
- }
- cnSet.forEach((cn) => {
- var _a;
- this.classes.add(cn);
- (_a = this._rowElem) === null || _a === void 0 ? void 0 : _a.classList.toggle(cn, flag);
- });
- }
- else {
- if (this.classes === null) {
- return;
- }
- cnSet.forEach((cn) => {
- var _a;
- this.classes.delete(cn);
- (_a = this._rowElem) === null || _a === void 0 ? void 0 : _a.classList.toggle(cn, flag);
- });
- if (this.classes.size === 0) {
- this.classes = null;
- }
- }
- }
- /** Call `setExpanded()` on all descendant nodes. */
- async expandAll(flag = true, options) {
- const tree = this.tree;
- const minExpandLevel = this.tree.options.minExpandLevel;
- const { depth = 99, loadLazy, force, keepActiveNodeVisible = true, } = options !== null && options !== void 0 ? options : {};
- const expandOpts = {
- scrollIntoView: false,
- force: force,
- loadLazy: loadLazy,
- };
- // this.logInfo(`expandAll(${flag})`);
- // Expand all direct children in parallel:
- async function _iter(n, level) {
- var _a;
- // n.logInfo(` _iter(${level})`);
- if (level === 0) {
- return;
- }
- // if (!flag && minExpandLevel && !force && n.getLevel() <= minExpandLevel) {
- // return; // Do not collapse until minExpandLevel
- // }
- const level_1 = level == null ? null : level - 1;
- const promises = [];
- (_a = n.children) === null || _a === void 0 ? void 0 : _a.forEach((cn) => {
- if (flag) {
- if (!cn.expanded && (cn.children || (loadLazy && cn.lazy))) {
- // Node is collapsed and may be expanded (i.e. has children or is lazy)
- // Expanding may be async, so we store the promise.
- // Also the recursion is delayed until expansion finished.
- const p = cn.setExpanded(true, expandOpts);
- promises.push(p);
- p.then(async () => {
- await _iter(cn, level_1);
- });
- }
- else {
- // We don't expand the node, but still visit descendants.
- // There we may find lazy nodes, so we
- promises.push(_iter(cn, level_1));
- }
- }
- else {
- // Collapsing is always synchronous, so no promises required
- if (!minExpandLevel || force || cn.getLevel() > minExpandLevel) {
- // Do not collapse until minExpandLevel
- cn.setExpanded(false, expandOpts);
- }
- _iter(cn, level_1); // recursion, even if cn was already collapsed
- }
- });
- return new Promise((resolve) => {
- Promise.all(promises).then(() => {
- resolve(true);
- });
- });
- }
- const tag = tree.logTime(`${this}.expandAll(${flag})`);
- try {
- tree.enableUpdate(false);
- await _iter(this, depth);
- }
- finally {
- tree.enableUpdate(true);
- tree.logTimeEnd(tag);
- }
- if (tree.activeNode && keepActiveNodeVisible) {
- tree.activeNode.scrollIntoView();
- }
- }
- /**
- * Find all descendant nodes that match condition (excluding self).
- *
- * If `match` is a string, search for exact node title.
- * If `match` is a RegExp expression, apply it to node.title, using
- * [RegExp.test()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test).
- * If `match` is a callback, match all nodes for that the callback(node) returns true.
- *
- * Returns an empty array if no nodes were found.
- *
- * Examples:
- * ```js
- * // Match all node titles that match exactly 'Joe':
- * nodeList = node.findAll("Joe")
- * // Match all node titles that start with 'Joe' case sensitive:
- * nodeList = node.findAll(/^Joe/)
- * // Match all node titles that contain 'oe', case insensitive:
- * nodeList = node.findAll(/oe/i)
- * // Match all nodes with `data.price` >= 99:
- * nodeList = node.findAll((n) => {
- * return n.data.price >= 99;
- * })
- * ```
- */
- findAll(match) {
- const matcher = typeof match === "function" ? match : makeNodeTitleMatcher(match);
- const res = [];
- this.visit((n) => {
- if (matcher(n)) {
- res.push(n);
- }
- });
- return res;
- }
- /** Return the direct child with a given key, index or null. */
- findDirectChild(ptr) {
- const cl = this.children;
- if (!cl) {
- return null;
- }
- if (typeof ptr === "string") {
- for (let i = 0, l = cl.length; i < l; i++) {
- if (cl[i].key === ptr) {
- return cl[i];
- }
- }
- }
- else if (typeof ptr === "number") {
- return cl[ptr];
- }
- else if (ptr.parent === this) {
- // Return null if `ptr` is not a direct child
- return ptr;
- }
- return null;
- }
- /**
- * Find first descendant node that matches condition (excluding self) or null.
- *
- * @see {@link WunderbaumNode.findAll} for examples.
- */
- findFirst(match) {
- const matcher = typeof match === "function" ? match : makeNodeTitleMatcher(match);
- let res = null;
- this.visit((n) => {
- if (matcher(n)) {
- res = n;
- return false;
- }
- });
- return res;
- }
- /** Find a node relative to self.
- *
- * @see {@link Wunderbaum.findRelatedNode|tree.findRelatedNode()}
- */
- findRelatedNode(where, includeHidden = false) {
- return this.tree.findRelatedNode(this, where, includeHidden);
- }
- /**
- * Iterator version of {@link WunderbaumNode.format}.
- */
- *format_iter(name_cb, connectors) {
- connectors !== null && connectors !== void 0 ? connectors : (connectors = [" ", " | ", " ╰─ ", " ├─ "]);
- name_cb !== null && name_cb !== void 0 ? name_cb : (name_cb = (node) => "" + node);
- function _is_last(node) {
- const ca = node.parent.children;
- return node === ca[ca.length - 1];
- }
- const _format_line = (node) => {
- // https://www.measurethat.net/Benchmarks/Show/12196/0/arr-unshift-vs-push-reverse-small-array
- const parts = [name_cb(node)];
- parts.unshift(connectors[_is_last(node) ? 2 : 3]);
- let p = node.parent;
- while (p && p !== this) {
- // `this` is the top node
- parts.unshift(connectors[_is_last(p) ? 0 : 1]);
- p = p.parent;
- }
- return parts.join("");
- };
- yield name_cb(this);
- for (const node of this) {
- yield _format_line(node);
- }
- }
- /**
- * Return a multiline string representation of a node/subnode hierarchy.
- * Mostly useful for debugging.
- *
- * Example:
- * ```js
- * console.info(tree.getActiveNode().format((n)=>n.title));
- * ```
- * logs
- * ```
- * Books
- * ├─ Art of War
- * ╰─ Don Quixote
- * ```
- * @see {@link WunderbaumNode.format_iter}
- */
- format(name_cb, connectors) {
- const a = [];
- for (const line of this.format_iter(name_cb, connectors)) {
- a.push(line);
- }
- return a.join("\n");
- }
- /** Return the `
` element with a given index or id.
- * @returns {WunderbaumNode | null}
- */
- getColElem(colIdx) {
- var _a;
- if (typeof colIdx === "string") {
- colIdx = this.tree.columns.findIndex((value) => value.id === colIdx);
- }
- const colElems = (_a = this._rowElem) === null || _a === void 0 ? void 0 : _a.querySelectorAll("span.wb-col");
- return colElems ? colElems[colIdx] : null;
- }
- /** Return the first child node or null.
- * @returns {WunderbaumNode | null}
- */
- getFirstChild() {
- return this.children ? this.children[0] : null;
- }
- /** Return the last child node or null.
- * @returns {WunderbaumNode | null}
- */
- getLastChild() {
- return this.children ? this.children[this.children.length - 1] : null;
- }
- /** Return node depth (starting with 1 for top level nodes). */
- getLevel() {
- let i = 0, p = this.parent;
- while (p) {
- i++;
- p = p.parent;
- }
- return i;
- }
- /** Return the successive node (under the same parent) or null. */
- getNextSibling() {
- const ac = this.parent.children;
- const idx = ac.indexOf(this);
- return ac[idx + 1] || null;
- }
- /** Return the parent node (null for the system root node). */
- getParent() {
- // TODO: return null for top-level nodes?
- return this.parent;
- }
- /** Return an array of all parent nodes (top-down).
- * @param includeRoot Include the invisible system root node.
- * @param includeSelf Include the node itself.
- */
- getParentList(includeRoot = false, includeSelf = false) {
- const l = [];
- let dtn = includeSelf ? this : this.parent;
- while (dtn) {
- if (includeRoot || dtn.parent) {
- l.unshift(dtn);
- }
- dtn = dtn.parent;
- }
- return l;
- }
- /** Return a string representing the hierachical node path, e.g. "a/b/c".
- * @param includeSelf
- * @param node property name or callback
- * @param separator
- */
- getPath(includeSelf = true, part = "title", separator = "/") {
- // includeSelf = includeSelf !== false;
- // part = part || "title";
- // separator = separator || "/";
- let val;
- const path = [];
- const isFunc = typeof part === "function";
- this.visitParents((n) => {
- if (n.parent) {
- val = isFunc
- ? part(n)
- : n[part];
- path.unshift(val);
- }
- return undefined; // TODO remove this line
- }, includeSelf);
- return path.join(separator);
- }
- /** Return the preceeding node (under the same parent) or null. */
- getPrevSibling() {
- const ac = this.parent.children;
- const idx = ac.indexOf(this);
- return ac[idx - 1] || null;
- }
- /** Return true if node has children.
- * Return undefined if not sure, i.e. the node is lazy and not yet loaded.
- */
- hasChildren() {
- if (this.lazy) {
- if (this.children == null) {
- return undefined; // null or undefined: Not yet loaded
- }
- else if (this.children.length === 0) {
- return false; // Loaded, but response was empty
- }
- else if (this.children.length === 1 &&
- this.children[0].isStatusNode()) {
- return undefined; // Currently loading or load error
- }
- return true; // One or more child nodes
- }
- return !!(this.children && this.children.length);
- }
- /** Return true if node has className set. */
- hasClass(className) {
- return this.classes ? this.classes.has(className) : false;
- }
- /** Return true if this node is the currently active tree node. */
- isActive() {
- return this.tree.activeNode === this;
- }
- /** Return true if this node is a direct or indirect parent of `other`.
- * (See also [[isParentOf]].)
- */
- isAncestorOf(other) {
- return other && other.isDescendantOf(this);
- }
- /** Return true if this node is a **direct** subnode of `other`.
- * (See also [[isDescendantOf]].)
- */
- isChildOf(other) {
- return other && this.parent === other;
- }
- /** Return true if this node's title spans all columns, i.e. the node has no
- * grid cells.
- */
- isColspan() {
- return !!this.getOption("colspan");
- }
- /** Return true if this node is a direct or indirect subnode of `other`.
- * (See also [[isChildOf]].)
- */
- isDescendantOf(other) {
- if (!other || other.tree !== this.tree) {
- return false;
- }
- let p = this.parent;
- while (p) {
- if (p === other) {
- return true;
- }
- if (p === p.parent) {
- error(`Recursive parent link: ${p}`);
- }
- p = p.parent;
- }
- return false;
- }
- /** Return true if this node has children, i.e. the node is generally expandable.
- * If `andCollapsed` is set, we also check if this node is collapsed, i.e.
- * an expand operation is currently possible.
- */
- isExpandable(andCollapsed = false) {
- // `false` is never expandable (unoffical)
- if ((andCollapsed && this.expanded) || this.children === false) {
- return false;
- }
- if (this.children == null) {
- return !!this.lazy; // null or undefined can trigger lazy load
- }
- if (this.children.length === 0) {
- return !!this.tree.options.emptyChildListExpandable;
- }
- return true;
- }
- /** Return true if this node is currently in edit-title mode. */
- isEditing() {
- return this.tree._callMethod("edit.isEditingTitle", this);
- }
- /** Return true if this node is currently expanded. */
- isExpanded() {
- return !!this.expanded;
- }
- /** Return true if this node is the first node of its parent's children. */
- isFirstSibling() {
- const p = this.parent;
- return !p || p.children[0] === this;
- }
- /** Return true if this node is the last node of its parent's children. */
- isLastSibling() {
- const p = this.parent;
- return !p || p.children[p.children.length - 1] === this;
- }
- /** Return true if this node is lazy (even if data was already loaded) */
- isLazy() {
- return !!this.lazy;
- }
- /** Return true if node is lazy and loaded. For non-lazy nodes always return true. */
- isLoaded() {
- return !this.lazy || this.hasChildren() !== undefined; // Also checks if the only child is a status node
- }
- /** Return true if node is currently loading, i.e. a GET request is pending. */
- isLoading() {
- return this._isLoading;
- }
- /** Return true if this node is a temporarily generated status node of type 'paging'. */
- isPagingNode() {
- return this.statusNodeType === "paging";
- }
- /** Return true if this node is a **direct** parent of `other`.
- * (See also [[isAncestorOf]].)
- */
- isParentOf(other) {
- return other && other.parent === this;
- }
- /** (experimental) Return true if this node is partially loaded. */
- isPartload() {
- return !!this._partload;
- }
- /** Return true if this node is partially selected (tri-state). */
- isPartsel() {
- return !this.selected && !!this._partsel;
- }
- /** Return true if this node has DOM representaion, i.e. is displayed in the viewport. */
- isRadio() {
- return !!this.parent.radiogroup || this.getOption("checkbox") === "radio";
- }
- /** Return true if this node has DOM representaion, i.e. is displayed in the viewport. */
- isRendered() {
- return !!this._rowElem;
- }
- /** Return true if this node is the (invisible) system root node.
- * (See also [[isTopLevel()]].)
- */
- isRootNode() {
- return this.tree.root === this;
- }
- /** Return true if this node is selected, i.e. the checkbox is set.
- * `undefined` if partly selected (tri-state), false otherwise.
- */
- isSelected() {
- return this.selected ? true : this._partsel ? undefined : false;
- }
- /** Return true if this node is a temporarily generated system node like
- * 'loading', 'paging', or 'error' (node.statusNodeType contains the type).
- */
- isStatusNode() {
- return !!this.statusNodeType;
- }
- /** Return true if this a top level node, i.e. a direct child of the (invisible) system root node. */
- isTopLevel() {
- return this.tree.root === this.parent;
- }
- /** Return true if node is marked lazy but not yet loaded.
- * For non-lazy nodes always return false.
- */
- isUnloaded() {
- // Also checks if the only child is a status node:
- return this.hasChildren() === undefined;
- }
- /** Return true if all parent nodes are expanded. Note: this does not check
- * whether the node is scrolled into the visible part of the screen or viewport.
- */
- isVisible() {
- const hasFilter = this.tree.filterMode === "hide";
- const parents = this.getParentList(false, false);
- // TODO: check $(n.span).is(":visible")
- // i.e. return false for nodes (but not parents) that are hidden
- // by a filter
- if (hasFilter && !this.match && !this.subMatchCount) {
- // this.debug( "isVisible: HIDDEN (" + hasFilter + ", " + this.match + ", " + this.match + ")" );
- return false;
- }
- for (let i = 0, l = parents.length; i < l; i++) {
- const n = parents[i];
- if (!n.expanded) {
- // this.debug("isVisible: HIDDEN (parent collapsed)");
- return false;
- }
- // if (hasFilter && !n.match && !n.subMatchCount) {
- // this.debug("isVisible: HIDDEN (" + hasFilter + ", " + this.match + ", " + this.match + ")");
- // return false;
- // }
- }
- // this.debug("isVisible: VISIBLE");
- return true;
- }
- _loadSourceObject(source, level) {
- var _a;
- const tree = this.tree;
- level !== null && level !== void 0 ? level : (level = this.getLevel());
- // Let caller modify the parsed JSON response:
- const res = this._callEvent("receive", { response: source });
- if (res != null) {
- source = res;
- }
- if (isArray(source)) {
- source = { children: source };
- }
- assert(isPlainObject(source), `Expected an array or plain object: ${source}`);
- const format = (_a = source.format) !== null && _a !== void 0 ? _a : "nested";
- assert(format === "nested" || format === "flat", `Expected source.format = 'nested' or 'flat': ${format}`);
- // Pre-rocess for 'nested' or 'flat' format
- decompressSourceData(source);
- assert(source.children, "If `source` is an object, it must have a `children` property");
- if (source.types) {
- tree.logInfo("Redefine types", source.columns);
- tree.setTypes(source.types, false);
- delete source.types;
- }
- if (source.columns) {
- tree.logInfo("Redefine columns", source.columns);
- tree.columns = source.columns;
- delete source.columns;
- tree.update(ChangeType.colStructure);
- }
- this.addChildren(source.children);
- // Add extra data to `tree.data`
- for (const [key, value] of Object.entries(source)) {
- if (!RESERVED_TREE_SOURCE_KEYS.has(key)) {
- tree.data[key] = value;
- // tree.logDebug(`Add source.${key} to tree.data.${key}`);
- }
- }
- if (tree.options.selectMode === "hier") {
- this.fixSelection3FromEndNodes();
- }
- this._callEvent("load");
- }
- async _fetchWithOptions(source) {
- var _a, _b;
- // Either a URL string or an object with a `.url` property.
- let url, params, body, options, rest;
- let fetchOpts = {};
- if (typeof source === "string") {
- // source is a plain URL string: assume GET request
- url = source;
- fetchOpts.method = "GET";
- }
- else if (isPlainObject(source)) {
- // source is a plain object with `.url` property.
- ({ url, params, body, options, ...rest } = source);
- assert(!rest || Object.keys(rest).length === 0, `Unexpected source properties: ${Object.keys(rest)}. Use 'options' instead.`);
- assert(typeof url === "string", `expected source.url as string`);
- if (isPlainObject(options)) {
- fetchOpts = options;
- }
- if (isPlainObject(body)) {
- // we also accept 'body' as object...
- assert(!fetchOpts.body, "options.body should be passed as source.body");
- fetchOpts.body = JSON.stringify(fetchOpts.body);
- (_a = fetchOpts.method) !== null && _a !== void 0 ? _a : (fetchOpts.method = "POST"); // set default
- }
- if (isPlainObject(params)) {
- url += "?" + new URLSearchParams(params);
- (_b = fetchOpts.method) !== null && _b !== void 0 ? _b : (fetchOpts.method = "GET"); // set default
- }
- }
- else {
- url = ""; // keep linter happy
- error(`Unsupported source format: ${source}`);
- }
- this.setStatus(NodeStatusType.loading);
- const response = await fetch(url, fetchOpts);
- if (!response.ok) {
- error(`GET ${url} returned ${response.status}, ${response}`);
- }
- return await response.json();
- }
- /** Download data from the cloud, then call `.update()`. */
- async load(source) {
- const tree = this.tree;
- const requestId = Date.now();
- const prevParent = this.parent;
- const start = Date.now();
- let elap = 0, elapLoad = 0, elapProcess = 0;
- // Check for overlapping requests
- if (this._requestId) {
- this.logWarn(`Recursive load request #${requestId} while #${this._requestId} is pending.`);
- // node.debug("Send load request #" + requestId);
- }
- this._requestId = requestId;
- // const timerLabel = tree.logTime(this + ".load()");
- try {
- const url = typeof source === "string" ? source : source.url;
- if (!url) {
- // An array or a plain object (that does NOT contain a `.url` property)
- // will be treated as native Wunderbaum data
- if (typeof source.then === "function") {
- const msg = tree.logTime(`Resolve thenable ${source}`);
- source = await Promise.resolve(source);
- tree.logTimeEnd(msg);
- }
- this._loadSourceObject(source);
- elapProcess = Date.now() - start;
- }
- else {
- // Either a URL string or an object with a `.url` property.
- const data = await this._fetchWithOptions(source);
- elapLoad = Date.now() - start;
- if (this._requestId && this._requestId > requestId) {
- this.logWarn(`Ignored load response #${requestId} because #${this._requestId} is pending.`);
- return;
- }
- else {
- this.logDebug(`Received response for load request #${requestId}`);
- }
- if (this.parent === null && prevParent !== null) {
- this.logWarn("Lazy parent node was removed while loading: discarding response.");
- return;
- }
- this.setStatus(NodeStatusType.ok);
- // if (data.columns) {
- // tree.logInfo("Re-define columns", data.columns);
- // util.assert(!this.parent);
- // tree.columns = data.columns;
- // delete data.columns;
- // tree.updateColumns({ calculateCols: false });
- // }
- const startProcess = Date.now();
- this._loadSourceObject(data);
- elapProcess = Date.now() - startProcess;
- }
- }
- catch (error) {
- this.logError("Error during load()", source, error);
- this._callEvent("error", { error: error });
- this.setStatus(NodeStatusType.error, { message: "" + error });
- throw error;
- }
- finally {
- this._requestId = 0;
- elap = Date.now() - start;
- if (tree.options.debugLevel >= 3) {
- tree.logInfo(`Load source took ${elap / 1000} seconds ` +
- `(transfer: ${elapLoad / 1000}s, ` +
- `processing: ${elapProcess / 1000}s)`);
- }
- }
- }
- /**Load content of a lazy node. */
- async loadLazy(forceReload = false) {
- const wasExpanded = this.expanded;
- assert(this.lazy, "load() requires a lazy node");
- // _assert( forceReload || this.isUndefined(), "Pass forceReload=true to re-load a lazy node" );
- if (!forceReload && !this.isUnloaded()) {
- return;
- }
- if (this.isLoaded()) {
- this.resetLazy(); // Also collapses if currently expanded
- }
- // `lazyLoad` may be long-running, so mark node as loading now. `this.load()`
- // will reset the status later.
- this.setStatus(NodeStatusType.loading);
- try {
- const source = await this._callEvent("lazyLoad");
- if (source === false) {
- this.setStatus(NodeStatusType.ok);
- return;
- }
- assert(isArray(source) || (source && source.url), "The lazyLoad event must return a node list, `{url: ...}`, or false.");
- await this.load(source);
- this.setStatus(NodeStatusType.ok);
- if (wasExpanded) {
- this.expanded = true;
- this.tree.update(ChangeType.structure);
- }
- else {
- this.update(); // Fix expander icon to 'loaded'
- }
- }
- catch (e) {
- this.logError("Error during loadLazy()", e);
- this._callEvent("error", { error: e });
- this.setStatus(NodeStatusType.error, { message: "" + e });
- }
- return;
- }
- /** Alias for `logDebug` */
- log(...args) {
- this.logDebug(...args);
- }
- /* Log to console if opts.debugLevel >= 4 */
- logDebug(...args) {
- if (this.tree.options.debugLevel >= 4) {
- console.log(this.toString(), ...args); // eslint-disable-line no-console
- }
- }
- /* Log error to console. */
- logError(...args) {
- if (this.tree.options.debugLevel >= 1) {
- console.error(this.toString(), ...args); // eslint-disable-line no-console
- }
- }
- /* Log to console if opts.debugLevel >= 3 */
- logInfo(...args) {
- if (this.tree.options.debugLevel >= 3) {
- console.info(this.toString(), ...args); // eslint-disable-line no-console
- }
- }
- /* Log warning to console if opts.debugLevel >= 2 */
- logWarn(...args) {
- if (this.tree.options.debugLevel >= 2) {
- console.warn(this.toString(), ...args); // eslint-disable-line no-console
- }
- }
- /** Expand all parents and optionally scroll into visible area as neccessary.
- * Promise is resolved, when lazy loading and animations are done.
- * @param {object} [options] passed to `setExpanded()`.
- * Defaults to {noAnimation: false, noEvents: false, scrollIntoView: true}
- */
- async makeVisible(options) {
- let i;
- const dfd = new Deferred();
- const deferreds = [];
- const parents = this.getParentList(false, false);
- const len = parents.length;
- const noAnimation = getOption(options, "noAnimation", false);
- const scroll = getOption(options, "scrollIntoView", true);
- // Expand bottom-up, so only the top node is animated
- for (i = len - 1; i >= 0; i--) {
- // self.debug("pushexpand" + parents[i]);
- const seOpts = { noAnimation: noAnimation };
- deferreds.push(parents[i].setExpanded(true, seOpts));
- }
- Promise.all(deferreds).then(() => {
- // All expands have finished
- // self.debug("expand DONE", scroll);
- // Note: this.tree may be none when switching demo trees
- if (scroll && this.tree) {
- // Make sure markup and _rowIdx is updated before we do the scroll calculations
- this.tree.updatePendingModifications();
- this.scrollIntoView().then(() => {
- // self.debug("scroll DONE");
- dfd.resolve();
- });
- }
- else {
- dfd.resolve();
- }
- });
- return dfd.promise();
- }
- /** Move this node to targetNode. */
- moveTo(targetNode, mode = "appendChild", map) {
- if (mode === "over") {
- mode = "appendChild"; // compatible with drop region
- }
- if (mode === "prependChild") {
- if (targetNode.children && targetNode.children.length) {
- mode = "before";
- targetNode = targetNode.children[0];
- }
- else {
- mode = "appendChild";
- }
- }
- let pos;
- const tree = this.tree;
- const prevParent = this.parent;
- const targetParent = mode === "appendChild" ? targetNode : targetNode.parent;
- if (this === targetNode) {
- return;
- }
- else if (!this.parent) {
- error("Cannot move system root");
- }
- else if (targetParent.isDescendantOf(this)) {
- error("Cannot move a node to its own descendant");
- }
- if (targetParent !== prevParent) {
- prevParent.triggerModifyChild("remove", this);
- }
- // Unlink this node from current parent
- if (this.parent.children.length === 1) {
- if (this.parent === targetParent) {
- return; // #258
- }
- this.parent.children = this.parent.lazy ? [] : null;
- this.parent.expanded = false;
- }
- else {
- pos = this.parent.children.indexOf(this);
- assert(pos >= 0, "invalid source parent");
- this.parent.children.splice(pos, 1);
- }
- // Insert this node to target parent's child list
- this.parent = targetParent;
- if (targetParent.hasChildren()) {
- switch (mode) {
- case "appendChild":
- // Append to existing target children
- targetParent.children.push(this);
- break;
- case "before":
- // Insert this node before target node
- pos = targetParent.children.indexOf(targetNode);
- assert(pos >= 0, "invalid target parent");
- targetParent.children.splice(pos, 0, this);
- break;
- case "after":
- // Insert this node after target node
- pos = targetParent.children.indexOf(targetNode);
- assert(pos >= 0, "invalid target parent");
- targetParent.children.splice(pos + 1, 0, this);
- break;
- default:
- error(`Invalid mode '${mode}'.`);
- }
- }
- else {
- targetParent.children = [this];
- }
- // Let caller modify the nodes
- if (map) {
- targetNode.visit(map, true);
- }
- if (targetParent === prevParent) {
- targetParent.triggerModifyChild("move", this);
- }
- else {
- // prevParent.triggerModifyChild("remove", this);
- targetParent.triggerModifyChild("add", this);
- }
- // Handle cross-tree moves
- if (tree !== targetNode.tree) {
- // Fix node.tree for all source nodes
- // util.assert(false, "Cross-tree move is not yet implemented.");
- this.logWarn("Cross-tree moveTo is experimental!");
- this.visit((n) => {
- // TODO: fix selection state and activation, ...
- n.tree = targetNode.tree;
- }, true);
- }
- // Make sure we update async, because discarding the markup would prevent
- // DragAndDrop to generate a dragend event on the source node
- setTimeout(() => {
- // Even indentation may have changed:
- tree.update(ChangeType.any);
- }, 0);
- // TODO: fix selection state
- // TODO: fix active state
- }
- /** Set focus relative to this node and optionally activate.
- *
- * 'left' collapses the node if it is expanded, or move to the parent
- * otherwise.
- * 'right' expands the node if it is collapsed, or move to the first
- * child otherwise.
- *
- * @param where 'down', 'first', 'last', 'left', 'parent', 'right', or 'up'.
- * (Alternatively the `event.key` that would normally trigger this move,
- * e.g. `ArrowLeft` = 'left'.
- * @param options
- */
- async navigate(where, options) {
- // Allow to pass 'ArrowLeft' instead of 'left'
- where = KEY_TO_ACTION_DICT[where] || where;
- // Otherwise activate or focus the related node
- const node = this.findRelatedNode(where);
- if (!node) {
- this.logWarn(`Could not find related node '${where}'.`);
- return Promise.resolve(this);
- }
- // setFocus/setActive will scroll later (if autoScroll is specified)
- try {
- node.makeVisible({ scrollIntoView: false });
- }
- catch (e) {
- // ignore
- }
- node.setFocus();
- if ((options === null || options === void 0 ? void 0 : options.activate) === false) {
- return Promise.resolve(this);
- }
- return node.setActive(true, { event: options === null || options === void 0 ? void 0 : options.event });
- }
- /** Delete this node and all descendants. */
- remove() {
- const tree = this.tree;
- const pos = this.parent.children.indexOf(this);
- this.triggerModify("remove");
- this.parent.children.splice(pos, 1);
- this.visit((n) => {
- n.removeMarkup();
- tree._unregisterNode(n);
- }, true);
- tree.update(ChangeType.structure);
- }
- /** Remove all descendants of this node. */
- removeChildren() {
- const tree = this.tree;
- if (!this.children) {
- return;
- }
- if (tree.activeNode && tree.activeNode.isDescendantOf(this)) {
- tree.activeNode.setActive(false); // TODO: don't fire events
- }
- if (tree.focusNode && tree.focusNode.isDescendantOf(this)) {
- tree.focusNode = null;
- }
- // TODO: persist must take care to clear select and expand cookies
- // Unlink children to support GC
- // TODO: also delete this.children (not possible using visit())
- this.triggerModifyChild("remove", null);
- this.visit((n) => {
- tree._unregisterNode(n);
- });
- if (this.lazy) {
- // 'undefined' would be interpreted as 'not yet loaded' for lazy nodes
- this.children = [];
- }
- else {
- this.children = null;
- }
- // util.assert(this.parent); // don't call this for root node
- if (!this.isRootNode()) {
- this.expanded = false;
- }
- this.tree.update(ChangeType.structure);
- }
- /** Remove all HTML markup from the DOM. */
- removeMarkup() {
- if (this._rowElem) {
- delete this._rowElem._wb_node;
- this._rowElem.remove();
- this._rowElem = undefined;
- }
- }
- _getRenderInfo() {
- const allColInfosById = {};
- const renderColInfosById = {};
- const isColspan = this.isColspan();
- const colElems = this._rowElem
- ? (this._rowElem.querySelectorAll("span.wb-col"))
- : null;
- let idx = 0;
- for (const col of this.tree.columns) {
- allColInfosById[col.id] = {
- id: col.id,
- idx: idx,
- elem: colElems ? colElems[idx] : null,
- info: col,
- };
- // renderColInfosById only contains columns that need rendering:
- if (!isColspan && col.id !== "*") {
- renderColInfosById[col.id] = allColInfosById[col.id];
- }
- idx++;
- }
- return {
- allColInfosById: allColInfosById,
- renderColInfosById: renderColInfosById,
- };
- }
- _createIcon(iconMap, parentElem, replaceChild, showLoading) {
- let iconSpan;
- let icon = this.getOption("icon");
- if (this._errorInfo) {
- icon = iconMap.error;
- }
- else if (this._isLoading && showLoading) {
- // Status nodes, or nodes without expander (< minExpandLevel) should
- // display the 'loading' status with the i.wb-icon span
- icon = iconMap.loading;
- }
- if (icon === false) {
- return null; // explicitly disabled: don't try default icons
- }
- if (typeof icon === "string") ;
- else if (this.statusNodeType) {
- icon = iconMap[this.statusNodeType];
- }
- else if (this.expanded) {
- icon = iconMap.folderOpen;
- }
- else if (this.children) {
- icon = iconMap.folder;
- }
- else if (this.lazy) {
- icon = iconMap.folderLazy;
- }
- else {
- icon = iconMap.doc;
- }
- // this.log("_createIcon: " + icon);
- if (!icon) {
- iconSpan = document.createElement("i");
- iconSpan.className = "wb-icon";
- }
- else if (icon.indexOf("<") >= 0) {
- // HTML
- iconSpan = elemFromHtml(icon);
- }
- else if (TEST_IMG.test(icon)) {
- // Image URL
- iconSpan = elemFromHtml(``);
- }
- else {
- // Class name
- iconSpan = document.createElement("i");
- iconSpan.className = "wb-icon " + icon;
- }
- if (replaceChild) {
- parentElem.replaceChild(iconSpan, replaceChild);
- }
- else {
- parentElem.appendChild(iconSpan);
- }
- // Event handler `tree.iconBadge` can return a badge text or HTMLSpanElement
- const cbRes = this._callEvent("iconBadge", { iconSpan: iconSpan });
- let badge = null;
- if (cbRes != null && cbRes !== false) {
- let classes = "";
- let tooltip = "";
- if (isPlainObject(cbRes)) {
- badge = "" + cbRes.badge;
- classes = cbRes.badgeClass ? " " + cbRes.badgeClass : "";
- tooltip = cbRes.badgeTooltip ? ` title="${cbRes.badgeTooltip}"` : "";
- }
- else if (typeof cbRes === "number") {
- badge = "" + cbRes;
- }
- else {
- badge = cbRes; // string or HTMLSpanElement
- }
- if (typeof badge === "string") {
- badge = elemFromHtml(`${escapeHtml(badge)} `);
- }
- if (badge) {
- iconSpan.append(badge);
- }
- }
- // this.log("_createIcon: ", iconSpan);
- return iconSpan;
- }
- /**
- * Create a whole new `` element.
- * @see {@link WunderbaumNode._render}
- */
- _render_markup(opts) {
- const tree = this.tree;
- const treeOptions = tree.options;
- const checkbox = this.getOption("checkbox");
- const columns = tree.columns;
- const level = this.getLevel();
- const activeColIdx = tree.isRowNav() ? null : tree.activeColIdx;
- let elem;
- let rowDiv = this._rowElem;
- let checkboxSpan = null;
- let expanderSpan = null;
- const isNew = !rowDiv;
- assert(isNew, "Expected unrendered node");
- assert(!isNew || (opts && opts.after), "opts.after expected, unless updating");
- assert(!this.isRootNode(), "Root node not allowed");
- rowDiv = document.createElement("div");
- rowDiv.classList.add("wb-row");
- rowDiv.style.top = this._rowIdx * ROW_HEIGHT + "px";
- this._rowElem = rowDiv;
- // Attach a node reference to the DOM Element:
- rowDiv._wb_node = this;
- const nodeElem = document.createElement("span");
- nodeElem.classList.add("wb-node", "wb-col");
- rowDiv.appendChild(nodeElem);
- let ofsTitlePx = 0;
- if (checkbox) {
- checkboxSpan = document.createElement("i");
- checkboxSpan.classList.add("wb-checkbox");
- if (checkbox === "radio" || this.parent.radiogroup) {
- checkboxSpan.classList.add("wb-radio");
- }
- nodeElem.appendChild(checkboxSpan);
- ofsTitlePx += ICON_WIDTH;
- }
- for (let i = level - 1; i > 0; i--) {
- elem = document.createElement("i");
- elem.classList.add("wb-indent");
- nodeElem.appendChild(elem);
- ofsTitlePx += ICON_WIDTH;
- }
- if (!treeOptions.minExpandLevel || level > treeOptions.minExpandLevel) {
- expanderSpan = document.createElement("i");
- expanderSpan.classList.add("wb-expander");
- nodeElem.appendChild(expanderSpan);
- ofsTitlePx += ICON_WIDTH;
- }
- // Render the icon (show a 'loading' icon if we do not have an expander that
- // we would prefer).
- const iconSpan = this._createIcon(tree.iconMap, nodeElem, null, !expanderSpan);
- if (iconSpan) {
- ofsTitlePx += ICON_WIDTH;
- }
- const titleSpan = document.createElement("span");
- titleSpan.classList.add("wb-title");
- nodeElem.appendChild(titleSpan);
- // this._callEvent("enhanceTitle", { titleSpan: titleSpan });
- // Store the width of leading icons with the node, so we can calculate
- // the width of the embedded title span later
- nodeElem._ofsTitlePx = ofsTitlePx;
- // Support HTML5 drag-n-drop
- if (tree.options.dnd.dragStart) {
- nodeElem.draggable = true;
- }
- // Render columns
- const isColspan = this.isColspan();
- if (!isColspan && columns.length > 1) {
- let colIdx = 0;
- for (const col of columns) {
- colIdx++;
- let colElem;
- if (col.id === "*") {
- colElem = nodeElem;
- }
- else {
- colElem = document.createElement("span");
- colElem.classList.add("wb-col");
- rowDiv.appendChild(colElem);
- }
- if (colIdx === activeColIdx) {
- colElem.classList.add("wb-active");
- }
- // Add classes from `columns` definition to `
` cells
- col.classes ? colElem.classList.add(...col.classes.split(" ")) : 0;
- colElem.style.left = col._ofsPx + "px";
- colElem.style.width = col._widthPx + "px";
- if (isNew && col.html) {
- if (typeof col.html === "string") {
- colElem.innerHTML = col.html;
- }
- }
- }
- }
- // Attach to DOM as late as possible
- const after = opts ? opts.after : "last";
- switch (after) {
- case "first":
- tree.nodeListElement.prepend(rowDiv);
- break;
- case "last":
- tree.nodeListElement.appendChild(rowDiv);
- break;
- default:
- opts.after.after(rowDiv);
- }
- // Now go on and fill in data and update classes
- opts.isNew = true;
- this._render_data(opts);
- }
- /**
- * Render `node.title`, `.icon` into an existing row.
- *
- * @see {@link WunderbaumNode._render}
- */
- _render_data(opts) {
- assert(this._rowElem, "No _rowElem");
- const tree = this.tree;
- const treeOptions = tree.options;
- const rowDiv = this._rowElem;
- const isNew = !!opts.isNew; // Called by _render_markup()?
- const preventScroll = !!opts.preventScroll;
- const columns = tree.columns;
- const isColspan = this.isColspan();
- // Row markup already exists
- const nodeElem = rowDiv.querySelector("span.wb-node");
- const titleSpan = nodeElem.querySelector("span.wb-title");
- const scrollTop = tree.element.scrollTop;
- if (this.titleWithHighlight) {
- titleSpan.innerHTML = this.titleWithHighlight;
- }
- else {
- titleSpan.textContent = this.title; // TODO: this triggers scroll events
- }
- // NOTE: At least on Safari, this render call triggers a scroll event
- // probably when a focused input is replaced.
- if (preventScroll) {
- tree.element.scrollTop = scrollTop;
- }
- // Set the width of the title span, so overflow ellipsis work
- if (!treeOptions.skeleton) {
- if (isColspan) {
- const vpWidth = tree.element.clientWidth;
- titleSpan.style.width =
- vpWidth - nodeElem._ofsTitlePx - TITLE_SPAN_PAD_Y + "px";
- }
- else {
- titleSpan.style.width =
- columns[0]._widthPx -
- nodeElem._ofsTitlePx -
- TITLE_SPAN_PAD_Y +
- "px";
- }
- }
- // Update row classes
- opts.isDataChange = true;
- this._render_status(opts);
- // Let user modify the result
- if (this.statusNodeType) {
- this._callEvent("renderStatusNode", {
- isNew: isNew,
- nodeElem: nodeElem,
- isColspan: isColspan,
- });
- }
- else if (this.parent) {
- // Skip root node
- const renderInfo = this._getRenderInfo();
- this._callEvent("render", {
- isNew: isNew,
- nodeElem: nodeElem,
- isColspan: isColspan,
- allColInfosById: renderInfo.allColInfosById,
- renderColInfosById: renderInfo.renderColInfosById,
- });
- }
- }
- /**
- * Update row classes to reflect active, focuses, etc.
- * @see {@link WunderbaumNode._render}
- */
- _render_status(opts) {
- // this.log("_render_status", opts);
- const tree = this.tree;
- const iconMap = tree.iconMap;
- const treeOptions = tree.options;
- const typeInfo = this.type ? tree.types[this.type] : null;
- const rowDiv = this._rowElem;
- // Row markup already exists
- const nodeElem = rowDiv.querySelector("span.wb-node");
- const expanderSpan = nodeElem.querySelector("i.wb-expander");
- const checkboxSpan = nodeElem.querySelector("i.wb-checkbox");
- const rowClasses = ["wb-row"];
- this.expanded ? rowClasses.push("wb-expanded") : 0;
- this.lazy ? rowClasses.push("wb-lazy") : 0;
- this.selected ? rowClasses.push("wb-selected") : 0;
- this._partsel ? rowClasses.push("wb-partsel") : 0;
- this === tree.activeNode ? rowClasses.push("wb-active") : 0;
- this === tree.focusNode ? rowClasses.push("wb-focus") : 0;
- this._errorInfo ? rowClasses.push("wb-error") : 0;
- this._isLoading ? rowClasses.push("wb-loading") : 0;
- this.isColspan() ? rowClasses.push("wb-colspan") : 0;
- this.statusNodeType
- ? rowClasses.push("wb-status-" + this.statusNodeType)
- : 0;
- this.match ? rowClasses.push("wb-match") : 0;
- this.subMatchCount ? rowClasses.push("wb-submatch") : 0;
- treeOptions.skeleton ? rowClasses.push("wb-skeleton") : 0;
- // Replace previous classes:
- rowDiv.className = rowClasses.join(" ");
- // Add classes from `node.classes`
- this.classes ? rowDiv.classList.add(...this.classes) : 0;
- // Add classes from `tree.types[node.type]`
- if (typeInfo && typeInfo.classes) {
- rowDiv.classList.add(...typeInfo.classes);
- }
- if (expanderSpan) {
- let image = null;
- if (this._isLoading) {
- image = iconMap.loading;
- }
- else if (this.isExpandable(false)) {
- if (this.expanded) {
- image = iconMap.expanderExpanded;
- }
- else {
- image = iconMap.expanderCollapsed;
- }
- }
- else if (this.lazy && this.children == null) {
- image = iconMap.expanderLazy;
- }
- if (image == null) {
- expanderSpan.classList.add("wb-indent");
- }
- else if (TEST_IMG.test(image)) {
- expanderSpan.style.backgroundImage = `url('${image}')`;
- }
- else {
- expanderSpan.className = "wb-expander " + image;
- }
- }
- if (checkboxSpan) {
- let cbclass = "wb-checkbox ";
- if (this.isRadio()) {
- cbclass += "wb-radio ";
- if (this.selected) {
- cbclass += iconMap.radioChecked;
- // } else if (this._partsel) {
- // cbclass += iconMap.radioUnknown;
- }
- else {
- cbclass += iconMap.radioUnchecked;
- }
- }
- else {
- if (this.selected) {
- cbclass += iconMap.checkChecked;
- }
- else if (this._partsel) {
- cbclass += iconMap.checkUnknown;
- }
- else {
- cbclass += iconMap.checkUnchecked;
- }
- }
- checkboxSpan.className = cbclass;
- }
- // Fix active cell in cell-nav mode
- if (!opts.isNew) {
- let i = 0;
- for (const colSpan of rowDiv.children) {
- colSpan.classList.toggle("wb-active", i++ === tree.activeColIdx);
- }
- // Update icon (if not opts.isNew, which would rebuild markup anyway)
- const iconSpan = nodeElem.querySelector("i.wb-icon");
- if (iconSpan) {
- this._createIcon(tree.iconMap, nodeElem, iconSpan, !expanderSpan);
- }
- }
- // Adjust column width
- if (opts.resizeCols !== false && !this.isColspan()) {
- const colElems = rowDiv.querySelectorAll("span.wb-col");
- let idx = 0;
- let ofs = 0;
- for (const colDef of this.tree.columns) {
- const colElem = colElems[idx];
- colElem.style.left = `${ofs}px`;
- colElem.style.width = `${colDef._widthPx}px`;
- idx++;
- ofs += colDef._widthPx;
- }
- }
- }
- /*
- * Create or update node's markup.
- *
- * `options.change` defaults to ChangeType.data, which updates the title,
- * icon, and status. It also triggers the `render` event, that lets the user
- * create or update the content of embeded cell elements.
- *
- * If only the status or other class-only modifications have changed,
- * `options.change` should be set to ChangeType.status instead for best
- * efficiency.
- *
- * Calling `update()` is almost always a better alternative.
- * @see {@link WunderbaumNode.update}
- */
- _render(options) {
- // this.log("render", options);
- const opts = Object.assign({ change: ChangeType.data }, options);
- if (!this._rowElem) {
- opts.change = ChangeType.row;
- }
- switch (opts.change) {
- case "status":
- this._render_status(opts);
- break;
- case "data":
- this._render_data(opts);
- break;
- case "row":
- // _rowElem is not yet created (asserted in _render_markup)
- this._render_markup(opts);
- break;
- default:
- error(`Invalid change type '${opts.change}'.`);
- }
- }
- /**
- * Remove all children, collapse, and set the lazy-flag, so that the lazyLoad
- * event is triggered on next expand.
- */
- resetLazy() {
- this.removeChildren();
- this.expanded = false;
- this.lazy = true;
- this.children = null;
- this.tree.update(ChangeType.structure);
- }
- /** Convert node (or whole branch) into a plain object.
- *
- * The result is compatible with node.addChildren().
- *
- * @param include child nodes
- * @param callback(dict, node) is called for every node, in order to allow
- * modifications.
- * Return `false` to ignore this node or `"skip"` to include this node
- * without its children.
- * @see {@link Wunderbaum.toDictArray}.
- */
- toDict(recursive = false, callback) {
- const dict = {};
- NODE_DICT_PROPS.forEach((propName) => {
- const val = this[propName];
- if (val instanceof Set) {
- // Convert Set to string (or skip if set is empty)
- val.size
- ? (dict[propName] = Array.prototype.join.call(val.keys(), " "))
- : 0;
- }
- else if (val || val === false || val === 0) {
- dict[propName] = val;
- }
- });
- if (!isEmptyObject(this.data)) {
- dict.data = extend({}, this.data);
- if (isEmptyObject(dict.data)) {
- delete dict.data;
- }
- }
- if (callback) {
- const res = callback(dict, this);
- if (res === false) {
- // Note: a return value of `false` is only used internally
- return false; // Don't include this node nor its children
- }
- if (res === "skip") {
- recursive = false; // Include this node, but not the children
- }
- }
- if (recursive) {
- if (isArray(this.children)) {
- dict.children = [];
- for (let i = 0, l = this.children.length; i < l; i++) {
- const node = this.children[i];
- if (!node.isStatusNode()) {
- // Note: a return value of `false` is only used internally
- const res = node.toDict(true, callback);
- if (res !== false) {
- dict.children.push(res);
- }
- }
- }
- }
- }
- return dict;
- }
- /** Return an option value that has a default, but may be overridden by a
- * callback or a node instance attribute.
- *
- * Evaluation sequence:
- *
- * - If `tree.options.` is a callback that returns something, use that.
- * - Else if `node.` is defined, use that.
- * - Else if `tree.types[]` is a value, use that.
- * - Else if `tree.options.` is a value, use that.
- * - Else use `defaultValue`.
- *
- * @param name name of the option property (on node and tree)
- * @param defaultValue return this if nothing else matched
- * {@link Wunderbaum.getOption|Wunderbaum.getOption()}
- */
- getOption(name, defaultValue) {
- const tree = this.tree;
- let opts = tree.options;
- // Lookup `name` in options dict
- if (name.indexOf(".") >= 0) {
- [opts, name] = name.split(".");
- }
- const value = opts[name]; // ?? defaultValue;
- // A callback resolver always takes precedence
- if (typeof value === "function") {
- const res = value.call(tree, {
- type: "resolve",
- tree: tree,
- node: this,
- // typeInfo: this.type ? tree.types[this.type] : {},
- });
- if (res !== undefined) {
- return res;
- }
- }
- // If this node has an explicit local setting, use it:
- if (this[name] !== undefined) {
- return this[name];
- }
- // Use value from type definition if defined
- const typeInfo = this.type ? tree.types[this.type] : undefined;
- const res = typeInfo ? typeInfo[name] : undefined;
- if (res !== undefined) {
- return res;
- }
- // Use value from value options dict, fallback do default
- return value !== null && value !== void 0 ? value : defaultValue;
- }
- /** Make sure that this node is visible in the viewport.
- * @see {@link Wunderbaum.scrollTo|Wunderbaum.scrollTo()}
- */
- async scrollIntoView(options) {
- const opts = Object.assign({ node: this }, options);
- return this.tree.scrollTo(opts);
- }
- /**
- * Activate this node, deactivate previous, send events, activate column and scroll int viewport.
- */
- async setActive(flag = true, options) {
- const tree = this.tree;
- const prev = tree.activeNode;
- const retrigger = options === null || options === void 0 ? void 0 : options.retrigger; // Default: false
- const focusTree = options === null || options === void 0 ? void 0 : options.focusTree; // Default: false
- const focusNode = (options === null || options === void 0 ? void 0 : options.focusNode) !== false; // Default: true
- const noEvents = options === null || options === void 0 ? void 0 : options.noEvents; // Default: false
- const orgEvent = options === null || options === void 0 ? void 0 : options.event; // Default: false
- if (!noEvents) {
- if (flag) {
- if (prev !== this || retrigger) {
- if ((prev === null || prev === void 0 ? void 0 : prev._callEvent("deactivate", {
- nextNode: this,
- event: orgEvent,
- })) === false ||
- this._callEvent("beforeActivate", {
- prevNode: prev,
- event: orgEvent,
- }) === false) {
- return;
- }
- tree.activeNode = null;
- prev === null || prev === void 0 ? void 0 : prev.update(ChangeType.status);
- }
- }
- else if (prev === this || retrigger) {
- this._callEvent("deactivate", { nextNode: null, event: orgEvent });
- }
- }
- if (prev !== this) {
- if (flag) {
- tree.activeNode = this;
- if (focusNode || focusTree) {
- tree.focusNode = this;
- }
- if (focusTree) {
- tree.setFocus();
- }
- }
- prev === null || prev === void 0 ? void 0 : prev.update(ChangeType.status);
- this.update(ChangeType.status);
- }
- if (options &&
- options.colIdx != null &&
- options.colIdx !== tree.activeColIdx &&
- tree.isCellNav()) {
- tree.setColumn(options.colIdx);
- }
- if (flag && !noEvents) {
- this._callEvent("activate", { prevNode: prev, event: orgEvent });
- }
- return this.makeVisible();
- }
- /**
- * Expand or collapse this node.
- */
- async setExpanded(flag = true, options) {
- const { force, scrollIntoView, immediate } = options !== null && options !== void 0 ? options : {};
- if (!flag &&
- this.isExpanded() &&
- this.getLevel() <= this.tree.getOption("minExpandLevel") &&
- !force) {
- this.logDebug("Ignored collapse request below expandLevel.");
- return;
- }
- if (!flag === !this.expanded) {
- return; // Nothing to do
- }
- // this.log("setExpanded()");
- if (flag && this.getOption("autoCollapse")) {
- this.collapseSiblings(options);
- }
- if (flag && this.lazy && this.children == null) {
- await this.loadLazy();
- }
- this.expanded = flag;
- const updateOpts = { immediate: immediate };
- // const updateOpts = { immediate: !!util.getOption(options, "immediate") };
- this.tree.update(ChangeType.structure, updateOpts);
- if (flag && scrollIntoView) {
- const lastChild = this.getLastChild();
- if (lastChild) {
- this.tree.updatePendingModifications();
- lastChild.scrollIntoView({ topNode: this });
- }
- }
- }
- /**
- * Set keyboard focus here.
- * @see {@link setActive}
- */
- setFocus(flag = true) {
- assert(!!flag, "blur is not yet implemented");
- const prev = this.tree.focusNode;
- this.tree.focusNode = this;
- prev === null || prev === void 0 ? void 0 : prev.update();
- this.update();
- }
- /** Set a new icon path or class. */
- setIcon(icon) {
- this.icon = icon;
- this.update();
- }
- /** Change node's {@link key} and/or {@link refKey}. */
- setKey(key, refKey) {
- throw new Error("Not yet implemented");
- }
- /**
- * Trigger a repaint, typically after a status or data change.
- *
- * `change` defaults to 'data', which handles modifcations of title, icon,
- * and column content. It can be reduced to 'ChangeType.status' if only
- * active/focus/selected state has changed.
- *
- * This method will eventually call {@link WunderbaumNode._render()} with
- * default options, but may be more consistent with the tree's
- * {@link Wunderbaum.update()} API.
- */
- update(change = ChangeType.data) {
- assert(change === ChangeType.status || change === ChangeType.data, `Invalid change type ${change}`);
- this.tree.update(change, this);
- }
- /**
- * Return an array of selected nodes.
- * @param stopOnParents only return the topmost selected node (useful with selectMode 'hier')
- */
- getSelectedNodes(stopOnParents = false) {
- const nodeList = [];
- this.visit((node) => {
- if (node.selected) {
- nodeList.push(node);
- if (stopOnParents === true) {
- return "skip"; // stop processing this branch
- }
- }
- });
- return nodeList;
- }
- /** Toggle the check/uncheck state. */
- toggleSelected(options) {
- let flag = this.isSelected();
- if (flag === undefined && !this.isRadio()) {
- flag = this._anySelectable();
- }
- else {
- flag = !flag;
- }
- return this.setSelected(flag, options);
- }
- /** Return true if at least on selectable descendant end-node is unselected. @internal */
- _anySelectable() {
- let found = false;
- this.visit((node) => {
- if (node.selected === false &&
- !node.unselectable &&
- !node.hasChildren() &&
- !node.parent.radiogroup) {
- found = true;
- return false; // Stop iteration
- }
- });
- return found;
- }
- /* Apply selection state to a single node. */
- _changeSelectStatusProps(state) {
- let changed = false;
- switch (state) {
- case false:
- changed = this.selected || this._partsel;
- this.selected = false;
- this._partsel = false;
- break;
- case true:
- changed = !this.selected || !this._partsel;
- this.selected = true;
- this._partsel = true;
- break;
- case undefined:
- changed = this.selected || !this._partsel;
- this.selected = false;
- this._partsel = true;
- break;
- default:
- error(`Invalid state: ${state}`);
- }
- if (changed) {
- this.update();
- }
- return changed;
- }
- /**
- * Fix selection status, after this node was (de)selected in `selectMode: 'hier'`.
- * This includes (de)selecting all descendants.
- */
- fixSelection3AfterClick(opts) {
- const force = !!(opts === null || opts === void 0 ? void 0 : opts.force);
- const flag = this.isSelected();
- this.visit((node) => {
- if (node.radiogroup) {
- return "skip"; // Don't (de)select this branch
- }
- if (force || !node.getOption("unselectable")) {
- node._changeSelectStatusProps(flag);
- }
- });
- this.fixSelection3FromEndNodes();
- }
- /**
- * Fix selection status for multi-hier mode.
- * Only end-nodes are considered to update the descendants branch and parents.
- * Should be called after this node has loaded new children or after
- * children have been modified using the API.
- */
- fixSelection3FromEndNodes(opts) {
- const force = !!(opts === null || opts === void 0 ? void 0 : opts.force);
- assert(this.tree.options.selectMode === "hier", "expected selectMode 'hier'");
- // Visit all end nodes and adjust their parent's `selected` and `_partsel`
- // attributes. Return selection state true, false, or undefined.
- const _walk = (node) => {
- let state;
- const children = node.children;
- if (children && children.length) {
- // check all children recursively
- let allSelected = true;
- let someSelected = false;
- for (let i = 0, l = children.length; i < l; i++) {
- const child = children[i];
- // the selection state of a node is not relevant; we need the end-nodes
- const s = _walk(child);
- if (s !== false) {
- someSelected = true;
- }
- if (s !== true) {
- allSelected = false;
- }
- }
- state = allSelected ? true : someSelected ? undefined : false;
- }
- else {
- // This is an end-node: simply report the status
- state = !!node.selected;
- }
- // #939: Keep a `_partsel` flag that was explicitly set on a lazy node
- if (node._partsel &&
- !node.selected &&
- node.lazy &&
- node.children == null) {
- state = undefined;
- }
- if (force || !node.getOption("unselectable")) {
- node._changeSelectStatusProps(state);
- }
- return state;
- };
- _walk(this);
- // Update parent's state
- this.visitParents((node) => {
- let state;
- const children = node.children;
- let allSelected = true;
- let someSelected = false;
- for (let i = 0, l = children.length; i < l; i++) {
- const child = children[i];
- state = !!child.selected;
- // When fixing the parents, we trust the sibling status (i.e. we don't recurse)
- if (state || child._partsel) {
- someSelected = true;
- }
- if (!state) {
- allSelected = false;
- }
- }
- state = allSelected ? true : someSelected ? undefined : false;
- node._changeSelectStatusProps(state);
- });
- }
- /** Modify the check/uncheck state. */
- setSelected(flag = true, options) {
- const tree = this.tree;
- const sendEvents = !(options === null || options === void 0 ? void 0 : options.noEvents); // Default: send events
- const prev = this.isSelected();
- const isRadio = this.parent && this.parent.radiogroup;
- const selectMode = tree.options.selectMode;
- const canSelect = (options === null || options === void 0 ? void 0 : options.force) || !this.getOption("unselectable");
- flag = !!flag;
- // this.logDebug(`setSelected(${flag})`, this);
- if (!canSelect) {
- return prev;
- }
- if ((options === null || options === void 0 ? void 0 : options.propagateDown) && selectMode === "multi") {
- tree.runWithDeferredUpdate(() => {
- this.visit((node) => {
- node.setSelected(flag);
- });
- });
- return prev;
- }
- if (flag === prev ||
- (sendEvents && this._callEvent("beforeSelect", { flag: flag }) === false)) {
- return prev;
- }
- tree.runWithDeferredUpdate(() => {
- if (isRadio) {
- // Radiobutton Group
- if (!flag && !(options === null || options === void 0 ? void 0 : options.force)) {
- return prev; // don't uncheck radio buttons
- }
- for (const sibling of this.parent.children) {
- sibling.selected = sibling === this;
- }
- }
- else {
- this.selected = flag;
- if (selectMode === "hier") {
- this.fixSelection3AfterClick();
- }
- else if (selectMode === "single") {
- tree.visit((n) => {
- n.selected = false;
- });
- }
- }
- });
- if (sendEvents) {
- this._callEvent("select", { flag: flag });
- }
- return prev;
- }
- /** Display node status (ok, loading, error, noData) using styles and a dummy child node. */
- setStatus(status, options) {
- const tree = this.tree;
- const message = options === null || options === void 0 ? void 0 : options.message;
- const details = options === null || options === void 0 ? void 0 : options.details;
- let statusNode = null;
- const _clearStatusNode = () => {
- // Remove dedicated dummy node, if any
- const children = this.children;
- if (children && children.length && children[0].isStatusNode()) {
- children[0].remove();
- }
- };
- const _setStatusNode = (data) => {
- // Create/modify the dedicated dummy node for 'loading...' or
- // 'error!' status. (only called for direct child of the invisible
- // system root)
- const children = this.children;
- const firstChild = children ? children[0] : null;
- assert(data.statusNodeType, "Not a status node");
- assert(!firstChild || !firstChild.isStatusNode(), "Child must not be a status node");
- statusNode = this.addNode(data, "prependChild");
- statusNode.match = true;
- tree.update(ChangeType.structure);
- return statusNode;
- };
- _clearStatusNode();
- switch (status) {
- case "ok":
- this._isLoading = false;
- this._errorInfo = null;
- break;
- case "loading":
- this._isLoading = true;
- this._errorInfo = null;
- if (this.parent) {
- this.update(ChangeType.status);
- }
- else {
- // If this is the invisible root, add a visible top-level node
- _setStatusNode({
- statusNodeType: status,
- title: tree.options.strings.loading +
- (message ? " (" + message + ")" : ""),
- checkbox: false,
- colspan: true,
- tooltip: details,
- });
- }
- // this.update();
- break;
- case "error":
- _setStatusNode({
- statusNodeType: status,
- title: tree.options.strings.loadError +
- (message ? " (" + message + ")" : ""),
- checkbox: false,
- colspan: true,
- // classes: "wb-center",
- tooltip: details,
- });
- this._isLoading = false;
- this._errorInfo = { message: message, details: details };
- break;
- case "noData":
- _setStatusNode({
- statusNodeType: status,
- title: message || tree.options.strings.noData,
- checkbox: false,
- colspan: true,
- tooltip: details,
- });
- this._isLoading = false;
- this._errorInfo = null;
- break;
- default:
- error("invalid node status " + status);
- }
- tree.update(ChangeType.structure);
- return statusNode;
- }
- /** Rename this node. */
- setTitle(title) {
- this.title = title;
- this.update();
- // this.triggerModify("rename"); // TODO
- }
- _sortChildren(cmp, deep) {
- const cl = this.children;
- if (!cl) {
- return;
- }
- cl.sort(cmp);
- if (deep) {
- for (let i = 0, l = cl.length; i < l; i++) {
- if (cl[i].children) {
- cl[i]._sortChildren(cmp, deep);
- }
- }
- }
- }
- /**
- * Sort child list by title or custom criteria.
- * @param {function} cmp custom compare function(a, b) that returns -1, 0, or 1
- * (defaults to sorting by title).
- * @param {boolean} deep pass true to sort all descendant nodes recursively
- */
- sortChildren(cmp = nodeTitleSorter, deep = false) {
- this._sortChildren(cmp || nodeTitleSorter, deep);
- this.tree.update(ChangeType.structure);
- // this.triggerModify("sort"); // TODO
- }
- /**
- * Trigger `modifyChild` event on a parent to signal that a child was modified.
- * @param {string} operation Type of change: 'add', 'remove', 'rename', 'move', 'data', ...
- */
- triggerModifyChild(operation, child, extra) {
- this.logDebug(`modifyChild(${operation})`, extra, child);
- if (!this.tree.options.modifyChild) {
- return;
- }
- if (child && child.parent !== this) {
- error("child " + child + " is not a child of " + this);
- }
- this._callEvent("modifyChild", extend({ operation: operation, child: child }, extra));
- }
- /**
- * Trigger `modifyChild` event on node.parent(!).
- * @param {string} operation Type of change: 'add', 'remove', 'rename', 'move', 'data', ...
- * @param {object} [extra]
- */
- triggerModify(operation, extra) {
- // if (!this.parent) {
- // return;
- // }
- this.parent.triggerModifyChild(operation, this, extra);
- }
- /**
- * Call `callback(node)` for all descendant nodes in hierarchical order (depth-first, pre-order).
- *
- * Stop iteration, if fn() returns false. Skip current branch, if fn()
- * returns "skip".
- * Return false if iteration was stopped.
- *
- * @param {function} callback the callback function.
- * Return false to stop iteration, return "skip" to skip this node and
- * its children only.
- * @see {@link IterableIterator}, {@link Wunderbaum.visit}.
- */
- visit(callback, includeSelf = false) {
- let res = true;
- const children = this.children;
- if (includeSelf === true) {
- res = callback(this);
- if (res === false || res === "skip") {
- return res;
- }
- }
- if (children) {
- for (let i = 0, l = children.length; i < l; i++) {
- res = children[i].visit(callback, true);
- if (res === false) {
- break;
- }
- }
- }
- return res;
- }
- /** Call fn(node) for all parent nodes, bottom-up, including invisible system root.
- * Stop iteration, if callback() returns false.
- * Return false if iteration was stopped.
- *
- * @param callback the callback function. Return false to stop iteration
- */
- visitParents(callback, includeSelf = false) {
- if (includeSelf && callback(this) === false) {
- return false;
- }
- let p = this.parent;
- while (p) {
- if (callback(p) === false) {
- return false;
- }
- p = p.parent;
- }
- return true;
- }
- /**
- * Call fn(node) for all sibling nodes.
- * Stop iteration, if fn() returns false.
- * Return false if iteration was stopped.
- *
- * @param {function} fn the callback function.
- * Return false to stop iteration.
- */
- visitSiblings(callback, includeSelf = false) {
- const ac = this.parent.children;
- for (let i = 0, l = ac.length; i < l; i++) {
- const n = ac[i];
- if (includeSelf || n !== this) {
- if (callback(n) === false) {
- return false;
- }
- }
- }
- return true;
- }
- /**
- * [ext-filter] Return true if this node is matched by current filter (or no filter is active).
- */
- isMatched() {
- return !(this.tree.filterMode && !this.match);
- }
- }
- WunderbaumNode.sequence = 0;
+ /*!
+ * Wunderbaum - wunderbaum_node
+ * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */
+ /** WunderbaumNode properties that can be passed with source data.
+ * (Any other source properties will be stored as `node.data.PROP`.)
+ */
+ const NODE_PROPS = new Set([
+ "checkbox",
+ "classes",
+ "expanded",
+ "icon",
+ "iconTooltip",
+ "key",
+ "lazy",
+ "_partsel",
+ "radiogroup",
+ "refKey",
+ "selected",
+ "statusNodeType",
+ "title",
+ "tooltip",
+ "type",
+ "unselectable",
+ ]);
+ /** WunderbaumNode properties that will be returned by `node.toDict()`.)
+ */
+ const NODE_DICT_PROPS = new Set(NODE_PROPS);
+ NODE_DICT_PROPS.delete("_partsel");
+ NODE_DICT_PROPS.delete("unselectable");
+ /**
+ * A single tree node.
+ *
+ * **NOTE:**
+ * Generally you should not modify properties directly, since this may break
+ * the internal bookkeeping.
+ */
+ class WunderbaumNode {
+ constructor(tree, parent, data) {
+ var _a, _b;
+ /** Reference key. Unlike {@link key}, a `refKey` may occur multiple
+ * times within a tree (in this case we have 'clone nodes').
+ * @see Use {@link setKey} to modify.
+ */
+ this.refKey = undefined;
+ this.children = null;
+ /** Additional classes added to `div.wb-row`.
+ * @see {@link hasClass}, {@link setClass}. */
+ this.classes = null; //new Set();
+ /** Custom data that was passed to the constructor */
+ this.data = {};
+ this._isLoading = false;
+ this._requestId = 0;
+ this._errorInfo = null;
+ this._partsel = false;
+ this._partload = false;
+ this.subMatchCount = 0;
+ this._rowIdx = 0;
+ this._rowElem = undefined;
+ assert(!parent || parent.tree === tree, `Invalid parent: ${parent}`);
+ assert(!data.children, "'children' not allowed here");
+ this.tree = tree;
+ this.parent = parent;
+ this.key = "" + ((_a = data.key) !== null && _a !== void 0 ? _a : ++WunderbaumNode.sequence);
+ this.title = "" + ((_b = data.title) !== null && _b !== void 0 ? _b : "<" + this.key + ">");
+ data.refKey != null ? (this.refKey = "" + data.refKey) : 0;
+ data.type != null ? (this.type = "" + data.type) : 0;
+ this.expanded = data.expanded === true;
+ data.icon != null ? (this.icon = data.icon) : 0;
+ this.lazy = data.lazy === true;
+ data.statusNodeType != null
+ ? (this.statusNodeType = ("" + data.statusNodeType))
+ : 0;
+ data.colspan != null ? (this.colspan = !!data.colspan) : 0;
+ // Selection
+ data.checkbox != null ? (this.checkbox = !!data.checkbox) : 0;
+ data.radiogroup != null ? (this.radiogroup = !!data.radiogroup) : 0;
+ this.selected = data.selected === true;
+ data.unselectable === true ? (this.unselectable = true) : 0;
+ if (data.classes) {
+ this.setClass(data.classes);
+ }
+ // Store custom fields as `node.data`
+ for (const [key, value] of Object.entries(data)) {
+ if (!NODE_PROPS.has(key)) {
+ this.data[key] = value;
+ }
+ }
+ if (parent && !this.statusNodeType) {
+ // Don't register root node or status nodes
+ tree._registerNode(this);
+ }
+ }
+ /**
+ * Return readable string representation for this instance.
+ * @internal
+ */
+ toString() {
+ return `WunderbaumNode@${this.key}<'${this.title}'>`;
+ }
+ /**
+ * Iterate all descendant nodes depth-first, pre-order using `for ... of ...` syntax.
+ * More concise, but slightly slower than {@link WunderbaumNode.visit}.
+ *
+ * Example:
+ * ```js
+ * for(const n of node) {
+ * ...
+ * }
+ * ```
+ */
+ *[Symbol.iterator]() {
+ // let node: WunderbaumNode | null = this;
+ const cl = this.children;
+ if (cl) {
+ for (let i = 0, l = cl.length; i < l; i++) {
+ const n = cl[i];
+ yield n;
+ if (n.children) {
+ yield* n;
+ }
+ }
+ // Slower:
+ // for (let node of this.children) {
+ // yield node;
+ // yield* node : 0;
+ // }
+ }
+ }
+ // /** Return an option value. */
+ // protected _getOpt(
+ // name: string,
+ // nodeObject: any = null,
+ // treeOptions: any = null,
+ // defaultValue: any = null
+ // ): any {
+ // return evalOption(
+ // name,
+ // this,
+ // nodeObject || this,
+ // treeOptions || this.tree.options,
+ // defaultValue
+ // );
+ // }
+ /** Call event handler if defined in tree.options.
+ * Example:
+ * ```js
+ * node._callEvent("edit.beforeEdit", {foo: 42})
+ * ```
+ */
+ _callEvent(type, extra) {
+ return this.tree._callEvent(type, extend({
+ node: this,
+ typeInfo: this.type ? this.tree.types[this.type] : {},
+ }, extra));
+ }
+ /**
+ * Append (or insert) a list of child nodes.
+ *
+ * Tip: pass `{ before: 0 }` to prepend new nodes as first children.
+ *
+ * @returns first child added
+ */
+ addChildren(nodeData, options) {
+ const tree = this.tree;
+ let { before = null, applyMinExpanLevel = true, _level } = options !== null && options !== void 0 ? options : {};
+ // let { before, loadLazy=true, _level } = options ?? {};
+ // const isTopCall = _level == null;
+ _level !== null && _level !== void 0 ? _level : (_level = this.getLevel());
+ const nodeList = [];
+ try {
+ tree.enableUpdate(false);
+ if (isPlainObject(nodeData)) {
+ nodeData = [nodeData];
+ }
+ const forceExpand = applyMinExpanLevel && _level < tree.options.minExpandLevel;
+ for (const child of nodeData) {
+ const subChildren = child.children;
+ delete child.children;
+ const n = new WunderbaumNode(tree, this, child);
+ if (forceExpand && !n.isUnloaded()) {
+ n.expanded = true;
+ }
+ nodeList.push(n);
+ if (subChildren) {
+ n.addChildren(subChildren, { _level: _level + 1 });
+ }
+ }
+ if (!this.children) {
+ this.children = nodeList;
+ }
+ else if (before == null || this.children.length === 0) {
+ this.children = this.children.concat(nodeList);
+ }
+ else {
+ // Returns null if before is not a direct child:
+ before = this.findDirectChild(before);
+ const pos = this.children.indexOf(before);
+ assert(pos >= 0, `options.before must be a direct child of ${this}`);
+ // insert nodeList after children[pos]
+ this.children.splice(pos, 0, ...nodeList);
+ }
+ // this.triggerModifyChild("add", nodeList.length === 1 ? nodeList[0] : null);
+ tree.update(ChangeType.structure);
+ }
+ finally {
+ // if (tree.options.selectMode === "hier") {
+ // if (this.parent && this.parent.children) {
+ // this.fixSelection3FromEndNodes();
+ // } else {
+ // // may happen when loading __root__;
+ // }
+ // }
+ tree.enableUpdate(true);
+ }
+ // if(isTopCall && loadLazy){
+ // this.logWarn("addChildren(): loadLazy is not yet implemented.")
+ // }
+ return nodeList[0];
+ }
+ /**
+ * Append or prepend a node, or append a child node.
+ *
+ * This a convenience function that calls addChildren()
+ *
+ * @param nodeData node definition
+ * @param [mode=child] 'before', 'after', 'firstChild', or 'child' ('over' is a synonym for 'child')
+ * @returns new node
+ */
+ addNode(nodeData, mode = "appendChild") {
+ if (mode === "over") {
+ mode = "appendChild"; // compatible with drop region
+ }
+ switch (mode) {
+ case "after":
+ return this.parent.addChildren(nodeData, {
+ before: this.getNextSibling(),
+ });
+ case "before":
+ return this.parent.addChildren(nodeData, { before: this });
+ case "prependChild":
+ // Insert before the first child if any
+ // let insertBefore = this.children ? this.children[0] : undefined;
+ return this.addChildren(nodeData, { before: 0 });
+ case "appendChild":
+ return this.addChildren(nodeData);
+ }
+ assert(false, `Invalid mode: ${mode}`);
+ return undefined;
+ }
+ /**
+ * Apply a modification (or navigation) operation.
+ *
+ * @see {@link Wunderbaum.applyCommand}
+ */
+ applyCommand(cmd, options) {
+ return this.tree.applyCommand(cmd, this, options);
+ }
+ /**
+ * Collapse all expanded sibling nodes if any.
+ * (Automatically called when `autoCollapse` is true.)
+ */
+ collapseSiblings(options) {
+ for (const node of this.parent.children) {
+ if (node !== this && node.expanded) {
+ node.setExpanded(false, options);
+ }
+ }
+ }
+ /**
+ * Add/remove one or more classes to ``.
+ *
+ * This also maintains `node.classes`, so the class will survive a re-render.
+ *
+ * @param className one or more class names. Multiple classes can be passed
+ * as space-separated string, array of strings, or set of strings.
+ */
+ setClass(className, flag = true) {
+ const cnSet = toSet(className);
+ if (flag) {
+ if (this.classes === null) {
+ this.classes = new Set();
+ }
+ cnSet.forEach((cn) => {
+ var _a;
+ this.classes.add(cn);
+ (_a = this._rowElem) === null || _a === void 0 ? void 0 : _a.classList.toggle(cn, flag);
+ });
+ }
+ else {
+ if (this.classes === null) {
+ return;
+ }
+ cnSet.forEach((cn) => {
+ var _a;
+ this.classes.delete(cn);
+ (_a = this._rowElem) === null || _a === void 0 ? void 0 : _a.classList.toggle(cn, flag);
+ });
+ if (this.classes.size === 0) {
+ this.classes = null;
+ }
+ }
+ }
+ /** Start editing this node's title. */
+ startEditTitle() {
+ this.tree._callMethod("edit.startEditTitle", this);
+ }
+ /** Call `setExpanded()` on all descendant nodes. */
+ async expandAll(flag = true, options) {
+ const tree = this.tree;
+ const minExpandLevel = this.tree.options.minExpandLevel;
+ const { depth = 99, loadLazy, force, keepActiveNodeVisible = true, } = options !== null && options !== void 0 ? options : {};
+ const expandOpts = {
+ scrollIntoView: false,
+ force: force,
+ loadLazy: loadLazy,
+ };
+ // this.logInfo(`expandAll(${flag})`);
+ // Expand all direct children in parallel:
+ async function _iter(n, level) {
+ var _a;
+ // n.logInfo(` _iter(${level})`);
+ if (level === 0) {
+ return;
+ }
+ // if (!flag && minExpandLevel && !force && n.getLevel() <= minExpandLevel) {
+ // return; // Do not collapse until minExpandLevel
+ // }
+ const level_1 = level == null ? null : level - 1;
+ const promises = [];
+ (_a = n.children) === null || _a === void 0 ? void 0 : _a.forEach((cn) => {
+ if (flag) {
+ if (!cn.expanded && (cn.children || (loadLazy && cn.lazy))) {
+ // Node is collapsed and may be expanded (i.e. has children or is lazy)
+ // Expanding may be async, so we store the promise.
+ // Also the recursion is delayed until expansion finished.
+ const p = cn.setExpanded(true, expandOpts);
+ promises.push(p);
+ p.then(async () => {
+ await _iter(cn, level_1);
+ });
+ }
+ else {
+ // We don't expand the node, but still visit descendants.
+ // There we may find lazy nodes, so we
+ promises.push(_iter(cn, level_1));
+ }
+ }
+ else {
+ // Collapsing is always synchronous, so no promises required
+ if (!minExpandLevel || force || cn.getLevel() > minExpandLevel) {
+ // Do not collapse until minExpandLevel
+ cn.setExpanded(false, expandOpts);
+ }
+ _iter(cn, level_1); // recursion, even if cn was already collapsed
+ }
+ });
+ return new Promise((resolve) => {
+ Promise.all(promises).then(() => {
+ resolve(true);
+ });
+ });
+ }
+ const tag = tree.logTime(`${this}.expandAll(${flag})`);
+ try {
+ tree.enableUpdate(false);
+ await _iter(this, depth);
+ }
+ finally {
+ tree.enableUpdate(true);
+ tree.logTimeEnd(tag);
+ }
+ if (tree.activeNode && keepActiveNodeVisible) {
+ tree.activeNode.scrollIntoView();
+ }
+ }
+ /**
+ * Find all descendant nodes that match condition (excluding self).
+ *
+ * If `match` is a string, search for exact node title.
+ * If `match` is a RegExp expression, apply it to node.title, using
+ * [RegExp.test()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test).
+ * If `match` is a callback, match all nodes for that the callback(node) returns true.
+ *
+ * Returns an empty array if no nodes were found.
+ *
+ * Examples:
+ * ```js
+ * // Match all node titles that match exactly 'Joe':
+ * nodeList = node.findAll("Joe")
+ * // Match all node titles that start with 'Joe' case sensitive:
+ * nodeList = node.findAll(/^Joe/)
+ * // Match all node titles that contain 'oe', case insensitive:
+ * nodeList = node.findAll(/oe/i)
+ * // Match all nodes with `data.price` >= 99:
+ * nodeList = node.findAll((n) => {
+ * return n.data.price >= 99;
+ * })
+ * ```
+ */
+ findAll(match) {
+ const matcher = typeof match === "function" ? match : makeNodeTitleMatcher(match);
+ const res = [];
+ this.visit((n) => {
+ if (matcher(n)) {
+ res.push(n);
+ }
+ });
+ return res;
+ }
+ /** Return the direct child with a given key, index or null. */
+ findDirectChild(ptr) {
+ const cl = this.children;
+ if (!cl) {
+ return null;
+ }
+ if (typeof ptr === "string") {
+ for (let i = 0, l = cl.length; i < l; i++) {
+ if (cl[i].key === ptr) {
+ return cl[i];
+ }
+ }
+ }
+ else if (typeof ptr === "number") {
+ return cl[ptr];
+ }
+ else if (ptr.parent === this) {
+ // Return null if `ptr` is not a direct child
+ return ptr;
+ }
+ return null;
+ }
+ /**
+ * Find first descendant node that matches condition (excluding self) or null.
+ *
+ * @see {@link WunderbaumNode.findAll} for examples.
+ */
+ findFirst(match) {
+ const matcher = typeof match === "function" ? match : makeNodeTitleMatcher(match);
+ let res = null;
+ this.visit((n) => {
+ if (matcher(n)) {
+ res = n;
+ return false;
+ }
+ });
+ return res;
+ }
+ /** Find a node relative to self.
+ *
+ * @see {@link Wunderbaum.findRelatedNode|tree.findRelatedNode()}
+ */
+ findRelatedNode(where, includeHidden = false) {
+ return this.tree.findRelatedNode(this, where, includeHidden);
+ }
+ /**
+ * Iterator version of {@link WunderbaumNode.format}.
+ */
+ *format_iter(name_cb, connectors) {
+ connectors !== null && connectors !== void 0 ? connectors : (connectors = [" ", " | ", " ╰─ ", " ├─ "]);
+ name_cb !== null && name_cb !== void 0 ? name_cb : (name_cb = (node) => "" + node);
+ function _is_last(node) {
+ const ca = node.parent.children;
+ return node === ca[ca.length - 1];
+ }
+ const _format_line = (node) => {
+ // https://www.measurethat.net/Benchmarks/Show/12196/0/arr-unshift-vs-push-reverse-small-array
+ const parts = [name_cb(node)];
+ parts.unshift(connectors[_is_last(node) ? 2 : 3]);
+ let p = node.parent;
+ while (p && p !== this) {
+ // `this` is the top node
+ parts.unshift(connectors[_is_last(p) ? 0 : 1]);
+ p = p.parent;
+ }
+ return parts.join("");
+ };
+ yield name_cb(this);
+ for (const node of this) {
+ yield _format_line(node);
+ }
+ }
+ /**
+ * Return a multiline string representation of a node/subnode hierarchy.
+ * Mostly useful for debugging.
+ *
+ * Example:
+ * ```js
+ * console.info(tree.getActiveNode().format((n)=>n.title));
+ * ```
+ * logs
+ * ```
+ * Books
+ * ├─ Art of War
+ * ╰─ Don Quixote
+ * ```
+ * @see {@link WunderbaumNode.format_iter}
+ */
+ format(name_cb, connectors) {
+ const a = [];
+ for (const line of this.format_iter(name_cb, connectors)) {
+ a.push(line);
+ }
+ return a.join("\n");
+ }
+ /** Return the `
` element with a given index or id.
+ * @returns {WunderbaumNode | null}
+ */
+ getColElem(colIdx) {
+ var _a;
+ if (typeof colIdx === "string") {
+ colIdx = this.tree.columns.findIndex((value) => value.id === colIdx);
+ }
+ const colElems = (_a = this._rowElem) === null || _a === void 0 ? void 0 : _a.querySelectorAll("span.wb-col");
+ return colElems ? colElems[colIdx] : null;
+ }
+ /**
+ * Return all nodes with the same refKey.
+ *
+ * @param includeSelf Include this node itself.
+ * @see {@link Wunderbaum.findByRefKey}
+ */
+ getCloneList(includeSelf = false) {
+ if (!this.refKey) {
+ return [];
+ }
+ const clones = this.tree.findByRefKey(this.refKey);
+ if (includeSelf) {
+ return clones;
+ }
+ return [...clones].filter((n) => n !== this);
+ }
+ /** Return the first child node or null.
+ * @returns {WunderbaumNode | null}
+ */
+ getFirstChild() {
+ return this.children ? this.children[0] : null;
+ }
+ /** Return the last child node or null.
+ * @returns {WunderbaumNode | null}
+ */
+ getLastChild() {
+ return this.children ? this.children[this.children.length - 1] : null;
+ }
+ /** Return node depth (starting with 1 for top level nodes). */
+ getLevel() {
+ let i = 0, p = this.parent;
+ while (p) {
+ i++;
+ p = p.parent;
+ }
+ return i;
+ }
+ /** Return the successive node (under the same parent) or null. */
+ getNextSibling() {
+ const ac = this.parent.children;
+ const idx = ac.indexOf(this);
+ return ac[idx + 1] || null;
+ }
+ /** Return the parent node (null for the system root node). */
+ getParent() {
+ // TODO: return null for top-level nodes?
+ return this.parent;
+ }
+ /** Return an array of all parent nodes (top-down).
+ * @param includeRoot Include the invisible system root node.
+ * @param includeSelf Include the node itself.
+ */
+ getParentList(includeRoot = false, includeSelf = false) {
+ const l = [];
+ let dtn = includeSelf ? this : this.parent;
+ while (dtn) {
+ if (includeRoot || dtn.parent) {
+ l.unshift(dtn);
+ }
+ dtn = dtn.parent;
+ }
+ return l;
+ }
+ /** Return a string representing the hierachical node path, e.g. "a/b/c".
+ * @param includeSelf
+ * @param node property name or callback
+ * @param separator
+ */
+ getPath(includeSelf = true, part = "title", separator = "/") {
+ // includeSelf = includeSelf !== false;
+ // part = part || "title";
+ // separator = separator || "/";
+ let val;
+ const path = [];
+ const isFunc = typeof part === "function";
+ this.visitParents((n) => {
+ if (n.parent) {
+ val = isFunc
+ ? part(n)
+ : n[part];
+ path.unshift(val);
+ }
+ return undefined; // TODO remove this line
+ }, includeSelf);
+ return path.join(separator);
+ }
+ /** Return the preceeding node (under the same parent) or null. */
+ getPrevSibling() {
+ const ac = this.parent.children;
+ const idx = ac.indexOf(this);
+ return ac[idx - 1] || null;
+ }
+ /** Return true if node has children.
+ * Return undefined if not sure, i.e. the node is lazy and not yet loaded.
+ */
+ hasChildren() {
+ if (this.lazy) {
+ if (this.children == null) {
+ return undefined; // null or undefined: Not yet loaded
+ }
+ else if (this.children.length === 0) {
+ return false; // Loaded, but response was empty
+ }
+ else if (this.children.length === 1 &&
+ this.children[0].isStatusNode()) {
+ return undefined; // Currently loading or load error
+ }
+ return true; // One or more child nodes
+ }
+ return !!(this.children && this.children.length);
+ }
+ /** Return true if node has className set. */
+ hasClass(className) {
+ return this.classes ? this.classes.has(className) : false;
+ }
+ /** Return true if this node is the currently active tree node. */
+ isActive() {
+ return this.tree.activeNode === this;
+ }
+ /** Return true if this node is a direct or indirect parent of `other`.
+ * @see {@link WunderbaumNode.isParentOf}
+ */
+ isAncestorOf(other) {
+ return other && other.isDescendantOf(this);
+ }
+ /** Return true if this node is a **direct** subnode of `other`.
+ * @see {@link WunderbaumNode.isDescendantOf}
+ */
+ isChildOf(other) {
+ return other && this.parent === other;
+ }
+ /** Return true if this node's refKey is used by at least one other node.
+ */
+ isClone() {
+ return !!this.refKey && this.tree.findByRefKey(this.refKey).length > 1;
+ }
+ /** Return true if this node's title spans all columns, i.e. the node has no
+ * grid cells.
+ */
+ isColspan() {
+ return !!this.getOption("colspan");
+ }
+ /** Return true if this node is a direct or indirect subnode of `other`.
+ * @see {@link WunderbaumNode.isChildOf}
+ */
+ isDescendantOf(other) {
+ if (!other || other.tree !== this.tree) {
+ return false;
+ }
+ let p = this.parent;
+ while (p) {
+ if (p === other) {
+ return true;
+ }
+ if (p === p.parent) {
+ error(`Recursive parent link: ${p}`);
+ }
+ p = p.parent;
+ }
+ return false;
+ }
+ /** Return true if this node has children, i.e. the node is generally expandable.
+ * If `andCollapsed` is set, we also check if this node is collapsed, i.e.
+ * an expand operation is currently possible.
+ */
+ isExpandable(andCollapsed = false) {
+ // `false` is never expandable (unoffical)
+ if ((andCollapsed && this.expanded) || this.children === false) {
+ return false;
+ }
+ if (this.children == null) {
+ return !!this.lazy; // null or undefined can trigger lazy load
+ }
+ if (this.children.length === 0) {
+ return !!this.tree.options.emptyChildListExpandable;
+ }
+ return true;
+ }
+ /** Return true if _this_ node is currently in edit-title mode.
+ *
+ * See {@link Wunderbaum.startEditTitle} to check if any node is currently edited.
+ */
+ isEditingTitle() {
+ return this.tree._callMethod("edit.isEditingTitle", this);
+ }
+ /** Return true if this node is currently expanded. */
+ isExpanded() {
+ return !!this.expanded;
+ }
+ /** Return true if this node is the first node of its parent's children. */
+ isFirstSibling() {
+ const p = this.parent;
+ return !p || p.children[0] === this;
+ }
+ /** Return true if this node is the last node of its parent's children. */
+ isLastSibling() {
+ const p = this.parent;
+ return !p || p.children[p.children.length - 1] === this;
+ }
+ /** Return true if this node is lazy (even if data was already loaded) */
+ isLazy() {
+ return !!this.lazy;
+ }
+ /** Return true if node is lazy and loaded. For non-lazy nodes always return true. */
+ isLoaded() {
+ return !this.lazy || this.hasChildren() !== undefined; // Also checks if the only child is a status node
+ }
+ /** Return true if node is currently loading, i.e. a GET request is pending. */
+ isLoading() {
+ return this._isLoading;
+ }
+ /** Return true if this node is a temporarily generated status node of type 'paging'. */
+ isPagingNode() {
+ return this.statusNodeType === "paging";
+ }
+ /** Return true if this node is a **direct** parent of `other`.
+ * @see {@link WunderbaumNode.isAncestorOf}
+ */
+ isParentOf(other) {
+ return other && other.parent === this;
+ }
+ /** (experimental) Return true if this node is partially loaded. */
+ isPartload() {
+ return !!this._partload;
+ }
+ /** Return true if this node is partially selected (tri-state). */
+ isPartsel() {
+ return !this.selected && !!this._partsel;
+ }
+ /** Return true if this node has DOM representaion, i.e. is displayed in the viewport. */
+ isRadio() {
+ return !!this.parent.radiogroup || this.getOption("checkbox") === "radio";
+ }
+ /** Return true if this node has DOM representaion, i.e. is displayed in the viewport. */
+ isRendered() {
+ return !!this._rowElem;
+ }
+ /** Return true if this node is the (invisible) system root node.
+ * @see {@link WunderbaumNode.isTopLevel}
+ */
+ isRootNode() {
+ return this.tree.root === this;
+ }
+ /** Return true if this node is selected, i.e. the checkbox is set.
+ * `undefined` if partly selected (tri-state), false otherwise.
+ */
+ isSelected() {
+ return this.selected ? true : this._partsel ? undefined : false;
+ }
+ /** Return true if this node is a temporarily generated system node like
+ * 'loading', 'paging', or 'error' (node.statusNodeType contains the type).
+ */
+ isStatusNode() {
+ return !!this.statusNodeType;
+ }
+ /** Return true if this a top level node, i.e. a direct child of the (invisible) system root node. */
+ isTopLevel() {
+ return this.tree.root === this.parent;
+ }
+ /** Return true if node is marked lazy but not yet loaded.
+ * For non-lazy nodes always return false.
+ */
+ isUnloaded() {
+ // Also checks if the only child is a status node:
+ return this.hasChildren() === undefined;
+ }
+ /** Return true if all parent nodes are expanded. Note: this does not check
+ * whether the node is scrolled into the visible part of the screen or viewport.
+ */
+ isVisible() {
+ const hasFilter = this.tree.filterMode === "hide";
+ const parents = this.getParentList(false, false);
+ // TODO: check $(n.span).is(":visible")
+ // i.e. return false for nodes (but not parents) that are hidden
+ // by a filter
+ if (hasFilter && !this.match && !this.subMatchCount) {
+ // this.debug( "isVisible: HIDDEN (" + hasFilter + ", " + this.match + ", " + this.match + ")" );
+ return false;
+ }
+ for (let i = 0, l = parents.length; i < l; i++) {
+ const n = parents[i];
+ if (!n.expanded) {
+ // this.debug("isVisible: HIDDEN (parent collapsed)");
+ return false;
+ }
+ // if (hasFilter && !n.match && !n.subMatchCount) {
+ // this.debug("isVisible: HIDDEN (" + hasFilter + ", " + this.match + ", " + this.match + ")");
+ // return false;
+ // }
+ }
+ // this.debug("isVisible: VISIBLE");
+ return true;
+ }
+ _loadSourceObject(source, level) {
+ var _a;
+ const tree = this.tree;
+ level !== null && level !== void 0 ? level : (level = this.getLevel());
+ // Let caller modify the parsed JSON response:
+ const res = this._callEvent("receive", { response: source });
+ if (res != null) {
+ source = res;
+ }
+ if (isArray(source)) {
+ source = { children: source };
+ }
+ assert(isPlainObject(source), `Expected an array or plain object: ${source}`);
+ const format = (_a = source.format) !== null && _a !== void 0 ? _a : "nested";
+ assert(format === "nested" || format === "flat", `Expected source.format = 'nested' or 'flat': ${format}`);
+ // Pre-rocess for 'nested' or 'flat' format
+ decompressSourceData(source);
+ assert(source.children, "If `source` is an object, it must have a `children` property");
+ if (source.types) {
+ tree.logInfo("Redefine types", source.columns);
+ tree.setTypes(source.types, false);
+ delete source.types;
+ }
+ if (source.columns) {
+ tree.logInfo("Redefine columns", source.columns);
+ tree.columns = source.columns;
+ delete source.columns;
+ tree.update(ChangeType.colStructure);
+ }
+ this.addChildren(source.children);
+ // Add extra data to `tree.data`
+ for (const [key, value] of Object.entries(source)) {
+ if (!RESERVED_TREE_SOURCE_KEYS.has(key)) {
+ tree.data[key] = value;
+ // tree.logDebug(`Add source.${key} to tree.data.${key}`);
+ }
+ }
+ if (tree.options.selectMode === "hier") {
+ this.fixSelection3FromEndNodes();
+ }
+ this._callEvent("load");
+ }
+ async _fetchWithOptions(source) {
+ var _a, _b;
+ // Either a URL string or an object with a `.url` property.
+ let url, params, body, options, rest;
+ let fetchOpts = {};
+ if (typeof source === "string") {
+ // source is a plain URL string: assume GET request
+ url = source;
+ fetchOpts.method = "GET";
+ }
+ else if (isPlainObject(source)) {
+ // source is a plain object with `.url` property.
+ ({ url, params, body, options, ...rest } = source);
+ assert(!rest || Object.keys(rest).length === 0, `Unexpected source properties: ${Object.keys(rest)}. Use 'options' instead.`);
+ assert(typeof url === "string", `expected source.url as string`);
+ if (isPlainObject(options)) {
+ fetchOpts = options;
+ }
+ if (isPlainObject(body)) {
+ // we also accept 'body' as object...
+ assert(!fetchOpts.body, "options.body should be passed as source.body");
+ fetchOpts.body = JSON.stringify(fetchOpts.body);
+ (_a = fetchOpts.method) !== null && _a !== void 0 ? _a : (fetchOpts.method = "POST"); // set default
+ }
+ if (isPlainObject(params)) {
+ url += "?" + new URLSearchParams(params);
+ (_b = fetchOpts.method) !== null && _b !== void 0 ? _b : (fetchOpts.method = "GET"); // set default
+ }
+ }
+ else {
+ url = ""; // keep linter happy
+ error(`Unsupported source format: ${source}`);
+ }
+ this.setStatus(NodeStatusType.loading);
+ const response = await fetch(url, fetchOpts);
+ if (!response.ok) {
+ error(`GET ${url} returned ${response.status}, ${response}`);
+ }
+ return await response.json();
+ }
+ /** Download data from the cloud, then call `.update()`. */
+ async load(source) {
+ const tree = this.tree;
+ const requestId = Date.now();
+ const prevParent = this.parent;
+ const start = Date.now();
+ let elap = 0, elapLoad = 0, elapProcess = 0;
+ // Check for overlapping requests
+ if (this._requestId) {
+ this.logWarn(`Recursive load request #${requestId} while #${this._requestId} is pending.`);
+ // node.debug("Send load request #" + requestId);
+ }
+ this._requestId = requestId;
+ // const timerLabel = tree.logTime(this + ".load()");
+ try {
+ const url = typeof source === "string" ? source : source.url;
+ if (!url) {
+ // An array or a plain object (that does NOT contain a `.url` property)
+ // will be treated as native Wunderbaum data
+ if (typeof source.then === "function") {
+ const msg = tree.logTime(`Resolve thenable ${source}`);
+ source = await Promise.resolve(source);
+ tree.logTimeEnd(msg);
+ }
+ this._loadSourceObject(source);
+ elapProcess = Date.now() - start;
+ }
+ else {
+ // Either a URL string or an object with a `.url` property.
+ const data = await this._fetchWithOptions(source);
+ elapLoad = Date.now() - start;
+ if (this._requestId && this._requestId > requestId) {
+ this.logWarn(`Ignored load response #${requestId} because #${this._requestId} is pending.`);
+ return;
+ }
+ else {
+ this.logDebug(`Received response for load request #${requestId}`);
+ }
+ if (this.parent === null && prevParent !== null) {
+ this.logWarn("Lazy parent node was removed while loading: discarding response.");
+ return;
+ }
+ this.setStatus(NodeStatusType.ok);
+ // if (data.columns) {
+ // tree.logInfo("Re-define columns", data.columns);
+ // util.assert(!this.parent);
+ // tree.columns = data.columns;
+ // delete data.columns;
+ // tree.updateColumns({ calculateCols: false });
+ // }
+ const startProcess = Date.now();
+ this._loadSourceObject(data);
+ elapProcess = Date.now() - startProcess;
+ }
+ }
+ catch (error) {
+ this.logError("Error during load()", source, error);
+ this._callEvent("error", { error: error });
+ this.setStatus(NodeStatusType.error, { message: "" + error });
+ throw error;
+ }
+ finally {
+ this._requestId = 0;
+ elap = Date.now() - start;
+ if (tree.options.debugLevel >= 3) {
+ tree.logInfo(`Load source took ${elap / 1000} seconds ` +
+ `(transfer: ${elapLoad / 1000}s, ` +
+ `processing: ${elapProcess / 1000}s)`);
+ }
+ }
+ }
+ /**Load content of a lazy node. */
+ async loadLazy(forceReload = false) {
+ const wasExpanded = this.expanded;
+ assert(this.lazy, "load() requires a lazy node");
+ // _assert( forceReload || this.isUndefined(), "Pass forceReload=true to re-load a lazy node" );
+ if (!forceReload && !this.isUnloaded()) {
+ return;
+ }
+ if (this.isLoaded()) {
+ this.resetLazy(); // Also collapses if currently expanded
+ }
+ // `lazyLoad` may be long-running, so mark node as loading now. `this.load()`
+ // will reset the status later.
+ this.setStatus(NodeStatusType.loading);
+ try {
+ const source = await this._callEvent("lazyLoad");
+ if (source === false) {
+ this.setStatus(NodeStatusType.ok);
+ return;
+ }
+ assert(isArray(source) || (source && source.url), "The lazyLoad event must return a node list, `{url: ...}`, or false.");
+ await this.load(source);
+ this.setStatus(NodeStatusType.ok);
+ if (wasExpanded) {
+ this.expanded = true;
+ this.tree.update(ChangeType.structure);
+ }
+ else {
+ this.update(); // Fix expander icon to 'loaded'
+ }
+ }
+ catch (e) {
+ this.logError("Error during loadLazy()", e);
+ this._callEvent("error", { error: e });
+ this.setStatus(NodeStatusType.error, { message: "" + e });
+ }
+ return;
+ }
+ /** Alias for `logDebug` */
+ log(...args) {
+ this.logDebug(...args);
+ }
+ /* Log to console if opts.debugLevel >= 4 */
+ logDebug(...args) {
+ if (this.tree.options.debugLevel >= 4) {
+ console.log(this.toString(), ...args); // eslint-disable-line no-console
+ }
+ }
+ /* Log error to console. */
+ logError(...args) {
+ if (this.tree.options.debugLevel >= 1) {
+ console.error(this.toString(), ...args); // eslint-disable-line no-console
+ }
+ }
+ /* Log to console if opts.debugLevel >= 3 */
+ logInfo(...args) {
+ if (this.tree.options.debugLevel >= 3) {
+ console.info(this.toString(), ...args); // eslint-disable-line no-console
+ }
+ }
+ /* Log warning to console if opts.debugLevel >= 2 */
+ logWarn(...args) {
+ if (this.tree.options.debugLevel >= 2) {
+ console.warn(this.toString(), ...args); // eslint-disable-line no-console
+ }
+ }
+ /** Expand all parents and optionally scroll into visible area as neccessary.
+ * Promise is resolved, when lazy loading and animations are done.
+ * @param {object} [options] passed to `setExpanded()`.
+ * Defaults to {noAnimation: false, noEvents: false, scrollIntoView: true}
+ */
+ async makeVisible(options) {
+ let i;
+ const dfd = new Deferred();
+ const deferreds = [];
+ const parents = this.getParentList(false, false);
+ const len = parents.length;
+ const noAnimation = getOption(options, "noAnimation", false);
+ const scroll = getOption(options, "scrollIntoView", true);
+ // Expand bottom-up, so only the top node is animated
+ for (i = len - 1; i >= 0; i--) {
+ // self.debug("pushexpand" + parents[i]);
+ const seOpts = { noAnimation: noAnimation };
+ deferreds.push(parents[i].setExpanded(true, seOpts));
+ }
+ Promise.all(deferreds).then(() => {
+ // All expands have finished
+ // self.debug("expand DONE", scroll);
+ // Note: this.tree may be none when switching demo trees
+ if (scroll && this.tree) {
+ // Make sure markup and _rowIdx is updated before we do the scroll calculations
+ this.tree.updatePendingModifications();
+ this.scrollIntoView().then(() => {
+ // self.debug("scroll DONE");
+ dfd.resolve();
+ });
+ }
+ else {
+ dfd.resolve();
+ }
+ });
+ return dfd.promise();
+ }
+ /** Move this node to targetNode. */
+ moveTo(targetNode, mode = "appendChild", map) {
+ if (mode === "over") {
+ mode = "appendChild"; // compatible with drop region
+ }
+ if (mode === "prependChild") {
+ if (targetNode.children && targetNode.children.length) {
+ mode = "before";
+ targetNode = targetNode.children[0];
+ }
+ else {
+ mode = "appendChild";
+ }
+ }
+ let pos;
+ const tree = this.tree;
+ const prevParent = this.parent;
+ const targetParent = mode === "appendChild" ? targetNode : targetNode.parent;
+ if (this === targetNode) {
+ return;
+ }
+ else if (!this.parent) {
+ error("Cannot move system root");
+ }
+ else if (targetParent.isDescendantOf(this)) {
+ error("Cannot move a node to its own descendant");
+ }
+ if (targetParent !== prevParent) {
+ prevParent.triggerModifyChild("remove", this);
+ }
+ // Unlink this node from current parent
+ if (this.parent.children.length === 1) {
+ if (this.parent === targetParent) {
+ return; // #258
+ }
+ this.parent.children = this.parent.lazy ? [] : null;
+ this.parent.expanded = false;
+ }
+ else {
+ pos = this.parent.children.indexOf(this);
+ assert(pos >= 0, "invalid source parent");
+ this.parent.children.splice(pos, 1);
+ }
+ // Insert this node to target parent's child list
+ this.parent = targetParent;
+ if (targetParent.hasChildren()) {
+ switch (mode) {
+ case "appendChild":
+ // Append to existing target children
+ targetParent.children.push(this);
+ break;
+ case "before":
+ // Insert this node before target node
+ pos = targetParent.children.indexOf(targetNode);
+ assert(pos >= 0, "invalid target parent");
+ targetParent.children.splice(pos, 0, this);
+ break;
+ case "after":
+ // Insert this node after target node
+ pos = targetParent.children.indexOf(targetNode);
+ assert(pos >= 0, "invalid target parent");
+ targetParent.children.splice(pos + 1, 0, this);
+ break;
+ default:
+ error(`Invalid mode '${mode}'.`);
+ }
+ }
+ else {
+ targetParent.children = [this];
+ }
+ // Let caller modify the nodes
+ if (map) {
+ targetNode.visit(map, true);
+ }
+ if (targetParent === prevParent) {
+ targetParent.triggerModifyChild("move", this);
+ }
+ else {
+ // prevParent.triggerModifyChild("remove", this);
+ targetParent.triggerModifyChild("add", this);
+ }
+ // Handle cross-tree moves
+ if (tree !== targetNode.tree) {
+ // Fix node.tree for all source nodes
+ // util.assert(false, "Cross-tree move is not yet implemented.");
+ this.logWarn("Cross-tree moveTo is experimental!");
+ this.visit((n) => {
+ // TODO: fix selection state and activation, ...
+ n.tree = targetNode.tree;
+ }, true);
+ }
+ // Make sure we update async, because discarding the markup would prevent
+ // DragAndDrop to generate a dragend event on the source node
+ setTimeout(() => {
+ // Even indentation may have changed:
+ tree.update(ChangeType.any);
+ }, 0);
+ // TODO: fix selection state
+ // TODO: fix active state
+ }
+ /** Set focus relative to this node and optionally activate.
+ *
+ * 'left' collapses the node if it is expanded, or move to the parent
+ * otherwise.
+ * 'right' expands the node if it is collapsed, or move to the first
+ * child otherwise.
+ *
+ * @param where 'down', 'first', 'last', 'left', 'parent', 'right', or 'up'.
+ * (Alternatively the `event.key` that would normally trigger this move,
+ * e.g. `ArrowLeft` = 'left'.
+ * @param options
+ */
+ async navigate(where, options) {
+ // Allow to pass 'ArrowLeft' instead of 'left'
+ where = KEY_TO_ACTION_DICT[where] || where;
+ // Otherwise activate or focus the related node
+ const node = this.findRelatedNode(where);
+ if (!node) {
+ this.logWarn(`Could not find related node '${where}'.`);
+ return Promise.resolve(this);
+ }
+ // setFocus/setActive will scroll later (if autoScroll is specified)
+ try {
+ node.makeVisible({ scrollIntoView: false });
+ }
+ catch (e) {
+ // ignore
+ }
+ node.setFocus();
+ if ((options === null || options === void 0 ? void 0 : options.activate) === false) {
+ return Promise.resolve(this);
+ }
+ return node.setActive(true, { event: options === null || options === void 0 ? void 0 : options.event });
+ }
+ /** Delete this node and all descendants. */
+ remove() {
+ const tree = this.tree;
+ const pos = this.parent.children.indexOf(this);
+ this.triggerModify("remove");
+ this.parent.children.splice(pos, 1);
+ this.visit((n) => {
+ n.removeMarkup();
+ tree._unregisterNode(n);
+ }, true);
+ tree.update(ChangeType.structure);
+ }
+ /** Remove all descendants of this node. */
+ removeChildren() {
+ const tree = this.tree;
+ if (!this.children) {
+ return;
+ }
+ if (tree.activeNode && tree.activeNode.isDescendantOf(this)) {
+ tree.activeNode.setActive(false); // TODO: don't fire events
+ }
+ if (tree.focusNode && tree.focusNode.isDescendantOf(this)) {
+ tree.focusNode = null;
+ }
+ // TODO: persist must take care to clear select and expand cookies
+ // Unlink children to support GC
+ // TODO: also delete this.children (not possible using visit())
+ this.triggerModifyChild("remove", null);
+ this.visit((n) => {
+ tree._unregisterNode(n);
+ });
+ if (this.lazy) {
+ // 'undefined' would be interpreted as 'not yet loaded' for lazy nodes
+ this.children = [];
+ }
+ else {
+ this.children = null;
+ }
+ // util.assert(this.parent); // don't call this for root node
+ if (!this.isRootNode()) {
+ this.expanded = false;
+ }
+ this.tree.update(ChangeType.structure);
+ }
+ /** Remove all HTML markup from the DOM. */
+ removeMarkup() {
+ if (this._rowElem) {
+ delete this._rowElem._wb_node;
+ this._rowElem.remove();
+ this._rowElem = undefined;
+ }
+ }
+ _getRenderInfo() {
+ const allColInfosById = {};
+ const renderColInfosById = {};
+ const isColspan = this.isColspan();
+ const colElems = this._rowElem
+ ? (this._rowElem.querySelectorAll("span.wb-col"))
+ : null;
+ let idx = 0;
+ for (const col of this.tree.columns) {
+ allColInfosById[col.id] = {
+ id: col.id,
+ idx: idx,
+ elem: colElems ? colElems[idx] : null,
+ info: col,
+ };
+ // renderColInfosById only contains columns that need rendering:
+ if (!isColspan && col.id !== "*") {
+ renderColInfosById[col.id] = allColInfosById[col.id];
+ }
+ idx++;
+ }
+ return {
+ allColInfosById: allColInfosById,
+ renderColInfosById: renderColInfosById,
+ };
+ }
+ _createIcon(iconMap, parentElem, replaceChild, showLoading) {
+ let iconSpan;
+ let icon = this.getOption("icon");
+ if (this._errorInfo) {
+ icon = iconMap.error;
+ }
+ else if (this._isLoading && showLoading) {
+ // Status nodes, or nodes without expander (< minExpandLevel) should
+ // display the 'loading' status with the i.wb-icon span
+ icon = iconMap.loading;
+ }
+ if (icon === false) {
+ return null; // explicitly disabled: don't try default icons
+ }
+ if (typeof icon === "string") ;
+ else if (this.statusNodeType) {
+ icon = iconMap[this.statusNodeType];
+ }
+ else if (this.expanded) {
+ icon = iconMap.folderOpen;
+ }
+ else if (this.children) {
+ icon = iconMap.folder;
+ }
+ else if (this.lazy) {
+ icon = iconMap.folderLazy;
+ }
+ else {
+ icon = iconMap.doc;
+ }
+ // this.log("_createIcon: " + icon);
+ if (!icon) {
+ iconSpan = document.createElement("i");
+ iconSpan.className = "wb-icon";
+ }
+ else if (icon.indexOf("<") >= 0) {
+ // HTML
+ iconSpan = elemFromHtml(icon);
+ }
+ else if (TEST_IMG.test(icon)) {
+ // Image URL
+ iconSpan = elemFromHtml(``);
+ }
+ else {
+ // Class name
+ iconSpan = document.createElement("i");
+ iconSpan.className = "wb-icon " + icon;
+ }
+ if (replaceChild) {
+ parentElem.replaceChild(iconSpan, replaceChild);
+ }
+ else {
+ parentElem.appendChild(iconSpan);
+ }
+ // Event handler `tree.iconBadge` can return a badge text or HTMLSpanElement
+ const cbRes = this._callEvent("iconBadge", { iconSpan: iconSpan });
+ let badge = null;
+ if (cbRes != null && cbRes !== false) {
+ let classes = "";
+ let tooltip = "";
+ if (isPlainObject(cbRes)) {
+ badge = "" + cbRes.badge;
+ classes = cbRes.badgeClass ? " " + cbRes.badgeClass : "";
+ tooltip = cbRes.badgeTooltip ? ` title="${cbRes.badgeTooltip}"` : "";
+ }
+ else if (typeof cbRes === "number") {
+ badge = "" + cbRes;
+ }
+ else {
+ badge = cbRes; // string or HTMLSpanElement
+ }
+ if (typeof badge === "string") {
+ badge = elemFromHtml(`${escapeHtml(badge)} `);
+ }
+ if (badge) {
+ iconSpan.append(badge);
+ }
+ }
+ // this.log("_createIcon: ", iconSpan);
+ return iconSpan;
+ }
+ /**
+ * Create a whole new `` element.
+ * @see {@link WunderbaumNode._render}
+ */
+ _render_markup(opts) {
+ const tree = this.tree;
+ const treeOptions = tree.options;
+ const checkbox = this.getOption("checkbox");
+ const columns = tree.columns;
+ const level = this.getLevel();
+ const activeColIdx = tree.isRowNav() ? null : tree.activeColIdx;
+ let elem;
+ let rowDiv = this._rowElem;
+ let checkboxSpan = null;
+ let expanderSpan = null;
+ const isNew = !rowDiv;
+ assert(isNew, "Expected unrendered node");
+ assert(!isNew || (opts && opts.after), "opts.after expected, unless updating");
+ assert(!this.isRootNode(), "Root node not allowed");
+ rowDiv = document.createElement("div");
+ rowDiv.classList.add("wb-row");
+ rowDiv.style.top = this._rowIdx * ROW_HEIGHT + "px";
+ this._rowElem = rowDiv;
+ // Attach a node reference to the DOM Element:
+ rowDiv._wb_node = this;
+ const nodeElem = document.createElement("span");
+ nodeElem.classList.add("wb-node", "wb-col");
+ rowDiv.appendChild(nodeElem);
+ let ofsTitlePx = 0;
+ if (checkbox) {
+ checkboxSpan = document.createElement("i");
+ checkboxSpan.classList.add("wb-checkbox");
+ if (checkbox === "radio" || this.parent.radiogroup) {
+ checkboxSpan.classList.add("wb-radio");
+ }
+ nodeElem.appendChild(checkboxSpan);
+ ofsTitlePx += ICON_WIDTH;
+ }
+ for (let i = level - 1; i > 0; i--) {
+ elem = document.createElement("i");
+ elem.classList.add("wb-indent");
+ nodeElem.appendChild(elem);
+ ofsTitlePx += ICON_WIDTH;
+ }
+ if (!treeOptions.minExpandLevel || level > treeOptions.minExpandLevel) {
+ expanderSpan = document.createElement("i");
+ expanderSpan.classList.add("wb-expander");
+ nodeElem.appendChild(expanderSpan);
+ ofsTitlePx += ICON_WIDTH;
+ }
+ // Render the icon (show a 'loading' icon if we do not have an expander that
+ // we would prefer).
+ const iconSpan = this._createIcon(tree.iconMap, nodeElem, null, !expanderSpan);
+ if (iconSpan) {
+ ofsTitlePx += ICON_WIDTH;
+ }
+ const titleSpan = document.createElement("span");
+ titleSpan.classList.add("wb-title");
+ nodeElem.appendChild(titleSpan);
+ // this._callEvent("enhanceTitle", { titleSpan: titleSpan });
+ // Store the width of leading icons with the node, so we can calculate
+ // the width of the embedded title span later
+ nodeElem._ofsTitlePx = ofsTitlePx;
+ // Support HTML5 drag-n-drop
+ if (tree.options.dnd.dragStart) {
+ nodeElem.draggable = true;
+ }
+ // Render columns
+ const isColspan = this.isColspan();
+ if (!isColspan && columns.length > 1) {
+ let colIdx = 0;
+ for (const col of columns) {
+ colIdx++;
+ let colElem;
+ if (col.id === "*") {
+ colElem = nodeElem;
+ }
+ else {
+ colElem = document.createElement("span");
+ colElem.classList.add("wb-col");
+ rowDiv.appendChild(colElem);
+ }
+ if (colIdx === activeColIdx) {
+ colElem.classList.add("wb-active");
+ }
+ // Add classes from `columns` definition to `
` cells
+ col.classes ? colElem.classList.add(...col.classes.split(" ")) : 0;
+ colElem.style.left = col._ofsPx + "px";
+ colElem.style.width = col._widthPx + "px";
+ if (isNew && col.html) {
+ if (typeof col.html === "string") {
+ colElem.innerHTML = col.html;
+ }
+ }
+ }
+ }
+ // Attach to DOM as late as possible
+ const after = opts ? opts.after : "last";
+ switch (after) {
+ case "first":
+ tree.nodeListElement.prepend(rowDiv);
+ break;
+ case "last":
+ tree.nodeListElement.appendChild(rowDiv);
+ break;
+ default:
+ opts.after.after(rowDiv);
+ }
+ // Now go on and fill in data and update classes
+ opts.isNew = true;
+ this._render_data(opts);
+ }
+ /**
+ * Render `node.title`, `.icon` into an existing row.
+ *
+ * @see {@link WunderbaumNode._render}
+ */
+ _render_data(opts) {
+ assert(this._rowElem, "No _rowElem");
+ const tree = this.tree;
+ const treeOptions = tree.options;
+ const rowDiv = this._rowElem;
+ const isNew = !!opts.isNew; // Called by _render_markup()?
+ const preventScroll = !!opts.preventScroll;
+ const columns = tree.columns;
+ const isColspan = this.isColspan();
+ // Row markup already exists
+ const nodeElem = rowDiv.querySelector("span.wb-node");
+ const titleSpan = nodeElem.querySelector("span.wb-title");
+ const scrollTop = tree.element.scrollTop;
+ if (this.titleWithHighlight) {
+ titleSpan.innerHTML = this.titleWithHighlight;
+ }
+ else {
+ titleSpan.textContent = this.title; // TODO: this triggers scroll events
+ }
+ // NOTE: At least on Safari, this render call triggers a scroll event
+ // probably when a focused input is replaced.
+ if (preventScroll) {
+ tree.element.scrollTop = scrollTop;
+ }
+ // Set the width of the title span, so overflow ellipsis work
+ if (!treeOptions.skeleton) {
+ if (isColspan) {
+ const vpWidth = tree.element.clientWidth;
+ titleSpan.style.width =
+ vpWidth - nodeElem._ofsTitlePx - TITLE_SPAN_PAD_Y + "px";
+ }
+ else {
+ titleSpan.style.width =
+ columns[0]._widthPx -
+ nodeElem._ofsTitlePx -
+ TITLE_SPAN_PAD_Y +
+ "px";
+ }
+ }
+ // Update row classes
+ opts.isDataChange = true;
+ this._render_status(opts);
+ // Let user modify the result
+ if (this.statusNodeType) {
+ this._callEvent("renderStatusNode", {
+ isNew: isNew,
+ nodeElem: nodeElem,
+ isColspan: isColspan,
+ });
+ }
+ else if (this.parent) {
+ // Skip root node
+ const renderInfo = this._getRenderInfo();
+ this._callEvent("render", {
+ isNew: isNew,
+ nodeElem: nodeElem,
+ isColspan: isColspan,
+ allColInfosById: renderInfo.allColInfosById,
+ renderColInfosById: renderInfo.renderColInfosById,
+ });
+ }
+ }
+ /**
+ * Update row classes to reflect active, focuses, etc.
+ * @see {@link WunderbaumNode._render}
+ */
+ _render_status(opts) {
+ // this.log("_render_status", opts);
+ const tree = this.tree;
+ const iconMap = tree.iconMap;
+ const treeOptions = tree.options;
+ const typeInfo = this.type ? tree.types[this.type] : null;
+ const rowDiv = this._rowElem;
+ // Row markup already exists
+ const nodeElem = rowDiv.querySelector("span.wb-node");
+ const expanderSpan = nodeElem.querySelector("i.wb-expander");
+ const checkboxSpan = nodeElem.querySelector("i.wb-checkbox");
+ const rowClasses = ["wb-row"];
+ this.expanded ? rowClasses.push("wb-expanded") : 0;
+ this.lazy ? rowClasses.push("wb-lazy") : 0;
+ this.selected ? rowClasses.push("wb-selected") : 0;
+ this._partsel ? rowClasses.push("wb-partsel") : 0;
+ this === tree.activeNode ? rowClasses.push("wb-active") : 0;
+ this === tree.focusNode ? rowClasses.push("wb-focus") : 0;
+ this._errorInfo ? rowClasses.push("wb-error") : 0;
+ this._isLoading ? rowClasses.push("wb-loading") : 0;
+ this.isColspan() ? rowClasses.push("wb-colspan") : 0;
+ this.statusNodeType
+ ? rowClasses.push("wb-status-" + this.statusNodeType)
+ : 0;
+ this.match ? rowClasses.push("wb-match") : 0;
+ this.subMatchCount ? rowClasses.push("wb-submatch") : 0;
+ treeOptions.skeleton ? rowClasses.push("wb-skeleton") : 0;
+ // Replace previous classes:
+ rowDiv.className = rowClasses.join(" ");
+ // Add classes from `node.classes`
+ this.classes ? rowDiv.classList.add(...this.classes) : 0;
+ // Add classes from `tree.types[node.type]`
+ if (typeInfo && typeInfo.classes) {
+ rowDiv.classList.add(...typeInfo.classes);
+ }
+ if (expanderSpan) {
+ let image = null;
+ if (this._isLoading) {
+ image = iconMap.loading;
+ }
+ else if (this.isExpandable(false)) {
+ if (this.expanded) {
+ image = iconMap.expanderExpanded;
+ }
+ else {
+ image = iconMap.expanderCollapsed;
+ }
+ }
+ else if (this.lazy && this.children == null) {
+ image = iconMap.expanderLazy;
+ }
+ if (image == null) {
+ expanderSpan.classList.add("wb-indent");
+ }
+ else if (TEST_IMG.test(image)) {
+ expanderSpan.style.backgroundImage = `url('${image}')`;
+ }
+ else {
+ expanderSpan.className = "wb-expander " + image;
+ }
+ }
+ if (checkboxSpan) {
+ let cbclass = "wb-checkbox ";
+ if (this.isRadio()) {
+ cbclass += "wb-radio ";
+ if (this.selected) {
+ cbclass += iconMap.radioChecked;
+ // } else if (this._partsel) {
+ // cbclass += iconMap.radioUnknown;
+ }
+ else {
+ cbclass += iconMap.radioUnchecked;
+ }
+ }
+ else {
+ if (this.selected) {
+ cbclass += iconMap.checkChecked;
+ }
+ else if (this._partsel) {
+ cbclass += iconMap.checkUnknown;
+ }
+ else {
+ cbclass += iconMap.checkUnchecked;
+ }
+ }
+ checkboxSpan.className = cbclass;
+ }
+ // Fix active cell in cell-nav mode
+ if (!opts.isNew) {
+ let i = 0;
+ for (const colSpan of rowDiv.children) {
+ colSpan.classList.toggle("wb-active", i++ === tree.activeColIdx);
+ colSpan.classList.remove("wb-error", "wb-invalid");
+ }
+ // Update icon (if not opts.isNew, which would rebuild markup anyway)
+ const iconSpan = nodeElem.querySelector("i.wb-icon");
+ if (iconSpan) {
+ this._createIcon(tree.iconMap, nodeElem, iconSpan, !expanderSpan);
+ }
+ }
+ // Adjust column width
+ if (opts.resizeCols !== false && !this.isColspan()) {
+ const colElems = rowDiv.querySelectorAll("span.wb-col");
+ let idx = 0;
+ let ofs = 0;
+ for (const colDef of this.tree.columns) {
+ const colElem = colElems[idx];
+ colElem.style.left = `${ofs}px`;
+ colElem.style.width = `${colDef._widthPx}px`;
+ idx++;
+ ofs += colDef._widthPx;
+ }
+ }
+ }
+ /*
+ * Create or update node's markup.
+ *
+ * `options.change` defaults to ChangeType.data, which updates the title,
+ * icon, and status. It also triggers the `render` event, that lets the user
+ * create or update the content of embeded cell elements.
+ *
+ * If only the status or other class-only modifications have changed,
+ * `options.change` should be set to ChangeType.status instead for best
+ * efficiency.
+ *
+ * Calling `update()` is almost always a better alternative.
+ * @see {@link WunderbaumNode.update}
+ */
+ _render(options) {
+ // this.log("render", options);
+ const opts = Object.assign({ change: ChangeType.data }, options);
+ if (!this._rowElem) {
+ opts.change = ChangeType.row;
+ }
+ switch (opts.change) {
+ case "status":
+ this._render_status(opts);
+ break;
+ case "data":
+ this._render_data(opts);
+ break;
+ case "row":
+ // _rowElem is not yet created (asserted in _render_markup)
+ this._render_markup(opts);
+ break;
+ default:
+ error(`Invalid change type '${opts.change}'.`);
+ }
+ }
+ /**
+ * Remove all children, collapse, and set the lazy-flag, so that the lazyLoad
+ * event is triggered on next expand.
+ */
+ resetLazy() {
+ this.removeChildren();
+ this.expanded = false;
+ this.lazy = true;
+ this.children = null;
+ this.tree.update(ChangeType.structure);
+ }
+ /** Convert node (or whole branch) into a plain object.
+ *
+ * The result is compatible with node.addChildren().
+ *
+ * @param include child nodes
+ * @param callback(dict, node) is called for every node, in order to allow
+ * modifications.
+ * Return `false` to ignore this node or `"skip"` to include this node
+ * without its children.
+ * @see {@link Wunderbaum.toDictArray}.
+ */
+ toDict(recursive = false, callback) {
+ const dict = {};
+ NODE_DICT_PROPS.forEach((propName) => {
+ const val = this[propName];
+ if (val instanceof Set) {
+ // Convert Set to string (or skip if set is empty)
+ val.size
+ ? (dict[propName] = Array.prototype.join.call(val.keys(), " "))
+ : 0;
+ }
+ else if (val || val === false || val === 0) {
+ dict[propName] = val;
+ }
+ });
+ if (!isEmptyObject(this.data)) {
+ dict.data = extend({}, this.data);
+ if (isEmptyObject(dict.data)) {
+ delete dict.data;
+ }
+ }
+ if (callback) {
+ const res = callback(dict, this);
+ if (res === false) {
+ // Note: a return value of `false` is only used internally
+ return false; // Don't include this node nor its children
+ }
+ if (res === "skip") {
+ recursive = false; // Include this node, but not the children
+ }
+ }
+ if (recursive) {
+ if (isArray(this.children)) {
+ dict.children = [];
+ for (let i = 0, l = this.children.length; i < l; i++) {
+ const node = this.children[i];
+ if (!node.isStatusNode()) {
+ // Note: a return value of `false` is only used internally
+ const res = node.toDict(true, callback);
+ if (res !== false) {
+ dict.children.push(res);
+ }
+ }
+ }
+ }
+ }
+ return dict;
+ }
+ /** Return an option value that has a default, but may be overridden by a
+ * callback or a node instance attribute.
+ *
+ * Evaluation sequence:
+ *
+ * - If `tree.options.` is a callback that returns something, use that.
+ * - Else if `node.` is defined, use that.
+ * - Else if `tree.types[]` is a value, use that.
+ * - Else if `tree.options.` is a value, use that.
+ * - Else use `defaultValue`.
+ *
+ * @param name name of the option property (on node and tree)
+ * @param defaultValue return this if nothing else matched
+ * {@link Wunderbaum.getOption|Wunderbaum.getOption()}
+ */
+ getOption(name, defaultValue) {
+ const tree = this.tree;
+ let opts = tree.options;
+ // Lookup `name` in options dict
+ if (name.indexOf(".") >= 0) {
+ [opts, name] = name.split(".");
+ }
+ const value = opts[name]; // ?? defaultValue;
+ // A callback resolver always takes precedence
+ if (typeof value === "function") {
+ const res = value.call(tree, {
+ type: "resolve",
+ tree: tree,
+ node: this,
+ // typeInfo: this.type ? tree.types[this.type] : {},
+ });
+ if (res !== undefined) {
+ return res;
+ }
+ }
+ // If this node has an explicit local setting, use it:
+ if (this[name] !== undefined) {
+ return this[name];
+ }
+ // Use value from type definition if defined
+ const typeInfo = this.type ? tree.types[this.type] : undefined;
+ const res = typeInfo ? typeInfo[name] : undefined;
+ if (res !== undefined) {
+ return res;
+ }
+ // Use value from value options dict, fallback do default
+ return value !== null && value !== void 0 ? value : defaultValue;
+ }
+ /** Make sure that this node is visible in the viewport.
+ * @see {@link Wunderbaum.scrollTo|Wunderbaum.scrollTo()}
+ */
+ async scrollIntoView(options) {
+ const opts = Object.assign({ node: this }, options);
+ return this.tree.scrollTo(opts);
+ }
+ /**
+ * Activate this node, deactivate previous, send events, activate column and
+ * scroll into viewport.
+ */
+ async setActive(flag = true, options) {
+ const tree = this.tree;
+ const prev = tree.activeNode;
+ const retrigger = options === null || options === void 0 ? void 0 : options.retrigger; // Default: false
+ const focusTree = options === null || options === void 0 ? void 0 : options.focusTree; // Default: false
+ // const focusNode = options?.focusNode !== false; // Default: true
+ const noEvents = options === null || options === void 0 ? void 0 : options.noEvents; // Default: false
+ const orgEvent = options === null || options === void 0 ? void 0 : options.event; // Default: null
+ const colIdx = options === null || options === void 0 ? void 0 : options.colIdx; // Default: null
+ const edit = options === null || options === void 0 ? void 0 : options.edit; // Default: false
+ assert(!colIdx || tree.isCellNav(), "colIdx requires cellNav");
+ assert(!edit || colIdx != null, "edit requires colIdx");
+ if (!noEvents) {
+ if (flag) {
+ if (prev !== this || retrigger) {
+ if ((prev === null || prev === void 0 ? void 0 : prev._callEvent("deactivate", {
+ nextNode: this,
+ event: orgEvent,
+ })) === false ||
+ this._callEvent("beforeActivate", {
+ prevNode: prev,
+ event: orgEvent,
+ }) === false) {
+ return;
+ }
+ tree.activeNode = null;
+ prev === null || prev === void 0 ? void 0 : prev.update(ChangeType.status);
+ }
+ }
+ else if (prev === this || retrigger) {
+ this._callEvent("deactivate", { nextNode: null, event: orgEvent });
+ }
+ }
+ if (prev !== this) {
+ if (flag) {
+ tree.activeNode = this;
+ }
+ prev === null || prev === void 0 ? void 0 : prev.update(ChangeType.status);
+ this.update(ChangeType.status);
+ }
+ return this.makeVisible().then(() => {
+ if (flag) {
+ if (focusTree || edit) {
+ tree.setFocus();
+ tree.focusNode = this;
+ tree.focusNode.setFocus();
+ }
+ // if (focusNode || edit) {
+ // tree.focusNode = this;
+ // tree.focusNode.setFocus();
+ // }
+ if (colIdx != null && tree.isCellNav()) {
+ tree.setColumn(colIdx, { edit: edit });
+ }
+ if (!noEvents) {
+ this._callEvent("activate", { prevNode: prev, event: orgEvent });
+ }
+ }
+ });
+ }
+ /**
+ * Expand or collapse this node.
+ */
+ async setExpanded(flag = true, options) {
+ const { force, scrollIntoView, immediate } = options !== null && options !== void 0 ? options : {};
+ const sendEvents = !(options === null || options === void 0 ? void 0 : options.noEvents); // Default: send events
+ if (!flag &&
+ this.isExpanded() &&
+ this.getLevel() <= this.tree.getOption("minExpandLevel") &&
+ !force) {
+ this.logDebug("Ignored collapse request below expandLevel.");
+ return;
+ }
+ if (!flag === !this.expanded) {
+ return; // Nothing to do
+ }
+ if (sendEvents &&
+ this._callEvent("beforeExpand", { flag: flag }) === false) {
+ return;
+ }
+ // this.log("setExpanded()");
+ if (flag && this.getOption("autoCollapse")) {
+ this.collapseSiblings(options);
+ }
+ if (flag && this.lazy && this.children == null) {
+ await this.loadLazy();
+ }
+ this.expanded = flag;
+ const updateOpts = { immediate: immediate };
+ // const updateOpts = { immediate: !!util.getOption(options, "immediate") };
+ this.tree.update(ChangeType.structure, updateOpts);
+ if (flag && scrollIntoView) {
+ const lastChild = this.getLastChild();
+ if (lastChild) {
+ this.tree.updatePendingModifications();
+ lastChild.scrollIntoView({ topNode: this });
+ }
+ }
+ if (sendEvents) {
+ this._callEvent("expand", { flag: flag });
+ }
+ }
+ /**
+ * Set keyboard focus here.
+ * @see {@link setActive}
+ */
+ setFocus(flag = true) {
+ assert(!!flag, "Blur is not yet implemented");
+ const prev = this.tree.focusNode;
+ this.tree.focusNode = this;
+ prev === null || prev === void 0 ? void 0 : prev.update();
+ this.update();
+ }
+ /** Set a new icon path or class. */
+ setIcon(icon) {
+ this.icon = icon;
+ this.update();
+ }
+ /** Change node's {@link key} and/or {@link refKey}. */
+ setKey(key, refKey) {
+ throw new Error("Not yet implemented");
+ }
+ /**
+ * Trigger a repaint, typically after a status or data change.
+ *
+ * `change` defaults to 'data', which handles modifcations of title, icon,
+ * and column content. It can be reduced to 'ChangeType.status' if only
+ * active/focus/selected state has changed.
+ *
+ * This method will eventually call {@link WunderbaumNode._render()} with
+ * default options, but may be more consistent with the tree's
+ * {@link Wunderbaum.update()} API.
+ */
+ update(change = ChangeType.data) {
+ assert(change === ChangeType.status || change === ChangeType.data, `Invalid change type ${change}`);
+ this.tree.update(change, this);
+ }
+ /**
+ * Return an array of selected nodes.
+ * @param stopOnParents only return the topmost selected node (useful with selectMode 'hier')
+ */
+ getSelectedNodes(stopOnParents = false) {
+ const nodeList = [];
+ this.visit((node) => {
+ if (node.selected) {
+ nodeList.push(node);
+ if (stopOnParents === true) {
+ return "skip"; // stop processing this branch
+ }
+ }
+ });
+ return nodeList;
+ }
+ /** Toggle the check/uncheck state. */
+ toggleSelected(options) {
+ let flag = this.isSelected();
+ if (flag === undefined && !this.isRadio()) {
+ flag = this._anySelectable();
+ }
+ else {
+ flag = !flag;
+ }
+ return this.setSelected(flag, options);
+ }
+ /** Return true if at least on selectable descendant end-node is unselected. @internal */
+ _anySelectable() {
+ let found = false;
+ this.visit((node) => {
+ if (node.selected === false &&
+ !node.unselectable &&
+ !node.hasChildren() &&
+ !node.parent.radiogroup) {
+ found = true;
+ return false; // Stop iteration
+ }
+ });
+ return found;
+ }
+ /* Apply selection state to a single node. */
+ _changeSelectStatusProps(state) {
+ let changed = false;
+ switch (state) {
+ case false:
+ changed = this.selected || this._partsel;
+ this.selected = false;
+ this._partsel = false;
+ break;
+ case true:
+ changed = !this.selected || !this._partsel;
+ this.selected = true;
+ this._partsel = true;
+ break;
+ case undefined:
+ changed = this.selected || !this._partsel;
+ this.selected = false;
+ this._partsel = true;
+ break;
+ default:
+ error(`Invalid state: ${state}`);
+ }
+ if (changed) {
+ this.update();
+ }
+ return changed;
+ }
+ /**
+ * Fix selection status, after this node was (de)selected in `selectMode: 'hier'`.
+ * This includes (de)selecting all descendants.
+ */
+ fixSelection3AfterClick(opts) {
+ const force = !!(opts === null || opts === void 0 ? void 0 : opts.force);
+ const flag = this.isSelected();
+ this.visit((node) => {
+ if (node.radiogroup) {
+ return "skip"; // Don't (de)select this branch
+ }
+ if (force || !node.getOption("unselectable")) {
+ node._changeSelectStatusProps(flag);
+ }
+ });
+ this.fixSelection3FromEndNodes();
+ }
+ /**
+ * Fix selection status for multi-hier mode.
+ * Only end-nodes are considered to update the descendants branch and parents.
+ * Should be called after this node has loaded new children or after
+ * children have been modified using the API.
+ */
+ fixSelection3FromEndNodes(opts) {
+ const force = !!(opts === null || opts === void 0 ? void 0 : opts.force);
+ assert(this.tree.options.selectMode === "hier", "expected selectMode 'hier'");
+ // Visit all end nodes and adjust their parent's `selected` and `_partsel`
+ // attributes. Return selection state true, false, or undefined.
+ const _walk = (node) => {
+ let state;
+ const children = node.children;
+ if (children && children.length) {
+ // check all children recursively
+ let allSelected = true;
+ let someSelected = false;
+ for (let i = 0, l = children.length; i < l; i++) {
+ const child = children[i];
+ // the selection state of a node is not relevant; we need the end-nodes
+ const s = _walk(child);
+ if (s !== false) {
+ someSelected = true;
+ }
+ if (s !== true) {
+ allSelected = false;
+ }
+ }
+ state = allSelected ? true : someSelected ? undefined : false;
+ }
+ else {
+ // This is an end-node: simply report the status
+ state = !!node.selected;
+ }
+ // #939: Keep a `_partsel` flag that was explicitly set on a lazy node
+ if (node._partsel &&
+ !node.selected &&
+ node.lazy &&
+ node.children == null) {
+ state = undefined;
+ }
+ if (force || !node.getOption("unselectable")) {
+ node._changeSelectStatusProps(state);
+ }
+ return state;
+ };
+ _walk(this);
+ // Update parent's state
+ this.visitParents((node) => {
+ let state;
+ const children = node.children;
+ let allSelected = true;
+ let someSelected = false;
+ for (let i = 0, l = children.length; i < l; i++) {
+ const child = children[i];
+ state = !!child.selected;
+ // When fixing the parents, we trust the sibling status (i.e. we don't recurse)
+ if (state || child._partsel) {
+ someSelected = true;
+ }
+ if (!state) {
+ allSelected = false;
+ }
+ }
+ state = allSelected ? true : someSelected ? undefined : false;
+ node._changeSelectStatusProps(state);
+ });
+ }
+ /** Modify the check/uncheck state. */
+ setSelected(flag = true, options) {
+ const tree = this.tree;
+ const sendEvents = !(options === null || options === void 0 ? void 0 : options.noEvents); // Default: send events
+ const prev = this.isSelected();
+ const isRadio = this.parent && this.parent.radiogroup;
+ const selectMode = tree.options.selectMode;
+ const canSelect = (options === null || options === void 0 ? void 0 : options.force) || !this.getOption("unselectable");
+ flag = !!flag;
+ // this.logDebug(`setSelected(${flag})`, this);
+ if (!canSelect) {
+ return prev;
+ }
+ if ((options === null || options === void 0 ? void 0 : options.propagateDown) && selectMode === "multi") {
+ tree.runWithDeferredUpdate(() => {
+ this.visit((node) => {
+ node.setSelected(flag);
+ });
+ });
+ return prev;
+ }
+ if (flag === prev ||
+ (sendEvents && this._callEvent("beforeSelect", { flag: flag }) === false)) {
+ return prev;
+ }
+ tree.runWithDeferredUpdate(() => {
+ if (isRadio) {
+ // Radiobutton Group
+ if (!flag && !(options === null || options === void 0 ? void 0 : options.force)) {
+ return prev; // don't uncheck radio buttons
+ }
+ for (const sibling of this.parent.children) {
+ sibling.selected = sibling === this;
+ }
+ }
+ else {
+ this.selected = flag;
+ if (selectMode === "hier") {
+ this.fixSelection3AfterClick();
+ }
+ else if (selectMode === "single") {
+ tree.visit((n) => {
+ n.selected = false;
+ });
+ }
+ }
+ });
+ if (sendEvents) {
+ this._callEvent("select", { flag: flag });
+ }
+ return prev;
+ }
+ /** Display node status (ok, loading, error, noData) using styles and a dummy child node. */
+ setStatus(status, options) {
+ const tree = this.tree;
+ const message = options === null || options === void 0 ? void 0 : options.message;
+ const details = options === null || options === void 0 ? void 0 : options.details;
+ let statusNode = null;
+ const _clearStatusNode = () => {
+ // Remove dedicated dummy node, if any
+ const children = this.children;
+ if (children && children.length && children[0].isStatusNode()) {
+ children[0].remove();
+ }
+ };
+ const _setStatusNode = (data) => {
+ // Create/modify the dedicated dummy node for 'loading...' or
+ // 'error!' status. (only called for direct child of the invisible
+ // system root)
+ const children = this.children;
+ const firstChild = children ? children[0] : null;
+ assert(data.statusNodeType, "Not a status node");
+ assert(!firstChild || !firstChild.isStatusNode(), "Child must not be a status node");
+ statusNode = this.addNode(data, "prependChild");
+ statusNode.match = true;
+ tree.update(ChangeType.structure);
+ return statusNode;
+ };
+ _clearStatusNode();
+ switch (status) {
+ case "ok":
+ this._isLoading = false;
+ this._errorInfo = null;
+ break;
+ case "loading":
+ this._isLoading = true;
+ this._errorInfo = null;
+ if (this.parent) {
+ this.update(ChangeType.status);
+ }
+ else {
+ // If this is the invisible root, add a visible top-level node
+ _setStatusNode({
+ statusNodeType: status,
+ title: tree.options.strings.loading +
+ (message ? " (" + message + ")" : ""),
+ checkbox: false,
+ colspan: true,
+ tooltip: details,
+ });
+ }
+ // this.update();
+ break;
+ case "error":
+ _setStatusNode({
+ statusNodeType: status,
+ title: tree.options.strings.loadError +
+ (message ? " (" + message + ")" : ""),
+ checkbox: false,
+ colspan: true,
+ // classes: "wb-center",
+ tooltip: details,
+ });
+ this._isLoading = false;
+ this._errorInfo = { message: message, details: details };
+ break;
+ case "noData":
+ _setStatusNode({
+ statusNodeType: status,
+ title: message || tree.options.strings.noData,
+ checkbox: false,
+ colspan: true,
+ tooltip: details,
+ });
+ this._isLoading = false;
+ this._errorInfo = null;
+ break;
+ default:
+ error("invalid node status " + status);
+ }
+ tree.update(ChangeType.structure);
+ return statusNode;
+ }
+ /** Rename this node. */
+ setTitle(title) {
+ this.title = title;
+ this.update();
+ // this.triggerModify("rename"); // TODO
+ }
+ _sortChildren(cmp, deep) {
+ const cl = this.children;
+ if (!cl) {
+ return;
+ }
+ cl.sort(cmp);
+ if (deep) {
+ for (let i = 0, l = cl.length; i < l; i++) {
+ if (cl[i].children) {
+ cl[i]._sortChildren(cmp, deep);
+ }
+ }
+ }
+ }
+ /**
+ * Sort child list by title or custom criteria.
+ * @param {function} cmp custom compare function(a, b) that returns -1, 0, or 1
+ * (defaults to sorting by title).
+ * @param {boolean} deep pass true to sort all descendant nodes recursively
+ */
+ sortChildren(cmp = nodeTitleSorter, deep = false) {
+ this._sortChildren(cmp || nodeTitleSorter, deep);
+ this.tree.update(ChangeType.structure);
+ // this.triggerModify("sort"); // TODO
+ }
+ /**
+ * Trigger `modifyChild` event on a parent to signal that a child was modified.
+ * @param {string} operation Type of change: 'add', 'remove', 'rename', 'move', 'data', ...
+ */
+ triggerModifyChild(operation, child, extra) {
+ this.logDebug(`modifyChild(${operation})`, extra, child);
+ if (!this.tree.options.modifyChild) {
+ return;
+ }
+ if (child && child.parent !== this) {
+ error("child " + child + " is not a child of " + this);
+ }
+ this._callEvent("modifyChild", extend({ operation: operation, child: child }, extra));
+ }
+ /**
+ * Trigger `modifyChild` event on node.parent(!).
+ * @param {string} operation Type of change: 'add', 'remove', 'rename', 'move', 'data', ...
+ * @param {object} [extra]
+ */
+ triggerModify(operation, extra) {
+ // if (!this.parent) {
+ // return;
+ // }
+ this.parent.triggerModifyChild(operation, this, extra);
+ }
+ /**
+ * Call `callback(node)` for all descendant nodes in hierarchical order (depth-first, pre-order).
+ *
+ * Stop iteration, if fn() returns false. Skip current branch, if fn()
+ * returns "skip".
+ * Return false if iteration was stopped.
+ *
+ * @param {function} callback the callback function.
+ * Return false to stop iteration, return "skip" to skip this node and
+ * its children only.
+ * @see {@link IterableIterator}, {@link Wunderbaum.visit}.
+ */
+ visit(callback, includeSelf = false) {
+ let res = true;
+ const children = this.children;
+ if (includeSelf === true) {
+ res = callback(this);
+ if (res === false || res === "skip") {
+ return res;
+ }
+ }
+ if (children) {
+ for (let i = 0, l = children.length; i < l; i++) {
+ res = children[i].visit(callback, true);
+ if (res === false) {
+ break;
+ }
+ }
+ }
+ return res;
+ }
+ /** Call fn(node) for all parent nodes, bottom-up, including invisible system root.
+ * Stop iteration, if callback() returns false.
+ * Return false if iteration was stopped.
+ *
+ * @param callback the callback function. Return false to stop iteration
+ */
+ visitParents(callback, includeSelf = false) {
+ if (includeSelf && callback(this) === false) {
+ return false;
+ }
+ let p = this.parent;
+ while (p) {
+ if (callback(p) === false) {
+ return false;
+ }
+ p = p.parent;
+ }
+ return true;
+ }
+ /**
+ * Call fn(node) for all sibling nodes.
+ * Stop iteration, if fn() returns false.
+ * Return false if iteration was stopped.
+ *
+ * @param {function} fn the callback function.
+ * Return false to stop iteration.
+ */
+ visitSiblings(callback, includeSelf = false) {
+ const ac = this.parent.children;
+ for (let i = 0, l = ac.length; i < l; i++) {
+ const n = ac[i];
+ if (includeSelf || n !== this) {
+ if (callback(n) === false) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+ /**
+ * [ext-filter] Return true if this node is matched by current filter (or no filter is active).
+ */
+ isMatched() {
+ return !(this.tree.filterMode && !this.match);
+ }
+ }
+ WunderbaumNode.sequence = 0;
- /*!
- * Wunderbaum - ext-edit
- * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */
- // const START_MARKER = "\uFFF7";
- class EditExtension extends WunderbaumExtension {
- constructor(tree) {
- super(tree, "edit", {
- debounce: 100,
- minlength: 1,
- maxlength: null,
- trigger: [],
- trim: true,
- select: true,
- slowClickDelay: 1000,
- validity: true,
- // --- Events ---
- // (note: there is also the `tree.change` event.)
- beforeEdit: null,
- edit: null,
- apply: null,
- });
- this.curEditNode = null;
- this.relatedNode = null;
- this.debouncedOnChange = debounce(this._onChange.bind(this), this.getPluginOption("debounce"));
- }
- /*
- * Call an event handler, while marking the current node cell 'dirty'.
- */
- _applyChange(eventName, node, colElem, extra) {
- let res;
- node.log(`_applyChange(${eventName})`, extra);
- colElem.classList.add("wb-busy");
- colElem.classList.remove("wb-error");
- try {
- res = node._callEvent(eventName, extra);
- }
- catch (err) {
- node.logError(`Error in ${eventName} event handler`, err);
- colElem.classList.add("wb-error");
- colElem.classList.remove("wb-busy");
- }
- // Convert scalar return value to a resolved promise
- if (!(res instanceof Promise)) {
- res = Promise.resolve(res);
- }
- res
- .catch((err) => {
- node.logError(`Error in ${eventName} event promise`, err);
- colElem.classList.add("wb-error");
- })
- .finally(() => {
- colElem.classList.remove("wb-busy");
- });
- return res;
- }
- /*
- * Called for when a control that is embedded in a cell fires a `change` event.
- */
- _onChange(e) {
- // let res;
- const info = Wunderbaum.getEventInfo(e);
- const node = info.node;
- const colElem = info.colElem;
- if (!node || info.colIdx === 0) {
- this.tree.log("Ignored change event for removed element or node title");
- return;
- }
- this._applyChange("change", node, colElem, {
- info: info,
- event: e,
- inputElem: e.target,
- inputValue: Wunderbaum.util.getValueFromElem(e.target),
- });
- }
- // handleKey(e:KeyboardEvent):boolean {
- // if(this.tree.cellNavMode )
- // }
- init() {
- super.init();
- onEvent(this.tree.element, "change", //"change input",
- ".contenteditable,input,textarea,select",
- // #61: we must not debounce the `change`, event.target may be reset to null
- // when the debounced handler is called.
- // (e) => {
- // this.debouncedOnChange(e);
- // }
- (e) => this._onChange(e));
- }
- /* Called by ext_keynav to pre-process input. */
- _preprocessKeyEvent(data) {
- const event = data.event;
- const eventName = eventToString(event);
- const tree = this.tree;
- const trigger = this.getPluginOption("trigger");
- // const inputElem =
- // event.target && event.target.closest("input,[contenteditable]");
- // tree.logDebug(`_preprocessKeyEvent: ${eventName}, editing:${this.isEditingTitle()}`);
- // --- Title editing: apply/discard ---
- // if (inputElem) {
- if (this.isEditingTitle()) {
- switch (eventName) {
- case "Enter":
- this._stopEditTitle(true, { event: event });
- return false;
- case "Escape":
- this._stopEditTitle(false, { event: event });
- return false;
- }
- // If the event target is an input element or `contenteditable="true"`,
- // we ignore it as navigation command
- return false;
- }
- // --- Trigger title editing
- if (tree.isRowNav() || tree.activeColIdx === 0) {
- switch (eventName) {
- case "Enter":
- if (trigger.indexOf("macEnter") >= 0 && isMac) {
- this.startEditTitle();
- return false;
- }
- break;
- case "F2":
- if (trigger.indexOf("F2") >= 0) {
- // tree.setNavigationMode(NavigationMode.cellEdit);
- this.startEditTitle();
- return false;
- }
- break;
- }
- return true;
- }
- return true;
- }
- /** Return true if a title is currently being edited. */
- isEditingTitle(node) {
- return node ? this.curEditNode === node : !!this.curEditNode;
- }
- /** Start renaming, i.e. replace the title with an embedded ` `. */
- startEditTitle(node) {
- node = node !== null && node !== void 0 ? node : this.tree.getActiveNode();
- const validity = this.getPluginOption("validity");
- const select = this.getPluginOption("select");
- if (!node) {
- return;
- }
- this.tree.logDebug(`startEditTitle(node=${node})`);
- let inputHtml = node._callEvent("edit.beforeEdit");
- if (inputHtml === false) {
- node.logInfo("beforeEdit canceled operation.");
- return;
- }
- // `beforeEdit(e)` may return an input HTML string. Otherwise use a default.
- // (we also treat a `true` return value as 'use default'):
- if (inputHtml === true || !inputHtml) {
- const title = escapeHtml(node.title);
- inputHtml = ` `;
- }
- const titleSpan = node
- .getColElem(0)
- .querySelector(".wb-title");
- titleSpan.innerHTML = inputHtml;
- const inputElem = titleSpan.firstElementChild;
- if (validity) {
- // Permanently apply input validations (CSS and tooltip)
- inputElem.addEventListener("keydown", (e) => {
- inputElem.setCustomValidity("");
- if (!inputElem.reportValidity()) ;
- });
- }
- inputElem.focus();
- if (select) {
- inputElem.select();
- }
- this.curEditNode = node;
- node._callEvent("edit.edit", {
- inputElem: inputElem,
- });
- }
- /**
- *
- * @param apply
- * @returns
- */
- stopEditTitle(apply) {
- return this._stopEditTitle(apply, {});
- }
- /*
- *
- * @param apply
- * @param opts.canKeepOpen
- */
- _stopEditTitle(apply, options) {
- options !== null && options !== void 0 ? options : (options = {});
- const focusElem = document.activeElement;
- let newValue = focusElem ? getValueFromElem(focusElem) : null;
- const node = this.curEditNode;
- const forceClose = !!options.forceClose;
- const validity = this.getPluginOption("validity");
- if (newValue && this.getPluginOption("trim")) {
- newValue = newValue.trim();
- }
- if (!node) {
- this.tree.logDebug("stopEditTitle: not in edit mode.");
- return;
- }
- node.logDebug(`stopEditTitle(${apply})`, options, focusElem, newValue);
- if (apply && newValue !== null && newValue !== node.title) {
- const errMsg = focusElem.validationMessage;
- if (errMsg) {
- // input element's native validation failed
- throw new Error(`Input validation failed for "${newValue}": ${errMsg}.`);
- }
- const colElem = node.getColElem(0);
- this._applyChange("edit.apply", node, colElem, {
- oldValue: node.title,
- newValue: newValue,
- inputElem: focusElem,
- })
- .then((value) => {
- const errMsg = focusElem.validationMessage;
- if (validity && errMsg && value !== false) {
- // Handler called 'inputElem.setCustomValidity()' to signal error
- throw new Error(`Edit apply validation failed for "${newValue}": ${errMsg}.`);
- }
- // Discard the embedded ` `
- // node.logDebug("applyChange:", value, forceClose)
- if (!forceClose && value === false) {
- // Keep open
- return;
- }
- node === null || node === void 0 ? void 0 : node.setTitle(newValue);
- // NOTE: At least on Safari, this render call triggers a scroll event
- // probably because the focused input is replaced.
- this.curEditNode._render({ preventScroll: true });
- this.curEditNode = null;
- this.relatedNode = null;
- this.tree.setFocus(); // restore focus that was in the input element
- })
- .catch((err) => {
- node.logError(err);
- });
- // Trigger 'change' event for embedded ` `
- // focusElem.blur();
- }
- else {
- // Discard the embedded ` `
- // NOTE: At least on Safari, this render call triggers a scroll event
- // probably because the focused input is replaced.
- this.curEditNode._render({ preventScroll: true });
- this.curEditNode = null;
- this.relatedNode = null;
- // We discarded the , so we have to acquire keyboard focus again
- this.tree.setFocus();
- }
- }
- /**
- * Create a new child or sibling node and start edit mode.
- */
- createNode(mode = "after", node, init) {
- const tree = this.tree;
- node = node !== null && node !== void 0 ? node : tree.getActiveNode();
- assert(node, "No node was passed, or no node is currently active.");
- // const validity = this.getPluginOption("validity");
- mode = mode || "prependChild";
- if (init == null) {
- init = { title: "" };
- }
- else if (typeof init === "string") {
- init = { title: init };
- }
- else {
- assert(isPlainObject(init), `Expected a plain object: ${init}`);
- }
- // Make sure node is expanded (and loaded) in 'child' mode
- if ((mode === "prependChild" || mode === "appendChild") &&
- (node === null || node === void 0 ? void 0 : node.isExpandable(true))) {
- node.setExpanded().then(() => {
- this.createNode(mode, node, init);
- });
- return;
- }
- const newNode = node.addNode(init, mode);
- newNode.setClass("wb-edit-new");
- this.relatedNode = node;
- // Don't filter new nodes:
- newNode.match = true;
- newNode.makeVisible({ noAnimation: true }).then(() => {
- this.startEditTitle(newNode);
- });
- }
- }
+ /*!
+ * Wunderbaum - ext-edit
+ * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */
+ // const START_MARKER = "\uFFF7";
+ class EditExtension extends WunderbaumExtension {
+ constructor(tree) {
+ super(tree, "edit", {
+ debounce: 100,
+ minlength: 1,
+ maxlength: null,
+ trigger: [],
+ trim: true,
+ select: true,
+ slowClickDelay: 1000,
+ validity: true,
+ // --- Events ---
+ // (note: there is also the `tree.change` event.)
+ beforeEdit: null,
+ edit: null,
+ apply: null,
+ });
+ this.curEditNode = null;
+ this.relatedNode = null;
+ this.debouncedOnChange = debounce(this._onChange.bind(this), this.getPluginOption("debounce"));
+ }
+ /*
+ * Call an event handler, while marking the current node cell 'busy'.
+ * Deal with returned promises and ValidationError.
+ * Convert a ValidationError into a input.setCustomValidity() call and vice versa.
+ */
+ async _applyChange(eventName, node, colElem, inputElem, extra) {
+ node.log(`_applyChange(${eventName})`, extra);
+ colElem.classList.add("wb-busy");
+ colElem.classList.remove("wb-error", "wb-invalid");
+ inputElem.setCustomValidity("");
+ // Call event handler either ('change' or 'edit.appy'), which may return a
+ // promise or a scalar value or throw a ValidationError.
+ return new Promise((resolve, reject) => {
+ const res = node._callEvent(eventName, extra);
+ // normalize to promise, even if a scalar value was returned and await it
+ Promise.resolve(res)
+ .then((res) => {
+ resolve(res);
+ })
+ .catch((err) => {
+ reject(err);
+ });
+ })
+ .then((res) => {
+ if (!inputElem.checkValidity()) {
+ // Native validation failed or handler called 'inputElem.setCustomValidity()'
+ node.logWarn("inputElem.checkValidity() failed: throwing....");
+ throw new ValidationError(inputElem.validationMessage);
+ }
+ return res;
+ })
+ .catch((err) => {
+ if (err instanceof ValidationError) {
+ node.logWarn("catched ", err);
+ colElem.classList.add("wb-invalid");
+ if (inputElem.setCustomValidity && !inputElem.validationMessage) {
+ inputElem.setCustomValidity(err.message);
+ }
+ if (inputElem.validationMessage) {
+ inputElem.reportValidity();
+ }
+ // throw err;
+ }
+ else {
+ node.logError(`Error in ${eventName} event handler (throw e.util.ValidationError instead if this was intended)`, err);
+ colElem.classList.add("wb-error");
+ throw err;
+ }
+ })
+ .finally(() => {
+ colElem.classList.remove("wb-busy");
+ });
+ }
+ /*
+ * Called for when a control that is embedded in a cell fires a `change` event.
+ */
+ _onChange(e) {
+ const info = Wunderbaum.getEventInfo(e);
+ const node = info.node;
+ const colElem = info.colElem;
+ if (!node || info.colIdx === 0) {
+ this.tree.log("Ignored change event for removed element or node title");
+ return;
+ }
+ // See also WbChangeEventType
+ this._applyChange("change", node, colElem, e.target, {
+ info: info,
+ event: e,
+ inputElem: e.target,
+ inputValue: Wunderbaum.util.getValueFromElem(e.target),
+ inputValid: e.target.checkValidity(),
+ });
+ }
+ init() {
+ super.init();
+ onEvent(this.tree.element, "change", //"change input",
+ ".contenteditable,input,textarea,select",
+ // #61: we must not debounce the `change`, event.target may be reset to null
+ // when the debounced handler is called.
+ // (e) => {
+ // this.debouncedOnChange(e);
+ // }
+ (e) => this._onChange(e));
+ }
+ /* Called by ext_keynav to pre-process input. */
+ _preprocessKeyEvent(data) {
+ const event = data.event;
+ const eventName = eventToString(event);
+ const tree = this.tree;
+ const trigger = this.getPluginOption("trigger");
+ // const inputElem =
+ // event.target && event.target.closest("input,[contenteditable]");
+ // tree.logDebug(`_preprocessKeyEvent: ${eventName}, editing:${this.isEditingTitle()}`);
+ // --- Title editing: apply/discard ---
+ // if (inputElem) {
+ if (this.isEditingTitle()) {
+ switch (eventName) {
+ case "Enter":
+ this._stopEditTitle(true, { event: event });
+ return false;
+ case "Escape":
+ this._stopEditTitle(false, { event: event });
+ return false;
+ }
+ // If the event target is an input element or `contenteditable="true"`,
+ // we ignore it as navigation command
+ return false;
+ }
+ // --- Trigger title editing
+ if (tree.isRowNav() || tree.activeColIdx === 0) {
+ switch (eventName) {
+ case "Enter":
+ if (trigger.indexOf("macEnter") >= 0 && isMac) {
+ this.startEditTitle();
+ return false;
+ }
+ break;
+ case "F2":
+ if (trigger.indexOf("F2") >= 0) {
+ this.startEditTitle();
+ return false;
+ }
+ break;
+ }
+ return true;
+ }
+ return true;
+ }
+ /** Return true if a title is currently being edited. */
+ isEditingTitle(node) {
+ return node ? this.curEditNode === node : !!this.curEditNode;
+ }
+ /** Start renaming, i.e. replace the title with an embedded ` `. */
+ startEditTitle(node) {
+ node = node !== null && node !== void 0 ? node : this.tree.getActiveNode();
+ const validity = this.getPluginOption("validity");
+ const select = this.getPluginOption("select");
+ if (!node) {
+ return;
+ }
+ this.tree.logDebug(`startEditTitle(node=${node})`);
+ let inputHtml = node._callEvent("edit.beforeEdit");
+ if (inputHtml === false) {
+ node.logDebug("beforeEdit canceled operation.");
+ return;
+ }
+ // `beforeEdit(e)` may return an input HTML string. Otherwise use a default
+ // (we also treat a `true` return value as 'use default'):
+ if (inputHtml === true || !inputHtml) {
+ const title = escapeHtml(node.title);
+ let opt = this.getPluginOption("maxlength");
+ const maxlength = opt ? ` maxlength="${opt}"` : "";
+ opt = this.getPluginOption("minlength");
+ const minlength = opt ? ` minlength="${opt}"` : "";
+ const required = opt > 0 ? " required" : "";
+ inputHtml =
+ ` `;
+ }
+ const titleSpan = node
+ .getColElem(0)
+ .querySelector(".wb-title");
+ titleSpan.innerHTML = inputHtml;
+ const inputElem = titleSpan.firstElementChild;
+ if (validity) {
+ // Permanently apply input validations (CSS and tooltip)
+ inputElem.addEventListener("keydown", (e) => {
+ inputElem.setCustomValidity("");
+ if (!inputElem.reportValidity()) {
+ node.logWarn(`Invalid input: '${inputElem.value}'`);
+ }
+ });
+ }
+ inputElem.focus();
+ if (select) {
+ inputElem.select();
+ }
+ this.curEditNode = node;
+ node._callEvent("edit.edit", {
+ inputElem: inputElem,
+ });
+ }
+ /**
+ *
+ * @param apply
+ * @returns
+ */
+ stopEditTitle(apply) {
+ return this._stopEditTitle(apply, {});
+ }
+ /*
+ *
+ * @param apply
+ * @param opts.canKeepOpen
+ */
+ _stopEditTitle(apply, options) {
+ options !== null && options !== void 0 ? options : (options = {});
+ const focusElem = document.activeElement;
+ let newValue = focusElem ? getValueFromElem(focusElem) : null;
+ const node = this.curEditNode;
+ const forceClose = !!options.forceClose;
+ const validity = this.getPluginOption("validity");
+ if (newValue && this.getPluginOption("trim")) {
+ newValue = newValue.trim();
+ }
+ if (!node) {
+ this.tree.logDebug("stopEditTitle: not in edit mode.");
+ return;
+ }
+ node.logDebug(`stopEditTitle(${apply})`, options, focusElem, newValue);
+ if (apply && newValue !== null && newValue !== node.title) {
+ const errMsg = focusElem.validationMessage;
+ if (errMsg) {
+ // input element's native validation failed
+ throw new Error(`Input validation failed for "${newValue}": ${errMsg}.`);
+ }
+ const colElem = node.getColElem(0);
+ this._applyChange("edit.apply", node, colElem, focusElem, {
+ oldValue: node.title,
+ newValue: newValue,
+ inputElem: focusElem,
+ inputValid: focusElem.checkValidity(),
+ }).then((value) => {
+ const errMsg = focusElem.validationMessage;
+ if (validity && errMsg && value !== false) {
+ // Handler called 'inputElem.setCustomValidity()' to signal error
+ throw new Error(`Edit apply validation failed for "${newValue}": ${errMsg}.`);
+ }
+ // Discard the embedded ` `
+ // node.logDebug("applyChange:", value, forceClose)
+ if (!forceClose && value === false) {
+ // Keep open
+ return;
+ }
+ node === null || node === void 0 ? void 0 : node.setTitle(newValue);
+ // NOTE: At least on Safari, this render call triggers a scroll event
+ // probably because the focused input is replaced.
+ this.curEditNode._render({ preventScroll: true });
+ this.curEditNode = null;
+ this.relatedNode = null;
+ this.tree.setFocus(); // restore focus that was in the input element
+ });
+ // .catch((err) => {
+ // node.logError(err);
+ // });
+ // Trigger 'change' event for embedded ` `
+ // focusElem.blur();
+ }
+ else {
+ // Discard the embedded ` `
+ // NOTE: At least on Safari, this render call triggers a scroll event
+ // probably because the focused input is replaced.
+ this.curEditNode._render({ preventScroll: true });
+ this.curEditNode = null;
+ this.relatedNode = null;
+ // We discarded the , so we have to acquire keyboard focus again
+ this.tree.setFocus();
+ }
+ }
+ /**
+ * Create a new child or sibling node and start edit mode.
+ */
+ createNode(mode = "after", node, init) {
+ const tree = this.tree;
+ node = node !== null && node !== void 0 ? node : tree.getActiveNode();
+ assert(node, "No node was passed, or no node is currently active.");
+ // const validity = this.getPluginOption("validity");
+ mode = mode || "prependChild";
+ if (init == null) {
+ init = { title: "" };
+ }
+ else if (typeof init === "string") {
+ init = { title: init };
+ }
+ else {
+ assert(isPlainObject(init), `Expected a plain object: ${init}`);
+ }
+ // Make sure node is expanded (and loaded) in 'child' mode
+ if ((mode === "prependChild" || mode === "appendChild") &&
+ (node === null || node === void 0 ? void 0 : node.isExpandable(true))) {
+ node.setExpanded().then(() => {
+ this.createNode(mode, node, init);
+ });
+ return;
+ }
+ const newNode = node.addNode(init, mode);
+ newNode.setClass("wb-edit-new");
+ this.relatedNode = node;
+ // Don't filter new nodes:
+ newNode.match = true;
+ newNode.makeVisible({ noAnimation: true }).then(() => {
+ this.startEditTitle(newNode);
+ });
+ }
+ }
- /*!
- * wunderbaum.ts
- *
- * A treegrid control.
- *
- * Copyright (c) 2021-2023, Martin Wendt (https://wwWendt.de).
- * https://github.com/mar10/wunderbaum
- *
- * Released under the MIT license.
- * @version v0.7.0
- * @date Sat, 09 Dec 2023 13:47:27 GMT
- */
- // import "./wunderbaum.scss";
- class WbSystemRoot extends WunderbaumNode {
- constructor(tree) {
- super(tree, null, {
- key: "__root__",
- title: tree.id,
- });
- }
- toString() {
- return `WbSystemRoot@${this.key}<'${this.tree.id}'>`;
- }
- }
- /**
- * A persistent plain object or array.
- *
- * See also [[WunderbaumOptions]].
- */
- class Wunderbaum {
- constructor(options) {
- this.enabled = true;
- /** Contains additional data that was sent as response to an Ajax source load request. */
- this.data = {};
- this.extensionList = [];
- this.extensions = {};
- this.keyMap = new Map();
- this.refKeyMap = new Map();
- this.treeRowCount = 0;
- this._disableUpdateCount = 0;
- this._disableUpdateIgnoreCount = 0;
- /** Currently active node if any. */
- this.activeNode = null;
- /** Current node hat has keyboard focus if any. */
- this.focusNode = null;
- /** Shared properties, referenced by `node.type`. */
- this.types = {};
- /** List of column definitions. */
- this.columns = []; // any[] = [];
- this._columnsById = {};
- // Modification Status
- this.pendingChangeTypes = new Set();
- /** Expose some useful methods of the util.ts module as `tree._util`. */
- this._util = util;
- // --- SELECT ---
- // /** @internal */
- // public selectRangeAnchor: WunderbaumNode | null = null;
- // --- FILTER ---
- this.filterMode = null;
- // --- KEYNAV ---
- /** @internal Use `setColumn()`/`getActiveColElem()`*/
- this.activeColIdx = 0;
- /** @internal */
- this._cellNavMode = false;
- /** @internal */
- this.lastQuicksearchTime = 0;
- /** @internal */
- this.lastQuicksearchTerm = "";
- // --- EDIT ---
- this.lastClickTime = 0;
- /** Alias for {@link Wunderbaum.logDebug}.
- * @alias Wunderbaum.logDebug
- */
- this.log = this.logDebug;
- const opts = (this.options = extend({
- id: null,
- source: null,
- element: null,
- debugLevel: DEFAULT_DEBUGLEVEL,
- header: null,
- // headerHeightPx: ROW_HEIGHT,
- rowHeightPx: ROW_HEIGHT,
- iconMap: "bootstrap",
- columns: null,
- types: null,
- // escapeTitles: true,
- enabled: true,
- fixedCol: false,
- showSpinner: false,
- checkbox: false,
- minExpandLevel: 0,
- emptyChildListExpandable: false,
- // updateThrottleWait: 200,
- skeleton: false,
- connectTopBreadcrumb: null,
- selectMode: "multi",
- // --- KeyNav ---
- navigationModeOption: null,
- quicksearch: true,
- // --- Events ---
- iconBadge: null,
- change: null,
- // enhanceTitle: null,
- error: null,
- receive: null,
- // --- Strings ---
- strings: {
- loadError: "Error",
- loading: "Loading...",
- // loading: "Loading…",
- noData: "No data",
- },
- }, options));
- const readyDeferred = new Deferred();
- this.ready = readyDeferred.promise();
- let readyOk = false;
- this.ready
- .then(() => {
- readyOk = true;
- try {
- this._callEvent("init");
- }
- catch (error) {
- // We re-raise in the reject handler, but Chrome resets the stack
- // frame then, so we log it here:
- this.logError("Exception inside `init(e)` event:", error);
- }
- })
- .catch((err) => {
- if (readyOk) {
- // Error occurred in `init` handler. We can re-raise, but Chrome
- // resets the stack frame.
- throw err;
- }
- else {
- // Error in load process
- this._callEvent("init", { error: err });
- }
- });
- this.id = opts.id || "wb_" + ++Wunderbaum.sequence;
- this.root = new WbSystemRoot(this);
- this._registerExtension(new KeynavExtension(this));
- this._registerExtension(new EditExtension(this));
- this._registerExtension(new FilterExtension(this));
- this._registerExtension(new DndExtension(this));
- this._registerExtension(new GridExtension(this));
- this._registerExtension(new LoggerExtension(this));
- this._updateViewportThrottled = adaptiveThrottle(this._updateViewportImmediately.bind(this), {});
- // --- Evaluate options
- this.columns = opts.columns;
- delete opts.columns;
- if (!this.columns || !this.columns.length) {
- const title = typeof opts.header === "string" ? opts.header : this.id;
- this.columns = [{ id: "*", title: title, width: "*" }];
- }
- if (opts.types) {
- this.setTypes(opts.types, true);
- }
- delete opts.types;
- // --- Create Markup
- this.element = elemFromSelector(opts.element);
- assert(!!this.element, `Invalid 'element' option: ${opts.element}`);
- this.element.classList.add("wunderbaum");
- if (!this.element.getAttribute("tabindex")) {
- this.element.tabIndex = 0;
- }
- // Attach tree instance to
- this.element._wb_tree = this;
- // Create header markup, or take it from the existing html
- this.headerElement = this.element.querySelector("div.wb-header");
- const wantHeader = opts.header == null ? this.columns.length > 1 : !!opts.header;
- if (this.headerElement) {
- // User existing header markup to define `this.columns`
- assert(!this.columns, "`opts.columns` must not be set if markup already contains a header");
- this.columns = [];
- const rowElement = this.headerElement.querySelector("div.wb-row");
- for (const colDiv of rowElement.querySelectorAll("div")) {
- this.columns.push({
- id: colDiv.dataset.id || `col_${this.columns.length}`,
- // id: colDiv.dataset.id || null,
- title: "" + colDiv.textContent,
- // text: "" + colDiv.textContent,
- width: "*", // TODO: read from header span
- });
- }
- }
- else {
- // We need a row div, the rest will be computed from `this.columns`
- const coldivs = "
".repeat(this.columns.length);
- this.element.innerHTML = `
+ /*!
+ * wunderbaum.ts
+ *
+ * A treegrid control.
+ *
+ * Copyright (c) 2021-2023, Martin Wendt (https://wwWendt.de).
+ * https://github.com/mar10/wunderbaum
+ *
+ * Released under the MIT license.
+ * @version v0.8.0
+ * @date Thu, 11 Jan 2024 19:37:23 GMT
+ */
+ // import "./wunderbaum.scss";
+ class WbSystemRoot extends WunderbaumNode {
+ constructor(tree) {
+ super(tree, null, {
+ key: "__root__",
+ title: tree.id,
+ });
+ }
+ toString() {
+ return `WbSystemRoot@${this.key}<'${this.tree.id}'>`;
+ }
+ }
+ /**
+ * A persistent plain object or array.
+ *
+ * See also {@link WunderbaumOptions}.
+ */
+ class Wunderbaum {
+ constructor(options) {
+ this.enabled = true;
+ /** Contains additional data that was sent as response to an Ajax source load request. */
+ this.data = {};
+ this.extensionList = [];
+ this.extensions = {};
+ this.keyMap = new Map();
+ this.refKeyMap = new Map();
+ this.treeRowCount = 0;
+ this._disableUpdateCount = 0;
+ this._disableUpdateIgnoreCount = 0;
+ /** Currently active node if any. */
+ this.activeNode = null;
+ /** Current node hat has keyboard focus if any. */
+ this.focusNode = null;
+ /** Shared properties, referenced by `node.type`. */
+ this.types = {};
+ /** List of column definitions. */
+ this.columns = []; // any[] = [];
+ this._columnsById = {};
+ // Modification Status
+ this.pendingChangeTypes = new Set();
+ /** Expose some useful methods of the util.ts module as `tree._util`. */
+ this._util = util;
+ // --- SELECT ---
+ // /** @internal */
+ // public selectRangeAnchor: WunderbaumNode | null = null;
+ // --- FILTER ---
+ this.filterMode = null;
+ // --- KEYNAV ---
+ /** @internal Use `setColumn()`/`getActiveColElem()` to access. */
+ this.activeColIdx = 0;
+ /** @internal */
+ this._cellNavMode = false;
+ /** @internal */
+ this.lastQuicksearchTime = 0;
+ /** @internal */
+ this.lastQuicksearchTerm = "";
+ // --- EDIT ---
+ this.lastClickTime = 0;
+ /** Alias for {@link Wunderbaum.logDebug}.
+ * @alias Wunderbaum.logDebug
+ */
+ this.log = this.logDebug;
+ const opts = (this.options = extend({
+ id: null,
+ source: null,
+ element: null,
+ debugLevel: DEFAULT_DEBUGLEVEL,
+ header: null,
+ // headerHeightPx: ROW_HEIGHT,
+ rowHeightPx: ROW_HEIGHT,
+ iconMap: "bootstrap",
+ columns: null,
+ types: null,
+ // escapeTitles: true,
+ enabled: true,
+ fixedCol: false,
+ showSpinner: false,
+ checkbox: false,
+ minExpandLevel: 0,
+ emptyChildListExpandable: false,
+ // updateThrottleWait: 200,
+ skeleton: false,
+ connectTopBreadcrumb: null,
+ selectMode: "multi",
+ // --- KeyNav ---
+ navigationModeOption: null,
+ quicksearch: true,
+ // --- Events ---
+ iconBadge: null,
+ change: null,
+ // enhanceTitle: null,
+ error: null,
+ receive: null,
+ // --- Strings ---
+ strings: {
+ loadError: "Error",
+ loading: "Loading...",
+ // loading: "Loading…",
+ noData: "No data",
+ },
+ }, options));
+ const readyDeferred = new Deferred();
+ this.ready = readyDeferred.promise();
+ let readyOk = false;
+ this.ready
+ .then(() => {
+ readyOk = true;
+ try {
+ this._callEvent("init");
+ }
+ catch (error) {
+ // We re-raise in the reject handler, but Chrome resets the stack
+ // frame then, so we log it here:
+ this.logError("Exception inside `init(e)` event:", error);
+ }
+ })
+ .catch((err) => {
+ if (readyOk) {
+ // Error occurred in `init` handler. We can re-raise, but Chrome
+ // resets the stack frame.
+ throw err;
+ }
+ else {
+ // Error in load process
+ this._callEvent("init", { error: err });
+ }
+ });
+ this.id = opts.id || "wb_" + ++Wunderbaum.sequence;
+ this.root = new WbSystemRoot(this);
+ this._registerExtension(new KeynavExtension(this));
+ this._registerExtension(new EditExtension(this));
+ this._registerExtension(new FilterExtension(this));
+ this._registerExtension(new DndExtension(this));
+ this._registerExtension(new GridExtension(this));
+ this._registerExtension(new LoggerExtension(this));
+ this._updateViewportThrottled = adaptiveThrottle(this._updateViewportImmediately.bind(this), {});
+ // --- Evaluate options
+ this.columns = opts.columns;
+ delete opts.columns;
+ if (!this.columns || !this.columns.length) {
+ const title = typeof opts.header === "string" ? opts.header : this.id;
+ this.columns = [{ id: "*", title: title, width: "*" }];
+ }
+ if (opts.types) {
+ this.setTypes(opts.types, true);
+ }
+ delete opts.types;
+ // --- Create Markup
+ this.element = elemFromSelector(opts.element);
+ assert(!!this.element, `Invalid 'element' option: ${opts.element}`);
+ this.element.classList.add("wunderbaum");
+ if (!this.element.getAttribute("tabindex")) {
+ this.element.tabIndex = 0;
+ }
+ // Attach tree instance to
+ this.element._wb_tree = this;
+ // Create header markup, or take it from the existing html
+ this.headerElement = this.element.querySelector("div.wb-header");
+ const wantHeader = opts.header == null ? this.columns.length > 1 : !!opts.header;
+ if (this.headerElement) {
+ // User existing header markup to define `this.columns`
+ assert(!this.columns, "`opts.columns` must not be set if markup already contains a header");
+ this.columns = [];
+ const rowElement = this.headerElement.querySelector("div.wb-row");
+ for (const colDiv of rowElement.querySelectorAll("div")) {
+ this.columns.push({
+ id: colDiv.dataset.id || `col_${this.columns.length}`,
+ // id: colDiv.dataset.id || null,
+ title: "" + colDiv.textContent,
+ // text: "" + colDiv.textContent,
+ width: "*", // TODO: read from header span
+ });
+ }
+ }
+ else {
+ // We need a row div, the rest will be computed from `this.columns`
+ const coldivs = "
".repeat(this.columns.length);
+ this.element.innerHTML = `
`;
- if (!wantHeader) {
- const he = this.element.querySelector("div.wb-header");
- he.style.display = "none";
- }
- }
- //
- this.element.innerHTML += `
+ if (!wantHeader) {
+ const he = this.element.querySelector("div.wb-header");
+ he.style.display = "none";
+ }
+ }
+ //
+ this.element.innerHTML += `
`;
- this.listContainerElement = this.element.querySelector("div.wb-list-container");
- this.nodeListElement = this.listContainerElement.querySelector("div.wb-node-list");
- this.headerElement = this.element.querySelector("div.wb-header");
- this.element.classList.toggle("wb-grid", this.columns.length > 1);
- this._initExtensions();
- // --- apply initial options
- ["enabled", "fixedCol"].forEach((optName) => {
- if (opts[optName] != null) {
- this.setOption(optName, opts[optName]);
- }
- });
- // --- Load initial data
- if (opts.source) {
- if (opts.showSpinner) {
- this.nodeListElement.innerHTML =
- "
loading... ";
- }
- this.load(opts.source)
- .then(() => {
- // The source may have defined columns, so we may adjust the nav mode
- if (opts.navigationModeOption == null) {
- if (this.isGrid()) {
- this.setNavigationOption(NavModeEnum.cell);
- }
- else {
- this.setNavigationOption(NavModeEnum.row);
- }
- }
- else {
- this.setNavigationOption(opts.navigationModeOption);
- }
- readyDeferred.resolve();
- })
- .catch((error) => {
- readyDeferred.reject(error);
- })
- .finally(() => {
- var _a;
- (_a = this.element.querySelector("progress.spinner")) === null || _a === void 0 ? void 0 : _a.remove();
- this.element.classList.remove("wb-initializing");
- });
- }
- else {
- readyDeferred.resolve();
- }
- // Async mode is sometimes required, because this.element.clientWidth
- // has a wrong value at start???
- this.update(ChangeType.any);
- // --- Bind listeners
- this.element.addEventListener("scroll", (e) => {
- // this.log(`scroll, scrollTop:${e.target.scrollTop}`, e);
- this.update(ChangeType.scroll);
- });
- this.resizeObserver = new ResizeObserver((entries) => {
- // this.log("ResizeObserver: Size changed", entries);
- this.update(ChangeType.resize);
- });
- this.resizeObserver.observe(this.element);
- onEvent(this.nodeListElement, "click", "div.wb-row", (e) => {
- const info = Wunderbaum.getEventInfo(e);
- const node = info.node;
- const mouseEvent = e;
- // this.log("click", info);
- // if (this._selectRange(info) === false) {
- // return;
- // }
- if (this._callEvent("click", { event: e, node: node, info: info }) === false) {
- this.lastClickTime = Date.now();
- return false;
- }
- if (node) {
- if (mouseEvent.ctrlKey) {
- node.toggleSelected();
- return;
- }
- // Edit title if 'clickActive' is triggered:
- const trigger = this.getOption("edit.trigger");
- const slowClickDelay = this.getOption("edit.slowClickDelay");
- if (trigger.indexOf("clickActive") >= 0 &&
- info.region === "title" &&
- node.isActive() &&
- (!slowClickDelay || Date.now() - this.lastClickTime < slowClickDelay)) {
- this._callMethod("edit.startEditTitle", node);
- }
- if (info.colIdx >= 0) {
- node.setActive(true, { colIdx: info.colIdx, event: e });
- }
- else {
- node.setActive(true, { event: e });
- }
- if (info.region === NodeRegion.expander) {
- node.setExpanded(!node.isExpanded(), {
- scrollIntoView: options.scrollIntoViewOnExpandClick !== false,
- });
- }
- else if (info.region === NodeRegion.checkbox) {
- node.toggleSelected();
- }
- }
- this.lastClickTime = Date.now();
- });
- onEvent(this.nodeListElement, "dblclick", "div.wb-row", (e) => {
- const info = Wunderbaum.getEventInfo(e);
- const node = info.node;
- // this.log("dblclick", info, e);
- if (this._callEvent("dblclick", { event: e, node: node, info: info }) ===
- false) {
- return false;
- }
- if (node && info.colIdx === 0 && node.isExpandable()) {
- this._callMethod("edit._stopEditTitle");
- node.setExpanded(!node.isExpanded());
- }
- });
- onEvent(this.element, "keydown", (e) => {
- const info = Wunderbaum.getEventInfo(e);
- const eventName = eventToString(e);
- const node = info.node || this.getFocusNode();
- this._callHook("onKeyEvent", {
- event: e,
- node: node,
- info: info,
- eventName: eventName,
- });
- });
- onEvent(this.element, "focusin focusout", (e) => {
- const flag = e.type === "focusin";
- const targetNode = Wunderbaum.getNode(e);
- this._callEvent("focus", { flag: flag, event: e });
- if (flag && this.isRowNav() && !this.isEditing()) {
- if (opts.navigationModeOption === NavModeEnum.row) {
- targetNode === null || targetNode === void 0 ? void 0 : targetNode.setActive();
- }
- else {
- this.setCellNav();
- }
- }
- if (!flag) {
- this._callMethod("edit._stopEditTitle", true, {
- event: e,
- forceClose: true,
- });
- }
- });
- }
- /**
- * Return a Wunderbaum instance, from element, id, index, or event.
- *
- * ```js
- * getTree(); // Get first Wunderbaum instance on page
- * getTree(1); // Get second Wunderbaum instance on page
- * getTree(event); // Get tree for this mouse- or keyboard event
- * getTree("foo"); // Get tree for this `tree.options.id`
- * getTree("#tree"); // Get tree for this matching element
- * ```
- */
- static getTree(el) {
- if (el instanceof Wunderbaum) {
- return el;
- }
- else if (el instanceof WunderbaumNode) {
- return el.tree;
- }
- if (el === undefined) {
- el = 0; // get first tree
- }
- if (typeof el === "number") {
- el = document.querySelectorAll(".wunderbaum")[el]; // el was an integer: return nth element
- }
- else if (typeof el === "string") {
- // Search all trees for matching ID
- for (const treeElem of document.querySelectorAll(".wunderbaum")) {
- const tree = treeElem._wb_tree;
- if (tree && tree.id === el) {
- return tree;
- }
- }
- // Search by selector
- el = document.querySelector(el);
- if (!el) {
- return null;
- }
- }
- else if (el.target) {
- el = el.target;
- }
- assert(el instanceof Element, `Invalid el type: ${el}`);
- if (!el.matches(".wunderbaum")) {
- el = el.closest(".wunderbaum");
- }
- if (el && el._wb_tree) {
- return el._wb_tree;
- }
- return null;
- }
- /**
- * Return the icon-function -> icon-definition mapping.
- */
- get iconMap() {
- const map = this.options.iconMap;
- if (typeof map === "string") {
- return iconMaps[map];
- }
- return map;
- }
- /**
- * Return a WunderbaumNode instance from element or event.
- */
- static getNode(el) {
- if (!el) {
- return null;
- }
- else if (el instanceof WunderbaumNode) {
- return el;
- }
- else if (el.target !== undefined) {
- el = el.target; // el was an Event
- }
- // `el` is a DOM element
- // let nodeElem = obj.closest("div.wb-row");
- while (el) {
- if (el._wb_node) {
- return el._wb_node;
- }
- el = el.parentElement; //.parentNode;
- }
- return null;
- }
- /**
- * Iterate all descendant nodes depth-first, pre-order using `for ... of ...` syntax.
- * More concise, but slightly slower than {@link Wunderbaum.visit}.
- *
- * Example:
- * ```js
- * for(const node of tree) {
- * ...
- * }
- * ```
- */
- *[Symbol.iterator]() {
- yield* this.root;
- }
- /** @internal */
- _registerExtension(extension) {
- this.extensionList.push(extension);
- this.extensions[extension.id] = extension;
- // this.extensionMap.set(extension.id, extension);
- }
- /** Called on tree (re)init after markup is created, before loading. */
- _initExtensions() {
- for (const ext of this.extensionList) {
- ext.init();
- }
- }
- /** Add node to tree's bookkeeping data structures. */
- _registerNode(node) {
- const key = node.key;
- assert(key != null && !this.keyMap.has(key), `Missing or duplicate key: '${key}'.`);
- this.keyMap.set(key, node);
- const rk = node.refKey;
- if (rk) {
- const rks = this.refKeyMap.get(rk); // Set of nodes with this refKey
- if (rks) {
- rks.add(node);
- }
- else {
- this.refKeyMap.set(rk, new Set());
- }
- }
- }
- /** Remove node from tree's bookkeeping data structures. */
- _unregisterNode(node) {
- const rk = node.refKey;
- if (rk) {
- const rks = this.refKeyMap.get(rk);
- if (rks && rks.delete(node) && !rks.size) {
- // We just removed the last element
- this.refKeyMap.delete(rk);
- }
- }
- // mark as disposed
- node.tree = null;
- node.parent = null;
- // node.title = "DISPOSED: " + node.title
- // this.viewNodes.delete(node);
- node.removeMarkup();
- }
- /** Call all hook methods of all registered extensions.*/
- _callHook(hook, data = {}) {
- let res;
- const d = extend({}, { tree: this, options: this.options, result: undefined }, data);
- for (const ext of this.extensionList) {
- res = ext[hook].call(ext, d);
- if (res === false) {
- break;
- }
- if (d.result !== undefined) {
- res = d.result;
- }
- }
- return res;
- }
- /**
- * Call tree method or extension method if defined.
- *
- * Example:
- * ```js
- * tree._callMethod("edit.startEdit", "arg1", "arg2")
- * ```
- */
- _callMethod(name, ...args) {
- const [p, n] = name.split(".");
- const obj = n ? this.extensions[p] : this;
- const func = obj[n];
- if (func) {
- return func.apply(obj, args);
- }
- else {
- this.logError(`Calling undefined method '${name}()'.`);
- }
- }
- /**
- * Call event handler if defined in tree or tree.EXTENSION options.
- *
- * Example:
- * ```js
- * tree._callEvent("edit.beforeEdit", {foo: 42})
- * ```
- */
- _callEvent(type, extra) {
- const [p, n] = type.split(".");
- const opts = this.options;
- const func = n ? opts[p][n] : opts[p];
- if (func) {
- return func.call(this, extend({ type: type, tree: this, util: this._util }, extra));
- // } else {
- // this.logError(`Triggering undefined event '${type}'.`)
- }
- }
- /** Return the node for given row index. */
- _getNodeByRowIdx(idx) {
- // TODO: start searching from active node (reverse)
- let node = null;
- this.visitRows((n) => {
- if (n._rowIdx === idx) {
- node = n;
- return false;
- }
- });
- return node;
- }
- /** Return the topmost visible node in the viewport. */
- getTopmostVpNode(complete = true) {
- const gracePx = 1; // ignore subpixel scrolling
- const scrollParent = this.element;
- // const headerHeight = this.headerElement.clientHeight; // May be 0
- const scrollTop = scrollParent.scrollTop; // + headerHeight;
- let topIdx;
- if (complete) {
- topIdx = Math.ceil((scrollTop - gracePx) / ROW_HEIGHT);
- }
- else {
- topIdx = Math.floor(scrollTop / ROW_HEIGHT);
- }
- return this._getNodeByRowIdx(topIdx);
- }
- /** Return the lowest visible node in the viewport. */
- getLowestVpNode(complete = true) {
- const scrollParent = this.element;
- const headerHeight = this.headerElement.clientHeight; // May be 0
- const scrollTop = scrollParent.scrollTop;
- const clientHeight = scrollParent.clientHeight - headerHeight;
- let bottomIdx;
- if (complete) {
- bottomIdx = Math.floor((scrollTop + clientHeight) / ROW_HEIGHT) - 1;
- }
- else {
- bottomIdx = Math.ceil((scrollTop + clientHeight) / ROW_HEIGHT) - 1;
- }
- bottomIdx = Math.min(bottomIdx, this.count(true) - 1);
- return this._getNodeByRowIdx(bottomIdx);
- }
- /** Return preceeding visible node in the viewport. */
- _getPrevNodeInView(node, ofs = 1) {
- this.visitRows((n) => {
- node = n;
- if (ofs-- <= 0) {
- return false;
- }
- }, { reverse: true, start: node || this.getActiveNode() });
- return node;
- }
- /** Return following visible node in the viewport. */
- _getNextNodeInView(node, ofs = 1) {
- this.visitRows((n) => {
- node = n;
- if (ofs-- <= 0) {
- return false;
- }
- }, { reverse: false, start: node || this.getActiveNode() });
- return node;
- }
- /**
- * Append (or insert) a list of toplevel nodes.
- *
- * @see {@link WunderbaumNode.addChildren}
- */
- addChildren(nodeData, options) {
- return this.root.addChildren(nodeData, options);
- }
- /**
- * Apply a modification or navigation operation.
- *
- * Most of these commands simply map to a node or tree method.
- * This method is especially useful when implementing keyboard mapping,
- * context menus, or external buttons.
- *
- * Valid commands:
- * - 'moveUp', 'moveDown'
- * - 'indent', 'outdent'
- * - 'remove'
- * - 'edit', 'addChild', 'addSibling': (reqires ext-edit extension)
- * - 'cut', 'copy', 'paste': (use an internal singleton 'clipboard')
- * - 'down', 'first', 'last', 'left', 'parent', 'right', 'up': navigate
- *
- */
- applyCommand(cmd, nodeOrOpts, options) {
- let // clipboard,
- node, refNode;
- // options = $.extend(
- // { setActive: true, clipboard: CLIPBOARD },
- // options_
- // );
- if (nodeOrOpts instanceof WunderbaumNode) {
- node = nodeOrOpts;
- }
- else {
- node = this.getActiveNode();
- assert(options === undefined, `Unexpected options: ${options}`);
- options = nodeOrOpts;
- }
- // clipboard = options.clipboard;
- switch (cmd) {
- // Sorting and indentation:
- case "moveUp":
- refNode = node.getPrevSibling();
- if (refNode) {
- node.moveTo(refNode, "before");
- node.setActive();
- }
- break;
- case "moveDown":
- refNode = node.getNextSibling();
- if (refNode) {
- node.moveTo(refNode, "after");
- node.setActive();
- }
- break;
- case "indent":
- refNode = node.getPrevSibling();
- if (refNode) {
- node.moveTo(refNode, "appendChild");
- refNode.setExpanded();
- node.setActive();
- }
- break;
- case "outdent":
- if (!node.isTopLevel()) {
- node.moveTo(node.getParent(), "after");
- node.setActive();
- }
- break;
- // Remove:
- case "remove":
- refNode = node.getPrevSibling() || node.getParent();
- node.remove();
- if (refNode) {
- refNode.setActive();
- }
- break;
- // Add, edit (requires ext-edit):
- case "addChild":
- this._callMethod("edit.createNode", "prependChild");
- break;
- case "addSibling":
- this._callMethod("edit.createNode", "after");
- break;
- case "rename":
- this._callMethod("edit.startEditTitle");
- break;
- // Simple clipboard simulation:
- // case "cut":
- // clipboard = { mode: cmd, data: node };
- // break;
- // case "copy":
- // clipboard = {
- // mode: cmd,
- // data: node.toDict(function(d, n) {
- // delete d.key;
- // }),
- // };
- // break;
- // case "clear":
- // clipboard = null;
- // break;
- // case "paste":
- // if (clipboard.mode === "cut") {
- // // refNode = node.getPrevSibling();
- // clipboard.data.moveTo(node, "child");
- // clipboard.data.setActive();
- // } else if (clipboard.mode === "copy") {
- // node.addChildren(clipboard.data).setActive();
- // }
- // break;
- // Navigation commands:
- case "down":
- case "first":
- case "last":
- case "left":
- case "pageDown":
- case "pageUp":
- case "parent":
- case "right":
- case "up":
- return node.navigate(cmd);
- default:
- error(`Unhandled command: '${cmd}'`);
- }
- }
- /** Delete all nodes. */
- clear() {
- this.root.removeChildren();
- this.root.children = null;
- this.keyMap.clear();
- this.refKeyMap.clear();
- // this.viewNodes.clear();
- this.treeRowCount = 0;
- this.activeNode = null;
- this.focusNode = null;
- // this.types = {};
- // this. columns =[];
- // this._columnsById = {};
- // Modification Status
- // this.changedSince = 0;
- // this.changes.clear();
- // this.changedNodes.clear();
- // // --- FILTER ---
- // public filterMode: FilterModeType = null;
- // // --- KEYNAV ---
- // public activeColIdx = 0;
- // public cellNavMode = false;
- // public lastQuicksearchTime = 0;
- // public lastQuicksearchTerm = "";
- this.update(ChangeType.structure);
- }
- /**
- * Clear nodes and markup and detach events and observers.
- *
- * This method may be useful to free up resources before re-creating a tree
- * on an existing div, for example in unittest suites.
- * Note that this Wunderbaum instance becomes unusable afterwards.
- */
- destroy() {
- this.logInfo("destroy()...");
- this.clear();
- this.resizeObserver.disconnect();
- this.element.innerHTML = "";
- // Remove all event handlers
- this.element.outerHTML = this.element.outerHTML; // eslint-disable-line
- }
- /**
- * Return `tree.option.NAME` (also resolving if this is a callback).
- *
- * See also {@link WunderbaumNode.getOption|WunderbaumNode.getOption()}
- * to evaluate `node.NAME` setting and `tree.types[node.type].NAME`.
- *
- * @param name option name (use dot notation to access extension option, e.g.
- * `filter.mode`)
- */
- getOption(name, defaultValue) {
- let ext;
- let opts = this.options;
- // Lookup `name` in options dict
- if (name.indexOf(".") >= 0) {
- [ext, name] = name.split(".");
- opts = opts[ext];
- }
- let value = opts[name];
- // A callback resolver always takes precedence
- if (typeof value === "function") {
- value = value({ type: "resolve", tree: this });
- }
- // Use value from value options dict, fallback do default
- // console.info(name, value, opts)
- return value !== null && value !== void 0 ? value : defaultValue;
- }
- /**
- * Set tree option.
- * Use dot notation to set plugin option, e.g. "filter.mode".
- */
- setOption(name, value) {
- // this.log(`setOption(${name}, ${value})`);
- if (name.indexOf(".") >= 0) {
- const parts = name.split(".");
- const ext = this.extensions[parts[0]];
- ext.setPluginOption(parts[1], value);
- return;
- }
- this.options[name] = value;
- switch (name) {
- case "checkbox":
- this.update(ChangeType.any);
- break;
- case "enabled":
- this.setEnabled(!!value);
- break;
- case "fixedCol":
- this.element.classList.toggle("wb-fixed-col", !!value);
- break;
- }
- }
- /** Return true if the tree (or one of its nodes) has the input focus. */
- hasFocus() {
- return this.element.contains(document.activeElement);
- }
- /**
- * Return true if the tree displays a header. Grids have a header unless the
- * `header` option is set to `false`. Plain trees have a header if the `header`
- * option is a string or `true`.
- */
- hasHeader() {
- const header = this.options.header;
- return this.isGrid() ? header !== false : !!header;
- }
- /** Run code, but defer rendering of viewport until done.
- *
- * ```
- * tree.runWithDeferredUpdate(() => {
- * return someFuncThatWouldUpdateManyNodes();
- * });
- * ```
- */
- runWithDeferredUpdate(func, hint = null) {
- try {
- this.enableUpdate(false);
- const res = func();
- assert(!(res instanceof Promise), `Promise return not allowed: ${res}`);
- return res;
- }
- finally {
- this.enableUpdate(true);
- }
- }
- /** Recursively expand all expandable nodes (triggers lazy load if needed). */
- async expandAll(flag = true, options) {
- await this.root.expandAll(flag, options);
- }
- /** Recursively select all nodes. */
- selectAll(flag = true) {
- return this.root.setSelected(flag, { propagateDown: true });
- }
- /** Toggle select all nodes. */
- toggleSelect() {
- this.selectAll(this.root._anySelectable());
- }
- /**
- * Return an array of selected nodes.
- * @param stopOnParents only return the topmost selected node (useful with selectMode 'hier')
- */
- getSelectedNodes(stopOnParents = false) {
- return this.root.getSelectedNodes(stopOnParents);
- }
- /*
- * Return an array of selected nodes.
- */
- _selectRange(eventInfo) {
- this.logDebug("_selectRange", eventInfo);
- error("Not yet implemented.");
- // const mode = this.options.selectMode!;
- // if (mode !== "multi") {
- // this.logDebug(`Range selection only available for selectMode 'multi'`);
- // return;
- // }
- // if (eventInfo.canonicalName === "Meta+click") {
- // eventInfo.node?.toggleSelected();
- // return false; // don't
- // } else if (eventInfo.canonicalName === "Shift+click") {
- // let from = this.activeNode;
- // let to = eventInfo.node;
- // if (!from || !to || from === to) {
- // return;
- // }
- // this.runWithDeferredUpdate(() => {
- // this.visitRows(
- // (node) => {
- // node.setSelected();
- // },
- // {
- // includeHidden: true,
- // includeSelf: false,
- // start: from,
- // reverse: from!._rowIdx! > to!._rowIdx!,
- // }
- // );
- // });
- // return false;
- // }
- }
- /** Return the number of nodes in the data model.
- * @param visible if true, nodes that are hidden due to collapsed parents are ignored.
- */
- count(visible = false) {
- return visible ? this.treeRowCount : this.keyMap.size;
- }
- /** @internal sanity check. */
- _check() {
- let i = 0;
- this.visit((n) => {
- i++;
- });
- if (this.keyMap.size !== i) {
- this.logWarn(`_check failed: ${this.keyMap.size} !== ${i}`);
- }
- // util.assert(this.keyMap.size === i);
- }
- /**
- * Find all nodes that match condition.
- *
- * @see {@link WunderbaumNode.findAll}
- */
- findAll(match) {
- return this.root.findAll(match);
- }
- /**
- * Find first node that matches condition.
- *
- * @see {@link WunderbaumNode.findFirst}
- */
- findFirst(match) {
- return this.root.findFirst(match);
- }
- /**
- * Find first node that matches condition.
- *
- * @param match title string to search for, or a
- * callback function that returns `true` if a node is matched.
- * @see {@link WunderbaumNode.findFirst}
- *
- */
- findKey(key) {
- return this.keyMap.get(key) || null;
- }
- /**
- * Find the next visible node that starts with `match`, starting at `startNode`
- * and wrap-around at the end.
- */
- findNextNode(match, startNode) {
- //, visibleOnly) {
- let res = null;
- const firstNode = this.getFirstChild();
- const matcher = typeof match === "string" ? makeNodeTitleStartMatcher(match) : match;
- startNode = startNode || firstNode;
- function _checkNode(n) {
- // console.log("_check " + n)
- if (matcher(n)) {
- res = n;
- }
- if (res || n === startNode) {
- return false;
- }
- }
- this.visitRows(_checkNode, {
- start: startNode,
- includeSelf: false,
- });
- // Wrap around search
- if (!res && startNode !== firstNode) {
- this.visitRows(_checkNode, {
- start: firstNode,
- includeSelf: true,
- });
- }
- return res;
- }
- /**
- * Find a node relative to another node.
- *
- * @param node
- * @param where 'down', 'first', 'last', 'left', 'parent', 'right', or 'up'.
- * (Alternatively the keyCode that would normally trigger this move,
- * e.g. `$.ui.keyCode.LEFT` = 'left'.
- * @param includeHidden Not yet implemented
- */
- findRelatedNode(node, where, includeHidden = false) {
- let res = null;
- const pageSize = Math.floor(this.listContainerElement.clientHeight / ROW_HEIGHT);
- switch (where) {
- case "parent":
- if (node.parent && node.parent.parent) {
- res = node.parent;
- }
- break;
- case "first":
- // First visible node
- this.visit((n) => {
- if (n.isVisible()) {
- res = n;
- return false;
- }
- });
- break;
- case "last":
- this.visit((n) => {
- // last visible node
- if (n.isVisible()) {
- res = n;
- }
- });
- break;
- case "left":
- if (node.parent && node.parent.parent) {
- res = node.parent;
- }
- // if (node.expanded) {
- // node.setExpanded(false);
- // } else if (node.parent && node.parent.parent) {
- // res = node.parent;
- // }
- break;
- case "right":
- if (node.children && node.children.length) {
- res = node.children[0];
- }
- // if (this.cellNavMode) {
- // throw new Error("Not implemented");
- // } else {
- // if (!node.expanded && (node.children || node.lazy)) {
- // node.setExpanded();
- // res = node;
- // } else if (node.children && node.children.length) {
- // res = node.children[0];
- // }
- // }
- break;
- case "up":
- res = this._getPrevNodeInView(node);
- break;
- case "down":
- res = this._getNextNodeInView(node);
- break;
- case "pageDown":
- {
- const bottomNode = this.getLowestVpNode();
- // this.logDebug(`${where}(${node}) -> ${bottomNode}`);
- if (node._rowIdx < bottomNode._rowIdx) {
- res = bottomNode;
- }
- else {
- res = this._getNextNodeInView(node, pageSize);
- }
- }
- break;
- case "pageUp":
- if (node._rowIdx === 0) {
- res = node;
- }
- else {
- const topNode = this.getTopmostVpNode();
- // this.logDebug(`${where}(${node}) -> ${topNode}`);
- if (node._rowIdx > topNode._rowIdx) {
- res = topNode;
- }
- else {
- res = this._getPrevNodeInView(node, pageSize);
- }
- }
- break;
- default:
- this.logWarn("Unknown relation '" + where + "'.");
- }
- return res;
- }
- /**
- * Iterator version of {@link Wunderbaum.format}.
- */
- *format_iter(name_cb, connectors) {
- yield* this.root.format_iter(name_cb, connectors);
- }
- /**
- * Return multiline string representation of the node hierarchy.
- * Mostly useful for debugging.
- *
- * Example:
- * ```js
- * console.info(tree.format((n)=>n.title));
- * ```
- * logs
- * ```
- * Playground
- * ├─ Books
- * | ├─ Art of War
- * | ╰─ Don Quixote
- * ├─ Music
- * ...
- * ```
- *
- * @see {@link Wunderbaum.format_iter} and {@link WunderbaumNode.format}.
- */
- format(name_cb, connectors) {
- return this.root.format(name_cb, connectors);
- }
- /**
- * Return the active cell (`span.wb-col`) of the currently active node or null.
- */
- getActiveColElem() {
- if (this.activeNode && this.activeColIdx >= 0) {
- return this.activeNode.getColElem(this.activeColIdx);
- }
- return null;
- }
- /**
- * Return the currently active node or null.
- */
- getActiveNode() {
- return this.activeNode;
- }
- /**
- * Return the first top level node if any (not the invisible root node).
- */
- getFirstChild() {
- return this.root.getFirstChild();
- }
- /**
- * Return the currently active node or null.
- */
- getFocusNode() {
- return this.focusNode;
- }
- /** Return a {node: WunderbaumNode, region: TYPE} object for a mouse event.
- *
- * @param {Event} event Mouse event, e.g. click, ...
- * @returns {object} Return a {node: WunderbaumNode, region: TYPE} object
- * TYPE: 'title' | 'prefix' | 'expander' | 'checkbox' | 'icon' | undefined
- */
- static getEventInfo(event) {
- const target = event.target;
- const cl = target.classList;
- const parentCol = target.closest("span.wb-col");
- const node = Wunderbaum.getNode(target);
- const tree = node ? node.tree : Wunderbaum.getTree(event);
- const res = {
- event: event,
- canonicalName: eventToString(event),
- tree: tree,
- node: node,
- region: NodeRegion.unknown,
- colDef: undefined,
- colIdx: -1,
- colId: undefined,
- colElem: parentCol,
- };
- if (cl.contains("wb-title")) {
- res.region = NodeRegion.title;
- }
- else if (cl.contains("wb-expander")) {
- res.region = node.isExpandable()
- ? NodeRegion.expander
- : NodeRegion.prefix;
- }
- else if (cl.contains("wb-checkbox")) {
- res.region = NodeRegion.checkbox;
- }
- else if (cl.contains("wb-icon")) {
- //|| cl.contains("wb-custom-icon")) {
- res.region = NodeRegion.icon;
- }
- else if (cl.contains("wb-node")) {
- res.region = NodeRegion.title;
- }
- else if (parentCol) {
- res.region = NodeRegion.column;
- const idx = Array.prototype.indexOf.call(parentCol.parentNode.children, parentCol);
- res.colIdx = idx;
- }
- else if (cl.contains("wb-row")) {
- // Plain tree
- res.region = NodeRegion.title;
- }
- else {
- // Somewhere near the title
- if (event.type !== "mousemove" && !(event instanceof KeyboardEvent)) {
- tree === null || tree === void 0 ? void 0 : tree.logWarn("getEventInfo(): not found", event, res);
- }
- return res;
- }
- if (res.colIdx === -1) {
- res.colIdx = 0;
- }
- res.colDef = tree === null || tree === void 0 ? void 0 : tree.columns[res.colIdx];
- res.colDef != null ? (res.colId = res.colDef.id) : 0;
- // this.log("Event", event, res);
- return res;
- }
- /**
- * Return readable string representation for this instance.
- * @internal
- */
- toString() {
- return `Wunderbaum<'${this.id}'>`;
- }
- /** Return true if any node is currently in edit-title mode. */
- isEditing() {
- return this._callMethod("edit.isEditingTitle");
- }
- /**
- * Return true if any node is currently beeing loaded, i.e. a Ajax request is pending.
- */
- isLoading() {
- let res = false;
- this.root.visit((n) => {
- // also visit rootNode
- if (n._isLoading || n._requestId) {
- res = true;
- return false;
- }
- }, true);
- return res;
- }
- /** Log to console if opts.debugLevel >= 4 */
- logDebug(...args) {
- if (this.options.debugLevel >= 4) {
- console.log(this.toString(), ...args); // eslint-disable-line no-console
- }
- }
- /** Log error to console. */
- logError(...args) {
- if (this.options.debugLevel >= 1) {
- console.error(this.toString(), ...args); // eslint-disable-line no-console
- }
- }
- /** Log to console if opts.debugLevel >= 3 */
- logInfo(...args) {
- if (this.options.debugLevel >= 3) {
- console.info(this.toString(), ...args); // eslint-disable-line no-console
- }
- }
- /** @internal */
- logTime(label) {
- if (this.options.debugLevel >= 4) {
- console.time(this + ": " + label); // eslint-disable-line no-console
- }
- return label;
- }
- /** @internal */
- logTimeEnd(label) {
- if (this.options.debugLevel >= 4) {
- console.timeEnd(this + ": " + label); // eslint-disable-line no-console
- }
- }
- /** Log to console if opts.debugLevel >= 2 */
- logWarn(...args) {
- if (this.options.debugLevel >= 2) {
- console.warn(this.toString(), ...args); // eslint-disable-line no-console
- }
- }
- /**
- * Make sure that this node is vertically scrolled into the viewport.
- *
- * Nodes that are above the visible area become the top row, nodes that are
- * below the viewport become the bottom row.
- */
- scrollTo(nodeOrOpts) {
- const PADDING = 2; // leave some pixels between viewport bounds
- let node;
- let options;
- if (nodeOrOpts instanceof WunderbaumNode) {
- node = nodeOrOpts;
- }
- else {
- options = nodeOrOpts;
- node = options.node;
- }
- assert(node && node._rowIdx != null, `Invalid node: ${node}`);
- const scrollParent = this.element;
- const headerHeight = this.headerElement.clientHeight; // May be 0
- const scrollTop = scrollParent.scrollTop;
- const vpHeight = scrollParent.clientHeight;
- const rowTop = node._rowIdx * ROW_HEIGHT + headerHeight;
- const vpTop = headerHeight;
- const vpRowTop = rowTop - scrollTop;
- const vpRowBottom = vpRowTop + ROW_HEIGHT;
- const topNode = options === null || options === void 0 ? void 0 : options.topNode;
- // this.log( `scrollTo(${node.title}), vpTop:${vpTop}px, scrollTop:${scrollTop}, vpHeight:${vpHeight}, rowTop:${rowTop}, vpRowTop:${vpRowTop}`, nodeOrOpts , options);
- let newScrollTop = null;
- if (vpRowTop >= vpTop) {
- if (vpRowBottom <= vpHeight) ;
- else {
- // Node is below viewport
- // this.log("Below viewport");
- newScrollTop = rowTop + ROW_HEIGHT - vpHeight + PADDING; // leave some pixels between viewport bounds
- }
- }
- else {
- // Node is above viewport
- // this.log("Above viewport");
- newScrollTop = rowTop - vpTop - PADDING; // leave some pixels between viewport bounds
- }
- if (newScrollTop != null) {
- this.log(`scrollTo(${rowTop}): ${scrollTop} => ${newScrollTop}`);
- scrollParent.scrollTop = newScrollTop;
- if (topNode) {
- // Make sure the topNode is always visible
- this.scrollTo(topNode);
- }
- // this.update(ChangeType.scroll);
- }
- }
- /**
- * Make sure that this node is horizontally scrolled into the viewport.
- * Called by {@link setColumn}.
- */
- scrollToHorz() {
- // const PADDING = 1;
- const fixedWidth = this.columns[0]._widthPx;
- const vpWidth = this.element.clientWidth;
- const scrollLeft = this.element.scrollLeft;
- const colElem = this.getActiveColElem();
- const colLeft = Number.parseInt(colElem === null || colElem === void 0 ? void 0 : colElem.style.left, 10);
- const colRight = colLeft + Number.parseInt(colElem === null || colElem === void 0 ? void 0 : colElem.style.width, 10);
- let newLeft = scrollLeft;
- if (colLeft - scrollLeft < fixedWidth) {
- // The current column is scrolled behind the left fixed column
- newLeft = colLeft - fixedWidth;
- }
- else if (colRight - scrollLeft > vpWidth) {
- // The current column is scrolled outside the right side
- newLeft = colRight - vpWidth;
- }
- newLeft = Math.max(0, newLeft);
- // util.assert(node._rowIdx != null);
- this.log(`scrollToHorz(${this.activeColIdx}): ${colLeft}..${colRight}, fixedOfs=${fixedWidth}, vpWidth=${vpWidth}, curLeft=${scrollLeft} -> ${newLeft}`);
- this.element.scrollLeft = newLeft;
- // this.update(ChangeType.scroll);
- }
- /**
- * Set column #colIdx to 'active'.
- *
- * This higlights the column header and -cells by adding the `wb-active` class.
- * Available in cell-nav mode only.
- */
- setColumn(colIdx) {
- var _a;
- assert(this.isCellNav(), "Exected cellNav mode");
- assert(0 <= colIdx && colIdx < this.columns.length, `Invalid colIdx: ${colIdx}`);
- this.activeColIdx = colIdx;
- // Update `wb-active` class for all headers
- if (this.hasHeader()) {
- for (const rowDiv of this.headerElement.children) {
- let i = 0;
- for (const colDiv of rowDiv.children) {
- colDiv.classList.toggle("wb-active", i++ === colIdx);
- }
- }
- }
- (_a = this.activeNode) === null || _a === void 0 ? void 0 : _a.update(ChangeType.status);
- // Update `wb-active` class for all cell spans
- for (const rowDiv of this.nodeListElement.children) {
- let i = 0;
- for (const colDiv of rowDiv.children) {
- colDiv.classList.toggle("wb-active", i++ === colIdx);
- }
- }
- // Vertical scroll into view
- // if (this.options.fixedCol) {
- this.scrollToHorz();
- // }
- }
- /** Set or remove keybaord focus to the tree container. */
- setActiveNode(key, flag = true, options) {
- var _a;
- (_a = this.findKey(key)) === null || _a === void 0 ? void 0 : _a.setActive(flag, options);
- }
- /** Set or remove keybaord focus to the tree container. */
- setFocus(flag = true) {
- if (flag) {
- this.element.focus();
- }
- else {
- this.element.blur();
- }
- }
- update(change, node, options) {
- if (this._disableUpdateCount) {
- // Assuming that we redraw all when enableUpdate() is re-enabled.
- // this.log(
- // `IGNORED update(${change}) node=${node} (disable level ${this._disableUpdateCount})`
- // );
- this._disableUpdateIgnoreCount++;
- return;
- }
- // this.log(`update(${change}) node=${node}`);
- if (!(node instanceof WunderbaumNode)) {
- options = node;
- node = null;
- }
- const immediate = !!getOption(options, "immediate");
- const RF = RenderFlag;
- const pending = this.pendingChangeTypes;
- switch (change) {
- case ChangeType.any:
- case ChangeType.colStructure:
- pending.add(RF.header);
- pending.add(RF.clearMarkup);
- pending.add(RF.redraw);
- pending.add(RF.scroll);
- break;
- case ChangeType.resize:
- // case ChangeType.colWidth:
- pending.add(RF.header);
- pending.add(RF.redraw);
- break;
- case ChangeType.structure:
- pending.add(RF.redraw);
- break;
- case ChangeType.scroll:
- pending.add(RF.scroll);
- break;
- case ChangeType.row:
- case ChangeType.data:
- case ChangeType.status:
- assert(node, `Option '${change}' requires a node.`);
- // Single nodes are immediately updated if already inside the viewport
- // (otherwise we can ignore)
- if (node._rowElem) {
- node._render({ change: change });
- }
- break;
- default:
- error(`Invalid change type '${change}'.`);
- }
- if (change === ChangeType.colStructure) {
- const isGrid = this.isGrid();
- this.element.classList.toggle("wb-grid", isGrid);
- if (!isGrid && this.isCellNav()) {
- this.setCellNav(false);
- }
- }
- if (pending.size > 0) {
- if (immediate) {
- this._updateViewportImmediately();
- }
- else {
- this._updateViewportThrottled();
- }
- }
- }
- /** Disable mouse and keyboard interaction (return prev. state). */
- setEnabled(flag = true) {
- const prev = this.enabled;
- this.enabled = !!flag;
- this.element.classList.toggle("wb-disabled", !flag);
- return prev;
- }
- /** Return false if tree is disabled. */
- isEnabled() {
- return this.enabled;
- }
- /** Return true if tree has more than one column, i.e. has additional data columns. */
- isGrid() {
- return this.columns && this.columns.length > 1;
- }
- /** Return true if cell-navigation mode is active. */
- isCellNav() {
- return !!this._cellNavMode;
- }
- /** Return true if row-navigation mode is active. */
- isRowNav() {
- return !this._cellNavMode;
- }
- /** Set the tree's navigation mode. */
- setCellNav(flag = true) {
- var _a;
- const prev = this._cellNavMode;
- // if (flag === prev) {
- // return;
- // }
- this._cellNavMode = !!flag;
- if (flag && !prev) {
- // switch from row to cell mode
- this.setColumn(0);
- }
- this.element.classList.toggle("wb-cell-mode", flag);
- (_a = this.activeNode) === null || _a === void 0 ? void 0 : _a.update(ChangeType.status);
- }
- /** Set the tree's navigation mode option. */
- setNavigationOption(mode, reset = false) {
- if (!this.isGrid() && mode !== NavModeEnum.row) {
- this.logWarn("Plain trees only support row navigation mode.");
- return;
- }
- this.options.navigationModeOption = mode;
- switch (mode) {
- case NavModeEnum.cell:
- this.setCellNav(true);
- break;
- case NavModeEnum.row:
- this.setCellNav(false);
- break;
- case NavModeEnum.startCell:
- if (reset) {
- this.setCellNav(true);
- }
- break;
- case NavModeEnum.startRow:
- if (reset) {
- this.setCellNav(false);
- }
- break;
- default:
- error(`Invalid mode '${mode}'.`);
- }
- }
- /** Display tree status (ok, loading, error, noData) using styles and a dummy root node. */
- setStatus(status, options) {
- return this.root.setStatus(status, options);
- }
- /** Add or redefine node type definitions. */
- setTypes(types, replace = true) {
- assert(isPlainObject(types), `Expected plain objext: ${types}`);
- if (replace) {
- this.types = types;
- }
- else {
- extend(this.types, types);
- }
- // Convert `TYPE.classes` to a Set
- for (const t of Object.values(this.types)) {
- if (t.classes) {
- t.classes = toSet(t.classes);
- }
- }
- }
- /**
- * Sort nodes list by title or custom criteria.
- * @param {function} cmp custom compare function(a, b) that returns -1, 0, or 1
- * (defaults to sorting by title).
- * @param {boolean} deep pass true to sort all descendant nodes recursively
- */
- sortChildren(cmp = nodeTitleSorter, deep = false) {
- this.root.sortChildren(cmp, deep);
- }
- /** Convert tree to an array of plain objects.
- *
- * @param callback(dict, node) is called for every node, in order to allow
- * modifications.
- * Return `false` to ignore this node or `"skip"` to include this node
- * without its children.
- * @see {@link WunderbaumNode.toDict}.
- */
- toDictArray(callback) {
- var _a;
- const res = this.root.toDict(true, callback);
- return (_a = res.children) !== null && _a !== void 0 ? _a : [];
- }
- /**
- * Update column headers and column width.
- * Return true if at least one column width changed.
- */
- // _updateColumnWidths(options?: UpdateColumnsOptions): boolean {
- _updateColumnWidths() {
- // options = Object.assign({ updateRows: true, renderMarkup: false }, options);
- const defaultMinWidth = 4;
- const vpWidth = this.element.clientWidth;
- // Shorten last column width to avoid h-scrollbar
- // (otherwise resizbing the demo would display a void scrollbar?)
- const FIX_ADJUST_LAST_COL = 1;
- const columns = this.columns;
- const col0 = columns[0];
- let totalWidth = 0;
- let totalWeight = 0;
- let fixedWidth = 0;
- let modified = false;
- // this.element.classList.toggle("wb-grid", isGrid);
- // if (!isGrid && this.isCellNav()) {
- // this.setCellNav(false);
- // }
- // if (options.calculateCols) {
- if (col0.id !== "*") {
- throw new Error(`First column must have id '*': got '${col0.id}'.`);
- }
- // Gather width definitions
- this._columnsById = {};
- for (const col of columns) {
- this._columnsById[col.id] = col;
- const cw = col.width;
- if (col.id === "*" && col !== col0) {
- throw new Error(`Column id '*' must be defined only once: '${col.title}'.`);
- }
- if (!cw || cw === "*") {
- col._weight = 1.0;
- totalWeight += 1.0;
- }
- else if (typeof cw === "number") {
- col._weight = cw;
- totalWeight += cw;
- }
- else if (typeof cw === "string" && cw.endsWith("px")) {
- col._weight = 0;
- const px = parseFloat(cw.slice(0, -2));
- if (col._widthPx != px) {
- modified = true;
- col._widthPx = px;
- }
- fixedWidth += px;
- }
- else {
- error(`Invalid column width: ${cw} (expected string ending with 'px' or number, e.g. "
px" or ).`);
- }
- }
- // Share remaining space between non-fixed columns
- const restPx = Math.max(0, vpWidth - fixedWidth);
- let ofsPx = 0;
- for (const col of columns) {
- let minWidth;
- if (col._weight) {
- const cmw = col.minWidth;
- if (typeof cmw === "number") {
- minWidth = cmw;
- }
- else if (typeof cmw === "string" && cmw.endsWith("px")) {
- minWidth = parseFloat(cmw.slice(0, -2));
- }
- else {
- minWidth = defaultMinWidth;
- }
- const px = Math.max(minWidth, (restPx * col._weight) / totalWeight);
- if (col._widthPx != px) {
- modified = true;
- col._widthPx = px;
- }
- }
- col._ofsPx = ofsPx;
- ofsPx += col._widthPx;
- }
- columns[columns.length - 1]._widthPx -= FIX_ADJUST_LAST_COL;
- totalWidth = ofsPx - FIX_ADJUST_LAST_COL;
- const tw = `${totalWidth}px`;
- this.headerElement.style.width = tw;
- this.listContainerElement.style.width = tw;
- // }
- // Every column has now a calculated `_ofsPx` and `_widthPx`
- // this.logInfo("UC", this.columns, vpWidth, this.element.clientWidth, this.element);
- // console.trace();
- // util.error("BREAK");
- // if (modified) {
- // this._renderHeaderMarkup();
- // if (options.renderMarkup) {
- // this.update(ChangeType.header, { removeMarkup: true });
- // } else if (options.updateRows) {
- // this._updateRows();
- // }
- // }
- return modified;
- }
- /** Create/update header markup from `this.columns` definition.
- * @internal
- */
- _renderHeaderMarkup() {
- assert(this.headerElement, "Expected a headerElement");
- const wantHeader = this.hasHeader();
- setElemDisplay(this.headerElement, wantHeader);
- if (!wantHeader) {
- return;
- }
- const colCount = this.columns.length;
- const headerRow = this.headerElement.querySelector(".wb-row");
- assert(headerRow, "Expected a row in header element");
- headerRow.innerHTML = " ".repeat(colCount);
- for (let i = 0; i < colCount; i++) {
- const col = this.columns[i];
- const colElem = headerRow.children[i];
- colElem.style.left = col._ofsPx + "px";
- colElem.style.width = col._widthPx + "px";
- // Add classes from `columns` definition to `` cells
- if (typeof col.headerClasses === "string") {
- col.headerClasses
- ? colElem.classList.add(...col.headerClasses.split(" "))
- : 0;
- }
- else {
- col.classes ? colElem.classList.add(...col.classes.split(" ")) : 0;
- }
- const title = escapeHtml(col.title || col.id);
- let tooltip = "";
- if (col.tooltip) {
- tooltip = escapeTooltip(col.tooltip);
- tooltip = ` title="${tooltip}"`;
- }
- let resizer = "";
- if (i < colCount - 1) {
- resizer = ' ';
- }
- colElem.innerHTML = `${title} ${resizer}`;
- if (this.isCellNav()) {
- colElem.classList.toggle("wb-active", i === this.activeColIdx);
- }
- }
- }
- /**
- * Render pending changes that were scheduled using {@link WunderbaumNode.update} if any.
- *
- * This is hardly ever neccessary, since we normally either
- * - call `update(ChangeType.TYPE)` (async, throttled), or
- * - call `update(ChangeType.TYPE, {immediate: true})` (synchronous)
- *
- * `updatePendingModifications()` will only force immediate execution of
- * pending async changes if any.
- */
- updatePendingModifications() {
- if (this.pendingChangeTypes.size > 0) {
- this._updateViewportImmediately();
- }
- }
- /**
- * This is the actual update method, which is wrapped inside a throttle method.
- * It calls `updateColumns()` and `_updateRows()`.
- *
- * This protected method should not be called directly but via
- * {@link WunderbaumNode.update}`, {@link Wunderbaum.update},
- * or {@link Wunderbaum.updatePendingModifications}.
- * @internal
- */
- _updateViewportImmediately() {
- var _a;
- if (this._disableUpdateCount) {
- this.log(`_updateViewportImmediately() IGNORED (disable level: ${this._disableUpdateCount})`);
- this._disableUpdateIgnoreCount++;
- return;
- }
- // Shorten container height to avoid v-scrollbar
- const FIX_ADJUST_HEIGHT = 1;
- const RF = RenderFlag;
- const pending = new Set(this.pendingChangeTypes);
- this.pendingChangeTypes.clear();
- const scrollOnly = pending.has(RF.scroll) && pending.size === 1;
- if (scrollOnly) {
- this._updateRows({ newNodesOnly: true });
- // this.log("_updateViewportImmediately(): scroll only.");
- }
- else {
- this.log("_updateViewportImmediately():", pending);
- if (this.options.adjustHeight !== false) {
- let height = this.listContainerElement.clientHeight;
- const headerHeight = this.headerElement.clientHeight; // May be 0
- const wantHeight = this.element.clientHeight - headerHeight - FIX_ADJUST_HEIGHT;
- if (Math.abs(height - wantHeight) > 1.0) {
- // this.log("resize", height, wantHeight);
- this.listContainerElement.style.height = wantHeight + "px";
- height = wantHeight;
- }
- }
- // console.profile(`_updateViewportImmediately()`)
- if (pending.has(RF.clearMarkup)) {
- this.visit((n) => {
- n.removeMarkup();
- });
- }
- // let widthModified = false;
- if (pending.has(RF.header)) {
- // widthModified = this._updateColumnWidths();
- this._updateColumnWidths();
- this._renderHeaderMarkup();
- }
- this._updateRows();
- // console.profileEnd(`_updateViewportImmediately()`)
- }
- if (this.options.connectTopBreadcrumb) {
- let path = (_a = this.getTopmostVpNode(true)) === null || _a === void 0 ? void 0 : _a.getPath(false, "title", " > ");
- path = path ? path + " >" : "";
- this.options.connectTopBreadcrumb.textContent = path;
- }
- this._callEvent("update");
- }
- // /**
- // * Assert that TR order matches the natural node order
- // * @internal
- // */
- // protected _validateRows(): boolean {
- // let trs = this.nodeListElement.childNodes;
- // let i = 0;
- // let prev = -1;
- // let ok = true;
- // trs.forEach((element) => {
- // const tr = element as HTMLTableRowElement;
- // const top = Number.parseInt(tr.style.top);
- // const n = (tr)._wb_node;
- // // if (i < 4) {
- // // console.info(
- // // `TR#${i}, rowIdx=${n._rowIdx} , top=${top}px: '${n.title}'`
- // // );
- // // }
- // if (prev >= 0 && top !== prev + ROW_HEIGHT) {
- // n.logWarn(
- // `TR order mismatch at index ${i}: top=${top}px != ${
- // prev + ROW_HEIGHT
- // }`
- // );
- // // throw new Error("fault");
- // ok = false;
- // }
- // prev = top;
- // i++;
- // });
- // return ok;
- // }
- /*
- * - Traverse all *visible* nodes of the whole tree, i.e. skip collapsed nodes.
- * - Store count of rows to `tree.treeRowCount`.
- * - Renumber `node._rowIdx` for all visible nodes.
- * - Calculate the index range that must be rendered to fill the viewport
- * (including upper and lower prefetch)
- * -
- */
- _updateRows(options) {
- // const label = this.logTime("_updateRows");
- // this.log("_updateRows", opts)
- options = Object.assign({ newNodesOnly: false }, options);
- const newNodesOnly = !!options.newNodesOnly;
- const row_height = ROW_HEIGHT;
- const vp_height = this.element.clientHeight;
- const prefetch = RENDER_MAX_PREFETCH;
- // const grace_prefetch = RENDER_MAX_PREFETCH - RENDER_MIN_PREFETCH;
- const ofs = this.element.scrollTop;
- let startIdx = Math.max(0, ofs / row_height - prefetch);
- startIdx = Math.floor(startIdx);
- // Make sure start is always even, so the alternating row colors don't
- // change when scrolling:
- if (startIdx % 2) {
- startIdx--;
- }
- let endIdx = Math.max(0, (ofs + vp_height) / row_height + prefetch);
- endIdx = Math.ceil(endIdx);
- // const obsoleteViewNodes = this.viewNodes;
- // this.viewNodes = new Set();
- // const viewNodes = this.viewNodes;
- // this.debug("render", opts);
- const obsoleteNodes = new Set();
- this.nodeListElement.childNodes.forEach((elem) => {
- const tr = elem;
- obsoleteNodes.add(tr._wb_node);
- });
- let idx = 0;
- let top = 0;
- let modified = false;
- let prevElem = "first";
- this.visitRows(function (node) {
- // node.log("visit")
- const rowDiv = node._rowElem;
- // Renumber all expanded nodes
- if (node._rowIdx !== idx) {
- node._rowIdx = idx;
- modified = true;
- }
- if (idx < startIdx || idx > endIdx) {
- // row is outside viewport bounds
- if (rowDiv) {
- prevElem = rowDiv;
- }
- }
- else if (rowDiv && newNodesOnly) {
- obsoleteNodes.delete(node);
- // no need to update existing node markup
- rowDiv.style.top = idx * ROW_HEIGHT + "px";
- prevElem = rowDiv;
- }
- else {
- obsoleteNodes.delete(node);
- // Create new markup
- if (rowDiv) {
- rowDiv.style.top = idx * ROW_HEIGHT + "px";
- }
- node._render({ top: top, after: prevElem });
- // node.log("render", top, prevElem, "=>", node._rowElem);
- prevElem = node._rowElem;
- }
- idx++;
- top += row_height;
- });
- this.treeRowCount = idx;
- for (const n of obsoleteNodes) {
- n._callEvent("discard");
- n.removeMarkup();
- }
- // Resize tree container
- this.nodeListElement.style.height = `${top}px`;
- // this.log(
- // `_updateRows(scrollOfs:${ofs}, ${startIdx}..${endIdx})`,
- // this.nodeListElement.style.height
- // );
- // this.logTimeEnd(label);
- // this._validateRows();
- return modified;
- }
- /**
- * Call `callback(node)` for all nodes in hierarchical order (depth-first, pre-order).
- * @see {@link IterableIterator}, {@link WunderbaumNode.visit}.
- *
- * @param {function} callback the callback function.
- * Return false to stop iteration, return "skip" to skip this node and
- * children only.
- * @returns {boolean} false, if the iterator was stopped.
- */
- visit(callback) {
- return this.root.visit(callback, false);
- }
- /**
- * Call callback(node) for all nodes in vertical order, top down (or bottom up).
- *
- * Note that this considers expansion state, i.e. filtered nodes and children
- * of collapsed nodes are skipped, unless `includeHidden` is set.
- *
- * Stop iteration if callback() returns false.
- * Return false if iteration was stopped.
- *
- * @returns {boolean} false if iteration was canceled
- */
- visitRows(callback, options) {
- if (!this.root.hasChildren()) {
- return false;
- }
- if (options && options.reverse) {
- delete options.reverse;
- return this._visitRowsUp(callback, options);
- }
- options = options || {};
- let i, nextIdx, parent, res, siblings, stopNode, siblingOfs = 0, skipFirstNode = options.includeSelf === false, node = options.start || this.root.children[0];
- const includeHidden = !!options.includeHidden;
- const checkFilter = !includeHidden && this.filterMode === "hide";
- parent = node.parent;
- while (parent) {
- // visit siblings
- siblings = parent.children;
- nextIdx = siblings.indexOf(node) + siblingOfs;
- assert(nextIdx >= 0, `Could not find ${node} in parent's children: ${parent}`);
- for (i = nextIdx; i < siblings.length; i++) {
- node = siblings[i];
- if (node === stopNode) {
- return false;
- }
- if (checkFilter &&
- !node.statusNodeType &&
- !node.match &&
- !node.subMatchCount) {
- continue;
- }
- if (!skipFirstNode && callback(node) === false) {
- return false;
- }
- skipFirstNode = false;
- // Dive into node's child nodes
- if (node.children &&
- node.children.length &&
- (includeHidden || node.expanded)) {
- res = node.visit((n) => {
- if (n === stopNode) {
- return false;
- }
- if (checkFilter && !n.match && !n.subMatchCount) {
- return "skip";
- }
- if (callback(n) === false) {
- return false;
- }
- if (!includeHidden && n.children && !n.expanded) {
- return "skip";
- }
- }, false);
- if (res === false) {
- return false;
- }
- }
- }
- // Visit parent nodes (bottom up)
- node = parent;
- parent = parent.parent;
- siblingOfs = 1; //
- if (!parent && options.wrap) {
- this.logDebug("visitRows(): wrap around");
- assert(options.start, "`wrap` option requires `start`");
- stopNode = options.start;
- options.wrap = false;
- parent = this.root;
- siblingOfs = 0;
- }
- }
- return true;
- }
- /**
- * Call fn(node) for all nodes in vertical order, bottom up.
- * @internal
- */
- _visitRowsUp(callback, options) {
- let children, idx, parent, node = options.start || this.root.children[0];
- const includeHidden = !!options.includeHidden;
- if (options.includeSelf !== false) {
- if (callback(node) === false) {
- return false;
- }
- }
- while (true) {
- parent = node.parent;
- children = parent.children;
- if (children[0] === node) {
- // If this is already the first sibling, goto parent
- node = parent;
- if (!node.parent) {
- break; // first node of the tree
- }
- children = parent.children;
- }
- else {
- // Otherwise, goto prev. sibling
- idx = children.indexOf(node);
- node = children[idx - 1];
- // If the prev. sibling has children, follow down to last descendant
- while ((includeHidden || node.expanded) &&
- node.children &&
- node.children.length) {
- children = node.children;
- parent = node;
- node = children[children.length - 1];
- }
- }
- // Skip invisible
- if (!includeHidden && !node.isVisible()) {
- continue;
- }
- if (callback(node) === false) {
- return false;
- }
- }
- return true;
- }
- /**
- * Reload the tree with a new source.
- *
- * Previous data is cleared. Note that also column- and type defintions may
- * be passed with the `source` object.
- */
- load(source) {
- this.clear();
- return this.root.load(source);
- }
- /**
- * Disable render requests during operations that would trigger many updates.
- *
- * ```js
- * try {
- * tree.enableUpdate(false);
- * // ... (long running operation that would trigger many updates)
- * foo();
- * // ... NOTE: make sure that async operations have finished, e.g.
- * await foo();
- * } finally {
- * tree.enableUpdate(true);
- * }
- * ```
- */
- enableUpdate(flag) {
- /*
- 5 7 9 20 25 30
- 1 >-------------------------------------<
- 2 >--------------------<
- 3 >--------------------------<
- */
- if (flag) {
- assert(this._disableUpdateCount > 0, "enableUpdate(true) was called too often");
- this._disableUpdateCount--;
- // this.logDebug(
- // `enableUpdate(${flag}): count -> ${this._disableUpdateCount}...`
- // );
- if (this._disableUpdateCount === 0) {
- this.logDebug(`enableUpdate(): active again. Re-painting to catch up with ${this._disableUpdateIgnoreCount} ignored update requests...`);
- this._disableUpdateIgnoreCount = 0;
- this.update(ChangeType.any, { immediate: true });
- }
- }
- else {
- this._disableUpdateCount++;
- // this.logDebug(
- // `enableUpdate(${flag}): count -> ${this._disableUpdateCount}...`
- // );
- // this._disableUpdate = Date.now();
- }
- // return !flag; // return previous value
- }
- /* ---------------------------------------------------------------------------
- * FILTER
- * -------------------------------------------------------------------------*/
- /**
- * [ext-filter] Dim or hide nodes.
- */
- filterNodes(filter, options) {
- return this.extensions.filter.filterNodes(filter, options);
- }
- /**
- * [ext-filter] Dim or hide whole branches.
- */
- filterBranches(filter, options) {
- return this.extensions.filter.filterBranches(filter, options);
- }
- /**
- * [ext-filter] Reset the filter.
- *
- * @requires [[FilterExtension]]
- */
- clearFilter() {
- return this.extensions.filter.clearFilter();
- }
- /**
- * [ext-filter] Return true if a filter is currently applied.
- *
- * @requires [[FilterExtension]]
- */
- isFilterActive() {
- return !!this.filterMode;
- }
- /**
- * [ext-filter] Re-apply current filter.
- *
- * @requires [[FilterExtension]]
- */
- updateFilter() {
- return this.extensions.filter.updateFilter();
- }
- }
- Wunderbaum.sequence = 0;
- /** Wunderbaum release version number "MAJOR.MINOR.PATCH". */
- Wunderbaum.version = "v0.7.0"; // Set to semver by 'grunt release'
- /** Expose some useful methods of the util.ts module as `Wunderbaum.util`. */
- Wunderbaum.util = util;
+ this.listContainerElement = this.element.querySelector("div.wb-list-container");
+ this.nodeListElement = this.listContainerElement.querySelector("div.wb-node-list");
+ this.headerElement = this.element.querySelector("div.wb-header");
+ this.element.classList.toggle("wb-grid", this.columns.length > 1);
+ this._initExtensions();
+ // --- apply initial options
+ ["enabled", "fixedCol"].forEach((optName) => {
+ if (opts[optName] != null) {
+ this.setOption(optName, opts[optName]);
+ }
+ });
+ // --- Load initial data
+ if (opts.source) {
+ if (opts.showSpinner) {
+ this.nodeListElement.innerHTML =
+ "loading... ";
+ }
+ this.load(opts.source)
+ .then(() => {
+ // The source may have defined columns, so we may adjust the nav mode
+ if (opts.navigationModeOption == null) {
+ if (this.isGrid()) {
+ this.setNavigationOption(NavModeEnum.cell);
+ }
+ else {
+ this.setNavigationOption(NavModeEnum.row);
+ }
+ }
+ else {
+ this.setNavigationOption(opts.navigationModeOption);
+ }
+ this.update(ChangeType.structure, { immediate: true });
+ readyDeferred.resolve();
+ })
+ .catch((error) => {
+ readyDeferred.reject(error);
+ })
+ .finally(() => {
+ var _a;
+ (_a = this.element.querySelector("progress.spinner")) === null || _a === void 0 ? void 0 : _a.remove();
+ this.element.classList.remove("wb-initializing");
+ });
+ }
+ else {
+ readyDeferred.resolve();
+ }
+ // Async mode is sometimes required, because this.element.clientWidth
+ // has a wrong value at start???
+ this.update(ChangeType.any);
+ // --- Bind listeners
+ this.element.addEventListener("scroll", (e) => {
+ // this.log(`scroll, scrollTop:${e.target.scrollTop}`, e);
+ this.update(ChangeType.scroll);
+ });
+ this.resizeObserver = new ResizeObserver((entries) => {
+ // this.log("ResizeObserver: Size changed", entries);
+ this.update(ChangeType.resize);
+ });
+ this.resizeObserver.observe(this.element);
+ onEvent(this.nodeListElement, "click", "div.wb-row", (e) => {
+ const info = Wunderbaum.getEventInfo(e);
+ const node = info.node;
+ const mouseEvent = e;
+ // this.log("click", info);
+ // if (this._selectRange(info) === false) {
+ // return;
+ // }
+ if (this._callEvent("click", { event: e, node: node, info: info }) === false) {
+ this.lastClickTime = Date.now();
+ return false;
+ }
+ if (node) {
+ if (mouseEvent.ctrlKey) {
+ node.toggleSelected();
+ return;
+ }
+ // Edit title if 'clickActive' is triggered:
+ const trigger = this.getOption("edit.trigger");
+ const slowClickDelay = this.getOption("edit.slowClickDelay");
+ if (trigger.indexOf("clickActive") >= 0 &&
+ info.region === "title" &&
+ node.isActive() &&
+ (!slowClickDelay || Date.now() - this.lastClickTime < slowClickDelay)) {
+ node.startEditTitle();
+ }
+ if (info.colIdx >= 0) {
+ node.setActive(true, { colIdx: info.colIdx, event: e });
+ }
+ else {
+ node.setActive(true, { event: e });
+ }
+ if (info.region === NodeRegion.expander) {
+ node.setExpanded(!node.isExpanded(), {
+ scrollIntoView: options.scrollIntoViewOnExpandClick !== false,
+ });
+ }
+ else if (info.region === NodeRegion.checkbox) {
+ node.toggleSelected();
+ }
+ }
+ this.lastClickTime = Date.now();
+ });
+ onEvent(this.nodeListElement, "dblclick", "div.wb-row", (e) => {
+ const info = Wunderbaum.getEventInfo(e);
+ const node = info.node;
+ // this.log("dblclick", info, e);
+ if (this._callEvent("dblclick", { event: e, node: node, info: info }) ===
+ false) {
+ return false;
+ }
+ if (node && info.colIdx === 0 && node.isExpandable()) {
+ this._callMethod("edit._stopEditTitle");
+ node.setExpanded(!node.isExpanded());
+ }
+ });
+ onEvent(this.element, "keydown", (e) => {
+ const info = Wunderbaum.getEventInfo(e);
+ const eventName = eventToString(e);
+ const node = info.node || this.getFocusNode();
+ this._callHook("onKeyEvent", {
+ event: e,
+ node: node,
+ info: info,
+ eventName: eventName,
+ });
+ });
+ onEvent(this.element, "focusin focusout", (e) => {
+ const flag = e.type === "focusin";
+ const targetNode = Wunderbaum.getNode(e);
+ this._callEvent("focus", { flag: flag, event: e });
+ if (flag && this.isRowNav() && !this.isEditingTitle()) {
+ if (opts.navigationModeOption === NavModeEnum.row) {
+ targetNode === null || targetNode === void 0 ? void 0 : targetNode.setActive();
+ }
+ else {
+ this.setCellNav();
+ }
+ }
+ if (!flag) {
+ this._callMethod("edit._stopEditTitle", true, {
+ event: e,
+ forceClose: true,
+ });
+ }
+ });
+ }
+ /**
+ * Return a Wunderbaum instance, from element, id, index, or event.
+ *
+ * ```js
+ * getTree(); // Get first Wunderbaum instance on page
+ * getTree(1); // Get second Wunderbaum instance on page
+ * getTree(event); // Get tree for this mouse- or keyboard event
+ * getTree("foo"); // Get tree for this `tree.options.id`
+ * getTree("#tree"); // Get tree for first matching element selector
+ * ```
+ */
+ static getTree(el) {
+ if (el instanceof Wunderbaum) {
+ return el;
+ }
+ else if (el instanceof WunderbaumNode) {
+ return el.tree;
+ }
+ if (el === undefined) {
+ el = 0; // get first tree
+ }
+ if (typeof el === "number") {
+ el = document.querySelectorAll(".wunderbaum")[el]; // el was an integer: return nth element
+ }
+ else if (typeof el === "string") {
+ // Search all trees for matching ID
+ for (const treeElem of document.querySelectorAll(".wunderbaum")) {
+ const tree = treeElem._wb_tree;
+ if (tree && tree.id === el) {
+ return tree;
+ }
+ }
+ // Search by selector
+ el = document.querySelector(el);
+ if (!el) {
+ return null;
+ }
+ }
+ else if (el.target) {
+ el = el.target;
+ }
+ assert(el instanceof Element, `Invalid el type: ${el}`);
+ if (!el.matches(".wunderbaum")) {
+ el = el.closest(".wunderbaum");
+ }
+ if (el && el._wb_tree) {
+ return el._wb_tree;
+ }
+ return null;
+ }
+ /**
+ * Return the icon-function -> icon-definition mapping.
+ */
+ get iconMap() {
+ const map = this.options.iconMap;
+ if (typeof map === "string") {
+ return iconMaps[map];
+ }
+ return map;
+ }
+ /**
+ * Return a WunderbaumNode instance from element or event.
+ */
+ static getNode(el) {
+ if (!el) {
+ return null;
+ }
+ else if (el instanceof WunderbaumNode) {
+ return el;
+ }
+ else if (el.target !== undefined) {
+ el = el.target; // el was an Event
+ }
+ // `el` is a DOM element
+ // let nodeElem = obj.closest("div.wb-row");
+ while (el) {
+ if (el._wb_node) {
+ return el._wb_node;
+ }
+ el = el.parentElement; //.parentNode;
+ }
+ return null;
+ }
+ /**
+ * Iterate all descendant nodes depth-first, pre-order using `for ... of ...` syntax.
+ * More concise, but slightly slower than {@link Wunderbaum.visit}.
+ *
+ * Example:
+ * ```js
+ * for(const node of tree) {
+ * ...
+ * }
+ * ```
+ */
+ *[Symbol.iterator]() {
+ yield* this.root;
+ }
+ /** @internal */
+ _registerExtension(extension) {
+ this.extensionList.push(extension);
+ this.extensions[extension.id] = extension;
+ // this.extensionMap.set(extension.id, extension);
+ }
+ /** Called on tree (re)init after markup is created, before loading. */
+ _initExtensions() {
+ for (const ext of this.extensionList) {
+ ext.init();
+ }
+ }
+ /** Add node to tree's bookkeeping data structures. */
+ _registerNode(node) {
+ const key = node.key;
+ assert(key != null && !this.keyMap.has(key), `Missing or duplicate key: '${key}'.`);
+ this.keyMap.set(key, node);
+ const rk = node.refKey;
+ if (rk != null) {
+ const rks = this.refKeyMap.get(rk); // Set of nodes with this refKey
+ if (rks) {
+ rks.add(node);
+ }
+ else {
+ this.refKeyMap.set(rk, new Set([node]));
+ }
+ }
+ }
+ /** Remove node from tree's bookkeeping data structures. */
+ _unregisterNode(node) {
+ // Remove refKey reference from map (if any)
+ const rk = node.refKey;
+ if (rk != null) {
+ const rks = this.refKeyMap.get(rk);
+ if (rks && rks.delete(node) && !rks.size) {
+ // We just removed the last element
+ this.refKeyMap.delete(rk);
+ }
+ }
+ // Remove key reference from map
+ this.keyMap.delete(node.key);
+ // Mark as disposed
+ node.tree = null;
+ node.parent = null;
+ // Remove HTML markup
+ node.removeMarkup();
+ }
+ /** Call all hook methods of all registered extensions.*/
+ _callHook(hook, data = {}) {
+ let res;
+ const d = extend({}, { tree: this, options: this.options, result: undefined }, data);
+ for (const ext of this.extensionList) {
+ res = ext[hook].call(ext, d);
+ if (res === false) {
+ break;
+ }
+ if (d.result !== undefined) {
+ res = d.result;
+ }
+ }
+ return res;
+ }
+ /**
+ * Call tree method or extension method if defined.
+ *
+ * Example:
+ * ```js
+ * tree._callMethod("edit.startEdit", "arg1", "arg2")
+ * ```
+ */
+ _callMethod(name, ...args) {
+ const [p, n] = name.split(".");
+ const obj = n ? this.extensions[p] : this;
+ const func = obj[n];
+ if (func) {
+ return func.apply(obj, args);
+ }
+ else {
+ this.logError(`Calling undefined method '${name}()'.`);
+ }
+ }
+ /**
+ * Call event handler if defined in tree or tree.EXTENSION options.
+ *
+ * Example:
+ * ```js
+ * tree._callEvent("edit.beforeEdit", {foo: 42})
+ * ```
+ */
+ _callEvent(type, extra) {
+ const [p, n] = type.split(".");
+ const opts = this.options;
+ const func = n ? opts[p][n] : opts[p];
+ if (func) {
+ return func.call(this, extend({ type: type, tree: this, util: this._util }, extra));
+ // } else {
+ // this.logError(`Triggering undefined event '${type}'.`)
+ }
+ }
+ /** Return the node for given row index. */
+ _getNodeByRowIdx(idx) {
+ // TODO: start searching from active node (reverse)
+ let node = null;
+ this.visitRows((n) => {
+ if (n._rowIdx === idx) {
+ node = n;
+ return false;
+ }
+ });
+ return node;
+ }
+ /** Return the topmost visible node in the viewport. */
+ getTopmostVpNode(complete = true) {
+ const gracePx = 1; // ignore subpixel scrolling
+ const scrollParent = this.element;
+ // const headerHeight = this.headerElement.clientHeight; // May be 0
+ const scrollTop = scrollParent.scrollTop; // + headerHeight;
+ let topIdx;
+ if (complete) {
+ topIdx = Math.ceil((scrollTop - gracePx) / ROW_HEIGHT);
+ }
+ else {
+ topIdx = Math.floor(scrollTop / ROW_HEIGHT);
+ }
+ return this._getNodeByRowIdx(topIdx);
+ }
+ /** Return the lowest visible node in the viewport. */
+ getLowestVpNode(complete = true) {
+ const scrollParent = this.element;
+ const headerHeight = this.headerElement.clientHeight; // May be 0
+ const scrollTop = scrollParent.scrollTop;
+ const clientHeight = scrollParent.clientHeight - headerHeight;
+ let bottomIdx;
+ if (complete) {
+ bottomIdx = Math.floor((scrollTop + clientHeight) / ROW_HEIGHT) - 1;
+ }
+ else {
+ bottomIdx = Math.ceil((scrollTop + clientHeight) / ROW_HEIGHT) - 1;
+ }
+ bottomIdx = Math.min(bottomIdx, this.count(true) - 1);
+ return this._getNodeByRowIdx(bottomIdx);
+ }
+ /** Return preceeding visible node in the viewport. */
+ _getPrevNodeInView(node, ofs = 1) {
+ this.visitRows((n) => {
+ node = n;
+ if (ofs-- <= 0) {
+ return false;
+ }
+ }, { reverse: true, start: node || this.getActiveNode() });
+ return node;
+ }
+ /** Return following visible node in the viewport. */
+ _getNextNodeInView(node, ofs = 1) {
+ this.visitRows((n) => {
+ node = n;
+ if (ofs-- <= 0) {
+ return false;
+ }
+ }, { reverse: false, start: node || this.getActiveNode() });
+ return node;
+ }
+ /**
+ * Append (or insert) a list of toplevel nodes.
+ *
+ * @see {@link WunderbaumNode.addChildren}
+ */
+ addChildren(nodeData, options) {
+ return this.root.addChildren(nodeData, options);
+ }
+ /**
+ * Apply a modification or navigation operation.
+ *
+ * Most of these commands simply map to a node or tree method.
+ * This method is especially useful when implementing keyboard mapping,
+ * context menus, or external buttons.
+ *
+ * Valid commands:
+ * - 'moveUp', 'moveDown'
+ * - 'indent', 'outdent'
+ * - 'remove'
+ * - 'edit', 'addChild', 'addSibling': (reqires ext-edit extension)
+ * - 'cut', 'copy', 'paste': (use an internal singleton 'clipboard')
+ * - 'down', 'first', 'last', 'left', 'parent', 'right', 'up': navigate
+ *
+ */
+ applyCommand(cmd, nodeOrOpts, options) {
+ let // clipboard,
+ node, refNode;
+ // options = $.extend(
+ // { setActive: true, clipboard: CLIPBOARD },
+ // options_
+ // );
+ if (nodeOrOpts instanceof WunderbaumNode) {
+ node = nodeOrOpts;
+ }
+ else {
+ node = this.getActiveNode();
+ assert(options === undefined, `Unexpected options: ${options}`);
+ options = nodeOrOpts;
+ }
+ // clipboard = options.clipboard;
+ switch (cmd) {
+ // Sorting and indentation:
+ case "moveUp":
+ refNode = node.getPrevSibling();
+ if (refNode) {
+ node.moveTo(refNode, "before");
+ node.setActive();
+ }
+ break;
+ case "moveDown":
+ refNode = node.getNextSibling();
+ if (refNode) {
+ node.moveTo(refNode, "after");
+ node.setActive();
+ }
+ break;
+ case "indent":
+ refNode = node.getPrevSibling();
+ if (refNode) {
+ node.moveTo(refNode, "appendChild");
+ refNode.setExpanded();
+ node.setActive();
+ }
+ break;
+ case "outdent":
+ if (!node.isTopLevel()) {
+ node.moveTo(node.getParent(), "after");
+ node.setActive();
+ }
+ break;
+ // Remove:
+ case "remove":
+ refNode = node.getPrevSibling() || node.getParent();
+ node.remove();
+ if (refNode) {
+ refNode.setActive();
+ }
+ break;
+ // Add, edit (requires ext-edit):
+ case "addChild":
+ this._callMethod("edit.createNode", "prependChild");
+ break;
+ case "addSibling":
+ this._callMethod("edit.createNode", "after");
+ break;
+ case "rename":
+ node.startEditTitle();
+ break;
+ // Simple clipboard simulation:
+ // case "cut":
+ // clipboard = { mode: cmd, data: node };
+ // break;
+ // case "copy":
+ // clipboard = {
+ // mode: cmd,
+ // data: node.toDict(function(d, n) {
+ // delete d.key;
+ // }),
+ // };
+ // break;
+ // case "clear":
+ // clipboard = null;
+ // break;
+ // case "paste":
+ // if (clipboard.mode === "cut") {
+ // // refNode = node.getPrevSibling();
+ // clipboard.data.moveTo(node, "child");
+ // clipboard.data.setActive();
+ // } else if (clipboard.mode === "copy") {
+ // node.addChildren(clipboard.data).setActive();
+ // }
+ // break;
+ // Navigation commands:
+ case "down":
+ case "first":
+ case "last":
+ case "left":
+ case "pageDown":
+ case "pageUp":
+ case "parent":
+ case "right":
+ case "up":
+ return node.navigate(cmd);
+ default:
+ error(`Unhandled command: '${cmd}'`);
+ }
+ }
+ /** Delete all nodes. */
+ clear() {
+ this.root.removeChildren();
+ this.root.children = null;
+ this.keyMap.clear();
+ this.refKeyMap.clear();
+ this.treeRowCount = 0;
+ this.activeNode = null;
+ this.focusNode = null;
+ // this.types = {};
+ // this. columns =[];
+ // this._columnsById = {};
+ // Modification Status
+ // this.changedSince = 0;
+ // this.changes.clear();
+ // this.changedNodes.clear();
+ // // --- FILTER ---
+ // public filterMode: FilterModeType = null;
+ // // --- KEYNAV ---
+ // public activeColIdx = 0;
+ // public cellNavMode = false;
+ // public lastQuicksearchTime = 0;
+ // public lastQuicksearchTerm = "";
+ this.update(ChangeType.structure);
+ }
+ /**
+ * Clear nodes and markup and detach events and observers.
+ *
+ * This method may be useful to free up resources before re-creating a tree
+ * on an existing div, for example in unittest suites.
+ * Note that this Wunderbaum instance becomes unusable afterwards.
+ */
+ destroy() {
+ this.logInfo("destroy()...");
+ this.clear();
+ this.resizeObserver.disconnect();
+ this.element.innerHTML = "";
+ // Remove all event handlers
+ this.element.outerHTML = this.element.outerHTML; // eslint-disable-line
+ }
+ /**
+ * Return `tree.option.NAME` (also resolving if this is a callback).
+ *
+ * See also {@link WunderbaumNode.getOption|WunderbaumNode.getOption()}
+ * to evaluate `node.NAME` setting and `tree.types[node.type].NAME`.
+ *
+ * @param name option name (use dot notation to access extension option, e.g.
+ * `filter.mode`)
+ */
+ getOption(name, defaultValue) {
+ let ext;
+ let opts = this.options;
+ // Lookup `name` in options dict
+ if (name.indexOf(".") >= 0) {
+ [ext, name] = name.split(".");
+ opts = opts[ext];
+ }
+ let value = opts[name];
+ // A callback resolver always takes precedence
+ if (typeof value === "function") {
+ value = value({ type: "resolve", tree: this });
+ }
+ // Use value from value options dict, fallback do default
+ // console.info(name, value, opts)
+ return value !== null && value !== void 0 ? value : defaultValue;
+ }
+ /**
+ * Set tree option.
+ * Use dot notation to set plugin option, e.g. "filter.mode".
+ */
+ setOption(name, value) {
+ // this.log(`setOption(${name}, ${value})`);
+ if (name.indexOf(".") >= 0) {
+ const parts = name.split(".");
+ const ext = this.extensions[parts[0]];
+ ext.setPluginOption(parts[1], value);
+ return;
+ }
+ this.options[name] = value;
+ switch (name) {
+ case "checkbox":
+ this.update(ChangeType.any);
+ break;
+ case "enabled":
+ this.setEnabled(!!value);
+ break;
+ case "fixedCol":
+ this.element.classList.toggle("wb-fixed-col", !!value);
+ break;
+ }
+ }
+ /** Return true if the tree (or one of its nodes) has the input focus. */
+ hasFocus() {
+ return this.element.contains(document.activeElement);
+ }
+ /**
+ * Return true if the tree displays a header. Grids have a header unless the
+ * `header` option is set to `false`. Plain trees have a header if the `header`
+ * option is a string or `true`.
+ */
+ hasHeader() {
+ const header = this.options.header;
+ return this.isGrid() ? header !== false : !!header;
+ }
+ /** Run code, but defer rendering of viewport until done.
+ *
+ * ```
+ * tree.runWithDeferredUpdate(() => {
+ * return someFuncThatWouldUpdateManyNodes();
+ * });
+ * ```
+ */
+ runWithDeferredUpdate(func, hint = null) {
+ try {
+ this.enableUpdate(false);
+ const res = func();
+ assert(!(res instanceof Promise), `Promise return not allowed: ${res}`);
+ return res;
+ }
+ finally {
+ this.enableUpdate(true);
+ }
+ }
+ /** Recursively expand all expandable nodes (triggers lazy load if needed). */
+ async expandAll(flag = true, options) {
+ await this.root.expandAll(flag, options);
+ }
+ /** Recursively select all nodes. */
+ selectAll(flag = true) {
+ return this.root.setSelected(flag, { propagateDown: true });
+ }
+ /** Toggle select all nodes. */
+ toggleSelect() {
+ this.selectAll(this.root._anySelectable());
+ }
+ /**
+ * Return an array of selected nodes.
+ * @param stopOnParents only return the topmost selected node (useful with selectMode 'hier')
+ */
+ getSelectedNodes(stopOnParents = false) {
+ return this.root.getSelectedNodes(stopOnParents);
+ }
+ /*
+ * Return an array of selected nodes.
+ */
+ _selectRange(eventInfo) {
+ this.logDebug("_selectRange", eventInfo);
+ error("Not yet implemented.");
+ // const mode = this.options.selectMode!;
+ // if (mode !== "multi") {
+ // this.logDebug(`Range selection only available for selectMode 'multi'`);
+ // return;
+ // }
+ // if (eventInfo.canonicalName === "Meta+click") {
+ // eventInfo.node?.toggleSelected();
+ // return false; // don't
+ // } else if (eventInfo.canonicalName === "Shift+click") {
+ // let from = this.activeNode;
+ // let to = eventInfo.node;
+ // if (!from || !to || from === to) {
+ // return;
+ // }
+ // this.runWithDeferredUpdate(() => {
+ // this.visitRows(
+ // (node) => {
+ // node.setSelected();
+ // },
+ // {
+ // includeHidden: true,
+ // includeSelf: false,
+ // start: from,
+ // reverse: from!._rowIdx! > to!._rowIdx!,
+ // }
+ // );
+ // });
+ // return false;
+ // }
+ }
+ /** Return the number of nodes in the data model.
+ * @param visible if true, nodes that are hidden due to collapsed parents are ignored.
+ */
+ count(visible = false) {
+ return visible ? this.treeRowCount : this.keyMap.size;
+ }
+ /** @internal sanity check. */
+ _check() {
+ let i = 0;
+ this.visit((n) => {
+ i++;
+ });
+ if (this.keyMap.size !== i) {
+ this.logWarn(`_check failed: ${this.keyMap.size} !== ${i}`);
+ }
+ // util.assert(this.keyMap.size === i);
+ }
+ /**
+ * Find all nodes that match condition.
+ *
+ * @param match title string to search for, or a
+ * callback function that returns `true` if a node is matched.
+ * @see {@link WunderbaumNode.findAll}
+ */
+ findAll(match) {
+ return this.root.findAll(match);
+ }
+ /**
+ * Find all nodes with a given _refKey_ (aka a list of clones).
+ *
+ * @param refKey a `node.refKey` value to search for.
+ * @returns an array of matching nodes with at least two element or `[]`
+ * if nothing found.
+ *
+ * @see {@link WunderbaumNode.getCloneList}
+ */
+ findByRefKey(refKey) {
+ const clones = this.refKeyMap.get(refKey);
+ return clones ? Array.from(clones) : [];
+ }
+ /**
+ * Find first node that matches condition.
+ *
+ * @param match title string to search for, or a
+ * callback function that returns `true` if a node is matched.
+ * @see {@link WunderbaumNode.findFirst}
+ */
+ findFirst(match) {
+ return this.root.findFirst(match);
+ }
+ /**
+ * Find first node that matches condition.
+ *
+ * @see {@link WunderbaumNode.findFirst}
+ *
+ */
+ findKey(key) {
+ return this.keyMap.get(key) || null;
+ }
+ /**
+ * Find the next visible node that starts with `match`, starting at `startNode`
+ * and wrap-around at the end.
+ * Used by quicksearch and keyboard navigation.
+ */
+ findNextNode(match, startNode) {
+ //, visibleOnly) {
+ let res = null;
+ const firstNode = this.getFirstChild();
+ const matcher = typeof match === "string" ? makeNodeTitleStartMatcher(match) : match;
+ startNode = startNode || firstNode;
+ function _checkNode(n) {
+ // console.log("_check " + n)
+ if (matcher(n)) {
+ res = n;
+ }
+ if (res || n === startNode) {
+ return false;
+ }
+ }
+ this.visitRows(_checkNode, {
+ start: startNode,
+ includeSelf: false,
+ });
+ // Wrap around search
+ if (!res && startNode !== firstNode) {
+ this.visitRows(_checkNode, {
+ start: firstNode,
+ includeSelf: true,
+ });
+ }
+ return res;
+ }
+ /**
+ * Find a node relative to another node.
+ *
+ * @param node
+ * @param where 'down', 'first', 'last', 'left', 'parent', 'right', or 'up'.
+ * (Alternatively the keyCode that would normally trigger this move,
+ * e.g. `$.ui.keyCode.LEFT` = 'left'.
+ * @param includeHidden Not yet implemented
+ */
+ findRelatedNode(node, where, includeHidden = false) {
+ let res = null;
+ const pageSize = Math.floor(this.listContainerElement.clientHeight / ROW_HEIGHT);
+ switch (where) {
+ case "parent":
+ if (node.parent && node.parent.parent) {
+ res = node.parent;
+ }
+ break;
+ case "first":
+ // First visible node
+ this.visit((n) => {
+ if (n.isVisible()) {
+ res = n;
+ return false;
+ }
+ });
+ break;
+ case "last":
+ this.visit((n) => {
+ // last visible node
+ if (n.isVisible()) {
+ res = n;
+ }
+ });
+ break;
+ case "left":
+ if (node.parent && node.parent.parent) {
+ res = node.parent;
+ }
+ // if (node.expanded) {
+ // node.setExpanded(false);
+ // } else if (node.parent && node.parent.parent) {
+ // res = node.parent;
+ // }
+ break;
+ case "right":
+ if (node.children && node.children.length) {
+ res = node.children[0];
+ }
+ // if (this.cellNavMode) {
+ // throw new Error("Not implemented");
+ // } else {
+ // if (!node.expanded && (node.children || node.lazy)) {
+ // node.setExpanded();
+ // res = node;
+ // } else if (node.children && node.children.length) {
+ // res = node.children[0];
+ // }
+ // }
+ break;
+ case "up":
+ res = this._getPrevNodeInView(node);
+ break;
+ case "down":
+ res = this._getNextNodeInView(node);
+ break;
+ case "pageDown":
+ {
+ const bottomNode = this.getLowestVpNode();
+ // this.logDebug(`${where}(${node}) -> ${bottomNode}`);
+ if (node._rowIdx < bottomNode._rowIdx) {
+ res = bottomNode;
+ }
+ else {
+ res = this._getNextNodeInView(node, pageSize);
+ }
+ }
+ break;
+ case "pageUp":
+ if (node._rowIdx === 0) {
+ res = node;
+ }
+ else {
+ const topNode = this.getTopmostVpNode();
+ // this.logDebug(`${where}(${node}) -> ${topNode}`);
+ if (node._rowIdx > topNode._rowIdx) {
+ res = topNode;
+ }
+ else {
+ res = this._getPrevNodeInView(node, pageSize);
+ }
+ }
+ break;
+ default:
+ this.logWarn("Unknown relation '" + where + "'.");
+ }
+ return res;
+ }
+ /**
+ * Iterator version of {@link Wunderbaum.format}.
+ */
+ *format_iter(name_cb, connectors) {
+ yield* this.root.format_iter(name_cb, connectors);
+ }
+ /**
+ * Return multiline string representation of the node hierarchy.
+ * Mostly useful for debugging.
+ *
+ * Example:
+ * ```js
+ * console.info(tree.format((n)=>n.title));
+ * ```
+ * logs
+ * ```
+ * Playground
+ * ├─ Books
+ * | ├─ Art of War
+ * | ╰─ Don Quixote
+ * ├─ Music
+ * ...
+ * ```
+ *
+ * @see {@link Wunderbaum.format_iter} and {@link WunderbaumNode.format}.
+ */
+ format(name_cb, connectors) {
+ return this.root.format(name_cb, connectors);
+ }
+ /**
+ * Return the active cell (`span.wb-col`) of the currently active node or null.
+ */
+ getActiveColElem() {
+ if (this.activeNode && this.activeColIdx >= 0) {
+ return this.activeNode.getColElem(this.activeColIdx);
+ }
+ return null;
+ }
+ /**
+ * Return the currently active node or null.
+ * @see {@link WunderbaumNode.setActive}
+ * @see {@link WunderbaumNode.isActive}
+ * @see {@link WunderbaumNode.getFocusNode}
+ */
+ getActiveNode() {
+ return this.activeNode;
+ }
+ /**
+ * Return the first top level node if any (not the invisible root node).
+ */
+ getFirstChild() {
+ return this.root.getFirstChild();
+ }
+ /**
+ * Return the node that currently has keyboard focus or null.
+ * @see {@link WunderbaumNode.getActiveNode}
+ */
+ getFocusNode() {
+ return this.focusNode;
+ }
+ /** Return a {node: WunderbaumNode, region: TYPE} object for a mouse event.
+ *
+ * @param {Event} event Mouse event, e.g. click, ...
+ * @returns {object} Return a {node: WunderbaumNode, region: TYPE} object
+ * TYPE: 'title' | 'prefix' | 'expander' | 'checkbox' | 'icon' | undefined
+ */
+ static getEventInfo(event) {
+ const target = event.target;
+ const cl = target.classList;
+ const parentCol = target.closest("span.wb-col");
+ const node = Wunderbaum.getNode(target);
+ const tree = node ? node.tree : Wunderbaum.getTree(event);
+ const res = {
+ event: event,
+ canonicalName: eventToString(event),
+ tree: tree,
+ node: node,
+ region: NodeRegion.unknown,
+ colDef: undefined,
+ colIdx: -1,
+ colId: undefined,
+ colElem: parentCol,
+ };
+ if (cl.contains("wb-title")) {
+ res.region = NodeRegion.title;
+ }
+ else if (cl.contains("wb-expander")) {
+ res.region = node.isExpandable()
+ ? NodeRegion.expander
+ : NodeRegion.prefix;
+ }
+ else if (cl.contains("wb-checkbox")) {
+ res.region = NodeRegion.checkbox;
+ }
+ else if (cl.contains("wb-icon")) {
+ //|| cl.contains("wb-custom-icon")) {
+ res.region = NodeRegion.icon;
+ }
+ else if (cl.contains("wb-node")) {
+ res.region = NodeRegion.title;
+ }
+ else if (parentCol) {
+ res.region = NodeRegion.column;
+ const idx = Array.prototype.indexOf.call(parentCol.parentNode.children, parentCol);
+ res.colIdx = idx;
+ }
+ else if (cl.contains("wb-row")) {
+ // Plain tree
+ res.region = NodeRegion.title;
+ }
+ else {
+ // Somewhere near the title
+ if (event.type !== "mousemove" && !(event instanceof KeyboardEvent)) {
+ tree === null || tree === void 0 ? void 0 : tree.logWarn("getEventInfo(): not found", event, res);
+ }
+ return res;
+ }
+ if (res.colIdx === -1) {
+ res.colIdx = 0;
+ }
+ res.colDef = tree === null || tree === void 0 ? void 0 : tree.columns[res.colIdx];
+ res.colDef != null ? (res.colId = res.colDef.id) : 0;
+ // this.log("Event", event, res);
+ return res;
+ }
+ /**
+ * Return readable string representation for this instance.
+ * @internal
+ */
+ toString() {
+ return `Wunderbaum<'${this.id}'>`;
+ }
+ /** Return true if any node title or grid cell is currently beeing edited.
+ *
+ * See also {@link Wunderbaum.isEditingTitle}.
+ */
+ isEditing() {
+ const focusElem = this.nodeListElement.querySelector("input:focus,select:focus");
+ return !!focusElem;
+ }
+ /** Return true if any node is currently in edit-title mode.
+ *
+ * See also {@link WunderbaumNode.isEditingTitle} and {@link Wunderbaum.isEditing}.
+ */
+ isEditingTitle() {
+ return this._callMethod("edit.isEditingTitle");
+ }
+ /**
+ * Return true if any node is currently beeing loaded, i.e. a Ajax request is pending.
+ */
+ isLoading() {
+ let res = false;
+ this.root.visit((n) => {
+ // also visit rootNode
+ if (n._isLoading || n._requestId) {
+ res = true;
+ return false;
+ }
+ }, true);
+ return res;
+ }
+ /** Log to console if opts.debugLevel >= 4 */
+ logDebug(...args) {
+ if (this.options.debugLevel >= 4) {
+ console.log(this.toString(), ...args); // eslint-disable-line no-console
+ }
+ }
+ /** Log error to console. */
+ logError(...args) {
+ if (this.options.debugLevel >= 1) {
+ console.error(this.toString(), ...args); // eslint-disable-line no-console
+ }
+ }
+ /** Log to console if opts.debugLevel >= 3 */
+ logInfo(...args) {
+ if (this.options.debugLevel >= 3) {
+ console.info(this.toString(), ...args); // eslint-disable-line no-console
+ }
+ }
+ /** @internal */
+ logTime(label) {
+ if (this.options.debugLevel >= 4) {
+ console.time(this + ": " + label); // eslint-disable-line no-console
+ }
+ return label;
+ }
+ /** @internal */
+ logTimeEnd(label) {
+ if (this.options.debugLevel >= 4) {
+ console.timeEnd(this + ": " + label); // eslint-disable-line no-console
+ }
+ }
+ /** Log to console if opts.debugLevel >= 2 */
+ logWarn(...args) {
+ if (this.options.debugLevel >= 2) {
+ console.warn(this.toString(), ...args); // eslint-disable-line no-console
+ }
+ }
+ /**
+ * Make sure that this node is vertically scrolled into the viewport.
+ *
+ * Nodes that are above the visible area become the top row, nodes that are
+ * below the viewport become the bottom row.
+ */
+ scrollTo(nodeOrOpts) {
+ const PADDING = 2; // leave some pixels between viewport bounds
+ let node;
+ let options;
+ if (nodeOrOpts instanceof WunderbaumNode) {
+ node = nodeOrOpts;
+ }
+ else {
+ options = nodeOrOpts;
+ node = options.node;
+ }
+ assert(node && node._rowIdx != null, `Invalid node: ${node}`);
+ const scrollParent = this.element;
+ const headerHeight = this.headerElement.clientHeight; // May be 0
+ const scrollTop = scrollParent.scrollTop;
+ const vpHeight = scrollParent.clientHeight;
+ const rowTop = node._rowIdx * ROW_HEIGHT + headerHeight;
+ const vpTop = headerHeight;
+ const vpRowTop = rowTop - scrollTop;
+ const vpRowBottom = vpRowTop + ROW_HEIGHT;
+ const topNode = options === null || options === void 0 ? void 0 : options.topNode;
+ // this.log( `scrollTo(${node.title}), vpTop:${vpTop}px, scrollTop:${scrollTop}, vpHeight:${vpHeight}, rowTop:${rowTop}, vpRowTop:${vpRowTop}`, nodeOrOpts , options);
+ let newScrollTop = null;
+ if (vpRowTop >= vpTop) {
+ if (vpRowBottom <= vpHeight) ;
+ else {
+ // Node is below viewport
+ // this.log("Below viewport");
+ newScrollTop = rowTop + ROW_HEIGHT - vpHeight + PADDING; // leave some pixels between viewport bounds
+ }
+ }
+ else {
+ // Node is above viewport
+ // this.log("Above viewport");
+ newScrollTop = rowTop - vpTop - PADDING; // leave some pixels between viewport bounds
+ }
+ if (newScrollTop != null) {
+ this.log(`scrollTo(${rowTop}): ${scrollTop} => ${newScrollTop}`);
+ scrollParent.scrollTop = newScrollTop;
+ if (topNode) {
+ // Make sure the topNode is always visible
+ this.scrollTo(topNode);
+ }
+ // this.update(ChangeType.scroll);
+ }
+ }
+ /**
+ * Make sure that this node is horizontally scrolled into the viewport.
+ * Called by {@link setColumn}.
+ */
+ scrollToHorz() {
+ // const PADDING = 1;
+ const fixedWidth = this.columns[0]._widthPx;
+ const vpWidth = this.element.clientWidth;
+ const scrollLeft = this.element.scrollLeft;
+ const colElem = this.getActiveColElem();
+ const colLeft = Number.parseInt(colElem === null || colElem === void 0 ? void 0 : colElem.style.left, 10);
+ const colRight = colLeft + Number.parseInt(colElem === null || colElem === void 0 ? void 0 : colElem.style.width, 10);
+ let newLeft = scrollLeft;
+ if (colLeft - scrollLeft < fixedWidth) {
+ // The current column is scrolled behind the left fixed column
+ newLeft = colLeft - fixedWidth;
+ }
+ else if (colRight - scrollLeft > vpWidth) {
+ // The current column is scrolled outside the right side
+ newLeft = colRight - vpWidth;
+ }
+ newLeft = Math.max(0, newLeft);
+ // util.assert(node._rowIdx != null);
+ this.log(`scrollToHorz(${this.activeColIdx}): ${colLeft}..${colRight}, fixedOfs=${fixedWidth}, vpWidth=${vpWidth}, curLeft=${scrollLeft} -> ${newLeft}`);
+ this.element.scrollLeft = newLeft;
+ // this.update(ChangeType.scroll);
+ }
+ /**
+ * Set column #colIdx to 'active'.
+ *
+ * This higlights the column header and -cells by adding the `wb-active`
+ * class to all grid cells of the active column.
+ * Available in cell-nav mode only.
+ *
+ * If _options.edit_ is true, the embedded input element is focused, or if
+ * colIdx is 0, the node title is put into edit mode.
+ */
+ setColumn(colIdx, options) {
+ var _a, _b, _c;
+ const edit = options === null || options === void 0 ? void 0 : options.edit;
+ const scroll = (options === null || options === void 0 ? void 0 : options.scrollIntoView) !== false;
+ assert(this.isCellNav(), "Expected cellNav mode");
+ if (typeof colIdx === "string") {
+ const cid = colIdx;
+ colIdx = this.columns.findIndex((c) => c.id === colIdx);
+ assert(colIdx >= 0, `Invalid colId: ${cid}`);
+ }
+ assert(0 <= colIdx && colIdx < this.columns.length, `Invalid colIdx: ${colIdx}`);
+ this.activeColIdx = colIdx;
+ // Update `wb-active` class for all headers
+ if (this.hasHeader()) {
+ for (const rowDiv of this.headerElement.children) {
+ let i = 0;
+ for (const colDiv of rowDiv.children) {
+ colDiv.classList.toggle("wb-active", i++ === colIdx);
+ }
+ }
+ }
+ (_a = this.activeNode) === null || _a === void 0 ? void 0 : _a.update(ChangeType.status);
+ // Update `wb-active` class for all cell spans
+ for (const rowDiv of this.nodeListElement.children) {
+ let i = 0;
+ for (const colDiv of rowDiv.children) {
+ colDiv.classList.toggle("wb-active", i++ === colIdx);
+ }
+ }
+ // Horizontically scroll into view
+ if (scroll || edit) {
+ this.scrollToHorz();
+ }
+ if (edit && this.activeNode) {
+ // this.activeNode.setFocus(); // Blur prev. input if any
+ if (colIdx === 0) {
+ this.activeNode.startEditTitle();
+ }
+ else {
+ (_c = (_b = this.getActiveColElem()) === null || _b === void 0 ? void 0 : _b.querySelector("input,select")) === null || _c === void 0 ? void 0 : _c.focus();
+ }
+ }
+ }
+ /** Set or remove keyboard focus to the tree container. */
+ setActiveNode(key, flag = true, options) {
+ var _a;
+ (_a = this.findKey(key)) === null || _a === void 0 ? void 0 : _a.setActive(flag, options);
+ }
+ /** Set or remove keyboard focus to the tree container. */
+ setFocus(flag = true) {
+ if (flag) {
+ this.element.focus();
+ }
+ else {
+ this.element.blur();
+ }
+ }
+ update(change, node, options) {
+ // this.log(`update(${change}) node=${node}`);
+ if (!(node instanceof WunderbaumNode)) {
+ options = node;
+ node = undefined;
+ }
+ const immediate = !!getOption(options, "immediate");
+ const RF = RenderFlag;
+ const pending = this.pendingChangeTypes;
+ if (this._disableUpdateCount) {
+ // Assuming that we redraw all when enableUpdate() is re-enabled.
+ // this.log(
+ // `IGNORED update(${change}) node=${node} (disable level ${this._disableUpdateCount})`
+ // );
+ this._disableUpdateIgnoreCount++;
+ return;
+ }
+ switch (change) {
+ case ChangeType.any:
+ case ChangeType.colStructure:
+ pending.add(RF.header);
+ pending.add(RF.clearMarkup);
+ pending.add(RF.redraw);
+ pending.add(RF.scroll);
+ break;
+ case ChangeType.resize:
+ // case ChangeType.colWidth:
+ pending.add(RF.header);
+ pending.add(RF.redraw);
+ break;
+ case ChangeType.structure:
+ pending.add(RF.redraw);
+ break;
+ case ChangeType.scroll:
+ pending.add(RF.scroll);
+ break;
+ case ChangeType.row:
+ case ChangeType.data:
+ case ChangeType.status:
+ assert(node, `Option '${change}' requires a node.`);
+ // Single nodes are immediately updated if already inside the viewport
+ // (otherwise we can ignore)
+ if (node._rowElem) {
+ node._render({ change: change });
+ }
+ break;
+ default:
+ error(`Invalid change type '${change}'.`);
+ }
+ if (change === ChangeType.colStructure) {
+ const isGrid = this.isGrid();
+ this.element.classList.toggle("wb-grid", isGrid);
+ if (!isGrid && this.isCellNav()) {
+ this.setCellNav(false);
+ }
+ }
+ if (pending.size > 0) {
+ if (immediate) {
+ this._updateViewportImmediately();
+ }
+ else {
+ this._updateViewportThrottled();
+ }
+ }
+ }
+ /** Disable mouse and keyboard interaction (return prev. state). */
+ setEnabled(flag = true) {
+ const prev = this.enabled;
+ this.enabled = !!flag;
+ this.element.classList.toggle("wb-disabled", !flag);
+ return prev;
+ }
+ /** Return false if tree is disabled. */
+ isEnabled() {
+ return this.enabled;
+ }
+ /** Return true if tree has more than one column, i.e. has additional data columns. */
+ isGrid() {
+ return this.columns && this.columns.length > 1;
+ }
+ /** Return true if cell-navigation mode is active. */
+ isCellNav() {
+ return !!this._cellNavMode;
+ }
+ /** Return true if row-navigation mode is active. */
+ isRowNav() {
+ return !this._cellNavMode;
+ }
+ /** Set the tree's navigation mode. */
+ setCellNav(flag = true) {
+ var _a;
+ const prev = this._cellNavMode;
+ // if (flag === prev) {
+ // return;
+ // }
+ this._cellNavMode = !!flag;
+ if (flag && !prev) {
+ // switch from row to cell mode
+ this.setColumn(0);
+ }
+ this.element.classList.toggle("wb-cell-mode", flag);
+ (_a = this.activeNode) === null || _a === void 0 ? void 0 : _a.update(ChangeType.status);
+ }
+ /** Set the tree's navigation mode option. */
+ setNavigationOption(mode, reset = false) {
+ if (!this.isGrid() && mode !== NavModeEnum.row) {
+ this.logWarn("Plain trees only support row navigation mode.");
+ return;
+ }
+ this.options.navigationModeOption = mode;
+ switch (mode) {
+ case NavModeEnum.cell:
+ this.setCellNav(true);
+ break;
+ case NavModeEnum.row:
+ this.setCellNav(false);
+ break;
+ case NavModeEnum.startCell:
+ if (reset) {
+ this.setCellNav(true);
+ }
+ break;
+ case NavModeEnum.startRow:
+ if (reset) {
+ this.setCellNav(false);
+ }
+ break;
+ default:
+ error(`Invalid mode '${mode}'.`);
+ }
+ }
+ /** Display tree status (ok, loading, error, noData) using styles and a dummy root node. */
+ setStatus(status, options) {
+ return this.root.setStatus(status, options);
+ }
+ /** Add or redefine node type definitions. */
+ setTypes(types, replace = true) {
+ assert(isPlainObject(types), `Expected plain objext: ${types}`);
+ if (replace) {
+ this.types = types;
+ }
+ else {
+ extend(this.types, types);
+ }
+ // Convert `TYPE.classes` to a Set
+ for (const t of Object.values(this.types)) {
+ if (t.classes) {
+ t.classes = toSet(t.classes);
+ }
+ }
+ }
+ /**
+ * Sort nodes list by title or custom criteria.
+ * @param {function} cmp custom compare function(a, b) that returns -1, 0, or 1
+ * (defaults to sorting by title).
+ * @param {boolean} deep pass true to sort all descendant nodes recursively
+ */
+ sortChildren(cmp = nodeTitleSorter, deep = false) {
+ this.root.sortChildren(cmp, deep);
+ }
+ /** Convert tree to an array of plain objects.
+ *
+ * @param callback(dict, node) is called for every node, in order to allow
+ * modifications.
+ * Return `false` to ignore this node or `"skip"` to include this node
+ * without its children.
+ * @see {@link WunderbaumNode.toDict}.
+ */
+ toDictArray(callback) {
+ var _a;
+ const res = this.root.toDict(true, callback);
+ return (_a = res.children) !== null && _a !== void 0 ? _a : [];
+ }
+ /**
+ * Update column headers and column width.
+ * Return true if at least one column width changed.
+ */
+ // _updateColumnWidths(options?: UpdateColumnsOptions): boolean {
+ _updateColumnWidths() {
+ // options = Object.assign({ updateRows: true, renderMarkup: false }, options);
+ const defaultMinWidth = 4;
+ const vpWidth = this.element.clientWidth;
+ // Shorten last column width to avoid h-scrollbar
+ // (otherwise resizbing the demo would display a void scrollbar?)
+ const FIX_ADJUST_LAST_COL = 1;
+ const columns = this.columns;
+ const col0 = columns[0];
+ let totalWidth = 0;
+ let totalWeight = 0;
+ let fixedWidth = 0;
+ let modified = false;
+ // this.element.classList.toggle("wb-grid", isGrid);
+ // if (!isGrid && this.isCellNav()) {
+ // this.setCellNav(false);
+ // }
+ // if (options.calculateCols) {
+ if (col0.id !== "*") {
+ throw new Error(`First column must have id '*': got '${col0.id}'.`);
+ }
+ // Gather width definitions
+ this._columnsById = {};
+ for (const col of columns) {
+ this._columnsById[col.id] = col;
+ const cw = col.width;
+ if (col.id === "*" && col !== col0) {
+ throw new Error(`Column id '*' must be defined only once: '${col.title}'.`);
+ }
+ if (!cw || cw === "*") {
+ col._weight = 1.0;
+ totalWeight += 1.0;
+ }
+ else if (typeof cw === "number") {
+ col._weight = cw;
+ totalWeight += cw;
+ }
+ else if (typeof cw === "string" && cw.endsWith("px")) {
+ col._weight = 0;
+ const px = parseFloat(cw.slice(0, -2));
+ if (col._widthPx != px) {
+ modified = true;
+ col._widthPx = px;
+ }
+ fixedWidth += px;
+ }
+ else {
+ error(`Invalid column width: ${cw} (expected string ending with 'px' or number, e.g. "px" or ).`);
+ }
+ }
+ // Share remaining space between non-fixed columns
+ const restPx = Math.max(0, vpWidth - fixedWidth);
+ let ofsPx = 0;
+ for (const col of columns) {
+ let minWidth;
+ if (col._weight) {
+ const cmw = col.minWidth;
+ if (typeof cmw === "number") {
+ minWidth = cmw;
+ }
+ else if (typeof cmw === "string" && cmw.endsWith("px")) {
+ minWidth = parseFloat(cmw.slice(0, -2));
+ }
+ else {
+ minWidth = defaultMinWidth;
+ }
+ const px = Math.max(minWidth, (restPx * col._weight) / totalWeight);
+ if (col._widthPx != px) {
+ modified = true;
+ col._widthPx = px;
+ }
+ }
+ col._ofsPx = ofsPx;
+ ofsPx += col._widthPx;
+ }
+ columns[columns.length - 1]._widthPx -= FIX_ADJUST_LAST_COL;
+ totalWidth = ofsPx - FIX_ADJUST_LAST_COL;
+ const tw = `${totalWidth}px`;
+ this.headerElement.style.width = tw;
+ this.listContainerElement.style.width = tw;
+ // }
+ // Every column has now a calculated `_ofsPx` and `_widthPx`
+ // this.logInfo("UC", this.columns, vpWidth, this.element.clientWidth, this.element);
+ // console.trace();
+ // util.error("BREAK");
+ // if (modified) {
+ // this._renderHeaderMarkup();
+ // if (options.renderMarkup) {
+ // this.update(ChangeType.header, { removeMarkup: true });
+ // } else if (options.updateRows) {
+ // this._updateRows();
+ // }
+ // }
+ return modified;
+ }
+ /** Create/update header markup from `this.columns` definition.
+ * @internal
+ */
+ _renderHeaderMarkup() {
+ assert(this.headerElement, "Expected a headerElement");
+ const wantHeader = this.hasHeader();
+ setElemDisplay(this.headerElement, wantHeader);
+ if (!wantHeader) {
+ return;
+ }
+ const colCount = this.columns.length;
+ const headerRow = this.headerElement.querySelector(".wb-row");
+ assert(headerRow, "Expected a row in header element");
+ headerRow.innerHTML = " ".repeat(colCount);
+ for (let i = 0; i < colCount; i++) {
+ const col = this.columns[i];
+ const colElem = headerRow.children[i];
+ colElem.style.left = col._ofsPx + "px";
+ colElem.style.width = col._widthPx + "px";
+ // Add classes from `columns` definition to `` cells
+ if (typeof col.headerClasses === "string") {
+ col.headerClasses
+ ? colElem.classList.add(...col.headerClasses.split(" "))
+ : 0;
+ }
+ else {
+ col.classes ? colElem.classList.add(...col.classes.split(" ")) : 0;
+ }
+ const title = escapeHtml(col.title || col.id);
+ let tooltip = "";
+ if (col.tooltip) {
+ tooltip = escapeTooltip(col.tooltip);
+ tooltip = ` title="${tooltip}"`;
+ }
+ let resizer = "";
+ if (i < colCount - 1) {
+ resizer = ' ';
+ }
+ colElem.innerHTML = `${title} ${resizer}`;
+ if (this.isCellNav()) {
+ colElem.classList.toggle("wb-active", i === this.activeColIdx);
+ }
+ }
+ }
+ /**
+ * Render pending changes that were scheduled using {@link WunderbaumNode.update} if any.
+ *
+ * This is hardly ever neccessary, since we normally either
+ * - call `update(ChangeType.TYPE)` (async, throttled), or
+ * - call `update(ChangeType.TYPE, {immediate: true})` (synchronous)
+ *
+ * `updatePendingModifications()` will only force immediate execution of
+ * pending async changes if any.
+ */
+ updatePendingModifications() {
+ if (this.pendingChangeTypes.size > 0) {
+ this._updateViewportImmediately();
+ }
+ }
+ /**
+ * This is the actual update method, which is wrapped inside a throttle method.
+ * It calls `updateColumns()` and `_updateRows()`.
+ *
+ * This protected method should not be called directly but via
+ * {@link WunderbaumNode.update}`, {@link Wunderbaum.update},
+ * or {@link Wunderbaum.updatePendingModifications}.
+ * @internal
+ */
+ _updateViewportImmediately() {
+ var _a;
+ if (this._disableUpdateCount) {
+ this.log(`_updateViewportImmediately() IGNORED (disable level: ${this._disableUpdateCount}).`);
+ this._disableUpdateIgnoreCount++;
+ return;
+ }
+ if (this._updateViewportThrottled.pending()) {
+ // this.logWarn(`_updateViewportImmediately() cancel pending timer.`);
+ this._updateViewportThrottled.cancel();
+ }
+ // Shorten container height to avoid v-scrollbar
+ const FIX_ADJUST_HEIGHT = 1;
+ const RF = RenderFlag;
+ const pending = new Set(this.pendingChangeTypes);
+ this.pendingChangeTypes.clear();
+ const scrollOnly = pending.has(RF.scroll) && pending.size === 1;
+ if (scrollOnly) {
+ this._updateRows({ newNodesOnly: true });
+ // this.log("_updateViewportImmediately(): scroll only.");
+ }
+ else {
+ this.log("_updateViewportImmediately():", pending);
+ if (this.options.adjustHeight !== false) {
+ let height = this.listContainerElement.clientHeight;
+ const headerHeight = this.headerElement.clientHeight; // May be 0
+ const wantHeight = this.element.clientHeight - headerHeight - FIX_ADJUST_HEIGHT;
+ if (Math.abs(height - wantHeight) > 1.0) {
+ // this.log("resize", height, wantHeight);
+ this.listContainerElement.style.height = wantHeight + "px";
+ height = wantHeight;
+ }
+ }
+ // console.profile(`_updateViewportImmediately()`)
+ if (pending.has(RF.clearMarkup)) {
+ this.visit((n) => {
+ n.removeMarkup();
+ });
+ }
+ // let widthModified = false;
+ if (pending.has(RF.header)) {
+ // widthModified = this._updateColumnWidths();
+ this._updateColumnWidths();
+ this._renderHeaderMarkup();
+ }
+ this._updateRows();
+ // console.profileEnd(`_updateViewportImmediately()`)
+ }
+ if (this.options.connectTopBreadcrumb) {
+ let path = (_a = this.getTopmostVpNode(true)) === null || _a === void 0 ? void 0 : _a.getPath(false, "title", " > ");
+ path = path ? path + " >" : "";
+ this.options.connectTopBreadcrumb.textContent = path;
+ }
+ this._callEvent("update");
+ }
+ // /**
+ // * Assert that TR order matches the natural node order
+ // * @internal
+ // */
+ // protected _validateRows(): boolean {
+ // let trs = this.nodeListElement.childNodes;
+ // let i = 0;
+ // let prev = -1;
+ // let ok = true;
+ // trs.forEach((element) => {
+ // const tr = element as HTMLTableRowElement;
+ // const top = Number.parseInt(tr.style.top);
+ // const n = (tr)._wb_node;
+ // // if (i < 4) {
+ // // console.info(
+ // // `TR#${i}, rowIdx=${n._rowIdx} , top=${top}px: '${n.title}'`
+ // // );
+ // // }
+ // if (prev >= 0 && top !== prev + ROW_HEIGHT) {
+ // n.logWarn(
+ // `TR order mismatch at index ${i}: top=${top}px != ${
+ // prev + ROW_HEIGHT
+ // }`
+ // );
+ // // throw new Error("fault");
+ // ok = false;
+ // }
+ // prev = top;
+ // i++;
+ // });
+ // return ok;
+ // }
+ /*
+ * - Traverse all *visible* nodes of the whole tree, i.e. skip collapsed nodes.
+ * - Store count of rows to `tree.treeRowCount`.
+ * - Renumber `node._rowIdx` for all visible nodes.
+ * - Calculate the index range that must be rendered to fill the viewport
+ * (including upper and lower prefetch)
+ * -
+ */
+ _updateRows(options) {
+ // const label = this.logTime("_updateRows");
+ // this.log("_updateRows", opts)
+ options = Object.assign({ newNodesOnly: false }, options);
+ const newNodesOnly = !!options.newNodesOnly;
+ const row_height = ROW_HEIGHT;
+ const vp_height = this.element.clientHeight;
+ const prefetch = RENDER_MAX_PREFETCH;
+ // const grace_prefetch = RENDER_MAX_PREFETCH - RENDER_MIN_PREFETCH;
+ const ofs = this.element.scrollTop;
+ let startIdx = Math.max(0, ofs / row_height - prefetch);
+ startIdx = Math.floor(startIdx);
+ // Make sure start is always even, so the alternating row colors don't
+ // change when scrolling:
+ if (startIdx % 2) {
+ startIdx--;
+ }
+ let endIdx = Math.max(0, (ofs + vp_height) / row_height + prefetch);
+ endIdx = Math.ceil(endIdx);
+ // this.debug("render", opts);
+ const obsoleteNodes = new Set();
+ this.nodeListElement.childNodes.forEach((elem) => {
+ const tr = elem;
+ obsoleteNodes.add(tr._wb_node);
+ });
+ let idx = 0;
+ let top = 0;
+ let modified = false;
+ let prevElem = "first";
+ this.visitRows(function (node) {
+ // node.log("visit")
+ const rowDiv = node._rowElem;
+ // Renumber all expanded nodes
+ if (node._rowIdx !== idx) {
+ node._rowIdx = idx;
+ modified = true;
+ }
+ if (idx < startIdx || idx > endIdx) {
+ // row is outside viewport bounds
+ if (rowDiv) {
+ prevElem = rowDiv;
+ }
+ }
+ else if (rowDiv && newNodesOnly) {
+ obsoleteNodes.delete(node);
+ // no need to update existing node markup
+ rowDiv.style.top = idx * ROW_HEIGHT + "px";
+ prevElem = rowDiv;
+ }
+ else {
+ obsoleteNodes.delete(node);
+ // Create new markup
+ if (rowDiv) {
+ rowDiv.style.top = idx * ROW_HEIGHT + "px";
+ }
+ node._render({ top: top, after: prevElem });
+ // node.log("render", top, prevElem, "=>", node._rowElem);
+ prevElem = node._rowElem;
+ }
+ idx++;
+ top += row_height;
+ });
+ this.treeRowCount = idx;
+ for (const n of obsoleteNodes) {
+ n._callEvent("discard");
+ n.removeMarkup();
+ }
+ // Resize tree container
+ this.nodeListElement.style.height = `${top}px`;
+ // this.log(
+ // `_updateRows(scrollOfs:${ofs}, ${startIdx}..${endIdx})`,
+ // this.nodeListElement.style.height
+ // );
+ // this.logTimeEnd(label);
+ // this._validateRows();
+ return modified;
+ }
+ /**
+ * Call `callback(node)` for all nodes in hierarchical order (depth-first, pre-order).
+ * @see {@link IterableIterator}, {@link WunderbaumNode.visit}.
+ *
+ * @param {function} callback the callback function.
+ * Return false to stop iteration, return "skip" to skip this node and
+ * children only.
+ * @returns {boolean} false, if the iterator was stopped.
+ */
+ visit(callback) {
+ return this.root.visit(callback, false);
+ }
+ /**
+ * Call callback(node) for all nodes in vertical order, top down (or bottom up).
+ *
+ * Note that this considers expansion state, i.e. filtered nodes and children
+ * of collapsed nodes are skipped, unless `includeHidden` is set.
+ *
+ * Stop iteration if callback() returns false.
+ * Return false if iteration was stopped.
+ *
+ * @returns {boolean} false if iteration was canceled
+ */
+ visitRows(callback, options) {
+ if (!this.root.hasChildren()) {
+ return false;
+ }
+ if (options && options.reverse) {
+ delete options.reverse;
+ return this._visitRowsUp(callback, options);
+ }
+ options = options || {};
+ let i, nextIdx, parent, res, siblings, stopNode, siblingOfs = 0, skipFirstNode = options.includeSelf === false, node = options.start || this.root.children[0];
+ const includeHidden = !!options.includeHidden;
+ const checkFilter = !includeHidden && this.filterMode === "hide";
+ parent = node.parent;
+ while (parent) {
+ // visit siblings
+ siblings = parent.children;
+ nextIdx = siblings.indexOf(node) + siblingOfs;
+ assert(nextIdx >= 0, `Could not find ${node} in parent's children: ${parent}`);
+ for (i = nextIdx; i < siblings.length; i++) {
+ node = siblings[i];
+ if (node === stopNode) {
+ return false;
+ }
+ if (checkFilter &&
+ !node.statusNodeType &&
+ !node.match &&
+ !node.subMatchCount) {
+ continue;
+ }
+ if (!skipFirstNode && callback(node) === false) {
+ return false;
+ }
+ skipFirstNode = false;
+ // Dive into node's child nodes
+ if (node.children &&
+ node.children.length &&
+ (includeHidden || node.expanded)) {
+ res = node.visit((n) => {
+ if (n === stopNode) {
+ return false;
+ }
+ if (checkFilter && !n.match && !n.subMatchCount) {
+ return "skip";
+ }
+ if (callback(n) === false) {
+ return false;
+ }
+ if (!includeHidden && n.children && !n.expanded) {
+ return "skip";
+ }
+ }, false);
+ if (res === false) {
+ return false;
+ }
+ }
+ }
+ // Visit parent nodes (bottom up)
+ node = parent;
+ parent = parent.parent;
+ siblingOfs = 1; //
+ if (!parent && options.wrap) {
+ this.logDebug("visitRows(): wrap around");
+ assert(options.start, "`wrap` option requires `start`");
+ stopNode = options.start;
+ options.wrap = false;
+ parent = this.root;
+ siblingOfs = 0;
+ }
+ }
+ return true;
+ }
+ /**
+ * Call fn(node) for all nodes in vertical order, bottom up.
+ * @internal
+ */
+ _visitRowsUp(callback, options) {
+ let children, idx, parent, node = options.start || this.root.children[0];
+ const includeHidden = !!options.includeHidden;
+ if (options.includeSelf !== false) {
+ if (callback(node) === false) {
+ return false;
+ }
+ }
+ while (true) {
+ parent = node.parent;
+ children = parent.children;
+ if (children[0] === node) {
+ // If this is already the first sibling, goto parent
+ node = parent;
+ if (!node.parent) {
+ break; // first node of the tree
+ }
+ children = parent.children;
+ }
+ else {
+ // Otherwise, goto prev. sibling
+ idx = children.indexOf(node);
+ node = children[idx - 1];
+ // If the prev. sibling has children, follow down to last descendant
+ while ((includeHidden || node.expanded) &&
+ node.children &&
+ node.children.length) {
+ children = node.children;
+ parent = node;
+ node = children[children.length - 1];
+ }
+ }
+ // Skip invisible
+ if (!includeHidden && !node.isVisible()) {
+ continue;
+ }
+ if (callback(node) === false) {
+ return false;
+ }
+ }
+ return true;
+ }
+ /**
+ * Reload the tree with a new source.
+ *
+ * Previous data is cleared. Note that also column- and type defintions may
+ * be passed with the `source` object.
+ */
+ load(source) {
+ this.clear();
+ return this.root.load(source);
+ }
+ /**
+ * Disable render requests during operations that would trigger many updates.
+ *
+ * ```js
+ * try {
+ * tree.enableUpdate(false);
+ * // ... (long running operation that would trigger many updates)
+ * foo();
+ * // ... NOTE: make sure that async operations have finished, e.g.
+ * await foo();
+ * } finally {
+ * tree.enableUpdate(true);
+ * }
+ * ```
+ */
+ enableUpdate(flag) {
+ /*
+ 5 7 9 20 25 30
+ 1 >-------------------------------------<
+ 2 >--------------------<
+ 3 >--------------------------<
+ */
+ if (flag) {
+ assert(this._disableUpdateCount > 0, "enableUpdate(true) was called too often");
+ this._disableUpdateCount--;
+ // this.logDebug(
+ // `enableUpdate(${flag}): count -> ${this._disableUpdateCount}...`
+ // );
+ if (this._disableUpdateCount === 0) {
+ this.logDebug(`enableUpdate(): active again. Re-painting to catch up with ${this._disableUpdateIgnoreCount} ignored update requests...`);
+ this._disableUpdateIgnoreCount = 0;
+ this.update(ChangeType.any, { immediate: true });
+ }
+ }
+ else {
+ this._disableUpdateCount++;
+ // this.logDebug(
+ // `enableUpdate(${flag}): count -> ${this._disableUpdateCount}...`
+ // );
+ // this._disableUpdate = Date.now();
+ }
+ // return !flag; // return previous value
+ }
+ /* ---------------------------------------------------------------------------
+ * FILTER
+ * -------------------------------------------------------------------------*/
+ /**
+ * Dim or hide nodes.
+ */
+ filterNodes(filter, options) {
+ return this.extensions.filter.filterNodes(filter, options);
+ }
+ /**
+ * Dim or hide whole branches.
+ */
+ filterBranches(filter, options) {
+ return this.extensions.filter.filterBranches(filter, options);
+ }
+ /**
+ * Reset the filter.
+ */
+ clearFilter() {
+ return this.extensions.filter.clearFilter();
+ }
+ /**
+ * Return true if a filter is currently applied.
+ */
+ isFilterActive() {
+ return !!this.filterMode;
+ }
+ /**
+ * Re-apply current filter.
+ */
+ updateFilter() {
+ return this.extensions.filter.updateFilter();
+ }
+ }
+ Wunderbaum.sequence = 0;
+ /** Wunderbaum release version number "MAJOR.MINOR.PATCH". */
+ Wunderbaum.version = "v0.8.0"; // Set to semver by 'grunt release'
+ /** Expose some useful methods of the util.ts module as `Wunderbaum.util`. */
+ Wunderbaum.util = util;
- exports.Wunderbaum = Wunderbaum;
+ exports.Wunderbaum = Wunderbaum;
}));
diff --git a/dist/wunderbaum.umd.min.js b/dist/wunderbaum.umd.min.js
index 7b8d7e48..1499bf2a 100644
--- a/dist/wunderbaum.umd.min.js
+++ b/dist/wunderbaum.umd.min.js
@@ -1,87 +1,86 @@
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).mar10={})}(this,(function(e){"use strict";
/*!
- * Wunderbaum - util
- * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */const t={0:"",1:"left",2:"middle",3:"right",4:"back",5:"forward"},i=function(){const e=navigator;return{isMac:/Mac/.test(e.platform)}}().isMac,s=/[&<>"'/]/g,n=/[<>"'/]/g,r={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};function o(e,t){if(!e)throw t=t||"Assertion failed.",new Error(t)}function l(e){"loading"===document.readyState?document.addEventListener("DOMContentLoaded",e):e()}function a(e){throw new Error(e)}function d(e){return(""+e).replace(s,(function(e){return r[e]}))}function c(e){return(""+e).replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}function h(e){return(""+e).replace(n,(function(e){return r[e]}))}function u(e,t=!1){const i=e.tagName;let s=null;if("SPAN"===i&&e.classList.contains("wb-col")){const i=e,n=i.querySelector("input,select");if(n)return u(n,t);i.innerText=""+s}else if("INPUT"===i){const i=e;switch(i.type){case"button":case"reset":case"submit":case"image":break;case"checkbox":s=i.indeterminate?null:i.checked;break;case"date":case"datetime":case"datetime-local":case"month":case"time":case"week":s=t?i.valueAsDate:i.value;break;case"number":case"range":s=i.valueAsNumber;break;case"radio":{const e=i.name,t=i.parentElement.querySelector(`input[name="${e}"]:checked`);s=t?t.value:void 0}break;default:s=i.value}}else if("SELECT"===i){s=e.value}return s}function p(e,t){const i=v(e).style;t?"none"===i.display&&(i.display=""):""===i.display&&(i.display="none")}function f(e){const t=document.createElement("template");return t.innerHTML=e.trim(),t.content.firstElementChild}const g=new Set(["Alt","Control","Meta","Shift"]);function v(e){return e?"string"==typeof e?document.querySelector(e):e:null}function m(e){return e?"string"==typeof e?document.querySelector(e):e:null}function b(e){const i=e.key,s=e.type,n=[];return e.altKey&&n.push("Alt"),e.ctrlKey&&n.push("Control"),e.metaKey&&n.push("Meta"),e.shiftKey&&n.push("Shift"),"click"===s||"dblclick"===s?n.push(t[e.button]+s):"wheel"===s?n.push(s):g.has(i)||n.push(i),n.join("+")}function y(...e){for(let t=1;t{e.addEventListener(t,(function(e){if(!n)return r(e);if(e.target){let t=e.target;if(t.matches(n))return r(e);if(t=t.closest(n),t)return r(e)}}))}))}function k(e,t,i,s){let n,r;const o=s||e,l=e[t],a=(...e)=>l.apply(o,e),d=e=>l.apply(o,e);e[t]=(...e)=>{try{return n=o._super,r=o._superApply,o._super=a,o._superApply=d,i.apply(o,e)}finally{o._super=n,o._superApply=r}}}function C(e,t,i=void 0){let s;e&&t.indexOf(".")>=0&&([s,t]=t.split("."),e=e[s]);const n=e?e[t]:null;return null!=n?n:i}function N(e){if(e instanceof Set)return e;if("string"==typeof e){const t=new Set;for(const i of e.split(" "))t.add(i.trim());return t}if(Array.isArray(e))return new Set(e);throw new Error("Cannot convert to Set: "+e)}function S(e,t){let i=0,s=null;const n=Object.assign({minDelay:16,defaultDelay:200,maxDelay:5e3,delayFactor:2},t),r=Math.max(16,+n.minDelay),o=+n.maxDelay,l=(...t)=>{if(i)s=t,i+=1;else{i=1;const a=t;s=null;const d=Date.now();try{e.apply(this,a)}catch(e){console.error(e)}const c=Date.now()-d,h=Math.min(Math.max(r,c*n.delayFactor),o),u=Math.max(r,h-c);setTimeout((()=>{i=0,null!=s&&l.apply(this,s)}),u)}};return l}var D,I,T,L,M,O=Object.freeze({__proto__:null,Deferred:class{constructor(){this.thens=[],this.catches=[],this.status=""}resolve(e){if(this.status)throw new Error("already settled");this.status="resolved",this.resolvedValue=e,this.thens.forEach((t=>t(e))),this.thens=[]}reject(e){if(this.status)throw new Error("already settled");this.status="rejected",this.rejectedError=e,this.catches.forEach((t=>t(e))),this.catches=[]}then(e){"resolved"===status?e(this.resolvedValue):this.thens.unshift(e)}catch(e){"rejected"===this.status?e(this.rejectedError):this.catches.unshift(e)}promise(){return{then:this.then,catch:this.catch}}},MAX_INT:9007199254740991,MOUSE_BUTTONS:t,adaptiveThrottle:S,assert:o,documentReady:l,documentReadyPromise:function(){return new Promise((e=>{l(e)}))},each:function(e,t){if(null==e)return e;const i=e.length;let s=0;if("number"==typeof i)for(;s")>=0&&a("Not implemented"),e},getOption:C,getValueFromElem:u,isArray:w,isEmptyObject:E,isFunction:function(e){return"function"==typeof e},isMac:i,isPlainObject:x,noop:function(...e){},onEvent:_,overrideMethod:k,setElemDisplay:p,setTimeoutPromise:function(e,t){return new Promise(((i,s)=>{setTimeout((()=>{try{i(e.apply(this))}catch(e){s(e)}}),t)}))},setValueToElem:function e(t,i){const s=t.tagName;if("SPAN"===s&&t.classList.contains("wb-col")){const s=t,n=s.querySelector("input,select");if(n)return e(n,i);s.innerText=""+i}else if("INPUT"===s){const e=t,s=e.type;switch(s){case"checkbox":e.indeterminate=null===i,e.checked=!!i;break;case"date":case"month":case"time":case"week":case"datetime":case"datetime-local":e.valueAsDate=new Date(i);break;case"number":case"range":null==i?e.value=i:e.valueAsNumber=i;break;case"radio":a(`Not yet implemented: ${s}`);break;case"button":case"reset":case"submit":case"image":break;default:e.value=null!=i?i:""}}else if("SELECT"===s){const e=t;null==i?e.selectedIndex=-1:e.value=i}},sleep:async function(e){return new Promise((t=>setTimeout(t,e)))},toSet:N,toggleCheckbox:function(e,t,i){const s=v(e);if(o("checkbox"===s.type,`Expected a checkbox: ${s.type}`),null!=i||(i=s.classList.contains("wb-tristate")||s.indeterminate),void 0===t){switch(s.indeterminate?null:s.checked){case!0:t=!1;break;case!1:t=!i||null;break;case null:t=!0}}s.indeterminate=null==t,s.checked=!!t},type:function(e){return Object.prototype.toString.call(e).replace(/^\[object (.+)\]$/,"$1").toLowerCase()}});
+ * debounce & throttle, taken from https://github.com/lodash/lodash v4.17.21
+ * MIT License: https://raw.githubusercontent.com/lodash/lodash/4.17.21-npm/LICENSE
+ * Modified for TypeScript type annotations.
+ */const t="object"==typeof global&&null!==global&&global.Object===Object&&global,i="object"==typeof globalThis&&null!==globalThis&&globalThis.Object==Object&&globalThis,s="object"==typeof self&&null!==self&&self.Object===Object&&self,n=i||t||s||Function("return this")();function r(e){const t=typeof e;return null!=e&&("object"===t||"function"===t)}function o(e,t=0,i={}){let s,o,l,a,d,c,h=0,u=!1,p=!1,f=!0;const g=!t&&0!==t&&"function"==typeof n.requestAnimationFrame;if("function"!=typeof e)throw new TypeError("Expected a function");function v(t){const i=s,n=o;return s=o=void 0,h=t,a=e.apply(n,i),a}function m(e,t){return g?(n.cancelAnimationFrame(d),n.requestAnimationFrame(e)):setTimeout(e,t)}function y(e){const i=e-c;return void 0===c||i>=t||i<0||p&&e-h>=l}function b(){const e=Date.now();if(y(e))return w(e);d=m(b,function(e){const i=e-h,s=t-(e-c);return p?Math.min(s,l-i):s}(e))}function w(e){return d=void 0,f&&s?v(e):(s=o=void 0,a)}function E(...e){const i=Date.now(),n=y(i);if(s=e,o=this,c=i,n){if(void 0===d)return function(e){return h=e,d=m(b,t),u?v(e):a}(c);if(p)return d=m(b,t),v(c)}return void 0===d&&(d=m(b,t)),a}return t=+t||0,r(i)&&(u=!!i.leading,p="maxWait"in i,l=p?Math.max(+i.maxWait||0,t):l,f="trailing"in i?!!i.trailing:f),E.cancel=function(){void 0!==d&&function(e){if(g)return n.cancelAnimationFrame(e);clearTimeout(e)}(d),h=0,s=c=o=d=void 0},E.flush=function(){return void 0===d?a:w(Date.now())},E.pending=function(){return void 0!==d},E}function l(e,t=0,i={}){let s=!0,n=!0;if("function"!=typeof e)throw new TypeError("Expected a function");return r(i)&&(s="leading"in i?!!i.leading:s,n="trailing"in i?!!i.trailing:n),o(e,t,{leading:s,trailing:n,maxWait:t})}
/*!
- * Wunderbaum - types
- * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */!function(e){e.any="any",e.data="data",e.colStructure="colStructure",e.resize="resize",e.row="row",e.structure="structure",e.status="status",e.scroll="scroll"}(D||(D={})),function(e){e.clearMarkup="clearMarkup",e.header="header",e.redraw="redraw",e.scroll="scroll"}(I||(I={})),function(e){e.ok="ok",e.loading="loading",e.error="error",e.noData="noData",e.paging="paging"}(T||(T={})),function(e){e.unknown="",e.checkbox="checkbox",e.column="column",e.expander="expander",e.icon="icon",e.prefix="prefix",e.title="title"}(L||(L={})),function(e){e.startRow="startRow",e.cell="cell",e.startCell="startCell",e.row="row"}(M||(M={}));
+ * Wunderbaum - util
+ * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */const a={0:"",1:"left",2:"middle",3:"right",4:"back",5:"forward"},d=function(){const e=navigator;return{isMac:/Mac/.test(e.platform)}}().isMac,c=/[&<>"'/]/g,h=/[<>"'/]/g,u={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};class p extends Error{constructor(e){super(e),this.name="ValidationError"}}function f(e,t){if(!e)throw t=t||"Assertion failed.",new Error(t)}function g(e){"loading"===document.readyState?document.addEventListener("DOMContentLoaded",e):e()}function v(e){throw new Error(e)}function m(e){return(""+e).replace(c,(function(e){return u[e]}))}function y(e){return(""+e).replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}function b(e){return(""+e).replace(h,(function(e){return u[e]}))}function w(e,t=!1){const i=e.tagName;let s=null;if("SPAN"===i&&e.classList.contains("wb-col")){const i=e,n=i.querySelector("input,select");if(n)return w(n,t);i.innerText=""+s}else if("INPUT"===i){const i=e;switch(i.type){case"button":case"reset":case"submit":case"image":break;case"checkbox":s=i.indeterminate?null:i.checked;break;case"date":case"datetime":case"datetime-local":case"month":case"time":case"week":s=t?i.valueAsDate:i.value;break;case"number":case"range":s=i.valueAsNumber;break;case"radio":{const e=i.name,t=i.parentElement.querySelector(`input[name="${e}"]:checked`);s=t?t.value:void 0}break;default:s=i.value}}else if("SELECT"===i){s=e.value}return s}function E(e,t){const i=k(e).style;t?"none"===i.display&&(i.display=""):""===i.display&&(i.display="none")}function x(e){const t=document.createElement("template");return t.innerHTML=e.trim(),t.content.firstElementChild}const _=new Set(["Alt","Control","Meta","Shift"]);function k(e){return e?"string"==typeof e?document.querySelector(e):e:null}function C(e){const t=e.key,i=e.type,s=[];return e.altKey&&s.push("Alt"),e.ctrlKey&&s.push("Control"),e.metaKey&&s.push("Meta"),e.shiftKey&&s.push("Shift"),"click"===i||"dblclick"===i?s.push(a[e.button]+i):"wheel"===i?s.push(i):_.has(t)||s.push(t),s.join("+")}function N(...e){for(let t=1;t{e.addEventListener(t,(function(e){if(!n)return r(e);if(e.target){let t=e.target;if(t.matches(n))return r(e);if(t=t.closest(n),t)return r(e)}}))}))}function L(e,t,i,s){let n,r;const o=s||e,l=e[t],a=(...e)=>l.apply(o,e),d=e=>l.apply(o,e);e[t]=(...e)=>{try{return n=o._super,r=o._superApply,o._super=a,o._superApply=d,i.apply(o,e)}finally{o._super=n,o._superApply=r}}}function M(e,t,i=void 0){let s;e&&t.indexOf(".")>=0&&([s,t]=t.split("."),e=e[s]);const n=e?e[t]:null;return null!=n?n:i}function O(e){if(e instanceof Set)return e;if("string"==typeof e){const t=new Set;for(const i of e.split(" "))t.add(i.trim());return t}if(Array.isArray(e))return new Set(e);throw new Error("Cannot convert to Set: "+e)}function A(e,t){const i=Object.assign({minDelay:16,defaultDelay:200,maxDelay:5e3,delayFactor:2},t),s=Math.max(16,+i.minDelay),n=+i.maxDelay;let r=0,o=null,l=null;const a=(...t)=>{if(r)o=t,r+=1;else{r=1;const d=t;o=null;const c=Date.now();try{e.apply(this,d)}catch(e){console.error(e)}const h=Date.now()-c,u=Math.min(Math.max(s,h*i.delayFactor),n),p=Math.max(s,u-h);l=setTimeout((()=>{l=null,r=0,null!=o&&a.apply(this,o)}),p)}};return a.cancel=()=>{l&&(clearTimeout(l),l=null),o=null,r=0},a.pending=()=>!!l,a.flush=()=>{throw new Error("Not implemented")},a}var $,P,R,F,z,U=Object.freeze({__proto__:null,Deferred:class{constructor(){this.thens=[],this.catches=[],this.status=""}resolve(e){if(this.status)throw new Error("already settled");this.status="resolved",this.resolvedValue=e,this.thens.forEach((t=>t(e))),this.thens=[]}reject(e){if(this.status)throw new Error("already settled");this.status="rejected",this.rejectedError=e,this.catches.forEach((t=>t(e))),this.catches=[]}then(e){"resolved"===status?e(this.resolvedValue):this.thens.unshift(e)}catch(e){"rejected"===this.status?e(this.rejectedError):this.catches.unshift(e)}promise(){return{then:this.then,catch:this.catch}}},MAX_INT:9007199254740991,MOUSE_BUTTONS:a,ValidationError:p,adaptiveThrottle:A,assert:f,debounce:o,documentReady:g,documentReadyPromise:function(){return new Promise((e=>{g(e)}))},each:function(e,t){if(null==e)return e;const i=e.length;let s=0;if("number"==typeof i)for(;s")>=0&&v("Not implemented"),e},getOption:M,getValueFromElem:w,isArray:S,isEmptyObject:D,isFunction:function(e){return"function"==typeof e},isMac:d,isPlainObject:T,noop:function(...e){},onEvent:I,overrideMethod:L,setElemDisplay:E,setTimeoutPromise:function(e,t){return new Promise(((i,s)=>{setTimeout((()=>{try{i(e.apply(this))}catch(e){s(e)}}),t)}))},setValueToElem:function e(t,i){const s=t.tagName;if("SPAN"===s&&t.classList.contains("wb-col")){const s=t,n=s.querySelector("input,select");if(n)return e(n,i);s.innerText=""+i}else if("INPUT"===s){const e=t,s=e.type;switch(s){case"checkbox":e.indeterminate=null===i,e.checked=!!i;break;case"date":case"month":case"time":case"week":case"datetime":case"datetime-local":e.valueAsDate=new Date(i);break;case"number":case"range":null==i?e.value=i:e.valueAsNumber=i;break;case"radio":v(`Not yet implemented: ${s}`);break;case"button":case"reset":case"submit":case"image":break;default:e.value=null!=i?i:""}}else if("SELECT"===s){const e=t;null==i?e.selectedIndex=-1:e.value=i}},sleep:async function(e){return new Promise((t=>setTimeout(t,e)))},throttle:l,toSet:O,toggleCheckbox:function(e,t,i){const s=k(e);if(f("checkbox"===s.type,`Expected a checkbox: ${s.type}`),null!=i||(i=s.classList.contains("wb-tristate")||s.indeterminate),void 0===t){switch(s.indeterminate?null:s.checked){case!0:t=!1;break;case!1:t=!i||null;break;case null:t=!0}}s.indeterminate=null==t,s.checked=!!t},type:function(e){return Object.prototype.toString.call(e).replace(/^\[object (.+)\]$/,"$1").toLowerCase()}});
/*!
- * Wunderbaum - wb_extension_base
- * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */
-class A{constructor(e,t,i){this.enabled=!0,this.tree=e,this.id=t,this.treeOpts=e.options;const s=e.options;void 0===this.treeOpts[t]?s[t]=this.extensionOpts=y({},i):(this.extensionOpts=y({},i,s[t]),s[t]=this.extensionOpts),this.enabled=this.getPluginOption("enabled",!0)}init(){this.tree.element.classList.add("wb-ext-"+this.id)}getPluginOption(e,t){var i;return null!==(i=this.extensionOpts[e])&&void 0!==i?i:t}setPluginOption(e,t){this.extensionOpts[e]=t}setEnabled(e=!0){return this.setPluginOption("enabled",!!e)}onKeyEvent(e){}onRender(e){}}
+ * Wunderbaum - types
+ * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */!function(e){e.any="any",e.data="data",e.colStructure="colStructure",e.resize="resize",e.row="row",e.structure="structure",e.status="status",e.scroll="scroll"}($||($={})),function(e){e.clearMarkup="clearMarkup",e.header="header",e.redraw="redraw",e.scroll="scroll"}(P||(P={})),function(e){e.ok="ok",e.loading="loading",e.error="error",e.noData="noData",e.paging="paging"}(R||(R={})),function(e){e.unknown="",e.checkbox="checkbox",e.column="column",e.expander="expander",e.icon="icon",e.prefix="prefix",e.title="title"}(F||(F={})),function(e){e.startRow="startRow",e.cell="cell",e.startCell="startCell",e.row="row"}(z||(z={}));
/*!
- * debounce & throttle, taken from https://github.com/lodash/lodash v4.17.21
- * MIT License: https://raw.githubusercontent.com/lodash/lodash/4.17.21-npm/LICENSE
- * Modified for TypeScript type annotations.
- */const $="object"==typeof global&&null!==global&&global.Object===Object&&global,P="object"==typeof globalThis&&null!==globalThis&&globalThis.Object==Object&&globalThis,R="object"==typeof self&&null!==self&&self.Object===Object&&self,F=P||$||R||Function("return this")();function z(e){const t=typeof e;return null!=e&&("object"===t||"function"===t)}function U(e,t=0,i={}){let s,n,r,o,l,a,d=0,c=!1,h=!1,u=!0;const p=!t&&0!==t&&"function"==typeof F.requestAnimationFrame;if("function"!=typeof e)throw new TypeError("Expected a function");function f(t){const i=s,r=n;return s=n=void 0,d=t,o=e.apply(r,i),o}function g(e,t){return p?(F.cancelAnimationFrame(l),F.requestAnimationFrame(e)):setTimeout(e,t)}function v(e){const i=e-a;return void 0===a||i>=t||i<0||h&&e-d>=r}function m(){const e=Date.now();if(v(e))return b(e);l=g(m,function(e){const i=e-d,s=t-(e-a);return h?Math.min(s,r-i):s}(e))}function b(e){return l=void 0,u&&s?f(e):(s=n=void 0,o)}function y(...e){const i=Date.now(),r=v(i);if(s=e,n=this,a=i,r){if(void 0===l)return function(e){return d=e,l=g(m,t),c?f(e):o}(a);if(h)return l=g(m,t),f(a)}return void 0===l&&(l=g(m,t)),o}return t=+t||0,z(i)&&(c=!!i.leading,h="maxWait"in i,r=h?Math.max(+i.maxWait||0,t):r,u="trailing"in i?!!i.trailing:u),y.cancel=function(){void 0!==l&&function(e){if(p)return F.cancelAnimationFrame(e);clearTimeout(e)}(l),d=0,s=a=n=l=void 0},y.flush=function(){return void 0===l?o:b(Date.now())},y.pending=function(){return void 0!==l},y}
+ * Wunderbaum - wb_extension_base
+ * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */
+class V{constructor(e,t,i){this.enabled=!0,this.tree=e,this.id=t,this.treeOpts=e.options;const s=e.options;void 0===this.treeOpts[t]?s[t]=this.extensionOpts=N({},i):(this.extensionOpts=N({},i,s[t]),s[t]=this.extensionOpts),this.enabled=this.getPluginOption("enabled",!0)}init(){this.tree.element.classList.add("wb-ext-"+this.id)}getPluginOption(e,t){var i;return null!==(i=this.extensionOpts[e])&&void 0!==i?i:t}setPluginOption(e,t){this.extensionOpts[e]=t}setEnabled(e=!0){return this.setPluginOption("enabled",!!e)}onKeyEvent(e){}onRender(e){}}
/*!
- * Wunderbaum - ext-filter
- * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */
-const q="￷",j="￸",H=new RegExp(c("￷"),"g"),V=new RegExp(c("￸"),"g");class K extends A{constructor(e){super(e,"filter",{connectInput:null,autoApply:!0,autoExpand:!1,counter:!0,fuzzy:!1,hideExpandedCounter:!0,hideExpanders:!1,highlight:!0,leavesOnly:!1,mode:"dim",noData:!0}),this.lastFilterArgs=null}init(){super.init();const e=this.getPluginOption("connectInput");e&&(this.queryInput=v(e),_(this.queryInput,"input",U((e=>{this.filterNodes(this.queryInput.value.trim(),{})}),700)))}setPluginOption(e,t){if(super.setPluginOption(e,t),"mode"===e)this.tree.filterMode="hide"===t?"hide":"dim",this.tree.updateFilter()}_applyFilterNoUpdate(e,t,i){return this.tree.runWithDeferredUpdate((()=>this._applyFilterImpl(e,t,i)))}_applyFilterImpl(e,t,i){let s,n,r=0;const o=Date.now(),l=this.tree,a=l.options,h=a.autoCollapse,u=y({},a.filter,i),p="hide"===u.mode,f=!!u.leavesOnly&&!t;if("string"==typeof e){if(""===e)return l.logInfo("Passing an empty string as a filter is handled as clearFilter()."),void this.clearFilter();s=u.fuzzy?e.split("").map(c).reduce((function(e,t){return e+"([^"+t+"]*)"+t}),""):c(e);const t=new RegExp(s,"i"),i=new RegExp(c(e),"gi");e=e=>{if(!e.title)return!1;const s=e.title,r=s.match(t);return r&&u.highlight&&(n=u.fuzzy?function(e,t,i=!0){const s=[];for(let e=1;e"+n[e]+""}));return n.join("")}
+ * Wunderbaum - ext-filter
+ * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */const q="￷",j="￸",K=new RegExp(y("￷"),"g"),H=new RegExp(y("￸"),"g");class W extends V{constructor(e){super(e,"filter",{connectInput:null,autoApply:!0,autoExpand:!1,counter:!0,fuzzy:!1,hideExpandedCounter:!0,hideExpanders:!1,highlight:!0,leavesOnly:!1,mode:"dim",noData:!0}),this.lastFilterArgs=null}init(){super.init();const e=this.getPluginOption("connectInput");e&&(this.queryInput=k(e),I(this.queryInput,"input",o((e=>{this.filterNodes(this.queryInput.value.trim(),{})}),700)))}setPluginOption(e,t){if(super.setPluginOption(e,t),"mode"===e)this.tree.filterMode="hide"===t?"hide":"dim",this.tree.updateFilter()}_applyFilterNoUpdate(e,t,i){return this.tree.runWithDeferredUpdate((()=>this._applyFilterImpl(e,t,i)))}_applyFilterImpl(e,t,i){let s,n,r=0;const o=Date.now(),l=this.tree,a=l.options,d=a.autoCollapse,c=N({},a.filter,i),h="hide"===c.mode,u=!!c.leavesOnly&&!t;if("string"==typeof e){if(""===e)return l.logInfo("Passing an empty string as a filter is handled as clearFilter()."),void this.clearFilter();s=c.fuzzy?e.split("").map(y).reduce((function(e,t){return e+"([^"+t+"]*)"+t}),""):y(e);const t=new RegExp(s,"i"),i=new RegExp(y(e),"gi");e=e=>{if(!e.title)return!1;const s=e.title,r=s.match(t);return r&&c.highlight&&(n=c.fuzzy?function(e,t,i=!0){const s=[];for(let e=1;e"+n[e]+""}));return n.join("")}
/*!
- * Wunderbaum - ext-keynav
- * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */(s,r,!0):s.replace(i,(function(e){return q+e+j})),e.titleWithHighlight=d(n).replace(H,"").replace(V," ")),!!r}}return l.filterMode=u.mode,this.lastFilterArgs=arguments,l.element.classList.toggle("wb-ext-filter-hide",!!p),l.element.classList.toggle("wb-ext-filter-dim",!p),l.element.classList.toggle("wb-ext-filter-hide-expanders",!!u.hideExpanders),l.root.subMatchCount=0,l.visit((e=>{delete e.match,delete e.titleWithHighlight,e.subMatchCount=0})),l.setStatus(T.ok),a.autoCollapse=!1,l.visit((i=>{if(f&&null!=i.children)return;let s=e(i);if("skip"===s)return i.visit((function(e){e.match=!1}),!0),"skip";let n=!1;(t||"branch"===s)&&i.parent.match&&(s=!0,n=!0),s&&(r++,i.match=!0,i.visitParents((e=>{e!==i&&(e.subMatchCount+=1),!u.autoExpand||n||e.expanded||(e.setExpanded(!0,{noAnimation:!0,noEvents:!0}),e._filterAutoExpanded=!0)}),!0))})),a.autoCollapse=h,0===r&&u.noData&&p&&l.root.setStatus(T.noData),l.logInfo(`Filter '${s}' found ${r} nodes in ${Date.now()-o} ms.`),r}filterNodes(e,t){return this._applyFilterNoUpdate(e,!1,t)}filterBranches(e,t){return this._applyFilterNoUpdate(e,!0,t)}updateFilter(){var e;const t=this.tree;t.filterMode&&this.lastFilterArgs&&(null===(e=t.options.filter)||void 0===e?void 0:e.autoApply)?this._applyFilterNoUpdate.apply(this,this.lastFilterArgs):t.logWarn("updateFilter(): no filter active.")}clearFilter(){const e=this.tree;e.enableUpdate(!1),e.setStatus(T.ok),delete e.root.match,delete e.root.subMatchCount,e.visit((e=>{delete e.match,delete e.subMatchCount,delete e.titleWithHighlight,e._filterAutoExpanded&&e.expanded&&e.setExpanded(!1,{noAnimation:!0,noEvents:!0}),delete e._filterAutoExpanded})),e.filterMode=null,this.lastFilterArgs=null,e.element.classList.remove("wb-ext-filter-dim","wb-ext-filter-hide"),e.enableUpdate(!0)}}class W extends A{constructor(e){super(e,"keynav",{})}_getEmbeddedInputElem(e){var t;let i=null;if(e&&null!=e.type)i=e;else{const e=null===(t=this.tree.getActiveColElem())||void 0===t?void 0:t.querySelector("input,select");e&&(i=e)}return i}_isCurInputFocused(){var e;return!!(null===(e=this.tree.getActiveColElem())||void 0===e?void 0:e.querySelector("input:focus,select:focus"))}onKeyEvent(e){const t=e.event,i=this.tree,s=e.options,n=!t.ctrlKey||s.autoActivate,r=this._getEmbeddedInputElem(t.target),o=r&&this._isCurInputFocused(),l=s.navigationModeOption;let a,d=b(t),c=e.node,h=!0;if(!i.isEnabled())return!1;if(!1===i._callEvent("keydown",e))return!1;if(!1===i._callMethod("edit._preprocessKeyEvent",e))return!1;if(!c){const e=i.getFocusNode()||i.getActiveNode(),t=i.getFirstChild();if(!e&&t&&"ArrowDown"===d)return t.logInfo("Keydown: activate first node."),void t.setActive();a=e||t,a&&(a.setFocus(),c=i.getFocusNode(),c.logInfo("Keydown: force focus on active node."))}const u=c.isColspan();if(i.isRowNav()){if(o){switch(d){case"Enter":r.blur(),i.setFocus();break;case"Escape":c._render(),i.setFocus()}return}if(s.quicksearch&&1===d.length&&/^\w$/.test(d)&&!r){const e=Date.now();e-i.lastQuicksearchTime>500&&(i.lastQuicksearchTerm=""),i.lastQuicksearchTime=e,i.lastQuicksearchTerm+=d;const s=i.findNextNode(i.lastQuicksearchTerm,i.getActiveNode());return s&&s.setActive(!0,{event:t}),void t.preventDefault()}switch(d){case"Enter":c.isActive()&&(c.isExpanded()?d="Subtract":c.isExpandable(!0)&&(d="Add"));break;case"ArrowLeft":c.expanded&&(d="Subtract");break;case"ArrowRight":if(!c.expanded&&c.isExpandable(!0))d="Add";else if(l===M.startCell||l===M.startRow)return t.preventDefault(),i.setCellNav(),!1}switch(d){case"+":case"Add":c.setExpanded(!0);break;case"-":case"Subtract":c.setExpanded(!1);break;case" ":c.getOption("checkbox")?c.toggleSelected():c.setActive(!0,{event:t});break;case"Enter":c.setActive(!0,{event:t});break;case"ArrowDown":case"ArrowLeft":case"ArrowRight":case"ArrowUp":case"Backspace":case"End":case"Home":case"Control+End":case"Control+Home":case"Meta+ArrowDown":case"Meta+ArrowUp":case"PageDown":case"PageUp":c.navigate(d,{activate:n,event:t});break;default:h=!1}}else{const e=this._getEmbeddedInputElem(null),s=e?e.type||e.tagName:"",r=e&&this._isCurInputFocused(),o=e&&"checkbox"!==s;if(r){if("Escape"===d)return c._render(),c.logDebug("Reset focused input"),i.setFocus(),void i.setColumn(i.activeColIdx);if("Enter"!==d)return void c.logDebug(`Ignored ${d} inside focused input`)}else if(e&&1===d.length&&o)return e.focus(),e.value="",c.logDebug(`Focus imput: ${d}`),!1;switch("Tab"===d?(d="ArrowRight",h=!0):"Shift+Tab"===d&&(d=i.activeColIdx>0?"ArrowLeft":"",h=!0),d){case"+":case"Add":c.setExpanded(!0);break;case"-":case"Subtract":c.setExpanded(!1);break;case" ":0===i.activeColIdx&&c.getOption("checkbox")?(c.toggleSelected(),h=!0):e&&"checkbox"===s&&(e.click(),h=!0);break;case"F2":e&&!r&&o&&(e.focus(),h=!0);break;case"Enter":i.setFocus(),(0===i.activeColIdx||u)&&c.isExpandable()?(c.setExpanded(!c.isExpanded()),h=!0):e&&!r&&o&&(e.focus(),h=!0);break;case"Escape":i.setFocus(),c.log("keynav: focus tree..."),i.isCellNav()&&l!==M.cell&&(c.log("keynav: setCellNav(false)"),i.setCellNav(!1),i.setFocus(),h=!0);break;case"ArrowLeft":i.setFocus(),u&&c.isExpanded()?c.setExpanded(!1):!u&&i.activeColIdx>0?i.setColumn(i.activeColIdx-1):l!==M.cell&&i.setCellNav(!1),h=!0;break;case"ArrowRight":i.setFocus(),u&&!c.isExpanded()?c.setExpanded():!u&&i.activeColIdx0&&i.setColumn(0),h=!0;break;case"End":i.setFocus(),!u&&i.activeColIdx").replace(H,"")),!!r}}return l.filterMode=c.mode,this.lastFilterArgs=arguments,l.element.classList.toggle("wb-ext-filter-hide",!!h),l.element.classList.toggle("wb-ext-filter-dim",!h),l.element.classList.toggle("wb-ext-filter-hide-expanders",!!c.hideExpanders),l.root.subMatchCount=0,l.visit((e=>{delete e.match,delete e.titleWithHighlight,e.subMatchCount=0})),l.setStatus(R.ok),a.autoCollapse=!1,l.visit((i=>{if(u&&null!=i.children)return;let s=e(i);if("skip"===s)return i.visit((function(e){e.match=!1}),!0),"skip";let n=!1;(t||"branch"===s)&&i.parent.match&&(s=!0,n=!0),s&&(r++,i.match=!0,i.visitParents((e=>{e!==i&&(e.subMatchCount+=1),!c.autoExpand||n||e.expanded||(e.setExpanded(!0,{noAnimation:!0,noEvents:!0}),e._filterAutoExpanded=!0)}),!0))})),a.autoCollapse=d,0===r&&c.noData&&h&&("string"==typeof c.noData?l.root.setStatus(R.noData,{message:c.noData}):l.root.setStatus(R.noData)),l.logInfo(`Filter '${s}' found ${r} nodes in ${Date.now()-o} ms.`),r}filterNodes(e,t){return this._applyFilterNoUpdate(e,!1,t)}filterBranches(e,t){return this._applyFilterNoUpdate(e,!0,t)}updateFilter(){var e;const t=this.tree;t.filterMode&&this.lastFilterArgs&&(null===(e=t.options.filter)||void 0===e?void 0:e.autoApply)?this._applyFilterNoUpdate.apply(this,this.lastFilterArgs):t.logWarn("updateFilter(): no filter active.")}clearFilter(){const e=this.tree;e.enableUpdate(!1),e.setStatus(R.ok),delete e.root.match,delete e.root.subMatchCount,e.visit((e=>{delete e.match,delete e.subMatchCount,delete e.titleWithHighlight,e._filterAutoExpanded&&e.expanded&&e.setExpanded(!1,{noAnimation:!0,noEvents:!0}),delete e._filterAutoExpanded})),e.filterMode=null,this.lastFilterArgs=null,e.element.classList.remove("wb-ext-filter-dim","wb-ext-filter-hide"),e.enableUpdate(!0)}}class B extends V{constructor(e){super(e,"keynav",{})}_getEmbeddedInputElem(e){var t;let i=null;if(e&&null!=e.type)i=e;else{const e=null===(t=this.tree.getActiveColElem())||void 0===t?void 0:t.querySelector("input,select");e&&(i=e)}return i}_isCurInputFocused(){var e;return!!(null===(e=this.tree.getActiveColElem())||void 0===e?void 0:e.querySelector("input:focus,select:focus"))}onKeyEvent(e){const t=e.event,i=this.tree,s=e.options,n=!t.ctrlKey||s.autoActivate,r=this._getEmbeddedInputElem(t.target),o=r&&this._isCurInputFocused(),l=s.navigationModeOption;let a,d=C(t),c=e.node,h=!0;if(!i.isEnabled())return!1;if(!1===i._callEvent("keydown",e))return!1;if(!1===i._callMethod("edit._preprocessKeyEvent",e))return!1;if(!c){const e=i.getFocusNode()||i.getActiveNode(),t=i.getFirstChild();if(!e&&t&&"ArrowDown"===d)return t.logInfo("Keydown: activate first node."),void t.setActive();a=e||t,a&&(a.setFocus(),c=i.getFocusNode(),c.logInfo("Keydown: force focus on active node."))}const u=c.isColspan();if(i.isRowNav()){if(o){switch(d){case"Enter":r.blur(),i.setFocus();break;case"Escape":c._render(),i.setFocus()}return}if(s.quicksearch&&1===d.length&&/^\w$/.test(d)&&!r){const e=Date.now();e-i.lastQuicksearchTime>500&&(i.lastQuicksearchTerm=""),i.lastQuicksearchTime=e,i.lastQuicksearchTerm+=d;const s=i.findNextNode(i.lastQuicksearchTerm,i.getActiveNode());return s&&s.setActive(!0,{event:t}),void t.preventDefault()}switch(d){case"Enter":c.isActive()&&(c.isExpanded()?d="Subtract":c.isExpandable(!0)&&(d="Add"));break;case"ArrowLeft":c.expanded&&(d="Subtract");break;case"ArrowRight":if(!c.expanded&&c.isExpandable(!0))d="Add";else if(l===z.startCell||l===z.startRow)return t.preventDefault(),i.setCellNav(),!1}switch(d){case"+":case"Add":c.setExpanded(!0);break;case"-":case"Subtract":c.setExpanded(!1);break;case" ":c.getOption("checkbox")?c.toggleSelected():c.setActive(!0,{event:t});break;case"Enter":c.setActive(!0,{event:t});break;case"ArrowDown":case"ArrowLeft":case"ArrowRight":case"ArrowUp":case"Backspace":case"End":case"Home":case"Control+End":case"Control+Home":case"Meta+ArrowDown":case"Meta+ArrowUp":case"PageDown":case"PageUp":c.navigate(d,{activate:n,event:t});break;default:h=!1}}else{const e=r?r.type||r.tagName:"",s=r&&"checkbox"!==e;if(o){if("Escape"===d)return c.logDebug("Reset focused input on Escape"),r.setCustomValidity(""),c._render(),i.setFocus(),void i.setColumn(i.activeColIdx);if("Enter"!==d)return r&&r.checkValidity&&!r.checkValidity()?(c.logDebug(`Ignored ${d} inside invalid input`),!1):void c.logDebug(`Ignored ${d} inside focused input`)}else if(r&&1===d.length&&s)return r.focus(),r.value="",c.logDebug(`Focus input: ${d}`),!1;switch("Tab"===d?(d="ArrowRight",h=!0):"Shift+Tab"===d&&(d=i.activeColIdx>0?"ArrowLeft":"",h=!0),d){case"+":case"Add":c.setExpanded(!0);break;case"-":case"Subtract":c.setExpanded(!1);break;case" ":0===i.activeColIdx&&c.getOption("checkbox")?(c.toggleSelected(),h=!0):r&&"checkbox"===e&&(r.click(),h=!0);break;case"F2":r&&!o&&s&&(r.focus(),h=!0);break;case"Enter":i.setFocus(),(0===i.activeColIdx||u)&&c.isExpandable()?(c.setExpanded(!c.isExpanded()),h=!0):r&&!o&&s&&(r.focus(),h=!0);break;case"Escape":i.setFocus(),c.log("keynav: focus tree..."),i.isCellNav()&&l!==z.cell&&(c.log("keynav: setCellNav(false)"),i.setCellNav(!1),i.setFocus(),h=!0);break;case"ArrowLeft":i.setFocus(),u&&c.isExpanded()?c.setExpanded(!1):!u&&i.activeColIdx>0?i.setColumn(i.activeColIdx-1):l!==z.cell&&i.setCellNav(!1),h=!0;break;case"ArrowRight":i.setFocus(),u&&!c.isExpanded()?c.setExpanded():!u&&i.activeColIdx0&&i.setColumn(0),h=!0;break;case"End":i.setFocus(),!u&&i.activeColIdx=4){const t=this.ignoreEvents,i=this.prefix;k(e,"callEvent",(function(s,n){if(t.has(s))return e._superApply(arguments);const r=Date.now(),o=e._superApply(arguments);return e.logDebug(`${i}: callEvent('${s}') took ${Date.now()-r} ms.`,arguments[1]),o}))}}onKeyEvent(e){this.tree.logDebug(`${this.prefix}: onKeyEvent()`,e)}}
+ * Wunderbaum - ext-logger
+ * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */class G extends V{constructor(e){super(e,"logger",{}),this.ignoreEvents=new Set(["iconBadge","render","discard"]),this.prefix=e+".ext-logger"}init(){const e=this.tree;if(e.getOption("debugLevel")>=4){const t=this.ignoreEvents,i=this.prefix;L(e,"callEvent",(function(s,n){if(t.has(s))return e._superApply(arguments);const r=Date.now(),o=e._superApply(arguments);return e.logDebug(`${i}: callEvent('${s}') took ${Date.now()-r} ms.`,arguments[1]),o}))}}onKeyEvent(e){this.tree.logDebug(`${this.prefix}: onKeyEvent()`,e)}}
/*!
- * Wunderbaum - common
- * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */const G=22,Q=new RegExp(/\.|\//),Y={bootstrap:{error:"bi bi-exclamation-triangle",loading:"bi bi-chevron-right wb-busy",noData:"bi bi-question-circle",expanderExpanded:"bi bi-chevron-down",expanderCollapsed:"bi bi-chevron-right",expanderLazy:"bi bi-chevron-right wb-helper-lazy-expander",checkChecked:"bi bi-check-square",checkUnchecked:"bi bi-square",checkUnknown:"bi bi-dash-square-dotted",radioChecked:"bi bi-circle-fill",radioUnchecked:"bi bi-circle",radioUnknown:"bi bi-record-circle",folder:"bi bi-folder2",folderOpen:"bi bi-folder2-open",folderLazy:"bi bi-folder-symlink",doc:"bi bi-file-earmark"},fontawesome6:{error:"fa-solid fa-triangle-exclamation",loading:"fa-solid fa-chevron-right fa-beat",noData:"fa-solid fa-circle-question",expanderExpanded:"fa-solid fa-chevron-down",expanderCollapsed:"fa-solid fa-chevron-right",expanderLazy:"fa-solid fa-chevron-right wb-helper-lazy-expander",checkChecked:"fa-regular fa-square-check",checkUnchecked:"fa-regular fa-square",checkUnknown:"fa-regular fa-square-minus",radioChecked:"fa-solid fa-circle",radioUnchecked:"fa-regular fa-circle",radioUnknown:"fa-regular fa-circle-question",folder:"fa-solid fa-folder-closed",folderOpen:"fa-regular fa-folder-open",folderLazy:"fa-solid fa-folder-plus",doc:"fa-regular fa-file"}},J=new Set(["_format","_keyMap","_positional","_typeList","_valueMap","_version","children","columns","types"]),X={" ":"toggleSelect","+":"expand",Add:"expand",ArrowDown:"down",ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",Backspace:"parent","/":"collapseAll",Divide:"collapseAll",End:"lastCol",Home:"firstCol","Control+End":"last","Control+Home":"first","Meta+ArrowDown":"last","Meta+ArrowUp":"first","*":"expandAll",Multiply:"expandAll",PageDown:"pageDown",PageUp:"pageUp","-":"collapse",Subtract:"collapse"};function Z(e){return e instanceof RegExp?function(t){return e.test(t.title)}:(o("string"==typeof e,`Expected a string or RegExp: ${e}`),function(t){return t.title===e})}function ee(e,t){const i=e.title.toLowerCase(),s=t.title.toLowerCase();return i===s?0:i>s?1:-1}function te(e){let{_format:t,_version:i=1,_keyMap:s,_valueMap:n}=e;o(1===i,`Expected file version 1 instead of ${i}`);let r=s,l={};if(r)for(const[e,t]of Object.entries(r))l[t]=e;if(r&&r.t){const e="source._keyMap maps from long to short since v0.7.0. Flip key/value!";console.warn(e),[r,l]=[l,r]}if(null!=e._typeList){const t='source._typeList is deprecated since v0.7.0: use source._valueMap: {"type": [...]} instead.';if(null!=n)throw new Error(t);console.warn(t),n={type:e._typeList},delete e._typeList}"flat"===t&&function(e){var t,i,s;const{_format:n,_keyMap:r={},_positional:o=[],children:l}=e;if("flat"!==n)throw new Error(`Expected source._format: "flat", but got ${n}`);if(o&&o.includes("children"))throw new Error(`source._positional must not include "children": ${o}`);let a=r;if(r.t){const e="source._keyMap maps from long to short since v0.7.0. Flip key/value!";console.warn(e),a={};for(const[e,t]of Object.entries(r))a[t]=e}const d=o.map((e=>a[e])),c=[],h={},u={},p=null!==(t=a.key)&&void 0!==t?t:"key",f=null!==(i=a.children)&&void 0!==i?i:"children";for(const[e,t]of l.entries()){const[i,n,r={}]=t;t[1]=null,null!=t[2]&&(t[2]=null),n.forEach(((e,t)=>{r[d[t]]=e})),u[e]=r;const o=r[p];null!=o&&(h[o]=r);let l=null;if(null===i);else if("number"==typeof i){if(l=u[i],void 0===l)throw new Error(`unflattenSource: Could not find parent node by index: ${i}.`)}else if(l=h[i],void 0===l)throw new Error(`unflattenSource: Could not find parent node by key: ${i}`);l?(null!==(s=l[f])&&void 0!==s||(l[f]=[]),l[f].push(r)):c.push(r)}e.children=c}(e),delete e._format,delete e._version,delete e._keyMap,delete e._valueMap,delete e._positional,(s||n)&&function e(t){for(const i of t)Object.getOwnPropertyNames(i).forEach((e=>{const t=i[e];let r=e;if(s&&null!=l[e]&&(r=l[e],r!==e&&(i[r]=t,delete i[e])),n&&"number"==typeof t&&null!=n[r]){const e=n[r][t];if(null==e)throw new Error(`Expected valueMap[${r}][${t}] entry in [${n[r]}]`);i[r]=e}})),i.children&&e(i.children)}(e.children)}
+ * Wunderbaum - common
+ * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */const Q=22,Y=new RegExp(/\.|\//),J={bootstrap:{error:"bi bi-exclamation-triangle",loading:"bi bi-chevron-right wb-busy",noData:"bi bi-question-circle",expanderExpanded:"bi bi-chevron-down",expanderCollapsed:"bi bi-chevron-right",expanderLazy:"bi bi-chevron-right wb-helper-lazy-expander",checkChecked:"bi bi-check-square",checkUnchecked:"bi bi-square",checkUnknown:"bi bi-dash-square-dotted",radioChecked:"bi bi-circle-fill",radioUnchecked:"bi bi-circle",radioUnknown:"bi bi-record-circle",folder:"bi bi-folder2",folderOpen:"bi bi-folder2-open",folderLazy:"bi bi-folder-symlink",doc:"bi bi-file-earmark"},fontawesome6:{error:"fa-solid fa-triangle-exclamation",loading:"fa-solid fa-chevron-right fa-beat",noData:"fa-solid fa-circle-question",expanderExpanded:"fa-solid fa-chevron-down",expanderCollapsed:"fa-solid fa-chevron-right",expanderLazy:"fa-solid fa-chevron-right wb-helper-lazy-expander",checkChecked:"fa-regular fa-square-check",checkUnchecked:"fa-regular fa-square",checkUnknown:"fa-regular fa-square-minus",radioChecked:"fa-solid fa-circle",radioUnchecked:"fa-regular fa-circle",radioUnknown:"fa-regular fa-circle-question",folder:"fa-solid fa-folder-closed",folderOpen:"fa-regular fa-folder-open",folderLazy:"fa-solid fa-folder-plus",doc:"fa-regular fa-file"}},X=new Set(["_format","_keyMap","_positional","_typeList","_valueMap","_version","children","columns","types"]),Z={" ":"toggleSelect","+":"expand",Add:"expand",ArrowDown:"down",ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",Backspace:"parent","/":"collapseAll",Divide:"collapseAll",End:"lastCol",Home:"firstCol","Control+End":"last","Control+Home":"first","Meta+ArrowDown":"last","Meta+ArrowUp":"first","*":"expandAll",Multiply:"expandAll",PageDown:"pageDown",PageUp:"pageUp","-":"collapse",Subtract:"collapse"};function ee(e){return e instanceof RegExp?function(t){return e.test(t.title)}:(f("string"==typeof e,`Expected a string or RegExp: ${e}`),function(t){return t.title===e})}function te(e,t){const i=e.title.toLowerCase(),s=t.title.toLowerCase();return i===s?0:i>s?1:-1}function ie(e){let{_format:t,_version:i=1,_keyMap:s,_valueMap:n}=e;f(1===i,`Expected file version 1 instead of ${i}`);let r=s,o={};if(r)for(const[e,t]of Object.entries(r))o[t]=e;if(r&&r.t){const e="source._keyMap maps from long to short since v0.7.0. Flip key/value!";console.warn(e),[r,o]=[o,r]}if(null!=e._typeList){const t='source._typeList is deprecated since v0.7.0: use source._valueMap: {"type": [...]} instead.';if(null!=n)throw new Error(t);console.warn(t),n={type:e._typeList},delete e._typeList}"flat"===t&&function(e){var t,i,s;const{_format:n,_keyMap:r={},_positional:o=[],children:l}=e;if("flat"!==n)throw new Error(`Expected source._format: "flat", but got ${n}`);if(o&&o.includes("children"))throw new Error(`source._positional must not include "children": ${o}`);let a=r;if(r.t){const e="source._keyMap maps from long to short since v0.7.0. Flip key/value!";console.warn(e),a={};for(const[e,t]of Object.entries(r))a[t]=e}const d=o.map((e=>a[e])),c=[],h={},u={},p=null!==(t=a.key)&&void 0!==t?t:"key",f=null!==(i=a.children)&&void 0!==i?i:"children";for(const[e,t]of l.entries()){const[i,n,r={}]=t;t[1]=null,null!=t[2]&&(t[2]=null),n.forEach(((e,t)=>{r[d[t]]=e})),u[e]=r;const o=r[p];null!=o&&(h[o]=r);let l=null;if(null===i);else if("number"==typeof i){if(l=u[i],void 0===l)throw new Error(`unflattenSource: Could not find parent node by index: ${i}.`)}else if(l=h[i],void 0===l)throw new Error(`unflattenSource: Could not find parent node by key: ${i}`);l?(null!==(s=l[f])&&void 0!==s||(l[f]=[]),l[f].push(r)):c.push(r)}e.children=c}(e),delete e._format,delete e._version,delete e._keyMap,delete e._valueMap,delete e._positional,(s||n)&&function e(t){for(const i of t)Object.getOwnPropertyNames(i).forEach((e=>{const t=i[e];let r=e;if(s&&null!=o[e]&&(r=o[e],r!==e&&(i[r]=t,delete i[e])),n&&"number"==typeof t&&null!=n[r]){const e=n[r][t];if(null==e)throw new Error(`Expected valueMap[${r}][${t}] entry in [${n[r]}]`);i[r]=e}})),i.children&&e(i.children)}(e.children)}
/*!
- * Wunderbaum - ext-dnd
- * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */const ie="application/x-wunderbaum-node";class se extends A{constructor(e){super(e,"dnd",{autoExpandMS:1500,multiSource:!1,effectAllowed:"all",dropEffectDefault:"move",guessDropEffect:!0,preventForeignNodes:!1,preventLazyParents:!0,preventNonNodes:!1,preventRecursion:!0,preventSameParent:!1,preventVoidMoves:!0,serializeClipboardData:!0,scroll:!0,scrollSensitivity:20,scrollSpeed:5,sourceCopyHook:null,dragStart:null,drag:null,dragEnd:null,dragEnter:null,dragOver:null,dragExpand:null,drop:null,dragLeave:null}),this.srcNode=null,this.lastTargetNode=null,this.lastEnterStamp=0,this.lastAllowedDropRegions=null,this.lastDropEffect=null,this.lastDropRegion=!1,this.currentScrollDir=0,this.applyScrollDirThrottled=function(e,t=0,i={}){let s=!0,n=!0;if("function"!=typeof e)throw new TypeError("Expected a function");return z(i)&&(s="leading"in i?!!i.leading:s,n="trailing"in i?!!i.trailing:n),U(e,t,{leading:s,trailing:n,maxWait:t})}(this._applyScrollDir,50)}init(){super.init();const e=this.tree,t=e.options.dnd;t.dragStart&&_(e.element,"dragstart drag dragend",this.onDragEvent.bind(this)),t.dragEnter&&_(e.element,"dragenter dragover dragleave drop",this.onDropEvent.bind(this))}_leaveNode(){const e=this.lastTargetNode;this.lastEnterStamp=0,e&&(e.setClass("wb-drop-target wb-drop-over wb-drop-after wb-drop-before",!1),this.lastTargetNode=null)}unifyDragover(e){if(!1===e)return!1;if(e instanceof Set)return e.size>0&&e;if(!0===e)return new Set(["over","before","after"]);if("string"==typeof e||w(e))return(e=N(e)).size>0&&e;throw new Error("Unsupported drop region definition: "+e)}_calcDropRegion(e,t){const i=e.offsetY;return!!t&&(3===t.size?i<5.5?"before":i>16.5?"after":"over":1===t.size&&t.has("over")?"over":i>11?"after":"before")}_guessDropEffect(e){var t;const s=this.treeOpts.dnd,n=null!==(t=s.effectAllowed)&&void 0!==t?t:"all",r=["all","copy","copyLink","copyMove"].includes(n),o=["all","link","copyLink","linkMove"].includes(n),l=["all","move","copyMove","linkMove"].includes(n);let a=s.dropEffectDefault;return s.guessDropEffect&&(i?(e.altKey&&r&&(a="copy"),e.metaKey&&l&&(a="move"),e.altKey&&e.metaKey&&o&&(a="link")):(e.ctrlKey&&r&&(a="copy"),e.shiftKey&&l&&(a="move"),e.altKey&&o&&(a="link"))),a}_isVoidDrop(e,t,i){return!(!this.treeOpts.dnd.preventVoidMoves||!t)&&("before"===i&&e===t.getNextSibling()||"after"===i&&e===t.getPrevSibling()||(t===e||t.parent===e))}_applyScrollDir(){if(this.isDragging()&&this.currentScrollDir){const e=this.tree.options.dnd,t=this.tree.element,i=t.scrollTop;this.currentScrollDir<0?t.scrollTop=Math.max(0,i-e.scrollSpeed):this.currentScrollDir>0&&(t.scrollTop=i+e.scrollSpeed)}}_autoScroll(e){const t=this.tree,i=t.options.dnd.scrollSensitivity,s=t.element,n=t.headerElement.clientHeight,r=s.offsetHeight,o=s.scrollTop;return this.currentScrollDir=0,o>0&&e>0&&e<=i+n?this.currentScrollDir=-1:o=r-i&&(this.currentScrollDir=1),this.currentScrollDir&&this.applyScrollDirThrottled(),s.scrollTop-o}isDragging(){return!!this.srcNode}onDragEvent(e){var t;const i=this.treeOpts.dnd,s=ue.getNode(e);if(s){if(["dragstart","dragend"].includes(e.type)&&this.tree.logDebug(`onDragEvent.${e.type} srcNode: ${s}`,e),"dragstart"===e.type){if(e.dataTransfer.effectAllowed=i.effectAllowed,s.isEditing())return s.logDebug("Prevented dragging node in edit mode."),e.preventDefault(),!1;if(!s._callEvent("dnd.dragStart",{event:e}))return e.preventDefault(),!1;const n=s.toDict(!0,(e=>{e._orgKey=e.key,delete e.key}));n._treeId=s.tree.id,i.serializeClipboardData&&("function"==typeof i.serializeClipboardData?e.dataTransfer.setData(ie,i.serializeClipboardData(n,s)):e.dataTransfer.setData(ie,JSON.stringify(n))),(null===(t=e.dataTransfer)||void 0===t?void 0:t.types.includes("text/plain"))||e.dataTransfer.setData("text/plain",s.title),this.srcNode=s,setTimeout((()=>{s.setClass("wb-drag-source")}),0)}else"drag"===e.type?i.drag&&s._callEvent("dnd.drag",{event:e}):"dragend"===e.type&&(s.setClass("wb-drag-source",!1),this.srcNode=null,this.lastTargetNode&&this._leaveNode(),s._callEvent("dnd.dragEnd",{event:e}));return!0}this.tree.logWarn(`onDragEvent.${e.type} no node`)}onDropEvent(e){var t;const i=this.srcNode,s=i?i.tree:null,n=ue.getNode(e),r=this.treeOpts.dnd,o=e.dataTransfer,l=this._calcDropRegion(e,this.lastAllowedDropRegions);if(n){if(["drop"].includes(e.type)&&this.tree.logDebug(`onDropEvent.${e.type} targetNode: ${n}, ea: ${null==o?void 0:o.effectAllowed}, de: ${null==o?void 0:o.dropEffect}, cy: ${e.offsetY}, r: ${l}, srcNode: ${i}`,e),"dragenter"===e.type){if(this.lastAllowedDropRegions=null,this.lastTargetNode&&this.lastTargetNode!==n&&this._leaveNode(),this.lastTargetNode=n,this.lastEnterStamp=Date.now(),n.isStatusNode()||r.preventForeignNodes&&n.tree!==s||r.preventLazyParents&&!n.isLoaded()||r.preventNonNodes&&!i||r.preventRecursion&&(null==i?void 0:i.isAncestorOf(n))||r.preventSameParent&&i&&n.parent===i.parent||r.preventVoidMoves&&n===i)return o.dropEffect="none",this.tree.log("Prevented drop operation"),!0;o.dropEffect=this._guessDropEffect(e)||"none";let t=n._callEvent("dnd.dragEnter",{event:e});return t=this.unifyDragover(t),t?(this.lastAllowedDropRegions=t,this.lastDropEffect=o.dropEffect,n.setClass("wb-drop-target"),e.preventDefault(),!1):(o.dropEffect="none",!0)}if("dragover"===e.type){const t=e.clientY-this.tree.element.offsetTop;this._autoScroll(t),o.dropEffect=this._guessDropEffect(e)||"none",n._callEvent("dnd.dragOver",{event:e});const s=this._calcDropRegion(e,this.lastAllowedDropRegions);if(this.lastDropRegion=s,this.lastDropEffect=o.dropEffect,r.autoExpandMS>0&&n.isExpandable(!0)&&!n._isLoading&&Date.now()-this.lastEnterStamp>r.autoExpandMS&&!1!==n._callEvent("dnd.dragExpand",{event:e})&&n.setExpanded(),!s||this._isVoidDrop(n,i,s))return;return n.setClass("wb-drop-over","over"===s),n.setClass("wb-drop-before","before"===s),n.setClass("wb-drop-after","after"===s),e.preventDefault(),!1}if("dragleave"===e.type)n._callEvent("dnd.dragLeave",{event:e});else if("drop"===e.type){e.stopPropagation(),e.preventDefault(),this._leaveNode();const i=this.lastDropRegion;let s=null===(t=e.dataTransfer)||void 0===t?void 0:t.getData(ie);s=s?JSON.parse(s):null;const r=this.srcNode,o=this.lastDropEffect;setTimeout((()=>{n._callEvent("dnd.drop",{event:e,region:i,suggestedDropMode:"over"===i?"appendChild":i,suggestedDropEffect:o,sourceNode:r,sourceNodeData:s})}),10)}return!1}this._leaveNode()}}
+ * Wunderbaum - ext-dnd
+ * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */const se="application/x-wunderbaum-node";class ne extends V{constructor(e){super(e,"dnd",{autoExpandMS:1500,multiSource:!1,effectAllowed:"all",dropEffectDefault:"move",guessDropEffect:!0,preventForeignNodes:!1,preventLazyParents:!0,preventNonNodes:!1,preventRecursion:!0,preventSameParent:!1,preventVoidMoves:!0,serializeClipboardData:!0,scroll:!0,scrollSensitivity:20,scrollSpeed:5,sourceCopyHook:null,dragStart:null,drag:null,dragEnd:null,dragEnter:null,dragOver:null,dragExpand:null,drop:null,dragLeave:null}),this.srcNode=null,this.lastTargetNode=null,this.lastEnterStamp=0,this.lastAllowedDropRegions=null,this.lastDropEffect=null,this.lastDropRegion=!1,this.currentScrollDir=0,this.applyScrollDirThrottled=l(this._applyScrollDir,50)}init(){super.init();const e=this.tree,t=e.options.dnd;t.dragStart&&I(e.element,"dragstart drag dragend",this.onDragEvent.bind(this)),t.dragEnter&&I(e.element,"dragenter dragover dragleave drop",this.onDropEvent.bind(this))}_leaveNode(){const e=this.lastTargetNode;this.lastEnterStamp=0,e&&(e.setClass("wb-drop-target wb-drop-over wb-drop-after wb-drop-before",!1),this.lastTargetNode=null)}unifyDragover(e){if(!1===e)return!1;if(e instanceof Set)return e.size>0&&e;if(!0===e)return new Set(["over","before","after"]);if("string"==typeof e||S(e))return(e=O(e)).size>0&&e;throw new Error("Unsupported drop region definition: "+e)}_calcDropRegion(e,t){const i=e.offsetY;return!!t&&(3===t.size?i<5.5?"before":i>16.5?"after":"over":1===t.size&&t.has("over")?"over":i>11?"after":"before")}_guessDropEffect(e){var t;const i=this.treeOpts.dnd,s=null!==(t=i.effectAllowed)&&void 0!==t?t:"all",n=["all","copy","copyLink","copyMove"].includes(s),r=["all","link","copyLink","linkMove"].includes(s),o=["all","move","copyMove","linkMove"].includes(s);let l=i.dropEffectDefault;return i.guessDropEffect&&(d?(e.altKey&&n&&(l="copy"),e.metaKey&&o&&(l="move"),e.altKey&&e.metaKey&&r&&(l="link")):(e.ctrlKey&&n&&(l="copy"),e.shiftKey&&o&&(l="move"),e.altKey&&r&&(l="link"))),l}_isVoidDrop(e,t,i){return!(!this.treeOpts.dnd.preventVoidMoves||!t)&&("before"===i&&e===t.getNextSibling()||"after"===i&&e===t.getPrevSibling()||(t===e||t.parent===e))}_applyScrollDir(){if(this.isDragging()&&this.currentScrollDir){const e=this.tree.options.dnd,t=this.tree.element,i=t.scrollTop;this.currentScrollDir<0?t.scrollTop=Math.max(0,i-e.scrollSpeed):this.currentScrollDir>0&&(t.scrollTop=i+e.scrollSpeed)}}_autoScroll(e){const t=this.tree,i=t.options.dnd.scrollSensitivity,s=t.element,n=t.headerElement.clientHeight,r=s.offsetHeight,o=s.scrollTop;return this.currentScrollDir=0,o>0&&e>0&&e<=i+n?this.currentScrollDir=-1:o=r-i&&(this.currentScrollDir=1),this.currentScrollDir&&this.applyScrollDirThrottled(),s.scrollTop-o}isDragging(){return!!this.srcNode}onDragEvent(e){var t;const i=this.treeOpts.dnd,s=pe.getNode(e);if(s){if(["dragstart","dragend"].includes(e.type)&&this.tree.logDebug(`onDragEvent.${e.type} srcNode: ${s}`,e),"dragstart"===e.type){if(e.dataTransfer.effectAllowed=i.effectAllowed,s.isEditingTitle())return s.logDebug("Prevented dragging node in edit mode."),e.preventDefault(),!1;if(!s._callEvent("dnd.dragStart",{event:e}))return e.preventDefault(),!1;const n=s.toDict(!0,(e=>{e._orgKey=e.key,delete e.key}));n._treeId=s.tree.id,i.serializeClipboardData&&("function"==typeof i.serializeClipboardData?e.dataTransfer.setData(se,i.serializeClipboardData(n,s)):e.dataTransfer.setData(se,JSON.stringify(n))),(null===(t=e.dataTransfer)||void 0===t?void 0:t.types.includes("text/plain"))||e.dataTransfer.setData("text/plain",s.title),this.srcNode=s,setTimeout((()=>{s.setClass("wb-drag-source")}),0)}else"drag"===e.type?i.drag&&s._callEvent("dnd.drag",{event:e}):"dragend"===e.type&&(s.setClass("wb-drag-source",!1),this.srcNode=null,this.lastTargetNode&&this._leaveNode(),s._callEvent("dnd.dragEnd",{event:e}));return!0}this.tree.logWarn(`onDragEvent.${e.type} no node`)}onDropEvent(e){var t;const i=this.srcNode,s=i?i.tree:null,n=pe.getNode(e),r=this.treeOpts.dnd,o=e.dataTransfer,l=this._calcDropRegion(e,this.lastAllowedDropRegions);if(n){if(["drop"].includes(e.type)&&this.tree.logDebug(`onDropEvent.${e.type} targetNode: ${n}, ea: ${null==o?void 0:o.effectAllowed}, de: ${null==o?void 0:o.dropEffect}, cy: ${e.offsetY}, r: ${l}, srcNode: ${i}`,e),"dragenter"===e.type){if(this.lastAllowedDropRegions=null,this.lastTargetNode&&this.lastTargetNode!==n&&this._leaveNode(),this.lastTargetNode=n,this.lastEnterStamp=Date.now(),n.isStatusNode()||r.preventForeignNodes&&n.tree!==s||r.preventLazyParents&&!n.isLoaded()||r.preventNonNodes&&!i||r.preventRecursion&&(null==i?void 0:i.isAncestorOf(n))||r.preventSameParent&&i&&n.parent===i.parent||r.preventVoidMoves&&n===i)return o.dropEffect="none",this.tree.log("Prevented drop operation"),!0;o.dropEffect=this._guessDropEffect(e)||"none";let t=n._callEvent("dnd.dragEnter",{event:e});return t=this.unifyDragover(t),t?(this.lastAllowedDropRegions=t,this.lastDropEffect=o.dropEffect,n.setClass("wb-drop-target"),e.preventDefault(),!1):(o.dropEffect="none",!0)}if("dragover"===e.type){const t=e.clientY-this.tree.element.offsetTop;this._autoScroll(t),o.dropEffect=this._guessDropEffect(e)||"none",n._callEvent("dnd.dragOver",{event:e});const s=this._calcDropRegion(e,this.lastAllowedDropRegions);if(this.lastDropRegion=s,this.lastDropEffect=o.dropEffect,r.autoExpandMS>0&&n.isExpandable(!0)&&!n._isLoading&&Date.now()-this.lastEnterStamp>r.autoExpandMS&&!1!==n._callEvent("dnd.dragExpand",{event:e})&&n.setExpanded(),!s||this._isVoidDrop(n,i,s))return;return n.setClass("wb-drop-over","over"===s),n.setClass("wb-drop-before","before"===s),n.setClass("wb-drop-after","after"===s),e.preventDefault(),!1}if("dragleave"===e.type)n._callEvent("dnd.dragLeave",{event:e});else if("drop"===e.type){e.stopPropagation(),e.preventDefault(),this._leaveNode();const i=this.lastDropRegion;let s=null===(t=e.dataTransfer)||void 0===t?void 0:t.getData(se);s=s?JSON.parse(s):null;const r=this.srcNode,o=this.lastDropEffect;setTimeout((()=>{n._callEvent("dnd.drop",{event:e,region:i,suggestedDropMode:"over"===i?"appendChild":i,suggestedDropEffect:o,sourceNode:r,sourceNodeData:s})}),10)}return!1}this._leaveNode()}}
/*!
- * Wunderbaum - drag_observer
- * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */class ne{constructor(e){if(this.start={x:0,y:0,altKey:!1,ctrlKey:!1,metaKey:!1,shiftKey:!1},this.dragElem=null,this.dragging=!1,this.events=["mousedown","mouseup","mousemove","keydown"],!e.root)throw new Error("Missing `root` option.");this.opts=Object.assign({thresh:5},e),this.root=e.root,this._handler=this.handleEvent.bind(this),this.events.forEach((e=>{this.root.addEventListener(e,this._handler)}))}disconnect(){this.events.forEach((e=>{this.root.removeEventListener(e,this._handler)}))}getDragElem(){return this.dragElem}isDragging(){return this.dragging}stopDrag(e){this.dragging&&this.opts.dragstop&&e&&(e.type="dragstop",this.opts.dragstop(e)),this.dragElem=null,this.dragging=!1}handleEvent(e){const t=e.type,i=this.opts,s={type:e.type,event:e,dragElem:this.dragElem,dx:e.pageX-this.start.x,dy:e.pageY-this.start.y,apply:void 0};switch(t){case"keydown":this.stopDrag(s);break;case"mousedown":if(this.dragElem){this.stopDrag(s);break}if(i.selector){let t=e.target;if(t.matches(i.selector))this.dragElem=t;else{if(t=t.closest(i.selector),!t)break;this.dragElem=t}}this.start.x=e.pageX,this.start.y=e.pageY,this.start.altKey=e.altKey,this.start.ctrlKey=e.ctrlKey,this.start.metaKey=e.metaKey,this.start.shiftKey=e.shiftKey;break;case"mousemove":if(!this.dragElem)break;if(!this.dragging){if(i.thresh){if(s.dx*s.dx+s.dy*s.dy{this.root.addEventListener(e,this._handler)}))}disconnect(){this.events.forEach((e=>{this.root.removeEventListener(e,this._handler)}))}getDragElem(){return this.dragElem}isDragging(){return this.dragging}stopDrag(e){this.dragging&&this.opts.dragstop&&e&&(e.type="dragstop",this.opts.dragstop(e)),this.dragElem=null,this.dragging=!1}handleEvent(e){const t=e.type,i=this.opts,s={type:e.type,event:e,dragElem:this.dragElem,dx:e.pageX-this.start.x,dy:e.pageY-this.start.y,apply:void 0};switch(t){case"keydown":this.stopDrag(s);break;case"mousedown":if(this.dragElem){this.stopDrag(s);break}if(i.selector){let t=e.target;if(t.matches(i.selector))this.dragElem=t;else{if(t=t.closest(i.selector),!t)break;this.dragElem=t}}this.start.x=e.pageX,this.start.y=e.pageY,this.start.altKey=e.altKey,this.start.ctrlKey=e.ctrlKey,this.start.metaKey=e.metaKey,this.start.shiftKey=e.shiftKey;break;case"mousemove":if(!this.dragElem)break;if(!this.dragging){if(i.thresh){if(s.dx*s.dx+s.dy*s.dythis.tree.element.contains(e.dragElem),drag:e=>this.handleDrag(e),dragstop:e=>this.handleDrag(e)})}init(){super.init()}handleDrag(e){const t=ue.getEventInfo(e.event);this.tree.log(`${e.type}(${e.dx})`,e,t)}}
+ * Wunderbaum - ext-grid
+ * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */class oe extends V{constructor(e){super(e,"grid",{}),this.observer=new re({root:window.document,selector:"span.wb-col-resizer",thresh:4,dragstart:e=>this.tree.element.contains(e.dragElem),drag:e=>this.handleDrag(e),dragstop:e=>this.handleDrag(e)})}init(){super.init()}handleDrag(e){const t=pe.getEventInfo(e.event);this.tree.log(`${e.type}(${e.dx})`,e,t)}}
/*!
- * Wunderbaum - deferred
- * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */class oe{constructor(){this._promise=new Promise(((e,t)=>{this._resolve=e,this._reject=t}))}resolve(e){this._resolve(e)}reject(e){this._reject(e)}promise(){return this._promise}then(e){return this._promise.then(e)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}}
+ * Wunderbaum - deferred
+ * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */class le{constructor(){this._promise=new Promise(((e,t)=>{this._resolve=e,this._reject=t}))}resolve(e){this._resolve(e)}reject(e){this._reject(e)}promise(){return this._promise}then(e){return this._promise.then(e)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}}
/*!
- * Wunderbaum - wunderbaum_node
- * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
- * v0.7.0, Sat, 09 Dec 2023 13:47:27 GMT (https://github.com/mar10/wunderbaum)
- */const le=new Set(["checkbox","classes","expanded","icon","iconTooltip","key","lazy","_partsel","radiogroup","refKey","selected","statusNodeType","title","tooltip","type","unselectable"]),ae=new Set(le);ae.delete("_partsel"),ae.delete("unselectable");class de{constructor(e,t,i){var s,n;this.refKey=void 0,this.children=null,this.classes=null,this.data={},this._isLoading=!1,this._requestId=0,this._errorInfo=null,this._partsel=!1,this._partload=!1,this.subMatchCount=0,this._rowIdx=0,this._rowElem=void 0,o(!t||t.tree===e,`Invalid parent: ${t}`),o(!i.children,"'children' not allowed here"),this.tree=e,this.parent=t,this.key=""+(null!==(s=i.key)&&void 0!==s?s:++de.sequence),this.title=""+(null!==(n=i.title)&&void 0!==n?n:"<"+this.key+">"),null!=i.refKey&&(this.refKey=""+i.refKey),null!=i.type&&(this.type=""+i.type),this.expanded=!0===i.expanded,null!=i.icon&&(this.icon=i.icon),this.lazy=!0===i.lazy,null!=i.statusNodeType&&(this.statusNodeType=""+i.statusNodeType),null!=i.colspan&&(this.colspan=!!i.colspan),null!=i.checkbox&&(this.checkbox=!!i.checkbox),null!=i.radiogroup&&(this.radiogroup=!!i.radiogroup),this.selected=!0===i.selected,!0===i.unselectable&&(this.unselectable=!0),i.classes&&this.setClass(i.classes);for(const[e,t]of Object.entries(i))le.has(e)||(this.data[e]=t);t&&!this.statusNodeType&&e._registerNode(this)}toString(){return`WunderbaumNode@${this.key}<'${this.title}'>`}*[Symbol.iterator](){const e=this.children;if(e)for(let t=0,i=e.length;t=0,`options.before must be a direct child of ${this}`),this.children.splice(e,0,...l)}else this.children=l;i.update(D.structure)}finally{i.enableUpdate(!0)}return l[0]}addNode(e,t="appendChild"){switch("over"===t&&(t="appendChild"),t){case"after":return this.parent.addChildren(e,{before:this.getNextSibling()});case"before":return this.parent.addChildren(e,{before:this});case"prependChild":return this.addChildren(e,{before:0});case"appendChild":return this.addChildren(e)}o(!1,`Invalid mode: ${t}`)}applyCommand(e,t){return this.tree.applyCommand(e,this,t)}collapseSiblings(e){for(const t of this.parent.children)t!==this&&t.expanded&&t.setExpanded(!1,e)}setClass(e,t=!0){const i=N(e);if(t)null===this.classes&&(this.classes=new Set),i.forEach((e=>{var i;this.classes.add(e),null===(i=this._rowElem)||void 0===i||i.classList.toggle(e,t)}));else{if(null===this.classes)return;i.forEach((e=>{var i;this.classes.delete(e),null===(i=this._rowElem)||void 0===i||i.classList.toggle(e,t)})),0===this.classes.size&&(this.classes=null)}}async expandAll(e=!0,t){const i=this.tree,s=this.tree.options.minExpandLevel,{depth:n=99,loadLazy:r,force:o,keepActiveNodeVisible:l=!0}=null!=t?t:{},a={scrollIntoView:!1,force:o,loadLazy:r};const d=i.logTime(`${this}.expandAll(${e})`);try{i.enableUpdate(!1),await async function t(i,n){var l;if(0===n)return;const d=null==n?null:n-1,c=[];return null===(l=i.children)||void 0===l||l.forEach((i=>{if(e)if(!i.expanded&&(i.children||r&&i.lazy)){const e=i.setExpanded(!0,a);c.push(e),e.then((async()=>{await t(i,d)}))}else c.push(t(i,d));else(!s||o||i.getLevel()>s)&&i.setExpanded(!1,a),t(i,d)})),new Promise((e=>{Promise.all(c).then((()=>{e(!0)}))}))}(this,n)}finally{i.enableUpdate(!0),i.logTimeEnd(d)}i.activeNode&&l&&i.activeNode.scrollIntoView()}findAll(e){const t="function"==typeof e?e:Z(e),i=[];return this.visit((e=>{t(e)&&i.push(e)})),i}findDirectChild(e){const t=this.children;if(!t)return null;if("string"==typeof e){for(let i=0,s=t.length;i{if(t(e))return i=e,!1})),i}findRelatedNode(e,t=!1){return this.tree.findRelatedNode(this,e,t)}*format_iter(e,t){function i(e){const t=e.parent.children;return e===t[t.length-1]}null!=t||(t=[" "," | "," ╰─ "," ├─ "]),null!=e||(e=e=>""+e);const s=s=>{const n=[e(s)];n.unshift(t[i(s)?2:3]);let r=s.parent;for(;r&&r!==this;)n.unshift(t[i(r)?0:1]),r=r.parent;return n.join("")};yield e(this);for(const e of this)yield s(e)}format(e,t){const i=[];for(const s of this.format_iter(e,t))i.push(s);return i.join("\n")}getColElem(e){var t;"string"==typeof e&&(e=this.tree.columns.findIndex((t=>t.id===e)));const i=null===(t=this._rowElem)||void 0===t?void 0:t.querySelectorAll("span.wb-col");return i?i[e]:null}getFirstChild(){return this.children?this.children[0]:null}getLastChild(){return this.children?this.children[this.children.length-1]:null}getLevel(){let e=0,t=this.parent;for(;t;)e++,t=t.parent;return e}getNextSibling(){const e=this.parent.children,t=e.indexOf(this);return e[t+1]||null}getParent(){return this.parent}getParentList(e=!1,t=!1){const i=[];let s=t?this:this.parent;for(;s;)(e||s.parent)&&i.unshift(s),s=s.parent;return i}getPath(e=!0,t="title",i="/"){let s;const n=[],r="function"==typeof t;return this.visitParents((e=>{e.parent&&(s=r?t(e):e[t],n.unshift(s))}),e),n.join(i)}getPrevSibling(){const e=this.parent.children,t=e.indexOf(this);return e[t-1]||null}hasChildren(){if(this.lazy){if(null==this.children)return;if(0===this.children.length)return!1;if(1===this.children.length&&this.children[0].isStatusNode())return;return!0}return!(!this.children||!this.children.length)}hasClass(e){return!!this.classes&&this.classes.has(e)}isActive(){return this.tree.activeNode===this}isAncestorOf(e){return e&&e.isDescendantOf(this)}isChildOf(e){return e&&this.parent===e}isColspan(){return!!this.getOption("colspan")}isDescendantOf(e){if(!e||e.tree!==this.tree)return!1;let t=this.parent;for(;t;){if(t===e)return!0;t===t.parent&&a(`Recursive parent link: ${t}`),t=t.parent}return!1}isExpandable(e=!1){return!(e&&this.expanded||!1===this.children)&&(null==this.children?!!this.lazy:0!==this.children.length||!!this.tree.options.emptyChildListExpandable)}isEditing(){return this.tree._callMethod("edit.isEditingTitle",this)}isExpanded(){return!!this.expanded}isFirstSibling(){const e=this.parent;return!e||e.children[0]===this}isLastSibling(){const e=this.parent;return!e||e.children[e.children.length-1]===this}isLazy(){return!!this.lazy}isLoaded(){return!this.lazy||void 0!==this.hasChildren()}isLoading(){return this._isLoading}isPagingNode(){return"paging"===this.statusNodeType}isParentOf(e){return e&&e.parent===this}isPartload(){return!!this._partload}isPartsel(){return!this.selected&&!!this._partsel}isRadio(){return!!this.parent.radiogroup||"radio"===this.getOption("checkbox")}isRendered(){return!!this._rowElem}isRootNode(){return this.tree.root===this}isSelected(){return!!this.selected||!!this._partsel&&void 0}isStatusNode(){return!!this.statusNodeType}isTopLevel(){return this.tree.root===this.parent}isUnloaded(){return void 0===this.hasChildren()}isVisible(){const e="hide"===this.tree.filterMode,t=this.getParentList(!1,!1);if(e&&!this.match&&!this.subMatchCount)return!1;for(let e=0,i=t.length;ei)return void this.logWarn(`Ignored load response #${i} because #${this._requestId} is pending.`);if(this.logDebug(`Received response for load request #${i}`),null===this.parent&&null!==s)return void this.logWarn("Lazy parent node was removed while loading: discarding response.");this.setStatus(T.ok);const r=Date.now();this._loadSourceObject(t),l=Date.now()-r}else{if("function"==typeof e.then){const i=t.logTime(`Resolve thenable ${e}`);e=await Promise.resolve(e),t.logTimeEnd(i)}this._loadSourceObject(e),l=Date.now()-n}}catch(t){throw this.logError("Error during load()",e,t),this._callEvent("error",{error:t}),this.setStatus(T.error,{message:""+t}),t}finally{this._requestId=0,r=Date.now()-n,t.options.debugLevel>=3&&t.logInfo(`Load source took ${r/1e3} seconds (transfer: ${o/1e3}s, processing: ${l/1e3}s)`)}}async loadLazy(e=!1){const t=this.expanded;if(o(this.lazy,"load() requires a lazy node"),e||this.isUnloaded()){this.isLoaded()&&this.resetLazy(),this.setStatus(T.loading);try{const e=await this._callEvent("lazyLoad");if(!1===e)return void this.setStatus(T.ok);o(w(e)||e&&e.url,"The lazyLoad event must return a node list, `{url: ...}`, or false."),await this.load(e),this.setStatus(T.ok),t?(this.expanded=!0,this.tree.update(D.structure)):this.update()}catch(e){this.logError("Error during loadLazy()",e),this._callEvent("error",{error:e}),this.setStatus(T.error,{message:""+e})}}}log(...e){this.logDebug(...e)}logDebug(...e){this.tree.options.debugLevel>=4&&console.log(this.toString(),...e)}logError(...e){this.tree.options.debugLevel>=1&&console.error(this.toString(),...e)}logInfo(...e){this.tree.options.debugLevel>=3&&console.info(this.toString(),...e)}logWarn(...e){this.tree.options.debugLevel>=2&&console.warn(this.toString(),...e)}async makeVisible(e){let t;const i=new oe,s=[],n=this.getParentList(!1,!1),r=n.length,o=C(e,"noAnimation",!1),l=C(e,"scrollIntoView",!0);for(t=r-1;t>=0;t--){const e={noAnimation:o};s.push(n[t].setExpanded(!0,e))}return Promise.all(s).then((()=>{l&&this.tree?(this.tree.updatePendingModifications(),this.scrollIntoView().then((()=>{i.resolve()}))):i.resolve()})),i.promise()}moveTo(e,t="appendChild",i){let s;"over"===t&&(t="appendChild"),"prependChild"===t&&(e.children&&e.children.length?(t="before",e=e.children[0]):t="appendChild");const n=this.tree,r=this.parent,l="appendChild"===t?e:e.parent;if(this!==e){if(this.parent?l.isDescendantOf(this)&&a("Cannot move a node to its own descendant"):a("Cannot move system root"),l!==r&&r.triggerModifyChild("remove",this),1===this.parent.children.length){if(this.parent===l)return;this.parent.children=this.parent.lazy?[]:null,this.parent.expanded=!1}else s=this.parent.children.indexOf(this),o(s>=0,"invalid source parent"),this.parent.children.splice(s,1);if(this.parent=l,l.hasChildren())switch(t){case"appendChild":l.children.push(this);break;case"before":s=l.children.indexOf(e),o(s>=0,"invalid target parent"),l.children.splice(s,0,this);break;case"after":s=l.children.indexOf(e),o(s>=0,"invalid target parent"),l.children.splice(s+1,0,this);break;default:a(`Invalid mode '${t}'.`)}else l.children=[this];i&&e.visit(i,!0),l===r?l.triggerModifyChild("move",this):l.triggerModifyChild("add",this),n!==e.tree&&(this.logWarn("Cross-tree moveTo is experimental!"),this.visit((t=>{t.tree=e.tree}),!0)),setTimeout((()=>{n.update(D.any)}),0)}}async navigate(e,t){e=X[e]||e;const i=this.findRelatedNode(e);if(!i)return this.logWarn(`Could not find related node '${e}'.`),Promise.resolve(this);try{i.makeVisible({scrollIntoView:!1})}catch(e){}return i.setFocus(),!1===(null==t?void 0:t.activate)?Promise.resolve(this):i.setActive(!0,{event:null==t?void 0:t.event})}remove(){const e=this.tree,t=this.parent.children.indexOf(this);this.triggerModify("remove"),this.parent.children.splice(t,1),this.visit((t=>{t.removeMarkup(),e._unregisterNode(t)}),!0),e.update(D.structure)}removeChildren(){const e=this.tree;this.children&&(e.activeNode&&e.activeNode.isDescendantOf(this)&&e.activeNode.setActive(!1),e.focusNode&&e.focusNode.isDescendantOf(this)&&(e.focusNode=null),this.triggerModifyChild("remove",null),this.visit((t=>{e._unregisterNode(t)})),this.lazy?this.children=[]:this.children=null,this.isRootNode()||(this.expanded=!1),this.tree.update(D.structure))}removeMarkup(){this._rowElem&&(delete this._rowElem._wb_node,this._rowElem.remove(),this._rowElem=void 0)}_getRenderInfo(){const e={},t={},i=this.isColspan(),s=this._rowElem?this._rowElem.querySelectorAll("span.wb-col"):null;let n=0;for(const r of this.tree.columns)e[r.id]={id:r.id,idx:n,elem:s?s[n]:null,info:r},i||"*"===r.id||(t[r.id]=e[r.id]),n++;return{allColInfosById:e,renderColInfosById:t}}_createIcon(e,t,i,s){let n,r=this.getOption("icon");if(this._errorInfo?r=e.error:this._isLoading&&s&&(r=e.loading),!1===r)return null;"string"==typeof r||(r=this.statusNodeType?e[this.statusNodeType]:this.expanded?e.folderOpen:this.children?e.folder:this.lazy?e.folderLazy:e.doc),r?r.indexOf("<")>=0?n=f(r):Q.test(r)?n=f(``):(n=document.createElement("i"),n.className="wb-icon "+r):(n=document.createElement("i"),n.className="wb-icon"),i?t.replaceChild(n,i):t.appendChild(n);const o=this._callEvent("iconBadge",{iconSpan:n});let l=null;if(null!=o&&!1!==o){let e="",t="";x(o)?(l=""+o.badge,e=o.badgeClass?" "+o.badgeClass:"",t=o.badgeTooltip?` title="${o.badgeTooltip}"`:""):l="number"==typeof o?""+o:o,"string"==typeof l&&(l=f(`${d(l)} `)),l&&n.append(l)}return n}_render_markup(e){const t=this.tree,i=t.options,s=this.getOption("checkbox"),n=t.columns,r=this.getLevel(),l=t.isRowNav()?null:t.activeColIdx;let a,d=this._rowElem,c=null,h=null;const u=!d;o(u,"Expected unrendered node"),o(!u||e&&e.after,"opts.after expected, unless updating"),o(!this.isRootNode(),"Root node not allowed"),d=document.createElement("div"),d.classList.add("wb-row"),d.style.top=this._rowIdx*G+"px",this._rowElem=d,d._wb_node=this;const p=document.createElement("span");p.classList.add("wb-node","wb-col"),d.appendChild(p);let f=0;s&&(c=document.createElement("i"),c.classList.add("wb-checkbox"),("radio"===s||this.parent.radiogroup)&&c.classList.add("wb-radio"),p.appendChild(c),f+=20);for(let e=r-1;e>0;e--)a=document.createElement("i"),a.classList.add("wb-indent"),p.appendChild(a),f+=20;(!i.minExpandLevel||r>i.minExpandLevel)&&(h=document.createElement("i"),h.classList.add("wb-expander"),p.appendChild(h),f+=20);this._createIcon(t.iconMap,p,null,!h)&&(f+=20);const g=document.createElement("span");g.classList.add("wb-title"),p.appendChild(g),p._ofsTitlePx=f,t.options.dnd.dragStart&&(p.draggable=!0);if(!this.isColspan()&&n.length>1){let e=0;for(const t of n){let i;e++,"*"===t.id?i=p:(i=document.createElement("span"),i.classList.add("wb-col"),d.appendChild(i)),e===l&&i.classList.add("wb-active"),t.classes&&i.classList.add(...t.classes.split(" ")),i.style.left=t._ofsPx+"px",i.style.width=t._widthPx+"px",u&&t.html&&"string"==typeof t.html&&(i.innerHTML=t.html)}}switch(e?e.after:"last"){case"first":t.nodeListElement.prepend(d);break;case"last":t.nodeListElement.appendChild(d);break;default:e.after.after(d)}e.isNew=!0,this._render_data(e)}_render_data(e){o(this._rowElem,"No _rowElem");const t=this.tree,i=t.options,s=this._rowElem,n=!!e.isNew,r=!!e.preventScroll,l=t.columns,a=this.isColspan(),d=s.querySelector("span.wb-node"),c=d.querySelector("span.wb-title"),h=t.element.scrollTop;if(this.titleWithHighlight?c.innerHTML=this.titleWithHighlight:c.textContent=this.title,r&&(t.element.scrollTop=h),!i.skeleton)if(a){const e=t.element.clientWidth;c.style.width=e-d._ofsTitlePx-7+"px"}else c.style.width=l[0]._widthPx-d._ofsTitlePx-7+"px";if(e.isDataChange=!0,this._render_status(e),this.statusNodeType)this._callEvent("renderStatusNode",{isNew:n,nodeElem:d,isColspan:a});else if(this.parent){const e=this._getRenderInfo();this._callEvent("render",{isNew:n,nodeElem:d,isColspan:a,allColInfosById:e.allColInfosById,renderColInfosById:e.renderColInfosById})}}_render_status(e){const t=this.tree,i=t.iconMap,s=t.options,n=this.type?t.types[this.type]:null,r=this._rowElem,o=r.querySelector("span.wb-node"),l=o.querySelector("i.wb-expander"),a=o.querySelector("i.wb-checkbox"),d=["wb-row"];if(this.expanded&&d.push("wb-expanded"),this.lazy&&d.push("wb-lazy"),this.selected&&d.push("wb-selected"),this._partsel&&d.push("wb-partsel"),this===t.activeNode&&d.push("wb-active"),this===t.focusNode&&d.push("wb-focus"),this._errorInfo&&d.push("wb-error"),this._isLoading&&d.push("wb-loading"),this.isColspan()&&d.push("wb-colspan"),this.statusNodeType&&d.push("wb-status-"+this.statusNodeType),this.match&&d.push("wb-match"),this.subMatchCount&&d.push("wb-submatch"),s.skeleton&&d.push("wb-skeleton"),r.className=d.join(" "),this.classes&&r.classList.add(...this.classes),n&&n.classes&&r.classList.add(...n.classes),l){let e=null;this._isLoading?e=i.loading:this.isExpandable(!1)?e=this.expanded?i.expanderExpanded:i.expanderCollapsed:this.lazy&&null==this.children&&(e=i.expanderLazy),null==e?l.classList.add("wb-indent"):Q.test(e)?l.style.backgroundImage=`url('${e}')`:l.className="wb-expander "+e}if(a){let e="wb-checkbox ";this.isRadio()?(e+="wb-radio ",this.selected?e+=i.radioChecked:e+=i.radioUnchecked):this.selected?e+=i.checkChecked:this._partsel?e+=i.checkUnknown:e+=i.checkUnchecked,a.className=e}if(!e.isNew){let e=0;for(const i of r.children)i.classList.toggle("wb-active",e++===t.activeColIdx);const i=o.querySelector("i.wb-icon");i&&this._createIcon(t.iconMap,o,i,!l)}if(!1!==e.resizeCols&&!this.isColspan()){const e=r.querySelectorAll("span.wb-col");let t=0,i=0;for(const s of this.tree.columns){const n=e[t];n.style.left=`${i}px`,n.style.width=`${s._widthPx}px`,t++,i+=s._widthPx}}}_render(e){const t=Object.assign({change:D.data},e);switch(this._rowElem||(t.change=D.row),t.change){case"status":this._render_status(t);break;case"data":this._render_data(t);break;case"row":this._render_markup(t);break;default:a(`Invalid change type '${t.change}'.`)}}resetLazy(){this.removeChildren(),this.expanded=!1,this.lazy=!0,this.children=null,this.tree.update(D.structure)}toDict(e=!1,t){const i={};if(ae.forEach((e=>{const t=this[e];t instanceof Set?t.size&&(i[e]=Array.prototype.join.call(t.keys()," ")):(t||!1===t||0===t)&&(i[e]=t)})),E(this.data)||(i.data=y({},this.data),E(i.data)&&delete i.data),t){const s=t(i,this);if(!1===s)return!1;"skip"===s&&(e=!1)}if(e&&w(this.children)){i.children=[];for(let e=0,s=this.children.length;e=0&&([s,e]=e.split("."));const n=s[e];if("function"==typeof n){const e=n.call(i,{type:"resolve",tree:i,node:this});if(void 0!==e)return e}if(void 0!==this[e])return this[e];const r=this.type?i.types[this.type]:void 0,o=r?r[e]:void 0;return void 0!==o?o:null!=n?n:t}async scrollIntoView(e){const t=Object.assign({node:this},e);return this.tree.scrollTo(t)}async setActive(e=!0,t){const i=this.tree,s=i.activeNode,n=null==t?void 0:t.retrigger,r=null==t?void 0:t.focusTree,o=!1!==(null==t?void 0:t.focusNode),l=null==t?void 0:t.noEvents,a=null==t?void 0:t.event;if(!l)if(e){if(s!==this||n){if(!1===(null==s?void 0:s._callEvent("deactivate",{nextNode:this,event:a}))||!1===this._callEvent("beforeActivate",{prevNode:s,event:a}))return;i.activeNode=null,null==s||s.update(D.status)}}else(s===this||n)&&this._callEvent("deactivate",{nextNode:null,event:a});return s!==this&&(e&&(i.activeNode=this,(o||r)&&(i.focusNode=this),r&&i.setFocus()),null==s||s.update(D.status),this.update(D.status)),t&&null!=t.colIdx&&t.colIdx!==i.activeColIdx&&i.isCellNav()&&i.setColumn(t.colIdx),e&&!l&&this._callEvent("activate",{prevNode:s,event:a}),this.makeVisible()}async setExpanded(e=!0,t){const{force:i,scrollIntoView:s,immediate:n}=null!=t?t:{};if(!e&&this.isExpanded()&&this.getLevel()<=this.tree.getOption("minExpandLevel")&&!i)return void this.logDebug("Ignored collapse request below expandLevel.");if(!e==!this.expanded)return;e&&this.getOption("autoCollapse")&&this.collapseSiblings(t),e&&this.lazy&&null==this.children&&await this.loadLazy(),this.expanded=e;const r={immediate:n};if(this.tree.update(D.structure,r),e&&s){const e=this.getLastChild();e&&(this.tree.updatePendingModifications(),e.scrollIntoView({topNode:this}))}}setFocus(e=!0){o(!!e,"blur is not yet implemented");const t=this.tree.focusNode;this.tree.focusNode=this,null==t||t.update(),this.update()}setIcon(e){this.icon=e,this.update()}setKey(e,t){throw new Error("Not yet implemented")}update(e=D.data){o(e===D.status||e===D.data,`Invalid change type ${e}`),this.tree.update(e,this)}getSelectedNodes(e=!1){const t=[];return this.visit((i=>{if(i.selected&&(t.push(i),!0===e))return"skip"})),t}toggleSelected(e){let t=this.isSelected();return t=void 0!==t||this.isRadio()?!t:this._anySelectable(),this.setSelected(t,e)}_anySelectable(){let e=!1;return this.visit((t=>{if(!1===t.selected&&!t.unselectable&&!t.hasChildren()&&!t.parent.radiogroup)return e=!0,!1})),e}_changeSelectStatusProps(e){let t=!1;switch(e){case!1:t=this.selected||this._partsel,this.selected=!1,this._partsel=!1;break;case!0:t=!this.selected||!this._partsel,this.selected=!0,this._partsel=!0;break;case void 0:t=this.selected||!this._partsel,this.selected=!1,this._partsel=!0;break;default:a(`Invalid state: ${e}`)}return t&&this.update(),t}fixSelection3AfterClick(e){const t=!!(null==e?void 0:e.force),i=this.isSelected();this.visit((e=>{if(e.radiogroup)return"skip";!t&&e.getOption("unselectable")||e._changeSelectStatusProps(i)})),this.fixSelection3FromEndNodes()}fixSelection3FromEndNodes(e){const t=!!(null==e?void 0:e.force);o("hier"===this.tree.options.selectMode,"expected selectMode 'hier'");const i=e=>{let s;const n=e.children;if(n&&n.length){let e=!0,t=!1;for(let s=0,r=n.length;s{let t;const i=e.children;let s=!0,n=!1;for(let e=0,r=i.length;e{this.visit((t=>{t.setSelected(e)}))})),n):(e===n||s&&!1===this._callEvent("beforeSelect",{flag:e})||(i.runWithDeferredUpdate((()=>{if(r){if(!e&&!(null==t?void 0:t.force))return n;for(const e of this.parent.children)e.selected=e===this}else this.selected=e,"hier"===o?this.fixSelection3AfterClick():"single"===o&&i.visit((e=>{e.selected=!1}))})),s&&this._callEvent("select",{flag:e})),n):n}setStatus(e,t){const i=this.tree,s=null==t?void 0:t.message,n=null==t?void 0:t.details;let r=null;const l=e=>{const t=this.children,s=t?t[0]:null;return o(e.statusNodeType,"Not a status node"),o(!s||!s.isStatusNode(),"Child must not be a status node"),r=this.addNode(e,"prependChild"),r.match=!0,i.update(D.structure),r};switch((()=>{const e=this.children;e&&e.length&&e[0].isStatusNode()&&e[0].remove()})(),e){case"ok":this._isLoading=!1,this._errorInfo=null;break;case"loading":this._isLoading=!0,this._errorInfo=null,this.parent?this.update(D.status):l({statusNodeType:e,title:i.options.strings.loading+(s?" ("+s+")":""),checkbox:!1,colspan:!0,tooltip:n});break;case"error":l({statusNodeType:e,title:i.options.strings.loadError+(s?" ("+s+")":""),checkbox:!1,colspan:!0,tooltip:n}),this._isLoading=!1,this._errorInfo={message:s,details:n};break;case"noData":l({statusNodeType:e,title:s||i.options.strings.noData,checkbox:!1,colspan:!0,tooltip:n}),this._isLoading=!1,this._errorInfo=null;break;default:a("invalid node status "+e)}return i.update(D.structure),r}setTitle(e){this.title=e,this.update()}_sortChildren(e,t){const i=this.children;if(i&&(i.sort(e),t))for(let s=0,n=i.length;s"),null!=i.refKey&&(this.refKey=""+i.refKey),null!=i.type&&(this.type=""+i.type),this.expanded=!0===i.expanded,null!=i.icon&&(this.icon=i.icon),this.lazy=!0===i.lazy,null!=i.statusNodeType&&(this.statusNodeType=""+i.statusNodeType),null!=i.colspan&&(this.colspan=!!i.colspan),null!=i.checkbox&&(this.checkbox=!!i.checkbox),null!=i.radiogroup&&(this.radiogroup=!!i.radiogroup),this.selected=!0===i.selected,!0===i.unselectable&&(this.unselectable=!0),i.classes&&this.setClass(i.classes);for(const[e,t]of Object.entries(i))ae.has(e)||(this.data[e]=t);t&&!this.statusNodeType&&e._registerNode(this)}toString(){return`WunderbaumNode@${this.key}<'${this.title}'>`}*[Symbol.iterator](){const e=this.children;if(e)for(let t=0,i=e.length;t=0,`options.before must be a direct child of ${this}`),this.children.splice(e,0,...o)}else this.children=o;i.update($.structure)}finally{i.enableUpdate(!0)}return o[0]}addNode(e,t="appendChild"){switch("over"===t&&(t="appendChild"),t){case"after":return this.parent.addChildren(e,{before:this.getNextSibling()});case"before":return this.parent.addChildren(e,{before:this});case"prependChild":return this.addChildren(e,{before:0});case"appendChild":return this.addChildren(e)}f(!1,`Invalid mode: ${t}`)}applyCommand(e,t){return this.tree.applyCommand(e,this,t)}collapseSiblings(e){for(const t of this.parent.children)t!==this&&t.expanded&&t.setExpanded(!1,e)}setClass(e,t=!0){const i=O(e);if(t)null===this.classes&&(this.classes=new Set),i.forEach((e=>{var i;this.classes.add(e),null===(i=this._rowElem)||void 0===i||i.classList.toggle(e,t)}));else{if(null===this.classes)return;i.forEach((e=>{var i;this.classes.delete(e),null===(i=this._rowElem)||void 0===i||i.classList.toggle(e,t)})),0===this.classes.size&&(this.classes=null)}}startEditTitle(){this.tree._callMethod("edit.startEditTitle",this)}async expandAll(e=!0,t){const i=this.tree,s=this.tree.options.minExpandLevel,{depth:n=99,loadLazy:r,force:o,keepActiveNodeVisible:l=!0}=null!=t?t:{},a={scrollIntoView:!1,force:o,loadLazy:r};const d=i.logTime(`${this}.expandAll(${e})`);try{i.enableUpdate(!1),await async function t(i,n){var l;if(0===n)return;const d=null==n?null:n-1,c=[];return null===(l=i.children)||void 0===l||l.forEach((i=>{if(e)if(!i.expanded&&(i.children||r&&i.lazy)){const e=i.setExpanded(!0,a);c.push(e),e.then((async()=>{await t(i,d)}))}else c.push(t(i,d));else(!s||o||i.getLevel()>s)&&i.setExpanded(!1,a),t(i,d)})),new Promise((e=>{Promise.all(c).then((()=>{e(!0)}))}))}(this,n)}finally{i.enableUpdate(!0),i.logTimeEnd(d)}i.activeNode&&l&&i.activeNode.scrollIntoView()}findAll(e){const t="function"==typeof e?e:ee(e),i=[];return this.visit((e=>{t(e)&&i.push(e)})),i}findDirectChild(e){const t=this.children;if(!t)return null;if("string"==typeof e){for(let i=0,s=t.length;i{if(t(e))return i=e,!1})),i}findRelatedNode(e,t=!1){return this.tree.findRelatedNode(this,e,t)}*format_iter(e,t){function i(e){const t=e.parent.children;return e===t[t.length-1]}null!=t||(t=[" "," | "," ╰─ "," ├─ "]),null!=e||(e=e=>""+e);const s=s=>{const n=[e(s)];n.unshift(t[i(s)?2:3]);let r=s.parent;for(;r&&r!==this;)n.unshift(t[i(r)?0:1]),r=r.parent;return n.join("")};yield e(this);for(const e of this)yield s(e)}format(e,t){const i=[];for(const s of this.format_iter(e,t))i.push(s);return i.join("\n")}getColElem(e){var t;"string"==typeof e&&(e=this.tree.columns.findIndex((t=>t.id===e)));const i=null===(t=this._rowElem)||void 0===t?void 0:t.querySelectorAll("span.wb-col");return i?i[e]:null}getCloneList(e=!1){if(!this.refKey)return[];const t=this.tree.findByRefKey(this.refKey);return e?t:[...t].filter((e=>e!==this))}getFirstChild(){return this.children?this.children[0]:null}getLastChild(){return this.children?this.children[this.children.length-1]:null}getLevel(){let e=0,t=this.parent;for(;t;)e++,t=t.parent;return e}getNextSibling(){const e=this.parent.children,t=e.indexOf(this);return e[t+1]||null}getParent(){return this.parent}getParentList(e=!1,t=!1){const i=[];let s=t?this:this.parent;for(;s;)(e||s.parent)&&i.unshift(s),s=s.parent;return i}getPath(e=!0,t="title",i="/"){let s;const n=[],r="function"==typeof t;return this.visitParents((e=>{e.parent&&(s=r?t(e):e[t],n.unshift(s))}),e),n.join(i)}getPrevSibling(){const e=this.parent.children,t=e.indexOf(this);return e[t-1]||null}hasChildren(){if(this.lazy){if(null==this.children)return;if(0===this.children.length)return!1;if(1===this.children.length&&this.children[0].isStatusNode())return;return!0}return!(!this.children||!this.children.length)}hasClass(e){return!!this.classes&&this.classes.has(e)}isActive(){return this.tree.activeNode===this}isAncestorOf(e){return e&&e.isDescendantOf(this)}isChildOf(e){return e&&this.parent===e}isClone(){return!!this.refKey&&this.tree.findByRefKey(this.refKey).length>1}isColspan(){return!!this.getOption("colspan")}isDescendantOf(e){if(!e||e.tree!==this.tree)return!1;let t=this.parent;for(;t;){if(t===e)return!0;t===t.parent&&v(`Recursive parent link: ${t}`),t=t.parent}return!1}isExpandable(e=!1){return!(e&&this.expanded||!1===this.children)&&(null==this.children?!!this.lazy:0!==this.children.length||!!this.tree.options.emptyChildListExpandable)}isEditingTitle(){return this.tree._callMethod("edit.isEditingTitle",this)}isExpanded(){return!!this.expanded}isFirstSibling(){const e=this.parent;return!e||e.children[0]===this}isLastSibling(){const e=this.parent;return!e||e.children[e.children.length-1]===this}isLazy(){return!!this.lazy}isLoaded(){return!this.lazy||void 0!==this.hasChildren()}isLoading(){return this._isLoading}isPagingNode(){return"paging"===this.statusNodeType}isParentOf(e){return e&&e.parent===this}isPartload(){return!!this._partload}isPartsel(){return!this.selected&&!!this._partsel}isRadio(){return!!this.parent.radiogroup||"radio"===this.getOption("checkbox")}isRendered(){return!!this._rowElem}isRootNode(){return this.tree.root===this}isSelected(){return!!this.selected||!!this._partsel&&void 0}isStatusNode(){return!!this.statusNodeType}isTopLevel(){return this.tree.root===this.parent}isUnloaded(){return void 0===this.hasChildren()}isVisible(){const e="hide"===this.tree.filterMode,t=this.getParentList(!1,!1);if(e&&!this.match&&!this.subMatchCount)return!1;for(let e=0,i=t.length;ei)return void this.logWarn(`Ignored load response #${i} because #${this._requestId} is pending.`);if(this.logDebug(`Received response for load request #${i}`),null===this.parent&&null!==s)return void this.logWarn("Lazy parent node was removed while loading: discarding response.");this.setStatus(R.ok);const r=Date.now();this._loadSourceObject(t),l=Date.now()-r}else{if("function"==typeof e.then){const i=t.logTime(`Resolve thenable ${e}`);e=await Promise.resolve(e),t.logTimeEnd(i)}this._loadSourceObject(e),l=Date.now()-n}}catch(t){throw this.logError("Error during load()",e,t),this._callEvent("error",{error:t}),this.setStatus(R.error,{message:""+t}),t}finally{this._requestId=0,r=Date.now()-n,t.options.debugLevel>=3&&t.logInfo(`Load source took ${r/1e3} seconds (transfer: ${o/1e3}s, processing: ${l/1e3}s)`)}}async loadLazy(e=!1){const t=this.expanded;if(f(this.lazy,"load() requires a lazy node"),e||this.isUnloaded()){this.isLoaded()&&this.resetLazy(),this.setStatus(R.loading);try{const e=await this._callEvent("lazyLoad");if(!1===e)return void this.setStatus(R.ok);f(S(e)||e&&e.url,"The lazyLoad event must return a node list, `{url: ...}`, or false."),await this.load(e),this.setStatus(R.ok),t?(this.expanded=!0,this.tree.update($.structure)):this.update()}catch(e){this.logError("Error during loadLazy()",e),this._callEvent("error",{error:e}),this.setStatus(R.error,{message:""+e})}}}log(...e){this.logDebug(...e)}logDebug(...e){this.tree.options.debugLevel>=4&&console.log(this.toString(),...e)}logError(...e){this.tree.options.debugLevel>=1&&console.error(this.toString(),...e)}logInfo(...e){this.tree.options.debugLevel>=3&&console.info(this.toString(),...e)}logWarn(...e){this.tree.options.debugLevel>=2&&console.warn(this.toString(),...e)}async makeVisible(e){let t;const i=new le,s=[],n=this.getParentList(!1,!1),r=n.length,o=M(e,"noAnimation",!1),l=M(e,"scrollIntoView",!0);for(t=r-1;t>=0;t--){const e={noAnimation:o};s.push(n[t].setExpanded(!0,e))}return Promise.all(s).then((()=>{l&&this.tree?(this.tree.updatePendingModifications(),this.scrollIntoView().then((()=>{i.resolve()}))):i.resolve()})),i.promise()}moveTo(e,t="appendChild",i){let s;"over"===t&&(t="appendChild"),"prependChild"===t&&(e.children&&e.children.length?(t="before",e=e.children[0]):t="appendChild");const n=this.tree,r=this.parent,o="appendChild"===t?e:e.parent;if(this!==e){if(this.parent?o.isDescendantOf(this)&&v("Cannot move a node to its own descendant"):v("Cannot move system root"),o!==r&&r.triggerModifyChild("remove",this),1===this.parent.children.length){if(this.parent===o)return;this.parent.children=this.parent.lazy?[]:null,this.parent.expanded=!1}else s=this.parent.children.indexOf(this),f(s>=0,"invalid source parent"),this.parent.children.splice(s,1);if(this.parent=o,o.hasChildren())switch(t){case"appendChild":o.children.push(this);break;case"before":s=o.children.indexOf(e),f(s>=0,"invalid target parent"),o.children.splice(s,0,this);break;case"after":s=o.children.indexOf(e),f(s>=0,"invalid target parent"),o.children.splice(s+1,0,this);break;default:v(`Invalid mode '${t}'.`)}else o.children=[this];i&&e.visit(i,!0),o===r?o.triggerModifyChild("move",this):o.triggerModifyChild("add",this),n!==e.tree&&(this.logWarn("Cross-tree moveTo is experimental!"),this.visit((t=>{t.tree=e.tree}),!0)),setTimeout((()=>{n.update($.any)}),0)}}async navigate(e,t){e=Z[e]||e;const i=this.findRelatedNode(e);if(!i)return this.logWarn(`Could not find related node '${e}'.`),Promise.resolve(this);try{i.makeVisible({scrollIntoView:!1})}catch(e){}return i.setFocus(),!1===(null==t?void 0:t.activate)?Promise.resolve(this):i.setActive(!0,{event:null==t?void 0:t.event})}remove(){const e=this.tree,t=this.parent.children.indexOf(this);this.triggerModify("remove"),this.parent.children.splice(t,1),this.visit((t=>{t.removeMarkup(),e._unregisterNode(t)}),!0),e.update($.structure)}removeChildren(){const e=this.tree;this.children&&(e.activeNode&&e.activeNode.isDescendantOf(this)&&e.activeNode.setActive(!1),e.focusNode&&e.focusNode.isDescendantOf(this)&&(e.focusNode=null),this.triggerModifyChild("remove",null),this.visit((t=>{e._unregisterNode(t)})),this.lazy?this.children=[]:this.children=null,this.isRootNode()||(this.expanded=!1),this.tree.update($.structure))}removeMarkup(){this._rowElem&&(delete this._rowElem._wb_node,this._rowElem.remove(),this._rowElem=void 0)}_getRenderInfo(){const e={},t={},i=this.isColspan(),s=this._rowElem?this._rowElem.querySelectorAll("span.wb-col"):null;let n=0;for(const r of this.tree.columns)e[r.id]={id:r.id,idx:n,elem:s?s[n]:null,info:r},i||"*"===r.id||(t[r.id]=e[r.id]),n++;return{allColInfosById:e,renderColInfosById:t}}_createIcon(e,t,i,s){let n,r=this.getOption("icon");if(this._errorInfo?r=e.error:this._isLoading&&s&&(r=e.loading),!1===r)return null;"string"==typeof r||(r=this.statusNodeType?e[this.statusNodeType]:this.expanded?e.folderOpen:this.children?e.folder:this.lazy?e.folderLazy:e.doc),r?r.indexOf("<")>=0?n=x(r):Y.test(r)?n=x(``):(n=document.createElement("i"),n.className="wb-icon "+r):(n=document.createElement("i"),n.className="wb-icon"),i?t.replaceChild(n,i):t.appendChild(n);const o=this._callEvent("iconBadge",{iconSpan:n});let l=null;if(null!=o&&!1!==o){let e="",t="";T(o)?(l=""+o.badge,e=o.badgeClass?" "+o.badgeClass:"",t=o.badgeTooltip?` title="${o.badgeTooltip}"`:""):l="number"==typeof o?""+o:o,"string"==typeof l&&(l=x(`${m(l)} `)),l&&n.append(l)}return n}_render_markup(e){const t=this.tree,i=t.options,s=this.getOption("checkbox"),n=t.columns,r=this.getLevel(),o=t.isRowNav()?null:t.activeColIdx;let l,a=this._rowElem,d=null,c=null;const h=!a;f(h,"Expected unrendered node"),f(!h||e&&e.after,"opts.after expected, unless updating"),f(!this.isRootNode(),"Root node not allowed"),a=document.createElement("div"),a.classList.add("wb-row"),a.style.top=this._rowIdx*Q+"px",this._rowElem=a,a._wb_node=this;const u=document.createElement("span");u.classList.add("wb-node","wb-col"),a.appendChild(u);let p=0;s&&(d=document.createElement("i"),d.classList.add("wb-checkbox"),("radio"===s||this.parent.radiogroup)&&d.classList.add("wb-radio"),u.appendChild(d),p+=20);for(let e=r-1;e>0;e--)l=document.createElement("i"),l.classList.add("wb-indent"),u.appendChild(l),p+=20;(!i.minExpandLevel||r>i.minExpandLevel)&&(c=document.createElement("i"),c.classList.add("wb-expander"),u.appendChild(c),p+=20);this._createIcon(t.iconMap,u,null,!c)&&(p+=20);const g=document.createElement("span");g.classList.add("wb-title"),u.appendChild(g),u._ofsTitlePx=p,t.options.dnd.dragStart&&(u.draggable=!0);if(!this.isColspan()&&n.length>1){let e=0;for(const t of n){let i;e++,"*"===t.id?i=u:(i=document.createElement("span"),i.classList.add("wb-col"),a.appendChild(i)),e===o&&i.classList.add("wb-active"),t.classes&&i.classList.add(...t.classes.split(" ")),i.style.left=t._ofsPx+"px",i.style.width=t._widthPx+"px",h&&t.html&&"string"==typeof t.html&&(i.innerHTML=t.html)}}switch(e?e.after:"last"){case"first":t.nodeListElement.prepend(a);break;case"last":t.nodeListElement.appendChild(a);break;default:e.after.after(a)}e.isNew=!0,this._render_data(e)}_render_data(e){f(this._rowElem,"No _rowElem");const t=this.tree,i=t.options,s=this._rowElem,n=!!e.isNew,r=!!e.preventScroll,o=t.columns,l=this.isColspan(),a=s.querySelector("span.wb-node"),d=a.querySelector("span.wb-title"),c=t.element.scrollTop;if(this.titleWithHighlight?d.innerHTML=this.titleWithHighlight:d.textContent=this.title,r&&(t.element.scrollTop=c),!i.skeleton)if(l){const e=t.element.clientWidth;d.style.width=e-a._ofsTitlePx-7+"px"}else d.style.width=o[0]._widthPx-a._ofsTitlePx-7+"px";if(e.isDataChange=!0,this._render_status(e),this.statusNodeType)this._callEvent("renderStatusNode",{isNew:n,nodeElem:a,isColspan:l});else if(this.parent){const e=this._getRenderInfo();this._callEvent("render",{isNew:n,nodeElem:a,isColspan:l,allColInfosById:e.allColInfosById,renderColInfosById:e.renderColInfosById})}}_render_status(e){const t=this.tree,i=t.iconMap,s=t.options,n=this.type?t.types[this.type]:null,r=this._rowElem,o=r.querySelector("span.wb-node"),l=o.querySelector("i.wb-expander"),a=o.querySelector("i.wb-checkbox"),d=["wb-row"];if(this.expanded&&d.push("wb-expanded"),this.lazy&&d.push("wb-lazy"),this.selected&&d.push("wb-selected"),this._partsel&&d.push("wb-partsel"),this===t.activeNode&&d.push("wb-active"),this===t.focusNode&&d.push("wb-focus"),this._errorInfo&&d.push("wb-error"),this._isLoading&&d.push("wb-loading"),this.isColspan()&&d.push("wb-colspan"),this.statusNodeType&&d.push("wb-status-"+this.statusNodeType),this.match&&d.push("wb-match"),this.subMatchCount&&d.push("wb-submatch"),s.skeleton&&d.push("wb-skeleton"),r.className=d.join(" "),this.classes&&r.classList.add(...this.classes),n&&n.classes&&r.classList.add(...n.classes),l){let e=null;this._isLoading?e=i.loading:this.isExpandable(!1)?e=this.expanded?i.expanderExpanded:i.expanderCollapsed:this.lazy&&null==this.children&&(e=i.expanderLazy),null==e?l.classList.add("wb-indent"):Y.test(e)?l.style.backgroundImage=`url('${e}')`:l.className="wb-expander "+e}if(a){let e="wb-checkbox ";this.isRadio()?(e+="wb-radio ",this.selected?e+=i.radioChecked:e+=i.radioUnchecked):this.selected?e+=i.checkChecked:this._partsel?e+=i.checkUnknown:e+=i.checkUnchecked,a.className=e}if(!e.isNew){let e=0;for(const i of r.children)i.classList.toggle("wb-active",e++===t.activeColIdx),i.classList.remove("wb-error","wb-invalid");const i=o.querySelector("i.wb-icon");i&&this._createIcon(t.iconMap,o,i,!l)}if(!1!==e.resizeCols&&!this.isColspan()){const e=r.querySelectorAll("span.wb-col");let t=0,i=0;for(const s of this.tree.columns){const n=e[t];n.style.left=`${i}px`,n.style.width=`${s._widthPx}px`,t++,i+=s._widthPx}}}_render(e){const t=Object.assign({change:$.data},e);switch(this._rowElem||(t.change=$.row),t.change){case"status":this._render_status(t);break;case"data":this._render_data(t);break;case"row":this._render_markup(t);break;default:v(`Invalid change type '${t.change}'.`)}}resetLazy(){this.removeChildren(),this.expanded=!1,this.lazy=!0,this.children=null,this.tree.update($.structure)}toDict(e=!1,t){const i={};if(de.forEach((e=>{const t=this[e];t instanceof Set?t.size&&(i[e]=Array.prototype.join.call(t.keys()," ")):(t||!1===t||0===t)&&(i[e]=t)})),D(this.data)||(i.data=N({},this.data),D(i.data)&&delete i.data),t){const s=t(i,this);if(!1===s)return!1;"skip"===s&&(e=!1)}if(e&&S(this.children)){i.children=[];for(let e=0,s=this.children.length;e=0&&([s,e]=e.split("."));const n=s[e];if("function"==typeof n){const e=n.call(i,{type:"resolve",tree:i,node:this});if(void 0!==e)return e}if(void 0!==this[e])return this[e];const r=this.type?i.types[this.type]:void 0,o=r?r[e]:void 0;return void 0!==o?o:null!=n?n:t}async scrollIntoView(e){const t=Object.assign({node:this},e);return this.tree.scrollTo(t)}async setActive(e=!0,t){const i=this.tree,s=i.activeNode,n=null==t?void 0:t.retrigger,r=null==t?void 0:t.focusTree,o=null==t?void 0:t.noEvents,l=null==t?void 0:t.event,a=null==t?void 0:t.colIdx,d=null==t?void 0:t.edit;if(f(!a||i.isCellNav(),"colIdx requires cellNav"),f(!d||null!=a,"edit requires colIdx"),!o)if(e){if(s!==this||n){if(!1===(null==s?void 0:s._callEvent("deactivate",{nextNode:this,event:l}))||!1===this._callEvent("beforeActivate",{prevNode:s,event:l}))return;i.activeNode=null,null==s||s.update($.status)}}else(s===this||n)&&this._callEvent("deactivate",{nextNode:null,event:l});return s!==this&&(e&&(i.activeNode=this),null==s||s.update($.status),this.update($.status)),this.makeVisible().then((()=>{e&&((r||d)&&(i.setFocus(),i.focusNode=this,i.focusNode.setFocus()),null!=a&&i.isCellNav()&&i.setColumn(a,{edit:d}),o||this._callEvent("activate",{prevNode:s,event:l}))}))}async setExpanded(e=!0,t){const{force:i,scrollIntoView:s,immediate:n}=null!=t?t:{},r=!(null==t?void 0:t.noEvents);if(!e&&this.isExpanded()&&this.getLevel()<=this.tree.getOption("minExpandLevel")&&!i)return void this.logDebug("Ignored collapse request below expandLevel.");if(!e==!this.expanded)return;if(r&&!1===this._callEvent("beforeExpand",{flag:e}))return;e&&this.getOption("autoCollapse")&&this.collapseSiblings(t),e&&this.lazy&&null==this.children&&await this.loadLazy(),this.expanded=e;const o={immediate:n};if(this.tree.update($.structure,o),e&&s){const e=this.getLastChild();e&&(this.tree.updatePendingModifications(),e.scrollIntoView({topNode:this}))}r&&this._callEvent("expand",{flag:e})}setFocus(e=!0){f(!!e,"Blur is not yet implemented");const t=this.tree.focusNode;this.tree.focusNode=this,null==t||t.update(),this.update()}setIcon(e){this.icon=e,this.update()}setKey(e,t){throw new Error("Not yet implemented")}update(e=$.data){f(e===$.status||e===$.data,`Invalid change type ${e}`),this.tree.update(e,this)}getSelectedNodes(e=!1){const t=[];return this.visit((i=>{if(i.selected&&(t.push(i),!0===e))return"skip"})),t}toggleSelected(e){let t=this.isSelected();return t=void 0!==t||this.isRadio()?!t:this._anySelectable(),this.setSelected(t,e)}_anySelectable(){let e=!1;return this.visit((t=>{if(!1===t.selected&&!t.unselectable&&!t.hasChildren()&&!t.parent.radiogroup)return e=!0,!1})),e}_changeSelectStatusProps(e){let t=!1;switch(e){case!1:t=this.selected||this._partsel,this.selected=!1,this._partsel=!1;break;case!0:t=!this.selected||!this._partsel,this.selected=!0,this._partsel=!0;break;case void 0:t=this.selected||!this._partsel,this.selected=!1,this._partsel=!0;break;default:v(`Invalid state: ${e}`)}return t&&this.update(),t}fixSelection3AfterClick(e){const t=!!(null==e?void 0:e.force),i=this.isSelected();this.visit((e=>{if(e.radiogroup)return"skip";!t&&e.getOption("unselectable")||e._changeSelectStatusProps(i)})),this.fixSelection3FromEndNodes()}fixSelection3FromEndNodes(e){const t=!!(null==e?void 0:e.force);f("hier"===this.tree.options.selectMode,"expected selectMode 'hier'");const i=e=>{let s;const n=e.children;if(n&&n.length){let e=!0,t=!1;for(let s=0,r=n.length;s{let t;const i=e.children;let s=!0,n=!1;for(let e=0,r=i.length;e{this.visit((t=>{t.setSelected(e)}))})),n):(e===n||s&&!1===this._callEvent("beforeSelect",{flag:e})||(i.runWithDeferredUpdate((()=>{if(r){if(!e&&!(null==t?void 0:t.force))return n;for(const e of this.parent.children)e.selected=e===this}else this.selected=e,"hier"===o?this.fixSelection3AfterClick():"single"===o&&i.visit((e=>{e.selected=!1}))})),s&&this._callEvent("select",{flag:e})),n):n}setStatus(e,t){const i=this.tree,s=null==t?void 0:t.message,n=null==t?void 0:t.details;let r=null;const o=e=>{const t=this.children,s=t?t[0]:null;return f(e.statusNodeType,"Not a status node"),f(!s||!s.isStatusNode(),"Child must not be a status node"),r=this.addNode(e,"prependChild"),r.match=!0,i.update($.structure),r};switch((()=>{const e=this.children;e&&e.length&&e[0].isStatusNode()&&e[0].remove()})(),e){case"ok":this._isLoading=!1,this._errorInfo=null;break;case"loading":this._isLoading=!0,this._errorInfo=null,this.parent?this.update($.status):o({statusNodeType:e,title:i.options.strings.loading+(s?" ("+s+")":""),checkbox:!1,colspan:!0,tooltip:n});break;case"error":o({statusNodeType:e,title:i.options.strings.loadError+(s?" ("+s+")":""),checkbox:!1,colspan:!0,tooltip:n}),this._isLoading=!1,this._errorInfo={message:s,details:n};break;case"noData":o({statusNodeType:e,title:s||i.options.strings.noData,checkbox:!1,colspan:!0,tooltip:n}),this._isLoading=!1,this._errorInfo=null;break;default:v("invalid node status "+e)}return i.update($.structure),r}setTitle(e){this.title=e,this.update()}_sortChildren(e,t){const i=this.children;if(i&&(i.sort(e),t))for(let s=0,n=i.length;s{t.logError(`Error in ${e} event promise`,s),i.classList.add("wb-error")})).finally((()=>{i.classList.remove("wb-busy")})),n}_onChange(e){const t=ue.getEventInfo(e),i=t.node,s=t.colElem;i&&0!==t.colIdx?this._applyChange("change",i,s,{info:t,event:e,inputElem:e.target,inputValue:ue.util.getValueFromElem(e.target)}):this.tree.log("Ignored change event for removed element or node title")}init(){super.init(),_(this.tree.element,"change",".contenteditable,input,textarea,select",(e=>this._onChange(e)))}_preprocessKeyEvent(e){const t=e.event,s=b(t),n=this.tree,r=this.getPluginOption("trigger");if(this.isEditingTitle()){switch(s){case"Enter":return this._stopEditTitle(!0,{event:t}),!1;case"Escape":return this._stopEditTitle(!1,{event:t}),!1}return!1}if(n.isRowNav()||0===n.activeColIdx){switch(s){case"Enter":if(r.indexOf("macEnter")>=0&&i)return this.startEditTitle(),!1;break;case"F2":if(r.indexOf("F2")>=0)return this.startEditTitle(),!1}return!0}return!0}isEditingTitle(e){return e?this.curEditNode===e:!!this.curEditNode}startEditTitle(e){e=null!=e?e:this.tree.getActiveNode();const t=this.getPluginOption("validity"),i=this.getPluginOption("select");if(!e)return;this.tree.logDebug(`startEditTitle(node=${e})`);let s=e._callEvent("edit.beforeEdit");if(!1===s)return void e.logInfo("beforeEdit canceled operation.");if(!0===s||!s){s=` `}const n=e.getColElem(0).querySelector(".wb-title");n.innerHTML=s;const r=n.firstElementChild;t&&r.addEventListener("keydown",(e=>{r.setCustomValidity(""),r.reportValidity()})),r.focus(),i&&r.select(),this.curEditNode=e,e._callEvent("edit.edit",{inputElem:r})}stopEditTitle(e){return this._stopEditTitle(e,{})}_stopEditTitle(e,t){null!=t||(t={});const i=document.activeElement;let s=i?u(i):null;const n=this.curEditNode,r=!!t.forceClose,o=this.getPluginOption("validity");if(s&&this.getPluginOption("trim")&&(s=s.trim()),n)if(n.logDebug(`stopEditTitle(${e})`,t,i,s),e&&null!==s&&s!==n.title){const e=i.validationMessage;if(e)throw new Error(`Input validation failed for "${s}": ${e}.`);const t=n.getColElem(0);this._applyChange("edit.apply",n,t,{oldValue:n.title,newValue:s,inputElem:i}).then((e=>{const t=i.validationMessage;if(o&&t&&!1!==e)throw new Error(`Edit apply validation failed for "${s}": ${t}.`);(r||!1!==e)&&(null==n||n.setTitle(s),this.curEditNode._render({preventScroll:!0}),this.curEditNode=null,this.relatedNode=null,this.tree.setFocus())})).catch((e=>{n.logError(e)}))}else this.curEditNode._render({preventScroll:!0}),this.curEditNode=null,this.relatedNode=null,this.tree.setFocus();else this.tree.logDebug("stopEditTitle: not in edit mode.")}createNode(e="after",t,i){const s=this.tree;if(o(t=null!=t?t:s.getActiveNode(),"No node was passed, or no node is currently active."),e=e||"prependChild",null==i?i={title:""}:"string"==typeof i?i={title:i}:o(x(i),`Expected a plain object: ${i}`),("prependChild"===e||"appendChild"===e)&&(null==t?void 0:t.isExpandable(!0)))return void t.setExpanded().then((()=>{this.createNode(e,t,i)}));const n=t.addNode(i,e);n.setClass("wb-edit-new"),this.relatedNode=t,n.match=!0,n.makeVisible({noAnimation:!0}).then((()=>{this.startEditTitle(n)}))}}
+ * Wunderbaum - ext-edit
+ * Copyright (c) 2021-2023, Martin Wendt. Released under the MIT license.
+ * v0.8.0, Thu, 11 Jan 2024 19:37:23 GMT (https://github.com/mar10/wunderbaum)
+ */
+class he extends V{constructor(e){super(e,"edit",{debounce:100,minlength:1,maxlength:null,trigger:[],trim:!0,select:!0,slowClickDelay:1e3,validity:!0,beforeEdit:null,edit:null,apply:null}),this.curEditNode=null,this.relatedNode=null,this.debouncedOnChange=o(this._onChange.bind(this),this.getPluginOption("debounce"))}async _applyChange(e,t,i,s,n){return t.log(`_applyChange(${e})`,n),i.classList.add("wb-busy"),i.classList.remove("wb-error","wb-invalid"),s.setCustomValidity(""),new Promise(((i,s)=>{const r=t._callEvent(e,n);Promise.resolve(r).then((e=>{i(e)})).catch((e=>{s(e)}))})).then((e=>{if(!s.checkValidity())throw t.logWarn("inputElem.checkValidity() failed: throwing...."),new p(s.validationMessage);return e})).catch((n=>{if(!(n instanceof p))throw t.logError(`Error in ${e} event handler (throw e.util.ValidationError instead if this was intended)`,n),i.classList.add("wb-error"),n;t.logWarn("catched ",n),i.classList.add("wb-invalid"),s.setCustomValidity&&!s.validationMessage&&s.setCustomValidity(n.message),s.validationMessage&&s.reportValidity()})).finally((()=>{i.classList.remove("wb-busy")}))}_onChange(e){const t=pe.getEventInfo(e),i=t.node,s=t.colElem;i&&0!==t.colIdx?this._applyChange("change",i,s,e.target,{info:t,event:e,inputElem:e.target,inputValue:pe.util.getValueFromElem(e.target),inputValid:e.target.checkValidity()}):this.tree.log("Ignored change event for removed element or node title")}init(){super.init(),I(this.tree.element,"change",".contenteditable,input,textarea,select",(e=>this._onChange(e)))}_preprocessKeyEvent(e){const t=e.event,i=C(t),s=this.tree,n=this.getPluginOption("trigger");if(this.isEditingTitle()){switch(i){case"Enter":return this._stopEditTitle(!0,{event:t}),!1;case"Escape":return this._stopEditTitle(!1,{event:t}),!1}return!1}if(s.isRowNav()||0===s.activeColIdx){switch(i){case"Enter":if(n.indexOf("macEnter")>=0&&d)return this.startEditTitle(),!1;break;case"F2":if(n.indexOf("F2")>=0)return this.startEditTitle(),!1}return!0}return!0}isEditingTitle(e){return e?this.curEditNode===e:!!this.curEditNode}startEditTitle(e){e=null!=e?e:this.tree.getActiveNode();const t=this.getPluginOption("validity"),i=this.getPluginOption("select");if(!e)return;this.tree.logDebug(`startEditTitle(node=${e})`);let s=e._callEvent("edit.beforeEdit");if(!1===s)return void e.logDebug("beforeEdit canceled operation.");if(!0===s||!s){const t=m(e.title);let i=this.getPluginOption("maxlength");const n=i?` maxlength="${i}"`:"";i=this.getPluginOption("minlength");s=` 0?" required":""}${i?` minlength="${i}"`:""}${n} >`}const n=e.getColElem(0).querySelector(".wb-title");n.innerHTML=s;const r=n.firstElementChild;t&&r.addEventListener("keydown",(t=>{r.setCustomValidity(""),r.reportValidity()||e.logWarn(`Invalid input: '${r.value}'`)})),r.focus(),i&&r.select(),this.curEditNode=e,e._callEvent("edit.edit",{inputElem:r})}stopEditTitle(e){return this._stopEditTitle(e,{})}_stopEditTitle(e,t){null!=t||(t={});const i=document.activeElement;let s=i?w(i):null;const n=this.curEditNode,r=!!t.forceClose,o=this.getPluginOption("validity");if(s&&this.getPluginOption("trim")&&(s=s.trim()),n)if(n.logDebug(`stopEditTitle(${e})`,t,i,s),e&&null!==s&&s!==n.title){const e=i.validationMessage;if(e)throw new Error(`Input validation failed for "${s}": ${e}.`);const t=n.getColElem(0);this._applyChange("edit.apply",n,t,i,{oldValue:n.title,newValue:s,inputElem:i,inputValid:i.checkValidity()}).then((e=>{const t=i.validationMessage;if(o&&t&&!1!==e)throw new Error(`Edit apply validation failed for "${s}": ${t}.`);(r||!1!==e)&&(null==n||n.setTitle(s),this.curEditNode._render({preventScroll:!0}),this.curEditNode=null,this.relatedNode=null,this.tree.setFocus())}))}else this.curEditNode._render({preventScroll:!0}),this.curEditNode=null,this.relatedNode=null,this.tree.setFocus();else this.tree.logDebug("stopEditTitle: not in edit mode.")}createNode(e="after",t,i){const s=this.tree;if(f(t=null!=t?t:s.getActiveNode(),"No node was passed, or no node is currently active."),e=e||"prependChild",null==i?i={title:""}:"string"==typeof i?i={title:i}:f(T(i),`Expected a plain object: ${i}`),("prependChild"===e||"appendChild"===e)&&(null==t?void 0:t.isExpandable(!0)))return void t.setExpanded().then((()=>{this.createNode(e,t,i)}));const n=t.addNode(i,e);n.setClass("wb-edit-new"),this.relatedNode=t,n.match=!0,n.makeVisible({noAnimation:!0}).then((()=>{this.startEditTitle(n)}))}}
/*!
- * wunderbaum.ts
- *
- * A treegrid control.
- *
- * Copyright (c) 2021-2023, Martin Wendt (https://wwWendt.de).
- * https://github.com/mar10/wunderbaum
- *
- * Released under the MIT license.
- * @version v0.7.0
- * @date Sat, 09 Dec 2023 13:47:27 GMT
- */class he extends de{constructor(e){super(e,null,{key:"__root__",title:e.id})}toString(){return`WbSystemRoot@${this.key}<'${this.tree.id}'>`}}class ue{constructor(e){this.enabled=!0,this.data={},this.extensionList=[],this.extensions={},this.keyMap=new Map,this.refKeyMap=new Map,this.treeRowCount=0,this._disableUpdateCount=0,this._disableUpdateIgnoreCount=0,this.activeNode=null,this.focusNode=null,this.types={},this.columns=[],this._columnsById={},this.pendingChangeTypes=new Set,this._util=O,this.filterMode=null,this.activeColIdx=0,this._cellNavMode=!1,this.lastQuicksearchTime=0,this.lastQuicksearchTerm="",this.lastClickTime=0,this.log=this.logDebug;const t=this.options=y({id:null,source:null,element:null,debugLevel:3,header:null,rowHeightPx:G,iconMap:"bootstrap",columns:null,types:null,enabled:!0,fixedCol:!1,showSpinner:!1,checkbox:!1,minExpandLevel:0,emptyChildListExpandable:!1,skeleton:!1,connectTopBreadcrumb:null,selectMode:"multi",navigationModeOption:null,quicksearch:!0,iconBadge:null,change:null,error:null,receive:null,strings:{loadError:"Error",loading:"Loading...",noData:"No data"}},e),i=new oe;this.ready=i.promise();let s=!1;if(this.ready.then((()=>{s=!0;try{this._callEvent("init")}catch(e){this.logError("Exception inside `init(e)` event:",e)}})).catch((e=>{if(s)throw e;this._callEvent("init",{error:e})})),this.id=t.id||"wb_"+ ++ue.sequence,this.root=new he(this),this._registerExtension(new W(this)),this._registerExtension(new ce(this)),this._registerExtension(new K(this)),this._registerExtension(new se(this)),this._registerExtension(new re(this)),this._registerExtension(new B(this)),this._updateViewportThrottled=S(this._updateViewportImmediately.bind(this),{}),this.columns=t.columns,delete t.columns,!this.columns||!this.columns.length){const e="string"==typeof t.header?t.header:this.id;this.columns=[{id:"*",title:e,width:"*"}]}t.types&&this.setTypes(t.types,!0),delete t.types,this.element=v(t.element),o(!!this.element,`Invalid 'element' option: ${t.element}`),this.element.classList.add("wunderbaum"),this.element.getAttribute("tabindex")||(this.element.tabIndex=0),this.element._wb_tree=this,this.headerElement=this.element.querySelector("div.wb-header");const n=null==t.header?this.columns.length>1:!!t.header;if(this.headerElement){o(!this.columns,"`opts.columns` must not be set if markup already contains a header"),this.columns=[];const e=this.headerElement.querySelector("div.wb-row");for(const t of e.querySelectorAll("div"))this.columns.push({id:t.dataset.id||`col_${this.columns.length}`,title:""+t.textContent,width:"*"})}else{const e=" ".repeat(this.columns.length);if(this.element.innerHTML=`\n `,!n){this.element.querySelector("div.wb-header").style.display="none"}}this.element.innerHTML+='\n ',this.listContainerElement=this.element.querySelector("div.wb-list-container"),this.nodeListElement=this.listContainerElement.querySelector("div.wb-node-list"),this.headerElement=this.element.querySelector("div.wb-header"),this.element.classList.toggle("wb-grid",this.columns.length>1),this._initExtensions(),["enabled","fixedCol"].forEach((e=>{null!=t[e]&&this.setOption(e,t[e])})),t.source?(t.showSpinner&&(this.nodeListElement.innerHTML="loading... "),this.load(t.source).then((()=>{null==t.navigationModeOption?this.isGrid()?this.setNavigationOption(M.cell):this.setNavigationOption(M.row):this.setNavigationOption(t.navigationModeOption),i.resolve()})).catch((e=>{i.reject(e)})).finally((()=>{var e;null===(e=this.element.querySelector("progress.spinner"))||void 0===e||e.remove(),this.element.classList.remove("wb-initializing")}))):i.resolve(),this.update(D.any),this.element.addEventListener("scroll",(e=>{this.update(D.scroll)})),this.resizeObserver=new ResizeObserver((e=>{this.update(D.resize)})),this.resizeObserver.observe(this.element),_(this.nodeListElement,"click","div.wb-row",(t=>{const i=ue.getEventInfo(t),s=i.node,n=t;if(!1===this._callEvent("click",{event:t,node:s,info:i}))return this.lastClickTime=Date.now(),!1;if(s){if(n.ctrlKey)return void s.toggleSelected();const r=this.getOption("edit.trigger"),o=this.getOption("edit.slowClickDelay");r.indexOf("clickActive")>=0&&"title"===i.region&&s.isActive()&&(!o||Date.now()-this.lastClickTime=0?s.setActive(!0,{colIdx:i.colIdx,event:t}):s.setActive(!0,{event:t}),i.region===L.expander?s.setExpanded(!s.isExpanded(),{scrollIntoView:!1!==e.scrollIntoViewOnExpandClick}):i.region===L.checkbox&&s.toggleSelected()}this.lastClickTime=Date.now()})),_(this.nodeListElement,"dblclick","div.wb-row",(e=>{const t=ue.getEventInfo(e),i=t.node;if(!1===this._callEvent("dblclick",{event:e,node:i,info:t}))return!1;i&&0===t.colIdx&&i.isExpandable()&&(this._callMethod("edit._stopEditTitle"),i.setExpanded(!i.isExpanded()))})),_(this.element,"keydown",(e=>{const t=ue.getEventInfo(e),i=b(e),s=t.node||this.getFocusNode();this._callHook("onKeyEvent",{event:e,node:s,info:t,eventName:i})})),_(this.element,"focusin focusout",(e=>{const i="focusin"===e.type,s=ue.getNode(e);this._callEvent("focus",{flag:i,event:e}),i&&this.isRowNav()&&!this.isEditing()&&(t.navigationModeOption===M.row?null==s||s.setActive():this.setCellNav()),i||this._callMethod("edit._stopEditTitle",!0,{event:e,forceClose:!0})}))}static getTree(e){if(e instanceof ue)return e;if(e instanceof de)return e.tree;if(void 0===e&&(e=0),"number"==typeof e)e=document.querySelectorAll(".wunderbaum")[e];else if("string"==typeof e){for(const t of document.querySelectorAll(".wunderbaum")){const i=t._wb_tree;if(i&&i.id===e)return i}if(!(e=document.querySelector(e)))return null}else e.target&&(e=e.target);return o(e instanceof Element,`Invalid el type: ${e}`),e.matches(".wunderbaum")||(e=e.closest(".wunderbaum")),e&&e._wb_tree?e._wb_tree:null}get iconMap(){const e=this.options.iconMap;return"string"==typeof e?Y[e]:e}static getNode(e){if(!e)return null;if(e instanceof de)return e;for(void 0!==e.target&&(e=e.target);e;){if(e._wb_node)return e._wb_node;e=e.parentElement}return null}*[Symbol.iterator](){yield*this.root}_registerExtension(e){this.extensionList.push(e),this.extensions[e.id]=e}_initExtensions(){for(const e of this.extensionList)e.init()}_registerNode(e){const t=e.key;o(null!=t&&!this.keyMap.has(t),`Missing or duplicate key: '${t}'.`),this.keyMap.set(t,e);const i=e.refKey;if(i){const t=this.refKeyMap.get(i);t?t.add(e):this.refKeyMap.set(i,new Set)}}_unregisterNode(e){const t=e.refKey;if(t){const i=this.refKeyMap.get(t);i&&i.delete(e)&&!i.size&&this.refKeyMap.delete(t)}e.tree=null,e.parent=null,e.removeMarkup()}_callHook(e,t={}){let i;const s=y({},{tree:this,options:this.options,result:void 0},t);for(const t of this.extensionList){if(i=t[e].call(t,s),!1===i)break;void 0!==s.result&&(i=s.result)}return i}_callMethod(e,...t){const[i,s]=e.split("."),n=s?this.extensions[i]:this,r=n[s];if(r)return r.apply(n,t);this.logError(`Calling undefined method '${e}()'.`)}_callEvent(e,t){const[i,s]=e.split("."),n=this.options,r=s?n[i][s]:n[i];if(r)return r.call(this,y({type:e,tree:this,util:this._util},t))}_getNodeByRowIdx(e){let t=null;return this.visitRows((i=>{if(i._rowIdx===e)return t=i,!1})),t}getTopmostVpNode(e=!0){const t=this.element.scrollTop;let i;return i=e?Math.ceil((t-1)/G):Math.floor(t/G),this._getNodeByRowIdx(i)}getLowestVpNode(e=!0){const t=this.element,i=this.headerElement.clientHeight,s=t.scrollTop,n=t.clientHeight-i;let r;return r=e?Math.floor((s+n)/G)-1:Math.ceil((s+n)/G)-1,r=Math.min(r,this.count(!0)-1),this._getNodeByRowIdx(r)}_getPrevNodeInView(e,t=1){return this.visitRows((i=>{if(e=i,t--<=0)return!1}),{reverse:!0,start:e||this.getActiveNode()}),e}_getNextNodeInView(e,t=1){return this.visitRows((i=>{if(e=i,t--<=0)return!1}),{reverse:!1,start:e||this.getActiveNode()}),e}addChildren(e,t){return this.root.addChildren(e,t)}applyCommand(e,t,i){let s,n;switch(t instanceof de?s=t:(s=this.getActiveNode(),o(void 0===i,`Unexpected options: ${i}`),i=t),e){case"moveUp":n=s.getPrevSibling(),n&&(s.moveTo(n,"before"),s.setActive());break;case"moveDown":n=s.getNextSibling(),n&&(s.moveTo(n,"after"),s.setActive());break;case"indent":n=s.getPrevSibling(),n&&(s.moveTo(n,"appendChild"),n.setExpanded(),s.setActive());break;case"outdent":s.isTopLevel()||(s.moveTo(s.getParent(),"after"),s.setActive());break;case"remove":n=s.getPrevSibling()||s.getParent(),s.remove(),n&&n.setActive();break;case"addChild":this._callMethod("edit.createNode","prependChild");break;case"addSibling":this._callMethod("edit.createNode","after");break;case"rename":this._callMethod("edit.startEditTitle");break;case"down":case"first":case"last":case"left":case"pageDown":case"pageUp":case"parent":case"right":case"up":return s.navigate(e);default:a(`Unhandled command: '${e}'`)}}clear(){this.root.removeChildren(),this.root.children=null,this.keyMap.clear(),this.refKeyMap.clear(),this.treeRowCount=0,this.activeNode=null,this.focusNode=null,this.update(D.structure)}destroy(){this.logInfo("destroy()..."),this.clear(),this.resizeObserver.disconnect(),this.element.innerHTML="",this.element.outerHTML=this.element.outerHTML}getOption(e,t){let i,s=this.options;e.indexOf(".")>=0&&([i,e]=e.split("."),s=s[i]);let n=s[e];return"function"==typeof n&&(n=n({type:"resolve",tree:this})),null!=n?n:t}setOption(e,t){if(e.indexOf(".")>=0){const i=e.split(".");this.extensions[i[0]].setPluginOption(i[1],t)}else switch(this.options[e]=t,e){case"checkbox":this.update(D.any);break;case"enabled":this.setEnabled(!!t);break;case"fixedCol":this.element.classList.toggle("wb-fixed-col",!!t)}}hasFocus(){return this.element.contains(document.activeElement)}hasHeader(){const e=this.options.header;return this.isGrid()?!1!==e:!!e}runWithDeferredUpdate(e,t=null){try{this.enableUpdate(!1);const t=e();return o(!(t instanceof Promise),`Promise return not allowed: ${t}`),t}finally{this.enableUpdate(!0)}}async expandAll(e=!0,t){await this.root.expandAll(e,t)}selectAll(e=!0){return this.root.setSelected(e,{propagateDown:!0})}toggleSelect(){this.selectAll(this.root._anySelectable())}getSelectedNodes(e=!1){return this.root.getSelectedNodes(e)}_selectRange(e){this.logDebug("_selectRange",e),a("Not yet implemented.")}count(e=!1){return e?this.treeRowCount:this.keyMap.size}_check(){let e=0;this.visit((t=>{e++})),this.keyMap.size!==e&&this.logWarn(`_check failed: ${this.keyMap.size} !== ${e}`)}findAll(e){return this.root.findAll(e)}findFirst(e){return this.root.findFirst(e)}findKey(e){return this.keyMap.get(e)||null}findNextNode(e,t){let i=null;const s=this.getFirstChild(),n="string"==typeof e?function(e){e=c(e);const t=new RegExp("^"+e,"i");return function(e){return t.test(e.title)}}(e):e;function r(e){if(n(e)&&(i=e),i||e===t)return!1}return t=t||s,this.visitRows(r,{start:t,includeSelf:!1}),i||t===s||this.visitRows(r,{start:s,includeSelf:!0}),i}findRelatedNode(e,t,i=!1){let s=null;const n=Math.floor(this.listContainerElement.clientHeight/G);switch(t){case"parent":case"left":e.parent&&e.parent.parent&&(s=e.parent);break;case"first":this.visit((e=>{if(e.isVisible())return s=e,!1}));break;case"last":this.visit((e=>{e.isVisible()&&(s=e)}));break;case"right":e.children&&e.children.length&&(s=e.children[0]);break;case"up":s=this._getPrevNodeInView(e);break;case"down":s=this._getNextNodeInView(e);break;case"pageDown":{const t=this.getLowestVpNode();s=e._rowIdxt._rowIdx?t:this._getPrevNodeInView(e,n)}break;default:this.logWarn("Unknown relation '"+t+"'.")}return s}*format_iter(e,t){yield*this.root.format_iter(e,t)}format(e,t){return this.root.format(e,t)}getActiveColElem(){return this.activeNode&&this.activeColIdx>=0?this.activeNode.getColElem(this.activeColIdx):null}getActiveNode(){return this.activeNode}getFirstChild(){return this.root.getFirstChild()}getFocusNode(){return this.focusNode}static getEventInfo(e){const t=e.target,i=t.classList,s=t.closest("span.wb-col"),n=ue.getNode(t),r=n?n.tree:ue.getTree(e),o={event:e,canonicalName:b(e),tree:r,node:n,region:L.unknown,colDef:void 0,colIdx:-1,colId:void 0,colElem:s};if(i.contains("wb-title"))o.region=L.title;else if(i.contains("wb-expander"))o.region=n.isExpandable()?L.expander:L.prefix;else if(i.contains("wb-checkbox"))o.region=L.checkbox;else if(i.contains("wb-icon"))o.region=L.icon;else if(i.contains("wb-node"))o.region=L.title;else if(s){o.region=L.column;const e=Array.prototype.indexOf.call(s.parentNode.children,s);o.colIdx=e}else{if(!i.contains("wb-row"))return"mousemove"===e.type||e instanceof KeyboardEvent||null==r||r.logWarn("getEventInfo(): not found",e,o),o;o.region=L.title}return-1===o.colIdx&&(o.colIdx=0),o.colDef=null==r?void 0:r.columns[o.colIdx],null!=o.colDef&&(o.colId=o.colDef.id),o}toString(){return`Wunderbaum<'${this.id}'>`}isEditing(){return this._callMethod("edit.isEditingTitle")}isLoading(){let e=!1;return this.root.visit((t=>{if(t._isLoading||t._requestId)return e=!0,!1}),!0),e}logDebug(...e){this.options.debugLevel>=4&&console.log(this.toString(),...e)}logError(...e){this.options.debugLevel>=1&&console.error(this.toString(),...e)}logInfo(...e){this.options.debugLevel>=3&&console.info(this.toString(),...e)}logTime(e){return this.options.debugLevel>=4&&console.time(this+": "+e),e}logTimeEnd(e){this.options.debugLevel>=4&&console.timeEnd(this+": "+e)}logWarn(...e){this.options.debugLevel>=2&&console.warn(this.toString(),...e)}scrollTo(e){let t,i;e instanceof de?t=e:(i=e,t=i.node),o(t&&null!=t._rowIdx,`Invalid node: ${t}`);const s=this.element,n=this.headerElement.clientHeight,r=s.scrollTop,l=s.clientHeight,a=t._rowIdx*G+n,d=n,c=a-r,h=c+G,u=null==i?void 0:i.topNode;let p=null;c>=d?h<=l||(p=a+G-l+2):p=a-d-2,null!=p&&(this.log(`scrollTo(${a}): ${r} => ${p}`),s.scrollTop=p,u&&this.scrollTo(u))}scrollToHorz(){const e=this.columns[0]._widthPx,t=this.element.clientWidth,i=this.element.scrollLeft,s=this.getActiveColElem(),n=Number.parseInt(null==s?void 0:s.style.left,10),r=n+Number.parseInt(null==s?void 0:s.style.width,10);let o=i;n-it&&(o=r-t),o=Math.max(0,o),this.log(`scrollToHorz(${this.activeColIdx}): ${n}..${r}, fixedOfs=${e}, vpWidth=${t}, curLeft=${i} -> ${o}`),this.element.scrollLeft=o}setColumn(e){var t;if(o(this.isCellNav(),"Exected cellNav mode"),o(0<=e&&e0&&(s?this._updateViewportImmediately():this._updateViewportThrottled())}setEnabled(e=!0){const t=this.enabled;return this.enabled=!!e,this.element.classList.toggle("wb-disabled",!e),t}isEnabled(){return this.enabled}isGrid(){return this.columns&&this.columns.length>1}isCellNav(){return!!this._cellNavMode}isRowNav(){return!this._cellNavMode}setCellNav(e=!0){var t;const i=this._cellNavMode;this._cellNavMode=!!e,e&&!i&&this.setColumn(0),this.element.classList.toggle("wb-cell-mode",e),null===(t=this.activeNode)||void 0===t||t.update(D.status)}setNavigationOption(e,t=!1){if(this.isGrid()||e===M.row)switch(this.options.navigationModeOption=e,e){case M.cell:this.setCellNav(!0);break;case M.row:this.setCellNav(!1);break;case M.startCell:t&&this.setCellNav(!0);break;case M.startRow:t&&this.setCellNav(!1);break;default:a(`Invalid mode '${e}'.`)}else this.logWarn("Plain trees only support row navigation mode.")}setStatus(e,t){return this.root.setStatus(e,t)}setTypes(e,t=!0){o(x(e),`Expected plain objext: ${e}`),t?this.types=e:y(this.types,e);for(const e of Object.values(this.types))e.classes&&(e.classes=N(e.classes))}sortChildren(e=ee,t=!1){this.root.sortChildren(e,t)}toDictArray(e){var t;return null!==(t=this.root.toDict(!0,e).children)&&void 0!==t?t:[]}_updateColumnWidths(){const e=this.element.clientWidth,t=this.columns,i=t[0];let s=0,n=0,r=0,o=!1;if("*"!==i.id)throw new Error(`First column must have id '*': got '${i.id}'.`);this._columnsById={};for(const e of t){this._columnsById[e.id]=e;const t=e.width;if("*"===e.id&&e!==i)throw new Error(`Column id '*' must be defined only once: '${e.title}'.`);if(t&&"*"!==t)if("number"==typeof t)e._weight=t,n+=t;else if("string"==typeof t&&t.endsWith("px")){e._weight=0;const i=parseFloat(t.slice(0,-2));e._widthPx!=i&&(o=!0,e._widthPx=i),r+=i}else a(`Invalid column width: ${t} (expected string ending with 'px' or number, e.g. "px" or ).`);else e._weight=1,n+=1}const l=Math.max(0,e-r);let d=0;for(const e of t){let t;if(e._weight){const i=e.minWidth;t="number"==typeof i?i:"string"==typeof i&&i.endsWith("px")?parseFloat(i.slice(0,-2)):4;const s=Math.max(t,l*e._weight/n);e._widthPx!=s&&(o=!0,e._widthPx=s)}e._ofsPx=d,d+=e._widthPx}t[t.length-1]._widthPx-=1,s=d-1;const c=`${s}px`;return this.headerElement.style.width=c,this.listContainerElement.style.width=c,o}_renderHeaderMarkup(){o(this.headerElement,"Expected a headerElement");const e=this.hasHeader();if(p(this.headerElement,e),!e)return;const t=this.columns.length,i=this.headerElement.querySelector(".wb-row");o(i,"Expected a row in header element"),i.innerHTML=" ".repeat(t);for(let e=0;e'),n.innerHTML=`${r} ${l}`,this.isCellNav()&&n.classList.toggle("wb-active",e===this.activeColIdx)}}updatePendingModifications(){this.pendingChangeTypes.size>0&&this._updateViewportImmediately()}_updateViewportImmediately(){var e;if(this._disableUpdateCount)return this.log(`_updateViewportImmediately() IGNORED (disable level: ${this._disableUpdateCount})`),void this._disableUpdateIgnoreCount++;const t=I,i=new Set(this.pendingChangeTypes);this.pendingChangeTypes.clear();if(i.has(t.scroll)&&1===i.size)this._updateRows({newNodesOnly:!0});else{if(this.log("_updateViewportImmediately():",i),!1!==this.options.adjustHeight){let e=this.listContainerElement.clientHeight;const t=this.headerElement.clientHeight,i=this.element.clientHeight-t-1;Math.abs(e-i)>1&&(this.listContainerElement.style.height=i+"px",e=i)}i.has(t.clearMarkup)&&this.visit((e=>{e.removeMarkup()})),i.has(t.header)&&(this._updateColumnWidths(),this._renderHeaderMarkup()),this._updateRows()}if(this.options.connectTopBreadcrumb){let t=null===(e=this.getTopmostVpNode(!0))||void 0===e?void 0:e.getPath(!1,"title"," > ");t=t?t+" >":"",this.options.connectTopBreadcrumb.textContent=t}this._callEvent("update")}_updateRows(e){const t=!!(e=Object.assign({newNodesOnly:!1},e)).newNodesOnly,i=this.element.clientHeight,s=this.element.scrollTop;let n=Math.max(0,s/22-5);n=Math.floor(n),n%2&&n--;let r=Math.max(0,(s+i)/22+5);r=Math.ceil(r);const o=new Set;this.nodeListElement.childNodes.forEach((e=>{const t=e;o.add(t._wb_node)}));let l=0,a=0,d=!1,c="first";this.visitRows((function(e){const i=e._rowElem;e._rowIdx!==l&&(e._rowIdx=l,d=!0),lr?i&&(c=i):i&&t?(o.delete(e),i.style.top=l*G+"px",c=i):(o.delete(e),i&&(i.style.top=l*G+"px"),e._render({top:a,after:c}),c=e._rowElem),l++,a+=22})),this.treeRowCount=l;for(const e of o)e._callEvent("discard"),e.removeMarkup();return this.nodeListElement.style.height=`${a}px`,d}visit(e){return this.root.visit(e,!1)}visitRows(e,t){if(!this.root.hasChildren())return!1;if(t&&t.reverse)return delete t.reverse,this._visitRowsUp(e,t);let i,s,n,r,l,a,d=0,c=!1===(t=t||{}).includeSelf,h=t.start||this.root.children[0];const u=!!t.includeHidden,p=!u&&"hide"===this.filterMode;for(n=h.parent;n;){for(l=n.children,s=l.indexOf(h)+d,o(s>=0,`Could not find ${h} in parent's children: ${n}`),i=s;it!==a&&(!p||t.match||t.subMatchCount?!1!==e(t)&&(u||!t.children||t.expanded?void 0:"skip"):"skip")),!1),!1===r))return!1}}h=n,n=n.parent,d=1,!n&&t.wrap&&(this.logDebug("visitRows(): wrap around"),o(t.start,"`wrap` option requires `start`"),a=t.start,t.wrap=!1,n=this.root,d=0)}return!0}_visitRowsUp(e,t){let i,s,n,r=t.start||this.root.children[0];const o=!!t.includeHidden;if(!1!==t.includeSelf&&!1===e(r))return!1;for(;;){if(n=r.parent,i=n.children,i[0]===r){if(r=n,!r.parent)break;i=n.children}else for(s=i.indexOf(r),r=i[s-1];(o||r.expanded)&&r.children&&r.children.length;)i=r.children,n=r,r=i[i.length-1];if((o||r.isVisible())&&!1===e(r))return!1}return!0}load(e){return this.clear(),this.root.load(e)}enableUpdate(e){e?(o(this._disableUpdateCount>0,"enableUpdate(true) was called too often"),this._disableUpdateCount--,0===this._disableUpdateCount&&(this.logDebug(`enableUpdate(): active again. Re-painting to catch up with ${this._disableUpdateIgnoreCount} ignored update requests...`),this._disableUpdateIgnoreCount=0,this.update(D.any,{immediate:!0}))):this._disableUpdateCount++}filterNodes(e,t){return this.extensions.filter.filterNodes(e,t)}filterBranches(e,t){return this.extensions.filter.filterBranches(e,t)}clearFilter(){return this.extensions.filter.clearFilter()}isFilterActive(){return!!this.filterMode}updateFilter(){return this.extensions.filter.updateFilter()}}ue.sequence=0,ue.version="v0.7.0",ue.util=O,e.Wunderbaum=ue}));
+ * wunderbaum.ts
+ *
+ * A treegrid control.
+ *
+ * Copyright (c) 2021-2023, Martin Wendt (https://wwWendt.de).
+ * https://github.com/mar10/wunderbaum
+ *
+ * Released under the MIT license.
+ * @version v0.8.0
+ * @date Thu, 11 Jan 2024 19:37:23 GMT
+ */class ue extends ce{constructor(e){super(e,null,{key:"__root__",title:e.id})}toString(){return`WbSystemRoot@${this.key}<'${this.tree.id}'>`}}class pe{constructor(e){this.enabled=!0,this.data={},this.extensionList=[],this.extensions={},this.keyMap=new Map,this.refKeyMap=new Map,this.treeRowCount=0,this._disableUpdateCount=0,this._disableUpdateIgnoreCount=0,this.activeNode=null,this.focusNode=null,this.types={},this.columns=[],this._columnsById={},this.pendingChangeTypes=new Set,this._util=U,this.filterMode=null,this.activeColIdx=0,this._cellNavMode=!1,this.lastQuicksearchTime=0,this.lastQuicksearchTerm="",this.lastClickTime=0,this.log=this.logDebug;const t=this.options=N({id:null,source:null,element:null,debugLevel:3,header:null,rowHeightPx:Q,iconMap:"bootstrap",columns:null,types:null,enabled:!0,fixedCol:!1,showSpinner:!1,checkbox:!1,minExpandLevel:0,emptyChildListExpandable:!1,skeleton:!1,connectTopBreadcrumb:null,selectMode:"multi",navigationModeOption:null,quicksearch:!0,iconBadge:null,change:null,error:null,receive:null,strings:{loadError:"Error",loading:"Loading...",noData:"No data"}},e),i=new le;this.ready=i.promise();let s=!1;if(this.ready.then((()=>{s=!0;try{this._callEvent("init")}catch(e){this.logError("Exception inside `init(e)` event:",e)}})).catch((e=>{if(s)throw e;this._callEvent("init",{error:e})})),this.id=t.id||"wb_"+ ++pe.sequence,this.root=new ue(this),this._registerExtension(new B(this)),this._registerExtension(new he(this)),this._registerExtension(new W(this)),this._registerExtension(new ne(this)),this._registerExtension(new oe(this)),this._registerExtension(new G(this)),this._updateViewportThrottled=A(this._updateViewportImmediately.bind(this),{}),this.columns=t.columns,delete t.columns,!this.columns||!this.columns.length){const e="string"==typeof t.header?t.header:this.id;this.columns=[{id:"*",title:e,width:"*"}]}t.types&&this.setTypes(t.types,!0),delete t.types,this.element=k(t.element),f(!!this.element,`Invalid 'element' option: ${t.element}`),this.element.classList.add("wunderbaum"),this.element.getAttribute("tabindex")||(this.element.tabIndex=0),this.element._wb_tree=this,this.headerElement=this.element.querySelector("div.wb-header");const n=null==t.header?this.columns.length>1:!!t.header;if(this.headerElement){f(!this.columns,"`opts.columns` must not be set if markup already contains a header"),this.columns=[];const e=this.headerElement.querySelector("div.wb-row");for(const t of e.querySelectorAll("div"))this.columns.push({id:t.dataset.id||`col_${this.columns.length}`,title:""+t.textContent,width:"*"})}else{const e=" ".repeat(this.columns.length);if(this.element.innerHTML=`\n `,!n){this.element.querySelector("div.wb-header").style.display="none"}}this.element.innerHTML+='\n ',this.listContainerElement=this.element.querySelector("div.wb-list-container"),this.nodeListElement=this.listContainerElement.querySelector("div.wb-node-list"),this.headerElement=this.element.querySelector("div.wb-header"),this.element.classList.toggle("wb-grid",this.columns.length>1),this._initExtensions(),["enabled","fixedCol"].forEach((e=>{null!=t[e]&&this.setOption(e,t[e])})),t.source?(t.showSpinner&&(this.nodeListElement.innerHTML="loading... "),this.load(t.source).then((()=>{null==t.navigationModeOption?this.isGrid()?this.setNavigationOption(z.cell):this.setNavigationOption(z.row):this.setNavigationOption(t.navigationModeOption),this.update($.structure,{immediate:!0}),i.resolve()})).catch((e=>{i.reject(e)})).finally((()=>{var e;null===(e=this.element.querySelector("progress.spinner"))||void 0===e||e.remove(),this.element.classList.remove("wb-initializing")}))):i.resolve(),this.update($.any),this.element.addEventListener("scroll",(e=>{this.update($.scroll)})),this.resizeObserver=new ResizeObserver((e=>{this.update($.resize)})),this.resizeObserver.observe(this.element),I(this.nodeListElement,"click","div.wb-row",(t=>{const i=pe.getEventInfo(t),s=i.node,n=t;if(!1===this._callEvent("click",{event:t,node:s,info:i}))return this.lastClickTime=Date.now(),!1;if(s){if(n.ctrlKey)return void s.toggleSelected();const r=this.getOption("edit.trigger"),o=this.getOption("edit.slowClickDelay");r.indexOf("clickActive")>=0&&"title"===i.region&&s.isActive()&&(!o||Date.now()-this.lastClickTime=0?s.setActive(!0,{colIdx:i.colIdx,event:t}):s.setActive(!0,{event:t}),i.region===F.expander?s.setExpanded(!s.isExpanded(),{scrollIntoView:!1!==e.scrollIntoViewOnExpandClick}):i.region===F.checkbox&&s.toggleSelected()}this.lastClickTime=Date.now()})),I(this.nodeListElement,"dblclick","div.wb-row",(e=>{const t=pe.getEventInfo(e),i=t.node;if(!1===this._callEvent("dblclick",{event:e,node:i,info:t}))return!1;i&&0===t.colIdx&&i.isExpandable()&&(this._callMethod("edit._stopEditTitle"),i.setExpanded(!i.isExpanded()))})),I(this.element,"keydown",(e=>{const t=pe.getEventInfo(e),i=C(e),s=t.node||this.getFocusNode();this._callHook("onKeyEvent",{event:e,node:s,info:t,eventName:i})})),I(this.element,"focusin focusout",(e=>{const i="focusin"===e.type,s=pe.getNode(e);this._callEvent("focus",{flag:i,event:e}),i&&this.isRowNav()&&!this.isEditingTitle()&&(t.navigationModeOption===z.row?null==s||s.setActive():this.setCellNav()),i||this._callMethod("edit._stopEditTitle",!0,{event:e,forceClose:!0})}))}static getTree(e){if(e instanceof pe)return e;if(e instanceof ce)return e.tree;if(void 0===e&&(e=0),"number"==typeof e)e=document.querySelectorAll(".wunderbaum")[e];else if("string"==typeof e){for(const t of document.querySelectorAll(".wunderbaum")){const i=t._wb_tree;if(i&&i.id===e)return i}if(!(e=document.querySelector(e)))return null}else e.target&&(e=e.target);return f(e instanceof Element,`Invalid el type: ${e}`),e.matches(".wunderbaum")||(e=e.closest(".wunderbaum")),e&&e._wb_tree?e._wb_tree:null}get iconMap(){const e=this.options.iconMap;return"string"==typeof e?J[e]:e}static getNode(e){if(!e)return null;if(e instanceof ce)return e;for(void 0!==e.target&&(e=e.target);e;){if(e._wb_node)return e._wb_node;e=e.parentElement}return null}*[Symbol.iterator](){yield*this.root}_registerExtension(e){this.extensionList.push(e),this.extensions[e.id]=e}_initExtensions(){for(const e of this.extensionList)e.init()}_registerNode(e){const t=e.key;f(null!=t&&!this.keyMap.has(t),`Missing or duplicate key: '${t}'.`),this.keyMap.set(t,e);const i=e.refKey;if(null!=i){const t=this.refKeyMap.get(i);t?t.add(e):this.refKeyMap.set(i,new Set([e]))}}_unregisterNode(e){const t=e.refKey;if(null!=t){const i=this.refKeyMap.get(t);i&&i.delete(e)&&!i.size&&this.refKeyMap.delete(t)}this.keyMap.delete(e.key),e.tree=null,e.parent=null,e.removeMarkup()}_callHook(e,t={}){let i;const s=N({},{tree:this,options:this.options,result:void 0},t);for(const t of this.extensionList){if(i=t[e].call(t,s),!1===i)break;void 0!==s.result&&(i=s.result)}return i}_callMethod(e,...t){const[i,s]=e.split("."),n=s?this.extensions[i]:this,r=n[s];if(r)return r.apply(n,t);this.logError(`Calling undefined method '${e}()'.`)}_callEvent(e,t){const[i,s]=e.split("."),n=this.options,r=s?n[i][s]:n[i];if(r)return r.call(this,N({type:e,tree:this,util:this._util},t))}_getNodeByRowIdx(e){let t=null;return this.visitRows((i=>{if(i._rowIdx===e)return t=i,!1})),t}getTopmostVpNode(e=!0){const t=this.element.scrollTop;let i;return i=e?Math.ceil((t-1)/Q):Math.floor(t/Q),this._getNodeByRowIdx(i)}getLowestVpNode(e=!0){const t=this.element,i=this.headerElement.clientHeight,s=t.scrollTop,n=t.clientHeight-i;let r;return r=e?Math.floor((s+n)/Q)-1:Math.ceil((s+n)/Q)-1,r=Math.min(r,this.count(!0)-1),this._getNodeByRowIdx(r)}_getPrevNodeInView(e,t=1){return this.visitRows((i=>{if(e=i,t--<=0)return!1}),{reverse:!0,start:e||this.getActiveNode()}),e}_getNextNodeInView(e,t=1){return this.visitRows((i=>{if(e=i,t--<=0)return!1}),{reverse:!1,start:e||this.getActiveNode()}),e}addChildren(e,t){return this.root.addChildren(e,t)}applyCommand(e,t,i){let s,n;switch(t instanceof ce?s=t:(s=this.getActiveNode(),f(void 0===i,`Unexpected options: ${i}`),i=t),e){case"moveUp":n=s.getPrevSibling(),n&&(s.moveTo(n,"before"),s.setActive());break;case"moveDown":n=s.getNextSibling(),n&&(s.moveTo(n,"after"),s.setActive());break;case"indent":n=s.getPrevSibling(),n&&(s.moveTo(n,"appendChild"),n.setExpanded(),s.setActive());break;case"outdent":s.isTopLevel()||(s.moveTo(s.getParent(),"after"),s.setActive());break;case"remove":n=s.getPrevSibling()||s.getParent(),s.remove(),n&&n.setActive();break;case"addChild":this._callMethod("edit.createNode","prependChild");break;case"addSibling":this._callMethod("edit.createNode","after");break;case"rename":s.startEditTitle();break;case"down":case"first":case"last":case"left":case"pageDown":case"pageUp":case"parent":case"right":case"up":return s.navigate(e);default:v(`Unhandled command: '${e}'`)}}clear(){this.root.removeChildren(),this.root.children=null,this.keyMap.clear(),this.refKeyMap.clear(),this.treeRowCount=0,this.activeNode=null,this.focusNode=null,this.update($.structure)}destroy(){this.logInfo("destroy()..."),this.clear(),this.resizeObserver.disconnect(),this.element.innerHTML="",this.element.outerHTML=this.element.outerHTML}getOption(e,t){let i,s=this.options;e.indexOf(".")>=0&&([i,e]=e.split("."),s=s[i]);let n=s[e];return"function"==typeof n&&(n=n({type:"resolve",tree:this})),null!=n?n:t}setOption(e,t){if(e.indexOf(".")>=0){const i=e.split(".");this.extensions[i[0]].setPluginOption(i[1],t)}else switch(this.options[e]=t,e){case"checkbox":this.update($.any);break;case"enabled":this.setEnabled(!!t);break;case"fixedCol":this.element.classList.toggle("wb-fixed-col",!!t)}}hasFocus(){return this.element.contains(document.activeElement)}hasHeader(){const e=this.options.header;return this.isGrid()?!1!==e:!!e}runWithDeferredUpdate(e,t=null){try{this.enableUpdate(!1);const t=e();return f(!(t instanceof Promise),`Promise return not allowed: ${t}`),t}finally{this.enableUpdate(!0)}}async expandAll(e=!0,t){await this.root.expandAll(e,t)}selectAll(e=!0){return this.root.setSelected(e,{propagateDown:!0})}toggleSelect(){this.selectAll(this.root._anySelectable())}getSelectedNodes(e=!1){return this.root.getSelectedNodes(e)}_selectRange(e){this.logDebug("_selectRange",e),v("Not yet implemented.")}count(e=!1){return e?this.treeRowCount:this.keyMap.size}_check(){let e=0;this.visit((t=>{e++})),this.keyMap.size!==e&&this.logWarn(`_check failed: ${this.keyMap.size} !== ${e}`)}findAll(e){return this.root.findAll(e)}findByRefKey(e){const t=this.refKeyMap.get(e);return t?Array.from(t):[]}findFirst(e){return this.root.findFirst(e)}findKey(e){return this.keyMap.get(e)||null}findNextNode(e,t){let i=null;const s=this.getFirstChild(),n="string"==typeof e?function(e){e=y(e);const t=new RegExp("^"+e,"i");return function(e){return t.test(e.title)}}(e):e;function r(e){if(n(e)&&(i=e),i||e===t)return!1}return t=t||s,this.visitRows(r,{start:t,includeSelf:!1}),i||t===s||this.visitRows(r,{start:s,includeSelf:!0}),i}findRelatedNode(e,t,i=!1){let s=null;const n=Math.floor(this.listContainerElement.clientHeight/Q);switch(t){case"parent":case"left":e.parent&&e.parent.parent&&(s=e.parent);break;case"first":this.visit((e=>{if(e.isVisible())return s=e,!1}));break;case"last":this.visit((e=>{e.isVisible()&&(s=e)}));break;case"right":e.children&&e.children.length&&(s=e.children[0]);break;case"up":s=this._getPrevNodeInView(e);break;case"down":s=this._getNextNodeInView(e);break;case"pageDown":{const t=this.getLowestVpNode();s=e._rowIdxt._rowIdx?t:this._getPrevNodeInView(e,n)}break;default:this.logWarn("Unknown relation '"+t+"'.")}return s}*format_iter(e,t){yield*this.root.format_iter(e,t)}format(e,t){return this.root.format(e,t)}getActiveColElem(){return this.activeNode&&this.activeColIdx>=0?this.activeNode.getColElem(this.activeColIdx):null}getActiveNode(){return this.activeNode}getFirstChild(){return this.root.getFirstChild()}getFocusNode(){return this.focusNode}static getEventInfo(e){const t=e.target,i=t.classList,s=t.closest("span.wb-col"),n=pe.getNode(t),r=n?n.tree:pe.getTree(e),o={event:e,canonicalName:C(e),tree:r,node:n,region:F.unknown,colDef:void 0,colIdx:-1,colId:void 0,colElem:s};if(i.contains("wb-title"))o.region=F.title;else if(i.contains("wb-expander"))o.region=n.isExpandable()?F.expander:F.prefix;else if(i.contains("wb-checkbox"))o.region=F.checkbox;else if(i.contains("wb-icon"))o.region=F.icon;else if(i.contains("wb-node"))o.region=F.title;else if(s){o.region=F.column;const e=Array.prototype.indexOf.call(s.parentNode.children,s);o.colIdx=e}else{if(!i.contains("wb-row"))return"mousemove"===e.type||e instanceof KeyboardEvent||null==r||r.logWarn("getEventInfo(): not found",e,o),o;o.region=F.title}return-1===o.colIdx&&(o.colIdx=0),o.colDef=null==r?void 0:r.columns[o.colIdx],null!=o.colDef&&(o.colId=o.colDef.id),o}toString(){return`Wunderbaum<'${this.id}'>`}isEditing(){return!!this.nodeListElement.querySelector("input:focus,select:focus")}isEditingTitle(){return this._callMethod("edit.isEditingTitle")}isLoading(){let e=!1;return this.root.visit((t=>{if(t._isLoading||t._requestId)return e=!0,!1}),!0),e}logDebug(...e){this.options.debugLevel>=4&&console.log(this.toString(),...e)}logError(...e){this.options.debugLevel>=1&&console.error(this.toString(),...e)}logInfo(...e){this.options.debugLevel>=3&&console.info(this.toString(),...e)}logTime(e){return this.options.debugLevel>=4&&console.time(this+": "+e),e}logTimeEnd(e){this.options.debugLevel>=4&&console.timeEnd(this+": "+e)}logWarn(...e){this.options.debugLevel>=2&&console.warn(this.toString(),...e)}scrollTo(e){let t,i;e instanceof ce?t=e:(i=e,t=i.node),f(t&&null!=t._rowIdx,`Invalid node: ${t}`);const s=this.element,n=this.headerElement.clientHeight,r=s.scrollTop,o=s.clientHeight,l=t._rowIdx*Q+n,a=n,d=l-r,c=d+Q,h=null==i?void 0:i.topNode;let u=null;d>=a?c<=o||(u=l+Q-o+2):u=l-a-2,null!=u&&(this.log(`scrollTo(${l}): ${r} => ${u}`),s.scrollTop=u,h&&this.scrollTo(h))}scrollToHorz(){const e=this.columns[0]._widthPx,t=this.element.clientWidth,i=this.element.scrollLeft,s=this.getActiveColElem(),n=Number.parseInt(null==s?void 0:s.style.left,10),r=n+Number.parseInt(null==s?void 0:s.style.width,10);let o=i;n-it&&(o=r-t),o=Math.max(0,o),this.log(`scrollToHorz(${this.activeColIdx}): ${n}..${r}, fixedOfs=${e}, vpWidth=${t}, curLeft=${i} -> ${o}`),this.element.scrollLeft=o}setColumn(e,t){var i,s,n;const r=null==t?void 0:t.edit,o=!1!==(null==t?void 0:t.scrollIntoView);if(f(this.isCellNav(),"Expected cellNav mode"),"string"==typeof e){const t=e;f((e=this.columns.findIndex((t=>t.id===e)))>=0,`Invalid colId: ${t}`)}if(f(0<=e&&e0&&(s?this._updateViewportImmediately():this._updateViewportThrottled())}}setEnabled(e=!0){const t=this.enabled;return this.enabled=!!e,this.element.classList.toggle("wb-disabled",!e),t}isEnabled(){return this.enabled}isGrid(){return this.columns&&this.columns.length>1}isCellNav(){return!!this._cellNavMode}isRowNav(){return!this._cellNavMode}setCellNav(e=!0){var t;const i=this._cellNavMode;this._cellNavMode=!!e,e&&!i&&this.setColumn(0),this.element.classList.toggle("wb-cell-mode",e),null===(t=this.activeNode)||void 0===t||t.update($.status)}setNavigationOption(e,t=!1){if(this.isGrid()||e===z.row)switch(this.options.navigationModeOption=e,e){case z.cell:this.setCellNav(!0);break;case z.row:this.setCellNav(!1);break;case z.startCell:t&&this.setCellNav(!0);break;case z.startRow:t&&this.setCellNav(!1);break;default:v(`Invalid mode '${e}'.`)}else this.logWarn("Plain trees only support row navigation mode.")}setStatus(e,t){return this.root.setStatus(e,t)}setTypes(e,t=!0){f(T(e),`Expected plain objext: ${e}`),t?this.types=e:N(this.types,e);for(const e of Object.values(this.types))e.classes&&(e.classes=O(e.classes))}sortChildren(e=te,t=!1){this.root.sortChildren(e,t)}toDictArray(e){var t;return null!==(t=this.root.toDict(!0,e).children)&&void 0!==t?t:[]}_updateColumnWidths(){const e=this.element.clientWidth,t=this.columns,i=t[0];let s=0,n=0,r=0,o=!1;if("*"!==i.id)throw new Error(`First column must have id '*': got '${i.id}'.`);this._columnsById={};for(const e of t){this._columnsById[e.id]=e;const t=e.width;if("*"===e.id&&e!==i)throw new Error(`Column id '*' must be defined only once: '${e.title}'.`);if(t&&"*"!==t)if("number"==typeof t)e._weight=t,n+=t;else if("string"==typeof t&&t.endsWith("px")){e._weight=0;const i=parseFloat(t.slice(0,-2));e._widthPx!=i&&(o=!0,e._widthPx=i),r+=i}else v(`Invalid column width: ${t} (expected string ending with 'px' or number, e.g. "px" or ).`);else e._weight=1,n+=1}const l=Math.max(0,e-r);let a=0;for(const e of t){let t;if(e._weight){const i=e.minWidth;t="number"==typeof i?i:"string"==typeof i&&i.endsWith("px")?parseFloat(i.slice(0,-2)):4;const s=Math.max(t,l*e._weight/n);e._widthPx!=s&&(o=!0,e._widthPx=s)}e._ofsPx=a,a+=e._widthPx}t[t.length-1]._widthPx-=1,s=a-1;const d=`${s}px`;return this.headerElement.style.width=d,this.listContainerElement.style.width=d,o}_renderHeaderMarkup(){f(this.headerElement,"Expected a headerElement");const e=this.hasHeader();if(E(this.headerElement,e),!e)return;const t=this.columns.length,i=this.headerElement.querySelector(".wb-row");f(i,"Expected a row in header element"),i.innerHTML=" ".repeat(t);for(let e=0;e'),n.innerHTML=`${r} ${l}`,this.isCellNav()&&n.classList.toggle("wb-active",e===this.activeColIdx)}}updatePendingModifications(){this.pendingChangeTypes.size>0&&this._updateViewportImmediately()}_updateViewportImmediately(){var e;if(this._disableUpdateCount)return this.log(`_updateViewportImmediately() IGNORED (disable level: ${this._disableUpdateCount}).`),void this._disableUpdateIgnoreCount++;this._updateViewportThrottled.pending()&&this._updateViewportThrottled.cancel();const t=P,i=new Set(this.pendingChangeTypes);this.pendingChangeTypes.clear();if(i.has(t.scroll)&&1===i.size)this._updateRows({newNodesOnly:!0});else{if(this.log("_updateViewportImmediately():",i),!1!==this.options.adjustHeight){let e=this.listContainerElement.clientHeight;const t=this.headerElement.clientHeight,i=this.element.clientHeight-t-1;Math.abs(e-i)>1&&(this.listContainerElement.style.height=i+"px",e=i)}i.has(t.clearMarkup)&&this.visit((e=>{e.removeMarkup()})),i.has(t.header)&&(this._updateColumnWidths(),this._renderHeaderMarkup()),this._updateRows()}if(this.options.connectTopBreadcrumb){let t=null===(e=this.getTopmostVpNode(!0))||void 0===e?void 0:e.getPath(!1,"title"," > ");t=t?t+" >":"",this.options.connectTopBreadcrumb.textContent=t}this._callEvent("update")}_updateRows(e){const t=!!(e=Object.assign({newNodesOnly:!1},e)).newNodesOnly,i=this.element.clientHeight,s=this.element.scrollTop;let n=Math.max(0,s/22-5);n=Math.floor(n),n%2&&n--;let r=Math.max(0,(s+i)/22+5);r=Math.ceil(r);const o=new Set;this.nodeListElement.childNodes.forEach((e=>{const t=e;o.add(t._wb_node)}));let l=0,a=0,d=!1,c="first";this.visitRows((function(e){const i=e._rowElem;e._rowIdx!==l&&(e._rowIdx=l,d=!0),lr?i&&(c=i):i&&t?(o.delete(e),i.style.top=l*Q+"px",c=i):(o.delete(e),i&&(i.style.top=l*Q+"px"),e._render({top:a,after:c}),c=e._rowElem),l++,a+=22})),this.treeRowCount=l;for(const e of o)e._callEvent("discard"),e.removeMarkup();return this.nodeListElement.style.height=`${a}px`,d}visit(e){return this.root.visit(e,!1)}visitRows(e,t){if(!this.root.hasChildren())return!1;if(t&&t.reverse)return delete t.reverse,this._visitRowsUp(e,t);let i,s,n,r,o,l,a=0,d=!1===(t=t||{}).includeSelf,c=t.start||this.root.children[0];const h=!!t.includeHidden,u=!h&&"hide"===this.filterMode;for(n=c.parent;n;){for(o=n.children,s=o.indexOf(c)+a,f(s>=0,`Could not find ${c} in parent's children: ${n}`),i=s;it!==l&&(!u||t.match||t.subMatchCount?!1!==e(t)&&(h||!t.children||t.expanded?void 0:"skip"):"skip")),!1),!1===r))return!1}}c=n,n=n.parent,a=1,!n&&t.wrap&&(this.logDebug("visitRows(): wrap around"),f(t.start,"`wrap` option requires `start`"),l=t.start,t.wrap=!1,n=this.root,a=0)}return!0}_visitRowsUp(e,t){let i,s,n,r=t.start||this.root.children[0];const o=!!t.includeHidden;if(!1!==t.includeSelf&&!1===e(r))return!1;for(;;){if(n=r.parent,i=n.children,i[0]===r){if(r=n,!r.parent)break;i=n.children}else for(s=i.indexOf(r),r=i[s-1];(o||r.expanded)&&r.children&&r.children.length;)i=r.children,n=r,r=i[i.length-1];if((o||r.isVisible())&&!1===e(r))return!1}return!0}load(e){return this.clear(),this.root.load(e)}enableUpdate(e){e?(f(this._disableUpdateCount>0,"enableUpdate(true) was called too often"),this._disableUpdateCount--,0===this._disableUpdateCount&&(this.logDebug(`enableUpdate(): active again. Re-painting to catch up with ${this._disableUpdateIgnoreCount} ignored update requests...`),this._disableUpdateIgnoreCount=0,this.update($.any,{immediate:!0}))):this._disableUpdateCount++}filterNodes(e,t){return this.extensions.filter.filterNodes(e,t)}filterBranches(e,t){return this.extensions.filter.filterBranches(e,t)}clearFilter(){return this.extensions.filter.clearFilter()}isFilterActive(){return!!this.filterMode}updateFilter(){return this.extensions.filter.updateFilter()}}pe.sequence=0,pe.version="v0.8.0",pe.util=U,e.Wunderbaum=pe}));
//# sourceMappingURL=wunderbaum.umd.min.js.map
\ No newline at end of file
diff --git a/dist/wunderbaum.umd.min.js.map b/dist/wunderbaum.umd.min.js.map
index 08270245..96e2714e 100644
--- a/dist/wunderbaum.umd.min.js.map
+++ b/dist/wunderbaum.umd.min.js.map
@@ -1 +1 @@
-{"version":3,"file":"wunderbaum.umd.js","names":["global","factory","exports","module","define","amd","globalThis","self","mar10","this","MOUSE_BUTTONS","isMac","nav","navigator","test","platform","_getUserInfo","REX_HTML","REX_TOOLTIP","ENTITY_MAP","assert","cond","msg","Error","documentReady","callback","document","readyState","addEventListener","error","escapeHtml","s","replace","escapeRegex","escapeTooltip","getValueFromElem","elem","coerce","tag","tagName","value","classList","contains","span","embeddedInput","querySelector","innerText","input","type","indeterminate","checked","valueAsDate","valueAsNumber","name","parentElement","undefined","setElemDisplay","flag","style","elemFromSelector","display","elemFromHtml","html","t","createElement","innerHTML","trim","content","firstElementChild","_IGNORE_KEYS","Set","obj","eventTargetFromSelector","eventToString","event","key","et","altKey","push","ctrlKey","metaKey","shiftKey","button","has","join","extend","args","i","length","arg","Object","prototype","hasOwnProperty","call","isArray","Array","isEmptyObject","keys","constructor","isPlainObject","toString","onEvent","rootTarget","eventNames","selectorOrHandler","handlerOrNone","selector","handler","split","forEach","evn","e","target","matches","closest","overrideMethod","instance","methodName","ctx","prevSuper","prevSuperApply","prevFunc","_super","apply","_superApply","argsArray","getOption","opts","defaultValue","ext","indexOf","toSet","val","set","c","add","adaptiveThrottle","options","waiting","pendingArgs","assign","minDelay","defaultDelay","maxDelay","delayFactor","Math","max","throttledFn","useArgs","start","Date","now","console","elap","curDelay","min","useDelay","setTimeout","ChangeType","RenderFlag","NodeStatusType","NodeRegion","NavModeEnum","util","freeze","__proto__","Deferred","thens","catches","status","resolve","resolvedValue","reject","rejectedError","then","cb","unshift","promise","catch","MAX_INT","documentReadyPromise","Promise","each","k","extractHtmlText","isFunction","noop","setTimeoutPromise","ms","err","setValueToElem","select","selectedIndex","sleep","async","toggleCheckbox","element","tristate","toLowerCase","WunderbaumExtension","tree","id","defaults","enabled","treeOpts","extensionOpts","getPluginOption","init","_a","setPluginOption","setEnabled","onKeyEvent","data","onRender","freeGlobal","freeGlobalThis","freeSelf","root","Function","isObject","debounce","func","wait","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","useRAF","requestAnimationFrame","TypeError","invokeFunc","time","thisArg","startTimer","pendingFunc","cancelAnimationFrame","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","timeSinceLastInvoke","timeWaiting","remainingWait","debounced","isInvoking","leadingEdge","cancel","clearTimeout","cancelTimer","flush","pending","START_MARKER","END_MARKER","RE_START_MARKER","RegExp","RE_END_MARTKER","FilterExtension","super","connectInput","autoApply","autoExpand","counter","fuzzy","hideExpandedCounter","hideExpanders","highlight","leavesOnly","mode","noData","lastFilterArgs","queryInput","filterNodes","filterMode","updateFilter","_applyFilterNoUpdate","filter","branchMode","_opts","runWithDeferredUpdate","_applyFilterImpl","match","temp","count","prevAutoCollapse","autoCollapse","hideMode","logInfo","clearFilter","map","reduce","a","b","re","reHighlight","node","title","text","res","escapeTitles","matchingIndices","_matchingArrIdx","_mIdx","textPoses","v","_markFuzzyMatchedChars","titleWithHighlight","arguments","toggle","subMatchCount","visit","setStatus","ok","children","matchedByBranch","parent","visitParents","p","expanded","setExpanded","noAnimation","noEvents","_filterAutoExpanded","filterBranches","logWarn","enableUpdate","remove","KeynavExtension","_getEmbeddedInputElem","ace","getActiveColElem","_isCurInputFocused","activate","autoActivate","curInput","inputHasFocus","navModeOption","navigationModeOption","focusNode","eventName","handled","isEnabled","_callEvent","_callMethod","currentNode","getFocusNode","getActiveNode","firstNode","getFirstChild","setActive","setFocus","isColspan","isRowNav","blur","_render","quicksearch","stamp","lastQuicksearchTime","lastQuicksearchTerm","matchNode","findNextNode","preventDefault","isActive","isExpanded","isExpandable","startCell","startRow","setCellNav","toggleSelected","navigate","curInputType","inputCanFocus","logDebug","setColumn","activeColIdx","focus","click","log","isCellNav","cell","columns","LoggerExtension","ignoreEvents","prefix","extra","ROW_HEIGHT","TEST_IMG","iconMaps","bootstrap","loading","expanderExpanded","expanderCollapsed","expanderLazy","checkChecked","checkUnchecked","checkUnknown","radioChecked","radioUnchecked","radioUnknown","folder","folderOpen","folderLazy","doc","fontawesome6","RESERVED_TREE_SOURCE_KEYS","KEY_TO_ACTION_DICT","Add","ArrowDown","ArrowLeft","ArrowRight","ArrowUp","Backspace","Divide","End","Home","Multiply","PageDown","PageUp","Subtract","makeNodeTitleMatcher","nodeTitleSorter","x","y","decompressSourceData","source","_format","_version","_keyMap","_valueMap","longToShort","shortToLong","entries","warn","_typeList","_b","_c","_positional","includes","positionalShort","newChildren","keyToNodeMap","indexToNodeMap","keyAttrName","childrenAttrName","index","nodeTuple","parentId","kwargs","positionalIdx","parentNode","unflattenSource","_iter","childList","getOwnPropertyNames","propName","longName","newValue","nodeMimeType","DndExtension","autoExpandMS","multiSource","effectAllowed","dropEffectDefault","guessDropEffect","preventForeignNodes","preventLazyParents","preventNonNodes","preventRecursion","preventSameParent","preventVoidMoves","serializeClipboardData","scroll","scrollSensitivity","scrollSpeed","sourceCopyHook","dragStart","drag","dragEnd","dragEnter","dragOver","dragExpand","drop","dragLeave","srcNode","lastTargetNode","lastEnterStamp","lastAllowedDropRegions","lastDropEffect","lastDropRegion","currentScrollDir","applyScrollDirThrottled","throttle","_applyScrollDir","dndOpts","dnd","onDragEvent","bind","onDropEvent","_leaveNode","ltn","setClass","unifyDragover","size","_calcDropRegion","allowed","dy","offsetY","_guessDropEffect","ea","canCopy","canLink","canMove","_isVoidDrop","targetNode","dropRegion","getNextSibling","getPrevSibling","isDragging","sp","scrollTop","_autoScroll","viewportY","sensitivity","headerHeight","headerElement","clientHeight","height","offsetHeight","scrollHeight","Wunderbaum","getNode","dataTransfer","isEditing","nodeData","toDict","n","_orgKey","_treeId","setData","JSON","stringify","types","srcTree","dt","dropEffect","isStatusNode","isLoaded","isAncestorOf","regionSet","clientY","offsetTop","region","_isLoading","stopPropagation","getData","parse","suggestedDropMode","suggestedDropEffect","sourceNode","sourceNodeData","DragObserver","dragElem","dragging","events","thresh","_handler","handleEvent","disconnect","removeEventListener","getDragElem","stopDrag","cb_event","dragstop","dx","pageX","pageY","dragstart","GridExtension","observer","window","handleDrag","info","getEventInfo","_promise","_resolve","_reject","reason","finally","NODE_PROPS","NODE_DICT_PROPS","delete","WunderbaumNode","refKey","classes","_requestId","_errorInfo","_partsel","_partload","_rowIdx","_rowElem","sequence","icon","lazy","statusNodeType","colspan","checkbox","radiogroup","selected","unselectable","_registerNode","Symbol","iterator","cl","l","typeInfo","addChildren","before","applyMinExpanLevel","_level","getLevel","nodeList","forceExpand","minExpandLevel","child","subChildren","isUnloaded","concat","findDirectChild","pos","splice","update","structure","addNode","applyCommand","cmd","collapseSiblings","className","cnSet","cn","expandAll","depth","loadLazy","force","keepActiveNodeVisible","expandOpts","scrollIntoView","logTime","level","level_1","promises","all","logTimeEnd","activeNode","findAll","matcher","ptr","findFirst","findRelatedNode","where","includeHidden","format_iter","name_cb","connectors","_is_last","ca","_format_line","parts","format","line","getColElem","colIdx","findIndex","colElems","querySelectorAll","getLastChild","ac","idx","getParent","getParentList","includeRoot","includeSelf","dtn","getPath","part","separator","path","isFunc","hasChildren","hasClass","other","isDescendantOf","isChildOf","andCollapsed","emptyChildListExpandable","isFirstSibling","isLastSibling","isLazy","isLoading","isPagingNode","isParentOf","isPartload","isPartsel","isRadio","isRendered","isRootNode","isSelected","isTopLevel","isVisible","hasFilter","parents","_loadSourceObject","response","setTypes","colStructure","selectMode","fixSelection3FromEndNodes","_fetchWithOptions","url","params","body","rest","fetchOpts","method","URLSearchParams","fetch","json","load","requestId","prevParent","elapLoad","elapProcess","startProcess","logError","message","debugLevel","forceReload","wasExpanded","resetLazy","makeVisible","dfd","deferreds","len","seOpts","updatePendingModifications","moveTo","targetParent","triggerModifyChild","any","triggerModify","removeMarkup","_unregisterNode","removeChildren","_wb_node","_getRenderInfo","allColInfosById","renderColInfosById","col","_createIcon","iconMap","parentElem","replaceChild","showLoading","iconSpan","appendChild","cbRes","badge","tooltip","badgeClass","badgeTooltip","append","_render_markup","treeOptions","rowDiv","checkboxSpan","expanderSpan","isNew","after","top","nodeElem","ofsTitlePx","titleSpan","_ofsTitlePx","draggable","colElem","left","_ofsPx","width","_widthPx","nodeListElement","prepend","_render_data","preventScroll","textContent","skeleton","vpWidth","clientWidth","isDataChange","_render_status","renderInfo","rowClasses","image","backgroundImage","cbclass","colSpan","resizeCols","ofs","colDef","change","row","recursive","dict","scrollTo","prev","retrigger","focusTree","orgEvent","nextNode","prevNode","immediate","updateOpts","lastChild","topNode","setIcon","setKey","getSelectedNodes","stopOnParents","_anySelectable","setSelected","found","_changeSelectStatusProps","state","changed","fixSelection3AfterClick","_walk","allSelected","someSelected","sendEvents","canSelect","propagateDown","sibling","details","statusNode","_setStatusNode","firstChild","_clearStatusNode","strings","loadError","setTitle","_sortChildren","cmp","deep","sort","sortChildren","operation","modifyChild","visitSiblings","isMatched","EditExtension","minlength","maxlength","trigger","slowClickDelay","validity","beforeEdit","edit","curEditNode","relatedNode","debouncedOnChange","_onChange","_applyChange","inputElem","inputValue","_preprocessKeyEvent","isEditingTitle","_stopEditTitle","startEditTitle","inputHtml","setCustomValidity","reportValidity","stopEditTitle","focusElem","activeElement","forceClose","errMsg","validationMessage","oldValue","createNode","newNode","WbSystemRoot","extensionList","extensions","keyMap","Map","refKeyMap","treeRowCount","_disableUpdateCount","_disableUpdateIgnoreCount","_columnsById","pendingChangeTypes","_util","_cellNavMode","lastClickTime","header","rowHeightPx","fixedCol","showSpinner","connectTopBreadcrumb","iconBadge","receive","readyDeferred","ready","readyOk","_registerExtension","_updateViewportThrottled","_updateViewportImmediately","getAttribute","tabIndex","_wb_tree","wantHeader","rowElement","colDiv","dataset","coldivs","repeat","listContainerElement","_initExtensions","optName","setOption","isGrid","setNavigationOption","resizeObserver","ResizeObserver","resize","observe","mouseEvent","expander","scrollIntoViewOnExpandClick","_callHook","getTree","el","treeElem","Element","extension","rk","rks","get","hook","d","_getNodeByRowIdx","visitRows","getTopmostVpNode","complete","topIdx","ceil","floor","getLowestVpNode","scrollParent","bottomIdx","_getPrevNodeInView","reverse","_getNextNodeInView","nodeOrOpts","refNode","clear","destroy","outerHTML","hasFocus","hasHeader","hint","selectAll","toggleSelect","_selectRange","eventInfo","visible","_check","findKey","startNode","reMatch","makeNodeTitleStartMatcher","_checkNode","pageSize","bottomNode","parentCol","canonicalName","unknown","colId","column","KeyboardEvent","label","timeEnd","vpHeight","rowTop","vpTop","vpRowTop","vpRowBottom","newScrollTop","scrollToHorz","fixedWidth","scrollLeft","colLeft","Number","parseInt","colRight","newLeft","setActiveNode","RF","clearMarkup","redraw","reset","values","toDictArray","_updateColumnWidths","col0","totalWidth","totalWeight","modified","cw","_weight","endsWith","px","parseFloat","slice","restPx","ofsPx","minWidth","cmw","tw","_renderHeaderMarkup","colCount","headerRow","headerClasses","resizer","_updateRows","newNodesOnly","adjustHeight","wantHeight","abs","vp_height","startIdx","endIdx","obsoleteNodes","childNodes","tr","prevElem","_visitRowsUp","nextIdx","siblings","stopNode","siblingOfs","skipFirstNode","checkFilter","wrap","isFilterActive","version"],"sources":["wunderbaum.umd.js"],"mappings":"CAAA,SAAWA,EAAQC,GACE,iBAAZC,SAA0C,oBAAXC,OAAyBF,EAAQC,SACrD,mBAAXE,QAAyBA,OAAOC,IAAMD,OAAO,CAAC,WAAYH,GACUA,GAA1ED,EAA+B,oBAAfM,WAA6BA,WAAaN,GAAUO,MAAqBC,MAAQ,CAAC,EACpG,CAJD,CAIGC,MAAM,SAAWP,GAAW;;;;;KAS7B,MAAMQ,EAAgB,CAClB,EAAG,GACH,EAAG,OACH,EAAG,SACH,EAAG,QACH,EAAG,OACH,EAAG,WAKDC,EAoEN,WACI,MAAMC,EAAMC,UAKZ,MAHY,CACRF,MAAO,MAAMG,KAAKF,EAAIG,UAG9B,CA7EiBC,GAEML,MACjBM,EAAW,YACXC,EAAc,WACdC,EAAa,CACf,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,QACL,IAAK,UAqDT,SAASC,EAAOC,EAAMC,GAClB,IAAKD,EAED,MADAC,EAAMA,GAAO,oBACP,IAAIC,MAAMD,EAExB,CAUA,SAASE,EAAcC,GACS,YAAxBC,SAASC,WACTD,SAASE,iBAAiB,mBAAoBH,GAG9CA,GAER,CAuCA,SAASI,EAAMP,GACX,MAAM,IAAIC,MAAMD,EACpB,CAEA,SAASQ,EAAWC,GAChB,OAAQ,GAAKA,GAAGC,QAAQf,GAAU,SAAUc,GACxC,OAAOZ,EAAWY,EACtB,GACJ,CAKA,SAASE,EAAYF,GACjB,OAAQ,GAAKA,GAAGC,QAAQ,yBAA0B,OACtD,CAEA,SAASE,EAAcH,GACnB,OAAQ,GAAKA,GAAGC,QAAQd,GAAa,SAAUa,GAC3C,OAAOZ,EAAWY,EACtB,GACJ,CAkCA,SAASI,EAAiBC,EAAMC,GAAS,GACrC,MAAMC,EAAMF,EAAKG,QACjB,IAAIC,EAAQ,KACZ,GAAY,SAARF,GAAkBF,EAAKK,UAAUC,SAAS,UAAW,CACrD,MAAMC,EAAOP,EACPQ,EAAgBD,EAAKE,cAAc,gBACzC,GAAID,EACA,OAAOT,EAAiBS,EAAeP,GAE3CM,EAAKG,UAAY,GAAKN,CAC1B,MACK,GAAY,UAARF,EAAiB,CACtB,MAAMS,EAAQX,EAEd,OADaW,EAAMC,MAEf,IAAK,SACL,IAAK,QACL,IAAK,SACL,IAAK,QACD,MACJ,IAAK,WACDR,EAAQO,EAAME,cAAgB,KAAOF,EAAMG,QAC3C,MACJ,IAAK,OACL,IAAK,WACL,IAAK,iBACL,IAAK,QACL,IAAK,OACL,IAAK,OACDV,EAAQH,EAASU,EAAMI,YAAcJ,EAAMP,MAC3C,MACJ,IAAK,SACL,IAAK,QACDA,EAAQO,EAAMK,cACd,MACJ,IAAK,QACD,CACI,MAAMC,EAAON,EAAMM,KACbH,EAAUH,EAAMO,cAAcT,cAAc,eAAeQ,eACjEb,EAAQU,EAAUA,EAAQV,WAAQe,CACtC,CACA,MAEJ,QACIf,EAAQO,EAAMP,MAE1B,MACK,GAAY,WAARF,EAAkB,CAEvBE,EADeJ,EACAI,KACnB,CACA,OAAOA,CACX,CAiGA,SAASgB,EAAepB,EAAMqB,GAC1B,MAAMC,EAAQC,EAAiBvB,GAAMsB,MACjCD,EACsB,SAAlBC,EAAME,UACNF,EAAME,QAAU,IAGG,KAAlBF,EAAME,UACXF,EAAME,QAAU,OAExB,CAEA,SAASC,EAAaC,GAClB,MAAMC,EAAIrC,SAASsC,cAAc,YAEjC,OADAD,EAAEE,UAAYH,EAAKI,OACZH,EAAEI,QAAQC,iBACrB,CACA,MAAMC,EAAe,IAAIC,IAAI,CAAC,MAAO,UAAW,OAAQ,UAExD,SAASX,EAAiBY,GACtB,OAAKA,EAGc,iBAARA,EACA7C,SAASmB,cAAc0B,GAE3BA,EALI,IAMf,CAEA,SAASC,EAAwBD,GAC7B,OAAKA,EAGc,iBAARA,EACA7C,SAASmB,cAAc0B,GAE3BA,EALI,IAMf,CAyBA,SAASE,EAAcC,GACnB,MAAMC,EAAMD,EAAMC,IACZC,EAAKF,EAAM1B,KACXjB,EAAI,GA2BV,OA1BI2C,EAAMG,QACN9C,EAAE+C,KAAK,OAEPJ,EAAMK,SACNhD,EAAE+C,KAAK,WAEPJ,EAAMM,SACNjD,EAAE+C,KAAK,QAEPJ,EAAMO,UACNlD,EAAE+C,KAAK,SAEA,UAAPF,GAAyB,aAAPA,EAClB7C,EAAE+C,KAAKpE,EAAcgE,EAAMQ,QAAUN,GAEzB,UAAPA,EACL7C,EAAE+C,KAAKF,GAODP,EAAac,IAAIR,IACvB5C,EAAE+C,KAAKH,GAEJ5C,EAAEqD,KAAK,IAClB,CAQA,SAASC,KAAUC,GACf,IAAK,IAAIC,EAAI,EAAGA,EAAID,EAAKE,OAAQD,IAAK,CAClC,MAAME,EAAMH,EAAKC,GACjB,GAAW,MAAPE,EAGJ,IAAK,MAAMd,KAAOc,EACVC,OAAOC,UAAUC,eAAeC,KAAKJ,EAAKd,KAC1CW,EAAK,GAAGX,GAAOc,EAAId,GAG/B,CACA,OAAOW,EAAK,EAChB,CAEA,SAASQ,EAAQvB,GACb,OAAOwB,MAAMD,QAAQvB,EACzB,CAEA,SAASyB,EAAczB,GACnB,OAAmC,IAA5BmB,OAAOO,KAAK1B,GAAKiB,QAAgBjB,EAAI2B,cAAgBR,MAChE,CAMA,SAASS,EAAc5B,GACnB,MAA+C,oBAAxCmB,OAAOC,UAAUS,SAASP,KAAKtB,EAC1C,CAGA,SAAS8B,EAAQC,EAAYC,EAAYC,EAAmBC,GACxD,IAAIC,EAAUC,EACdL,EAAa9B,EAAwB8B,GACjCG,GACAC,EAAWF,EACXG,EAAUF,IAGVC,EAAW,GACXC,EAAUH,GAEdD,EAAWK,MAAM,KAAKC,SAASC,IAC3BR,EAAW1E,iBAAiBkF,GAAK,SAAUC,GACvC,IAAKL,EACD,OAAOC,EAAQI,GAEd,GAAIA,EAAEC,OAAQ,CACf,IAAI5E,EAAO2E,EAAEC,OACb,GAAI5E,EAAK6E,QAAQP,GACb,OAAOC,EAAQI,GAGnB,GADA3E,EAAOA,EAAK8E,QAAQR,GAChBtE,EACA,OAAOuE,EAAQI,EAEvB,CACJ,GAAE,GAEV,CAaA,SAASI,EAAeC,EAAUC,EAAYV,EAASW,GACnD,IAAIC,EAAWC,EACf,MAAMjH,EAAO+G,GAAOF,EACdK,EAAWL,EAASC,GACpBK,EAAS,IAAIpC,IACRmC,EAASE,MAAMpH,EAAM+E,GAE1BsC,EAAeC,GACVJ,EAASE,MAAMpH,EAAMsH,GAehCT,EAASC,GAbO,IAAI/B,KAChB,IAKI,OAJAiC,EAAYhH,EAAKmH,OACjBF,EAAiBjH,EAAKqH,YACtBrH,EAAKmH,OAASA,EACdnH,EAAKqH,YAAcA,EACZjB,EAAQgB,MAAMpH,EAAM+E,EAC/B,CACA,QACI/E,EAAKmH,OAASH,EACdhH,EAAKqH,YAAcJ,CACvB,EAGR,CAiEA,SAASM,EAAUC,EAAM1E,EAAM2E,OAAezE,GAC1C,IAAI0E,EAEAF,GAAQ1E,EAAK6E,QAAQ,MAAQ,KAC5BD,EAAK5E,GAAQA,EAAKuD,MAAM,KACzBmB,EAAOA,EAAKE,IAEhB,MAAMzF,EAAQuF,EAAOA,EAAK1E,GAAQ,KAElC,OAAOb,QAAqCA,EAAQwF,CACxD,CAEA,SAASG,EAAMC,GACX,GAAIA,aAAe9D,IACf,OAAO8D,EAEX,GAAmB,iBAARA,EAAkB,CACzB,MAAMC,EAAM,IAAI/D,IAChB,IAAK,MAAMgE,KAAKF,EAAIxB,MAAM,KACtByB,EAAIE,IAAID,EAAEpE,QAEd,OAAOmE,CACX,CACA,GAAItC,MAAMD,QAAQsC,GACd,OAAO,IAAI9D,IAAI8D,GAEnB,MAAM,IAAI7G,MAAM,kCAAoC6G,EACxD,CAmCA,SAASI,EAAiB/G,EAAUgH,GAChC,IAAIC,EAAU,EACVC,EAAc,KAClB,MAAMZ,EAAOrC,OAAOkD,OAAO,CACvBC,SAAU,GACVC,aAAc,IACdC,SAAU,IACVC,YAAa,GACdP,GACGI,EAAWI,KAAKC,IAAI,IAAKnB,EAAKc,UAC9BE,GAAYhB,EAAKgB,SACjBI,EAAc,IAAI7D,KACpB,GAAIoD,EACAC,EAAcrD,EAEdoD,GAAW,MAEV,CAEDA,EAAU,EACV,MAAMU,EAAU9D,EAChBqD,EAAc,KAEd,MAAMU,EAAQC,KAAKC,MACnB,IACI9H,EAASkG,MAAMlH,KAAM2I,EACzB,CACA,MAAOvH,GACH2H,QAAQ3H,MAAMA,EAClB,CACA,MAAM4H,EAAOH,KAAKC,MAAQF,EACpBK,EAAWT,KAAKU,IAAIV,KAAKC,IAAIL,EAAUY,EAAO1B,EAAKiB,aAAcD,GACjEa,EAAWX,KAAKC,IAAIL,EAAUa,EAAWD,GAK/CI,YAAW,KAGPnB,EAAU,EACS,MAAfC,GAMAQ,EAAYxB,MAAMlH,KAAMkI,EAC5B,GACDiB,EACP,GAEJ,OAAOT,CACX,CAEA,IA+CIW,EAoBAC,EAQAC,EASAC,EAWAC,EA/FAC,EAAoBzE,OAAO0E,OAAO,CACpCC,UAAW,KACXC,SAvrBe,MACb,WAAApE,GACIzF,KAAK8J,MAAQ,GACb9J,KAAK+J,QAAU,GACf/J,KAAKgK,OAAS,EAClB,CACA,OAAAC,CAAQlI,GACJ,GAAI/B,KAAKgK,OACL,MAAM,IAAIlJ,MAAM,mBAEpBd,KAAKgK,OAAS,WACdhK,KAAKkK,cAAgBnI,EACrB/B,KAAK8J,MAAM1D,SAAS9C,GAAMA,EAAEvB,KAC5B/B,KAAK8J,MAAQ,EACjB,CACA,MAAAK,CAAO/I,GACH,GAAIpB,KAAKgK,OACL,MAAM,IAAIlJ,MAAM,mBAEpBd,KAAKgK,OAAS,WACdhK,KAAKoK,cAAgBhJ,EACrBpB,KAAK+J,QAAQ3D,SAASyB,GAAMA,EAAEzG,KAC9BpB,KAAK+J,QAAU,EACnB,CACA,IAAAM,CAAKC,GACc,aAAXN,OACAM,EAAGtK,KAAKkK,eAGRlK,KAAK8J,MAAMS,QAAQD,EAE3B,CACA,MAAMA,GACkB,aAAhBtK,KAAKgK,OACLM,EAAGtK,KAAKoK,eAGRpK,KAAK+J,QAAQQ,QAAQD,EAE7B,CACA,OAAAE,GACI,MAAO,CACHH,KAAMrK,KAAKqK,KACXI,MAAOzK,KAAKyK,MAEpB,GA2oBFC,QAzsBc,iBA0sBdzK,cAAeA,EACf8H,iBAAkBA,EAClBpH,OAAQA,EACRI,cAAeA,EACf4J,qBArnBF,WACI,OAAO,IAAIC,SAASX,IAChBlJ,EAAckJ,EAAQ,GAE9B,EAknBEY,KAzmBF,SAAc/G,EAAK9C,GACf,GAAW,MAAP8C,EAEA,OAAOA,EAEX,MAAMiB,EAASjB,EAAIiB,OACnB,IAAID,EAAI,EACR,GAAsB,iBAAXC,EACP,KAAOD,EAAIC,IACkC,IAArC/D,EAASoE,KAAKtB,EAAIgB,GAAIA,EAAGhB,EAAIgB,IADlBA,UAOnB,IAAK,MAAMgG,KAAKhH,EACZ,IAAyC,IAArC9C,EAASoE,KAAKtB,EAAIgB,GAAIgG,EAAGhH,EAAIgH,IAC7B,MAIZ,OAAOhH,CACX,EAolBEV,aAAcA,EACdF,iBAAkBA,EAClB9B,MAAOA,EACPC,WAAYA,EACZG,YAAaA,EACbC,cAAeA,EACfsC,wBAAyBA,EACzBC,cAAeA,EACfY,OAAQA,EACRmG,gBApkBF,SAAyBzJ,GAKrB,OAJIA,EAAEmG,QAAQ,MAAQ,GAClBrG,EAAM,mBAGHE,CACX,EA+jBE+F,UAAWA,EACX3F,iBAAkBA,EAClB2D,QAASA,EACTE,cAAeA,EACfyF,WAxRF,SAAoBlH,GAChB,MAAsB,mBAARA,CAClB,EAuRE5D,MAAOA,EACPwF,cAAeA,EACfuF,KAnRF,YAAiBpG,GAAQ,EAoRvBe,QAASA,EACTc,eAAgBA,EAChB3D,eAAgBA,EAChBmI,kBAnNF,SAA2BlK,EAAUmK,GACjC,OAAO,IAAIP,SAAQ,CAACX,EAASE,KACzBf,YAAW,KACP,IACIa,EAAQjJ,EAASkG,MAAMlH,MAC3B,CACA,MAAOoL,GACHjB,EAAOiB,EACX,IACDD,EAAG,GAEd,EAyMEE,eA/dF,SAASA,EAAe1J,EAAMI,GAC1B,MAAMF,EAAMF,EAAKG,QACjB,GAAY,SAARD,GAAkBF,EAAKK,UAAUC,SAAS,UAAW,CACrD,MAAMC,EAAOP,EACPQ,EAAgBD,EAAKE,cAAc,gBACzC,GAAID,EACA,OAAOkJ,EAAelJ,EAAeJ,GAGzCG,EAAKG,UAAY,GAAKN,CAC1B,MACK,GAAY,UAARF,EAAiB,CACtB,MAAMS,EAAQX,EACRY,EAAOD,EAAMC,KACnB,OAAQA,GACJ,IAAK,WAGDD,EAAME,cAA0B,OAAVT,EACtBO,EAAMG,UAAYV,EAClB,MACJ,IAAK,OACL,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,WACL,IAAK,iBACDO,EAAMI,YAAc,IAAImG,KAAK9G,GAC7B,MACJ,IAAK,SACL,IAAK,QACY,MAATA,EACAO,EAAMP,MAAQA,EAGdO,EAAMK,cAAgBZ,EAE1B,MACJ,IAAK,QACDX,EAAM,wBAAwBmB,KAM9B,MACJ,IAAK,SACL,IAAK,QACL,IAAK,SACL,IAAK,QACD,MAEJ,QACID,EAAMP,MAAQA,QAAqCA,EAAQ,GAEvE,MACK,GAAY,WAARF,EAAkB,CACvB,MAAMyJ,EAAS3J,EACF,MAATI,EACAuJ,EAAOC,eAAiB,EAGxBD,EAAOvJ,MAAQA,CAEvB,CACJ,EA+ZEyJ,MA/LFC,eAAqBN,GACjB,OAAO,IAAIP,SAASX,GAAYb,WAAWa,EAASkB,IACxD,EA8LEzD,MAAOA,EACPgE,eApLF,SAAwBC,EAAS5J,EAAO6J,GACpC,MAAMtJ,EAAQY,EAAiByI,GAG/B,GAFAhL,EAAsB,aAAf2B,EAAMC,KAAqB,wBAAwBD,EAAMC,QAChEqJ,UAAuDA,EAAWtJ,EAAMN,UAAUC,SAAS,gBAAkBK,EAAME,oBACrGM,IAAVf,EAAqB,CAErB,OADiBO,EAAME,cAAgB,KAAOF,EAAMG,SAEhD,KAAK,EACDV,GAAQ,EACR,MACJ,KAAK,EACDA,GAAQ6J,GAAW,KACnB,MACJ,KAAK,KACD7J,GAAQ,EAGpB,CACAO,EAAME,cAAyB,MAATT,EACtBO,EAAMG,UAAYV,CACtB,EAiKEQ,KA7GF,SAAcuB,GACV,OAAOmB,OAAOC,UAAUS,SACnBP,KAAKtB,GACLvC,QAAQ,oBAAqB,MAC7BsK,aACT;;;;;MAoHA,SAAWxC,GAEPA,EAAgB,IAAI,MAEpBA,EAAiB,KAAI,OAErBA,EAAyB,aAAI,eAE7BA,EAAmB,OAAI,SAEvBA,EAAgB,IAAI,MAEpBA,EAAsB,UAAI,YAE1BA,EAAmB,OAAI,SAEvBA,EAAmB,OAAI,QAC1B,CAjBD,CAiBGA,IAAeA,EAAa,CAAC,IAGhC,SAAWC,GACPA,EAAwB,YAAI,cAC5BA,EAAmB,OAAI,SACvBA,EAAmB,OAAI,SACvBA,EAAmB,OAAI,QAC1B,CALD,CAKGA,IAAeA,EAAa,CAAC,IAGhC,SAAWC,GACPA,EAAmB,GAAI,KACvBA,EAAwB,QAAI,UAC5BA,EAAsB,MAAI,QAC1BA,EAAuB,OAAI,SAC3BA,EAAuB,OAAI,QAC9B,CAND,CAMGA,IAAmBA,EAAiB,CAAC,IAGxC,SAAWC,GACPA,EAAoB,QAAI,GACxBA,EAAqB,SAAI,WACzBA,EAAmB,OAAI,SACvBA,EAAqB,SAAI,WACzBA,EAAiB,KAAI,OACrBA,EAAmB,OAAI,SACvBA,EAAkB,MAAI,OACzB,CARD,CAQGA,IAAeA,EAAa,CAAC,IAGhC,SAAWC,GACPA,EAAsB,SAAI,WAC1BA,EAAkB,KAAI,OACtBA,EAAuB,UAAI,YAC3BA,EAAiB,IAAI,KACxB,CALD,CAKGA,IAAgBA,EAAc,CAAC;;;;;;AAOlC,MAAMqC,EACF,WAAArG,CAAYsG,EAAMC,EAAIC,GAClBjM,KAAKkM,SAAU,EACflM,KAAK+L,KAAOA,EACZ/L,KAAKgM,GAAKA,EACVhM,KAAKmM,SAAWJ,EAAK/D,QACrB,MAAMV,EAAOyE,EAAK/D,aACQlF,IAAtB9C,KAAKmM,SAASH,GACd1E,EAAK0E,GAAMhM,KAAKoM,cAAgBxH,EAAO,CAAC,EAAGqH,IAI3CjM,KAAKoM,cAAgBxH,EAAO,CAAC,EAAGqH,EAAU3E,EAAK0E,IAC/C1E,EAAK0E,GAAMhM,KAAKoM,eAEpBpM,KAAKkM,QAAUlM,KAAKqM,gBAAgB,WAAW,EACnD,CAEA,IAAAC,GACItM,KAAK+L,KAAKJ,QAAQ3J,UAAU8F,IAAI,UAAY9H,KAAKgM,GACrD,CAeA,eAAAK,CAAgBzJ,EAAM2E,GAClB,IAAIgF,EACJ,OAA2C,QAAnCA,EAAKvM,KAAKoM,cAAcxJ,UAA0B,IAAP2J,EAAgBA,EAAKhF,CAC5E,CACA,eAAAiF,CAAgB5J,EAAMb,GAClB/B,KAAKoM,cAAcxJ,GAAQb,CAC/B,CACA,UAAA0K,CAAWzJ,GAAO,GACd,OAAOhD,KAAKwM,gBAAgB,YAAaxJ,EAE7C,CACA,UAAA0J,CAAWC,GAEX,CACA,QAAAC,CAASD,GAET;;;;;KAUJ,MAAME,EAA+B,iBAAXtN,QACX,OAAXA,QACAA,OAAO0F,SAAWA,QAClB1F,OAEEuN,EAAuC,iBAAfjN,YACX,OAAfA,YACAA,WAAWoF,QAAUA,QACrBpF,WAEEkN,EAA2B,iBAATjN,MAA8B,OAATA,MAAiBA,KAAKmF,SAAWA,QAAUnF,KAElFkN,EAAOF,GAAkBD,GAAcE,GAAYE,SAAS,cAATA,GAwBzD,SAASC,EAASnL,GACd,MAAMQ,SAAcR,EACpB,OAAgB,MAATA,IAA2B,WAATQ,GAA8B,aAATA,EAClD,CA8DA,SAAS4K,EAASC,EAAMC,EAAO,EAAGrF,EAAU,CAAC,GACzC,IAAIsF,EAAUC,EAAUC,EAASC,EAAQC,EAASC,EAC9CC,EAAiB,EACjBC,GAAU,EACVC,GAAS,EACTC,GAAW,EAEf,MAAMC,GAAUX,GAAiB,IAATA,GAAoD,mBAA/BL,EAAKiB,sBAClD,GAAoB,mBAATb,EACP,MAAM,IAAIc,UAAU,uBASxB,SAASC,EAAWC,GAChB,MAAMvJ,EAAOyI,EACPe,EAAUd,EAIhB,OAHAD,EAAWC,OAAWzK,EACtB8K,EAAiBQ,EACjBX,EAASL,EAAKlG,MAAMmH,EAASxJ,GACtB4I,CACX,CACA,SAASa,EAAWC,EAAalB,GAC7B,OAAIW,GACAhB,EAAKwB,qBAAqBd,GACnBV,EAAKiB,sBAAsBM,IAE/BnF,WAAWmF,EAAalB,EACnC,CAuBA,SAASoB,EAAaL,GAClB,MAAMM,EAAoBN,EAAOT,EAKjC,YAAyB7K,IAAjB6K,GACJe,GAAqBrB,GACrBqB,EAAoB,GACnBZ,GAPuBM,EAAOR,GAOGJ,CAC1C,CACA,SAASmB,IACL,MAAMP,EAAOvF,KAAKC,MAClB,GAAI2F,EAAaL,GACb,OAAOQ,EAAaR,GAGxBV,EAAUY,EAAWK,EAzBzB,SAAuBP,GACnB,MACMS,EAAsBT,EAAOR,EAC7BkB,EAAczB,GAFMe,EAAOT,GAGjC,OAAOG,EACDtF,KAAKU,IAAI4F,EAAatB,EAAUqB,GAChCC,CACV,CAkBuCC,CAAcX,GACrD,CACA,SAASQ,EAAaR,GAIlB,OAHAV,OAAU5K,EAGNiL,GAAYT,EACLa,EAAWC,IAEtBd,EAAWC,OAAWzK,EACf2K,EACX,CAcA,SAASuB,KAAanK,GAClB,MAAMuJ,EAAOvF,KAAKC,MACZmG,EAAaR,EAAaL,GAKhC,GAJAd,EAAWzI,EAEX0I,EAAWvN,KACX2N,EAAeS,EACXa,EAAY,CACZ,QAAgBnM,IAAZ4K,EACA,OAnEZ,SAAqBU,GAMjB,OAJAR,EAAiBQ,EAEjBV,EAAUY,EAAWK,EAActB,GAE5BQ,EAAUM,EAAWC,GAAQX,CACxC,CA4DmByB,CAAYvB,GAEvB,GAAIG,EAGA,OADAJ,EAAUY,EAAWK,EAActB,GAC5Bc,EAAWR,EAE1B,CAIA,YAHgB7K,IAAZ4K,IACAA,EAAUY,EAAWK,EAActB,IAEhCI,CACX,CAIA,OA/GAJ,GAAQA,GAAQ,EACZH,EAASlF,KACT6F,IAAY7F,EAAQ6F,QACpBC,EAAS,YAAa9F,EACtBwF,EAAUM,EAAStF,KAAKC,KAAKT,EAAQwF,SAAW,EAAGH,GAAQG,EAC3DO,EAAW,aAAc/F,IAAYA,EAAQ+F,SAAWA,GAuG5DiB,EAAUG,OAnCV,gBACoBrM,IAAZ4K,GApDR,SAAqB1B,GACjB,GAAIgC,EACA,OAAOhB,EAAKwB,qBAAqBxC,GAErCoD,aAAapD,EACjB,CAgDQqD,CAAY3B,GAEhBE,EAAiB,EACjBN,EAAWK,EAAeJ,EAAWG,OAAU5K,CACnD,EA8BAkM,EAAUM,MA7BV,WACI,YAAmBxM,IAAZ4K,EAAwBD,EAASmB,EAAa/F,KAAKC,MAC9D,EA4BAkG,EAAUO,QA3BV,WACI,YAAmBzM,IAAZ4K,CACX,EA0BOsB,CACX;;;;;;AAuEA,MAAMQ,EAAe,IACfC,EAAa,IACbC,EAAkB,IAAIC,OAAOnO,EAFd,KAEyC,KACxDoO,EAAiB,IAAID,OAAOnO,EAFf,KAEwC,KAC3D,MAAMqO,UAAwB/D,EAC1B,WAAArG,CAAYsG,GACR+D,MAAM/D,EAAM,SAAU,CAClBgE,aAAc,KACdC,WAAW,EACXC,YAAY,EACZC,SAAS,EACTC,OAAO,EACPC,qBAAqB,EACrBC,eAAe,EACfC,WAAW,EACXC,YAAY,EACZC,KAAM,MACNC,QAAQ,IAEZzQ,KAAK0Q,eAAiB,IAC1B,CACA,IAAApE,GACIwD,MAAMxD,OACN,MAAMyD,EAAe/P,KAAKqM,gBAAgB,gBACtC0D,IACA/P,KAAK2Q,WAAazN,EAAiB6M,GACnCnK,EAAQ5F,KAAK2Q,WAAY,QAASxD,GAAU7G,IAExCtG,KAAK4Q,YAAY5Q,KAAK2Q,WAAW5O,MAAM0B,OAAQ,CAAC,EAAE,GACnD,MAEX,CACA,eAAA+I,CAAgB5J,EAAMb,GAGlB,GADA+N,MAAMtD,gBAAgB5J,EAAMb,GAEnB,SADDa,EAEA5C,KAAK+L,KAAK8E,WAAuB,SAAV9O,EAAmB,OAAS,MACnD/B,KAAK+L,KAAK+E,cAGtB,CACA,oBAAAC,CAAqBC,EAAQC,EAAYC,GACrC,OAAOlR,KAAK+L,KAAKoF,uBAAsB,IAC5BnR,KAAKoR,iBAAiBJ,EAAQC,EAAYC,IAEzD,CACA,gBAAAE,CAAiBJ,EAAQC,EAAYC,GACjC,IAAIG,EAAOC,EAAMC,EAAQ,EACzB,MAAM3I,EAAQC,KAAKC,MACbiD,EAAO/L,KAAK+L,KACZI,EAAWJ,EAAK/D,QAEhBwJ,EAAmBrF,EAASsF,aAC5BnK,EAAO1C,EAAO,CAAC,EAAGuH,EAAS6E,OAAQE,GACnCQ,EAAyB,SAAdpK,EAAKkJ,KAChBD,IAAejJ,EAAKiJ,aAAeU,EAEzC,GAAsB,iBAAXD,EAAqB,CAC5B,GAAe,KAAXA,EAGA,OAFAjF,EAAK4F,QAAQ,yEACb3R,KAAK4R,cAOLP,EAJA/J,EAAK6I,MAIGa,EACH7K,MAAM,IAIN0L,IAAIrQ,GACJsQ,QAAO,SAAUC,EAAGC,GAGrB,OAAOD,EAAI,MAAQC,EAAI,MAAQA,CACnC,GAAG,IAGKxQ,EAAYwP,GAExB,MAAMiB,EAAK,IAAItC,OAAO0B,EAAO,KACvBa,EAAc,IAAIvC,OAAOnO,EAAYwP,GAAS,MACpDA,EAAUmB,IACN,IAAKA,EAAKC,MACN,OAAO,EAGX,MAAMC,EAAOF,EAAKC,MAEZE,EAAMD,EAAKhB,MAAMY,GA6BvB,OA5BIK,GAAOhL,EAAKgJ,YAGRgB,EADAhK,EAAK6I,MA0K7B,SAAgCkC,EAAM7L,EAAS+L,GAAe,GAC1D,MAAMC,EAAkB,GAExB,IAAK,IAAIC,EAAkB,EAAGA,EAAkBjM,EAAQzB,OAAQ0N,IAAmB,CAC/E,MAAMC,EAGNlM,EAAQiM,GAAiB1N,QACA,IAApB0N,EAAwB,EAAI,IAC5BD,EAAgBA,EAAgBzN,OAAS,IAAM,GACpDyN,EAAgBnO,KAAKqO,EACzB,CAEA,MAAMC,EAAYN,EAAKlM,MAAM,IACzBoM,EAEAC,EAAgBpM,SAAQ,SAAUwM,GAC9BD,EAAUC,GAAKpD,EAAemD,EAAUC,GAAKnD,CACjD,IAIA+C,EAAgBpM,SAAQ,SAAUwM,GAC9BD,EAAUC,GAAK,SAAWD,EAAUC,GAAK,SAC7C,IAGJ,OAAOD,EAAUhO,KAAK,GAC1B;;;;;KArM+BkO,CAAuBR,EAAMC,GAAK,GAKlCD,EAAK9Q,QAAQ2Q,GAAa,SAAU5Q,GACvC,OAAOkO,EAAelO,EAAImO,CAC9B,IAGJ0C,EAAKW,mBAAqBzR,EAAWiQ,GAEhC/P,QAAQmO,EAAiB,UACzBnO,QAAQqO,EAAgB,cAYxB0C,CAAG,CAEpB,CA6DA,OA5DAvG,EAAK8E,WAAavJ,EAAKkJ,KAEvBxQ,KAAK0Q,eAAiBqC,UACtBhH,EAAKJ,QAAQ3J,UAAUgR,OAAO,uBAAwBtB,GACtD3F,EAAKJ,QAAQ3J,UAAUgR,OAAO,qBAAsBtB,GACpD3F,EAAKJ,QAAQ3J,UAAUgR,OAAO,iCAAkC1L,EAAK+I,eAErEtE,EAAKiB,KAAKiG,cAAgB,EAC1BlH,EAAKmH,OAAOf,WACDA,EAAKd,aACLc,EAAKW,mBACZX,EAAKc,cAAgB,CAAC,IAM1BlH,EAAKoH,UAAU5J,EAAe6J,IAE9BjH,EAASsF,cAAe,EACxB1F,EAAKmH,OAAOf,IACR,GAAI5B,GAA+B,MAAjB4B,EAAKkB,SACnB,OAEJ,IAAIf,EAAMtB,EAAOmB,GACjB,GAAY,SAARG,EAIA,OAHAH,EAAKe,OAAM,SAAUrL,GACjBA,EAAEwJ,OAAQ,CACd,IAAG,GACI,OAEX,IAAIiC,GAAkB,GACjBrC,GAAsB,WAARqB,IAAqBH,EAAKoB,OAAOlC,QAChDiB,GAAM,EACNgB,GAAkB,GAElBhB,IACAf,IACAY,EAAKd,OAAQ,EACbc,EAAKqB,cAAcC,IACXA,IAAMtB,IACNsB,EAAER,eAAiB,IAGnB3L,EAAK2I,YAAeqD,GAAoBG,EAAEC,WAC1CD,EAAEE,aAAY,EAAM,CAChBC,aAAa,EACbC,UAAU,IAEdJ,EAAEK,qBAAsB,EAC5B,IACD,GACP,IAEJ3H,EAASsF,aAAeD,EACV,IAAVD,GAAejK,EAAKmJ,QAAUiB,GAC9B3F,EAAKiB,KAAKmG,UAAU5J,EAAekH,QAGvC1E,EAAK4F,QAAQ,WAAWN,YAAgBE,cAAkB1I,KAAKC,MAAQF,SAChE2I,CACX,CAIA,WAAAX,CAAYI,EAAQhJ,GAChB,OAAOhI,KAAK+Q,qBAAqBC,GAAQ,EAAOhJ,EACpD,CAIA,cAAA+L,CAAe/C,EAAQhJ,GACnB,OAAOhI,KAAK+Q,qBAAqBC,GAAQ,EAAMhJ,EACnD,CAIA,YAAA8I,GACI,IAAIvE,EACJ,MAAMR,EAAO/L,KAAK+L,KACdA,EAAK8E,YACL7Q,KAAK0Q,iBAC2B,QAA9BnE,EAAKR,EAAK/D,QAAQgJ,cAA2B,IAAPzE,OAAgB,EAASA,EAAGyD,WAEpEhQ,KAAK+Q,qBAAqB7J,MAAMlH,KAAMA,KAAK0Q,gBAG3C3E,EAAKiI,QAAQ,oCAErB,CAIA,WAAApC,GACI,MAAM7F,EAAO/L,KAAK+L,KAGlBA,EAAKkI,cAAa,GAIlBlI,EAAKoH,UAAU5J,EAAe6J,WAEvBrH,EAAKiB,KAAKqE,aACVtF,EAAKiB,KAAKiG,cACjBlH,EAAKmH,OAAOf,WAKDA,EAAKd,aACLc,EAAKc,qBACLd,EAAKW,mBAKRX,EAAK2B,qBAAuB3B,EAAKuB,UACjCvB,EAAKwB,aAAY,EAAO,CACpBC,aAAa,EACbC,UAAU,WAGX1B,EAAK2B,mBAAmB,IAEnC/H,EAAK8E,WAAa,KAClB7Q,KAAK0Q,eAAiB,KACtB3E,EAAKJ,QAAQ3J,UAAUkS,OAEvB,oBAAqB,sBAErBnI,EAAKkI,cAAa,EACtB,EA6CJ,MAAME,UAAwBrI,EAC1B,WAAArG,CAAYsG,GACR+D,MAAM/D,EAAM,SAAU,CAAC,EAC3B,CACA,qBAAAqI,CAAsBzS,GAClB,IAAI4K,EACJ,IAAIjK,EAAQ,KACZ,GAAIX,GAAqB,MAAbA,EAAKY,KACbD,EAAQX,MAEP,CAED,MAAM0S,EAA8C,QAAvC9H,EAAKvM,KAAK+L,KAAKuI,0BAAuC,IAAP/H,OAAgB,EAASA,EAAGnK,cAAc,gBAClGiS,IACA/R,EAAQ+R,EAEhB,CACA,OAAO/R,CACX,CAEA,kBAAAiS,GACI,IAAIhI,EAGJ,SAD6B,QADhBA,EAAKvM,KAAK+L,KAClBuI,0BAAuC,IAAP/H,OAAgB,EAASA,EAAGnK,cAAc,4BAEnF,CACA,UAAAsK,CAAWC,GACP,MAAM1I,EAAQ0I,EAAK1I,MACb8H,EAAO/L,KAAK+L,KACZzE,EAAOqF,EAAK3E,QACZwM,GAAYvQ,EAAMK,SAAWgD,EAAKmN,aAClCC,EAAW1U,KAAKoU,sBAAsBnQ,EAAMsC,QAC5CoO,EAAgBD,GAAY1U,KAAKuU,qBACjCK,EAAgBtN,EAAKuN,qBAE3B,IAAIC,EAAWC,EAAY/Q,EAAcC,GAAQkO,EAAOxF,EAAKwF,KAAM6C,GAAU,EAE7E,IAAKjJ,EAAKkJ,YAEN,OAAO,EAGX,IAAyC,IAArClJ,EAAKmJ,WAAW,UAAWvI,GAC3B,OAAO,EAGX,IAA2D,IAAvDZ,EAAKoJ,YAAY,2BAA4BxI,GAC7C,OAAO,EAGX,IAAKwF,EAAM,CACP,MAAMiD,EAAcrJ,EAAKsJ,gBAAkBtJ,EAAKuJ,gBAC1CC,EAAYxJ,EAAKyJ,gBACvB,IAAKJ,GAAeG,GAA2B,cAAdR,EAG7B,OAFAQ,EAAU5D,QAAQ,sCAClB4D,EAAUE,YAGdX,EAAYM,GAAeG,EACvBT,IACAA,EAAUY,WACVvD,EAAOpG,EAAKsJ,eACZlD,EAAKR,QAAQ,wCAErB,CACA,MAAMgE,EAAYxD,EAAKwD,YACvB,GAAI5J,EAAK6J,WAAY,CAIjB,GAAIjB,EAAe,CAIf,OAAQI,GACJ,IAAK,QACDL,EAASmB,OACT9J,EAAK2J,WACL,MACJ,IAAK,SACDvD,EAAK2D,UACL/J,EAAK2J,WAGb,MACJ,CAEA,GAAIpO,EAAKyO,aACgB,IAArBhB,EAAUhQ,QACV,OAAO1E,KAAK0U,KACXL,EAAU,CAEX,MAAMsB,EAAQnN,KAAKC,MACfkN,EAAQjK,EAAKkK,oBA9FP,MA+FNlK,EAAKmK,oBAAsB,IAE/BnK,EAAKkK,oBAAsBD,EAC3BjK,EAAKmK,qBAAuBnB,EAC5B,MAAMoB,EAAYpK,EAAKqK,aAAarK,EAAKmK,oBAAqBnK,EAAKuJ,iBAKnE,OAJIa,GACAA,EAAUV,WAAU,EAAM,CAAExR,MAAOA,SAEvCA,EAAMoS,gBAEV,CAEA,OAAQtB,GACJ,IAAK,QACG5C,EAAKmE,aACDnE,EAAKoE,aACLxB,EAAY,WAEP5C,EAAKqE,cAAa,KACvBzB,EAAY,QAGpB,MACJ,IAAK,YACG5C,EAAKuB,WACLqB,EAAY,YAEhB,MACJ,IAAK,aACD,IAAK5C,EAAKuB,UAAYvB,EAAKqE,cAAa,GACpCzB,EAAY,WAEX,GAAIH,IAAkBnL,EAAYgN,WACnC7B,IAAkBnL,EAAYiN,SAG9B,OAFAzS,EAAMoS,iBACNtK,EAAK4K,cACE,EAKnB,OAAQ5B,GACJ,IAAK,IACL,IAAK,MAED5C,EAAKwB,aAAY,GACjB,MACJ,IAAK,IACL,IAAK,WACDxB,EAAKwB,aAAY,GACjB,MACJ,IAAK,IAIGxB,EAAK9K,UAAU,YACf8K,EAAKyE,iBAGLzE,EAAKsD,WAAU,EAAM,CAAExR,MAAOA,IAElC,MACJ,IAAK,QACDkO,EAAKsD,WAAU,EAAM,CAAExR,MAAOA,IAC9B,MACJ,IAAK,YACL,IAAK,YACL,IAAK,aACL,IAAK,UACL,IAAK,YACL,IAAK,MACL,IAAK,OACL,IAAK,cACL,IAAK,eACL,IAAK,iBACL,IAAK,eACL,IAAK,WACL,IAAK,SACDkO,EAAK0E,SAAS9B,EAAW,CAAEP,SAAUA,EAAUvQ,MAAOA,IACtD,MACJ,QACI+Q,GAAU,EAEtB,KACK,CACD,MAAMN,EAAW1U,KAAKoU,sBAAsB,MACtC0C,EAAepC,EAAWA,EAASnS,MAAQmS,EAAS5S,QAAU,GAC9D6S,EAAgBD,GAAY1U,KAAKuU,qBACjCwC,EAAgBrC,GAA6B,aAAjBoC,EAClC,GAAInC,EAAe,CACf,GAAkB,WAAdI,EAOA,OALA5C,EAAK2D,UAEL3D,EAAK6E,SAAS,uBACdjL,EAAK2J,gBACL3J,EAAKkL,UAAUlL,EAAKmL,cAInB,GAAkB,UAAdnC,EAGL,YADA5C,EAAK6E,SAAS,WAAWjC,yBASjC,MACK,GAAIL,GAEoB,IAArBK,EAAUhQ,QAAgBgS,EAI1B,OAHArC,EAASyC,QACTzC,EAAS3S,MAAQ,GACjBoQ,EAAK6E,SAAS,gBAAgBjC,MACvB,EAYf,OATkB,QAAdA,GACAA,EAAY,aACZC,GAAU,GAES,cAAdD,IACLA,EAAYhJ,EAAKmL,aAAe,EAAI,YAAc,GAClDlC,GAAU,GAGND,GACJ,IAAK,IACL,IAAK,MAED5C,EAAKwB,aAAY,GACjB,MACJ,IAAK,IACL,IAAK,WACDxB,EAAKwB,aAAY,GACjB,MACJ,IAAK,IACyB,IAAtB5H,EAAKmL,cAAsB/E,EAAK9K,UAAU,aAC1C8K,EAAKyE,iBACL5B,GAAU,GAELN,GAA6B,aAAjBoC,IACjBpC,EAAS0C,QAITpC,GAAU,GAEd,MACJ,IAAK,KACGN,IAAaC,GAAiBoC,IAC9BrC,EAASyC,QACTnC,GAAU,GAEd,MACJ,IAAK,QACDjJ,EAAK2J,YACsB,IAAtB3J,EAAKmL,cAAsBvB,IAAcxD,EAAKqE,gBAC/CrE,EAAKwB,aAAaxB,EAAKoE,cACvBvB,GAAU,GAELN,IAAaC,GAAiBoC,IACnCrC,EAASyC,QACTnC,GAAU,GAEd,MACJ,IAAK,SACDjJ,EAAK2J,WACLvD,EAAKkF,IAAI,yBACLtL,EAAKuL,aAAe1C,IAAkBnL,EAAY8N,OAClDpF,EAAKkF,IAAI,6BACTtL,EAAK4K,YAAW,GAChB5K,EAAK2J,WACLV,GAAU,GAEd,MACJ,IAAK,YACDjJ,EAAK2J,WACDC,GAAaxD,EAAKoE,aAClBpE,EAAKwB,aAAY,IAEXgC,GAAa5J,EAAKmL,aAAe,EACvCnL,EAAKkL,UAAUlL,EAAKmL,aAAe,GAE9BtC,IAAkBnL,EAAY8N,MACnCxL,EAAK4K,YAAW,GAEpB3B,GAAU,EACV,MACJ,IAAK,aACDjJ,EAAK2J,WACDC,IAAcxD,EAAKoE,aACnBpE,EAAKwB,eAECgC,GACN5J,EAAKmL,aAAenL,EAAKyL,QAAQzS,OAAS,GAC1CgH,EAAKkL,UAAUlL,EAAKmL,aAAe,GAEvClC,GAAU,EACV,MACJ,IAAK,OAEDjJ,EAAK2J,YACAC,GAAa5J,EAAKmL,aAAe,GAClCnL,EAAKkL,UAAU,GAEnBjC,GAAU,EACV,MACJ,IAAK,MAEDjJ,EAAK2J,YACAC,GAAa5J,EAAKmL,aAAenL,EAAKyL,QAAQzS,OAAS,GACxDgH,EAAKkL,UAAUlL,EAAKyL,QAAQzS,OAAS,GAEzCiQ,GAAU,EACV,MACJ,IAAK,YACL,IAAK,UACL,IAAK,YACL,IAAK,cACL,IAAK,eACL,IAAK,iBACL,IAAK,eACL,IAAK,WACL,IAAK,SACD7C,EAAK0E,SAAS9B,EAAW,CAAEP,SAAUA,EAAUvQ,MAAOA,IAItD+Q,GAAU,EACV,MACJ,QACIA,GAAU,EAEtB,CACIA,GACA/Q,EAAMoS,gBAGd;;;;;KAQJ,MAAMoB,UAAwB3L,EAC1B,WAAArG,CAAYsG,GACR+D,MAAM/D,EAAM,SAAU,CAAC,GACvB/L,KAAK0X,aAAe,IAAI7T,IAAI,CACxB,YAEA,SACA,YAEJ7D,KAAK2X,OAAS5L,EAAO,aACzB,CACA,IAAAO,GACI,MAAMP,EAAO/L,KAAK+L,KAElB,GAAIA,EAAK1E,UAAU,eAAiB,EAAG,CAEnC,MAAMqQ,EAAe1X,KAAK0X,aACpBC,EAAS3X,KAAK2X,OACpBjR,EAAeqF,EAAM,aAAa,SAAUnJ,EAAMgV,GAE9C,GAAIF,EAAahT,IAAI9B,GACjB,OAAOmJ,EAAK5E,YAAY4L,WAE5B,MAAMnK,EAAQC,KAAKC,MACbwJ,EAAMvG,EAAK5E,YAAY4L,WAE7B,OADAhH,EAAKiL,SAAS,GAAGW,iBAAsB/U,YAAeiG,KAAKC,MAAQF,QAAamK,UAAU,IACnFT,CACX,GACJ,CACJ,CACA,UAAA5F,CAAWC,GAEP3M,KAAK+L,KAAKiL,SAAS,GAAGhX,KAAK2X,uBAAwBhL,EAEvD;;;;;KAQJ,MAIMkL,EAAa,GAebC,EAAW,IAAInI,OAAO,SAOtBoI,EAAW,CACbC,UAAW,CACP5W,MAAO,6BAEP6W,QAAS,8BAITxH,OAAQ,wBACRyH,iBAAkB,qBAElBC,kBAAmB,sBAEnBC,aAAc,8CAEdC,aAAc,qBACdC,eAAgB,eAChBC,aAAc,2BACdC,aAAc,oBACdC,eAAgB,eAChBC,aAAc,sBACdC,OAAQ,gBACRC,WAAY,qBACZC,WAAY,uBACZC,IAAK,sBAETC,aAAc,CACV3X,MAAO,mCACP6W,QAAS,oCACTxH,OAAQ,8BACRyH,iBAAkB,2BAClBC,kBAAmB,4BACnBC,aAAc,oDACdC,aAAc,6BACdC,eAAgB,uBAChBC,aAAc,6BACdC,aAAc,qBACdC,eAAgB,uBAChBC,aAAc,gCACdC,OAAQ,4BACRC,WAAY,4BACZC,WAAY,0BACZC,IAAK,uBAIPE,EAA4B,IAAInV,IAAI,CACtC,UACA,UACA,cACA,YACA,YACA,WACA,WACA,UACA,UAUEoV,EAAqB,CACvB,IAAK,eACL,IAAK,SACLC,IAAK,SACLC,UAAW,OACXC,UAAW,OACXC,WAAY,QACZC,QAAS,KACTC,UAAW,SACX,IAAK,cACLC,OAAQ,cACRC,IAAK,UACLC,KAAM,WACN,cAAe,OACf,eAAgB,QAChB,iBAAkB,OAClB,eAAgB,QAChB,IAAK,YACLC,SAAU,YACVC,SAAU,WACVC,OAAQ,SACR,IAAK,WACLC,SAAU,YAMd,SAASC,EAAqB1I,GAC1B,OAAIA,aAAiB1B,OACV,SAAUwC,GACb,OAAOd,EAAMhR,KAAK8R,EAAKC,MAC3B,GAEJzR,EAAwB,iBAAV0Q,EAAoB,gCAAgCA,KAE3D,SAAUc,GACb,OAAOA,EAAKC,QAAUf,CAG1B,EACJ,CAUA,SAAS2I,GAAgBjI,EAAGC,GACxB,MAAMiI,EAAIlI,EAAEK,MAAMvG,cACZqO,EAAIlI,EAAEI,MAAMvG,cAClB,OAAOoO,IAAMC,EAAI,EAAID,EAAIC,EAAI,GAAK,CACtC,CAiGA,SAASC,GAAqBC,GAC1B,IAAIC,QAAEA,EAAOC,SAAEA,EAAW,EAACC,QAAEA,EAAOC,UAAEA,GAAcJ,EACpDzZ,EAAoB,IAAb2Z,EAAgB,sCAAsCA,KAC7D,IAAIG,EAAcF,EACdG,EAAc,CAAC,EACnB,GAAID,EACA,IAAK,MAAOvW,EAAKnC,KAAUkD,OAAO0V,QAAQF,GACtCC,EAAY3Y,GAASmC,EAK7B,GAAIuW,GAAeA,EAAYnX,EAAG,CAC9B,MAAMzC,EAAM,uEACZkI,QAAQ6R,KAAK/Z,IACZ4Z,EAAaC,GAAe,CAACA,EAAaD,EAC/C,CAGA,GAAwB,MAApBL,EAAOS,UAAmB,CAC1B,MAAMha,EAAM,8FACZ,GAAiB,MAAb2Z,EACA,MAAM,IAAI1Z,MAAMD,GAGhBkI,QAAQ6R,KAAK/Z,GACb2Z,EAAY,CAAEjY,KAAM6X,EAAOS,kBACpBT,EAAOS,SAEtB,CACgB,SAAZR,GAlHR,SAAyBD,GACrB,IAAI7N,EAAIuO,EAAIC,EACZ,MAAMV,QAAEA,EAAOE,QAAEA,EAAU,CAAC,EAACS,YAAEA,EAAc,GAAE3H,SAAEA,GAAa+G,EAC9D,GAAgB,SAAZC,EACA,MAAM,IAAIvZ,MAAM,4CAA4CuZ,KAEhE,GAAIW,GAAeA,EAAYC,SAAS,YACpC,MAAM,IAAIna,MAAM,mDAAmDka,KAEvE,IAAIP,EAAcF,EAClB,GAAIA,EAAQjX,EAAG,CAGX,MAAMzC,EAAM,uEACZkI,QAAQ6R,KAAK/Z,GACb4Z,EAAc,CAAC,EACf,IAAK,MAAOvW,EAAKnC,KAAUkD,OAAO0V,QAAQJ,GACtCE,EAAY1Y,GAASmC,CAE7B,CACA,MAAMgX,EAAkBF,EAAYnJ,KAAKvL,GAAMmU,EAAYnU,KACrD6U,EAAc,GACdC,EAAe,CAAC,EAChBC,EAAiB,CAAC,EAClBC,EAA4C,QAA7B/O,EAAKkO,EAAiB,WAAsB,IAAPlO,EAAgBA,EAAK,MACzEgP,EAAsD,QAAlCT,EAAKL,EAAsB,gBAAsB,IAAPK,EAAgBA,EAAK,WACzF,IAAK,MAAOU,EAAOC,KAAcpI,EAASsH,UAAW,CAKjD,MAAOe,EAAU7W,EAAM8W,EAAS,CAAC,GAAKF,EAEtCA,EAAU,GAAK,KACK,MAAhBA,EAAU,KACVA,EAAU,GAAK,MAKnB5W,EAAKuB,SAAQ,CAACuB,EAAKiU,KACfD,EAAOT,EAAgBU,IAAkBjU,CAAG,IAKhD0T,EAAeG,GAASG,EACxB,MAAMzX,EAAMyX,EAAOL,GACR,MAAPpX,IACAkX,EAAalX,GAAOyX,GAExB,IAAIE,EAAa,KACjB,GAAiB,OAAbH,QACC,GAAwB,iBAAbA,GAEZ,GADAG,EAAaR,EAAeK,QACT5Y,IAAf+Y,EACA,MAAM,IAAI/a,MAAM,yDAAyD4a,WAK7E,GADAG,EAAaT,EAAaM,QACP5Y,IAAf+Y,EACA,MAAM,IAAI/a,MAAM,uDAAuD4a,KAG3EG,GACwC,QAAvCd,EAAKc,EAAWN,UAAsC,IAAPR,IAAsBc,EAAWN,GAAoB,IACrGM,EAAWN,GAAkBlX,KAAKsX,IAGlCR,EAAY9W,KAAKsX,EAEzB,CACAvB,EAAO/G,SAAW8H,CACtB,CAyCQW,CAAgB1B,UAEbA,EAAOC,eACPD,EAAOE,gBACPF,EAAOG,eACPH,EAAOI,iBACPJ,EAAOY,aAiCVT,GAAWC,IAhCf,SAASuB,EAAMC,GACX,IAAK,MAAM7J,KAAQ6J,EAGf/W,OAAOgX,oBAAoB9J,GAAM/L,SAAS8V,IACtC,MAAMna,EAAQoQ,EAAK+J,GAEnB,IAAIC,EAAWD,EASf,GARI3B,GAAoC,MAAzBG,EAAYwB,KACvBC,EAAWzB,EAAYwB,GACnBC,IAAaD,IACb/J,EAAKgK,GAAYpa,SACVoQ,EAAK+J,KAIhB1B,GACiB,iBAAVzY,GACgB,MAAvByY,EAAU2B,GAAmB,CAC7B,MAAMC,EAAW5B,EAAU2B,GAAUpa,GACrC,GAAgB,MAAZqa,EACA,MAAM,IAAItb,MAAM,qBAAqBqb,MAAapa,gBAAoByY,EAAU2B,OAEpFhK,EAAKgK,GAAYC,CACrB,KAGAjK,EAAKkB,UACL0I,EAAM5J,EAAKkB,SAGvB,CAEI0I,CAAM3B,EAAO/G,SAErB;;;;;KAOA,MAAMgJ,GAAe,gCACrB,MAAMC,WAAqBxQ,EACvB,WAAArG,CAAYsG,GACR+D,MAAM/D,EAAM,MAAO,CACfwQ,aAAc,KAKdC,aAAa,EACbC,cAAe,MACfC,kBAAmB,OACnBC,iBAAiB,EACjBC,qBAAqB,EACrBC,oBAAoB,EACpBC,iBAAiB,EACjBC,kBAAkB,EAClBC,mBAAmB,EACnBC,kBAAkB,EAClBC,wBAAwB,EACxBC,QAAQ,EACRC,kBAAmB,GAEnBC,YAAa,EAEbC,eAAgB,KAEhBC,UAAW,KACXC,KAAM,KACNC,QAAS,KAETC,UAAW,KACXC,SAAU,KACVC,WAAY,KACZC,KAAM,KACNC,UAAW,OAGf9d,KAAK+d,QAAU,KACf/d,KAAKge,eAAiB,KACtBhe,KAAKie,eAAiB,EACtBje,KAAKke,uBAAyB,KAC9Ble,KAAKme,eAAiB,KACtBne,KAAKoe,gBAAiB,EACtBpe,KAAKqe,iBAAmB,EACxBre,KAAKse,wBAtjCb,SAAkBlR,EAAMC,EAAO,EAAGrF,EAAU,CAAC,GACzC,IAAI6F,GAAU,EACVE,GAAW,EACf,GAAoB,mBAATX,EACP,MAAM,IAAIc,UAAU,uBAMxB,OAJIhB,EAASlF,KACT6F,EAAU,YAAa7F,IAAYA,EAAQ6F,QAAUA,EACrDE,EAAW,aAAc/F,IAAYA,EAAQ+F,SAAWA,GAErDZ,EAASC,EAAMC,EAAM,CACxBQ,UACAE,WACAP,QAASH,GAEjB,CAuiCuCkR,CAASve,KAAKwe,gBAAiB,GAClE,CACA,IAAAlS,GACIwD,MAAMxD,OAON,MAAMP,EAAO/L,KAAK+L,KACZ0S,EAAU1S,EAAK/D,QAAQ0W,IAEzBD,EAAQlB,WACR3X,EAAQmG,EAAKJ,QAAS,yBAA0B3L,KAAK2e,YAAYC,KAAK5e,OAGtEye,EAAQf,WACR9X,EAAQmG,EAAKJ,QAAS,oCAAqC3L,KAAK6e,YAAYD,KAAK5e,MAEzF,CAEA,UAAA8e,GAEI,MAAMC,EAAM/e,KAAKge,eACjBhe,KAAKie,eAAiB,EAClBc,IACAA,EAAIC,SAAS,4DAA4D,GACzEhf,KAAKge,eAAiB,KAE9B,CAEA,aAAAiB,CAAc3M,GACV,IAAY,IAARA,EACA,OAAO,EAEN,GAAIA,aAAezO,IACpB,OAAOyO,EAAI4M,KAAO,GAAI5M,EAErB,IAAY,IAARA,EACL,OAAO,IAAIzO,IAAI,CAAC,OAAQ,SAAU,UAEjC,GAAmB,iBAARyO,GAAoBjN,EAAQiN,GAExC,OADAA,EAAM5K,EAAM4K,IACD4M,KAAO,GAAI5M,EAE1B,MAAM,IAAIxR,MAAM,uCAAyCwR,EAC7D,CAIA,eAAA6M,CAAgB7Y,EAAG8Y,GACf,MAAMC,EAAK/Y,EAAEgZ,QACb,QAAKF,IAGqB,IAAjBA,EAAQF,KACNG,EAAK,IACN,SACAA,EAAK,KACD,QACA,OAEY,IAAjBD,EAAQF,MAAcE,EAAQ1a,IAAI,QAChC,OAIA2a,EAAKxH,GAAiB,QAAU,SAG/C,CAMA,gBAAA0H,CAAiBjZ,GAEb,IAAIiG,EAIJ,MAAMkS,EAAUze,KAAKmM,SAASuS,IACxBc,EAAsC,QAAhCjT,EAAKkS,EAAQhC,qBAAkC,IAAPlQ,EAAgBA,EAAK,MACnEkT,EAAU,CAAC,MAAO,OAAQ,WAAY,YAAYxE,SAASuE,GAC3DE,EAAU,CAAC,MAAO,OAAQ,WAAY,YAAYzE,SAASuE,GAC3DG,EAAU,CAAC,MAAO,OAAQ,WAAY,YAAY1E,SAASuE,GACjE,IAAIlN,EAAMmM,EAAQ/B,kBAyBlB,OAxBI+B,EAAQ9B,kBACJzc,GACIoG,EAAElC,QAAUqb,IACZnN,EAAM,QAENhM,EAAE/B,SAAWob,IACbrN,EAAM,QAENhM,EAAElC,QAAUkC,EAAE/B,SAAWmb,IACzBpN,EAAM,UAINhM,EAAEhC,SAAWmb,IACbnN,EAAM,QAENhM,EAAE9B,UAAYmb,IACdrN,EAAM,QAENhM,EAAElC,QAAUsb,IACZpN,EAAM,UAIXA,CACX,CAEA,WAAAsN,CAAYC,EAAY9B,EAAS+B,GAK7B,SAAK9f,KAAKmM,SAASuS,IAAIzB,mBAAqBc,KAGxB,WAAf+B,GAA2BD,IAAe9B,EAAQgC,kBACnC,UAAfD,GAA0BD,IAAe9B,EAAQiC,mBAK/CjC,IAAY8B,GAAc9B,EAAQxK,SAAWsM,GACxD,CAEA,eAAArB,GACI,GAAIxe,KAAKigB,cAAgBjgB,KAAKqe,iBAAkB,CAC5C,MAAMI,EAAUze,KAAK+L,KAAK/D,QAAQ0W,IAC5BwB,EAAKlgB,KAAK+L,KAAKJ,QACfwU,EAAYD,EAAGC,UACjBngB,KAAKqe,iBAAmB,EACxB6B,EAAGC,UAAY3X,KAAKC,IAAI,EAAG0X,EAAY1B,EAAQpB,aAE1Crd,KAAKqe,iBAAmB,IAC7B6B,EAAGC,UAAYA,EAAY1B,EAAQpB,YAE3C,CACJ,CAEA,WAAA+C,CAAYC,GACR,MAAMtU,EAAO/L,KAAK+L,KAEZuU,EADUvU,EAAK/D,QAAQ0W,IACDtB,kBACtB8C,EAAKnU,EAAKJ,QACV4U,EAAexU,EAAKyU,cAAcC,aAGlCC,EAASR,EAAGS,aACZR,EAAYD,EAAGC,UAqBrB,OAjBAngB,KAAKqe,iBAAmB,EACpB8B,EAAY,GACZE,EAAY,GACZA,GAAaC,EAAcC,EAG3BvgB,KAAKqe,kBAAoB,EAEpB8B,EAAYD,EAAGU,aAAeF,GACnCL,GAAaK,EAASJ,IAGtBtgB,KAAKqe,iBAAmB,GAExBre,KAAKqe,kBACLre,KAAKse,0BAEF4B,EAAGC,UAAYA,CAC1B,CAEA,UAAAF,GACI,QAASjgB,KAAK+d,OAClB,CAIA,WAAAY,CAAYrY,GACR,IAAIiG,EAEJ,MAAMkS,EAAUze,KAAKmM,SAASuS,IACxBX,EAAU8C,GAAWC,QAAQxa,GACnC,GAAKyX,EAAL,CAQA,GAJI,CAAC,YAAa,WAAW9C,SAAS3U,EAAE/D,OACpCvC,KAAK+L,KAAKiL,SAAS,eAAe1Q,EAAE/D,iBAAiBwb,IAAWzX,GAGrD,cAAXA,EAAE/D,KAAsB,CAGxB,GADA+D,EAAEya,aAAatE,cAAgBgC,EAAQhC,cACnCsB,EAAQiD,YAGR,OAFAjD,EAAQ/G,SAAS,yCACjB1Q,EAAE+P,kBACK,EAIX,IADY0H,EAAQ7I,WAAW,gBAAiB,CAAEjR,MAAOqC,IAGrD,OADAA,EAAE+P,kBACK,EAEX,MAAM4K,EAAWlD,EAAQmD,QAAO,GAAOC,IAEnCA,EAAEC,QAAUD,EAAEjd,WACPid,EAAEjd,GAAG,IAEhB+c,EAASI,QAAUtD,EAAQhS,KAAKC,GAC5ByS,EAAQvB,yBACsC,mBAAnCuB,EAAQvB,uBACf5W,EAAEya,aAAaO,QAAQjF,GAAcoC,EAAQvB,uBAAuB+D,EAAUlD,IAG9EzX,EAAEya,aAAaO,QAAQjF,GAAckF,KAAKC,UAAUP,MAI5B,QAAzB1U,EAAKjG,EAAEya,oBAAiC,IAAPxU,OAAgB,EAASA,EAAGkV,MAAMxG,SAAS,gBAC/E3U,EAAEya,aAAaO,QAAQ,aAAcvD,EAAQ3L,OAEjDpS,KAAK+d,QAAUA,EACf3U,YAAW,KAGP2U,EAAQiB,SAAS,iBAAiB,GACnC,EAEP,KACoB,SAAX1Y,EAAE/D,KACHkc,EAAQjB,MACRO,EAAQ7I,WAAW,WAAY,CAAEjR,MAAOqC,IAI5B,YAAXA,EAAE/D,OACPwb,EAAQiB,SAAS,kBAAkB,GACnChf,KAAK+d,QAAU,KACX/d,KAAKge,gBACLhe,KAAK8e,aAETf,EAAQ7I,WAAW,cAAe,CAAEjR,MAAOqC,KAE/C,OAAO,CA3DP,CAFItG,KAAK+L,KAAKiI,QAAQ,eAAe1N,EAAE/D,eA8D3C,CAIA,WAAAsc,CAAYvY,GACR,IAAIiG,EAEJ,MAAMwR,EAAU/d,KAAK+d,QACf2D,EAAU3D,EAAUA,EAAQhS,KAAO,KACnC8T,EAAagB,GAAWC,QAAQxa,GAChCmY,EAAUze,KAAKmM,SAASuS,IACxBiD,EAAKrb,EAAEya,aACPjB,EAAa9f,KAAKmf,gBAAgB7Y,EAAGtG,KAAKke,wBAChD,GAAK2B,EAAL,CASA,GALI,CAAC,QAAQ5E,SAAS3U,EAAE/D,OACpBvC,KAAK+L,KAAKiL,SAAS,eAAe1Q,EAAE/D,oBAAoBsd,UAAmB8B,aAA+B,EAASA,EAAGlF,sBAC3GkF,aAA+B,EAASA,EAAGC,mBAAmBtb,EAAEgZ,eAAeQ,eAAwB/B,IAAWzX,GAGlH,cAAXA,EAAE/D,KAAsB,CASxB,GARAvC,KAAKke,uBAAyB,KAG1Ble,KAAKge,gBAAkBhe,KAAKge,iBAAmB6B,GAC/C7f,KAAK8e,aAET9e,KAAKge,eAAiB6B,EACtB7f,KAAKie,eAAiBpV,KAAKC,MAG3B+W,EAAWgC,gBAENpD,EAAQ7B,qBAAuBiD,EAAW9T,OAAS2V,GAEnDjD,EAAQ5B,qBAAuBgD,EAAWiC,YAE1CrD,EAAQ3B,kBAAoBiB,GAE5BU,EAAQ1B,mBAAqBgB,aAAyC,EAASA,EAAQgE,aAAalC,KAEpGpB,EAAQzB,mBACLe,GACA8B,EAAWtM,SAAWwK,EAAQxK,QAEjCkL,EAAQxB,kBAAoB4C,IAAe9B,EAG5C,OAFA4D,EAAGC,WAAa,OAChB5hB,KAAK+L,KAAKsL,IAAI,6BACP,EAIXsK,EAAGC,WAAa5hB,KAAKuf,iBAAiBjZ,IAAM,OAC5C,IAAI0b,EAAYnC,EAAW3K,WAAW,gBAAiB,CAAEjR,MAAOqC,IAGhE,OADA0b,EAAYhiB,KAAKif,cAAc+C,GAC1BA,GAILhiB,KAAKke,uBAAyB8D,EAC9BhiB,KAAKme,eAAiBwD,EAAGC,WACzB/B,EAAWb,SAAS,kBACpB1Y,EAAE+P,kBACK,IAPHsL,EAAGC,WAAa,QACT,EAQf,CACK,GAAe,aAAXtb,EAAE/D,KAAqB,CAC5B,MAAM8d,EAAY/Z,EAAE2b,QAAUjiB,KAAK+L,KAAKJ,QAAQuW,UAChDliB,KAAKogB,YAAYC,GACjBsB,EAAGC,WAAa5hB,KAAKuf,iBAAiBjZ,IAAM,OAC5CuZ,EAAW3K,WAAW,eAAgB,CAAEjR,MAAOqC,IAC/C,MAAM6b,EAASniB,KAAKmf,gBAAgB7Y,EAAGtG,KAAKke,wBAU5C,GATAle,KAAKoe,eAAiB+D,EACtBniB,KAAKme,eAAiBwD,EAAGC,WACrBnD,EAAQlC,aAAe,GACvBsD,EAAWrJ,cAAa,KACvBqJ,EAAWuC,YACZvZ,KAAKC,MAAQ9I,KAAKie,eAAiBQ,EAAQlC,eACe,IAA1DsD,EAAW3K,WAAW,iBAAkB,CAAEjR,MAAOqC,KACjDuZ,EAAWlM,eAEVwO,GAAUniB,KAAK4f,YAAYC,EAAY9B,EAASoE,GACjD,OAMJ,OAJAtC,EAAWb,SAAS,eAA2B,SAAXmD,GACpCtC,EAAWb,SAAS,iBAA6B,WAAXmD,GACtCtC,EAAWb,SAAS,gBAA4B,UAAXmD,GACrC7b,EAAE+P,kBACK,CAEX,CACK,GAAe,cAAX/P,EAAE/D,KAGPsd,EAAW3K,WAAW,gBAAiB,CAAEjR,MAAOqC,SAG/C,GAAe,SAAXA,EAAE/D,KAAiB,CACxB+D,EAAE+b,kBACF/b,EAAE+P,iBACFrW,KAAK8e,aACL,MAAMqD,EAASniB,KAAKoe,eACpB,IAAI6C,EAAqC,QAAzB1U,EAAKjG,EAAEya,oBAAiC,IAAPxU,OAAgB,EAASA,EAAG+V,QAAQjG,IACrF4E,EAAWA,EAAWM,KAAKgB,MAAMtB,GAAY,KAC7C,MAAMlD,EAAU/d,KAAK+d,QACfI,EAAiBne,KAAKme,eAC5B/U,YAAW,KAGPyW,EAAW3K,WAAW,WAAY,CAC9BjR,MAAOqC,EACP6b,OAAQA,EACRK,kBAA8B,SAAXL,EAAoB,cAAgBA,EACvDM,oBAAqBtE,EAErBuE,WAAY3E,EACZ4E,eAAgB1B,GAClB,GACH,GACP,CACA,OAAO,CA3GP,CAFIjhB,KAAK8e,YA8Gb;;;;;KAWJ,MAAM8D,GACF,WAAAnd,CAAY6B,GAaR,GAZAtH,KAAK4I,MAAQ,CACTqR,EAAG,EACHC,EAAG,EACH9V,QAAQ,EACRE,SAAS,EACTC,SAAS,EACTC,UAAU,GAEdxE,KAAK6iB,SAAW,KAChB7iB,KAAK8iB,UAAW,EAEhB9iB,KAAK+iB,OAAS,CAAC,YAAa,UAAW,YAAa,YAC/Czb,EAAK0F,KACN,MAAM,IAAIlM,MAAM,0BAEpBd,KAAKsH,KAAOrC,OAAOkD,OAAO,CAAE6a,OAAQ,GAAK1b,GACzCtH,KAAKgN,KAAO1F,EAAK0F,KACjBhN,KAAKijB,SAAWjjB,KAAKkjB,YAAYtE,KAAK5e,MACtCA,KAAK+iB,OAAO3c,SAAS7D,IACjBvC,KAAKgN,KAAK7L,iBAAiBoB,EAAMvC,KAAKijB,SAAS,GAEvD,CAEA,UAAAE,GACInjB,KAAK+iB,OAAO3c,SAAS7D,IACjBvC,KAAKgN,KAAKoW,oBAAoB7gB,EAAMvC,KAAKijB,SAAS,GAE1D,CACA,WAAAI,GACI,OAAOrjB,KAAK6iB,QAChB,CACA,UAAA5C,GACI,OAAOjgB,KAAK8iB,QAChB,CACA,QAAAQ,CAASC,GACDvjB,KAAK8iB,UAAY9iB,KAAKsH,KAAKkc,UAAYD,IACvCA,EAAShhB,KAAO,WAChBvC,KAAKsH,KAAKkc,SAASD,IAEvBvjB,KAAK6iB,SAAW,KAChB7iB,KAAK8iB,UAAW,CACpB,CACA,WAAAI,CAAY5c,GACR,MAAM/D,EAAO+D,EAAE/D,KACT+E,EAAOtH,KAAKsH,KACZic,EAAW,CACbhhB,KAAM+D,EAAE/D,KACR0B,MAAOqC,EACPuc,SAAU7iB,KAAK6iB,SACfY,GAAInd,EAAEod,MAAQ1jB,KAAK4I,MAAMqR,EACzBoF,GAAI/Y,EAAEqd,MAAQ3jB,KAAK4I,MAAMsR,EACzBhT,WAAOpE,GAEX,OAAQP,GACJ,IAAK,UACDvC,KAAKsjB,SAASC,GACd,MACJ,IAAK,YACD,GAAIvjB,KAAK6iB,SAAU,CACf7iB,KAAKsjB,SAASC,GACd,KACJ,CACA,GAAIjc,EAAKrB,SAAU,CACf,IAAItE,EAAO2E,EAAEC,OACb,GAAI5E,EAAK6E,QAAQc,EAAKrB,UAClBjG,KAAK6iB,SAAWlhB,MAEf,CAED,GADAA,EAAOA,EAAK8E,QAAQa,EAAKrB,WACrBtE,EAIA,MAHA3B,KAAK6iB,SAAWlhB,CAKxB,CACJ,CACA3B,KAAK4I,MAAMqR,EAAI3T,EAAEod,MACjB1jB,KAAK4I,MAAMsR,EAAI5T,EAAEqd,MACjB3jB,KAAK4I,MAAMxE,OAASkC,EAAElC,OACtBpE,KAAK4I,MAAMtE,QAAUgC,EAAEhC,QACvBtE,KAAK4I,MAAMrE,QAAU+B,EAAE/B,QACvBvE,KAAK4I,MAAMpE,SAAW8B,EAAE9B,SACxB,MACJ,IAAK,YAGD,IAAKxE,KAAK6iB,SACN,MAEJ,IAAK7iB,KAAK8iB,SAAU,CAChB,GAAIxb,EAAK0b,OAAQ,CAEb,GADcO,EAASE,GAAKF,EAASE,GAAKF,EAASlE,GAAKkE,EAASlE,GACrD/X,EAAK0b,OAAS1b,EAAK0b,OAC3B,KAER,CAEA,GADAO,EAAShhB,KAAO,aACiB,IAA7B+E,EAAKsc,UAAUL,GAAqB,CACpCvjB,KAAKsjB,SAASC,GACd,KACJ,CACAvjB,KAAK8iB,UAAW,CACpB,CACI9iB,KAAK8iB,UAAY9iB,KAAKsH,KAAKkW,OAC3B+F,EAAShhB,KAAO,OAChBvC,KAAKsH,KAAKkW,KAAK+F,IAEnB,MACJ,IAAK,UACD,IAAKvjB,KAAK8iB,SAAU,CAChB9iB,KAAKsjB,SAASC,GACd,KACJ,CACiB,IAAbjd,EAAE7B,OACF8e,EAASrc,OAAQ,EAGjBqc,EAASrc,OAAQ,EAErBlH,KAAKsjB,SAASC,GAG1B;;;;;KAQJ,MAAMM,WAAsB/X,EACxB,WAAArG,CAAYsG,GACR+D,MAAM/D,EAAM,OAAQ,CAEpB,GACA/L,KAAK8jB,SAAW,IAAIlB,GAAa,CAC7B5V,KAAM+W,OAAO9iB,SACbgF,SAAU,sBACV+c,OAAQ,EAERY,UAAYtd,GACDtG,KAAK+L,KAAKJ,QAAQ1J,SAASqE,EAAEuc,UAExCrF,KAAOlX,GAEItG,KAAKgkB,WAAW1d,GAE3Bkd,SAAWld,GACAtG,KAAKgkB,WAAW1d,IAGnC,CACA,IAAAgG,GACIwD,MAAMxD,MACV,CACA,UAAA0X,CAAW1d,GACP,MAAM2d,EAAOpD,GAAWqD,aAAa5d,EAAErC,OAEvCjE,KAAK+L,KAAKsL,IAAI,GAAG/Q,EAAE/D,QAAQ+D,EAAEmd,MAAOnd,EAAG2d,EAC3C;;;;;KAuBJ,MAAMpa,GACF,WAAApE,GACIzF,KAAKmkB,SAAW,IAAIvZ,SAAQ,CAACX,EAASE,KAClCnK,KAAKokB,SAAWna,EAChBjK,KAAKqkB,QAAUla,CAAM,GAE7B,CAEA,OAAAF,CAAQlI,GACJ/B,KAAKokB,SAASriB,EAClB,CAEA,MAAAoI,CAAOma,GACHtkB,KAAKqkB,QAAQC,EACjB,CAEA,OAAA9Z,GACI,OAAOxK,KAAKmkB,QAChB,CAEA,IAAA9Z,CAAKC,GACD,OAAOtK,KAAKmkB,SAAS9Z,KAAKC,EAC9B,CAEA,MAAMA,GACF,OAAOtK,KAAKmkB,SAAS1Z,MAAMH,EAC/B,CAEA,QAAQA,GACJ,OAAOtK,KAAKmkB,SAASI,QAAQja,EACjC;;;;;KAWJ,MAAMka,GAAa,IAAI3gB,IAAI,CACvB,WACA,UACA,WACA,OACA,cACA,MACA,OACA,WACA,aACA,SACA,WACA,iBACA,QACA,UACA,OACA,iBAIE4gB,GAAkB,IAAI5gB,IAAI2gB,IAChCC,GAAgBC,OAAO,YACvBD,GAAgBC,OAAO,gBAQvB,MAAMC,GACF,WAAAlf,CAAYsG,EAAMwH,EAAQ5G,GACtB,IAAIJ,EAAIuO,EAKR9a,KAAK4kB,YAAS9hB,EACd9C,KAAKqT,SAAW,KAGhBrT,KAAK6kB,QAAU,KAEf7kB,KAAK2M,KAAO,CAAC,EACb3M,KAAKoiB,YAAa,EAClBpiB,KAAK8kB,WAAa,EAClB9kB,KAAK+kB,WAAa,KAClB/kB,KAAKglB,UAAW,EAChBhlB,KAAKilB,WAAY,EACjBjlB,KAAKiT,cAAgB,EACrBjT,KAAKklB,QAAU,EACfllB,KAAKmlB,cAAWriB,EAChBnC,GAAQ4S,GAAUA,EAAOxH,OAASA,EAAM,mBAAmBwH,KAC3D5S,GAAQgM,EAAK0G,SAAU,+BACvBrT,KAAK+L,KAAOA,EACZ/L,KAAKuT,OAASA,EACdvT,KAAKkE,IAAM,IAA0B,QAAnBqI,EAAKI,EAAKzI,WAAwB,IAAPqI,EAAgBA,IAAOoY,GAAeS,UACnFplB,KAAKoS,MAAQ,IAA4B,QAArB0I,EAAKnO,EAAKyF,aAA0B,IAAP0I,EAAgBA,EAAK,IAAM9a,KAAKkE,IAAM,KACxE,MAAfyI,EAAKiY,SAAkB5kB,KAAK4kB,OAAS,GAAKjY,EAAKiY,QAClC,MAAbjY,EAAKpK,OAAgBvC,KAAKuC,KAAO,GAAKoK,EAAKpK,MAC3CvC,KAAK0T,UAA6B,IAAlB/G,EAAK+G,SACR,MAAb/G,EAAK0Y,OAAgBrlB,KAAKqlB,KAAO1Y,EAAK0Y,MACtCrlB,KAAKslB,MAAqB,IAAd3Y,EAAK2Y,KACM,MAAvB3Y,EAAK4Y,iBACEvlB,KAAKulB,eAAkB,GAAK5Y,EAAK4Y,gBAExB,MAAhB5Y,EAAK6Y,UAAmBxlB,KAAKwlB,UAAY7Y,EAAK6Y,SAE7B,MAAjB7Y,EAAK8Y,WAAoBzlB,KAAKylB,WAAa9Y,EAAK8Y,UAC7B,MAAnB9Y,EAAK+Y,aAAsB1lB,KAAK0lB,aAAe/Y,EAAK+Y,YACpD1lB,KAAK2lB,UAA6B,IAAlBhZ,EAAKgZ,UACC,IAAtBhZ,EAAKiZ,eAAyB5lB,KAAK4lB,cAAe,GAC9CjZ,EAAKkY,SACL7kB,KAAKgf,SAASrS,EAAKkY,SAGvB,IAAK,MAAO3gB,EAAKnC,KAAUkD,OAAO0V,QAAQhO,GACjC6X,GAAW9f,IAAIR,KAChBlE,KAAK2M,KAAKzI,GAAOnC,GAGrBwR,IAAWvT,KAAKulB,gBAEhBxZ,EAAK8Z,cAAc7lB,KAE3B,CAKA,QAAA2F,GACI,MAAO,kBAAkB3F,KAAKkE,QAAQlE,KAAKoS,SAC/C,CAYA,EAAE0T,OAAOC,YAEL,MAAMC,EAAKhmB,KAAKqT,SAChB,GAAI2S,EACA,IAAK,IAAIlhB,EAAI,EAAGmhB,EAAID,EAAGjhB,OAAQD,EAAImhB,EAAGnhB,IAAK,CACvC,MAAMqc,EAAI6E,EAAGlhB,SACPqc,EACFA,EAAE9N,iBACK8N,EAEf,CAOR,CAsBA,UAAAjM,CAAW3S,EAAMqV,GACb,OAAO5X,KAAK+L,KAAKmJ,WAAW3S,EAAMqC,EAAO,CACrCuN,KAAMnS,KACNkmB,SAAUlmB,KAAKuC,KAAOvC,KAAK+L,KAAK0V,MAAMzhB,KAAKuC,MAAQ,CAAC,GACrDqV,GACP,CAQA,WAAAuO,CAAYlF,EAAUjZ,GAClB,MAAM+D,EAAO/L,KAAK+L,KAClB,IAAIqa,OAAEA,EAAS,KAAIC,mBAAEA,GAAqB,EAAIC,OAAEA,GAAWte,QAAyCA,EAAU,CAAC,EAG/Gse,UAAiDA,EAAStmB,KAAKumB,YAC/D,MAAMC,EAAW,GACjB,IACIza,EAAKkI,cAAa,GACdvO,EAAcub,KACdA,EAAW,CAACA,IAEhB,MAAMwF,EAAcJ,GAAsBC,EAASva,EAAK/D,QAAQ0e,eAChE,IAAK,MAAMC,KAAS1F,EAAU,CAC1B,MAAM2F,EAAcD,EAAMtT,gBACnBsT,EAAMtT,SACb,MAAM8N,EAAI,IAAIwD,GAAe5Y,EAAM/L,KAAM2mB,GACrCF,IAAgBtF,EAAE0F,eAClB1F,EAAEzN,UAAW,GAEjB8S,EAASniB,KAAK8c,GACVyF,GACAzF,EAAEgF,YAAYS,EAAa,CAAEN,OAAQA,EAAS,GAEtD,CACA,GAAKtmB,KAAKqT,SAGL,GAAc,MAAV+S,GAA2C,IAAzBpmB,KAAKqT,SAAStO,OACrC/E,KAAKqT,SAAWrT,KAAKqT,SAASyT,OAAON,OAEpC,CAEDJ,EAASpmB,KAAK+mB,gBAAgBX,GAC9B,MAAMY,EAAMhnB,KAAKqT,SAAS5L,QAAQ2e,GAClCzlB,EAAOqmB,GAAO,EAAG,4CAA4ChnB,QAE7DA,KAAKqT,SAAS4T,OAAOD,EAAK,KAAMR,EACpC,MAZIxmB,KAAKqT,SAAWmT,EAcpBza,EAAKmb,OAAO7d,EAAW8d,UAC3B,CACA,QAQIpb,EAAKkI,cAAa,EACtB,CAIA,OAAOuS,EAAS,EACpB,CAUA,OAAAY,CAAQnG,EAAUzQ,EAAO,eAIrB,OAHa,SAATA,IACAA,EAAO,eAEHA,GACJ,IAAK,QACD,OAAOxQ,KAAKuT,OAAO4S,YAAYlF,EAAU,CACrCmF,OAAQpmB,KAAK+f,mBAErB,IAAK,SACD,OAAO/f,KAAKuT,OAAO4S,YAAYlF,EAAU,CAAEmF,OAAQpmB,OACvD,IAAK,eAGD,OAAOA,KAAKmmB,YAAYlF,EAAU,CAAEmF,OAAQ,IAChD,IAAK,cACD,OAAOpmB,KAAKmmB,YAAYlF,GAEhCtgB,GAAO,EAAO,iBAAiB6P,IAEnC,CAMA,YAAA6W,CAAaC,EAAKtf,GACd,OAAOhI,KAAK+L,KAAKsb,aAAaC,EAAKtnB,KAAMgI,EAC7C,CAKA,gBAAAuf,CAAiBvf,GACb,IAAK,MAAMmK,KAAQnS,KAAKuT,OAAOF,SACvBlB,IAASnS,MAAQmS,EAAKuB,UACtBvB,EAAKwB,aAAY,EAAO3L,EAGpC,CASA,QAAAgX,CAASwI,EAAWxkB,GAAO,GACvB,MAAMykB,EAAQ/f,EAAM8f,GACpB,GAAIxkB,EACqB,OAAjBhD,KAAK6kB,UACL7kB,KAAK6kB,QAAU,IAAIhhB,KAEvB4jB,EAAMrhB,SAASshB,IACX,IAAInb,EACJvM,KAAK6kB,QAAQ/c,IAAI4f,GACQ,QAAxBnb,EAAKvM,KAAKmlB,gBAA6B,IAAP5Y,GAAyBA,EAAGvK,UAAUgR,OAAO0U,EAAI1kB,EAAK,QAG1F,CACD,GAAqB,OAAjBhD,KAAK6kB,QACL,OAEJ4C,EAAMrhB,SAASshB,IACX,IAAInb,EACJvM,KAAK6kB,QAAQH,OAAOgD,GACK,QAAxBnb,EAAKvM,KAAKmlB,gBAA6B,IAAP5Y,GAAyBA,EAAGvK,UAAUgR,OAAO0U,EAAI1kB,EAAK,IAEjE,IAAtBhD,KAAK6kB,QAAQ3F,OACblf,KAAK6kB,QAAU,KAEvB,CACJ,CAEA,eAAM8C,CAAU3kB,GAAO,EAAMgF,GACzB,MAAM+D,EAAO/L,KAAK+L,KACZ2a,EAAiB1mB,KAAK+L,KAAK/D,QAAQ0e,gBACnCkB,MAAEA,EAAQ,GAAEC,SAAEA,EAAQC,MAAEA,EAAKC,sBAAEA,GAAwB,GAAU/f,QAAyCA,EAAU,CAAC,EACrHggB,EAAa,CACfC,gBAAgB,EAChBH,MAAOA,EACPD,SAAUA,GAgDd,MAAMhmB,EAAMkK,EAAKmc,QAAQ,GAAGloB,kBAAkBgD,MAC9C,IACI+I,EAAKkI,cAAa,SA9CtBxI,eAAesQ,EAAMoF,EAAGgH,GACpB,IAAI5b,EAEJ,GAAc,IAAV4b,EACA,OAKJ,MAAMC,EAAmB,MAATD,EAAgB,KAAOA,EAAQ,EACzCE,EAAW,GA4BjB,OA3BsB,QAArB9b,EAAK4U,EAAE9N,gBAA6B,IAAP9G,GAAyBA,EAAGnG,SAASshB,IAC/D,GAAI1kB,EACA,IAAK0kB,EAAGhU,WAAagU,EAAGrU,UAAawU,GAAYH,EAAGpC,MAAQ,CAIxD,MAAM7R,EAAIiU,EAAG/T,aAAY,EAAMqU,GAC/BK,EAAShkB,KAAKoP,GACdA,EAAEpJ,MAAKoB,gBACGsQ,EAAM2L,EAAIU,EAAQ,GAEhC,MAIIC,EAAShkB,KAAK0X,EAAM2L,EAAIU,UAKvB1B,GAAkBoB,GAASJ,EAAGnB,WAAaG,IAE5CgB,EAAG/T,aAAY,EAAOqU,GAE1BjM,EAAM2L,EAAIU,EACd,IAEG,IAAIxd,SAASX,IAChBW,QAAQ0d,IAAID,GAAUhe,MAAK,KACvBJ,GAAQ,EAAK,GACf,GAEV,CAIU8R,CAAM/b,KAAM4nB,EACtB,CACA,QACI7b,EAAKkI,cAAa,GAClBlI,EAAKwc,WAAW1mB,EACpB,CACIkK,EAAKyc,YAAcT,GACnBhc,EAAKyc,WAAWP,gBAExB,CAyBA,OAAAQ,CAAQpX,GACJ,MAAMqX,EAA2B,mBAAVrX,EAAuBA,EAAQ0I,EAAqB1I,GACrEiB,EAAM,GAMZ,OALAtS,KAAKkT,OAAOiO,IACJuH,EAAQvH,IACR7O,EAAIjO,KAAK8c,EACb,IAEG7O,CACX,CAEA,eAAAyU,CAAgB4B,GACZ,MAAM3C,EAAKhmB,KAAKqT,SAChB,IAAK2S,EACD,OAAO,KAEX,GAAmB,iBAAR2C,GACP,IAAK,IAAI7jB,EAAI,EAAGmhB,EAAID,EAAGjhB,OAAQD,EAAImhB,EAAGnhB,IAClC,GAAIkhB,EAAGlhB,GAAGZ,MAAQykB,EACd,OAAO3C,EAAGlhB,OAIjB,IAAmB,iBAAR6jB,EACZ,OAAO3C,EAAG2C,GAET,GAAIA,EAAIpV,SAAWvT,KAEpB,OAAO2oB,CACX,CACA,OAAO,IACX,CAMA,SAAAC,CAAUvX,GACN,MAAMqX,EAA2B,mBAAVrX,EAAuBA,EAAQ0I,EAAqB1I,GAC3E,IAAIiB,EAAM,KAOV,OANAtS,KAAKkT,OAAOiO,IACR,GAAIuH,EAAQvH,GAER,OADA7O,EAAM6O,GACC,CACX,IAEG7O,CACX,CAKA,eAAAuW,CAAgBC,EAAOC,GAAgB,GACnC,OAAO/oB,KAAK+L,KAAK8c,gBAAgB7oB,KAAM8oB,EAAOC,EAClD,CAIA,YAACC,CAAYC,EAASC,GAGlB,SAASC,EAAShX,GACd,MAAMiX,EAAKjX,EAAKoB,OAAOF,SACvB,OAAOlB,IAASiX,EAAGA,EAAGrkB,OAAS,EACnC,CALAmkB,UAA6DA,EAAa,CAAC,OAAQ,OAAQ,OAAQ,SACnGD,UAAoDA,EAAW9W,GAAS,GAAKA,GAK7E,MAAMkX,EAAgBlX,IAElB,MAAMmX,EAAQ,CAACL,EAAQ9W,IACvBmX,EAAM/e,QAAQ2e,EAAWC,EAAShX,GAAQ,EAAI,IAC9C,IAAIsB,EAAItB,EAAKoB,OACb,KAAOE,GAAKA,IAAMzT,MAEdspB,EAAM/e,QAAQ2e,EAAWC,EAAS1V,GAAK,EAAI,IAC3CA,EAAIA,EAAEF,OAEV,OAAO+V,EAAM3kB,KAAK,GAAG,QAEnBskB,EAAQjpB,MACd,IAAK,MAAMmS,KAAQnS,WACTqpB,EAAalX,EAE3B,CAiBA,MAAAoX,CAAON,EAASC,GACZ,MAAMnX,EAAI,GACV,IAAK,MAAMyX,KAAQxpB,KAAKgpB,YAAYC,EAASC,GACzCnX,EAAE1N,KAAKmlB,GAEX,OAAOzX,EAAEpN,KAAK,KAClB,CAIA,UAAA8kB,CAAWC,GACP,IAAInd,EACkB,iBAAXmd,IACPA,EAAS1pB,KAAK+L,KAAKyL,QAAQmS,WAAW5nB,GAAUA,EAAMiK,KAAO0d,KAEjE,MAAME,EAAoC,QAAxBrd,EAAKvM,KAAKmlB,gBAA6B,IAAP5Y,OAAgB,EAASA,EAAGsd,iBAAiB,eAC/F,OAAOD,EAAWA,EAASF,GAAU,IACzC,CAIA,aAAAlU,GACI,OAAOxV,KAAKqT,SAAWrT,KAAKqT,SAAS,GAAK,IAC9C,CAIA,YAAAyW,GACI,OAAO9pB,KAAKqT,SAAWrT,KAAKqT,SAASrT,KAAKqT,SAAStO,OAAS,GAAK,IACrE,CAEA,QAAAwhB,GACI,IAAIzhB,EAAI,EAAG2O,EAAIzT,KAAKuT,OACpB,KAAOE,GACH3O,IACA2O,EAAIA,EAAEF,OAEV,OAAOzO,CACX,CAEA,cAAAib,GACI,MAAMgK,EAAK/pB,KAAKuT,OAAOF,SACjB2W,EAAMD,EAAGtiB,QAAQzH,MACvB,OAAO+pB,EAAGC,EAAM,IAAM,IAC1B,CAEA,SAAAC,GAEI,OAAOjqB,KAAKuT,MAChB,CAKA,aAAA2W,CAAcC,GAAc,EAAOC,GAAc,GAC7C,MAAMnE,EAAI,GACV,IAAIoE,EAAMD,EAAcpqB,KAAOA,KAAKuT,OACpC,KAAO8W,IACCF,GAAeE,EAAI9W,SACnB0S,EAAE1b,QAAQ8f,GAEdA,EAAMA,EAAI9W,OAEd,OAAO0S,CACX,CAMA,OAAAqE,CAAQF,GAAc,EAAMG,EAAO,QAASC,EAAY,KAIpD,IAAI7iB,EACJ,MAAM8iB,EAAO,GACPC,EAAyB,mBAATH,EAUtB,OATAvqB,KAAKwT,cAAc2N,IACXA,EAAE5N,SACF5L,EAAM+iB,EACAH,EAAKpJ,GACLA,EAAEoJ,GACRE,EAAKlgB,QAAQ5C,GAED,GACjByiB,GACIK,EAAK9lB,KAAK6lB,EACrB,CAEA,cAAAxK,GACI,MAAM+J,EAAK/pB,KAAKuT,OAAOF,SACjB2W,EAAMD,EAAGtiB,QAAQzH,MACvB,OAAO+pB,EAAGC,EAAM,IAAM,IAC1B,CAIA,WAAAW,GACI,GAAI3qB,KAAKslB,KAAM,CACX,GAAqB,MAAjBtlB,KAAKqT,SACL,OAEC,GAA6B,IAAzBrT,KAAKqT,SAAStO,OACnB,OAAO,EAEN,GAA6B,IAAzB/E,KAAKqT,SAAStO,QACnB/E,KAAKqT,SAAS,GAAGwO,eACjB,OAEJ,OAAO,CACX,CACA,SAAU7hB,KAAKqT,WAAYrT,KAAKqT,SAAStO,OAC7C,CAEA,QAAA6lB,CAASpD,GACL,QAAOxnB,KAAK6kB,SAAU7kB,KAAK6kB,QAAQngB,IAAI8iB,EAC3C,CAEA,QAAAlR,GACI,OAAOtW,KAAK+L,KAAKyc,aAAexoB,IACpC,CAIA,YAAA+hB,CAAa8I,GACT,OAAOA,GAASA,EAAMC,eAAe9qB,KACzC,CAIA,SAAA+qB,CAAUF,GACN,OAAOA,GAAS7qB,KAAKuT,SAAWsX,CACpC,CAIA,SAAAlV,GACI,QAAS3V,KAAKqH,UAAU,UAC5B,CAIA,cAAAyjB,CAAeD,GACX,IAAKA,GAASA,EAAM9e,OAAS/L,KAAK+L,KAC9B,OAAO,EAEX,IAAI0H,EAAIzT,KAAKuT,OACb,KAAOE,GAAG,CACN,GAAIA,IAAMoX,EACN,OAAO,EAEPpX,IAAMA,EAAEF,QACRnS,EAAM,0BAA0BqS,KAEpCA,EAAIA,EAAEF,MACV,CACA,OAAO,CACX,CAKA,YAAAiD,CAAawU,GAAe,GAExB,QAAKA,GAAgBhrB,KAAK0T,WAA+B,IAAlB1T,KAAKqT,YAGvB,MAAjBrT,KAAKqT,WACIrT,KAAKslB,KAEW,IAAzBtlB,KAAKqT,SAAStO,UACL/E,KAAK+L,KAAK/D,QAAQijB,yBAGnC,CAEA,SAAAjK,GACI,OAAOhhB,KAAK+L,KAAKoJ,YAAY,sBAAuBnV,KACxD,CAEA,UAAAuW,GACI,QAASvW,KAAK0T,QAClB,CAEA,cAAAwX,GACI,MAAMzX,EAAIzT,KAAKuT,OACf,OAAQE,GAAKA,EAAEJ,SAAS,KAAOrT,IACnC,CAEA,aAAAmrB,GACI,MAAM1X,EAAIzT,KAAKuT,OACf,OAAQE,GAAKA,EAAEJ,SAASI,EAAEJ,SAAStO,OAAS,KAAO/E,IACvD,CAEA,MAAAorB,GACI,QAASprB,KAAKslB,IAClB,CAEA,QAAAxD,GACI,OAAQ9hB,KAAKslB,WAA+BxiB,IAAvB9C,KAAK2qB,aAC9B,CAEA,SAAAU,GACI,OAAOrrB,KAAKoiB,UAChB,CAEA,YAAAkJ,GACI,MAA+B,WAAxBtrB,KAAKulB,cAChB,CAIA,UAAAgG,CAAWV,GACP,OAAOA,GAASA,EAAMtX,SAAWvT,IACrC,CAEA,UAAAwrB,GACI,QAASxrB,KAAKilB,SAClB,CAEA,SAAAwG,GACI,OAAQzrB,KAAK2lB,YAAc3lB,KAAKglB,QACpC,CAEA,OAAA0G,GACI,QAAS1rB,KAAKuT,OAAOmS,YAA6C,UAA/B1lB,KAAKqH,UAAU,WACtD,CAEA,UAAAskB,GACI,QAAS3rB,KAAKmlB,QAClB,CAIA,UAAAyG,GACI,OAAO5rB,KAAK+L,KAAKiB,OAAShN,IAC9B,CAIA,UAAA6rB,GACI,QAAO7rB,KAAK2lB,YAAkB3lB,KAAKglB,eAAWliB,CAClD,CAIA,YAAA+e,GACI,QAAS7hB,KAAKulB,cAClB,CAEA,UAAAuG,GACI,OAAO9rB,KAAK+L,KAAKiB,OAAShN,KAAKuT,MACnC,CAIA,UAAAsT,GAEI,YAA8B/jB,IAAvB9C,KAAK2qB,aAChB,CAIA,SAAAoB,GACI,MAAMC,EAAqC,SAAzBhsB,KAAK+L,KAAK8E,WACtBob,EAAUjsB,KAAKkqB,eAAc,GAAO,GAI1C,GAAI8B,IAAchsB,KAAKqR,QAAUrR,KAAKiT,cAElC,OAAO,EAEX,IAAK,IAAInO,EAAI,EAAGmhB,EAAIgG,EAAQlnB,OAAQD,EAAImhB,EAAGnhB,IAAK,CAE5C,IADUmnB,EAAQnnB,GACX4O,SAEH,OAAO,CAMf,CAEA,OAAO,CACX,CACA,iBAAAwY,CAAkB9R,EAAQ+N,GACtB,IAAI5b,EACJ,MAAMR,EAAO/L,KAAK+L,KAClBoc,UAA8CA,EAAQnoB,KAAKumB,YAE3D,MAAMjU,EAAMtS,KAAKkV,WAAW,UAAW,CAAEiX,SAAU/R,IACxC,MAAP9H,IACA8H,EAAS9H,GAETjN,EAAQ+U,KACRA,EAAS,CAAE/G,SAAU+G,IAEzBzZ,EAAO+E,EAAc0U,GAAS,sCAAsCA,KACpE,MAAMmP,EAAkC,QAAxBhd,EAAK6N,EAAOmP,cAA2B,IAAPhd,EAAgBA,EAAK,SACrE5L,EAAkB,WAAX4oB,GAAkC,SAAXA,EAAmB,gDAAgDA,KAEjGpP,GAAqBC,GACrBzZ,EAAOyZ,EAAO/G,SAAU,gEACpB+G,EAAOqH,QACP1V,EAAK4F,QAAQ,iBAAkByI,EAAO5C,SACtCzL,EAAKqgB,SAAShS,EAAOqH,OAAO,UACrBrH,EAAOqH,OAEdrH,EAAO5C,UACPzL,EAAK4F,QAAQ,mBAAoByI,EAAO5C,SACxCzL,EAAKyL,QAAU4C,EAAO5C,eACf4C,EAAO5C,QACdzL,EAAKmb,OAAO7d,EAAWgjB,eAE3BrsB,KAAKmmB,YAAY/L,EAAO/G,UAExB,IAAK,MAAOnP,EAAKnC,KAAUkD,OAAO0V,QAAQP,GACjCpB,EAA0BtU,IAAIR,KAC/B6H,EAAKY,KAAKzI,GAAOnC,GAIO,SAA5BgK,EAAK/D,QAAQskB,YACbtsB,KAAKusB,4BAETvsB,KAAKkV,WAAW,OACpB,CACA,uBAAMsX,CAAkBpS,GACpB,IAAI7N,EAAIuO,EAER,IAAI2R,EAAKC,EAAQC,EAAM3kB,EAAS4kB,EAC5BC,EAAY,CAAC,EACK,iBAAXzS,GAEPqS,EAAMrS,EACNyS,EAAUC,OAAS,OAEdpnB,EAAc0U,MAEhBqS,MAAKC,SAAQC,OAAM3kB,aAAY4kB,GAASxS,GAC3CzZ,GAAQisB,GAAqC,IAA7B3nB,OAAOO,KAAKonB,GAAM7nB,OAAc,iCAAiCE,OAAOO,KAAKonB,8BAC7FjsB,EAAsB,iBAAR8rB,EAAkB,iCAC5B/mB,EAAcsC,KACd6kB,EAAY7kB,GAEZtC,EAAcinB,KAEdhsB,GAAQksB,EAAUF,KAAM,gDACxBE,EAAUF,KAAOpL,KAAKC,UAAUqL,EAAUF,MACd,QAA3BpgB,EAAKsgB,EAAUC,cAA2B,IAAPvgB,IAAsBsgB,EAAUC,OAAS,SAE7EpnB,EAAcgnB,KACdD,GAAO,IAAM,IAAIM,gBAAgBL,GACL,QAA3B5R,EAAK+R,EAAUC,cAA2B,IAAPhS,IAAsB+R,EAAUC,OAAS,UAIjFL,EAAM,GACNrrB,EAAM,8BAA8BgZ,MAExCpa,KAAKmT,UAAU5J,EAAe0O,SAC9B,MAAMkU,QAAiBa,MAAMP,EAAKI,GAIlC,OAHKV,EAAS/Y,IACVhS,EAAM,OAAOqrB,cAAgBN,EAASniB,WAAWmiB,WAExCA,EAASc,MAC1B,CAEA,UAAMC,CAAK9S,GACP,MAAMrO,EAAO/L,KAAK+L,KACZohB,EAAYtkB,KAAKC,MACjBskB,EAAaptB,KAAKuT,OAClB3K,EAAQC,KAAKC,MACnB,IAAIE,EAAO,EAAGqkB,EAAW,EAAGC,EAAc,EAEtCttB,KAAK8kB,YACL9kB,KAAKgU,QAAQ,2BAA2BmZ,YAAoBntB,KAAK8kB,0BAGrE9kB,KAAK8kB,WAAaqI,EAElB,IAEI,GAD8B,iBAAX/S,EAAsBA,EAASA,EAAOqS,IAYpD,CAED,MAAM9f,QAAa3M,KAAKwsB,kBAAkBpS,GAE1C,GADAiT,EAAWxkB,KAAKC,MAAQF,EACpB5I,KAAK8kB,YAAc9kB,KAAK8kB,WAAaqI,EAErC,YADAntB,KAAKgU,QAAQ,0BAA0BmZ,cAAsBntB,KAAK8kB,0BAMtE,GAFI9kB,KAAKgX,SAAS,uCAAuCmW,KAErC,OAAhBntB,KAAKuT,QAAkC,OAAf6Z,EAExB,YADAptB,KAAKgU,QAAQ,oEAGjBhU,KAAKmT,UAAU5J,EAAe6J,IAQ9B,MAAMma,EAAe1kB,KAAKC,MAC1B9I,KAAKksB,kBAAkBvf,GACvB2gB,EAAczkB,KAAKC,MAAQykB,CAC/B,KArCU,CAGN,GAA2B,mBAAhBnT,EAAO/P,KAAqB,CACnC,MAAMxJ,EAAMkL,EAAKmc,QAAQ,oBAAoB9N,KAC7CA,QAAexP,QAAQX,QAAQmQ,GAC/BrO,EAAKwc,WAAW1nB,EACpB,CACAb,KAAKksB,kBAAkB9R,GACvBkT,EAAczkB,KAAKC,MAAQF,CAC/B,CA4BJ,CACA,MAAOxH,GAIH,MAHApB,KAAKwtB,SAAS,sBAAuBpT,EAAQhZ,GAC7CpB,KAAKkV,WAAW,QAAS,CAAE9T,MAAOA,IAClCpB,KAAKmT,UAAU5J,EAAenI,MAAO,CAAEqsB,QAAS,GAAKrsB,IAC/CA,CACV,CACA,QACIpB,KAAK8kB,WAAa,EAClB9b,EAAOH,KAAKC,MAAQF,EAChBmD,EAAK/D,QAAQ0lB,YAAc,GAC3B3hB,EAAK4F,QAAQ,oBAAoB3I,EAAO,0BACtBqkB,EAAW,qBACVC,EAAc,QAEzC,CACJ,CAEA,cAAMzF,CAAS8F,GAAc,GACzB,MAAMC,EAAc5tB,KAAK0T,SAGzB,GAFA/S,EAAOX,KAAKslB,KAAM,+BAEbqI,GAAgB3tB,KAAK6mB,aAA1B,CAGI7mB,KAAK8hB,YACL9hB,KAAK6tB,YAIT7tB,KAAKmT,UAAU5J,EAAe0O,SAC9B,IACI,MAAMmC,QAAepa,KAAKkV,WAAW,YACrC,IAAe,IAAXkF,EAEA,YADApa,KAAKmT,UAAU5J,EAAe6J,IAGlCzS,EAAO0E,EAAQ+U,IAAYA,GAAUA,EAAOqS,IAAM,6EAC5CzsB,KAAKktB,KAAK9S,GAChBpa,KAAKmT,UAAU5J,EAAe6J,IAC1Bwa,GACA5tB,KAAK0T,UAAW,EAChB1T,KAAK+L,KAAKmb,OAAO7d,EAAW8d,YAG5BnnB,KAAKknB,QAEb,CACA,MAAO5gB,GACHtG,KAAKwtB,SAAS,0BAA2BlnB,GACzCtG,KAAKkV,WAAW,QAAS,CAAE9T,MAAOkF,IAClCtG,KAAKmT,UAAU5J,EAAenI,MAAO,CAAEqsB,QAAS,GAAKnnB,GACzD,CA5BA,CA8BJ,CAEA,GAAA+Q,IAAOxS,GACH7E,KAAKgX,YAAYnS,EACrB,CAEA,QAAAmS,IAAYnS,GACJ7E,KAAK+L,KAAK/D,QAAQ0lB,YAAc,GAChC3kB,QAAQsO,IAAIrX,KAAK2F,cAAed,EAExC,CAEA,QAAA2oB,IAAY3oB,GACJ7E,KAAK+L,KAAK/D,QAAQ0lB,YAAc,GAChC3kB,QAAQ3H,MAAMpB,KAAK2F,cAAed,EAE1C,CAEA,OAAA8M,IAAW9M,GACH7E,KAAK+L,KAAK/D,QAAQ0lB,YAAc,GAChC3kB,QAAQkb,KAAKjkB,KAAK2F,cAAed,EAEzC,CAEA,OAAAmP,IAAWnP,GACH7E,KAAK+L,KAAK/D,QAAQ0lB,YAAc,GAChC3kB,QAAQ6R,KAAK5a,KAAK2F,cAAed,EAEzC,CAMA,iBAAMipB,CAAY9lB,GACd,IAAIlD,EACJ,MAAMipB,EAAM,IAAIlkB,GACVmkB,EAAY,GACZ/B,EAAUjsB,KAAKkqB,eAAc,GAAO,GACpC+D,EAAMhC,EAAQlnB,OACd6O,EAAcvM,EAAUW,EAAS,eAAe,GAChDmV,EAAS9V,EAAUW,EAAS,kBAAkB,GAEpD,IAAKlD,EAAImpB,EAAM,EAAGnpB,GAAK,EAAGA,IAAK,CAE3B,MAAMopB,EAAS,CAAEta,YAAaA,GAC9Boa,EAAU3pB,KAAK4nB,EAAQnnB,GAAG6O,aAAY,EAAMua,GAChD,CAiBA,OAhBAtjB,QAAQ0d,IAAI0F,GAAW3jB,MAAK,KAIpB8S,GAAUnd,KAAK+L,MAEf/L,KAAK+L,KAAKoiB,6BACVnuB,KAAKioB,iBAAiB5d,MAAK,KAEvB0jB,EAAI9jB,SAAS,KAIjB8jB,EAAI9jB,SACR,IAEG8jB,EAAIvjB,SACf,CAEA,MAAA4jB,CAAOvO,EAAYrP,EAAO,cAAeqB,GAarC,IAAImV,EAZS,SAATxW,IACAA,EAAO,eAEE,iBAATA,IACIqP,EAAWxM,UAAYwM,EAAWxM,SAAStO,QAC3CyL,EAAO,SACPqP,EAAaA,EAAWxM,SAAS,IAGjC7C,EAAO,eAIf,MAAMzE,EAAO/L,KAAK+L,KACZqhB,EAAaptB,KAAKuT,OAClB8a,EAAwB,gBAAT7d,EAAyBqP,EAAaA,EAAWtM,OACtE,GAAIvT,OAAS6f,EAAb,CAaA,GAVU7f,KAAKuT,OAGN8a,EAAavD,eAAe9qB,OACjCoB,EAAM,4CAHNA,EAAM,2BAKNitB,IAAiBjB,GACjBA,EAAWkB,mBAAmB,SAAUtuB,MAGR,IAAhCA,KAAKuT,OAAOF,SAAStO,OAAc,CACnC,GAAI/E,KAAKuT,SAAW8a,EAChB,OAEJruB,KAAKuT,OAAOF,SAAWrT,KAAKuT,OAAO+R,KAAO,GAAK,KAC/CtlB,KAAKuT,OAAOG,UAAW,CAC3B,MAEIsT,EAAMhnB,KAAKuT,OAAOF,SAAS5L,QAAQzH,MACnCW,EAAOqmB,GAAO,EAAG,yBACjBhnB,KAAKuT,OAAOF,SAAS4T,OAAOD,EAAK,GAIrC,GADAhnB,KAAKuT,OAAS8a,EACVA,EAAa1D,cACb,OAAQna,GACJ,IAAK,cAED6d,EAAahb,SAAShP,KAAKrE,MAC3B,MACJ,IAAK,SAEDgnB,EAAMqH,EAAahb,SAAS5L,QAAQoY,GACpClf,EAAOqmB,GAAO,EAAG,yBACjBqH,EAAahb,SAAS4T,OAAOD,EAAK,EAAGhnB,MACrC,MACJ,IAAK,QAEDgnB,EAAMqH,EAAahb,SAAS5L,QAAQoY,GACpClf,EAAOqmB,GAAO,EAAG,yBACjBqH,EAAahb,SAAS4T,OAAOD,EAAM,EAAG,EAAGhnB,MACzC,MACJ,QACIoB,EAAM,iBAAiBoP,YAI/B6d,EAAahb,SAAW,CAACrT,MAGzB6R,GACAgO,EAAW3M,MAAMrB,GAAK,GAEtBwc,IAAiBjB,EACjBiB,EAAaC,mBAAmB,OAAQtuB,MAIxCquB,EAAaC,mBAAmB,MAAOtuB,MAGvC+L,IAAS8T,EAAW9T,OAGpB/L,KAAKgU,QAAQ,sCACbhU,KAAKkT,OAAOiO,IAERA,EAAEpV,KAAO8T,EAAW9T,IAAI,IACzB,IAIP3C,YAAW,KAEP2C,EAAKmb,OAAO7d,EAAWklB,IAAI,GAC5B,EAtEH,CAyEJ,CAaA,cAAM1X,CAASiS,EAAO9gB,GAElB8gB,EAAQ7P,EAAmB6P,IAAUA,EAErC,MAAM3W,EAAOnS,KAAK6oB,gBAAgBC,GAClC,IAAK3W,EAED,OADAnS,KAAKgU,QAAQ,gCAAgC8U,OACtCle,QAAQX,QAAQjK,MAG3B,IACImS,EAAK2b,YAAY,CAAE7F,gBAAgB,GACvC,CACA,MAAO3hB,GAEP,CAEA,OADA6L,EAAKuD,YACwE,KAAxE1N,aAAyC,EAASA,EAAQwM,UACpD5J,QAAQX,QAAQjK,MAEpBmS,EAAKsD,WAAU,EAAM,CAAExR,MAAO+D,aAAyC,EAASA,EAAQ/D,OACnG,CAEA,MAAAiQ,GACI,MAAMnI,EAAO/L,KAAK+L,KACZib,EAAMhnB,KAAKuT,OAAOF,SAAS5L,QAAQzH,MACzCA,KAAKwuB,cAAc,UACnBxuB,KAAKuT,OAAOF,SAAS4T,OAAOD,EAAK,GACjChnB,KAAKkT,OAAOiO,IACRA,EAAEsN,eACF1iB,EAAK2iB,gBAAgBvN,EAAE,IACxB,GACHpV,EAAKmb,OAAO7d,EAAW8d,UAC3B,CAEA,cAAAwH,GACI,MAAM5iB,EAAO/L,KAAK+L,KACb/L,KAAKqT,WAGNtH,EAAKyc,YAAczc,EAAKyc,WAAWsC,eAAe9qB,OAClD+L,EAAKyc,WAAW/S,WAAU,GAE1B1J,EAAK+I,WAAa/I,EAAK+I,UAAUgW,eAAe9qB,QAChD+L,EAAK+I,UAAY,MAKrB9U,KAAKsuB,mBAAmB,SAAU,MAClCtuB,KAAKkT,OAAOiO,IACRpV,EAAK2iB,gBAAgBvN,EAAE,IAEvBnhB,KAAKslB,KAELtlB,KAAKqT,SAAW,GAGhBrT,KAAKqT,SAAW,KAGfrT,KAAK4rB,eACN5rB,KAAK0T,UAAW,GAEpB1T,KAAK+L,KAAKmb,OAAO7d,EAAW8d,WAChC,CAEA,YAAAsH,GACQzuB,KAAKmlB,kBACEnlB,KAAKmlB,SAASyJ,SACrB5uB,KAAKmlB,SAASjR,SACdlU,KAAKmlB,cAAWriB,EAExB,CACA,cAAA+rB,GACI,MAAMC,EAAkB,CAAC,EACnBC,EAAqB,CAAC,EACtBpZ,EAAY3V,KAAK2V,YACjBiU,EAAW5pB,KAAKmlB,SACfnlB,KAAKmlB,SAAS0E,iBAAiB,eAChC,KACN,IAAIG,EAAM,EACV,IAAK,MAAMgF,KAAOhvB,KAAK+L,KAAKyL,QACxBsX,EAAgBE,EAAIhjB,IAAM,CACtBA,GAAIgjB,EAAIhjB,GACRge,IAAKA,EACLroB,KAAMioB,EAAWA,EAASI,GAAO,KACjC/F,KAAM+K,GAGLrZ,GAAwB,MAAXqZ,EAAIhjB,KAClB+iB,EAAmBC,EAAIhjB,IAAM8iB,EAAgBE,EAAIhjB,KAErDge,IAEJ,MAAO,CACH8E,gBAAiBA,EACjBC,mBAAoBA,EAE5B,CACA,WAAAE,CAAYC,EAASC,EAAYC,EAAcC,GAC3C,IAAIC,EACAjK,EAAOrlB,KAAKqH,UAAU,QAS1B,GARIrH,KAAK+kB,WACLM,EAAO6J,EAAQ9tB,MAEVpB,KAAKoiB,YAAciN,IAGxBhK,EAAO6J,EAAQjX,UAEN,IAAToN,EACA,OAAO,KAES,iBAATA,IAEPA,EADKrlB,KAAKulB,eACH2J,EAAQlvB,KAAKulB,gBAEfvlB,KAAK0T,SACHwb,EAAQtW,WAEV5Y,KAAKqT,SACH6b,EAAQvW,OAEV3Y,KAAKslB,KACH4J,EAAQrW,WAGRqW,EAAQpW,KAGduM,EAIIA,EAAK5d,QAAQ,MAAQ,EAE1B6nB,EAAWlsB,EAAaiiB,GAEnBvN,EAASzX,KAAKglB,GAEnBiK,EAAWlsB,EAAa,oDAAoDiiB,WAI5EiK,EAAWruB,SAASsC,cAAc,KAClC+rB,EAAS9H,UAAY,WAAanC,IAdlCiK,EAAWruB,SAASsC,cAAc,KAClC+rB,EAAS9H,UAAY,WAerB4H,EACAD,EAAWC,aAAaE,EAAUF,GAGlCD,EAAWI,YAAYD,GAG3B,MAAME,EAAQxvB,KAAKkV,WAAW,YAAa,CAAEoa,SAAUA,IACvD,IAAIG,EAAQ,KACZ,GAAa,MAATD,IAA2B,IAAVA,EAAiB,CAClC,IAAI3K,EAAU,GACV6K,EAAU,GACVhqB,EAAc8pB,IACdC,EAAQ,GAAKD,EAAMC,MACnB5K,EAAU2K,EAAMG,WAAa,IAAMH,EAAMG,WAAa,GACtDD,EAAUF,EAAMI,aAAe,WAAWJ,EAAMI,gBAAkB,IAGlEH,EADsB,iBAAVD,EACJ,GAAKA,EAGLA,EAES,iBAAVC,IACPA,EAAQrsB,EAAa,wBAAwByhB,KAAW6K,KAAWruB,EAAWouB,cAE9EA,GACAH,EAASO,OAAOJ,EAExB,CAEA,OAAOH,CACX,CAKA,cAAAQ,CAAexoB,GACX,MAAMyE,EAAO/L,KAAK+L,KACZgkB,EAAchkB,EAAK/D,QACnByd,EAAWzlB,KAAKqH,UAAU,YAC1BmQ,EAAUzL,EAAKyL,QACf2Q,EAAQnoB,KAAKumB,WACbrP,EAAenL,EAAK6J,WAAa,KAAO7J,EAAKmL,aACnD,IAAIvV,EACAquB,EAAShwB,KAAKmlB,SACd8K,EAAe,KACfC,EAAe,KACnB,MAAMC,GAASH,EACfrvB,EAAOwvB,EAAO,4BACdxvB,GAAQwvB,GAAU7oB,GAAQA,EAAK8oB,MAAQ,wCACvCzvB,GAAQX,KAAK4rB,aAAc,yBAC3BoE,EAAS/uB,SAASsC,cAAc,OAChCysB,EAAOhuB,UAAU8F,IAAI,UACrBkoB,EAAO/sB,MAAMotB,IAAMrwB,KAAKklB,QAAUrN,EAAa,KAC/C7X,KAAKmlB,SAAW6K,EAEhBA,EAAOpB,SAAW5uB,KAClB,MAAMswB,EAAWrvB,SAASsC,cAAc,QACxC+sB,EAAStuB,UAAU8F,IAAI,UAAW,UAClCkoB,EAAOT,YAAYe,GACnB,IAAIC,EAAa,EACb9K,IACAwK,EAAehvB,SAASsC,cAAc,KACtC0sB,EAAajuB,UAAU8F,IAAI,gBACV,UAAb2d,GAAwBzlB,KAAKuT,OAAOmS,aACpCuK,EAAajuB,UAAU8F,IAAI,YAE/BwoB,EAASf,YAAYU,GACrBM,GA9xEO,IAgyEX,IAAK,IAAIzrB,EAAIqjB,EAAQ,EAAGrjB,EAAI,EAAGA,IAC3BnD,EAAOV,SAASsC,cAAc,KAC9B5B,EAAKK,UAAU8F,IAAI,aACnBwoB,EAASf,YAAY5tB,GACrB4uB,GApyEO,KAsyENR,EAAYrJ,gBAAkByB,EAAQ4H,EAAYrJ,kBACnDwJ,EAAejvB,SAASsC,cAAc,KACtC2sB,EAAaluB,UAAU8F,IAAI,eAC3BwoB,EAASf,YAAYW,GACrBK,GA1yEO,IA8yEMvwB,KAAKivB,YAAYljB,EAAKmjB,QAASoB,EAAU,MAAOJ,KAE7DK,GAhzEO,IAkzEX,MAAMC,EAAYvvB,SAASsC,cAAc,QACzCitB,EAAUxuB,UAAU8F,IAAI,YACxBwoB,EAASf,YAAYiB,GAIrBF,EAASG,YAAcF,EAEnBxkB,EAAK/D,QAAQ0W,IAAInB,YACjB+S,EAASI,WAAY,GAIzB,IADkB1wB,KAAK2V,aACL6B,EAAQzS,OAAS,EAAG,CAClC,IAAI2kB,EAAS,EACb,IAAK,MAAMsF,KAAOxX,EAAS,CAEvB,IAAImZ,EADJjH,IAEe,MAAXsF,EAAIhjB,GACJ2kB,EAAUL,GAGVK,EAAU1vB,SAASsC,cAAc,QACjCotB,EAAQ3uB,UAAU8F,IAAI,UACtBkoB,EAAOT,YAAYoB,IAEnBjH,IAAWxS,GACXyZ,EAAQ3uB,UAAU8F,IAAI,aAG1BknB,EAAInK,SAAU8L,EAAQ3uB,UAAU8F,OAAOknB,EAAInK,QAAQ1e,MAAM,MACzDwqB,EAAQ1tB,MAAM2tB,KAAO5B,EAAI6B,OAAS,KAClCF,EAAQ1tB,MAAM6tB,MAAQ9B,EAAI+B,SAAW,KACjCZ,GAASnB,EAAI3rB,MACW,iBAAb2rB,EAAI3rB,OACXstB,EAAQntB,UAAYwrB,EAAI3rB,KAGpC,CACJ,CAGA,OADciE,EAAOA,EAAK8oB,MAAQ,QAE9B,IAAK,QACDrkB,EAAKilB,gBAAgBC,QAAQjB,GAC7B,MACJ,IAAK,OACDjkB,EAAKilB,gBAAgBzB,YAAYS,GACjC,MACJ,QACI1oB,EAAK8oB,MAAMA,MAAMJ,GAGzB1oB,EAAK6oB,OAAQ,EACbnwB,KAAKkxB,aAAa5pB,EACtB,CAMA,YAAA4pB,CAAa5pB,GACT3G,EAAOX,KAAKmlB,SAAU,eACtB,MAAMpZ,EAAO/L,KAAK+L,KACZgkB,EAAchkB,EAAK/D,QACnBgoB,EAAShwB,KAAKmlB,SACdgL,IAAU7oB,EAAK6oB,MACfgB,IAAkB7pB,EAAK6pB,cACvB3Z,EAAUzL,EAAKyL,QACf7B,EAAY3V,KAAK2V,YAEjB2a,EAAWN,EAAO5tB,cAAc,gBAChCouB,EAAYF,EAASluB,cAAc,iBACnC+d,EAAYpU,EAAKJ,QAAQwU,UAa/B,GAZIngB,KAAK8S,mBACL0d,EAAUhtB,UAAYxD,KAAK8S,mBAG3B0d,EAAUY,YAAcpxB,KAAKoS,MAI7B+e,IACAplB,EAAKJ,QAAQwU,UAAYA,IAGxB4P,EAAYsB,SACb,GAAI1b,EAAW,CACX,MAAM2b,EAAUvlB,EAAKJ,QAAQ4lB,YAC7Bf,EAAUvtB,MAAM6tB,MACZQ,EAAUhB,EAASG,YAv4Ed,EAu4E+C,IAC5D,MAEID,EAAUvtB,MAAM6tB,MACZtZ,EAAQ,GAAGuZ,SACPT,EAASG,YA54ER,EA84ED,KAOhB,GAHAnpB,EAAKkqB,cAAe,EACpBxxB,KAAKyxB,eAAenqB,GAEhBtH,KAAKulB,eACLvlB,KAAKkV,WAAW,mBAAoB,CAChCib,MAAOA,EACPG,SAAUA,EACV3a,UAAWA,SAGd,GAAI3V,KAAKuT,OAAQ,CAElB,MAAMme,EAAa1xB,KAAK6uB,iBACxB7uB,KAAKkV,WAAW,SAAU,CACtBib,MAAOA,EACPG,SAAUA,EACV3a,UAAWA,EACXmZ,gBAAiB4C,EAAW5C,gBAC5BC,mBAAoB2C,EAAW3C,oBAEvC,CACJ,CAKA,cAAA0C,CAAenqB,GAEX,MAAMyE,EAAO/L,KAAK+L,KACZmjB,EAAUnjB,EAAKmjB,QACfa,EAAchkB,EAAK/D,QACnBke,EAAWlmB,KAAKuC,KAAOwJ,EAAK0V,MAAMzhB,KAAKuC,MAAQ,KAC/CytB,EAAShwB,KAAKmlB,SAEdmL,EAAWN,EAAO5tB,cAAc,gBAChC8tB,EAAeI,EAASluB,cAAc,iBACtC6tB,EAAeK,EAASluB,cAAc,iBACtCuvB,EAAa,CAAC,UAwBpB,GAvBA3xB,KAAK0T,UAAWie,EAAWttB,KAAK,eAChCrE,KAAKslB,MAAOqM,EAAWttB,KAAK,WAC5BrE,KAAK2lB,UAAWgM,EAAWttB,KAAK,eAChCrE,KAAKglB,UAAW2M,EAAWttB,KAAK,cAChCrE,OAAS+L,EAAKyc,YAAamJ,EAAWttB,KAAK,aAC3CrE,OAAS+L,EAAK+I,WAAY6c,EAAWttB,KAAK,YAC1CrE,KAAK+kB,YAAa4M,EAAWttB,KAAK,YAClCrE,KAAKoiB,YAAauP,EAAWttB,KAAK,cAClCrE,KAAK2V,aAAcgc,EAAWttB,KAAK,cACnCrE,KAAKulB,gBACCoM,EAAWttB,KAAK,aAAerE,KAAKulB,gBAE1CvlB,KAAKqR,OAAQsgB,EAAWttB,KAAK,YAC7BrE,KAAKiT,eAAgB0e,EAAWttB,KAAK,eACrC0rB,EAAYsB,UAAWM,EAAWttB,KAAK,eAEvC2rB,EAAOxI,UAAYmK,EAAWhtB,KAAK,KAEnC3E,KAAK6kB,SAAUmL,EAAOhuB,UAAU8F,OAAO9H,KAAK6kB,SAExCqB,GAAYA,EAASrB,SACrBmL,EAAOhuB,UAAU8F,OAAOoe,EAASrB,SAEjCqL,EAAc,CACd,IAAI0B,EAAQ,KACR5xB,KAAKoiB,WACLwP,EAAQ1C,EAAQjX,QAEXjY,KAAKwW,cAAa,GAEnBob,EADA5xB,KAAK0T,SACGwb,EAAQhX,iBAGRgX,EAAQ/W,kBAGfnY,KAAKslB,MAAyB,MAAjBtlB,KAAKqT,WACvBue,EAAQ1C,EAAQ9W,cAEP,MAATwZ,EACA1B,EAAaluB,UAAU8F,IAAI,aAEtBgQ,EAASzX,KAAKuxB,GACnB1B,EAAajtB,MAAM4uB,gBAAkB,QAAQD,MAG7C1B,EAAa1I,UAAY,eAAiBoK,CAElD,CACA,GAAI3B,EAAc,CACd,IAAI6B,EAAU,eACV9xB,KAAK0rB,WACLoG,GAAW,YACP9xB,KAAK2lB,SACLmM,GAAW5C,EAAQ1W,aAKnBsZ,GAAW5C,EAAQzW,gBAInBzY,KAAK2lB,SACLmM,GAAW5C,EAAQ7W,aAEdrY,KAAKglB,SACV8M,GAAW5C,EAAQ3W,aAGnBuZ,GAAW5C,EAAQ5W,eAG3B2X,EAAazI,UAAYsK,CAC7B,CAEA,IAAKxqB,EAAK6oB,MAAO,CACb,IAAIrrB,EAAI,EACR,IAAK,MAAMitB,KAAW/B,EAAO3c,SACzB0e,EAAQ/vB,UAAUgR,OAAO,YAAalO,MAAQiH,EAAKmL,cAGvD,MAAMoY,EAAWgB,EAASluB,cAAc,aACpCktB,GACAtvB,KAAKivB,YAAYljB,EAAKmjB,QAASoB,EAAUhB,GAAWY,EAE5D,CAEA,IAAwB,IAApB5oB,EAAK0qB,aAAyBhyB,KAAK2V,YAAa,CAChD,MAAMiU,EAAWoG,EAAOnG,iBAAiB,eACzC,IAAIG,EAAM,EACNiI,EAAM,EACV,IAAK,MAAMC,KAAUlyB,KAAK+L,KAAKyL,QAAS,CACpC,MAAMmZ,EAAU/G,EAASI,GACzB2G,EAAQ1tB,MAAM2tB,KAAO,GAAGqB,MACxBtB,EAAQ1tB,MAAM6tB,MAAQ,GAAGoB,EAAOnB,aAChC/G,IACAiI,GAAOC,EAAOnB,QAClB,CACJ,CACJ,CAeA,OAAAjb,CAAQ9N,GAEJ,MAAMV,EAAOrC,OAAOkD,OAAO,CAAEgqB,OAAQ9oB,EAAWsD,MAAQ3E,GAIxD,OAHKhI,KAAKmlB,WACN7d,EAAK6qB,OAAS9oB,EAAW+oB,KAErB9qB,EAAK6qB,QACT,IAAK,SACDnyB,KAAKyxB,eAAenqB,GACpB,MACJ,IAAK,OACDtH,KAAKkxB,aAAa5pB,GAClB,MACJ,IAAK,MAEDtH,KAAK8vB,eAAexoB,GACpB,MACJ,QACIlG,EAAM,wBAAwBkG,EAAK6qB,YAE/C,CAKA,SAAAtE,GACI7tB,KAAK2uB,iBACL3uB,KAAK0T,UAAW,EAChB1T,KAAKslB,MAAO,EACZtlB,KAAKqT,SAAW,KAChBrT,KAAK+L,KAAKmb,OAAO7d,EAAW8d,UAChC,CAYA,MAAAjG,CAAOmR,GAAY,EAAOrxB,GACtB,MAAMsxB,EAAO,CAAC,EAmBd,GAlBA7N,GAAgBre,SAAS8V,IACrB,MAAMvU,EAAM3H,KAAKkc,GACbvU,aAAe9D,IAEf8D,EAAIuX,OACGoT,EAAKpW,GAAY5W,MAAMJ,UAAUP,KAAKS,KAAKuC,EAAInC,OAAQ,OAGzDmC,IAAe,IAARA,GAAyB,IAARA,KAC7B2qB,EAAKpW,GAAYvU,EACrB,IAECpC,EAAcvF,KAAK2M,QACpB2lB,EAAK3lB,KAAO/H,EAAO,CAAC,EAAG5E,KAAK2M,MACxBpH,EAAc+sB,EAAK3lB,cACZ2lB,EAAK3lB,MAGhB3L,EAAU,CACV,MAAMsR,EAAMtR,EAASsxB,EAAMtyB,MAC3B,IAAY,IAARsS,EAEA,OAAO,EAEC,SAARA,IACA+f,GAAY,EAEpB,CACA,GAAIA,GACIhtB,EAAQrF,KAAKqT,UAAW,CACxBif,EAAKjf,SAAW,GAChB,IAAK,IAAIvO,EAAI,EAAGmhB,EAAIjmB,KAAKqT,SAAStO,OAAQD,EAAImhB,EAAGnhB,IAAK,CAClD,MAAMqN,EAAOnS,KAAKqT,SAASvO,GAC3B,IAAKqN,EAAK0P,eAAgB,CAEtB,MAAMvP,EAAMH,EAAK+O,QAAO,EAAMlgB,IAClB,IAARsR,GACAggB,EAAKjf,SAAShP,KAAKiO,EAE3B,CACJ,CACJ,CAEJ,OAAOggB,CACX,CAgBA,SAAAjrB,CAAUzE,EAAM2E,GACZ,MAAMwE,EAAO/L,KAAK+L,KAClB,IAAIzE,EAAOyE,EAAK/D,QAEZpF,EAAK6E,QAAQ,MAAQ,KACpBH,EAAM1E,GAAQA,EAAKuD,MAAM,MAE9B,MAAMpE,EAAQuF,EAAK1E,GAEnB,GAAqB,mBAAVb,EAAsB,CAC7B,MAAMuQ,EAAMvQ,EAAMqD,KAAK2G,EAAM,CACzBxJ,KAAM,UACNwJ,KAAMA,EACNoG,KAAMnS,OAGV,QAAY8C,IAARwP,EACA,OAAOA,CAEf,CAEA,QAAmBxP,IAAf9C,KAAK4C,GACL,OAAO5C,KAAK4C,GAGhB,MAAMsjB,EAAWlmB,KAAKuC,KAAOwJ,EAAK0V,MAAMzhB,KAAKuC,WAAQO,EAC/CwP,EAAM4T,EAAWA,EAAStjB,QAAQE,EACxC,YAAYA,IAARwP,EACOA,EAGJvQ,QAAqCA,EAAQwF,CACxD,CAIA,oBAAM0gB,CAAejgB,GACjB,MAAMV,EAAOrC,OAAOkD,OAAO,CAAEgK,KAAMnS,MAAQgI,GAC3C,OAAOhI,KAAK+L,KAAKwmB,SAASjrB,EAC9B,CAIA,eAAMmO,CAAUzS,GAAO,EAAMgF,GACzB,MAAM+D,EAAO/L,KAAK+L,KACZymB,EAAOzmB,EAAKyc,WACZiK,EAAYzqB,aAAyC,EAASA,EAAQyqB,UACtEC,EAAY1qB,aAAyC,EAASA,EAAQ0qB,UACtE5d,GAAsF,KAAzE9M,aAAyC,EAASA,EAAQ8M,WACvEjB,EAAW7L,aAAyC,EAASA,EAAQ6L,SACrE8e,EAAW3qB,aAAyC,EAASA,EAAQ/D,MAC3E,IAAK4P,EACD,GAAI7Q,GACA,GAAIwvB,IAASxyB,MAAQyyB,EAAW,CAC5B,IAGQ,KAHHD,aAAmC,EAASA,EAAKtd,WAAW,aAAc,CAC3E0d,SAAU5yB,KACViE,MAAO0uB,OAKA,IAHP3yB,KAAKkV,WAAW,iBAAkB,CAC9B2d,SAAUL,EACVvuB,MAAO0uB,IAEX,OAEJ5mB,EAAKyc,WAAa,KAClBgK,SAA4CA,EAAKtL,OAAO7d,EAAWW,OACvE,OAEKwoB,IAASxyB,MAAQyyB,IACtBzyB,KAAKkV,WAAW,aAAc,CAAE0d,SAAU,KAAM3uB,MAAO0uB,IAyB/D,OAtBIH,IAASxyB,OACLgD,IACA+I,EAAKyc,WAAaxoB,MACd8U,GAAa4d,KACb3mB,EAAK+I,UAAY9U,MAEjB0yB,GACA3mB,EAAK2J,YAGb8c,SAA4CA,EAAKtL,OAAO7d,EAAWW,QACnEhK,KAAKknB,OAAO7d,EAAWW,SAEvBhC,GACkB,MAAlBA,EAAQ0hB,QACR1hB,EAAQ0hB,SAAW3d,EAAKmL,cACxBnL,EAAKuL,aACLvL,EAAKkL,UAAUjP,EAAQ0hB,QAEvB1mB,IAAS6Q,GACT7T,KAAKkV,WAAW,WAAY,CAAE2d,SAAUL,EAAMvuB,MAAO0uB,IAElD3yB,KAAK8tB,aAChB,CAIA,iBAAMna,CAAY3Q,GAAO,EAAMgF,GAC3B,MAAM8f,MAAEA,EAAKG,eAAEA,EAAc6K,UAAEA,GAAc9qB,QAAyCA,EAAU,CAAC,EACjG,IAAKhF,GACDhD,KAAKuW,cACLvW,KAAKumB,YAAcvmB,KAAK+L,KAAK1E,UAAU,oBACtCygB,EAED,YADA9nB,KAAKgX,SAAS,+CAGlB,IAAKhU,IAAUhD,KAAK0T,SAChB,OAGA1Q,GAAQhD,KAAKqH,UAAU,iBACvBrH,KAAKunB,iBAAiBvf,GAEtBhF,GAAQhD,KAAKslB,MAAyB,MAAjBtlB,KAAKqT,gBACpBrT,KAAK6nB,WAEf7nB,KAAK0T,SAAW1Q,EAChB,MAAM+vB,EAAa,CAAED,UAAWA,GAGhC,GADA9yB,KAAK+L,KAAKmb,OAAO7d,EAAW8d,UAAW4L,GACnC/vB,GAAQilB,EAAgB,CACxB,MAAM+K,EAAYhzB,KAAK8pB,eACnBkJ,IACAhzB,KAAK+L,KAAKoiB,6BACV6E,EAAU/K,eAAe,CAAEgL,QAASjzB,OAE5C,CACJ,CAKA,QAAA0V,CAAS1S,GAAO,GACZrC,IAASqC,EAAM,+BACf,MAAMwvB,EAAOxyB,KAAK+L,KAAK+I,UACvB9U,KAAK+L,KAAK+I,UAAY9U,KACtBwyB,SAA4CA,EAAKtL,SACjDlnB,KAAKknB,QACT,CAEA,OAAAgM,CAAQ7N,GACJrlB,KAAKqlB,KAAOA,EACZrlB,KAAKknB,QACT,CAEA,MAAAiM,CAAOjvB,EAAK0gB,GACR,MAAM,IAAI9jB,MAAM,sBACpB,CAYA,MAAAomB,CAAOiL,EAAS9oB,EAAWsD,MACvBhM,EAAOwxB,IAAW9oB,EAAWW,QAAUmoB,IAAW9oB,EAAWsD,KAAM,uBAAuBwlB,KAC1FnyB,KAAK+L,KAAKmb,OAAOiL,EAAQnyB,KAC7B,CAKA,gBAAAozB,CAAiBC,GAAgB,GAC7B,MAAM7M,EAAW,GASjB,OARAxmB,KAAKkT,OAAOf,IACR,GAAIA,EAAKwT,WACLa,EAASniB,KAAK8N,IACQ,IAAlBkhB,GACA,MAAO,MAEf,IAEG7M,CACX,CAEA,cAAA5P,CAAe5O,GACX,IAAIhF,EAAOhD,KAAK6rB,aAOhB,OAFI7oB,OAJSF,IAATE,GAAuBhD,KAAK0rB,WAIpB1oB,EAHDhD,KAAKszB,iBAKTtzB,KAAKuzB,YAAYvwB,EAAMgF,EAClC,CAEA,cAAAsrB,GACI,IAAIE,GAAQ,EAUZ,OATAxzB,KAAKkT,OAAOf,IACR,IAAsB,IAAlBA,EAAKwT,WACJxT,EAAKyT,eACLzT,EAAKwY,gBACLxY,EAAKoB,OAAOmS,WAEb,OADA8N,GAAQ,GACD,CACX,IAEGA,CACX,CAEA,wBAAAC,CAAyBC,GACrB,IAAIC,GAAU,EACd,OAAQD,GACJ,KAAK,EACDC,EAAU3zB,KAAK2lB,UAAY3lB,KAAKglB,SAChChlB,KAAK2lB,UAAW,EAChB3lB,KAAKglB,UAAW,EAChB,MACJ,KAAK,EACD2O,GAAW3zB,KAAK2lB,WAAa3lB,KAAKglB,SAClChlB,KAAK2lB,UAAW,EAChB3lB,KAAKglB,UAAW,EAChB,MACJ,UAAKliB,EACD6wB,EAAU3zB,KAAK2lB,WAAa3lB,KAAKglB,SACjChlB,KAAK2lB,UAAW,EAChB3lB,KAAKglB,UAAW,EAChB,MACJ,QACI5jB,EAAM,kBAAkBsyB,KAKhC,OAHIC,GACA3zB,KAAKknB,SAEFyM,CACX,CAKA,uBAAAC,CAAwBtsB,GACpB,MAAMwgB,KAAWxgB,aAAmC,EAASA,EAAKwgB,OAC5D9kB,EAAOhD,KAAK6rB,aAClB7rB,KAAKkT,OAAOf,IACR,GAAIA,EAAKuT,WACL,MAAO,QAEPoC,GAAU3V,EAAK9K,UAAU,iBACzB8K,EAAKshB,yBAAyBzwB,EAClC,IAEJhD,KAAKusB,2BACT,CAOA,yBAAAA,CAA0BjlB,GACtB,MAAMwgB,KAAWxgB,aAAmC,EAASA,EAAKwgB,OAClEnnB,EAAwC,SAAjCX,KAAK+L,KAAK/D,QAAQskB,WAAuB,8BAGhD,MAAMuH,EAAS1hB,IACX,IAAIuhB,EACJ,MAAMrgB,EAAWlB,EAAKkB,SACtB,GAAIA,GAAYA,EAAStO,OAAQ,CAE7B,IAAI+uB,GAAc,EACdC,GAAe,EACnB,IAAK,IAAIjvB,EAAI,EAAGmhB,EAAI5S,EAAStO,OAAQD,EAAImhB,EAAGnhB,IAAK,CAC7C,MAAM6hB,EAAQtT,EAASvO,GAEjBxD,EAAIuyB,EAAMlN,IACN,IAANrlB,IACAyyB,GAAe,IAET,IAANzyB,IACAwyB,GAAc,EAEtB,CACAJ,IAAQI,KAAqBC,QAAejxB,CAChD,MAGI4wB,IAAUvhB,EAAKwT,SAYnB,OATIxT,EAAK6S,WACJ7S,EAAKwT,UACNxT,EAAKmT,MACY,MAAjBnT,EAAKkB,WACLqgB,OAAQ5wB,IAERglB,GAAU3V,EAAK9K,UAAU,iBACzB8K,EAAKshB,yBAAyBC,GAE3BA,CAAK,EAEhBG,EAAM7zB,MAENA,KAAKwT,cAAcrB,IACf,IAAIuhB,EACJ,MAAMrgB,EAAWlB,EAAKkB,SACtB,IAAIygB,GAAc,EACdC,GAAe,EACnB,IAAK,IAAIjvB,EAAI,EAAGmhB,EAAI5S,EAAStO,OAAQD,EAAImhB,EAAGnhB,IAAK,CAC7C,MAAM6hB,EAAQtT,EAASvO,GACvB4uB,IAAU/M,EAAMhB,UAEZ+N,GAAS/M,EAAM3B,YACf+O,GAAe,GAEdL,IACDI,GAAc,EAEtB,CACAJ,IAAQI,KAAqBC,QAAejxB,EAC5CqP,EAAKshB,yBAAyBC,EAAM,GAE5C,CAEA,WAAAH,CAAYvwB,GAAO,EAAMgF,GACrB,MAAM+D,EAAO/L,KAAK+L,KACZioB,IAAehsB,aAAyC,EAASA,EAAQ6L,UACzE2e,EAAOxyB,KAAK6rB,aACZH,EAAU1rB,KAAKuT,QAAUvT,KAAKuT,OAAOmS,WACrC4G,EAAavgB,EAAK/D,QAAQskB,WAC1B2H,GAAajsB,aAAyC,EAASA,EAAQ8f,SAAW9nB,KAAKqH,UAAU,gBAGvG,OAFArE,IAASA,EAEJixB,GAGAjsB,aAAyC,EAASA,EAAQksB,gBAAiC,UAAf5H,GAC7EvgB,EAAKoF,uBAAsB,KACvBnR,KAAKkT,OAAOf,IACRA,EAAKohB,YAAYvwB,EAAK,GACxB,IAECwvB,IAEPxvB,IAASwvB,GACRwB,IAAkE,IAApDh0B,KAAKkV,WAAW,eAAgB,CAAElS,KAAMA,MAG3D+I,EAAKoF,uBAAsB,KACvB,GAAIua,EAAS,CAET,IAAK1oB,KAAUgF,aAAyC,EAASA,EAAQ8f,OACrE,OAAO0K,EAEX,IAAK,MAAM2B,KAAWn0B,KAAKuT,OAAOF,SAC9B8gB,EAAQxO,SAAWwO,IAAYn0B,IAEvC,MAEIA,KAAK2lB,SAAW3iB,EACG,SAAfspB,EACAtsB,KAAK4zB,0BAEe,WAAftH,GACLvgB,EAAKmH,OAAOiO,IACRA,EAAEwE,UAAW,CAAK,GAG9B,IAEAqO,GACAh0B,KAAKkV,WAAW,SAAU,CAAElS,KAAMA,KAzB3BwvB,GAZAA,CAwCf,CAEA,SAAArf,CAAUnJ,EAAQhC,GACd,MAAM+D,EAAO/L,KAAK+L,KACZ0hB,EAAUzlB,aAAyC,EAASA,EAAQylB,QACpE2G,EAAUpsB,aAAyC,EAASA,EAAQosB,QAC1E,IAAIC,EAAa,KACjB,MAOMC,EAAkB3nB,IAIpB,MAAM0G,EAAWrT,KAAKqT,SAChBkhB,EAAalhB,EAAWA,EAAS,GAAK,KAM5C,OALA1S,EAAOgM,EAAK4Y,eAAgB,qBAC5B5kB,GAAQ4zB,IAAeA,EAAW1S,eAAgB,mCAClDwS,EAAar0B,KAAKonB,QAAQza,EAAM,gBAChC0nB,EAAWhjB,OAAQ,EACnBtF,EAAKmb,OAAO7d,EAAW8d,WAChBkN,CAAU,EAGrB,OArByB,MAErB,MAAMhhB,EAAWrT,KAAKqT,SAClBA,GAAYA,EAAStO,QAAUsO,EAAS,GAAGwO,gBAC3CxO,EAAS,GAAGa,QAChB,EAeJsgB,GACQxqB,GACJ,IAAK,KACDhK,KAAKoiB,YAAa,EAClBpiB,KAAK+kB,WAAa,KAClB,MACJ,IAAK,UACD/kB,KAAKoiB,YAAa,EAClBpiB,KAAK+kB,WAAa,KACd/kB,KAAKuT,OACLvT,KAAKknB,OAAO7d,EAAWW,QAIvBsqB,EAAe,CACX/O,eAAgBvb,EAChBoI,MAAOrG,EAAK/D,QAAQysB,QAAQxc,SACvBwV,EAAU,KAAOA,EAAU,IAAM,IACtChI,UAAU,EACVD,SAAS,EACTkK,QAAS0E,IAIjB,MACJ,IAAK,QACDE,EAAe,CACX/O,eAAgBvb,EAChBoI,MAAOrG,EAAK/D,QAAQysB,QAAQC,WACvBjH,EAAU,KAAOA,EAAU,IAAM,IACtChI,UAAU,EACVD,SAAS,EAETkK,QAAS0E,IAEbp0B,KAAKoiB,YAAa,EAClBpiB,KAAK+kB,WAAa,CAAE0I,QAASA,EAAS2G,QAASA,GAC/C,MACJ,IAAK,SACDE,EAAe,CACX/O,eAAgBvb,EAChBoI,MAAOqb,GAAW1hB,EAAK/D,QAAQysB,QAAQhkB,OACvCgV,UAAU,EACVD,SAAS,EACTkK,QAAS0E,IAEbp0B,KAAKoiB,YAAa,EAClBpiB,KAAK+kB,WAAa,KAClB,MACJ,QACI3jB,EAAM,uBAAyB4I,GAGvC,OADA+B,EAAKmb,OAAO7d,EAAW8d,WAChBkN,CACX,CAEA,QAAAM,CAASviB,GACLpS,KAAKoS,MAAQA,EACbpS,KAAKknB,QAET,CACA,aAAA0N,CAAcC,EAAKC,GACf,MAAM9O,EAAKhmB,KAAKqT,SAChB,GAAK2S,IAGLA,EAAG+O,KAAKF,GACJC,GACA,IAAK,IAAIhwB,EAAI,EAAGmhB,EAAID,EAAGjhB,OAAQD,EAAImhB,EAAGnhB,IAC9BkhB,EAAGlhB,GAAGuO,UACN2S,EAAGlhB,GAAG8vB,cAAcC,EAAKC,EAIzC,CAOA,YAAAE,CAAaH,EAAM7a,GAAiB8a,GAAO,GACvC90B,KAAK40B,cAAcC,GAAO7a,GAAiB8a,GAC3C90B,KAAK+L,KAAKmb,OAAO7d,EAAW8d,UAEhC,CAKA,kBAAAmH,CAAmB2G,EAAWtO,EAAO/O,GACjC5X,KAAKgX,SAAS,eAAeie,KAAcrd,EAAO+O,GAC7C3mB,KAAK+L,KAAK/D,QAAQktB,cAGnBvO,GAASA,EAAMpT,SAAWvT,MAC1BoB,EAAM,SAAWulB,EAAQ,sBAAwB3mB,MAErDA,KAAKkV,WAAW,cAAetQ,EAAO,CAAEqwB,UAAWA,EAAWtO,MAAOA,GAAS/O,IAClF,CAMA,aAAA4W,CAAcyG,EAAWrd,GAIrB5X,KAAKuT,OAAO+a,mBAAmB2G,EAAWj1B,KAAM4X,EACpD,CAaA,KAAA1E,CAAMlS,EAAUopB,GAAc,GAC1B,IAAI9X,GAAM,EACV,MAAMe,EAAWrT,KAAKqT,SACtB,IAAoB,IAAhB+W,IACA9X,EAAMtR,EAAShB,OACH,IAARsS,GAAyB,SAARA,GACjB,OAAOA,EAGf,GAAIe,EACA,IAAK,IAAIvO,EAAI,EAAGmhB,EAAI5S,EAAStO,OAAQD,EAAImhB,IACrC3T,EAAMe,EAASvO,GAAGoO,MAAMlS,GAAU,IACtB,IAARsR,GAFoCxN,KAOhD,OAAOwN,CACX,CAOA,YAAAkB,CAAaxS,EAAUopB,GAAc,GACjC,GAAIA,IAAkC,IAAnBppB,EAAShB,MACxB,OAAO,EAEX,IAAIyT,EAAIzT,KAAKuT,OACb,KAAOE,GAAG,CACN,IAAoB,IAAhBzS,EAASyS,GACT,OAAO,EAEXA,EAAIA,EAAEF,MACV,CACA,OAAO,CACX,CASA,aAAA4hB,CAAcn0B,EAAUopB,GAAc,GAClC,MAAML,EAAK/pB,KAAKuT,OAAOF,SACvB,IAAK,IAAIvO,EAAI,EAAGmhB,EAAI8D,EAAGhlB,OAAQD,EAAImhB,EAAGnhB,IAAK,CACvC,MAAMqc,EAAI4I,EAAGjlB,GACb,IAAIslB,GAAejJ,IAAMnhB,QACD,IAAhBgB,EAASmgB,GACT,OAAO,CAGnB,CACA,OAAO,CACX,CAIA,SAAAiU,GACI,QAASp1B,KAAK+L,KAAK8E,aAAe7Q,KAAKqR,MAC3C,EAEJsT,GAAeS,SAAW;;;;;;AAQ1B,MAAMiQ,WAAsBvpB,EACxB,WAAArG,CAAYsG,GACR+D,MAAM/D,EAAM,OAAQ,CAChBoB,SAAU,IACVmoB,UAAW,EACXC,UAAW,KACXC,QAAS,GACT/xB,MAAM,EACN6H,QAAQ,EACRmqB,eAAgB,IAChBC,UAAU,EAGVC,WAAY,KACZC,KAAM,KACN1uB,MAAO,OAEXlH,KAAK61B,YAAc,KACnB71B,KAAK81B,YAAc,KACnB91B,KAAK+1B,kBAAoB5oB,EAASnN,KAAKg2B,UAAUpX,KAAK5e,MAAOA,KAAKqM,gBAAgB,YACtF,CAIA,YAAA4pB,CAAalhB,EAAW5C,EAAMwe,EAAS/Y,GACnC,IAAItF,EACJH,EAAKkF,IAAI,gBAAgBtC,KAAc6C,GACvC+Y,EAAQ3uB,UAAU8F,IAAI,WACtB6oB,EAAQ3uB,UAAUkS,OAAO,YACzB,IACI5B,EAAMH,EAAK+C,WAAWH,EAAW6C,EACrC,CACA,MAAOxM,GACH+G,EAAKqb,SAAS,YAAYzY,kBAA2B3J,GACrDulB,EAAQ3uB,UAAU8F,IAAI,YACtB6oB,EAAQ3uB,UAAUkS,OAAO,UAC7B,CAaA,OAXM5B,aAAe1H,UACjB0H,EAAM1H,QAAQX,QAAQqI,IAE1BA,EACK7H,OAAOW,IACR+G,EAAKqb,SAAS,YAAYzY,kBAA2B3J,GACrDulB,EAAQ3uB,UAAU8F,IAAI,WAAW,IAEhCyc,SAAQ,KACToM,EAAQ3uB,UAAUkS,OAAO,UAAU,IAEhC5B,CACX,CAIA,SAAA0jB,CAAU1vB,GAEN,MAAM2d,EAAOpD,GAAWqD,aAAa5d,GAC/B6L,EAAO8R,EAAK9R,KACZwe,EAAU1M,EAAK0M,QAChBxe,GAAwB,IAAhB8R,EAAKyF,OAIlB1pB,KAAKi2B,aAAa,SAAU9jB,EAAMwe,EAAS,CACvC1M,KAAMA,EACNhgB,MAAOqC,EACP4vB,UAAW5vB,EAAEC,OACb4vB,WAAYtV,GAAWnX,KAAKhI,iBAAiB4E,EAAEC,UAP/CvG,KAAK+L,KAAKsL,IAAI,yDAStB,CAIA,IAAA/K,GACIwD,MAAMxD,OACN1G,EAAQ5F,KAAK+L,KAAKJ,QAAS,SAC3B,0CAMCrF,GAAMtG,KAAKg2B,UAAU1vB,IAC1B,CAEA,mBAAA8vB,CAAoBzpB,GAChB,MAAM1I,EAAQ0I,EAAK1I,MACb8Q,EAAY/Q,EAAcC,GAC1B8H,EAAO/L,KAAK+L,KACZypB,EAAUx1B,KAAKqM,gBAAgB,WAMrC,GAAIrM,KAAKq2B,iBAAkB,CACvB,OAAQthB,GACJ,IAAK,QAED,OADA/U,KAAKs2B,gBAAe,EAAM,CAAEryB,MAAOA,KAC5B,EACX,IAAK,SAED,OADAjE,KAAKs2B,gBAAe,EAAO,CAAEryB,MAAOA,KAC7B,EAIf,OAAO,CACX,CAEA,GAAI8H,EAAK6J,YAAoC,IAAtB7J,EAAKmL,aAAoB,CAC5C,OAAQnC,GACJ,IAAK,QACD,GAAIygB,EAAQ/tB,QAAQ,aAAe,GAAKvH,EAEpC,OADAF,KAAKu2B,kBACE,EAEX,MACJ,IAAK,KACD,GAAIf,EAAQ/tB,QAAQ,OAAS,EAGzB,OADAzH,KAAKu2B,kBACE,EAInB,OAAO,CACX,CACA,OAAO,CACX,CAEA,cAAAF,CAAelkB,GACX,OAAOA,EAAOnS,KAAK61B,cAAgB1jB,IAASnS,KAAK61B,WACrD,CAEA,cAAAU,CAAepkB,GACXA,EAAOA,QAAmCA,EAAOnS,KAAK+L,KAAKuJ,gBAC3D,MAAMogB,EAAW11B,KAAKqM,gBAAgB,YAChCf,EAAStL,KAAKqM,gBAAgB,UACpC,IAAK8F,EACD,OAEJnS,KAAK+L,KAAKiL,SAAS,uBAAuB7E,MAC1C,IAAIqkB,EAAYrkB,EAAK+C,WAAW,mBAChC,IAAkB,IAAdshB,EAEA,YADArkB,EAAKR,QAAQ,kCAKjB,IAAkB,IAAd6kB,IAAuBA,EAAW,CAElCA,EAAY,6DADEn1B,EAAW8Q,EAAKC,mCAElC,CACA,MAAMoe,EAAYre,EACbsX,WAAW,GACXrnB,cAAc,aACnBouB,EAAUhtB,UAAYgzB,EACtB,MAAMN,EAAY1F,EAAU7sB,kBACxB+xB,GAEAQ,EAAU/0B,iBAAiB,WAAYmF,IACnC4vB,EAAUO,kBAAkB,IACvBP,EAAUQ,gBAAkB,IAGzCR,EAAU/e,QACN7L,GACA4qB,EAAU5qB,SAEdtL,KAAK61B,YAAc1jB,EACnBA,EAAK+C,WAAW,YAAa,CACzBghB,UAAWA,GAEnB,CAMA,aAAAS,CAAczvB,GACV,OAAOlH,KAAKs2B,eAAepvB,EAAO,CAAC,EACvC,CAMA,cAAAovB,CAAepvB,EAAOc,GAClBA,UAAoDA,EAAU,CAAC,GAC/D,MAAM4uB,EAAY31B,SAAS41B,cAC3B,IAAIza,EAAWwa,EAAYl1B,EAAiBk1B,GAAa,KACzD,MAAMzkB,EAAOnS,KAAK61B,YACZiB,IAAe9uB,EAAQ8uB,WACvBpB,EAAW11B,KAAKqM,gBAAgB,YAItC,GAHI+P,GAAYpc,KAAKqM,gBAAgB,UACjC+P,EAAWA,EAAS3Y,QAEnB0O,EAKL,GADAA,EAAK6E,SAAS,iBAAiB9P,KAAUc,EAAS4uB,EAAWxa,GACzDlV,GAAsB,OAAbkV,GAAqBA,IAAajK,EAAKC,MAAO,CACvD,MAAM2kB,EAASH,EAAUI,kBACzB,GAAID,EAEA,MAAM,IAAIj2B,MAAM,gCAAgCsb,OAAc2a,MAElE,MAAMpG,EAAUxe,EAAKsX,WAAW,GAChCzpB,KAAKi2B,aAAa,aAAc9jB,EAAMwe,EAAS,CAC3CsG,SAAU9kB,EAAKC,MACfgK,SAAUA,EACV8Z,UAAWU,IAEVvsB,MAAMtI,IACP,MAAMg1B,EAASH,EAAUI,kBACzB,GAAItB,GAAYqB,IAAoB,IAAVh1B,EAEtB,MAAM,IAAIjB,MAAM,qCAAqCsb,OAAc2a,OAIlED,IAAwB,IAAV/0B,KAInBoQ,SAA4CA,EAAKwiB,SAASvY,GAG1Dpc,KAAK61B,YAAY/f,QAAQ,CAAEqb,eAAe,IAC1CnxB,KAAK61B,YAAc,KACnB71B,KAAK81B,YAAc,KACnB91B,KAAK+L,KAAK2J,WAAU,IAEnBjL,OAAOW,IACR+G,EAAKqb,SAASpiB,EAAI,GAI1B,MAKIpL,KAAK61B,YAAY/f,QAAQ,CAAEqb,eAAe,IAC1CnxB,KAAK61B,YAAc,KACnB71B,KAAK81B,YAAc,KAEnB91B,KAAK+L,KAAK2J,gBAlDV1V,KAAK+L,KAAKiL,SAAS,mCAoD3B,CAIA,UAAAkgB,CAAW1mB,EAAO,QAAS2B,EAAM7F,GAC7B,MAAMP,EAAO/L,KAAK+L,KAelB,GAbApL,EADAwR,EAAOA,QAAmCA,EAAOpG,EAAKuJ,gBACzC,uDAEb9E,EAAOA,GAAQ,eACH,MAARlE,EACAA,EAAO,CAAE8F,MAAO,IAEK,iBAAT9F,EACZA,EAAO,CAAE8F,MAAO9F,GAGhB3L,EAAO+E,EAAc4G,GAAO,4BAA4BA,MAG9C,iBAATkE,GAAoC,gBAATA,KAC3B2B,aAAmC,EAASA,EAAKqE,cAAa,IAI/D,YAHArE,EAAKwB,cAActJ,MAAK,KACpBrK,KAAKk3B,WAAW1mB,EAAM2B,EAAM7F,EAAK,IAIzC,MAAM6qB,EAAUhlB,EAAKiV,QAAQ9a,EAAMkE,GACnC2mB,EAAQnY,SAAS,eACjBhf,KAAK81B,YAAc3jB,EAEnBglB,EAAQ9lB,OAAQ,EAChB8lB,EAAQrJ,YAAY,CAAEla,aAAa,IAAQvJ,MAAK,KAC5CrK,KAAKu2B,eAAeY,EAAQ,GAEpC;;;;;;;;;;;;KAgBJ,MAAMC,WAAqBzS,GACvB,WAAAlf,CAAYsG,GACR+D,MAAM/D,EAAM,KAAM,CACd7H,IAAK,WACLkO,MAAOrG,EAAKC,IAEpB,CACA,QAAArG,GACI,MAAO,gBAAgB3F,KAAKkE,QAAQlE,KAAK+L,KAAKC,MAClD,EAOJ,MAAM6U,GACF,WAAApb,CAAYuC,GACRhI,KAAKkM,SAAU,EAEflM,KAAK2M,KAAO,CAAC,EACb3M,KAAKq3B,cAAgB,GACrBr3B,KAAKs3B,WAAa,CAAC,EACnBt3B,KAAKu3B,OAAS,IAAIC,IAClBx3B,KAAKy3B,UAAY,IAAID,IACrBx3B,KAAK03B,aAAe,EACpB13B,KAAK23B,oBAAsB,EAC3B33B,KAAK43B,0BAA4B,EAEjC53B,KAAKwoB,WAAa,KAElBxoB,KAAK8U,UAAY,KAEjB9U,KAAKyhB,MAAQ,CAAC,EAEdzhB,KAAKwX,QAAU,GACfxX,KAAK63B,aAAe,CAAC,EAErB73B,KAAK83B,mBAAqB,IAAIj0B,IAE9B7D,KAAK+3B,MAAQruB,EAKb1J,KAAK6Q,WAAa,KAGlB7Q,KAAKkX,aAAe,EAEpBlX,KAAKg4B,cAAe,EAEpBh4B,KAAKiW,oBAAsB,EAE3BjW,KAAKkW,oBAAsB,GAE3BlW,KAAKi4B,cAAgB,EAIrBj4B,KAAKqX,IAAMrX,KAAKgX,SAChB,MAAM1P,EAAQtH,KAAKgI,QAAUpD,EAAO,CAChCoH,GAAI,KACJoO,OAAQ,KACRzO,QAAS,KACT+hB,WAhmHe,EAimHfwK,OAAQ,KAERC,YAAatgB,EACbqX,QAAS,YACT1X,QAAS,KACTiK,MAAO,KAEPvV,SAAS,EACTksB,UAAU,EACVC,aAAa,EACb5S,UAAU,EACViB,eAAgB,EAChBuE,0BAA0B,EAE1BoG,UAAU,EACViH,qBAAsB,KACtBhM,WAAY,QAEZzX,qBAAsB,KACtBkB,aAAa,EAEbwiB,UAAW,KACXpG,OAAQ,KAER/wB,MAAO,KACPo3B,QAAS,KAET/D,QAAS,CACLC,UAAW,QACXzc,QAAS,aAETxH,OAAQ,YAEbzI,GACGywB,EAAgB,IAAI5uB,GAC1B7J,KAAK04B,MAAQD,EAAcjuB,UAC3B,IAAImuB,GAAU,EAoCd,GAnCA34B,KAAK04B,MACAruB,MAAK,KACNsuB,GAAU,EACV,IACI34B,KAAKkV,WAAW,OACpB,CACA,MAAO9T,GAGHpB,KAAKwtB,SAAS,oCAAqCpsB,EACvD,KAECqJ,OAAOW,IACR,GAAIutB,EAGA,MAAMvtB,EAINpL,KAAKkV,WAAW,OAAQ,CAAE9T,MAAOgK,GACrC,IAEJpL,KAAKgM,GAAK1E,EAAK0E,IAAM,SAAU6U,GAAWuE,SAC1CplB,KAAKgN,KAAO,IAAIoqB,GAAap3B,MAC7BA,KAAK44B,mBAAmB,IAAIzkB,EAAgBnU,OAC5CA,KAAK44B,mBAAmB,IAAIvD,GAAcr1B,OAC1CA,KAAK44B,mBAAmB,IAAI/oB,EAAgB7P,OAC5CA,KAAK44B,mBAAmB,IAAItc,GAAatc,OACzCA,KAAK44B,mBAAmB,IAAI/U,GAAc7jB,OAC1CA,KAAK44B,mBAAmB,IAAInhB,EAAgBzX,OAC5CA,KAAK64B,yBAA2B9wB,EAAiB/H,KAAK84B,2BAA2Bla,KAAK5e,MAAO,CAAC,GAE9FA,KAAKwX,QAAUlQ,EAAKkQ,eACblQ,EAAKkQ,SACPxX,KAAKwX,UAAYxX,KAAKwX,QAAQzS,OAAQ,CACvC,MAAMqN,EAA+B,iBAAhB9K,EAAK4wB,OAAsB5wB,EAAK4wB,OAASl4B,KAAKgM,GACnEhM,KAAKwX,QAAU,CAAC,CAAExL,GAAI,IAAKoG,MAAOA,EAAO0e,MAAO,KACpD,CACIxpB,EAAKma,OACLzhB,KAAKosB,SAAS9kB,EAAKma,OAAO,UAEvBna,EAAKma,MAEZzhB,KAAK2L,QAAUzI,EAAiBoE,EAAKqE,SACrChL,IAASX,KAAK2L,QAAS,6BAA6BrE,EAAKqE,WACzD3L,KAAK2L,QAAQ3J,UAAU8F,IAAI,cACtB9H,KAAK2L,QAAQotB,aAAa,cAC3B/4B,KAAK2L,QAAQqtB,SAAW,GAG5Bh5B,KAAK2L,QAAQstB,SAAWj5B,KAExBA,KAAKwgB,cAAgBxgB,KAAK2L,QAAQvJ,cAAc,iBAChD,MAAM82B,EAA4B,MAAf5xB,EAAK4wB,OAAiBl4B,KAAKwX,QAAQzS,OAAS,IAAMuC,EAAK4wB,OAC1E,GAAIl4B,KAAKwgB,cAAe,CAEpB7f,GAAQX,KAAKwX,QAAS,sEACtBxX,KAAKwX,QAAU,GACf,MAAM2hB,EAAan5B,KAAKwgB,cAAcpe,cAAc,cACpD,IAAK,MAAMg3B,KAAUD,EAAWtP,iBAAiB,OAC7C7pB,KAAKwX,QAAQnT,KAAK,CACd2H,GAAIotB,EAAOC,QAAQrtB,IAAM,OAAOhM,KAAKwX,QAAQzS,SAE7CqN,MAAO,GAAKgnB,EAAOhI,YAEnBN,MAAO,KAGnB,KACK,CAED,MAAMwI,EAAU,+BAA+BC,OAAOv5B,KAAKwX,QAAQzS,QAOnE,GANA/E,KAAK2L,QAAQnI,UAAY,kFAGzB81B,uCAGKJ,EAAY,CACFl5B,KAAK2L,QAAQvJ,cAAc,iBACnCa,MAAME,QAAU,MACvB,CACJ,CAEAnD,KAAK2L,QAAQnI,WAAa,kGAI1BxD,KAAKw5B,qBAAuBx5B,KAAK2L,QAAQvJ,cAAc,yBACvDpC,KAAKgxB,gBAAkBhxB,KAAKw5B,qBAAqBp3B,cAAc,oBAC/DpC,KAAKwgB,cAAgBxgB,KAAK2L,QAAQvJ,cAAc,iBAChDpC,KAAK2L,QAAQ3J,UAAUgR,OAAO,UAAWhT,KAAKwX,QAAQzS,OAAS,GAC/D/E,KAAKy5B,kBAEL,CAAC,UAAW,YAAYrzB,SAASszB,IACR,MAAjBpyB,EAAKoyB,IACL15B,KAAK25B,UAAUD,EAASpyB,EAAKoyB,GACjC,IAGApyB,EAAK8S,QACD9S,EAAK+wB,cACLr4B,KAAKgxB,gBAAgBxtB,UACjB,mDAERxD,KAAKktB,KAAK5lB,EAAK8S,QACV/P,MAAK,KAE2B,MAA7B/C,EAAKuN,qBACD7U,KAAK45B,SACL55B,KAAK65B,oBAAoBpwB,EAAY8N,MAGrCvX,KAAK65B,oBAAoBpwB,EAAY2oB,KAIzCpyB,KAAK65B,oBAAoBvyB,EAAKuN,sBAElC4jB,EAAcxuB,SAAS,IAEtBQ,OAAOrJ,IACRq3B,EAActuB,OAAO/I,EAAM,IAE1BmjB,SAAQ,KACT,IAAIhY,EACsD,QAAzDA,EAAKvM,KAAK2L,QAAQvJ,cAAc,2BAAwC,IAAPmK,GAAyBA,EAAG2H,SAC9FlU,KAAK2L,QAAQ3J,UAAUkS,OAAO,kBAAkB,KAIpDukB,EAAcxuB,UAIlBjK,KAAKknB,OAAO7d,EAAWklB,KAEvBvuB,KAAK2L,QAAQxK,iBAAiB,UAAWmF,IAErCtG,KAAKknB,OAAO7d,EAAW8T,OAAO,IAElCnd,KAAK85B,eAAiB,IAAIC,gBAAgBpf,IAEtC3a,KAAKknB,OAAO7d,EAAW2wB,OAAO,IAElCh6B,KAAK85B,eAAeG,QAAQj6B,KAAK2L,SACjC/F,EAAQ5F,KAAKgxB,gBAAiB,QAAS,cAAe1qB,IAClD,MAAM2d,EAAOpD,GAAWqD,aAAa5d,GAC/B6L,EAAO8R,EAAK9R,KACZ+nB,EAAa5zB,EAKnB,IAAuE,IAAnEtG,KAAKkV,WAAW,QAAS,CAAEjR,MAAOqC,EAAG6L,KAAMA,EAAM8R,KAAMA,IAEvD,OADAjkB,KAAKi4B,cAAgBpvB,KAAKC,OACnB,EAEX,GAAIqJ,EAAM,CACN,GAAI+nB,EAAW51B,QAEX,YADA6N,EAAKyE,iBAIT,MAAM4e,EAAUx1B,KAAKqH,UAAU,gBACzBouB,EAAiBz1B,KAAKqH,UAAU,uBAClCmuB,EAAQ/tB,QAAQ,gBAAkB,GAClB,UAAhBwc,EAAK9B,QACLhQ,EAAKmE,cACHmf,GAAkB5sB,KAAKC,MAAQ9I,KAAKi4B,cAAgBxC,IACtDz1B,KAAKmV,YAAY,sBAAuBhD,GAExC8R,EAAKyF,QAAU,EACfvX,EAAKsD,WAAU,EAAM,CAAEiU,OAAQzF,EAAKyF,OAAQzlB,MAAOqC,IAGnD6L,EAAKsD,WAAU,EAAM,CAAExR,MAAOqC,IAE9B2d,EAAK9B,SAAW3Y,EAAW2wB,SAC3BhoB,EAAKwB,aAAaxB,EAAKoE,aAAc,CACjC0R,gBAAwD,IAAxCjgB,EAAQoyB,8BAGvBnW,EAAK9B,SAAW3Y,EAAWic,UAChCtT,EAAKyE,gBAEb,CACA5W,KAAKi4B,cAAgBpvB,KAAKC,KAAK,IAEnClD,EAAQ5F,KAAKgxB,gBAAiB,WAAY,cAAe1qB,IACrD,MAAM2d,EAAOpD,GAAWqD,aAAa5d,GAC/B6L,EAAO8R,EAAK9R,KAElB,IACI,IADAnS,KAAKkV,WAAW,WAAY,CAAEjR,MAAOqC,EAAG6L,KAAMA,EAAM8R,KAAMA,IAE1D,OAAO,EAEP9R,GAAwB,IAAhB8R,EAAKyF,QAAgBvX,EAAKqE,iBAClCxW,KAAKmV,YAAY,uBACjBhD,EAAKwB,aAAaxB,EAAKoE,cAC3B,IAEJ3Q,EAAQ5F,KAAK2L,QAAS,WAAYrF,IAC9B,MAAM2d,EAAOpD,GAAWqD,aAAa5d,GAC/ByO,EAAY/Q,EAAcsC,GAC1B6L,EAAO8R,EAAK9R,MAAQnS,KAAKqV,eAC/BrV,KAAKq6B,UAAU,aAAc,CACzBp2B,MAAOqC,EACP6L,KAAMA,EACN8R,KAAMA,EACNlP,UAAWA,GACb,IAENnP,EAAQ5F,KAAK2L,QAAS,oBAAqBrF,IACvC,MAAMtD,EAAkB,YAAXsD,EAAE/D,KACTsd,EAAagB,GAAWC,QAAQxa,GACtCtG,KAAKkV,WAAW,QAAS,CAAElS,KAAMA,EAAMiB,MAAOqC,IAC1CtD,GAAQhD,KAAK4V,aAAe5V,KAAKghB,cAC7B1Z,EAAKuN,uBAAyBpL,EAAY2oB,IAC1CvS,SAAwDA,EAAWpK,YAGnEzV,KAAK2W,cAGR3T,GACDhD,KAAKmV,YAAY,uBAAuB,EAAM,CAC1ClR,MAAOqC,EACPwwB,YAAY,GAEpB,GAER,CAYA,cAAOwD,CAAQC,GACX,GAAIA,aAAc1Z,GACd,OAAO0Z,EAEN,GAAIA,aAAc5V,GACnB,OAAO4V,EAAGxuB,KAKd,QAHWjJ,IAAPy3B,IACAA,EAAK,GAES,iBAAPA,EACPA,EAAKt5B,SAAS4oB,iBAAiB,eAAe0Q,QAE7C,GAAkB,iBAAPA,EAAiB,CAE7B,IAAK,MAAMC,KAAYv5B,SAAS4oB,iBAAiB,eAAgB,CAC7D,MAAM9d,EAAOyuB,EAASvB,SACtB,GAAIltB,GAAQA,EAAKC,KAAOuuB,EACpB,OAAOxuB,CAEf,CAGA,KADAwuB,EAAKt5B,SAASmB,cAAcm4B,IAExB,OAAO,IAEf,MACSA,EAAGh0B,SACRg0B,EAAKA,EAAGh0B,QAMZ,OAJA5F,EAAO45B,aAAcE,QAAS,oBAAoBF,KAC7CA,EAAG/zB,QAAQ,iBACZ+zB,EAAKA,EAAG9zB,QAAQ,gBAEhB8zB,GAAMA,EAAGtB,SACFsB,EAAGtB,SAEP,IACX,CAIA,WAAI/J,GACA,MAAMrd,EAAM7R,KAAKgI,QAAQknB,QACzB,MAAmB,iBAARrd,EACAkG,EAASlG,GAEbA,CACX,CAIA,cAAOiP,CAAQyZ,GACX,IAAKA,EACD,OAAO,KAEN,GAAIA,aAAc5V,GACnB,OAAO4V,EAOX,SALuBz3B,IAAdy3B,EAAGh0B,SACRg0B,EAAKA,EAAGh0B,QAILg0B,GAAI,CACP,GAAIA,EAAG3L,SACH,OAAO2L,EAAG3L,SAEd2L,EAAKA,EAAG13B,aACZ,CACA,OAAO,IACX,CAYA,EAAEijB,OAAOC,kBACE/lB,KAAKgN,IAChB,CAEA,kBAAA4rB,CAAmB8B,GACf16B,KAAKq3B,cAAchzB,KAAKq2B,GACxB16B,KAAKs3B,WAAWoD,EAAU1uB,IAAM0uB,CAEpC,CAEA,eAAAjB,GACI,IAAK,MAAMjyB,KAAOxH,KAAKq3B,cACnB7vB,EAAI8E,MAEZ,CAEA,aAAAuZ,CAAc1T,GACV,MAAMjO,EAAMiO,EAAKjO,IACjBvD,EAAc,MAAPuD,IAAgBlE,KAAKu3B,OAAO7yB,IAAIR,GAAM,8BAA8BA,OAC3ElE,KAAKu3B,OAAO3vB,IAAI1D,EAAKiO,GACrB,MAAMwoB,EAAKxoB,EAAKyS,OAChB,GAAI+V,EAAI,CACJ,MAAMC,EAAM56B,KAAKy3B,UAAUoD,IAAIF,GAC3BC,EACAA,EAAI9yB,IAAIqK,GAGRnS,KAAKy3B,UAAU7vB,IAAI+yB,EAAI,IAAI92B,IAEnC,CACJ,CAEA,eAAA6qB,CAAgBvc,GACZ,MAAMwoB,EAAKxoB,EAAKyS,OAChB,GAAI+V,EAAI,CACJ,MAAMC,EAAM56B,KAAKy3B,UAAUoD,IAAIF,GAC3BC,GAAOA,EAAIlW,OAAOvS,KAAUyoB,EAAI1b,MAEhClf,KAAKy3B,UAAU/S,OAAOiW,EAE9B,CAEAxoB,EAAKpG,KAAO,KACZoG,EAAKoB,OAAS,KAGdpB,EAAKsc,cACT,CAEA,SAAA4L,CAAUS,EAAMnuB,EAAO,CAAC,GACpB,IAAI2F,EACJ,MAAMyoB,EAAIn2B,EAAO,CAAC,EAAG,CAAEmH,KAAM/L,KAAMgI,QAAShI,KAAKgI,QAASyF,YAAQ3K,GAAa6J,GAC/E,IAAK,MAAMnF,KAAOxH,KAAKq3B,cAAe,CAElC,GADA/kB,EAAM9K,EAAIszB,GAAM11B,KAAKoC,EAAKuzB,IACd,IAARzoB,EACA,WAEaxP,IAAbi4B,EAAEttB,SACF6E,EAAMyoB,EAAEttB,OAEhB,CACA,OAAO6E,CACX,CASA,WAAA6C,CAAYvS,KAASiC,GACjB,MAAO4O,EAAG0N,GAAKve,EAAKuD,MAAM,KACpBrC,EAAMqd,EAAInhB,KAAKs3B,WAAW7jB,GAAKzT,KAC/BoN,EAAOtJ,EAAIqd,GACjB,GAAI/T,EACA,OAAOA,EAAKlG,MAAMpD,EAAKe,GAGvB7E,KAAKwtB,SAAS,6BAA6B5qB,QAEnD,CASA,UAAAsS,CAAW3S,EAAMqV,GACb,MAAOnE,EAAG0N,GAAK5e,EAAK4D,MAAM,KACpBmB,EAAOtH,KAAKgI,QACZoF,EAAO+T,EAAI7Z,EAAKmM,GAAG0N,GAAK7Z,EAAKmM,GACnC,GAAIrG,EACA,OAAOA,EAAKhI,KAAKpF,KAAM4E,EAAO,CAAErC,KAAMA,EAAMwJ,KAAM/L,KAAM0J,KAAM1J,KAAK+3B,OAASngB,GAIpF,CAEA,gBAAAojB,CAAiBhR,GAEb,IAAI7X,EAAO,KAOX,OANAnS,KAAKi7B,WAAW9Z,IACZ,GAAIA,EAAE+D,UAAY8E,EAEd,OADA7X,EAAOgP,GACA,CACX,IAEGhP,CACX,CAEA,gBAAA+oB,CAAiBC,GAAW,GACxB,MAGMhb,EAFengB,KAAK2L,QAEKwU,UAC/B,IAAIib,EAOJ,OALIA,EADAD,EACS3yB,KAAK6yB,MAAMlb,EANR,GAM+BtI,GAGlCrP,KAAK8yB,MAAMnb,EAAYtI,GAE7B7X,KAAKg7B,iBAAiBI,EACjC,CAEA,eAAAG,CAAgBJ,GAAW,GACvB,MAAMK,EAAex7B,KAAK2L,QACpB4U,EAAevgB,KAAKwgB,cAAcC,aAClCN,EAAYqb,EAAarb,UACzBM,EAAe+a,EAAa/a,aAAeF,EACjD,IAAIkb,EAQJ,OANIA,EADAN,EACY3yB,KAAK8yB,OAAOnb,EAAYM,GAAgB5I,GAAc,EAGtDrP,KAAK6yB,MAAMlb,EAAYM,GAAgB5I,GAAc,EAErE4jB,EAAYjzB,KAAKU,IAAIuyB,EAAWz7B,KAAKuR,OAAM,GAAQ,GAC5CvR,KAAKg7B,iBAAiBS,EACjC,CAEA,kBAAAC,CAAmBvpB,EAAM8f,EAAM,GAO3B,OANAjyB,KAAKi7B,WAAW9Z,IAEZ,GADAhP,EAAOgP,EACH8Q,KAAS,EACT,OAAO,CACX,GACD,CAAE0J,SAAS,EAAM/yB,MAAOuJ,GAAQnS,KAAKsV,kBACjCnD,CACX,CAEA,kBAAAypB,CAAmBzpB,EAAM8f,EAAM,GAO3B,OANAjyB,KAAKi7B,WAAW9Z,IAEZ,GADAhP,EAAOgP,EACH8Q,KAAS,EACT,OAAO,CACX,GACD,CAAE0J,SAAS,EAAO/yB,MAAOuJ,GAAQnS,KAAKsV,kBAClCnD,CACX,CAMA,WAAAgU,CAAYlF,EAAUjZ,GAClB,OAAOhI,KAAKgN,KAAKmZ,YAAYlF,EAAUjZ,EAC3C,CAiBA,YAAAqf,CAAaC,EAAKuU,EAAY7zB,GAC1B,IACAmK,EAAM2pB,EAcN,OATID,aAAsBlX,GACtBxS,EAAO0pB,GAGP1pB,EAAOnS,KAAKsV,gBACZ3U,OAAmBmC,IAAZkF,EAAuB,uBAAuBA,KACrDA,EAAU6zB,GAGNvU,GAEJ,IAAK,SACDwU,EAAU3pB,EAAK6N,iBACX8b,IACA3pB,EAAKic,OAAO0N,EAAS,UACrB3pB,EAAKsD,aAET,MACJ,IAAK,WACDqmB,EAAU3pB,EAAK4N,iBACX+b,IACA3pB,EAAKic,OAAO0N,EAAS,SACrB3pB,EAAKsD,aAET,MACJ,IAAK,SACDqmB,EAAU3pB,EAAK6N,iBACX8b,IACA3pB,EAAKic,OAAO0N,EAAS,eACrBA,EAAQnoB,cACRxB,EAAKsD,aAET,MACJ,IAAK,UACItD,EAAK2Z,eACN3Z,EAAKic,OAAOjc,EAAK8X,YAAa,SAC9B9X,EAAKsD,aAET,MAEJ,IAAK,SACDqmB,EAAU3pB,EAAK6N,kBAAoB7N,EAAK8X,YACxC9X,EAAK+B,SACD4nB,GACAA,EAAQrmB,YAEZ,MAEJ,IAAK,WACDzV,KAAKmV,YAAY,kBAAmB,gBACpC,MACJ,IAAK,aACDnV,KAAKmV,YAAY,kBAAmB,SACpC,MACJ,IAAK,SACDnV,KAAKmV,YAAY,uBACjB,MA0BJ,IAAK,OACL,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,WACL,IAAK,SACL,IAAK,SACL,IAAK,QACL,IAAK,KACD,OAAOhD,EAAK0E,SAASyQ,GACzB,QACIlmB,EAAM,uBAAuBkmB,MAEzC,CAEA,KAAAyU,GACI/7B,KAAKgN,KAAK2hB,iBACV3uB,KAAKgN,KAAKqG,SAAW,KACrBrT,KAAKu3B,OAAOwE,QACZ/7B,KAAKy3B,UAAUsE,QAEf/7B,KAAK03B,aAAe,EACpB13B,KAAKwoB,WAAa,KAClBxoB,KAAK8U,UAAY,KAejB9U,KAAKknB,OAAO7d,EAAW8d,UAC3B,CAQA,OAAA6U,GACIh8B,KAAK2R,QAAQ,gBACb3R,KAAK+7B,QACL/7B,KAAK85B,eAAe3W,aACpBnjB,KAAK2L,QAAQnI,UAAY,GAEzBxD,KAAK2L,QAAQswB,UAAYj8B,KAAK2L,QAAQswB,SAC1C,CAUA,SAAA50B,CAAUzE,EAAM2E,GACZ,IAAIC,EACAF,EAAOtH,KAAKgI,QAEZpF,EAAK6E,QAAQ,MAAQ,KACpBD,EAAK5E,GAAQA,EAAKuD,MAAM,KACzBmB,EAAOA,EAAKE,IAEhB,IAAIzF,EAAQuF,EAAK1E,GAOjB,MALqB,mBAAVb,IACPA,EAAQA,EAAM,CAAEQ,KAAM,UAAWwJ,KAAM/L,QAIpC+B,QAAqCA,EAAQwF,CACxD,CAKA,SAAAoyB,CAAU/2B,EAAMb,GAEZ,GAAIa,EAAK6E,QAAQ,MAAQ,EAAzB,CACI,MAAM6hB,EAAQ1mB,EAAKuD,MAAM,KACbnG,KAAKs3B,WAAWhO,EAAM,IAC9B9c,gBAAgB8c,EAAM,GAAIvnB,EAElC,MAEA,OADA/B,KAAKgI,QAAQpF,GAAQb,EACba,GACJ,IAAK,WACD5C,KAAKknB,OAAO7d,EAAWklB,KACvB,MACJ,IAAK,UACDvuB,KAAKyM,aAAa1K,GAClB,MACJ,IAAK,WACD/B,KAAK2L,QAAQ3J,UAAUgR,OAAO,iBAAkBjR,GAG5D,CAEA,QAAAm6B,GACI,OAAOl8B,KAAK2L,QAAQ1J,SAAShB,SAAS41B,cAC1C,CAMA,SAAAsF,GACI,MAAMjE,EAASl4B,KAAKgI,QAAQkwB,OAC5B,OAAOl4B,KAAK45B,UAAsB,IAAX1B,IAAqBA,CAChD,CASA,qBAAA/mB,CAAsB/D,EAAMgvB,EAAO,MAC/B,IACIp8B,KAAKiU,cAAa,GAClB,MAAM3B,EAAMlF,IAEZ,OADAzM,IAAS2R,aAAe1H,SAAU,+BAA+B0H,KAC1DA,CACX,CACA,QACItS,KAAKiU,cAAa,EACtB,CACJ,CAEA,eAAM0T,CAAU3kB,GAAO,EAAMgF,SACnBhI,KAAKgN,KAAK2a,UAAU3kB,EAAMgF,EACpC,CAEA,SAAAq0B,CAAUr5B,GAAO,GACb,OAAOhD,KAAKgN,KAAKumB,YAAYvwB,EAAM,CAAEkxB,eAAe,GACxD,CAEA,YAAAoI,GACIt8B,KAAKq8B,UAAUr8B,KAAKgN,KAAKsmB,iBAC7B,CAKA,gBAAAF,CAAiBC,GAAgB,GAC7B,OAAOrzB,KAAKgN,KAAKomB,iBAAiBC,EACtC,CAIA,YAAAkJ,CAAaC,GACTx8B,KAAKgX,SAAS,eAAgBwlB,GAC9Bp7B,EAAM,uBA8BV,CAIA,KAAAmQ,CAAMkrB,GAAU,GACZ,OAAOA,EAAUz8B,KAAK03B,aAAe13B,KAAKu3B,OAAOrY,IACrD,CAEA,MAAAwd,GACI,IAAI53B,EAAI,EACR9E,KAAKkT,OAAOiO,IACRrc,GAAG,IAEH9E,KAAKu3B,OAAOrY,OAASpa,GACrB9E,KAAKgU,QAAQ,kBAAkBhU,KAAKu3B,OAAOrY,YAAYpa,IAG/D,CAMA,OAAA2jB,CAAQpX,GACJ,OAAOrR,KAAKgN,KAAKyb,QAAQpX,EAC7B,CAMA,SAAAuX,CAAUvX,GACN,OAAOrR,KAAKgN,KAAK4b,UAAUvX,EAC/B,CASA,OAAAsrB,CAAQz4B,GACJ,OAAOlE,KAAKu3B,OAAOsD,IAAI32B,IAAQ,IACnC,CAKA,YAAAkS,CAAa/E,EAAOurB,GAEhB,IAAItqB,EAAM,KACV,MAAMiD,EAAYvV,KAAKwV,gBACjBkT,EAA2B,iBAAVrX,EAj1I/B,SAAmC/P,GAC/BA,EAAIE,EAAYF,GAChB,MAAMu7B,EAAU,IAAIltB,OAAO,IAAMrO,EAAG,KACpC,OAAO,SAAU6Q,GACb,OAAO0qB,EAAQx8B,KAAK8R,EAAKC,MAC7B,CACJ,CA20IoD0qB,CAA0BzrB,GAASA,EAE/E,SAAS0rB,EAAW5b,GAKhB,GAHIuH,EAAQvH,KACR7O,EAAM6O,GAEN7O,GAAO6O,IAAMyb,EACb,OAAO,CAEf,CAYA,OArBAA,EAAYA,GAAarnB,EAUzBvV,KAAKi7B,UAAU8B,EAAY,CACvBn0B,MAAOg0B,EACPxS,aAAa,IAGZ9X,GAAOsqB,IAAcrnB,GACtBvV,KAAKi7B,UAAU8B,EAAY,CACvBn0B,MAAO2M,EACP6U,aAAa,IAGd9X,CACX,CAUA,eAAAuW,CAAgB1W,EAAM2W,EAAOC,GAAgB,GACzC,IAAIzW,EAAM,KACV,MAAM0qB,EAAWx0B,KAAK8yB,MAAMt7B,KAAKw5B,qBAAqB/Y,aAAe5I,GACrE,OAAQiR,GACJ,IAAK,SAsBL,IAAK,OACG3W,EAAKoB,QAAUpB,EAAKoB,OAAOA,SAC3BjB,EAAMH,EAAKoB,QAOf,MA1BJ,IAAK,QAEDvT,KAAKkT,OAAOiO,IACR,GAAIA,EAAE4K,YAEF,OADAzZ,EAAM6O,GACC,CACX,IAEJ,MACJ,IAAK,OACDnhB,KAAKkT,OAAOiO,IAEJA,EAAE4K,cACFzZ,EAAM6O,EACV,IAEJ,MAWJ,IAAK,QACGhP,EAAKkB,UAAYlB,EAAKkB,SAAStO,SAC/BuN,EAAMH,EAAKkB,SAAS,IAYxB,MACJ,IAAK,KACDf,EAAMtS,KAAK07B,mBAAmBvpB,GAC9B,MACJ,IAAK,OACDG,EAAMtS,KAAK47B,mBAAmBzpB,GAC9B,MACJ,IAAK,WACD,CACI,MAAM8qB,EAAaj9B,KAAKu7B,kBAGpBjpB,EADAH,EAAK+S,QAAU+X,EAAW/X,QACpB+X,EAGAj9B,KAAK47B,mBAAmBzpB,EAAM6qB,EAE5C,CACA,MACJ,IAAK,SACD,GAAqB,IAAjB7qB,EAAK+S,QACL5S,EAAMH,MAEL,CACD,MAAM8gB,EAAUjzB,KAAKk7B,mBAGjB5oB,EADAH,EAAK+S,QAAU+N,EAAQ/N,QACjB+N,EAGAjzB,KAAK07B,mBAAmBvpB,EAAM6qB,EAE5C,CACA,MACJ,QACIh9B,KAAKgU,QAAQ,qBAAuB8U,EAAQ,MAEpD,OAAOxW,CACX,CAIA,YAAC0W,CAAYC,EAASC,SACXlpB,KAAKgN,KAAKgc,YAAYC,EAASC,EAC1C,CAqBA,MAAAK,CAAON,EAASC,GACZ,OAAOlpB,KAAKgN,KAAKuc,OAAON,EAASC,EACrC,CAIA,gBAAA5U,GACI,OAAItU,KAAKwoB,YAAcxoB,KAAKkX,cAAgB,EACjClX,KAAKwoB,WAAWiB,WAAWzpB,KAAKkX,cAEpC,IACX,CAIA,aAAA5B,GACI,OAAOtV,KAAKwoB,UAChB,CAIA,aAAAhT,GACI,OAAOxV,KAAKgN,KAAKwI,eACrB,CAIA,YAAAH,GACI,OAAOrV,KAAK8U,SAChB,CAOA,mBAAOoP,CAAajgB,GAChB,MAAMsC,EAAStC,EAAMsC,OACfyf,EAAKzf,EAAOvE,UACZk7B,EAAY32B,EAAOE,QAAQ,eAC3B0L,EAAO0O,GAAWC,QAAQva,GAC1BwF,EAAOoG,EAAOA,EAAKpG,KAAO8U,GAAWyZ,QAAQr2B,GAC7CqO,EAAM,CACRrO,MAAOA,EACPk5B,cAAen5B,EAAcC,GAC7B8H,KAAMA,EACNoG,KAAMA,EACNgQ,OAAQ3Y,EAAW4zB,QACnBlL,YAAQpvB,EACR4mB,QAAS,EACT2T,WAAOv6B,EACP6tB,QAASuM,GAEb,GAAIlX,EAAG/jB,SAAS,YACZqQ,EAAI6P,OAAS3Y,EAAW4I,WAEvB,GAAI4T,EAAG/jB,SAAS,eACjBqQ,EAAI6P,OAAShQ,EAAKqE,eACZhN,EAAW2wB,SACX3wB,EAAWmO,YAEhB,GAAIqO,EAAG/jB,SAAS,eACjBqQ,EAAI6P,OAAS3Y,EAAWic,cAEvB,GAAIO,EAAG/jB,SAAS,WAEjBqQ,EAAI6P,OAAS3Y,EAAW6b,UAEvB,GAAIW,EAAG/jB,SAAS,WACjBqQ,EAAI6P,OAAS3Y,EAAW4I,WAEvB,GAAI8qB,EAAW,CAChB5qB,EAAI6P,OAAS3Y,EAAW8zB,OACxB,MAAMtT,EAAM1kB,MAAMJ,UAAUuC,QAAQrC,KAAK83B,EAAUrhB,WAAWxI,SAAU6pB,GACxE5qB,EAAIoX,OAASM,CACjB,KACK,KAAIhE,EAAG/jB,SAAS,UASjB,MAHmB,cAAfgC,EAAM1B,MAA0B0B,aAAiBs5B,eACjDxxB,SAA4CA,EAAKiI,QAAQ,4BAA6B/P,EAAOqO,GAE1FA,EAPPA,EAAI6P,OAAS3Y,EAAW4I,KAQ5B,CAOA,OANoB,IAAhBE,EAAIoX,SACJpX,EAAIoX,OAAS,GAEjBpX,EAAI4f,OAASnmB,aAAmC,EAASA,EAAKyL,QAAQlF,EAAIoX,QAC5D,MAAdpX,EAAI4f,SAAkB5f,EAAI+qB,MAAQ/qB,EAAI4f,OAAOlmB,IAEtCsG,CACX,CAKA,QAAA3M,GACI,MAAO,eAAe3F,KAAKgM,MAC/B,CAEA,SAAAgV,GACI,OAAOhhB,KAAKmV,YAAY,sBAC5B,CAIA,SAAAkW,GACI,IAAI/Y,GAAM,EAQV,OAPAtS,KAAKgN,KAAKkG,OAAOiO,IAEb,GAAIA,EAAEiB,YAAcjB,EAAE2D,WAElB,OADAxS,GAAM,GACC,CACX,IACD,GACIA,CACX,CAEA,QAAA0E,IAAYnS,GACJ7E,KAAKgI,QAAQ0lB,YAAc,GAC3B3kB,QAAQsO,IAAIrX,KAAK2F,cAAed,EAExC,CAEA,QAAA2oB,IAAY3oB,GACJ7E,KAAKgI,QAAQ0lB,YAAc,GAC3B3kB,QAAQ3H,MAAMpB,KAAK2F,cAAed,EAE1C,CAEA,OAAA8M,IAAW9M,GACH7E,KAAKgI,QAAQ0lB,YAAc,GAC3B3kB,QAAQkb,KAAKjkB,KAAK2F,cAAed,EAEzC,CAEA,OAAAqjB,CAAQsV,GAIJ,OAHIx9B,KAAKgI,QAAQ0lB,YAAc,GAC3B3kB,QAAQqF,KAAKpO,KAAO,KAAOw9B,GAExBA,CACX,CAEA,UAAAjV,CAAWiV,GACHx9B,KAAKgI,QAAQ0lB,YAAc,GAC3B3kB,QAAQ00B,QAAQz9B,KAAO,KAAOw9B,EAEtC,CAEA,OAAAxpB,IAAWnP,GACH7E,KAAKgI,QAAQ0lB,YAAc,GAC3B3kB,QAAQ6R,KAAK5a,KAAK2F,cAAed,EAEzC,CAOA,QAAA0tB,CAASsJ,GAEL,IAAI1pB,EACAnK,EACA6zB,aAAsBlX,GACtBxS,EAAO0pB,GAGP7zB,EAAU6zB,EACV1pB,EAAOnK,EAAQmK,MAEnBxR,EAAOwR,GAAwB,MAAhBA,EAAK+S,QAAiB,iBAAiB/S,KACtD,MAAMqpB,EAAex7B,KAAK2L,QACpB4U,EAAevgB,KAAKwgB,cAAcC,aAClCN,EAAYqb,EAAarb,UACzBud,EAAWlC,EAAa/a,aACxBkd,EAASxrB,EAAK+S,QAAUrN,EAAa0I,EACrCqd,EAAQrd,EACRsd,EAAWF,EAASxd,EACpB2d,EAAcD,EAAWhmB,EACzBob,EAAUjrB,aAAyC,EAASA,EAAQirB,QAE1E,IAAI8K,EAAe,KACfF,GAAYD,EACRE,GAAeJ,IAIfK,EAAeJ,EAAS9lB,EAAa6lB,EA3B7B,GAiCZK,EAAeJ,EAASC,EAjCZ,EAmCI,MAAhBG,IACA/9B,KAAKqX,IAAI,YAAYsmB,OAAYxd,QAAgB4d,KACjDvC,EAAarb,UAAY4d,EACrB9K,GAEAjzB,KAAKuyB,SAASU,GAI1B,CAKA,YAAA+K,GAEI,MAAMC,EAAaj+B,KAAKwX,QAAQ,GAAGuZ,SAC7BO,EAAUtxB,KAAK2L,QAAQ4lB,YACvB2M,EAAal+B,KAAK2L,QAAQuyB,WAC1BvN,EAAU3wB,KAAKsU,mBACf6pB,EAAUC,OAAOC,SAAS1N,aAAyC,EAASA,EAAQ1tB,MAAM2tB,KAAM,IAChG0N,EAAWH,EAAUC,OAAOC,SAAS1N,aAAyC,EAASA,EAAQ1tB,MAAM6tB,MAAO,IAClH,IAAIyN,EAAUL,EACVC,EAAUD,EAAaD,EAEvBM,EAAUJ,EAAUF,EAEfK,EAAWJ,EAAa5M,IAE7BiN,EAAUD,EAAWhN,GAEzBiN,EAAU/1B,KAAKC,IAAI,EAAG81B,GAEtBv+B,KAAKqX,IAAI,gBAAgBrX,KAAKkX,kBAAkBinB,MAAYG,eAAsBL,cAAuB3M,cAAoB4M,QAAiBK,KAC9Iv+B,KAAK2L,QAAQuyB,WAAaK,CAE9B,CAOA,SAAAtnB,CAAUyS,GACN,IAAInd,EAKJ,GAJA5L,EAAOX,KAAKsX,YAAa,wBACzB3W,EAAO,GAAK+oB,GAAUA,EAAS1pB,KAAKwX,QAAQzS,OAAQ,mBAAmB2kB,KACvE1pB,KAAKkX,aAAewS,EAEhB1pB,KAAKm8B,YACL,IAAK,MAAMnM,KAAUhwB,KAAKwgB,cAAcnN,SAAU,CAC9C,IAAIvO,EAAI,EACR,IAAK,MAAMs0B,KAAUpJ,EAAO3c,SACxB+lB,EAAOp3B,UAAUgR,OAAO,YAAalO,MAAQ4kB,EAErD,CAEuB,QAA1Bnd,EAAKvM,KAAKwoB,kBAA+B,IAAPjc,GAAyBA,EAAG2a,OAAO7d,EAAWW,QAEjF,IAAK,MAAMgmB,KAAUhwB,KAAKgxB,gBAAgB3d,SAAU,CAChD,IAAIvO,EAAI,EACR,IAAK,MAAMs0B,KAAUpJ,EAAO3c,SACxB+lB,EAAOp3B,UAAUgR,OAAO,YAAalO,MAAQ4kB,EAErD,CAGA1pB,KAAKg+B,cAET,CAEA,aAAAQ,CAAct6B,EAAKlB,GAAO,EAAMgF,GAC5B,IAAIuE,EACyB,QAA5BA,EAAKvM,KAAK28B,QAAQz4B,UAAyB,IAAPqI,GAAyBA,EAAGkJ,UAAUzS,EAAMgF,EACrF,CAEA,QAAA0N,CAAS1S,GAAO,GACRA,EACAhD,KAAK2L,QAAQwL,QAGbnX,KAAK2L,QAAQkK,MAErB,CACA,MAAAqR,CAAOiL,EAAQhgB,EAAMnK,GACjB,GAAIhI,KAAK23B,oBAML,YADA33B,KAAK43B,4BAIHzlB,aAAgBwS,KAClB3c,EAAUmK,EACVA,EAAO,MAEX,MAAM2gB,IAAczrB,EAAUW,EAAS,aACjCy2B,EAAKn1B,EACLiG,EAAUvP,KAAK83B,mBACrB,OAAQ3F,GACJ,KAAK9oB,EAAWklB,IAChB,KAAKllB,EAAWgjB,aACZ9c,EAAQzH,IAAI22B,EAAGvG,QACf3oB,EAAQzH,IAAI22B,EAAGC,aACfnvB,EAAQzH,IAAI22B,EAAGE,QACfpvB,EAAQzH,IAAI22B,EAAGthB,QACf,MACJ,KAAK9T,EAAW2wB,OAEZzqB,EAAQzH,IAAI22B,EAAGvG,QACf3oB,EAAQzH,IAAI22B,EAAGE,QACf,MACJ,KAAKt1B,EAAW8d,UACZ5X,EAAQzH,IAAI22B,EAAGE,QACf,MACJ,KAAKt1B,EAAW8T,OACZ5N,EAAQzH,IAAI22B,EAAGthB,QACf,MACJ,KAAK9T,EAAW+oB,IAChB,KAAK/oB,EAAWsD,KAChB,KAAKtD,EAAWW,OACZrJ,EAAOwR,EAAM,WAAWggB,uBAGpBhgB,EAAKgT,UACLhT,EAAK2D,QAAQ,CAAEqc,OAAQA,IAE3B,MACJ,QACI/wB,EAAM,wBAAwB+wB,OAEtC,GAAIA,IAAW9oB,EAAWgjB,aAAc,CACpC,MAAMuN,EAAS55B,KAAK45B,SACpB55B,KAAK2L,QAAQ3J,UAAUgR,OAAO,UAAW4mB,IACpCA,GAAU55B,KAAKsX,aAChBtX,KAAK2W,YAAW,EAExB,CACIpH,EAAQ2P,KAAO,IACX4T,EACA9yB,KAAK84B,6BAGL94B,KAAK64B,2BAGjB,CAEA,UAAApsB,CAAWzJ,GAAO,GACd,MAAMwvB,EAAOxyB,KAAKkM,QAGlB,OAFAlM,KAAKkM,UAAYlJ,EACjBhD,KAAK2L,QAAQ3J,UAAUgR,OAAO,eAAgBhQ,GACvCwvB,CACX,CAEA,SAAAvd,GACI,OAAOjV,KAAKkM,OAChB,CAEA,MAAA0tB,GACI,OAAO55B,KAAKwX,SAAWxX,KAAKwX,QAAQzS,OAAS,CACjD,CAEA,SAAAuS,GACI,QAAStX,KAAKg4B,YAClB,CAEA,QAAApiB,GACI,OAAQ5V,KAAKg4B,YACjB,CAEA,UAAArhB,CAAW3T,GAAO,GACd,IAAIuJ,EACJ,MAAMimB,EAAOxyB,KAAKg4B,aAIlBh4B,KAAKg4B,eAAiBh1B,EAClBA,IAASwvB,GAETxyB,KAAKiX,UAAU,GAEnBjX,KAAK2L,QAAQ3J,UAAUgR,OAAO,eAAgBhQ,GACnB,QAA1BuJ,EAAKvM,KAAKwoB,kBAA+B,IAAPjc,GAAyBA,EAAG2a,OAAO7d,EAAWW,OACrF,CAEA,mBAAA6vB,CAAoBrpB,EAAMouB,GAAQ,GAC9B,GAAK5+B,KAAK45B,UAAYppB,IAAS/G,EAAY2oB,IAK3C,OADApyB,KAAKgI,QAAQ6M,qBAAuBrE,EAC5BA,GACJ,KAAK/G,EAAY8N,KACbvX,KAAK2W,YAAW,GAChB,MACJ,KAAKlN,EAAY2oB,IACbpyB,KAAK2W,YAAW,GAChB,MACJ,KAAKlN,EAAYgN,UACTmoB,GACA5+B,KAAK2W,YAAW,GAEpB,MACJ,KAAKlN,EAAYiN,SACTkoB,GACA5+B,KAAK2W,YAAW,GAEpB,MACJ,QACIvV,EAAM,iBAAiBoP,YAtB3BxQ,KAAKgU,QAAQ,gDAwBrB,CAEA,SAAAb,CAAUnJ,EAAQhC,GACd,OAAOhI,KAAKgN,KAAKmG,UAAUnJ,EAAQhC,EACvC,CAEA,QAAAokB,CAAS3K,EAAOlgB,GAAU,GACtBZ,EAAO+E,EAAc+b,GAAQ,0BAA0BA,KACnDlgB,EACAvB,KAAKyhB,MAAQA,EAGb7c,EAAO5E,KAAKyhB,MAAOA,GAGvB,IAAK,MAAMne,KAAK2B,OAAO45B,OAAO7+B,KAAKyhB,OAC3Bne,EAAEuhB,UACFvhB,EAAEuhB,QAAUnd,EAAMpE,EAAEuhB,SAGhC,CAOA,YAAAmQ,CAAaH,EAAM7a,GAAiB8a,GAAO,GACvC90B,KAAKgN,KAAKgoB,aAAaH,EAAKC,EAChC,CASA,WAAAgK,CAAY99B,GACR,IAAIuL,EAEJ,OAA+B,QAAvBA,EADIvM,KAAKgN,KAAKkU,QAAO,EAAMlgB,GAClBqS,gBAA6B,IAAP9G,EAAgBA,EAAK,EAChE,CAMA,mBAAAwyB,GAEI,MACMzN,EAAUtxB,KAAK2L,QAAQ4lB,YAIvB/Z,EAAUxX,KAAKwX,QACfwnB,EAAOxnB,EAAQ,GACrB,IAAIynB,EAAa,EACbC,EAAc,EACdjB,EAAa,EACbkB,GAAW,EAMf,GAAgB,MAAZH,EAAKhzB,GACL,MAAM,IAAIlL,MAAM,wCAAwCk+B,EAAKhzB,QAGjEhM,KAAK63B,aAAe,CAAC,EACrB,IAAK,MAAM7I,KAAOxX,EAAS,CACvBxX,KAAK63B,aAAa7I,EAAIhjB,IAAMgjB,EAC5B,MAAMoQ,EAAKpQ,EAAI8B,MACf,GAAe,MAAX9B,EAAIhjB,IAAcgjB,IAAQgQ,EAC1B,MAAM,IAAIl+B,MAAM,6CAA6CkuB,EAAI5c,WAErE,GAAKgtB,GAAa,MAAPA,EAIN,GAAkB,iBAAPA,EACZpQ,EAAIqQ,QAAUD,EACdF,GAAeE,OAEd,GAAkB,iBAAPA,GAAmBA,EAAGE,SAAS,MAAO,CAClDtQ,EAAIqQ,QAAU,EACd,MAAME,EAAKC,WAAWJ,EAAGK,MAAM,GAAI,IAC/BzQ,EAAI+B,UAAYwO,IAChBJ,GAAW,EACXnQ,EAAI+B,SAAWwO,GAEnBtB,GAAcsB,CAClB,MAEIn+B,EAAM,yBAAyBg+B,iFAjB/BpQ,EAAIqQ,QAAU,EACdH,GAAe,CAkBvB,CAEA,MAAMQ,EAASl3B,KAAKC,IAAI,EAAG6oB,EAAU2M,GACrC,IAAI0B,EAAQ,EACZ,IAAK,MAAM3Q,KAAOxX,EAAS,CACvB,IAAIooB,EACJ,GAAI5Q,EAAIqQ,QAAS,CACb,MAAMQ,EAAM7Q,EAAI4Q,SAEZA,EADe,iBAARC,EACIA,EAES,iBAARA,GAAoBA,EAAIP,SAAS,MAClCE,WAAWK,EAAIJ,MAAM,GAAI,IA3DxB,EAgEhB,MAAMF,EAAK/2B,KAAKC,IAAIm3B,EAAWF,EAAS1Q,EAAIqQ,QAAWH,GACnDlQ,EAAI+B,UAAYwO,IAChBJ,GAAW,EACXnQ,EAAI+B,SAAWwO,EAEvB,CACAvQ,EAAI6B,OAAS8O,EACbA,GAAS3Q,EAAI+B,QACjB,CACAvZ,EAAQA,EAAQzS,OAAS,GAAGgsB,UArEA,EAsE5BkO,EAAaU,EAtEe,EAuE5B,MAAMG,EAAK,GAAGb,MAgBd,OAfAj/B,KAAKwgB,cAAcvd,MAAM6tB,MAAQgP,EACjC9/B,KAAKw5B,qBAAqBv2B,MAAM6tB,MAAQgP,EAcjCX,CACX,CAIA,mBAAAY,GACIp/B,EAAOX,KAAKwgB,cAAe,4BAC3B,MAAM0Y,EAAal5B,KAAKm8B,YAExB,GADAp5B,EAAe/C,KAAKwgB,cAAe0Y,IAC9BA,EACD,OAEJ,MAAM8G,EAAWhgC,KAAKwX,QAAQzS,OACxBk7B,EAAYjgC,KAAKwgB,cAAcpe,cAAc,WACnDzB,EAAOs/B,EAAW,oCAClBA,EAAUz8B,UAAY,+BAA+B+1B,OAAOyG,GAC5D,IAAK,IAAIl7B,EAAI,EAAGA,EAAIk7B,EAAUl7B,IAAK,CAC/B,MAAMkqB,EAAMhvB,KAAKwX,QAAQ1S,GACnB6rB,EAAUsP,EAAU5sB,SAASvO,GACnC6rB,EAAQ1tB,MAAM2tB,KAAO5B,EAAI6B,OAAS,KAClCF,EAAQ1tB,MAAM6tB,MAAQ9B,EAAI+B,SAAW,KAEJ,iBAAtB/B,EAAIkR,cACXlR,EAAIkR,eACEvP,EAAQ3uB,UAAU8F,OAAOknB,EAAIkR,cAAc/5B,MAAM,MAIvD6oB,EAAInK,SAAU8L,EAAQ3uB,UAAU8F,OAAOknB,EAAInK,QAAQ1e,MAAM,MAE7D,MAAMiM,EAAQ/Q,EAAW2tB,EAAI5c,OAAS4c,EAAIhjB,IAC1C,IAAI0jB,EAAU,GACVV,EAAIU,UACJA,EAAUjuB,EAAcutB,EAAIU,SAC5BA,EAAU,WAAWA,MAEzB,IAAIyQ,EAAU,GACVr7B,EAAIk7B,EAAW,IACfG,EAAU,wCAEdxP,EAAQntB,UAAY,6BAA6BksB,KAAWtd,WAAe+tB,IACvEngC,KAAKsX,aACLqZ,EAAQ3uB,UAAUgR,OAAO,YAAalO,IAAM9E,KAAKkX,aAEzD,CACJ,CAWA,0BAAAiX,GACQnuB,KAAK83B,mBAAmB5Y,KAAO,GAC/Blf,KAAK84B,4BAEb,CAUA,0BAAAA,GACI,IAAIvsB,EACJ,GAAIvM,KAAK23B,oBAGL,OAFA33B,KAAKqX,IAAI,wDAAwDrX,KAAK23B,6BACtE33B,KAAK43B,4BAIT,MACM6G,EAAKn1B,EACLiG,EAAU,IAAI1L,IAAI7D,KAAK83B,oBAC7B93B,KAAK83B,mBAAmBiE,QAExB,GADmBxsB,EAAQ7K,IAAI+5B,EAAGthB,SAA4B,IAAjB5N,EAAQ2P,KAEjDlf,KAAKogC,YAAY,CAAEC,cAAc,QAGhC,CAED,GADArgC,KAAKqX,IAAI,gCAAiC9H,IACR,IAA9BvP,KAAKgI,QAAQs4B,aAAwB,CACrC,IAAI5f,EAAS1gB,KAAKw5B,qBAAqB/Y,aACvC,MAAMF,EAAevgB,KAAKwgB,cAAcC,aAClC8f,EAAavgC,KAAK2L,QAAQ8U,aAAeF,EAd7B,EAed/X,KAAKg4B,IAAI9f,EAAS6f,GAAc,IAEhCvgC,KAAKw5B,qBAAqBv2B,MAAMyd,OAAS6f,EAAa,KACtD7f,EAAS6f,EAEjB,CAEIhxB,EAAQ7K,IAAI+5B,EAAGC,cACf1+B,KAAKkT,OAAOiO,IACRA,EAAEsN,cAAc,IAIpBlf,EAAQ7K,IAAI+5B,EAAGvG,UAEfl4B,KAAK++B,sBACL/+B,KAAK+/B,uBAET//B,KAAKogC,aAET,CACA,GAAIpgC,KAAKgI,QAAQswB,qBAAsB,CACnC,IAAI7N,EAA8C,QAAtCle,EAAKvM,KAAKk7B,kBAAiB,UAA0B,IAAP3uB,OAAgB,EAASA,EAAG+d,SAAQ,EAAO,QAAS,OAC9GG,EAAOA,EAAOA,EAAO,KAAO,GAC5BzqB,KAAKgI,QAAQswB,qBAAqBlH,YAAc3G,CACpD,CACAzqB,KAAKkV,WAAW,SACpB,CAyCA,WAAAkrB,CAAYp4B,GAIR,MAAMq4B,KADNr4B,EAAU/C,OAAOkD,OAAO,CAAEk4B,cAAc,GAASr4B,IAClBq4B,aAEzBI,EAAYzgC,KAAK2L,QAAQ8U,aAGzBwR,EAAMjyB,KAAK2L,QAAQwU,UACzB,IAAIugB,EAAWl4B,KAAKC,IAAI,EAAGwpB,EALRpa,GA5yKC,GAkzKpB6oB,EAAWl4B,KAAK8yB,MAAMoF,GAGlBA,EAAW,GACXA,IAEJ,IAAIC,EAASn4B,KAAKC,IAAI,GAAIwpB,EAAMwO,GAZb5oB,GA5yKC,GAyzKpB8oB,EAASn4B,KAAK6yB,KAAKsF,GAKnB,MAAMC,EAAgB,IAAI/8B,IAC1B7D,KAAKgxB,gBAAgB6P,WAAWz6B,SAASzE,IACrC,MAAMm/B,EAAKn/B,EACXi/B,EAAc94B,IAAIg5B,EAAGlS,SAAS,IAElC,IAAI5E,EAAM,EACNqG,EAAM,EACN8O,GAAW,EACX4B,EAAW,QACf/gC,KAAKi7B,WAAU,SAAU9oB,GAErB,MAAM6d,EAAS7d,EAAKgT,SAEhBhT,EAAK+S,UAAY8E,IACjB7X,EAAK+S,QAAU8E,EACfmV,GAAW,GAEXnV,EAAM0W,GAAY1W,EAAM2W,EAEpB3Q,IACA+Q,EAAW/Q,GAGVA,GAAUqQ,GACfO,EAAclc,OAAOvS,GAErB6d,EAAO/sB,MAAMotB,IAAMrG,EAAMnS,EAAa,KACtCkpB,EAAW/Q,IAGX4Q,EAAclc,OAAOvS,GAEjB6d,IACAA,EAAO/sB,MAAMotB,IAAMrG,EAAMnS,EAAa,MAE1C1F,EAAK2D,QAAQ,CAAEua,IAAKA,EAAKD,MAAO2Q,IAEhCA,EAAW5uB,EAAKgT,UAEpB6E,IACAqG,GA1DexY,EA2DnB,IACA7X,KAAK03B,aAAe1N,EACpB,IAAK,MAAM7I,KAAKyf,EACZzf,EAAEjM,WAAW,WACbiM,EAAEsN,eAUN,OAPAzuB,KAAKgxB,gBAAgB/tB,MAAMyd,OAAS,GAAG2P,MAOhC8O,CACX,CAUA,KAAAjsB,CAAMlS,GACF,OAAOhB,KAAKgN,KAAKkG,MAAMlS,GAAU,EACrC,CAYA,SAAAi6B,CAAUj6B,EAAUgH,GAChB,IAAKhI,KAAKgN,KAAK2d,cACX,OAAO,EAEX,GAAI3iB,GAAWA,EAAQ2zB,QAEnB,cADO3zB,EAAQ2zB,QACR37B,KAAKghC,aAAahgC,EAAUgH,GAGvC,IAAIlD,EAAGm8B,EAAS1tB,EAAQjB,EAAK4uB,EAAUC,EAAUC,EAAa,EAAGC,GAAwC,KADzGr5B,EAAUA,GAAW,CAAC,GACmEoiB,YAAuBjY,EAAOnK,EAAQY,OAAS5I,KAAKgN,KAAKqG,SAAS,GAC3J,MAAM0V,IAAkB/gB,EAAQ+gB,cAC1BuY,GAAevY,GAAqC,SAApB/oB,KAAK6Q,WAE3C,IADA0C,EAASpB,EAAKoB,OACPA,GAAQ,CAKX,IAHA2tB,EAAW3tB,EAAOF,SAClB4tB,EAAUC,EAASz5B,QAAQ0K,GAAQivB,EACnCzgC,EAAOsgC,GAAW,EAAG,kBAAkB9uB,2BAA8BoB,KAChEzO,EAAIm8B,EAASn8B,EAAIo8B,EAASn8B,OAAQD,IAAK,CAExC,GADAqN,EAAO+uB,EAASp8B,GACZqN,IAASgvB,EACT,OAAO,EAEX,IAAIG,GACCnvB,EAAKoT,gBACLpT,EAAKd,OACLc,EAAKc,cAHV,CAMA,IAAKouB,IAAoC,IAAnBrgC,EAASmR,GAC3B,OAAO,EAIX,GAFAkvB,GAAgB,EAEZlvB,EAAKkB,UACLlB,EAAKkB,SAAStO,SACbgkB,GAAiB5W,EAAKuB,YACvBpB,EAAMH,EAAKe,OAAOiO,GACVA,IAAMggB,KAGNG,GAAgBngB,EAAE9P,OAAU8P,EAAElO,eAGd,IAAhBjS,EAASmgB,KAGR4H,IAAiB5H,EAAE9N,UAAa8N,EAAEzN,cAAvC,EACW,QANA,UAQZ,IACS,IAARpB,GACA,OAAO,CAxBf,CA2BJ,CAEAH,EAAOoB,EACPA,EAASA,EAAOA,OAChB6tB,EAAa,GACR7tB,GAAUvL,EAAQu5B,OACnBvhC,KAAKgX,SAAS,4BACdrW,EAAOqH,EAAQY,MAAO,kCACtBu4B,EAAWn5B,EAAQY,MACnBZ,EAAQu5B,MAAO,EACfhuB,EAASvT,KAAKgN,KACdo0B,EAAa,EAErB,CACA,OAAO,CACX,CAKA,YAAAJ,CAAahgC,EAAUgH,GACnB,IAAIqL,EAAU2W,EAAKzW,EAAQpB,EAAOnK,EAAQY,OAAS5I,KAAKgN,KAAKqG,SAAS,GACtE,MAAM0V,IAAkB/gB,EAAQ+gB,cAChC,IAA4B,IAAxB/gB,EAAQoiB,cACe,IAAnBppB,EAASmR,GACT,OAAO,EAGf,OAAa,CAGT,GAFAoB,EAASpB,EAAKoB,OACdF,EAAWE,EAAOF,SACdA,EAAS,KAAOlB,EAAM,CAGtB,GADAA,EAAOoB,GACFpB,EAAKoB,OACN,MAEJF,EAAWE,EAAOF,QACtB,MAMI,IAHA2W,EAAM3W,EAAS5L,QAAQ0K,GACvBA,EAAOkB,EAAS2W,EAAM,IAEdjB,GAAiB5W,EAAKuB,WAC1BvB,EAAKkB,UACLlB,EAAKkB,SAAStO,QACdsO,EAAWlB,EAAKkB,SAChBE,EAASpB,EACTA,EAAOkB,EAASA,EAAStO,OAAS,GAI1C,IAAKgkB,GAAkB5W,EAAK4Z,eAGL,IAAnB/qB,EAASmR,GACT,OAAO,CAEf,CACA,OAAO,CACX,CAOA,IAAA+a,CAAK9S,GAED,OADApa,KAAK+7B,QACE/7B,KAAKgN,KAAKkgB,KAAK9S,EAC1B,CAgBA,YAAAnG,CAAajR,GAOLA,GACArC,EAAOX,KAAK23B,oBAAsB,EAAG,2CACrC33B,KAAK23B,sBAI4B,IAA7B33B,KAAK23B,sBACL33B,KAAKgX,SAAS,8DAA8DhX,KAAK43B,wDACjF53B,KAAK43B,0BAA4B,EACjC53B,KAAKknB,OAAO7d,EAAWklB,IAAK,CAAEuE,WAAW,MAI7C9yB,KAAK23B,qBAOb,CAOA,WAAA/mB,CAAYI,EAAQhJ,GAChB,OAAOhI,KAAKs3B,WAAWtmB,OAAOJ,YAAYI,EAAQhJ,EACtD,CAIA,cAAA+L,CAAe/C,EAAQhJ,GACnB,OAAOhI,KAAKs3B,WAAWtmB,OAAO+C,eAAe/C,EAAQhJ,EACzD,CAMA,WAAA4J,GACI,OAAO5R,KAAKs3B,WAAWtmB,OAAOY,aAClC,CAMA,cAAA4vB,GACI,QAASxhC,KAAK6Q,UAClB,CAMA,YAAAC,GACI,OAAO9Q,KAAKs3B,WAAWtmB,OAAOF,cAClC,EAEJ+P,GAAWuE,SAAW,EAEtBvE,GAAW4gB,QAAU,SAErB5gB,GAAWnX,KAAOA,EAElBjK,EAAQohB,WAAaA,EAEtB"}
\ No newline at end of file
+{"version":3,"file":"wunderbaum.umd.js","names":["global","factory","exports","module","define","amd","globalThis","self","mar10","this","freeGlobal","Object","freeGlobalThis","freeSelf","root","Function","isObject","value","type","debounce","func","wait","options","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","useRAF","requestAnimationFrame","TypeError","invokeFunc","time","args","thisArg","undefined","apply","startTimer","pendingFunc","cancelAnimationFrame","setTimeout","shouldInvoke","timeSinceLastCall","timerExpired","Date","now","trailingEdge","timeSinceLastInvoke","timeWaiting","Math","min","remainingWait","debounced","isInvoking","leadingEdge","max","cancel","id","clearTimeout","cancelTimer","flush","pending","throttle","MOUSE_BUTTONS","isMac","nav","navigator","test","platform","_getUserInfo","REX_HTML","REX_TOOLTIP","ENTITY_MAP","ValidationError","Error","constructor","message","super","name","assert","cond","msg","documentReady","callback","document","readyState","addEventListener","error","escapeHtml","s","replace","escapeRegex","escapeTooltip","getValueFromElem","elem","coerce","tag","tagName","classList","contains","span","embeddedInput","querySelector","innerText","input","indeterminate","checked","valueAsDate","valueAsNumber","parentElement","setElemDisplay","flag","style","elemFromSelector","display","elemFromHtml","html","t","createElement","innerHTML","trim","content","firstElementChild","_IGNORE_KEYS","Set","obj","eventToString","event","key","et","altKey","push","ctrlKey","metaKey","shiftKey","button","has","join","extend","i","length","arg","prototype","hasOwnProperty","call","isArray","Array","isEmptyObject","keys","isPlainObject","toString","onEvent","rootTarget","eventNames","selectorOrHandler","handlerOrNone","selector","handler","split","forEach","evn","e","target","matches","closest","overrideMethod","instance","methodName","ctx","prevSuper","prevSuperApply","prevFunc","_super","_superApply","argsArray","getOption","opts","defaultValue","ext","indexOf","toSet","val","set","c","add","adaptiveThrottle","assign","minDelay","defaultDelay","maxDelay","delayFactor","waiting","pendingArgs","pendingTimer","throttledFn","useArgs","start","console","elap","curDelay","useDelay","ChangeType","RenderFlag","NodeStatusType","NodeRegion","NavModeEnum","util","freeze","__proto__","Deferred","thens","catches","status","resolve","resolvedValue","reject","rejectedError","then","cb","unshift","promise","catch","MAX_INT","documentReadyPromise","Promise","each","k","extractHtmlText","isFunction","noop","setTimeoutPromise","ms","err","setValueToElem","select","selectedIndex","sleep","async","toggleCheckbox","element","tristate","toLowerCase","WunderbaumExtension","tree","defaults","enabled","treeOpts","extensionOpts","getPluginOption","init","_a","setPluginOption","setEnabled","onKeyEvent","data","onRender","START_MARKER","END_MARKER","RE_START_MARKER","RegExp","RE_END_MARTKER","FilterExtension","connectInput","autoApply","autoExpand","counter","fuzzy","hideExpandedCounter","hideExpanders","highlight","leavesOnly","mode","noData","lastFilterArgs","queryInput","filterNodes","filterMode","updateFilter","_applyFilterNoUpdate","filter","branchMode","_opts","runWithDeferredUpdate","_applyFilterImpl","match","temp","count","prevAutoCollapse","autoCollapse","hideMode","logInfo","clearFilter","map","reduce","a","b","re","reHighlight","node","title","text","res","escapeTitles","matchingIndices","_matchingArrIdx","_mIdx","textPoses","v","_markFuzzyMatchedChars","titleWithHighlight","arguments","toggle","subMatchCount","visit","setStatus","ok","children","matchedByBranch","parent","visitParents","p","expanded","setExpanded","noAnimation","noEvents","_filterAutoExpanded","filterBranches","logWarn","enableUpdate","remove","KeynavExtension","_getEmbeddedInputElem","ace","getActiveColElem","_isCurInputFocused","activate","autoActivate","curInput","inputHasFocus","navModeOption","navigationModeOption","focusNode","eventName","handled","isEnabled","_callEvent","_callMethod","currentNode","getFocusNode","getActiveNode","firstNode","getFirstChild","setActive","setFocus","isColspan","isRowNav","blur","_render","quicksearch","stamp","lastQuicksearchTime","lastQuicksearchTerm","matchNode","findNextNode","preventDefault","isActive","isExpanded","isExpandable","startCell","startRow","setCellNav","toggleSelected","navigate","curInputType","inputCanFocus","logDebug","setCustomValidity","setColumn","activeColIdx","checkValidity","focus","click","log","isCellNav","cell","columns","LoggerExtension","ignoreEvents","prefix","extra","ROW_HEIGHT","TEST_IMG","iconMaps","bootstrap","loading","expanderExpanded","expanderCollapsed","expanderLazy","checkChecked","checkUnchecked","checkUnknown","radioChecked","radioUnchecked","radioUnknown","folder","folderOpen","folderLazy","doc","fontawesome6","RESERVED_TREE_SOURCE_KEYS","KEY_TO_ACTION_DICT","Add","ArrowDown","ArrowLeft","ArrowRight","ArrowUp","Backspace","Divide","End","Home","Multiply","PageDown","PageUp","Subtract","makeNodeTitleMatcher","nodeTitleSorter","x","y","decompressSourceData","source","_format","_version","_keyMap","_valueMap","longToShort","shortToLong","entries","warn","_typeList","_b","_c","_positional","includes","positionalShort","newChildren","keyToNodeMap","indexToNodeMap","keyAttrName","childrenAttrName","index","nodeTuple","parentId","kwargs","positionalIdx","parentNode","unflattenSource","_iter","childList","getOwnPropertyNames","propName","longName","newValue","nodeMimeType","DndExtension","autoExpandMS","multiSource","effectAllowed","dropEffectDefault","guessDropEffect","preventForeignNodes","preventLazyParents","preventNonNodes","preventRecursion","preventSameParent","preventVoidMoves","serializeClipboardData","scroll","scrollSensitivity","scrollSpeed","sourceCopyHook","dragStart","drag","dragEnd","dragEnter","dragOver","dragExpand","drop","dragLeave","srcNode","lastTargetNode","lastEnterStamp","lastAllowedDropRegions","lastDropEffect","lastDropRegion","currentScrollDir","applyScrollDirThrottled","_applyScrollDir","dndOpts","dnd","onDragEvent","bind","onDropEvent","_leaveNode","ltn","setClass","unifyDragover","size","_calcDropRegion","allowed","dy","offsetY","_guessDropEffect","ea","canCopy","canLink","canMove","_isVoidDrop","targetNode","dropRegion","getNextSibling","getPrevSibling","isDragging","sp","scrollTop","_autoScroll","viewportY","sensitivity","headerHeight","headerElement","clientHeight","height","offsetHeight","scrollHeight","Wunderbaum","getNode","dataTransfer","isEditingTitle","nodeData","toDict","n","_orgKey","_treeId","setData","JSON","stringify","types","srcTree","dt","dropEffect","isStatusNode","isLoaded","isAncestorOf","regionSet","clientY","offsetTop","region","_isLoading","stopPropagation","getData","parse","suggestedDropMode","suggestedDropEffect","sourceNode","sourceNodeData","DragObserver","dragElem","dragging","events","thresh","_handler","handleEvent","disconnect","removeEventListener","getDragElem","stopDrag","cb_event","dragstop","dx","pageX","pageY","dragstart","GridExtension","observer","window","handleDrag","info","getEventInfo","_promise","_resolve","_reject","reason","finally","NODE_PROPS","NODE_DICT_PROPS","delete","WunderbaumNode","refKey","classes","_requestId","_errorInfo","_partsel","_partload","_rowIdx","_rowElem","sequence","icon","lazy","statusNodeType","colspan","checkbox","radiogroup","selected","unselectable","_registerNode","Symbol","iterator","cl","l","typeInfo","addChildren","before","applyMinExpanLevel","_level","getLevel","nodeList","forceExpand","minExpandLevel","child","subChildren","isUnloaded","concat","findDirectChild","pos","splice","update","structure","addNode","applyCommand","cmd","collapseSiblings","className","cnSet","cn","startEditTitle","expandAll","depth","loadLazy","force","keepActiveNodeVisible","expandOpts","scrollIntoView","logTime","level","level_1","promises","all","logTimeEnd","activeNode","findAll","matcher","ptr","findFirst","findRelatedNode","where","includeHidden","format_iter","name_cb","connectors","_is_last","ca","_format_line","parts","format","line","getColElem","colIdx","findIndex","colElems","querySelectorAll","getCloneList","includeSelf","clones","findByRefKey","getLastChild","ac","idx","getParent","getParentList","includeRoot","dtn","getPath","part","separator","path","isFunc","hasChildren","hasClass","other","isDescendantOf","isChildOf","isClone","andCollapsed","emptyChildListExpandable","isFirstSibling","isLastSibling","isLazy","isLoading","isPagingNode","isParentOf","isPartload","isPartsel","isRadio","isRendered","isRootNode","isSelected","isTopLevel","isVisible","hasFilter","parents","_loadSourceObject","response","setTypes","colStructure","selectMode","fixSelection3FromEndNodes","_fetchWithOptions","url","params","body","rest","fetchOpts","method","URLSearchParams","fetch","json","load","requestId","prevParent","elapLoad","elapProcess","startProcess","logError","debugLevel","forceReload","wasExpanded","resetLazy","makeVisible","dfd","deferreds","len","seOpts","updatePendingModifications","moveTo","targetParent","triggerModifyChild","any","triggerModify","removeMarkup","_unregisterNode","removeChildren","_wb_node","_getRenderInfo","allColInfosById","renderColInfosById","col","_createIcon","iconMap","parentElem","replaceChild","showLoading","iconSpan","appendChild","cbRes","badge","tooltip","badgeClass","badgeTooltip","append","_render_markup","treeOptions","rowDiv","checkboxSpan","expanderSpan","isNew","after","top","nodeElem","ofsTitlePx","titleSpan","_ofsTitlePx","draggable","colElem","left","_ofsPx","width","_widthPx","nodeListElement","prepend","_render_data","preventScroll","textContent","skeleton","vpWidth","clientWidth","isDataChange","_render_status","renderInfo","rowClasses","image","backgroundImage","cbclass","colSpan","resizeCols","ofs","colDef","change","row","recursive","dict","scrollTo","prev","retrigger","focusTree","orgEvent","edit","nextNode","prevNode","immediate","sendEvents","updateOpts","lastChild","topNode","setIcon","setKey","getSelectedNodes","stopOnParents","_anySelectable","setSelected","found","_changeSelectStatusProps","state","changed","fixSelection3AfterClick","_walk","allSelected","someSelected","canSelect","propagateDown","sibling","details","statusNode","_setStatusNode","firstChild","_clearStatusNode","strings","loadError","setTitle","_sortChildren","cmp","deep","sort","sortChildren","operation","modifyChild","visitSiblings","isMatched","EditExtension","minlength","maxlength","trigger","slowClickDelay","validity","beforeEdit","curEditNode","relatedNode","debouncedOnChange","_onChange","_applyChange","inputElem","validationMessage","reportValidity","inputValue","inputValid","_preprocessKeyEvent","_stopEditTitle","inputHtml","opt","stopEditTitle","focusElem","activeElement","forceClose","errMsg","oldValue","createNode","newNode","WbSystemRoot","extensionList","extensions","keyMap","Map","refKeyMap","treeRowCount","_disableUpdateCount","_disableUpdateIgnoreCount","_columnsById","pendingChangeTypes","_util","_cellNavMode","lastClickTime","header","rowHeightPx","fixedCol","showSpinner","connectTopBreadcrumb","iconBadge","receive","readyDeferred","ready","readyOk","_registerExtension","_updateViewportThrottled","_updateViewportImmediately","getAttribute","tabIndex","_wb_tree","wantHeader","rowElement","colDiv","dataset","coldivs","repeat","listContainerElement","_initExtensions","optName","setOption","isGrid","setNavigationOption","resizeObserver","ResizeObserver","resize","observe","mouseEvent","expander","scrollIntoViewOnExpandClick","_callHook","getTree","el","treeElem","Element","extension","rk","rks","get","hook","d","_getNodeByRowIdx","visitRows","getTopmostVpNode","complete","topIdx","ceil","floor","getLowestVpNode","scrollParent","bottomIdx","_getPrevNodeInView","reverse","_getNextNodeInView","nodeOrOpts","refNode","clear","destroy","outerHTML","hasFocus","hasHeader","hint","selectAll","toggleSelect","_selectRange","eventInfo","visible","_check","from","findKey","startNode","reMatch","makeNodeTitleStartMatcher","_checkNode","pageSize","bottomNode","parentCol","canonicalName","unknown","colId","column","KeyboardEvent","isEditing","label","timeEnd","vpHeight","rowTop","vpTop","vpRowTop","vpRowBottom","newScrollTop","scrollToHorz","fixedWidth","scrollLeft","colLeft","Number","parseInt","colRight","newLeft","cid","setActiveNode","RF","clearMarkup","redraw","reset","values","toDictArray","_updateColumnWidths","col0","totalWidth","totalWeight","modified","cw","_weight","endsWith","px","parseFloat","slice","restPx","ofsPx","minWidth","cmw","tw","_renderHeaderMarkup","colCount","headerRow","headerClasses","resizer","_updateRows","newNodesOnly","adjustHeight","wantHeight","abs","vp_height","startIdx","endIdx","obsoleteNodes","childNodes","tr","prevElem","_visitRowsUp","nextIdx","siblings","stopNode","siblingOfs","skipFirstNode","checkFilter","wrap","isFilterActive","version"],"sources":["wunderbaum.umd.js"],"mappings":"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"}
\ No newline at end of file
diff --git a/docs/api/assets/navigation.js b/docs/api/assets/navigation.js
index b34f9ed8..d3c1a731 100644
--- a/docs/api/assets/navigation.js
+++ b/docs/api/assets/navigation.js
@@ -1 +1 @@
-window.navigationData = "data:application/octet-stream;base64,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"
\ No newline at end of file
+window.navigationData = "data:application/octet-stream;base64,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"
\ No newline at end of file
diff --git a/docs/api/assets/search.js b/docs/api/assets/search.js
index 7815c999..7c07b7ed 100644
--- a/docs/api/assets/search.js
+++ b/docs/api/assets/search.js
@@ -1 +1 @@
-window.searchData = "data:application/octet-stream;base64,H4sIAAAAAAAAE819bXPbOLLuf0m+ZnINAiCl/ZZNMjupM293kpm5p6a2XLRE29zIog4l2clu7X+/BEBKjWY3SFD0nvkwNY6NRj9AAw3g6Qb4rxd19bR/8Zc//vXic7ldv/hL8urFNn8oXvzlxdNxuy7qm/z48OLVi2O9aX71UK2Pm2L/f85/en1/eNg0f19t8v2+aCp68eLfr7q6RLI41fZ7v7ZWBtb2e6jiVy92eV1sDz42oO4qUSd9j0W9L6tthLKXZ5EhpUCU0388lJsY5W35aZqTK3Xu6bvi8KkuihjlZ5F59P9YrWP1tyLz6H//2Mh92N5WkSCg3DQkWpwn0Kra7g/1cXWo6hgcvtgMQ7GuqkMMgLb8DJrLdYxeW3oGrcWmeDBiEarPIjPovy/ypsT7eBRYcAYsm3J/eFttD3m5nQSJkZ8B2baZ8N83tU8A1RedAc86P+QxINry0zSnWsv0pPr6+vB1F+UwjfLXJ7EIDK8tbKYLqt2hWf/2MUDOIjOYIF8dyscidvHwpGZAcVutjvtYEFBoBgzGsFF26ARm0L2qNseHuFFwFplD/32x+nxTfYkCcJaZY9laxW0c2/Izaf5UVZtDuYsFcBabY/zFYzjMqf+43TdL8uqQ32yipiGSm2Pz1KzJX6N2T63ADLqvYw8R1xedInwvWG4ORf1DrBuEUrOtCG+rzYd1lD9AcnPYYlVsNj/mj7E9guTm2NLl+8P/PZarz/sir1f3n8qHKEC0+DPgKuqYo34PlxOfeB5ME6F8r/pDHu1Rncj/zgav1f+6/f83ot3tfSMj93uoIu7QfF0Xd82OuqhjNz5YcIYD/PVxOxlNT3QOPKt8s/mhONxXUcdZX2wuHJaiiIbRSc1EL1W7h2p/+G03gefBsvMg+r56KiYCQqIz4MnX67f35WbdyEatWZ7YHDh2u83Xt9XDQ76NGrhIbgYkq03j06P2863ADLrXjXXrKmoLdxaZZ3T+ZA/JkePyJDQDhv0UDPt5Mdzn+2/NITmKEDvLzIPgO8uwRUI4Cc2AoT5ufy8P9++K26Kui/Wvu3V+iPJYXAUzYCu+7JoZ/2YTdeSAQrOMVHN8i8QAhWbAcKju7jbFR1tp3AnYk5vHd7jqirVZnqLmDiE7hyevjnHbj05glv2PYXni9j6txAzab8vouXEWmUn/t2W9j+p9KDQThv8qotbSs8hM+n8svkTHF5HcTEh+KTZ5O7tiwfiic+Cp6of8cF0e4lY3X2w2HPEQZvOXbzrmxwSHIv0llp0T0YSTyZvLAxsYi/UF9pQRicUTnAnLlDgLkptltf94qMvtXdxKf5KZAUG5f78uD5EQoNAsGL6v8nU0hrPQHARiFaXdFf/foeca3R0hJyIJOQObMULzp3fFzTG2FzqZGYZBU9v7uo7LVwEy8yCITdw5i8yjP5pRP4nMp/99HGXjSc2D4ve8jqILziJzHANXdbXZfIoaBkBmHsrkrY1qR1ImJ6F5MEzbPGDBebBE0zdAZgYEx2iu5DgjOdK05f3WhJWj5qUnNc9WIR4EFJoFw9/qyMS+TmIW7W9dQDUOwFloFgy/VE/REE4yM3mn+G7wpOZB0dRV3uWGJZ5EMBPi8+D6eMgP0c7qJDQPhk+xSVxAZg4EVX2YEodCcrMcsd6Vq8Obus6jqCNfbJbAsl0Q3BL9e7k+3EeZhxafbWX7udias9QP1bq8LVd5dCpmsJYZUD6W+zKK2ekE5tL9i7mpEqu/FZplT5xH7snzmda8wi7f8bEiJDcL7blpUyuiLOGLzYbjr3W+Xd1PgQIk5wpvf2srjoHii82yL3G1ub1/3O4ESc7m1eK7BcnNgOQPw2/nh6r+e5S776Sup6M4X6a7ud7CQ9zpJp37/YRrdPSZsK3OLzZwl66FxrBy++J/jsV2FaXrJRAKKkXCUy5SBVCMukk1BMTPiyYv1gUgHILX6qJ0t2Ix2k8is7S9PFDJ2KHGtxJzaP9MhR0Duj+HYo5Rmuvilox5BpSfRObQv2L38KGhP7iBj8TA3ckIYhi6lBFnh3xdVnd1dSQSeUO2gGKz9EW12e/ySHOcZOZAQN9PCagPX1CJ0r3J/xk3F1qBOXS7XCOK/AroB0JzYNi3OTWRy+FJaA4M4dsxARzjrsfErQpk5Cy0KATvLMbp5m4phdQPXVOK8wVtHVG+4CQzBwL62mpAffjeatxcsHyZKfEpdhT0ROfAcx2IYgewXI+IY8fhqM32d3/4EOclPLFZcBQmLkuHU0M4oNgsOBq5Q+N54lCchWbDQFM4QyDCRE4Uiof8sLqPQtBJzDJfjzc/mOre0kmcoemKJGc7T5hc5u/Ku/tN818cJFJ8lpHiKKI3x0P1fsqGg5afx69UT+RFyKBT6WTmQkAn1g1ACGfUDWEYmbAVXPaHMraiMISuYoV6YsRdrCgcwatGASCj7hrFIrF/jkTRysyCIHjdKQRj1H2nKCzNeW+T7/bFx/Jm04y6yA1iX3gOTCb6a6qJPLmchObAELhiMniEC2bSR6FgU/kDGAZz+aMRvCvr5ijGJOMOIPFl50LEXC8YwDJwvyAaRTCtfgDLqLz6OEShxPoQmjGZ9ROQTAAxk/47m9wWvfp7YjPhCKWxh6GMyWOPRfN9PhEMFJwLS/EYec4CQjNhMDdt2rUrFokvOhOen+MDJ1BqVhTm2bJpSFrJ2dAc4s6hZ5m5ENTF48RR4ovOgec+30/aR/tycyGJ3qUBoTkwlHsugyAUY9gPJQ/EYtiuiv2hqn+6jcUBBefBYo0cDeQsNROKCZEnKDUPinfFflVs1/n2EN0hSHQePI5kiY6FIMGZsHAXucJAhm5yTeqRSNrKE5sHh91sTfHxPdF58Jj91jQ4vuRcaCIjqSeRmfRXefwYOQnNh2GCNS6N1iAUP+d3TXXRB04kOBcWIxjtWYHYbDjiwyWe2Hw4YkNHUGoeFL+YJJJIDJ3MTAgKUy56vgKxmXBUFfP8QhjHWWweHB+n5GF4YjPhOAWyY5FAwXmwfKp28ed/T2weHL9uN1PWFiA2D47fyn0Zvy08S80SKbotDqt7E6f8iXtdOxhL7EvPgSras8/o001V0XsfIDQPhrg9R/CtgVjNzB3/sPqBS/6xGJhb/mEMA9f8YzFEJ6YMXvSPRUDfcQ8jCF9yj0LwkH8upvgoX24WJNVjQd22D4HoRObQv3X3QOO6AQjNgaEuTJOiEJxE5tM/iYbsic6H54e8/hybce0LzrKK1nYfG7d2nmTm6Y29CdhELltQag4U7kpsFISTyEy8PXfPO0zZD13vjstksC99fNgeqt/K4ikKSk90FjzdcxtxUIDUTCgmEX++3ExImLdCwjAGHguJxfAh9prEWWYmBLH3hk4ic+jn3ksJ6B96MCXWVww8Xhp2GSNfL430n+cnWiOnSU90lnUt3379OO0uR090Djy35RdXZ+Os5ZvbQ1G/3ZTUm6sBYHwdsyP8tq4e3m8nDK9QLTPN/UmDzJebCwnzFsoAjoHHUGJRfIq+PgqEZplr4QdRQlNt3JMocT0yFcwzYDnU5d2d/WxPefs1PpOJFJ8d13RIM6Fh3j8JoBh4ACVeu4vyxE1lJDgblkmpzVhyHp7XXk2JppvPUnOgCL0xEXItIx6ZGMQBX5nA33AED020fwq+NZHo87OoZ4WYui63DerbfOXX2ys/+O5EB5a774s+DRqjdviTroEa2IvX62lYQo/fTYCxr441eJAjCspJdj44/scqo9AMfLZyAhj89cooOIPfsZxirM/NSDyAk2icuc7SM0KyV6Em9tFZeD5AaxPc8EOXUZg8+flgPZRbx4xcAK1Xx3zwiofdwe237MeQ+2lwcf6Sr20+yHX19F1h7mr+/GUaSr+CGT07+kRgnHsf+ljgBED58VC9bS+CTUOFapgR2vofx/3BmWEiNL+GOb3/dtucnj9Vu7+a77Cu6uPDzdSlgKxpPqjb09On5tOgiFWPgsrUNB/Ue/+rWVHg7gc+njVl+bqvnj7uysY+EzH5Fcw4+vArSXEjbsRzSZP82nSnNjsU/G3raESDX7mesn+9BNSI92SiAZHv+0ShGvvQT/yeAz0/HrfFGHqGfAKg2/JLsW6WuWmIgPSM/sl2vfeh6Dj3BOXng/U/548rT8PlVzBjf3kx2Z/a/bIfeIjrwGCFMx5bthMnwjr80ED8rFyXU1mSdZihnDAfvfdeI2dj+M3XCXDu6qmczV3wkwVTts0m2A8jsnFb5rP0RZCCXz6ahOj1qZJ4YK9PzWI67aa4rerizUVd16vjT9KBPq7ue1LJtI5EjWR3qPn2biLck+yfpPscnq7b1LRuaxvFddf0NWg1x2ozY2cZOF1fpRP7yjaJWwtvNhf0FpD+k3RYh6jrs8W0Pjs1jGU+L1sWPPk/S9cVaGn4RlxN7L1iaH1Yl/tVXk/dhp2E/yw95wCdum3iWtC1K3AQ/2u+nroOQPEZt7DehYS4PezQtYT/rBEtnJMJJ65Lrk3cHttLrozbYg+lWP5n+8rCOfXVxHXJtYkb7NupR6NW8k/SUwbNqaMmLka2RUw/fS6+rquniVzhWfhP0lstoNOeeuL607WL6TPztPn38CZdFEYg/SfptQ7Rqdsmrj+nlnH9Nr3P/lz9BftqoqPfBPrpgUjIiws+j0vJ+8/2GgB16ryJnh+2j4s4F6sC3syIizafhP8kfdcCOvXbxIWgaxfbZ9vJ8b7hS1f/6R4zv+46TE5cCNpWBfuLeAlgAtJxzwL8b/ThGdmpNyeuD72WBgMplwRR/jx96PCcem7iatG2iosb+jd+4iKGg1d//rP95fCc+mviAtG2isqVXVUPDyA23uXJul8Hc2RT+J7/Z/uNbXtPwSUUn/3m7XFrL5icKqVKh3NkW5DDupvJVB/iAECR6Si2p+qq+hDSjQpO17gumr/u6mK//2hzWd/BL6D01FKlI3XL86B59/7bN79+/+n63fu//vq379//9v77k+bHvC5NePukuV92ut5ffvr9+rv3H/723Sde37nMdD0f3v704/XvH959+o7Xcy4zXc+nD5++f3/98ec3P17//Obd9X/z2nDJC/rw/Y/v3v9y/cOb/3f98y/vv33/6W2gkUThyzV/+DFCMyh8QT+///jp+sMPfwv0b1tiuo42+3HP6+hKxM750GISVvJyICaJZGZV2qxZTU3FlxNbMxbFa1+e7u3/ev/f1z/+9O7Npzc8qnOZCzzBjz//+um6qeljwBOcyjyrZZGakbYFDWAm5cf3v/z2/t31p1/eNw7mp19/eft+oL2syPRuNqb69NP1m7efPjRe9d2HtwEH3y/7rN3OqBvZ/UTDqF2Yf3ek24TZ34bvKV0tM6GBo6tL80kx/0Nktpq2Mlgg3G0OEq/qbZun6faYpDK/yGXqzIsEAVXnP0eqARe93M7ozT/yL5+Y/brT5ZeL0+cfVGoyX4/V8tIJBDQhKU5xI5Q/kKETXvdJ5nL1N9X6a5zyVuJy1e0ZKU77WWgSADyUXUFzvYSdpn6RS4f0Tzf/MDn8Iwb1ueQFw/oafaJjnK6X1wOf6aBlWRCPRb0v6azvIIqz3Bww2EuBIQzh64BxAAIXAUMQhq4ARoLAN/zHohi64B85Jj4XX5nbTcEhcRKbCGIsHTQCxFCWIVNF1wSuY3bVvjQ+Lh9ckHq4PNF5Zm6+ORZT7AQE/zct1cEYPvlw1jo1ZGgRGVhALt/ltcTY23yzuclBWhvUhcrEKQz2+JCWoU04KRlo7e83H7qsnmCLiXLP1GpO07iWU+0JDan6EGw2LPBM7e2pGNdQDzrfwr9W1cadEn4p9tXmERC1EES/2DO1llE0rs1EYwZaXruPf47tAbL4c/YErzCiR+hG8j1jAgFvtl+DAx+VeaY+oLSMazhuQ7i1roMGG+wXe8Y2E4rGNxs1Jtxy81pw2MX1Sj1ju/t6xjfbb8mIVjczYdecYQfQdKUu2zTY2Jp9b3Wwr/1iz9jZhKLxvY0aMzC9bHB6eHp5xZ5zevUVRUwvvzF8y999bX4oV+dFicTTK3XZQGurgx4/pBaWm0Vxf8EZbHU9O4gRRCxZchblA7Rsr9R0Kuv3GzMevSh370B2LnMBfRV6voBUM/xkARabzpP0VY9iSEaobqXHaz4JXKgYfc1vWPHAh/zGKi7wK9GDmouh96HHquaeo6DVBp+giFEZeHaC1zz01MRYAJ+LAOePFX8OPP88VuEGvlI/qHETep1+rMrafOvqrq6OEX3syVyovrj9r5hePpW/TO0eP/E7qHg/9LjvaNWn5MlPX0NMXQ8AlrsMxsF71HdQ+yH4nO9opbGzeeiNltGKo7p6FE01pHLoKRha9ajnX8ZCuD7URfEhYpCfBaIV+/ueT0097x8boaEx7hW8YAc0ZOC+nnFW9hvCKW8KxSp3IjMoPx7KQASEVN6KzKC8MAUitXcy09T399ejxplX8IJxtmUuCfB6Xm5DNwJIudAg9z69NQ4AEJsJxAQAnvLDfv1Nuf+m3N4XdekW1YlgBmYeBQbPvNnADM1EAkxvJs4GZnBmEmj6M/MSOP5M7d43GTVbe4UvmLG7unjkrvaE9b0EouGJ02/cVKswSMb5zNEwhrwYg6LnycYMj9Ggxng3Bhjp4WYHNxHYM4Ia8H4cqCkecDSoIS/IgJrkCUOgfPfz1r4WNMr5oKIXuJ5yYDRTml6WY1Zq3BwWwO54eL8pHiagOEvOB+U3kyQyDUsnOguYIf9Hwpjk/UYCGuP7SFCTPV8EsEmgng3QgM+jAU3xeCMBDfk7EtAkbzcS0OAeg0Q0be/HQ0Lu17ykNc77eiUvcL7D3dDXNHKfhVoz1ckQ+kedFcepH1x8CPXj1p5R6gcdB6F+mt8YB2fIbVBwJnmNUXAGnQYBZ5rP4OD48/Pd6bm2UZOUKH4Jp1J8OQyd0DiNL4FweNhSTZzqOlg04/xHBJQhJ8L3y5TdSgSwMTsWFtzkXUskwMngnhXYgCvigU3xRxHAhpwSC2ySZwoD893T+3V5eLPbbb6O8k790s94hmOUjVtKiXZdcpLjsYw9zI0HVG3Wg6c5Dg+QnQvOtniaDAfIzgZnwG2zUKZ47fGwxjhtDtpknx0Hbyq054Q14LBZWFP89XhYQ+6agzXJW4+HNbh54nBNO4EGgfVXEfvf2EXEK3zRGjLSefcVRvpuv3kXOCcCyWTfNArUWNdEALvIM40GNxHYM4Ia4ZYoUFO90ihQY5wSAWqyTxoFapRLIlBN90gcLOSQzFPR47yRV/ISVox7rDugaeCZblpysvMh9E/zPKPgjHI7BKTpPmc0rCmQngvOkKuh4EzyM6PgDDoZAs40DzMKzrB7oebUNN/CAfIdy7fmXfVRjsUv+Zx0O6FpJF2GWsMAuN3kd7H6W5k51A/NWEr9pBk7Es7AjCXhTJmx4+AMzVgKzqQZy8LxJ8jpjvmoSdIvfclhoKns48DtEUbhSyA78g79xesxB2XSmjwe1ph1mYM2eW2OgzcV2nPCGpj1LKwpM388rKHZz8Ga5AHGwxpcsjhc09buILCQe/ql2B83kU7qLHOBq7rhPjU0SufLm+CnhobqCIJ6a6q8EFlXxzPAG3FrbQTAsdfYRkBEw2s7kgTzCj7nqbOvaOSh02/KVG/d1z7NUY8CM+SjCTCT3PMYMIOeuQ9mmlMeA2bYHxOjZJorZuD40+S/3DeERs0UXPY5T1KkrpFnqV6bJm4LaQyj0pfGQhiKvNIQRsVdx0IYchw0hEm+YzSkAffBQJriQcZCGnIiNKRJfiQAyZ+7v7jv5Iyau7jsBXO3xk/WjFX3EkiGx26vZRNnMA1j0rFuLKQxhzoa1uQjXQy0abCeD9LATGcgTZnpYyENzXQa0qSZPhbS4GpJY5q2bwiAwu7HfM9mpPfxil7CLO1/LJ5iVb3spIa8jt+ggNMZCnSTKIDgLEDK/dvhR1qY/ng78rWWkVDyzaap0Xiv/V+/hm/jk4D68rPAqm2xi5CRVcw2jiaNoQlTehSgcUsXAeqClWs0sEmgng3Q4LJFAZq2ao0CNLxoEYAmrlmjAI1YsghEU1csDpK/YLlH80YtWKjoBQvWUMiO0jQuZoebM9HNkAAmuZmRgMa4GRLUZDcTAWwSqGcDNOBmaEBT3MxIQENuhgQ0yc2MBDToZkhE09wMDwm6me7xqnfFrfmgefBTF/2yFzia4fcRGXVj30kkWsZBaWuJR3ISnAnI0P6YBTJqezweSPhlQQ7FiBcG4yAMxmxCSMaFaoKAyBeJvcLw+xK2QhaY+ZJD1GyJe5eY1BXxNHGvVbS7eGs/6DLGWeCSlxyiA8cgUs3LcujU02sHt6SFn+SjtY95mG80gKEpwEAYNfjHgngq14f7WAid0BwAHsrt71MwALk5YAwuFDSKccvEWBD3RW5O+NOgYOFZALmJHYdj0BmMVn/9VJR394FdFY3gLDYPCDPMfg7sZjgUJ7lZYFS3+wkgOqmJEHrfdERFzQfoyJWLKhi3TvTXJrvhDZ/XUMFnXZl8LWMXpnMjWMWDVu5pHmfhQdVFkEsmdRfDLPLYdkcbdkz0mVdOD+1TSW771y/2THs/RtG4jR/RGPZazPCsAoWeM9MCD61RKRaD42qVb6ttuco3P5p/j1eP5S6EMXipw9c+6sXaQaWD1398paMSSgaV1sVd8PjQU3sSuNTS1aZZcGJM3AlcrvhDyGtTij8MOu2ximP1zqJ28H5tT/G4W7UjHPW35aZR9wN+0h36Tr9I5L4Df/TOkm1BdX6Ry9TZ29Vvq4eHfLtmFeJCl6k0LIHrscFvQPnF5lI7+Ckkv9gzki2EovFMC2rMGcLivMmwL7h5di22x4fTmn/6c+Q6e25gvv06puqXrlxwD3HGSmpawy/thFS1BS/R1fiPj4f6uDoc61E99xIJXKK7LvblP8dpPRW9SF/1NE5ZNZRIMqRpH9Wl+5n6031aY6TKtuhF+lZ1tdmM09cVjdZ3nuIuBvwtDLZClec/T57iq02R1z/k9WfwFZmAipd++VDTAHZSs+OYRik9Fb1EX12s65yeDVjfqegl+gJDBesbNVRIfQtvBfxohzi7IvhFJg+Z6vPY2l/aokNLHUBN6ttU+brc0jOAUnouf6lm//LLkN4x117GaN1W77jVkFJ7Kn6p3l1+F9PNp+KT9PoD9xf/mIdVuz9PHrDH7edt9TSq+pfnskPNajHTXhVHrUMqIwLVQZ2WphmnsSt6ib72+3T8/IAaQeFLdHoB55C+kTHmkK5dXdyW4yx4KnqJPj+GGFI3JnBIagOTLn80R8z3jRZa5fnvk6dds+GqD78wG1Cs4CUoHWwXAE5Pg4JZdHsa25IXabOo345WCYtfpJfb1/c0Dm/saV2Q132zXr9tv/zpvqsaiCf2y15yi7m4reoA6cgoe3mSC7WbaBWXBm4Ykh/K7XvjxL4vHotAHJODRNYxD7zrzTRIJ7nJMLxBAmik4VHSLzw9oGe7dP1msxlUi0teMDTXxS6UZ0BqetkJhTq81xoGgNnlfh/86CiNAcjNAaOZaKvADKUxdEJzAPhcFDv7MZnCLHnmu/LBrzbSgLhKJgKEo9MReaba/eD47Je9YIQ+BOM1jKqXD8NhG6JF3Bgt8sem0HYTGKUcEE92Hji3x3+G5guHpBObB8R9eXe/CWeicECg6FxgmoW/3ZrHj8uXWHweUPnxULla4xF5svPAQcfx0VBGncuDMKAb+SH/3PmlQTfSL3uBG9lWb7blQx7O4mQ0vvSFQx1BtI8B5MiyD9tD9VsZujTJYerJzwNrW9l4Y7xZXgLJyVC8XP38sbzLD8PjBBW8YJB03wOI0/USiA2cULwGTcsJIRGMyQvh1cNed/TsYJ97xS66F2ECBzF6Xp5EhlnmIQ99eygCjwIRujuJi1UP3JQmVI+5JT1KtfmmaCP00ef1x0DAkjP0gllb3saPASR4MZBDFcg5J/S78herdbFRc9s7SrsnNgUEnPAfvXVkcOKTxZ97XeaVRizNdEMnL4NBTKNWwihAzYgLf6EqgOcsOxuc6nb/35OwtIKXAOmP3k/VyHF7KnjRiB02g69nTBIhbsjl06WHgZ4ow5crR0MbN2V6uIjJMhuokdMGYaImzGyQxkwdhKc3aS4B402f4uD4ouH5g0peMIHq4lCXd3ehrRep7SUUDM4l3KrpI5bEMda/j4Rxa16M/hTMhaZxQME5gAycPGgQY44eYwEMJQ3TCEZlDo/ug3UZ3wVOZqJ6NB/dNYUx89ErecklhKEm9xWNbLLflguJEBpIFA0SgISs0NKBwyGgftkLLDEQhWB0jYpDEG3iDmUPD411gywIBwSKzgNm3H6HgRNxNogANGLNYNCMXTVGQomYOCSg2KnDw4KT59fdegxp5xW75E7i8Gjtqxo9UP3GsN7CXXYY5y1Q2Wf1FpSusd4Ct+mS+UDiGD8fRkLZ1dUuNwznO5glNxoPFp8H1Arf4xiNB0hOhoLHqU1hHDVKYclLorfFfp+HyD1S18uz2FDTvRaxSQ6HvAxxbDSIs9hEELD3TcjD5IUN9z4ueYlz3K42x3XxXbleF4EZQWp8iYVDndBrXRhQM2ADdxKDcFrROcAYNrsOvZRMAzmLzQHCptLFQuiE5gDwVOcB7pvW38pMVE9fXmzLffoavL8ISj3TlTdaz7gbb/2WsAfd7bZx2R/Mp1XjUbxG4lGQXrctCWQt2LS2CbCg7NyYUCZFHKiIVIrxqFbVcQvjhzHm6yTnxOOnBY1HMz4vaDwWkFGzfju5n+hangknSByahHBk5lAMNpxhFYMrJsVqPCYiE248qMhUuPGovBTB8XhG5wiOR4KSrMZjiciyCqLBa6v5DPDQyorKPNO6SmkZt6riNrC7/JvGR6yitb8GghEwhsZkud0U2zuQXD0WDpScEU/+ZSoeIDkfHhwCGotmXAQoGsvDFCBDb3fEodjbU3w0jpPYjEg21dPbTbn6/K7Y5LSnDyLC4vMhe8w3ZSMQjwkIzofG3c95D8MnY/F4ovMhKqZgGRHLiUORs+eHEIx8xMlhEAde//5Wl+uh9Q+VibzBgxR+2O6L+tA9Mkvq84tcpu5dXe3e3942HoBV5xeZS92bTTPLC/45HrLk5crdXdCg1nOROdV9LOiJ1St1odLt4HD1izzTbo1QMm6zhhoweKL/4WOk/tdIdjyYoR3ScXMoP1bHmtlCBiD5orMhKuD8icWEhWdDtT7N7HfFbd60PBYZVcFs6O6OxX5/dj6x2PrisyFrs6e/bdb98m5r78rEoqOrmBuhuVb5s61mKkC/hrnx/Vhd1HtAfG5kvxSrY72HuQpx0KD83Ng+Nv9yNpkIzqtgbnS/VeX6h+pxslGh/GzYmm1a2Zwb/lk0p5ndTZXXa5bdCSBka5kPp3+VYyyuMdc4JuD4WGz35aF85I5pg5D8CuZGtyvi11JfdD5Edsfwttp9/a6q6JceQ6Cw9IwrfH730YtLjl7Zz4KzopkCZG4M75nw0wCM94OBpwlIuHjKIJbhEEo0mp8ep4Fp5ebtGT5KONQ1Y0KE0fvkKVvjufvkexN2mdIlneAlaM4nW+/rZA/V+rhpcJhfEidYcGAFZ8a9oU1OVdwetyur2FXi/ho+DVsIZN3ranV8sBuwfP2VU+EVmkXTz3X1UIIMlJDCtuxUvUW+uuf0mL9Nrtd7WxBXbP44ueb9Kt8V3x3A51Zw9acSl+n4pbgrvoSV2CKXacGf9yL1tIUma/pyqPPVwXTJp+ZnVpdfbKq2u+LwW745Ft82Q9N7/Bypw+Wm6tu39XyqQtr8UhfoMuLvyv0OxkD6ukCpyVZrqjB9ExzroMylely+aGDaonKT9dmvMVYfDzV8kBMrg4UuGPcFWPf7w73569S6y/2buuaHQPvn6bW/f9gdvv508w/IVvV0gELTNX3b1sqr6UpM1/HzJi+3Q60BhaZq2lYV60rN36bWW7kvxHBVt3+eXHuz563LdfFDcbiv2PHql7rAg30qH4rqeBjYZvQKTta4KQrWKPaPU2s+VHd3m+Itfo4WqfBLXbCquS1tYDlzBaa3BkaTeo0YDCIFav66Y8186Pb4E+rN1/nO3F78dF9XB/i+K96Fo3JR+uT5sPDDT79+fH/9118/ffrpx3OA6DGvy/zmdG7wCsW1LBQGG9QyFAjrizGNfPP/rj/8+IlV7P48tQvL/Q/5iqvb/jGq5l7Sdmv4T197EUSrAf59PtuEFIwyiwc7kDZnnHz31RKuib1Cz9JOWsuoxvZbAWiC5PyK8m8mOcZek3zvnebaqh0OVCiqrVqcu3bVOAv71YwYRS99qUCbcVvoFr8rbpslFhDBHoLur8/XRk/D+MadYMORq87Nqot9tQFkT0DnuehF+rx9XlDdP0Lh1FHaDvfgElNAlyn3jbhM1yo/AL4kZLu24AW6dmh7FtB2LhqnL+hshvW9bv//jXg9xu+c6kDibP7lSMNyaF63FUyA1Gcs5+4qC679+Rt5EUrXTvai6cgRywK1NXyT/Gk7ssXX9eXIGc71peuvf//91YsGbfHlxV/+9cLc6zP7/r+8SF7L18umytuy2Kyb6v9wzWgUVg+GkX3x9/Zvv1mCxJRwRf7P1YtXf1y90tlrrfTf//7qj07C/sH+whYTXDHhFWuM8Yd4lSavUy29YolXrBlWfySvZFObX0p6pVTzL0lVprxiuvmXooppr1ja/EtTxVKvWNb8K32lxes0zbximVds0fwro2pbeMUam/yxoGpb+r1rOntJdi8yg+lucUUpFr4lhDUFaQvhG0OYXm82A1RJ3yDCdLyQr7R6LRZ+Qd8kwnS9UK+S7LVaoJK+VYTpfaHJpvuGEcYAIiVh+rYRxgaCtI7wzSOMGQRpIOFbKDF2EEui6YlvocSYIbl6pbLXy6VfEE0VY4VEUAV9+yR2tiQUyMS3T2KskMhXatmU9Av69kmMERpfTFXp2ycxRkjIeZP49kmMERLSPolvn8QYISHtk/j2SYwRmm0wVdK3jzRWSJZUSekbSBozSHIKSd9C0thBklNIIn9m7NCcZYlRLH0TScXODOnbSBpDSNL/Sd9G0hhCki5Q+jaSxhCStKb0bSSNIZrlkGqRbyNpDCFJa0rfRsoYQpLWVL6NlLUR6RCVbyNlDKHIlUn5NlLGEIq0pkLrjjGEIh2i8m2k7NpDOUTlm0gZOyjSRMo3kTJ2UKSJlG8iZeygyAmnfBMpYwdFmkj5JtLGDs1Wn+hO7ZtIGzsocsJp30Ta2EGTE077JtLGDlqQ2n0TaWMHTZpIo92BMYQmp5H2baTtDkGR2n0baWMITS5a2reRNobQpI20byNtDKFJG2nfRqkxhCZtlPo2So0hNDmNUt9GqTFESk6j1LdRagyRktMo9W2UGkOkpI1S30apMUQqSe1oE2cMkZLzKPVtlNqNHGmj1LdRagyRkq4u9W2UGkOkGVnSt1FmDJGSNsp8G2WCXRAy30aZtRFpzcy3UWYMkZHWzHwbZcYQGTnjMt9GmTFERloz822UGUNk5IzL0F7bGCIjZ1zm2yiz+23SK2a+jTJjiIyccZlvo4UxREZv4n0bLYwhMtKaC99GC2OIjNomLnwTLYwdFqRTXPgmWhg7LMgJt/BNtDB2WJAmWvgmWhg7LEgTLXwTLYwdFuSEW6ATkbHDgjTRwjfRwp6KSBMtfBMtjR0W5IRb+iZaGjssyL3F0jfR0hhiQU6jpW+jpTHEkrTR0rfR0hhiSdpo6dtoaQyxJG209G20NIZYkk5x6dtoaQyxJG209G20NIZYamJ4LtG51dhhSZpoiY+u9uxKn7au0On1yphiSVrJ/Q2WNcZYkhsM9zdY1h5hr+hz8RU6xF7ZLfgVfTS+QgfZK3uSvSK39u6PsLA9zF6R88r9ERa259kr0mzuj7CwPdJekbPL/REWtssUeai9Qsaz9EIDjeBiRI96cNwDbWnMPjj64Yo+WmMCwjEQVzQBgjkIR0IImozCPIQjIoSgKAvMRFi+gTy5C0xFOC5C0KMCsxGOjqBpE8xHWNaBJAUEIiSEYyQEuXoKREoIyz0IhmdJMHPkqCNyRyQQOSEcO0FSCQLREyJxpsvMaLu6UqgwMp3jKCgyQyCOQlgmQjA8DqIphCUjaGsgnkIkznL0uERUhbCERNPxNOOGjGc5iabjadINGc/SEk3H04WR8Swz0fQ8XRgzf476o30QYi6Eoy5oLkgg8kJYikLQdJBA/IWwLIWgGSGBKAxhiQpBk0ICsRjCchWC5oUEIjKEpSsETQ0JxGUIy1jQ5wuB2Azh6Ax6PiE+Q1jWgqY+BGI0hOUtBM1QCYW5W8tq0G4T0RrCshfNaKErRtazBIagmSqB2A3h6A1yKy0QvyEsi0EfyAViOIRytqNHMiI5hKUy6PO7QDSHsGQGfdoWiOgQjumgbYeoDmEJDfrELRDZIbTj3emZpzH1zh+mBWI8hHamo2cpIj2Edo6TnqWI9xCW3RA02ScQ9SG0Mx49SxH7ISzH0UwxsjAiQETqTtf0DEEciLBMh6CJP4FoEGHJjmaS0YWRAVPH+tKjE5EhInXBE9raKQ6fWAvSLKBAlIiwxIegiUCBWBFhuQ/BTFVEjAhLfwiaDhSIGxGWARE0IygQPSIsCUKzMwIRJMLSIM2spCtGBrRMiKA5RIFoEmHJEEHTiAIxJcLyIc28pAsjA2YuAEZbO8MhMEtqkedhgRgTYXkRQXOPApEmwlIjgqYfBeJNxMLZj57biDoRliBpJjFdGBnQkiTNJKYLIwNankTQVKRAJIqwVImg2UiBeBRh2ZJmEtOFkQEtYSJoTlIgNkUsXBCTtjYiVISlTZpJTBdGFrTMSTOJ6cLIgpY8aSYxWRgxK8LyJyRpIBC1IpbOfvQKiNgVYTkUmiMViF8RlkXh6kXWszwKzX4KxLEIy6TQ/KdALItY8mylQDyLWLoQND2QEdciLKPSODO6MI5DW9PRRGyC+JbEciqC5mITRLgkllRpnBldGMWkHeNCM7IJYlwSx7jQpGyCGJfEMS40L5sgxiVxjEtGR4gR45JYUoWM1iWIb0kc32KIXCJCjviW5MplEZDGThDjkjjGheZzE0S5JIInnhPEuCSOcaHp3wQxLoljXGgGOEGMS2JJFZLUThDfklhOhY7gJYhvSVzqB80tJ4hxSRzjQtPLCWJcEse40AxzgiiXpM0BoccbzgJxpAvNMyc4E8TyKjR7nfSSQZz1yGUywQkhllcRNDOd4JwQy6vQfHeC00IssSJoIjvBmSGOdaG57AQnh1hqhWazE5we4miXJT04cYaIo11o9jtBtEviaJclPYoQ7ZI42oWmfhNEuySOdqEZ8wTRLomjXWjOPEG0S2KZFdp8iHRJLK9CsmAJolwSR7nQVHyCKJfEUS5Mxch4jnEhnQXiWxLHt9AUf4L4lsRyKglN8SeIcEmUS8KixzFiXBLLqjQLHF0Ymc6yKglN8SeIckksrZLQFH+COJfE0ip0DlGCKJdEOaqaHseIckksrdIshnRhZD7LqyQ0yZ8g0iWxvEqzHNKFkQG1MyA9khHrklhmJaETHRNEuyTaGZDKpEOsS2KZFTrpDpEuieVVmLQ7xLkkmuWqE0S5JJZV4VLvkOUsqZLQSZwJYlwSS6okdB5nghiXRLs4Az2MEeOSWFKlWerJwohxSVJnOSZjEFkudTmQ9NBEjEuSOttlZNchxiWxpEqz1tM1I/NZUqVZ6+nCOCHSGjAhzxcJYlySlnGhsjsSRLgkllNJ6JhAggiXpCVc6IqR/SylkiS0a0F8SxLIR0kQ35JYSiWhYw0J4lsSx7cwFSPrZW7u0SMO0S1JxicbJ4htSTJnPHp0IrYlyQLGQ2xLkjnjMemvyHhZwHiIbEkWznhMtiwynuVTmi0S5YgQ15I4roUGgaiWZOFSkOkJgqiWZMGnuCaIaUkWznHSfh4xLYljWpiKke0sl5LQoZEEES2JI1qYipHtLJWS0KGRBPEsieNZ6IoRzZLwNEuCaJZkGTAdYlkSy6QkdHQmQTRLsgyYDtEsydKZjp6jiGdJlgHTIZ4lWTrT0XMUES3JMmA6xLMkS2c6eo4inkVe8aaTiGaRlklpdsJktjSiWeQVbzyJWBZpiRTy5C0RxyKvAonliGKRV8505OIoEcUiLYuS0MEZiSgWaXmUhA7OSESySMujJHRwRiKSRVoeJaGDMxKRLNLyKAkdnJGIZJGWSEno4IxELIu0REpCB2ckYlmkcLkR5ICTiGWRlkpJ6OCMRDyLFO4CB21BRLRIl9hCB2ckIlqk5VISOjgjEdEiBT/7JOJZpOAXPYloFmmZlIQO5EhEs0h344YO5EjEs8gkMPsQzSJdagsd9JGIZpHu7g0d9JGIZ5EJv2WRiGaRjmYhD98SsSzS3cGhg0kS0SzSXcOhA0QS0SzS3cShA0QS38Vxl3HoAJHE13GkMx89OvGNHMukJHSASPYu5Vj70QEiie/luOwWMidA4ps5lkxJ6GCSxJdzLJmS0MEkie/nSHeJih5F+IqO5VMSOpgk8S0dyV91k4hrkYq97CYR0yKVSyyjEuwkIlqkI1roeJZERItU/HFBIp5FOp6Fjn1JxLNI5YxHD05EtEjF71sk4lmk41lSeiAjnkU6noUOEEnEs0gVcJ2IZpGOZqGDSRLRLFLzhz2JWBbpWBY68CQRzyJ1wHqIaJGOaKGDVBIxLVIHPCeiWqSjWuiAlkRci9T8YU8iqkU6qoUOfklEtUgdMB5iWqRjWuhAmURMi0wDxkNEi3RECx1Uk4hokWnAeIhnkY5noQNwEvEs0vEsGT1DEM8i08DUQzSLtFRKQkfgJOJZZBrYtCCaRabuAio9mxDPIh3PQkfgJOJZpOVSEjoCJxHRIh3RQofKJCJapCVTEjpUJhHTIh3TQofKJGJapGVTSKJVIqJFurQWel1APIt0PAuzNiGiRWZ8NrVEPIt0PAuzqCOiRTqihaKGJaJZZEuzkHgRzSIdzULT3hLxLNKltNA53RLxLNLxLHQSukREi3QpLXTWvEREi3REC50ALhHTIl1KC50kLRHTIh3TQl8LkIhqkS3VQpBZEhEt0hEtdGa5REyLXLoDH4kBUS1y6WYec70Zmc9xLXR0WCKuRS4DyfASkS1y6a6hUPc0JOJapOVTyNc1ENMiHdOyWNIQkOksm5LQQWeJqBbpqJaleCWXrxM8nRDVoq7c3f3klUpeN07OK6wQ16JcSgvdbQpxLcpxLWS3KcS1qCvuURKFqBZ1pfhuU4hrUY5roYPZCnEtynEtdDBbIa5FXQWspxDXohzXQhtEIa5FOa6FMwiynghMPYW4FtXeISINgqgW5agWsiQyneNZ6LC+QjyLcjzLMiXcikI0i3I0yzKjLvgjlkU5loWOqCvEsijHsjDmQCyLEouAORDNohzNwpkD2S7hr38pRLMoR7OQJfGTDElgYCKSRTmShU4CUIhkUUlo5iGSRbkLREwfI5ZFuXdO6FGBWBblbhAxXYxYFuWSWZguRrZzJAtZEhnOkiiSzoZQiGFR7YsnzNMXyHgyZDzEsCjHsDBdjBgWJVVgGCOKRbn7Q0wfI4pFuWQWuo8Rw6Icw0KWRJZzT6DQeSEK0StKLvnxg59BcakstFfBD6G4q0N0vonCb6G4u0N0vonCz6GokO16L6KEbIcfRVEh2+GHUVTAdvhpFMXaDj+N4ugVZhTj11EshSLpbBqF+BWlA8ZD9IpyWSxMFyN+RTl+helixK8ox68wXYwIFuWuD9FdjPgV5TJZyJLIcI5dYboYsSvKMiiSzkFSiF5Rjl4ho9gKsStKBzaaCtErKg1tNBG9otLQRhPxKyoNbDQRvaJSdqOJyBWVhpY7RK4oy59IOnNLIXJFpSHjIXZFpc54ZBqyQuyKcuwK123Iei6Lhek2ZDzHrlAlEbWiMucz6S0FolZU5h75oldSRK2oLOQzEbWispDPRNSKykI+E5ErKgv4TESuqIz1mYhZUVnIZyJqRVn2RNKpaQpRK8ryJ5JOTVOIXFGWQJF0appC7IpaOOvRKx5iV5QlUCSdmqYQu6IWindCiFxRi5DxELmiFgHjIW5FLVjjIWJFLULGQ8SKWjjjMU+HIeMtrwI1I2pFLUMrHuJWlONW6D0TolbUMrTgIWpFLQMLHmJW1JJd8BCvoix7Iul3JRWiVpRlTySdf6gQtaKWocM5olbUMnQ4R9SKvgoczjWiVvQVfzjXiFnRV9zhXCNeRTtehR4/GlEr2rInks7E1Iha0VcuY5rkNDWiVrRlTySdXakRtaLd2yzcO3joiTfLnkj6eQaNqBVt2RNJp0xqRK1ol8ZCjwuNqBXt0ljocaERt6Lb12HpcYHoFd0+z0KOC8SuaMeukCWR9Ry3wowLRK5o4axHP/OLyBUtAvsVjcgVLQJzTyNyRYvA3NOIXNFJaO4hdkUngbmH+BWdsHMPkSs6Cc09RK5oy59IOjdWI3JFJ2woSCNqRYdeZ9GIW9Ett0KFdzSiVrRLYKEiNhoxK9oxK2TERiNuRTtuhU7l1Yhb0ZIPwmpErWj3niydyqsRtaIte0L3GSJWtEtdoYMqGhErWrJXFTSiVbR7V5Z+aUUjXkW7p2XpFGGNqBXtLgkxQwJRK9o9MEvnCGvErWj3xiyd96sRuaIduULn8mpErmhHrtCJtBqRK9ryJ5JOjtWIXNGWP5F0wqtG5Ip214ToJFaNyBVtCRS6lxG3oi2DIunXPTSiV7RlUCSdQKoRvaIVT41p/PysduajRxF+gTaQvaLxG7SWQJF0YqrGz9DqkNvEL9FaBkXSWay69xgtH8fT+DlaR7AwKxN+kdYRLHR6rMaP0loSRdLpsRq/S2tJFKnod3ERw6ItiSLp9FiNGBZtSRRJp8dqxLDo1BmQHp+IYtGWSJF0eqxGLItOnQHpMYdYFu1YFuY1Y8SyaEukSDqNVSOWRQeuCmlEsmjLo0jm/WNEsmhLpEjmCWTEsmj3Ngu5/CKaRTuahc541Yhm0Y5moTNTNaJZtGVSpCbzDzSiWbRlUiTzcjKiWXTmzEcPDESz6MyZj8qD1Ihm0ZZMkXRiqkZMi87c4+r0uEBMi87cJUsyv0IjpkU7poXOTNWIadGOaaHbh4gW7YgWOotVI6JFO6KFzmLViGjRlkyRdBarRkyLdveFSFZGI6JFWzJFmqeDiOYh8y2c+ehBhLgWvXDmowcR4lq041rorFCNuBbtuBZyV42YFm3JFEknkGrEtGjLpkg6KVQjqkUv2TuyGhEt2pIpks4J1Yhp0W0OC70dQWSLdmQLnRSqEdmiHdlCJ3pqRLZoy6dIOnlTI7JFL93HDeglCpEtqeVTGLeVIrIlvXL2I0dcitiW9MrZjxxxKSJcUsupSDrLMkWES+oIFzpzMkWES+oIFzobMkWES+oIFzobMkWES2o5FUlnQ6aIcEnd4yz0a0ApIlxSR7gsFOEFUsS3pMJ9oIL+ShDiW1JLqUg6czJFfEtqKRVJvwWSIr4ltZyKXNAv/CPCJRXOgMwj/8iAllaRS/qdf8S5pI5zWZKPuaSIc0kd57IkkxFTxLmkYsF65hRRLqllVSSdP5UiyiW1rIpckql9KaJcUke50G/8pIhzSRP3LKcmvGKKWJfUEiuSfgskRaxL6lJaaBIzRaxLmgQ4sxTxLmni7Ed7GMS7pO7mEH1HPEXES2rZFUmnOqWIekkTx3gyDUQGdNwLnQ2UIu4ltfyKopNgUkS+pNJ9KIb5cAX+xoX9Vgyd+pEi+iWV7mFVeoQi+iV1X/VhRigiYFJHwNCDDvEvqaVY1BV5TEsR/5JaikVd0V/HQPxLaikWRcfuU8S/pCpAWaeIf0nbz/zQnYH4l1QFZiCiX1L3rR+mMxD9krYP49KdgeiX1H3xh46yp4h+Sd1Xf+j3UVJEwKSOgGHah+znPv1DR7hTxL+kjn9hnAYiYFJHwNCn/RQRMGn7Sgv5IkeKGJjUkiyKDrSniIFJdeCtjxQxMKnLb2EcOWJgUsuyKDpwnSIKJtUpv3lADExqSRZFp+OniIFJHQPDjHzEwKSOgaFHBv42kHsdl+kL/Hkgy7EoOtSe4i8EpUmgffgjQan72BbzoR5kP0fA0L2MvxTk+Be6L3rfCrLTj473p/hzQakzH+3l8BeDLMWi6FBwij8aZCkWRYeCU8S/pJZkUXQANEUMTGpJFkU/OZ8iBia1JIuiA6ApYmBSS7IoOqaZIgYmzdz30uhhhBiY1JIsio7kpYiBSS3LouiQVIoomNSyLIqO26SIgkkz/hJYihiY1JIsio7bpIiBSS3JouigSYoYmNQxMMyuGVEw6cIZkB4aiIJJHQXDHAsQBZNalkXREZYUUTDpws1A+liAOJjUcTDMgQORMKkjYZhzDyJhUkfCMCcqRMKkLQlDHjgQB5NaokXREaQUsTDpkg9BpIiESS3PouhoU4pImNQyLYqONqWIhkmXzn70nEI0TGqZFkVHm1JEw6SWaVF0tClFNEzaPtzCfB8N2c8yLYqON6WIhkkt06LoeFOKaJjsyhmQnCcZomGyq8AWJkM0TGaZFkUHkTJEw2SWaVF0XChDNExmmRZFh28yRMNklmlRdPgmQzRMZpkWRb9ukiEaJnMv5NLhmwzRMJllWhQdvskQDZNZqkXR4ZsM8TCZ4N/eyRANk1mmRdGhngzRMJlwBqSHBqJhMsu0KDrUkyEaJrNMi6JDPRmiYTLLtCg6fJMhGiazTIuiwzcZomEyy7QoOiaTIRoms1SLomMyGeJhMku1KPq1kAzxMJmlWhQdk8kQD5NZqkXRMZkM8TCZ5VoU/VpIhoiYzBExZIAjQzxMZqkWRQdwMsTDZJZqUXQAJ0M8TGapFkXHZDLEw2SWalF0nCVDPExmqRZFx1kyxMNklmpRdJwlQzxMZqkWRT/VkSEeJnM8DB08yRAPkzkehg6eZIiHyRwPQwdPMsTDZI6HoSMiGeJhMsmlfWaIhMks0aLo2EmGWJjMsTDMZzIRC5M5Fob5UiZiYTLHwtAxjgyxMJljYcgwWYZImMzyLIr5tiYiYTL3uWXm85qIhckcC0OHODLEwmSOhaFDHBliYTLHwtAhjgyxMJljYegQR4ZYmKz9PhFtbUTDZI6GoUMcGaJhMvcRZjrEkSEaJmu/w0xbG9EwmfsUMx22yBANkzkahg5bZIiGySzToujb7xmiYTLLtCj69nuGaJjM0TD0e+cZomEyS7Uo+up5hniYzPEw9BvmGeJhMku1KPoN8wzxMJnlWhQdisgQEZNZrkXRV7kzRMRkjoihLzBniIjJHBFDpWhkiIbJHA1DRyIyRMNkaeBBggzxMJnlWhQdXMgQEZM5IoaOF2SIiMkCeTAZ4mEyx8PQ4YIM8TCZpVo0HS7I8PebLdWi6XBBhj/hHPqGM/6Is2VaNB1ayPB3nANv5mb4S86WaNF0GCLDH3O2RAv5idAMf83Z0iyavlSa9T7onPH1IttZlkXTty4z/FHnzNmOHsiIgskWznbkOTRDFExmWRZNJ4tniILJFs549HhDFEy2CBgPMTDZQoUgI+Mt+DewMkTAZIs01DxkvUVg6rX8y99fvSi3j0V9KNYftuviy4u//PHHi+vrw9dd8eLVv15cl+6XTSW2zhd/+deL5kDzl3/9+9WLZgtm/9/MCPt/8wB2+8Oy/eH0p2Zwtz/o7oeucNYVbvq7/UF1P6TdD4v2h+VV90NXeNkVXnaFl21h86xr+0PS/dAWNo9Ztj+02s1jke0Pp+bJ7oe0+6ErrEX3Q1dGd1I6637oCqdd4bQrnHYVpi0Mk1rufuhq1l1nGvbS/bAUXX+37cq6MlnXz1nXz2ZAtj/o7gdbuPmpHQL2X2ZIXOfbr/tiU6wO+c3Gt3qzBzmZ3XyVhalglW82xaP5FRCW6VlWtm0wX8cM1PFQHO6rtVcJACB5/cVms80fH6q1Bz9ZAuErVvi+WH2GYs3R/CTmzEqJFXVd1eX2tvI6LEnAPJFsY2+Lw+r+qWxauzuU1Xbv1dGcpc51LFnct+XmUNT58VAVX3Z5I7v2kcBa+K67reqH3LObea3y3G28ZLnfVPm63N75aq+A2mTJCX8uvj7kO18tHC8q4STNQNt4Q2QBVKZuhlOC1e1+98UTlKCh2s12SnCX1wfTVL+d0CHKoOzex2u+5QtE2Ybuqn1pBke+8bspg93EtrYu7sp9Mz62aE5IoFyyg7sumtK1hzoD5kn4Xq6L/zkW+0OJekvAJrNDuq6eGj/04IlKOKAkO6Aa0XL9xVe6hJILTnJf1c1kLDfrptGe/BJoNl9hYuQPdVH4zTXPi507ecla+LhlrQSnYMrK79b5oVhVm+PDtmn94d7zI0vQ50vWXsdDicYXaDQ79x/zzbHoTeAFHJns2Go2G/tmWPui0M3zpnoqyrt7f5GRCZzDrMO13YOnP/TzrMPJV4fyselmDy/0ckm3mpvsrkAdxlBoiEIfzfpKJ4xHiAB2YhfmfJ3vjPDhvq4OB39tN2e9Uw3mhMdVsaYmhwRzS4lucWf78FwJseCZpFngwDkbNpX0OkFCv8J68Hz9j+P+cN8bPOYbSuf+V2wv3h58X2gy5c6AE264NhsaY/Jmi7C/+ep7CAn3CeZOMVPD9qu/GYIjNmUHzG638eRMhOts6ivWSkbO/LLZTHjiQFolna3ZsQ5qoYy9ENDY7LADteCziLnaA7ohCOSh3NrdUX/XkC0hDnbo7PfN2cjrjQw0IGOds9mX9Q0BJ7xJHuBlm5GzyXd73+1cwe24Cql2W0J/0IIhl4rudLFgp9uploe9P5hAG0xAjha/ydd3vtUE0K/Ytlu51abpd19YQuGg0kNVbQ7lzhdXUJybADdFsxv2QWfQYOzMcYL0SiHgSsFNdFdBsS79oQa9bHbFdlm1/uqvpgKuptzQvmn6yU3QuthXm0ffx5n3u8FGkZtktpJ6f2hOQnehyuB+RnMD1xwBb3L/MKbgQpemnI9e5dtqWzYV2KKeswCdodl2rPJmD+gdAq/gMF905+sFi705gvojB8xVveQMv7rPt3doxIB5Yr7m1e4t2JbbGno+UsMFhh139ux7U/mbEri36ZZ20ZEruqNJOiJHd3yJZo+qnRY3QDxdGh762JWU3J4LuPafOamObMlYSxnnUvhHbgEPy0nHznQUle5+o9mt6WpT5LU/boHH4aaglXLneG/nDg8urNOxwg95/fno+zo4+3XGAy79iZbAY6n52BsjV23Wxa0/wzy+hFVYbfDZzlwVBoOU8+p23+zLwbmVssOut982edAAakvQmTRotga7CO/Lm2Yfd+ePGXjyEOxxp6li3yyi/miDBMCJiex4Ps1P9aauQ31cHY5oldKwWVmgH5uDou+krqCTCgs2Zi+3JZ7B5vmLcxUsm4Gr2DTHXv8wBk3Kbi5dNZZqxNSbhHyjDtkD1oDOsBKuuDo0LppK/OEABJOOpO5oT/OVFa6mhwfkEiU8RrMb5FW13RbNhmO7O/p7BmiPNOPOCK34odrdNBuX9ao+Ptz4iwCoxnwnlq3GjcjKc2DAEq0LFVftZMu6dSPL+GF+9Jlkby3jh0Yj5ftRBRmglN32rfND7s9sOLFb/Em3FmScKdc3G8KpKuhUOexrZu8It/vserYubpqmr/zDPXROKctANaLHu97RyHxnGdie8wrrovnNrtnu7ffVsV4VuBvNt93AQOZGYuMT8uPmcM1ggYuLFGzfF7dFXfsMuAlxnodhoPt2B2/nZ26tgj0/N0rXRTPyK3S8A2s+b+tDXm78IxV0Hik/wMr9Kq99ptGn67hpuvaPggncU5vP8rJS7QEe7y5N3ic4mLCmrVZH8wvjYfyOykBPZWyIwZPf1dVD6Z+HFTyjZOzebF3nXoxCwQBHxm46jViBmBDIU2YsY+cksTOC8Y2M5cCtbO/wriC3mrGrrBFudoWPqJcg+yPZcdnIVo8YM7QzG84yovtDjniSFBqH3dOs62rni8EzL3t4NWLF7a2JWW421VPRI4kU3OqZvOihelo/5NWhIdUj+J7r6uiDgH3AruWmAhMJqLb9CuCA432RV8G+8FsBd9kZyzWuvzZlytWZFfCJakgpsMwjrMMjBfy6oEtnd6ttXYGz4wKSCuyBpa2nbLYqVB1efJkdba4OvkVwpWP9d7PI3/sTEw5RNrSFWSFzuQF47zbOn3aJA2mXkpCxTLqpkfPskFFP2RO9N/X8KQOdjeA6tHcShJtezW43jVjh7w29o/KLdtvNzVQjf9usI/eHB2+XoaABs6B6I+6SJfwtr4KjOlOsMR92h6+WzjAnIOfocdZFcgVP4ix5UGyNIFrY4c5Nc+7CSbroodeXwFEs2RaYvAd/DwKjWB1TpnR79lFdNo8+ZaKwp6Gi2eDsip51IJWWsftRJ9y4weKLLw3dHxuictIEd6xgdCrjrYHTX8wFbRAEbo8PqstAUlfdb7rEI5V0f5Ldb1TXh7oloFTalemCjio79XP3Q5cjpa9aT6DFiavrftM5ibRj71J+yJqWddQs9hcm8RFsstneNXUcKudA/WkDfSB74G4nygbNWhhDc80QbBTvVAUZlILHJXazQObZCDA4RXJiH9nedHX48UQYUtLsaa34csD7Ubh8ZZqdGV8OdXPANPOqcTkomgU3luyhpc9RJpAyTdggnBO8qfNts5D76QmQcmWXKiffS+yCKyDnrc+i/QAi5KzY84+rwMScfeAZBM6NWCBMDjgY1WCDaK4SbqmGZ7+UZVNuy97E8ejCtJs4fD9u1+uyblY8u275TAnMgmI9iKnhtqx9xk9Dwq9jiVgHYKr4XHiHSBg6YFlnI7dtxjzOHNBwBIRw18WmWSV7mQfaiwt26Hk7finWq8pnNmA8NAk04IvbbjRDQNpMhB7JJOBgSsSomsw2pnEmvcEtYOpSItie2fhHagmjZapLS9VsYsptc7Lf+5sIyJ8uuFXWyvWyQOCEZFtvJE2qlp/ZAIkXfgZUtU+vSbhqpVenOEKXCMS7w162ZQqTF7vkCs2338hfl8gZa9iMLmSnWb923NpB0F/L4XGXPcbcHv/5Tz8tZeGpb3coKWvEu+JwSojCBwEYvEoHK8AjIYXLOGeDRppQLGAAQrAscyNMRh+AMLd7aEStE+x5UUiUpLqzHkcWmGqoWQBJrTSAYZMTEAQMngg2QG/EMUMrJJx+7JnDiDaHxf3hcddLdoS+gxt1jbzx420kzgcAdxKsIzUVIMVwGeSl+ud9yOqo7j5Dt5/P2P1EU9cur9ExQcCIk2CXopMsDpwJmJ0l2Fiolfd5bgFD1IKNvhrJunikOh7y3SLUbLfuFP3lBhJs3ZEkEQFjNNZ4qMhB5KXcBipASwA0JS9l813tmonchoJpZBkbdbyrUYawFy5kky+NGEvBQ2fN5q/dHYv9/kxQ+lQNPLqxnX6f78n0CzgJBOuqjTRO5hKQmhWsn25Ee9sESIeyJ71G8L7I15jKBpKcj+iLJXCHkHSnTM0e71wNRIqJhHnsmh2hTp7guQSc5txcvS/XRXdIpeKhEEO6YDv+XEvttwGmlKddSlC6YIdOeXe/6WVsw7T6tGMmUjaxCrNBEjKUml0vDN/rzzhgx26f1V3+Sk7XuBadhZOWTTFPJPMaXF65H7CEjLLgnKIR7qVIJv65NtQ0nLcACejOj7LeqK3A34BD4layG3eGRofHKcnGxYwwToaRcGArlkAyogQ55+XKde3WqjNmd5eOR+R5ZbCP6AaG7Jizrlc1m3aLc43giqRZZ1U2/1yXiIhV8GyYdqfjlF1iy+1qc1wXzcRd+15awWGf8r3r5Jtl+taXhjDY6AjeCyeQR1bdeUB1SXRKtp2rujucmmUOTLaQVzX0YAnreGxWjLljhoY4nCUJ50StMF7nE8j6qM5rKdW6C8USF7Y2u33wq4N7XsEOqa3JPt8SFJaCe6+MvY5V7t1ByV9+4UmH3Xs0ottVs1+v6urWF4dHBfak0YjXde5H/SFPkbHH03LfXuf0pibYbbBLRel2KhgvPJ+wCcSNLJGpBylmcbqsy8Zhy71Jgunn9Jo3jcGxlh15+2YOrortOm98HWoEPCWw8ddyb0J7aJsO8w66Jgg27NpUYUJU1c0/8HYRMkMZy1A08v24FIwes9uORpIMhwm4MgmWlujEET0PTxiCd4D79jZtf7ZA0wl2n20qaM721CkJeh3BO9F9R8v4nQ7peZaVKPf4gAEDGryb3BsygMQMN/ds2pqR96kgAallkQUUV3nPUtAtsela5K1jmKbSvT0gWEa83D/kK5/4gkHrwOx6MLcEEOwlTNJj03rK/bZ48nds8Dxw1W2D+Z1K45vummb3yE/tXQTkTjZG3NAHyK3AfZtgDzVWuH8FGnLggt+t7qk70JCxFOx9nkZ2k5dbyhnBYzfLlZX7uhkr/g19SLgKNie0kbRXoJGxIT0pWIKzEa6qHtskIDspAm6wrp7w6gdmFfuMQ7nvaBZfK5zKAVewP+QHgluHtKIIrLyHatenBmG6nAgAP24JfwDXLbHgB/ZjaTwYQu2FBNhxbTw+yuMQMKAtunmZsGv256LYncloAouEMdqUzWBFwS0BeQchTsdTbrw24tcNAJyCC1c/mQR0Xx+q69wuP9fr0p9rCfTpkr3j3FSybgauv1uHh27W/mYR+p9jufq8L/J6dW+Ctv4JEaofWUf54BvBO9yydaDFzHv0pkvql+y0N/LYSSbwZJ6wI9Embe6r7QYFVmCUsRsEKd+RzTQ05+TGZdIcEvRebE+iFsD1rXtZR3RP0STsnRFilZbQHWjWARrJnilgVqjozo0pm8y4qfz9AdxFddFalthphG0yulcDXG86+oh9VaGpoZcm5WfhdjVw/ripAR+rvXvHqquA88hNBXgSeEnXAcVGDiWaeInWAZVPee15AC/DsQvyL7nx+5B/tl70UB6awWv3Wj4ZK70HfTgcXjU2L5mqC8ZNJHuiM3VRCwy0pmBvdwJpKglkCQN/bKz9AV9NFfBeiGCTHdtGU5dqEwhfsnT4Q/6lkfA3XvBuYsbeK20kN8X2zqdGFcwWSdnJ81Ds9zk6P8Nko5TdoHeX/dfElRbohtkkwKYCCjY0E+s1GtkeGSxhVoNm7zng9CYJj9qp6Lwduwdq5Mvbr72gbgKBJzzw6rgvrm+OhwManwqSVBnL9DxUj8XB32NDVyXYTNKH4+ZQurtDPrUFhxi7TjVb5PIO8aYCuriEzc3qRMk5CdkS9tGftoZG2tiOIMRhPkzC0pvtm2XF9ujveKC71ayLb06UPWJRwktPih3oVEqUvPKuLHML+7bKt+VD3rsHuoSTu9sspfKUXnpKT+dGcX/7KlMvxauLN3U3ZlN2O4WblsDAlVx2/PNVW5ESp1zcjtjt6H7VPQKo9CmxuRPvVnHV7YZUtz/SXSq67rDqU24QG7EyoPPtV9pfw6BSqAeLXmY9jABods00oo4Co/RLL07PeoJzJXWx3zUzC91ShowHyzubSmxuPLF/9R7XC8i7uzD+UILJwqwntQkK9hRNmgG+NCdZKtlWYk/TvcRTeBjX7GHOVWBSpenBAN9MYDM+zjugqsa5uzB3QLKbaFtDZY6DNAy4GQua03QDd3scHgnYs2W/kl78E3oKloXrjuhMg2AQk421neqgxngC06klm9qwrWwSGVp5IE/QhahTefIb3W9UFw48vV8Q6Hx0uQ7G3jM2zau63fuBG/juUNpdak/ZbPHKdx6QQtLs6bnarInVDKbnsDc/qm3v9oWCHj9js9Ko5ze96JhrqmQ32ebGZF2ui/7LpWrpHbe4SeZYXb+/YOCYPezv8jr3X2ZKILUpWaqEyEGDl/0Fm12yq5vp58e44X5Lszt6kz/W/Ns8cVTebXtJYApGGzI2GNrWYqgB1wRUCTxqsvkLbSXbioIBL1OwicRtDXWxOvbeMVSQjM/YE11bxb4p2DeGgpx8xnJ2XR2rukIPD8ETWsq6wlb+sSrXZgOPegJu/NlAuamiv9OC+092u0Fc5taQ8czYtbGRbKaMSclHZKOCEzdl9yiAJPRwQ64vYRdVG064qyv/yR3hbUy6zaRkGa7efXjvoQcOeTPiChScTOCJOmHJpLpY17kffYKxCM3GbpoJj3lpPw9NdU3lVfd2YjBzQbOeuS5wzEfD1xozNlhVF2Y8+6dCeA5mrxo5QTLXEdJYCfsgk6ug/yKTgLv3hA0h99/cTWBOesLSZk7w2rA1xkUXiC5KYAKEZG+xd7WUW6YWuLNhs0VdLfyzl3D/y74b4Srp3TGBy5tmo7tOmDzaQ1YlMM2MPB0NS2CafMISG83OsKgfi7V9GvjaMRxENhK8Bs8yDaauQ48Oh1vVhH1XoJEt/4nOYN6tK34kG0GTEONvA2E6GPs0Q/sAoD914dLKBqnJUyOk/lRgDjTnpbs7lO8KWZiUTdwzK2GNXhaBAzVlEyBMmNeju0GYlhXxHbF3i61jFFKWumrEr4mHbGFGtWQ3cI2wk92hB/+ge2N39fVxa16s757a6V8fh36GpbyIDQvMBdBZ99Te6clFdmq4qsrtoXos/eQKkXmvcXUHluTEQbXrVsou9H7dVcsr9993Et7KzXU8qq3vmxQ86KTsacPVsy+25mX4x/Lgn9Kgf8zYs3Rbx65ADzfA1IYs4VyKk/bpXu96PjfuO0Gy8ZBzZVPjHS/ju2O4sl111mWdRPuRC3SLHI4+1oBUZoX3BPfp8yFsjoSro3eVGb42lrD3f87C/cvMkNliL2Lszbv86JUwAd2yYHmgZjEr841ZEDbl7qbK6zUmapX2wqPcsrLv7u15ICCplrB7gj135w8uhexG9iRNDj+4L2CT5psqqLxU0IMsq2hEe5dgpPfKHD9oDv1nG70XLQId5iSpJsNdfMpm4jZVGBZ2bdOwUCqvF4zmJ9yBygYFylk6yIhS+ZxQccJm0wBpsvkwK57NHtu3Ny29rgeTrVuhEnbBbWrA91AEzMxM2OhWI4lPXjAFOmHp70bwHJzqB6ZgCjYbPtmTlx7hwT4wXElXCRNZEpbTANKk1bwbroEOcJt3r9lgip8+IcUSG6cqSBTQW7AB8KYKk0ZRHQ/Uu3Uw8J8FfP7BEvh+T8KdTcjT2pfAvD6A11sCTbcs7KHq3XSE0zbjR8B99bTfldstfi4Eenl+nf3cqD2gGQMJrYTfHmyKApHdkBHkd3qb6snu69YFdnLSSytmTW2+H0PGE+B1E97JMp+fgYY+feyM39X1wugCRu8T9jsFTjD/R/4FbywSyAJKlkh0Fayq3df7yif+FSSZMvbA7SowIb8egtS71sb6aVuBSxLuVwFP2QO90BeGIS5+les9fQhffU3ZVCsr1383Hh4IWYrByuKzJKSpNL8L7nlHCS2tQ3hbTqT3dUB4nVl0VyclG7twwU2fDoE5+AkbJGfev4YRE/a0vj/e2Jyo3vvCAkYPBTvODsX+cF0+eKRUAo8Pko1dHO79ya3hnjPrLp1mLGPcXwcgtSHE6fDRdr3uvs2oWVLYVnltbjxd7/L1tc9Hwztekt1r2CoMJ0Be9BXwNqtgp56LMPund+i52BiCE+zdMoMhTjbn6VDd3TUbDeLrBwqGYTP2RO8q6B9JvRwHzuVDYbxRglQMP5yIm7Dem4HO+KJLZ0lOX6dcLLsBwo4LFDK+8l5k4ZvUe5FBQVoplV3Umn1B71Dhh0thLlbGbvioZ+VgpnH3GpFgnQp+E0JAQkJ0uTxy2SUHdZ8TVaJL/OnynVTn+1QXt1fdx0NVRzqp7pkflZ4yiboyXY6T6r5qqjtWQ3fp37pjsTR7cKGoUBhKSHmn4CRdQqG/m4DHFnYt9+T7r8wsvUv4ARD+zhOy7imbDteImRWqv4pDzluyDxH31zTovropJZen0dCZs7OQ6gaK6p4VUN2j8apLg1PdczGqe3FAde81qe5upupeyFfdg5lq2dn+6pRX1l2d7kZexiabmIb1r2jDp8q7WlX3kpUSp2HctVJ1P+jT6O2kumR01SXWaXEatNz+pXc68b7Acrp934VST59kYbf/x+3nLYoIS7h90+xp97ilP37rPd3fPct0fmSgQ8QepfoEOWSlTx87PsVQ2cCgq6j/BKOArlmwd8CdOHmUhaQzu9Q5+V2xNfc57MwuV3mvMjigWPdyrP2sbEgbSjbjtPeJSiDUGaHzm92Tp6qbICo5+ehucHejSnWZVKpbHlX3mrLKToO7K7PofuiWAd0tA7ozoe5I4IxdXZvDdbm2vde7IKJhDCBjd7G2Bkz9wyewUvbQQHx5EzpkTsoku3mmBjhPH91m/aoVJxJ2BKwmYV/xdKl21ZM/2MDUZM85J0lq6MPbtyl7Gd5WQX78ByJI2Eu7TzfXvQuV0MqC3dw2klRuGtwRJexm7Omm+5yIe3cXL4iw5xUbPX66cQ8ZMHXAl5jYE0JTh6FWmCrgN0TZKN/TzfnrKGQ9Ep4cFctTPN2YtxHsJxmZauCSyH5MwlVj/6Nrgf3CRkGbWsz0Z6qAz6ewCTJNFeRnkOC9Js0eQZ5uLLXNAICBXDa59Onm9IgRTX/BJGP2fRRQS5tXtz9u+pAgY6/YmAeurN8yOOTYad9Us+XsCwO+io1ePN2012GZSrzHyPjWGOfRu9MLKXzJLhNOmJl4ME+U5TWfbtqMM6YNXrSf92PtPXq6DrhBYzcwTzftUZmsA27TNHtifroxhzy6OyAxLlnKgLjcBVkzlt94qv1UdZV4Z1NW7Gi67Sb3bwYBw3XXWAfl+ysQvNbM3nw8V0AuRDABiU4F+vurF7tyVzRrZ1Pqj7//+9//Hz/g5fCvpQIA";
\ No newline at end of file
+window.searchData = "data:application/octet-stream;base64,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";
\ No newline at end of file
diff --git a/docs/api/classes/util.Deferred.html b/docs/api/classes/util.Deferred.html
index 74e9896a..f481aade 100644
--- a/docs/api/classes/util.Deferred.html
+++ b/docs/api/classes/util.Deferred.html
@@ -1,4 +1,4 @@
-Deferred | wunderbaum - v0.7.1-0
+Deferred | wunderbaum - v0.8.0
@@ -27,7 +27,7 @@
Hierarchy
+
Defined in src/util.ts:60
+
Defined in src/util.ts:68
Methods
@@ -69,7 +69,7 @@ Parameters
cb : any
Returns void
+
Defined in src/util.ts:95
promise
@@ -104,7 +104,7 @@ Parameters
cb : any
Returns void
+Defined in src/util.ts:102
reject
@@ -117,7 +117,7 @@ Parameters
Optional
error : any
Returns void
+Defined in src/util.ts:79
resolve
@@ -130,7 +130,7 @@ Parameters
Optional
value : any
Returns void
+Defined in src/util.ts:70
then
@@ -143,7 +143,7 @@ Parameters
cb : any
Returns void
+Defined in src/util.ts:88
@@ -29,7 +29,7 @@
Hierarchy
+
Defined in src/util.ts:47
+
Defined in src/util.ts:48
@@ -28,7 +28,7 @@
Hierarchy
+
Defined in src/wb_node.ts:88
Returns WunderbaumNode
+
Defined in src/wb_node.ts:145
Optional
_filter Auto Expanded
_filter Auto Expanded ?: boolean
+
Defined in src/wb_node.ts:140
_is Loading
_is Loading : boolean = false
+
Defined in src/wb_node.ts:129
_partload
_partload : boolean = false
+
Defined in src/wb_node.ts:133
_partsel
_partsel : boolean = false
+
Defined in src/wb_node.ts:132
_request Id
_request Id : number = 0
+
Defined in src/wb_node.ts:130
_row Elem
_row Elem : undefined | HTMLDivElement = undefined
+
Defined in src/wb_node.ts:143
_row Idx
_row Idx : undefined | number = 0
+
Defined in src/wb_node.ts:142
+
Defined in src/wb_node.ts:107
+
Defined in src/wb_node.ts:106
classes
classes : null | Set < string > = null
@@ -247,7 +250,7 @@ classes hasClass , setClass .
+Defined in src/wb_node.ts:124
Optional
colspan
colspan ?: boolean
@@ -255,7 +258,7 @@ Optional
+Defined in src/wb_node.ts:110
data
data : any = {}
@@ -263,7 +266,7 @@ data
+Defined in src/wb_node.ts:126
+Defined in src/wb_node.ts:115
+Defined in src/wb_node.ts:111
Readonly
key
key : string
@@ -288,17 +291,17 @@ Readonly
SeeUse setKey to modify.
+Defined in src/wb_node.ts:100
Optional
lazy
lazy ?: boolean
+Defined in src/wb_node.ts:112
Optional
match
match ?: boolean
+Defined in src/wb_node.ts:135
parent
@@ -306,12 +309,12 @@ parent
+Defined in src/wb_node.ts:94
Optional
radiogroup
radiogroup ?: boolean
+Defined in src/wb_node.ts:108
Readonly
ref Key
ref Key : undefined | string = undefined
@@ -322,7 +325,7 @@ Readonly
SeeUse setKey to modify.
+Defined in src/wb_node.ts:105
+Defined in src/wb_node.ts:118
+Defined in src/wb_node.ts:128
Optional
sub Match Count
sub Match Count ?: number = 0
+Defined in src/wb_node.ts:136
title
title : string
@@ -352,18 +355,18 @@ title setTitle to modify.
+Defined in src/wb_node.ts:97
Optional
Internal
title With Highlight
title With Highlight ?: string
+Defined in src/wb_node.ts:139
Optional
tooltip
tooltip ?: string | boolean
+Defined in src/wb_node.ts:121
tree
@@ -371,22 +374,22 @@ tree
+Defined in src/wb_node.ts:92
Optional
type
type ?: string
+Defined in src/wb_node.ts:120
Optional
unselectable
unselectable ?: boolean
+Defined in src/wb_node.ts:119
Static
sequence
sequence : number = 0
+Defined in src/wb_node.ts:89
+Defined in src/wb_node.ts:2301
_call Event
@@ -435,7 +438,7 @@ Optional
Returns any
+Defined in src/wb_node.ts:247
_fetch With Options
@@ -448,7 +451,7 @@ Parameters
source : any
Returns Promise < any >
+Defined in src/wb_node.ts:1055
+Defined in src/wb_node.ts:1960
_sort Children
Returns void
+Defined in src/wb_node.ts:2608
add Children
@@ -496,7 +499,7 @@ Returns
+Defined in src/wb_node.ts:267
add Node
@@ -522,7 +525,7 @@ Returns
+Defined in src/wb_node.ts:342
+Defined in src/wb_node.ts:372
collapse Siblings
@@ -559,7 +562,7 @@ Optional
Returns any
+Defined in src/wb_node.ts:380
expand All
@@ -577,7 +580,7 @@ Optional
Returns Promise < void >
+Defined in src/wb_node.ts:429
+Defined in src/wb_node.ts:526
+Defined in src/wb_node.ts:539
+Defined in src/wb_node.ts:567
+Defined in src/wb_node.ts:584
fix Selection3 After Click
@@ -672,7 +675,7 @@ Optional
Returns void
+Defined in src/wb_node.ts:2348
fix Selection3 From End Nodes
@@ -691,7 +694,7 @@ Optional
Returns void
+Defined in src/wb_node.ts:2369
+Defined in src/wb_node.ts:638
format_ iter
@@ -736,7 +739,28 @@ Optional
Returns IterableIterator < string >
+Defined in src/wb_node.ts:591
+
get Col Elem
@@ -752,7 +776,7 @@ colIdx : Returns null | HTMLSpanElement
+Defined in src/wb_node.ts:649
+Defined in src/wb_node.ts:676
+Defined in src/wb_node.ts:683
+Defined in src/wb_node.ts:688
+Defined in src/wb_node.ts:700
get Option
@@ -830,7 +854,7 @@ Optional
Returns any
+Defined in src/wb_node.ts:2069
+Defined in src/wb_node.ts:707
+Defined in src/wb_node.ts:716
get Path
@@ -887,7 +911,7 @@ separator : Returns string
+Defined in src/wb_node.ts:732
+Defined in src/wb_node.ts:758
+Defined in src/wb_node.ts:2276
+Defined in src/wb_node.ts:767
has Class
@@ -945,7 +969,7 @@ className : Returns boolean
+Defined in src/wb_node.ts:785
+Defined in src/wb_node.ts:790
+Defined in src/wb_node.ts:797
+Defined in src/wb_node.ts:804
+
+is Clone
+
+is Clone ( ) : boolean
+
+
+Returns boolean
+
+Defined in src/wb_node.ts:816
-
+
+is Editing Title
-is Editing ( ) : boolean
+is Editing Title ( ) : boolean
-
+Defined in src/wb_node.ts:906
+Defined in src/wb_node.ts:911
+Defined in src/wb_node.ts:916
+Defined in src/wb_node.ts:921
+Defined in src/wb_node.ts:926
+Defined in src/wb_node.ts:933
+Defined in src/wb_node.ts:940
+Defined in src/wb_node.ts:947
+Defined in src/wb_node.ts:952
+Defined in src/wb_node.ts:959
+Defined in src/wb_node.ts:967
+Defined in src/wb_node.ts:1101
load Lazy
@@ -1305,7 +1341,7 @@ forceReload : Returns Promise < void >
+Defined in src/wb_node.ts:1185
log
@@ -1321,7 +1357,7 @@ Rest
Returns void
+Defined in src/wb_node.ts:1229
log Debug
@@ -1334,7 +1370,7 @@ Parameters
Rest
... args : any []
Returns void
+Defined in src/wb_node.ts:1234
log Error
@@ -1347,7 +1383,7 @@ Parameters
Rest
... args : any []
Returns void
+Defined in src/wb_node.ts:1241
log Info
@@ -1360,7 +1396,7 @@ Parameters
Rest
... args : any []
Returns void
+Defined in src/wb_node.ts:1248
log Warn
@@ -1373,7 +1409,7 @@ Parameters
Rest
... args : any []
Returns void
+Defined in src/wb_node.ts:1255
make Visible
@@ -1394,7 +1430,7 @@ Optional
Returns Promise < unknown >
+Defined in src/wb_node.ts:1266
move To
@@ -1414,7 +1450,7 @@ Optional
Returns void
+Defined in src/wb_node.ts:1300
+Defined in src/wb_node.ts:1414
+Defined in src/wb_node.ts:1438
+Defined in src/wb_node.ts:1451
+Defined in src/wb_node.ts:1484
+Defined in src/wb_node.ts:1986
+Defined in src/wb_node.ts:2108
set Active
@@ -1524,7 +1560,7 @@ Optional
Returns Promise < void >
+Defined in src/wb_node.ts:2117
set Class
@@ -1547,7 +1583,7 @@ flag : Returns void
+Defined in src/wb_node.ts:396
set Expanded
@@ -1565,7 +1601,7 @@ Optional
Returns Promise < void >
+Defined in src/wb_node.ts:2185
set Focus
@@ -1583,7 +1619,7 @@ Returns voidSee setActive
+Defined in src/wb_node.ts:2234
set Icon
@@ -1599,7 +1635,7 @@ icon : Returns void
+Defined in src/wb_node.ts:2243
set Key
@@ -1617,7 +1653,7 @@ refKey : Returns void
+Defined in src/wb_node.ts:2249
+Defined in src/wb_node.ts:2444
+Defined in src/wb_node.ts:2504
set Title
@@ -1669,7 +1705,7 @@ title : Returns void
+Defined in src/wb_node.ts:2602
sort Children
@@ -1694,7 +1730,18 @@ deep : Returns void
+Defined in src/wb_node.ts:2630
+
+start Edit Title
+
+start Edit Title ( ) : void
+
+
+Returns void
+
+Defined in src/wb_node.ts:2005
+Defined in src/wb_node.ts:190
+Defined in src/wb_node.ts:2290
trigger Modify
@@ -1764,7 +1811,7 @@ Optional
Returns void
+Defined in src/wb_node.ts:2666
trigger Modify Child
@@ -1787,7 +1834,7 @@ Optional
Returns void
+Defined in src/wb_node.ts:2643
+Defined in src/wb_node.ts:2264
+Defined in src/wb_node.ts:2685
visit Parents
@@ -1871,7 +1918,7 @@ includeSelf : Returns boolean
+Defined in src/wb_node.ts:2715
visit Siblings
@@ -1902,7 +1949,7 @@ includeSelf : Returns boolean
+Defined in src/wb_node.ts:2740
@@ -26,7 +26,7 @@
Hierarchy
+
Defined in src/wunderbaum.ts:87
Returns Wunderbaum
+
Defined in src/wunderbaum.ts:170
Properties
@@ -167,7 +169,7 @@ Internal
_cell Nav Mode : boolean = false
+Defined in src/wunderbaum.ts:161
_util
@@ -175,7 +177,7 @@ _util
+Defined in src/wunderbaum.ts:148
Internal
active Col Idx
active Col Idx : number = 0
@@ -183,7 +185,7 @@ Internal
+Defined in src/wunderbaum.ts:159
active Node
@@ -191,12 +193,12 @@ active Node
+Defined in src/wunderbaum.ts:123
+Defined in src/wunderbaum.ts:131
columns
@@ -204,7 +206,7 @@ columns
+Defined in src/wunderbaum.ts:130
Readonly
data
data : { Â Â Â Â [key : string ]: any ; } = {}
@@ -217,7 +219,7 @@ Type declaration
[ key : string ]: any
+Defined in src/wunderbaum.ts:107
Readonly
element
element : HTMLDivElement
@@ -225,12 +227,12 @@ Readonly
+Defined in src/wunderbaum.ts:99
+Defined in src/wunderbaum.ts:155
focus Node
@@ -238,7 +240,7 @@ focus Node
+Defined in src/wunderbaum.ts:125
Readonly
header Element
header Element : HTMLDivElement
@@ -246,17 +248,17 @@ Readonly
+Defined in src/wunderbaum.ts:101
+Defined in src/wunderbaum.ts:132
+Defined in src/wunderbaum.ts:133
Readonly
id
id : string
@@ -264,19 +266,19 @@ Readonly
+Defined in src/wunderbaum.ts:97
Internal
last Quicksearch Term
last Quicksearch Term : string = ""
+Defined in src/wunderbaum.ts:165
Internal
last Quicksearch Time
last Quicksearch Time : number = 0
+Defined in src/wunderbaum.ts:163
Readonly
list Container Element
list Container Element : HTMLDivElement
@@ -284,7 +286,7 @@ Readonly
+Defined in src/wunderbaum.ts:103
log
log : ( ( ... args ) => void ) = ...
@@ -307,7 +309,7 @@ Returns voidAlias Wunderbaum.logDebug
+Defined in src/wunderbaum.ts:1528
Readonly
node List Element
node List Element : HTMLDivElement
@@ -315,7 +317,7 @@ Readonly
+Defined in src/wunderbaum.ts:105
options
@@ -323,7 +325,7 @@ options
+Defined in src/wunderbaum.ts:114
Readonly
ready
ready : Promise < any >
@@ -331,7 +333,7 @@ Readonly
+Defined in src/wunderbaum.ts:144
Readonly
root
@@ -339,12 +341,12 @@ Readonly
+Defined in src/wunderbaum.ts:95
+Defined in src/wunderbaum.ts:134
types
@@ -352,12 +354,12 @@ types
+Defined in src/wunderbaum.ts:128
+Defined in src/wunderbaum.ts:135
Static
util
@@ -365,7 +367,7 @@ Static
+Defined in src/wunderbaum.ts:146
Static
version
version : string = "@VERSION"
@@ -373,7 +375,7 @@ Static
+Defined in src/wunderbaum.ts:92
Accessors
@@ -389,7 +391,7 @@ Returns { [ key : string ]: string
+Defined in src/wunderbaum.ts:558
_call Event
@@ -427,7 +429,7 @@ Optional
Returns any
+Defined in src/wunderbaum.ts:707
_call Method
@@ -448,7 +450,7 @@ Rest
Returns any
+Defined in src/wunderbaum.ts:688
+Defined in src/wunderbaum.ts:1152
+Defined in src/wunderbaum.ts:618
+Defined in src/wunderbaum.ts:637
+Defined in src/wunderbaum.ts:1959
+Defined in src/wunderbaum.ts:800
apply Command
apply Command ( cmd , node , options ? ) : any
+Defined in src/wunderbaum.ts:813
+Defined in src/wunderbaum.ts:945
+Defined in src/wunderbaum.ts:1205
+Defined in src/wunderbaum.ts:1380
format_ iter
@@ -836,7 +868,7 @@ Optional
Returns IterableIterator < string >
+Defined in src/wunderbaum.ts:1353
+Defined in src/wunderbaum.ts:1387
+Defined in src/wunderbaum.ts:1400
+Defined in src/wunderbaum.ts:1407
+Defined in src/wunderbaum.ts:1415
+Defined in src/wunderbaum.ts:751
get Option
@@ -928,7 +960,7 @@ Optional
Returns any
+Defined in src/wunderbaum.ts:1000
+Defined in src/wunderbaum.ts:1102
+Defined in src/wunderbaum.ts:735
+Defined in src/wunderbaum.ts:1047
+Defined in src/wunderbaum.ts:1056
+Defined in src/wunderbaum.ts:1851
is Editing
is Editing ( ) : boolean
+
+Returns boolean
+
+
+is Editing Title
+
+is Editing Title ( ) : boolean
+
Returns boolean
+Defined in src/wunderbaum.ts:1505
+Defined in src/wunderbaum.ts:1841
is Filter Active
is Filter Active ( ) : boolean
-
+Defined in src/wunderbaum.ts:1949
+Defined in src/wunderbaum.ts:1486
+Defined in src/wunderbaum.ts:1094
update
update ( change , node , options ? ) : void
+Defined in src/wunderbaum.ts:1753
+Defined in src/wunderbaum.ts:2330
visit Rows
@@ -1595,7 +1636,7 @@ Returns boolean
+Defined in src/wunderbaum.ts:2345
Static
get Event Info
@@ -1616,7 +1657,7 @@ Returns
+Defined in src/wunderbaum.ts:1425
+Defined in src/wunderbaum.ts:568
@@ -21,7 +21,7 @@
Enumeration ChangeType
+Defined in src/types.ts:435
col Structure
col Structure : "colStructure"
@@ -55,7 +55,7 @@ col Structure
+Defined in src/types.ts:441
data
data : "data"
@@ -63,7 +63,7 @@ data
+Defined in src/types.ts:439
resize
resize : "resize"
@@ -71,7 +71,7 @@ resize
+Defined in src/types.ts:443
row
row : "row"
@@ -79,7 +79,7 @@ row
+Defined in src/types.ts:445
scroll
scroll : "scroll"
@@ -87,7 +87,7 @@ scroll
+Defined in src/types.ts:451
status
status : "status"
@@ -95,7 +95,7 @@ status
+Defined in src/types.ts:449
structure
structure : "structure"
@@ -103,7 +103,7 @@ structure
+Defined in src/types.ts:447
@@ -21,7 +21,7 @@
Enumeration NavModeEnum
+Defined in src/types.ts:483
@@ -40,22 +40,22 @@ Enumeration Members
cell
cell : "cell"
+Defined in src/types.ts:485
+Defined in src/types.ts:487
start Cell
start Cell : "startCell"
+Defined in src/types.ts:486
start Row
start Row : "startRow"
+Defined in src/types.ts:484
@@ -21,7 +21,7 @@
Enumeration NodeRegion
+Defined in src/types.ts:472
@@ -43,37 +43,37 @@ Enumeration Members
checkbox
checkbox : "checkbox"
+Defined in src/types.ts:474
+Defined in src/types.ts:475
expander
expander : "expander"
+Defined in src/types.ts:476
+Defined in src/types.ts:477
+Defined in src/types.ts:478
+Defined in src/types.ts:479
+Defined in src/types.ts:473
@@ -21,7 +21,7 @@
Enumeration NodeStatusType
+Defined in src/types.ts:463
@@ -41,27 +41,27 @@ Enumeration Members
error
error : "error"
+Defined in src/types.ts:466
loading
loading : "loading"
+Defined in src/types.ts:465
+Defined in src/types.ts:467
+Defined in src/types.ts:464
+Defined in src/types.ts:468
@@ -17,7 +17,7 @@
RenderFlag
Enumeration RenderFlag
+
Defined in src/types.ts:455
@@ -36,22 +36,22 @@ Enumeration Members
clear Markup
clear Markup : "clearMarkup"
+Defined in src/types.ts:456
+
Defined in src/types.ts:457
+
Defined in src/types.ts:458
+Defined in src/types.ts:459
@@ -39,7 +39,7 @@
Returns void
+Defined in src/common.ts:294
@@ -30,10 +30,10 @@
Parameters
match : string | RegExp
Returns MatcherCallback
+Defined in src/common.ts:152
@@ -30,7 +30,7 @@
s :
Returns MatcherCallback
+
Defined in src/common.ts:172
@@ -32,7 +32,7 @@
b : Returns number
+
Defined in src/common.ts:181
@@ -51,7 +51,7 @@
options : Returns DebouncedFunction < ( ( ... args ) => void ) >
+
Defined in src/util.ts:804
@@ -32,7 +32,7 @@
msg : Returns void
+
Defined in src/util.ts:111
@@ -36,7 +36,7 @@
Returns voidReturns void
+
Defined in src/util.ts:128
@@ -25,7 +25,7 @@
Function documentReadyPromise
Returns Promise < void >
+Defined in src/util.ts:137
@@ -48,7 +48,7 @@
Returns boolean
Returns any
+
Defined in src/util.ts:151
@@ -35,7 +35,7 @@
html : Returns T
+
Defined in src/util.ts:408
@@ -35,7 +35,7 @@
obj : Returns T | null
+
Defined in src/util.ts:417
@@ -30,7 +30,7 @@
msg : Returns void
+
Defined in src/util.ts:179
@@ -30,7 +30,7 @@
s :
Returns string
+
Defined in src/util.ts:184
@@ -30,7 +30,7 @@
s :
Returns string
+
Defined in src/util.ts:195
@@ -30,7 +30,7 @@
s :
Returns string
+
Defined in src/util.ts:200
@@ -36,7 +36,7 @@
event : Returns string
+
Defined in src/util.ts:464
@@ -31,7 +31,7 @@
Returns any
+Defined in src/util.ts:504
@@ -30,7 +30,7 @@
s :
Returns string
+
Defined in src/util.ts:207
@@ -43,7 +43,7 @@
defaultValue : Returns any
+
Defined in src/util.ts:732
@@ -47,7 +47,7 @@
Returns any
+Defined in src/util.ts:240
@@ -30,7 +30,7 @@
obj : Returns boolean
+
Defined in src/util.ts:520
@@ -30,7 +30,7 @@
obj : Returns boolean
+
Defined in src/util.ts:525
@@ -30,7 +30,7 @@
obj : Returns boolean
+
Defined in src/util.ts:530
@@ -30,7 +30,7 @@
obj : Returns boolean
+
Defined in src/util.ts:535
@@ -30,7 +30,7 @@
Rest
Returns any
+
Defined in src/util.ts:540
@@ -38,7 +38,7 @@
Optional
Returns void
+
Defined in src/util.ts:626
@@ -32,7 +32,7 @@
flag : Returns void
+
Defined in src/util.ts:393
@@ -50,7 +50,7 @@
ms : Returns Promise < T >
+
Defined in src/util.ts:658
@@ -46,7 +46,7 @@
value : Returns void
+
Defined in src/util.ts:326
@@ -36,7 +36,7 @@
ms : Returns Promise < unknown >
+
Defined in src/util.ts:684
@@ -30,7 +30,7 @@
val : Returns Set < string >
+
Defined in src/util.ts:750
@@ -39,7 +39,7 @@
Optional
Returns void
+
Defined in src/util.ts:698
@@ -30,7 +30,7 @@
obj : Returns string
+
Defined in src/util.ts:785
-
wunderbaum - v0.7.1-0
+
wunderbaum - v0.8.0
@@ -25,7 +25,7 @@
Hierarchy
+
Defined in src/types.ts:495
Optional
apply Min Expan Level
apply Min Expan Level ?: boolean
@@ -58,7 +58,7 @@ Default true
Copy
+
Defined in src/types.ts:505
Optional
before
@@ -69,7 +69,7 @@ Default undefinedCopy
+Defined in src/types.ts:499
@@ -28,7 +28,7 @@
Hierarchy
Indexable
[ key: string ]: unknown
+
Defined in src/types.ts:511
@@ -30,7 +30,7 @@
Hierarchy
Indexable
[ key: string ]: unknown
+
Defined in src/types.ts:319
@@ -57,19 +57,19 @@ Optional
_ofs Px ?: number
+
Defined in src/types.ts:351
Optional
Internal
_weight
_weight ?: number
+
Defined in src/types.ts:347
Optional
Internal
_width Px
_width Px ?: number
+
Defined in src/types.ts:349
Optional
classes
classes ?: string
@@ -78,7 +78,7 @@ Optional
+
Defined in src/types.ts:339
Optional
header Classes
header Classes ?: string
@@ -87,7 +87,7 @@ Optional
+
Defined in src/types.ts:343
Optional
html
html ?: string
@@ -95,7 +95,7 @@ Optional
+
Defined in src/types.ts:345
id
id : string
@@ -103,7 +103,7 @@ id
+
Defined in src/types.ts:321
Optional
min Width
min Width ?: string | number
@@ -112,7 +112,7 @@ Optional
+
Defined in src/types.ts:335
title
title : string
@@ -120,7 +120,7 @@ title
+Defined in src/types.ts:323
Optional
tooltip
tooltip ?: string
@@ -128,7 +128,7 @@ Optional
+Defined in src/types.ts:325
Optional
width
width ?: string | number
@@ -139,7 +139,7 @@ Optional
+Defined in src/types.ts:331
@@ -25,7 +25,7 @@
Hierarchy
+
Defined in src/types.ts:361
+
Defined in src/types.ts:367
id
id : string
@@ -55,7 +55,7 @@ id
+
Defined in src/types.ts:363
idx
idx : number
@@ -63,7 +63,7 @@ idx
+Defined in src/types.ts:365
info
@@ -71,7 +71,7 @@ info
+Defined in src/types.ts:369
@@ -25,7 +25,7 @@
Hierarchy
+
Defined in src/types.ts:516
@@ -50,7 +50,7 @@ Default 99
Copy
+
Defined in src/types.ts:518
Optional
force
force ?: boolean
@@ -61,7 +61,7 @@ Default false
Copy
+Defined in src/types.ts:522
Optional
keep Active Node Visible
keep Active Node Visible ?: boolean
@@ -72,7 +72,7 @@ Default true
Copy
+Defined in src/types.ts:524
Optional
load Lazy
load Lazy ?: boolean
@@ -83,7 +83,7 @@ Default false
Copy
+Defined in src/types.ts:520
@@ -25,7 +25,7 @@
Hierarchy
+
Defined in src/types.ts:528
@@ -47,37 +47,37 @@ Properties
Optional
auto Expand
auto Expand ?: boolean
+Defined in src/types.ts:534
Optional
fuzzy
fuzzy ?: boolean
+
Defined in src/types.ts:531
Optional
hide Expanders
hide Expanders ?: boolean
+
Defined in src/types.ts:533
Optional
highlight
highlight ?: boolean
+
Defined in src/types.ts:532
Optional
leaves Only
leaves Only ?: boolean
+
Defined in src/types.ts:530
Optional
mode
mode ?: string
+
Defined in src/types.ts:529
Optional
no Data
no Data ?: boolean
+
Defined in src/types.ts:535
@@ -25,7 +25,7 @@
Hierarchy
+
Defined in src/types.ts:539
@@ -49,7 +49,7 @@ Default false
Copy
+
Defined in src/types.ts:541
Optional
no Events
no Events ?: boolean
@@ -60,7 +60,7 @@ Default false
Copy
+Defined in src/types.ts:545
Optional
scroll Into View
scroll Into View ?: boolean
@@ -71,7 +71,7 @@ Default true
Copy
+Defined in src/types.ts:543
@@ -25,7 +25,7 @@
Hierarchy
+
Defined in src/types.ts:549
@@ -48,7 +48,7 @@ Default true
Copy
+
Defined in src/types.ts:551
Optional
event
event ?: Event
@@ -56,7 +56,7 @@ Optional
+Defined in src/types.ts:553
@@ -32,7 +32,7 @@
Hierarchy
Indexable
[ key: string ]: unknown
+
Defined in src/types.ts:294
Optional
classes
classes ?: string
@@ -63,7 +63,7 @@ Optional
+
Defined in src/types.ts:298
Optional
colspan
colspan ?: boolean
@@ -71,7 +71,7 @@ Optional
+
Defined in src/types.ts:300
Optional
icon
@@ -79,7 +79,7 @@ Optional
+
Defined in src/types.ts:302
Optional
icon Tooltip
icon Tooltip ?: string | boolean
@@ -87,7 +87,7 @@ Optional
+
Defined in src/types.ts:304
@@ -25,7 +25,7 @@
Hierarchy
+
Defined in src/types.ts:557
@@ -53,7 +53,7 @@ Default 'last'
Copy
+
Defined in src/types.ts:561
Optional
change
@@ -64,7 +64,7 @@ Default ChangeTypeCopy
+Defined in src/types.ts:559
Optional
is Data Change
is Data Change ?: boolean
@@ -75,7 +75,7 @@ Default false
Copy
+Defined in src/types.ts:567
Optional
is New
is New ?: boolean
@@ -86,7 +86,7 @@ Default false
Copy
+Defined in src/types.ts:563
Optional
prevent Scroll
prevent Scroll ?: boolean
@@ -97,7 +97,7 @@ Default false
Copy
+Defined in src/types.ts:565
Optional
resize Cols
resize Cols ?: boolean
@@ -108,7 +108,7 @@ Default true
Copy
+Defined in src/types.ts:571
Optional
top
top ?: number
@@ -119,7 +119,7 @@ Default false
Copy
+Defined in src/types.ts:569
@@ -27,7 +27,7 @@
Hierarchy
+
Defined in src/types.ts:575
@@ -52,7 +52,7 @@ Default false
Copy
+
Defined in src/types.ts:577
Optional
no Events
no Events ?: boolean
@@ -63,7 +63,7 @@ Default false
Copy
+Defined in src/types.ts:579
Optional
ofsY
ofsY ?: number
@@ -71,7 +71,7 @@ Optional
+Defined in src/types.ts:583
Optional
top Node
@@ -79,7 +79,7 @@ Optional
+Defined in src/types.ts:581
@@ -27,7 +27,7 @@
Hierarchy
+
Defined in src/types.ts:587
@@ -54,7 +54,7 @@ Default false
+
Defined in src/types.ts:577
Optional
no Events
no Events ?: boolean
@@ -66,7 +66,7 @@ Default false
+Defined in src/types.ts:579
node
@@ -74,7 +74,7 @@ node
+Defined in src/types.ts:589
Optional
ofsY
ofsY ?: number
@@ -83,7 +83,7 @@ Optional
+Defined in src/types.ts:583
Optional
top Node
@@ -92,7 +92,7 @@ Optional
+Defined in src/types.ts:581
@@ -25,7 +25,7 @@
Hierarchy
+
Defined in src/types.ts:593
Optional
edit
edit ?: boolean
@@ -59,7 +59,7 @@ Optional
+
Defined in src/types.ts:613
Optional
event
event ?: Event
@@ -67,7 +67,7 @@ Optional
+
Defined in src/types.ts:605
Optional
focus Tree
focus Tree ?: boolean
@@ -75,7 +75,7 @@ Optional
+
Defined in src/types.ts:603
Optional
no Events
no Events ?: boolean
@@ -83,7 +83,7 @@ Optional
+
Defined in src/types.ts:597
Optional
retrigger
retrigger ?: boolean
@@ -91,7 +91,7 @@ Optional
+
Defined in src/types.ts:595
@@ -25,7 +25,7 @@
Hierarchy
+
Defined in src/types.ts:617
@@ -49,7 +49,7 @@ Default false
Copy
+
Defined in src/types.ts:623
Optional
scroll Into View
scroll Into View ?: boolean
@@ -57,7 +57,7 @@ Optional
+Defined in src/types.ts:625
@@ -17,7 +17,7 @@
SetExpandedOptions
Interface SetExpandedOptions
+
Defined in src/types.ts:631
Optional
immediate
immediate ?: boolean
@@ -62,7 +62,7 @@ Default false
Copy
+Defined in src/types.ts:633
Optional
no Animation
no Animation ?: boolean
@@ -73,7 +73,7 @@ Default false
Copy
+Defined in src/types.ts:635
Optional
no Events
no Events ?: boolean
@@ -84,7 +84,7 @@ Default false
Copy
+Defined in src/types.ts:637
Optional
scroll Into View
scroll Into View ?: boolean
@@ -95,7 +95,7 @@ Default false
Copy
+Defined in src/types.ts:639
@@ -25,7 +25,7 @@
Hierarchy
+
Defined in src/types.ts:651
@@ -50,7 +50,7 @@ Default null
Copy
+
Defined in src/types.ts:661
Optional
force
force ?: boolean
@@ -61,7 +61,7 @@ Default false
Copy
+Defined in src/types.ts:653
Optional
no Events
no Events ?: boolean
@@ -72,7 +72,7 @@ Default false
Copy
+Defined in src/types.ts:655
Optional
propagate Down
propagate Down ?: boolean
@@ -83,7 +83,7 @@ Default false
Copy
+Defined in src/types.ts:657
@@ -25,7 +25,7 @@
Hierarchy
+
Defined in src/types.ts:665
Optional
message
message ?: string
@@ -53,7 +53,7 @@ Optional
+
Defined in src/types.ts:667
@@ -21,7 +21,7 @@
Hierarchy
+
Defined in src/types.ts:27
@@ -40,22 +40,22 @@ Properties
Optional
body
body ?: any
+Defined in src/types.ts:30
Optional
options
options ?: RequestInit
+
Defined in src/types.ts:31
Optional
params
params ?: any
+
Defined in src/types.ts:29
+
Defined in src/types.ts:28
@@ -21,7 +21,7 @@
Hierarchy
+
Defined in src/types.ts:34
@@ -44,7 +44,7 @@ Properties
Optional
_format
_format ?: "flat" | "nested"
+Defined in src/types.ts:35
Optional
_key Map
_key Map ?: { Â Â Â Â [key : string ]: string ; }
@@ -54,12 +54,12 @@ Type declaration
[ key : string ]: string
+
Defined in src/types.ts:40
Optional
_positional
_positional ?: string []
+
Defined in src/types.ts:41
Optional
_value Map
_value Map ?: { Â Â Â Â [key : string ]: string [] ; }
@@ -69,27 +69,27 @@ Type declaration
[ key : string ]: string []
+Defined in src/types.ts:43
Optional
_version
_version ?: number
+Defined in src/types.ts:36
+Defined in src/types.ts:39
+Defined in src/types.ts:38
+Defined in src/types.ts:37
@@ -25,7 +25,7 @@
Hierarchy
+
Defined in src/types.ts:643
@@ -47,7 +47,7 @@ Default false
Copy
+Defined in src/types.ts:645
@@ -25,7 +25,7 @@
Hierarchy
+
Defined in src/types.ts:673
@@ -51,7 +51,7 @@ Default false
Copy
+
Defined in src/types.ts:675
Optional
include Self
include Self ?: boolean
@@ -62,7 +62,7 @@ Default true
Copy
+Defined in src/types.ts:677
Optional
reverse
reverse ?: boolean
@@ -73,7 +73,7 @@ Default false
Copy
+Defined in src/types.ts:679
Optional
start
@@ -84,7 +84,7 @@ Default first Copy
+Defined in src/types.ts:681
Optional
wrap
wrap ?: boolean
@@ -96,7 +96,7 @@ Default false
Copy
+Defined in src/types.ts:684
@@ -23,7 +23,7 @@
Hierarchy
+
Defined in src/types.ts:151
+
Defined in src/types.ts:154
node
@@ -58,12 +58,12 @@ node
+Defined in src/types.ts:143
+Defined in src/types.ts:152
tree
@@ -72,7 +72,7 @@ tree
+Defined in src/types.ts:131
type
type : string
@@ -81,7 +81,7 @@ type
+Defined in src/types.ts:129
+Defined in src/types.ts:148
util
util : any
@@ -103,7 +103,7 @@ util
+Defined in src/types.ts:135
@@ -23,7 +23,7 @@
Hierarchy
+
Defined in src/types.ts:157
info
@@ -59,7 +60,7 @@ info
+
Defined in src/types.ts:159
input Elem
input Elem : HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement
@@ -67,7 +68,15 @@ input Elem
+
Defined in src/types.ts:161
+
+input Valid
+input Valid : boolean
+
+
input Value
input Value : any
@@ -75,7 +84,7 @@ input Value
+
Defined in src/types.ts:163
node
@@ -84,7 +93,7 @@ node
+Defined in src/types.ts:143
tree
@@ -93,7 +102,7 @@ tree
+Defined in src/types.ts:131
type
type : string
@@ -102,7 +111,7 @@ type
+Defined in src/types.ts:129
+Defined in src/types.ts:148
util
util : any
@@ -124,7 +133,7 @@ util
+Defined in src/types.ts:135
@@ -23,7 +23,7 @@
Hierarchy
+
Defined in src/types.ts:168
+
Defined in src/types.ts:170
info
@@ -56,7 +56,7 @@ info
+Defined in src/types.ts:174
node
@@ -64,7 +64,7 @@ node
+Defined in src/types.ts:172
tree
@@ -73,7 +73,7 @@ tree
+Defined in src/types.ts:131
type
type : string
@@ -82,7 +82,7 @@ type
+Defined in src/types.ts:129
util
util : any
@@ -92,7 +92,7 @@ util
+Defined in src/types.ts:135
@@ -23,7 +23,7 @@
Hierarchy
+
Defined in src/types.ts:177
@@ -49,12 +49,12 @@ event
+
Defined in src/types.ts:180
+
Defined in src/types.ts:178
node
@@ -63,7 +63,7 @@ node
+Defined in src/types.ts:143
tree
@@ -72,7 +72,7 @@ tree
+Defined in src/types.ts:131
type
type : string
@@ -81,7 +81,7 @@ type
+Defined in src/types.ts:129
+Defined in src/types.ts:148
util
util : any
@@ -103,7 +103,7 @@ util
+Defined in src/types.ts:135
@@ -23,7 +23,7 @@
Hierarchy
+
Defined in src/types.ts:183
info
@@ -60,7 +61,7 @@ info
+
Defined in src/types.ts:185
input Elem
input Elem : HTMLInputElement
@@ -68,7 +69,15 @@ input Elem
+
Defined in src/types.ts:187
+
+input Valid
+input Valid : boolean
+
+
new Value
new Value : string
@@ -76,7 +85,7 @@ new Value
+
Defined in src/types.ts:191
node
@@ -85,7 +94,7 @@ node
+Defined in src/types.ts:143
old Value
old Value : string
@@ -93,7 +102,7 @@ old Value
+Defined in src/types.ts:189
tree
@@ -102,7 +111,7 @@ tree
+Defined in src/types.ts:131
type
type : string
@@ -111,7 +120,7 @@ type
+Defined in src/types.ts:129
+Defined in src/types.ts:148
util
util : any
@@ -133,7 +142,7 @@ util
+Defined in src/types.ts:135
@@ -23,7 +23,7 @@
Hierarchy
+
Defined in src/types.ts:196
@@ -49,7 +49,7 @@ Optional
+
Defined in src/types.ts:137
input Elem
input Elem : HTMLInputElement
@@ -57,7 +57,7 @@ input Elem
+
Defined in src/types.ts:198
node
@@ -66,7 +66,7 @@ node
+Defined in src/types.ts:143
tree
@@ -75,7 +75,7 @@ tree
+Defined in src/types.ts:131
type
type : string
@@ -84,7 +84,7 @@ type
+Defined in src/types.ts:129
+Defined in src/types.ts:148
util
util : any
@@ -106,7 +106,7 @@ util
+Defined in src/types.ts:135
@@ -23,7 +23,7 @@
Hierarchy
+
Defined in src/types.ts:205
Optional
event
event ?: Event
@@ -54,7 +54,7 @@ Optional
+
Defined in src/types.ts:137
node
@@ -63,7 +63,7 @@ node
+Defined in src/types.ts:143
tree
@@ -72,7 +72,7 @@ tree
+Defined in src/types.ts:131
type
type : string
@@ -81,7 +81,7 @@ type
+Defined in src/types.ts:129
+Defined in src/types.ts:148
util
util : any
@@ -103,7 +103,7 @@ util
+Defined in src/types.ts:135
@@ -27,7 +27,7 @@
Hierarchy
+
Defined in src/types.ts:378
+
Defined in src/types.ts:384
Optional
col Def
@@ -65,7 +65,7 @@ Optional
+
Defined in src/types.ts:392
Optional
col Elem
col Elem ?: HTMLSpanElement
@@ -73,7 +73,7 @@ Optional
+
Defined in src/types.ts:398
Optional
col Id
col Id ?: string
@@ -81,7 +81,7 @@ Optional
+
Defined in src/types.ts:396
col Idx
col Idx : number
@@ -89,7 +89,7 @@ col Idx
+
Defined in src/types.ts:394
event
event : MouseEvent | KeyboardEvent
@@ -97,7 +97,7 @@ event
+Defined in src/types.ts:380
node
@@ -105,7 +105,7 @@ node
+Defined in src/types.ts:388
region
@@ -113,7 +113,7 @@ region
+Defined in src/types.ts:390
tree
@@ -121,7 +121,7 @@ tree
+Defined in src/types.ts:386
@@ -23,7 +23,7 @@
Hierarchy
+
Defined in src/types.ts:212
+
Defined in src/types.ts:214
flag
flag : boolean
@@ -55,7 +55,7 @@ flag
+Defined in src/types.ts:216
tree
@@ -64,7 +64,7 @@ tree
+Defined in src/types.ts:131
type
type : string
@@ -73,7 +73,7 @@ type
+Defined in src/types.ts:129
util
util : any
@@ -83,7 +83,7 @@ util
+Defined in src/types.ts:135
@@ -21,7 +21,7 @@
Hierarchy
WbIconBadgeEventResultType
+
Defined in src/types.ts:222
+
Defined in src/types.ts:224
Optional
badge Class
badge Class ?: string
@@ -50,7 +50,7 @@ Optional
+
Defined in src/types.ts:226
Optional
badge Tooltip
badge Tooltip ?: string
@@ -58,7 +58,7 @@ Optional
+Defined in src/types.ts:228
@@ -23,7 +23,7 @@
Hierarchy
+
Defined in src/types.ts:219
@@ -49,12 +49,12 @@ Optional
+
Defined in src/types.ts:137
icon Span
icon Span : HTMLElement
+
Defined in src/types.ts:220
node
@@ -63,7 +63,7 @@ node
+Defined in src/types.ts:143
tree
@@ -72,7 +72,7 @@ tree
+Defined in src/types.ts:131
type
type : string
@@ -81,7 +81,7 @@ type
+Defined in src/types.ts:129
+Defined in src/types.ts:148
util
util : any
@@ -103,7 +103,7 @@ util
+Defined in src/types.ts:135
@@ -23,7 +23,7 @@
Hierarchy
+
Defined in src/types.ts:231
@@ -43,7 +43,7 @@ Properties
Optional
error
error ?: any
+Defined in src/types.ts:232
Optional
event
event ?: Event
@@ -52,7 +52,7 @@ Optional
+
Defined in src/types.ts:137
tree
@@ -61,7 +61,7 @@ tree
+Defined in src/types.ts:131
type
type : string
@@ -70,7 +70,7 @@ type
+Defined in src/types.ts:129
util
util : any
@@ -80,7 +80,7 @@ util
+Defined in src/types.ts:135
@@ -23,7 +23,7 @@
Hierarchy
+
Defined in src/types.ts:235
+
Defined in src/types.ts:237
info
@@ -56,12 +56,12 @@ info
+Defined in src/types.ts:240
+Defined in src/types.ts:238
tree
@@ -70,7 +70,7 @@ tree
+Defined in src/types.ts:131
type
type : string
@@ -79,7 +79,7 @@ type
+Defined in src/types.ts:129
util
util : any
@@ -89,7 +89,7 @@ util
+Defined in src/types.ts:135
@@ -28,7 +28,7 @@
Hierarchy
Indexable
[ key: string ]: unknown
+
Defined in src/types.ts:98
@@ -62,52 +62,52 @@ Optional
_tree Id ?: string
+
Defined in src/types.ts:118
+
Defined in src/types.ts:99
+
Defined in src/types.ts:100
Optional
classes
classes ?: string
+
Defined in src/types.ts:101
Optional
colspan
colspan ?: boolean
+
Defined in src/types.ts:102
Optional
expanded
expanded ?: boolean
+
Defined in src/types.ts:103
+
Defined in src/types.ts:104
Optional
icon Tooltip
icon Tooltip ?: string | boolean
+
Defined in src/types.ts:105
Optional
key
key ?: string
+
Defined in src/types.ts:106
Optional
lazy
lazy ?: boolean
+
Defined in src/types.ts:107
Optional
radiogroup
radiogroup ?: boolean
@@ -115,42 +115,42 @@ Optional
+
Defined in src/types.ts:109
Optional
ref Key
ref Key ?: string
+
Defined in src/types.ts:110
Optional
selected
selected ?: boolean
+
Defined in src/types.ts:111
+
Defined in src/types.ts:112
+
Defined in src/types.ts:113
Optional
tooltip
tooltip ?: string | boolean
+
Defined in src/types.ts:114
Optional
type
type ?: string
+
Defined in src/types.ts:115
Optional
unselectable
unselectable ?: boolean
+Defined in src/types.ts:116
+
Defined in src/types.ts:137
node
@@ -67,7 +68,7 @@ node
+Defined in src/types.ts:143
tree
@@ -76,7 +77,7 @@ tree
+Defined in src/types.ts:131
type
type : string
@@ -85,7 +86,7 @@ type
+Defined in src/types.ts:129
+Defined in src/types.ts:148
util
util : any
@@ -106,7 +107,7 @@ util
+Defined in src/types.ts:135
@@ -23,7 +23,7 @@
Hierarchy
+
Defined in src/types.ts:243
@@ -49,7 +49,7 @@ Optional
+
Defined in src/types.ts:137
node
@@ -58,12 +58,12 @@ node
+Defined in src/types.ts:143
+Defined in src/types.ts:244
tree
@@ -72,7 +72,7 @@ tree
+Defined in src/types.ts:131
type
type : string
@@ -81,7 +81,7 @@ type
+Defined in src/types.ts:129
+Defined in src/types.ts:148
util
util : any
@@ -103,7 +103,7 @@ util
+Defined in src/types.ts:135
@@ -23,7 +23,7 @@
Hierarchy
+
Defined in src/types.ts:250
@@ -54,7 +54,7 @@ all Col Infos By Id
+
Defined in src/types.ts:268
Optional
event
event ?: Event
@@ -63,7 +63,7 @@ Optional
+Defined in src/types.ts:137
is Colspan
is Colspan : boolean
@@ -71,7 +71,7 @@ is Colspan
+Defined in src/types.ts:262
is New
is New : boolean
@@ -83,7 +83,7 @@ is New
+Defined in src/types.ts:258
node
@@ -92,7 +92,7 @@ node
+Defined in src/types.ts:143
node Elem
node Elem : HTMLSpanElement
@@ -100,7 +100,7 @@ node Elem
+Defined in src/types.ts:260
render Col Infos By Id
@@ -114,7 +114,7 @@ render Col Infos By Id
+Defined in src/types.ts:285
tree
@@ -123,7 +123,7 @@ tree
+Defined in src/types.ts:131
type
type : string
@@ -132,7 +132,7 @@ type
+Defined in src/types.ts:129
+Defined in src/types.ts:148
util
util : any
@@ -154,7 +154,7 @@ util
+Defined in src/types.ts:135
@@ -23,7 +23,7 @@
Hierarchy
+
Defined in src/types.ts:246
@@ -49,12 +49,12 @@ Optional
+
Defined in src/types.ts:137
+
Defined in src/types.ts:247
node
@@ -63,7 +63,7 @@ node
+Defined in src/types.ts:143
tree
@@ -72,7 +72,7 @@ tree
+Defined in src/types.ts:131
type
type : string
@@ -81,7 +81,7 @@ type
+Defined in src/types.ts:129
+Defined in src/types.ts:148
util
util : any
@@ -103,7 +103,7 @@ util
+Defined in src/types.ts:135
@@ -27,7 +27,7 @@
Hierarchy
WbInitEventType
WbKeydownEventType
+
Defined in src/types.ts:127
tree
@@ -57,7 +57,7 @@ tree
+
Defined in src/types.ts:131
type
type : string
@@ -65,7 +65,7 @@ type
+Defined in src/types.ts:129
util
util : any
@@ -74,7 +74,7 @@ util
+Defined in src/types.ts:135
@@ -31,7 +31,7 @@
Hierarchy
+
Defined in src/wb_options.ts:63
+
Defined in src/wb_options.ts:244
Optional
before Activate
before Activate ?: ( ( e ) => void )
@@ -136,7 +136,7 @@ e : Returns void
+Defined in src/wb_options.ts:250
Optional
change
change ?: ( ( e ) => void )
@@ -155,7 +155,7 @@ e : Returns void
+Defined in src/wb_options.ts:255
Optional
click
click ?: ( ( e ) => void )
@@ -176,7 +176,7 @@ e : Returns void
+Defined in src/wb_options.ts:261
Optional
dblclick
dblclick ?: ( ( e ) => void )
@@ -195,7 +195,7 @@ e : Returns void
+Defined in src/wb_options.ts:266
Optional
deactivate
deactivate ?: ( ( e ) => void )
@@ -217,7 +217,7 @@ e : Returns void
+Defined in src/wb_options.ts:273
Optional
discard
discard ?: ( ( e ) => void )
@@ -236,7 +236,7 @@ e : Returns void
+Defined in src/wb_options.ts:278
Optional
error
error ?: ( ( e ) => void )
@@ -255,7 +255,7 @@ e : Returns void
+Defined in src/wb_options.ts:293
Optional
focus
focus ?: ( ( e ) => void )
@@ -276,13 +276,13 @@ e : Returns void
+Defined in src/wb_options.ts:299
+Defined in src/wb_options.ts:283
Optional
init
init ?: ( ( e ) => void )
@@ -306,7 +306,7 @@ e : Returns void
+Defined in src/wb_options.ts:307
Optional
keydown
keydown ?: ( ( e ) => void )
@@ -325,7 +325,7 @@ e : Returns void
+Defined in src/wb_options.ts:312
Optional
lazy Load
lazy Load ?: ( ( e ) => void )
@@ -348,7 +348,7 @@ e : Returns void
+Defined in src/wb_options.ts:319
Optional
load
load ?: ( ( e ) => void )
@@ -370,7 +370,7 @@ e : Returns void
+Defined in src/wb_options.ts:325
Optional
modify Child
modify Child ?: ( ( e ) => void )
@@ -389,7 +389,7 @@ e : Returns void
+Defined in src/wb_options.ts:329
Optional
receive
receive ?: ( ( e ) => void )
@@ -413,7 +413,7 @@ e : Returns void
+Defined in src/wb_options.ts:337
Optional
render
render ?: ( ( e ) => void )
@@ -438,7 +438,7 @@ e : Returns void
+Defined in src/wb_options.ts:346
Optional
render Status Node
render Status Node ?: ( ( e ) => void )
@@ -457,7 +457,7 @@ e : Returns void
+Defined in src/wb_options.ts:351
Optional
select
select ?: ( ( e ) => void )
@@ -478,7 +478,7 @@ e : Returns void
+Defined in src/wb_options.ts:357
Optional
update
update ?: ( ( e ) => void )
@@ -499,7 +499,7 @@ e : Returns void
+Defined in src/wb_options.ts:362
Optional
auto Collapse
auto Collapse ?: boolean
@@ -526,7 +526,7 @@ Optional
+Defined in src/wb_options.ts:149
Optional
checkbox
@@ -536,7 +536,7 @@ Optional
+Defined in src/wb_options.ts:190
Optional
columns
@@ -548,7 +548,7 @@ Optional
+Defined in src/wb_options.ts:98
Optional
connect Top Breadcrumb
connect Top Breadcrumb ?: HTMLElement
@@ -557,7 +557,7 @@ Optional
+Defined in src/wb_options.ts:168
Optional
debug Level
debug Level ?: number
@@ -566,17 +566,17 @@ Optional
+Defined in src/wb_options.ts:114
+Defined in src/wb_options.ts:233
+Defined in src/wb_options.ts:234
element
element : string | HTMLDivElement
@@ -584,7 +584,7 @@ element
+Defined in src/wb_options.ts:67
Optional
empty Child List Expandable
empty Child List Expandable ?: boolean
@@ -594,7 +594,7 @@ Optional
+Defined in src/wb_options.ts:126
Optional
enabled
enabled ?: boolean
@@ -602,12 +602,12 @@ Optional
+Defined in src/wb_options.ts:208
+Defined in src/wb_options.ts:235
Optional
fixed Col
fixed Col ?: boolean
@@ -615,12 +615,12 @@ Optional
+Defined in src/wb_options.ts:212
+Defined in src/wb_options.ts:236
Optional
header
header ?: null | string | boolean
@@ -632,7 +632,7 @@ Optional
+Defined in src/wb_options.ts:180
Optional
icon
@@ -640,7 +640,7 @@ Optional
+Defined in src/wb_options.ts:192
Optional
icon Map
icon Map ?: string | { Â Â Â Â [key : string ]: string ; }
@@ -656,7 +656,7 @@ Type declaration
[ key : string ]: string
+Defined in src/wb_options.ts:144
Optional
icon Tooltip
@@ -664,7 +664,7 @@ Optional
+Defined in src/wb_options.ts:194
Optional
id
id ?: string
@@ -674,7 +674,7 @@ Optional
+Defined in src/wb_options.ts:74
Optional
min Expand Level
min Expand Level ?: number
@@ -684,7 +684,7 @@ Optional
+Defined in src/wb_options.ts:120
Optional
navigation Mode Option
@@ -692,7 +692,7 @@ Optional
+Defined in src/wb_options.ts:172
Optional
quicksearch
quicksearch ?: boolean
@@ -700,7 +700,7 @@ Optional
+Defined in src/wb_options.ts:224
Optional
row Height Px
row Height Px ?: number
@@ -709,7 +709,7 @@ Optional
+Defined in src/wb_options.ts:137
Optional
scroll Into View On Expand Click
scroll Into View On Expand Click ?: boolean
@@ -720,7 +720,7 @@ Default true
Copy
+Defined in src/wb_options.ts:230
Optional
select Mode
@@ -728,13 +728,13 @@ Optional
+Defined in src/wb_options.ts:218
Optional
show Spinner
show Spinner ?: boolean
+Defined in src/wb_options.ts:184
Optional
skeleton
skeleton ?: boolean
@@ -745,7 +745,7 @@ Optional
+Defined in src/wb_options.ts:105
Optional
source
@@ -756,7 +756,7 @@ Optional
+Defined in src/wb_options.ts:82
Optional
strings
strings ?: any
@@ -764,7 +764,7 @@ Optional
+Defined in src/wb_options.ts:109
Optional
tooltip
@@ -773,7 +773,7 @@ Optional
+Defined in src/wb_options.ts:198
Optional
types
@@ -784,7 +784,7 @@ Optional
+Defined in src/wb_options.ts:90
Optional
unselectable
@@ -792,7 +792,7 @@ Optional
+Defined in src/wb_options.ts:200
@@ -16,7 +16,7 @@
common
Module common
+
Defined in src/common.ts:1
Index
@@ -56,7 +56,7 @@ Member Visibility
@@ -16,7 +16,7 @@
types
Module types
+
Defined in src/types.ts:1
@@ -16,29 +16,25 @@
util
Module util
+
Defined in src/util.ts:1
@@ -16,7 +16,7 @@
wb_node
Module wb_node
+
Defined in src/wb_node.ts:1
Index
@@ -38,7 +38,7 @@ Member Visibility
@@ -16,7 +16,7 @@
wb_options
Module wb_options
+
Defined in src/wb_options.ts:1
Index
@@ -38,7 +38,7 @@ Member Visibility
@@ -16,7 +16,7 @@
wunderbaum
Module wunderbaum
+
Defined in src/wunderbaum.ts:1
Index
@@ -38,7 +38,7 @@ Member Visibility
@@ -18,7 +18,7 @@
Type alias ApplyCommandType
Apply Command Type : "addChild" | "addSibling" | "copy" | "cut" | "down" | "first" | "indent" | "last" | "left" | "moveDown" | "moveUp" | "outdent" | "pageDown" | "pageUp" | "parent" | "paste" | "remove" | "rename" | "right" | "up"
+Defined in src/types.ts:407
@@ -34,7 +34,7 @@
node : Returns boolean
+Defined in src/types.ts:62
@@ -34,7 +34,7 @@
node : Returns boolean | string
+Defined in src/types.ts:64
@@ -21,7 +21,7 @@
Type alias CheckboxOption
+Defined in src/types.ts:14
@@ -18,7 +18,7 @@
Type alias ColumnDefinitionList
+Defined in src/types.ts:356
@@ -23,7 +23,7 @@
Type declaration
[ colId : string ]: ColumnEventInfo
+Defined in src/types.ts:372
@@ -220,7 +220,7 @@
Default null
Copy
+Defined in src/types.ts:857
@@ -18,7 +18,7 @@
Type alias DropEffectAllowedType
Drop Effect Allowed Type : "none" | "copy" | "copyLink" | "copyMove" | "link" | "linkMove" | "move" | "all"
+Defined in src/types.ts:834
@@ -18,7 +18,7 @@
Type alias DropEffectType
Drop Effect Type : "none" | "copy" | "link" | "move"
+Defined in src/types.ts:833
@@ -18,7 +18,7 @@
Type alias DropRegionType
Drop Region Type : "over" | "before" | "after"
+Defined in src/types.ts:844
@@ -18,7 +18,7 @@
Type alias DropRegionTypeSet
+Defined in src/types.ts:845
@@ -22,7 +22,7 @@
Type alias DynamicBoolOption
+Defined in src/types.ts:87
@@ -18,7 +18,7 @@
Type alias DynamicBoolOrStringOption
+Defined in src/types.ts:89
@@ -18,7 +18,7 @@
Type alias DynamicCheckboxOption
+Defined in src/types.ts:93
@@ -18,7 +18,7 @@
Type alias DynamicIconOption
+Defined in src/types.ts:94
@@ -18,7 +18,7 @@
Type alias DynamicStringOption
+Defined in src/types.ts:88
@@ -107,7 +107,7 @@
Default true
+Defined in src/types.ts:752
@@ -18,7 +18,7 @@
Type alias FilterModeType
Filter Mode Type : null | "dim" | "hide"
+Defined in src/types.ts:405
@@ -16,7 +16,7 @@
types
FilterOptionsType
Type alias FilterOptionsType
-
Filter Options Type : { Â Â Â Â autoApply ?: boolean ; Â Â Â Â autoExpand ?: boolean ; Â Â Â Â connectInput ?: null | string | Element ; Â Â Â Â counter ?: boolean ; Â Â Â Â fuzzy ?: boolean ; Â Â Â Â hideExpandedCounter ?: boolean ; Â Â Â Â hideExpanders ?: boolean ; Â Â Â Â highlight ?: boolean ; Â Â Â Â leavesOnly ?: boolean ; Â Â Â Â mode ?: "dim" | "hide" ; Â Â Â Â noData ?: boolean ; }
+
Filter Options Type : { Â Â Â Â autoApply ?: boolean ; Â Â Â Â autoExpand ?: boolean ; Â Â Â Â connectInput ?: null | string | Element ; Â Â Â Â counter ?: boolean ; Â Â Â Â fuzzy ?: boolean ; Â Â Â Â hideExpandedCounter ?: boolean ; Â Â Â Â hideExpanders ?: boolean ; Â Â Â Â highlight ?: boolean ; Â Â Â Â leavesOnly ?: boolean ; Â Â Â Â mode ?: FilterModeType ; Â Â Â Â noData ?: boolean | string ; }
Type declaration
@@ -93,7 +93,7 @@ Default false
Copy
-Optional
mode ?: "dim" | "hide"
+Optional
mode ?: FilterModeType
-Optional
no Data ?: boolean
-
+Defined in src/types.ts:687
@@ -18,7 +18,7 @@
Type alias GridOptionsType
Grid Options Type : object
+Defined in src/types.ts:820
@@ -26,7 +26,7 @@
Type alias IconOption
+Defined in src/types.ts:22
@@ -18,7 +18,7 @@
Type alias InsertNodeType
Insert Node Type : "before" | "after" | "prependChild" | "appendChild"
+Defined in src/types.ts:826
@@ -34,7 +34,7 @@
node : Returns boolean
+Defined in src/types.ts:54
@@ -34,7 +34,7 @@
node : Returns any
+Defined in src/types.ts:68
@@ -31,7 +31,7 @@
Parameters
node : WunderbaumNode
Returns NodeFilterResponse
+Defined in src/types.ts:430
@@ -18,7 +18,7 @@
Type alias NodeFilterResponse
Node Filter Response : "skip" | "branch" | boolean | void
+Defined in src/types.ts:429
@@ -34,7 +34,7 @@
node : Returns boolean | void
+Defined in src/types.ts:81
@@ -34,7 +34,7 @@
node : Returns string
+Defined in src/types.ts:70
@@ -36,7 +36,7 @@
node : Returns NodeVisitResponse
+Defined in src/types.ts:76
@@ -23,7 +23,7 @@
Type declaration
[ type : string ]: NodeTypeDefinition
+Defined in src/types.ts:313
@@ -34,7 +34,7 @@
node : Returns NodeVisitResponse
+Defined in src/types.ts:72
@@ -21,7 +21,7 @@
Type alias NodeVisitResponse
+Defined in src/types.ts:74
@@ -18,7 +18,7 @@
Type alias SelectModeType
Select Mode Type : "single" | "multi" | "hier"
+Defined in src/types.ts:406
@@ -36,7 +36,7 @@
b : Returns number
+Defined in src/types.ts:60
@@ -18,7 +18,7 @@
Type alias SourceListType
+Defined in src/types.ts:33
@@ -21,7 +21,7 @@
Type alias SourceType
+Defined in src/types.ts:47
@@ -21,7 +21,7 @@
Type alias TristateType
+Defined in src/types.ts:12
+Defined in src/types.ts:56
@@ -31,7 +31,7 @@
Parameters
e : Event
Returns boolean | void
+Defined in src/util.ts:40
@@ -31,7 +31,7 @@
Parameters
Rest
... args : any []
Returns any
+Defined in src/util.ts:39
@@ -18,7 +18,7 @@
Variable DEFAULT_DEBUGLEVELConst
DEFAULT_ DEBUGLEVEL : 4 = 4
+Defined in src/common.ts:11
@@ -21,7 +21,7 @@
Variable ICON_WIDTHConst
+
Defined in src/common.ts:19
@@ -27,7 +27,7 @@
Type declaration
[ key : string ]: string []
+Defined in src/common.ts:91
@@ -18,7 +18,7 @@
Variable KEY_NODATAConst
KEY_ NODATA : "__not_found__" = "__not_found__"
+Defined in src/common.ts:86
@@ -26,7 +26,7 @@
Type declaration
[ key : string ]: string
+Defined in src/common.ts:123
@@ -21,7 +21,7 @@
Variable RENDER_MAX_PREFETCHConst
+Defined in src/common.ts:26
@@ -21,7 +21,7 @@
Variable RENDER_MIN_PREFETCHConst
+Defined in src/common.ts:28
@@ -21,7 +21,7 @@
Variable RESERVED_TREE_SOURCE_KEYSConst
+Defined in src/common.ts:102
@@ -21,7 +21,7 @@
Variable ROW_HEIGHTConst
+
Defined in src/common.ts:15
@@ -22,7 +22,7 @@
Variable TEST_IMGConst
+Defined in src/common.ts:32
@@ -22,7 +22,7 @@
Variable TITLE_SPAN_PAD_YConst
+
Defined in src/common.ts:24
@@ -30,7 +30,7 @@
[
[ key : string ]: string
+Defined in src/common.ts:40
@@ -18,7 +18,7 @@
Variable MAX_INTConst
MAX_ INT : 9007199254740991 = 9007199254740991
+Defined in src/util.ts:23
@@ -26,7 +26,7 @@
Type declaration
[ key : number ]: string
+Defined in src/util.ts:14
@@ -21,7 +21,7 @@
Variable isMacConst
+Defined in src/util.ts:26
Return all nodes with the same refKey.
+