@angular/cdk 19.0.0-next.1 → 19.0.0-next.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/a11y/index.d.ts +5 -1
- package/fesm2022/a11y.mjs +21 -11
- package/fesm2022/a11y.mjs.map +1 -1
- package/fesm2022/cdk.mjs +1 -1
- package/fesm2022/cdk.mjs.map +1 -1
- package/fesm2022/drag-drop.mjs +2 -1
- package/fesm2022/drag-drop.mjs.map +1 -1
- package/fesm2022/overlay.mjs +20 -1
- package/fesm2022/overlay.mjs.map +1 -1
- package/fesm2022/private.mjs +9 -7
- package/fesm2022/private.mjs.map +1 -1
- package/fesm2022/text-field.mjs +17 -2
- package/fesm2022/text-field.mjs.map +1 -1
- package/fesm2022/tree.mjs +13 -7
- package/fesm2022/tree.mjs.map +1 -1
- package/overlay/_index.scss +15 -13
- package/overlay/index.d.ts +5 -0
- package/overlay-prebuilt.css +1 -1
- package/package.json +1 -57
- package/private/index.d.ts +1 -0
- package/schematics/ng-add/index.js +1 -1
- package/schematics/ng-add/index.mjs +1 -1
- package/text-field/index.d.ts +1 -0
- package/tree/index.d.ts +3 -1
- package/esm2022/a11y/a11y-module.mjs +0 -31
- package/esm2022/a11y/a11y_public_index.mjs +0 -5
- package/esm2022/a11y/aria-describer/aria-describer.mjs +0 -232
- package/esm2022/a11y/aria-describer/aria-reference.mjs +0 -47
- package/esm2022/a11y/fake-event-detection.mjs +0 -29
- package/esm2022/a11y/focus-monitor/focus-monitor.mjs +0 -468
- package/esm2022/a11y/focus-trap/configurable-focus-trap-config.mjs +0 -9
- package/esm2022/a11y/focus-trap/configurable-focus-trap-factory.mjs +0 -54
- package/esm2022/a11y/focus-trap/configurable-focus-trap.mjs +0 -51
- package/esm2022/a11y/focus-trap/event-listener-inert-strategy.mjs +0 -61
- package/esm2022/a11y/focus-trap/focus-trap-inert-strategy.mjs +0 -11
- package/esm2022/a11y/focus-trap/focus-trap-manager.mjs +0 -53
- package/esm2022/a11y/focus-trap/focus-trap.mjs +0 -396
- package/esm2022/a11y/high-contrast-mode/high-contrast-mode-detector.mjs +0 -116
- package/esm2022/a11y/index.mjs +0 -9
- package/esm2022/a11y/input-modality/input-modality-detector.mjs +0 -176
- package/esm2022/a11y/interactivity-checker/interactivity-checker.mjs +0 -238
- package/esm2022/a11y/key-manager/activedescendant-key-manager.mjs +0 -20
- package/esm2022/a11y/key-manager/focus-key-manager.mjs +0 -29
- package/esm2022/a11y/key-manager/list-key-manager.mjs +0 -357
- package/esm2022/a11y/key-manager/noop-tree-key-manager.mjs +0 -94
- package/esm2022/a11y/key-manager/tree-key-manager-strategy.mjs +0 -9
- package/esm2022/a11y/key-manager/tree-key-manager.mjs +0 -345
- package/esm2022/a11y/key-manager/typeahead.mjs +0 -91
- package/esm2022/a11y/live-announcer/live-announcer-tokens.mjs +0 -19
- package/esm2022/a11y/live-announcer/live-announcer.mjs +0 -210
- package/esm2022/a11y/public-api.mjs +0 -30
- package/esm2022/accordion/accordion-item.mjs +0 -162
- package/esm2022/accordion/accordion-module.mjs +0 -24
- package/esm2022/accordion/accordion.mjs +0 -65
- package/esm2022/accordion/accordion_public_index.mjs +0 -5
- package/esm2022/accordion/index.mjs +0 -9
- package/esm2022/accordion/public-api.mjs +0 -11
- package/esm2022/bidi/bidi-module.mjs +0 -23
- package/esm2022/bidi/bidi_public_index.mjs +0 -5
- package/esm2022/bidi/dir-document-token.mjs +0 -33
- package/esm2022/bidi/dir.mjs +0 -70
- package/esm2022/bidi/directionality.mjs +0 -52
- package/esm2022/bidi/index.mjs +0 -9
- package/esm2022/bidi/public-api.mjs +0 -12
- package/esm2022/clipboard/clipboard-module.mjs +0 -23
- package/esm2022/clipboard/clipboard.mjs +0 -53
- package/esm2022/clipboard/clipboard_public_index.mjs +0 -5
- package/esm2022/clipboard/copy-to-clipboard.mjs +0 -100
- package/esm2022/clipboard/index.mjs +0 -9
- package/esm2022/clipboard/pending-copy.mjs +0 -71
- package/esm2022/clipboard/public-api.mjs +0 -12
- package/esm2022/coercion/array.mjs +0 -11
- package/esm2022/coercion/boolean-property.mjs +0 -12
- package/esm2022/coercion/css-pixel-value.mjs +0 -15
- package/esm2022/coercion/element.mjs +0 -16
- package/esm2022/coercion/index.mjs +0 -9
- package/esm2022/coercion/number-property.mjs +0 -24
- package/esm2022/coercion/private/index.mjs +0 -9
- package/esm2022/coercion/private/observable.mjs +0 -19
- package/esm2022/coercion/private/private_public_index.mjs +0 -5
- package/esm2022/coercion/public-api.mjs +0 -14
- package/esm2022/coercion/string-array.mjs +0 -38
- package/esm2022/collections/array-data-source.mjs +0 -21
- package/esm2022/collections/collection-viewer.mjs +0 -9
- package/esm2022/collections/collections_public_index.mjs +0 -5
- package/esm2022/collections/data-source.mjs +0 -19
- package/esm2022/collections/dispose-view-repeater-strategy.mjs +0 -48
- package/esm2022/collections/index.mjs +0 -9
- package/esm2022/collections/public-api.mjs +0 -17
- package/esm2022/collections/recycle-view-repeater-strategy.mjs +0 -129
- package/esm2022/collections/selection-model.mjs +0 -225
- package/esm2022/collections/tree-adapter.mjs +0 -9
- package/esm2022/collections/unique-selection-dispatcher.mjs +0 -55
- package/esm2022/collections/view-repeater.mjs +0 -26
- package/esm2022/dialog/dialog-config.mjs +0 -70
- package/esm2022/dialog/dialog-container.mjs +0 -308
- package/esm2022/dialog/dialog-injectors.mjs +0 -40
- package/esm2022/dialog/dialog-module.mjs +0 -40
- package/esm2022/dialog/dialog-ref.mjs +0 -85
- package/esm2022/dialog/dialog.mjs +0 -303
- package/esm2022/dialog/dialog_public_index.mjs +0 -5
- package/esm2022/dialog/index.mjs +0 -9
- package/esm2022/dialog/public-api.mjs +0 -14
- package/esm2022/drag-drop/directives/assertions.mjs +0 -18
- package/esm2022/drag-drop/directives/config.mjs +0 -14
- package/esm2022/drag-drop/directives/drag-handle.mjs +0 -68
- package/esm2022/drag-drop/directives/drag-placeholder.mjs +0 -43
- package/esm2022/drag-drop/directives/drag-preview.mjs +0 -48
- package/esm2022/drag-drop/directives/drag.mjs +0 -520
- package/esm2022/drag-drop/directives/drop-list-group.mjs +0 -47
- package/esm2022/drag-drop/directives/drop-list.mjs +0 -352
- package/esm2022/drag-drop/dom/clone-node.mjs +0 -65
- package/esm2022/drag-drop/dom/dom-rect.mjs +0 -64
- package/esm2022/drag-drop/dom/parent-position-tracker.mjs +0 -76
- package/esm2022/drag-drop/dom/root-node.mjs +0 -21
- package/esm2022/drag-drop/dom/styling.mjs +0 -89
- package/esm2022/drag-drop/dom/transition-duration.mjs +0 -36
- package/esm2022/drag-drop/drag-drop-module.mjs +0 -49
- package/esm2022/drag-drop/drag-drop-registry.mjs +0 -248
- package/esm2022/drag-drop/drag-drop.mjs +0 -57
- package/esm2022/drag-drop/drag-drop_public_index.mjs +0 -5
- package/esm2022/drag-drop/drag-events.mjs +0 -9
- package/esm2022/drag-drop/drag-parent.mjs +0 -16
- package/esm2022/drag-drop/drag-ref.mjs +0 -1097
- package/esm2022/drag-drop/drag-utils.mjs +0 -60
- package/esm2022/drag-drop/drop-list-ref.mjs +0 -672
- package/esm2022/drag-drop/index.mjs +0 -9
- package/esm2022/drag-drop/preview-ref.mjs +0 -125
- package/esm2022/drag-drop/public-api.mjs +0 -23
- package/esm2022/drag-drop/sorting/drop-list-sort-strategy.mjs +0 -9
- package/esm2022/drag-drop/sorting/mixed-sort-strategy.mjs +0 -246
- package/esm2022/drag-drop/sorting/single-axis-sort-strategy.mjs +0 -343
- package/esm2022/index.mjs +0 -9
- package/esm2022/keycodes/index.mjs +0 -9
- package/esm2022/keycodes/keycodes.mjs +0 -127
- package/esm2022/keycodes/keycodes_public_index.mjs +0 -5
- package/esm2022/keycodes/modifiers.mjs +0 -18
- package/esm2022/keycodes/public-api.mjs +0 -10
- package/esm2022/layout/breakpoints-observer.mjs +0 -105
- package/esm2022/layout/breakpoints.mjs +0 -29
- package/esm2022/layout/index.mjs +0 -9
- package/esm2022/layout/layout-module.mjs +0 -19
- package/esm2022/layout/layout_public_index.mjs +0 -5
- package/esm2022/layout/media-matcher.mjs +0 -94
- package/esm2022/layout/public-api.mjs +0 -12
- package/esm2022/listbox/index.mjs +0 -9
- package/esm2022/listbox/listbox-module.mjs +0 -24
- package/esm2022/listbox/listbox.mjs +0 -888
- package/esm2022/listbox/listbox_public_index.mjs +0 -5
- package/esm2022/listbox/public-api.mjs +0 -10
- package/esm2022/menu/context-menu-trigger.mjs +0 -221
- package/esm2022/menu/event-detection.mjs +0 -28
- package/esm2022/menu/index.mjs +0 -9
- package/esm2022/menu/menu-aim.mjs +0 -204
- package/esm2022/menu/menu-bar.mjs +0 -134
- package/esm2022/menu/menu-base.mjs +0 -192
- package/esm2022/menu/menu-errors.mjs +0 -22
- package/esm2022/menu/menu-group.mjs +0 -31
- package/esm2022/menu/menu-interface.mjs +0 -11
- package/esm2022/menu/menu-item-checkbox.mjs +0 -50
- package/esm2022/menu/menu-item-radio.mjs +0 -72
- package/esm2022/menu/menu-item-selectable.mjs +0 -36
- package/esm2022/menu/menu-item.mjs +0 -270
- package/esm2022/menu/menu-module.mjs +0 -60
- package/esm2022/menu/menu-stack.mjs +0 -163
- package/esm2022/menu/menu-trigger-base.mjs +0 -119
- package/esm2022/menu/menu-trigger.mjs +0 -313
- package/esm2022/menu/menu.mjs +0 -135
- package/esm2022/menu/menu_public_index.mjs +0 -5
- package/esm2022/menu/pointer-focus-tracker.mjs +0 -51
- package/esm2022/menu/public-api.mjs +0 -24
- package/esm2022/observers/index.mjs +0 -9
- package/esm2022/observers/observe-content.mjs +0 -216
- package/esm2022/observers/observers_public_index.mjs +0 -5
- package/esm2022/observers/private/index.mjs +0 -9
- package/esm2022/observers/private/private_public_index.mjs +0 -5
- package/esm2022/observers/private/shared-resize-observer.mjs +0 -125
- package/esm2022/observers/public-api.mjs +0 -9
- package/esm2022/overlay/dispatchers/base-overlay-dispatcher.mjs +0 -52
- package/esm2022/overlay/dispatchers/index.mjs +0 -10
- package/esm2022/overlay/dispatchers/overlay-keyboard-dispatcher.mjs +0 -81
- package/esm2022/overlay/dispatchers/overlay-outside-click-dispatcher.mjs +0 -151
- package/esm2022/overlay/fullscreen-overlay-container.mjs +0 -94
- package/esm2022/overlay/index.mjs +0 -9
- package/esm2022/overlay/overlay-config.mjs +0 -45
- package/esm2022/overlay/overlay-container.mjs +0 -81
- package/esm2022/overlay/overlay-directives.mjs +0 -432
- package/esm2022/overlay/overlay-module.mjs +0 -28
- package/esm2022/overlay/overlay-ref.mjs +0 -437
- package/esm2022/overlay/overlay.mjs +0 -126
- package/esm2022/overlay/overlay_public_index.mjs +0 -5
- package/esm2022/overlay/position/connected-position.mjs +0 -88
- package/esm2022/overlay/position/flexible-connected-position-strategy.mjs +0 -1002
- package/esm2022/overlay/position/global-position-strategy.mjs +0 -237
- package/esm2022/overlay/position/overlay-position-builder.mjs +0 -50
- package/esm2022/overlay/position/position-strategy.mjs +0 -9
- package/esm2022/overlay/position/scroll-clip.mjs +0 -40
- package/esm2022/overlay/public-api.mjs +0 -22
- package/esm2022/overlay/scroll/block-scroll-strategy.mjs +0 -80
- package/esm2022/overlay/scroll/close-scroll-strategy.mjs +0 -65
- package/esm2022/overlay/scroll/index.mjs +0 -14
- package/esm2022/overlay/scroll/noop-scroll-strategy.mjs +0 -17
- package/esm2022/overlay/scroll/reposition-scroll-strategy.mjs +0 -61
- package/esm2022/overlay/scroll/scroll-strategy-options.mjs +0 -55
- package/esm2022/overlay/scroll/scroll-strategy.mjs +0 -14
- package/esm2022/platform/features/input-types.mjs +0 -59
- package/esm2022/platform/features/passive-listeners.mjs +0 -36
- package/esm2022/platform/features/scrolling.mjs +0 -104
- package/esm2022/platform/features/shadow-dom.mjs +0 -54
- package/esm2022/platform/features/test-environment.mjs +0 -24
- package/esm2022/platform/index.mjs +0 -9
- package/esm2022/platform/platform-module.mjs +0 -19
- package/esm2022/platform/platform.mjs +0 -82
- package/esm2022/platform/platform_public_index.mjs +0 -5
- package/esm2022/platform/public-api.mjs +0 -15
- package/esm2022/portal/dom-portal-outlet.mjs +0 -158
- package/esm2022/portal/index.mjs +0 -9
- package/esm2022/portal/portal-directives.mjs +0 -251
- package/esm2022/portal/portal-errors.mjs +0 -51
- package/esm2022/portal/portal-injector.mjs +0 -28
- package/esm2022/portal/portal.mjs +0 -189
- package/esm2022/portal/portal_public_index.mjs +0 -5
- package/esm2022/portal/public-api.mjs +0 -12
- package/esm2022/private/index.mjs +0 -9
- package/esm2022/private/private_public_index.mjs +0 -5
- package/esm2022/private/public-api.mjs +0 -9
- package/esm2022/private/style-loader.mjs +0 -50
- package/esm2022/public-api.mjs +0 -9
- package/esm2022/scrolling/fixed-size-virtual-scroll.mjs +0 -218
- package/esm2022/scrolling/index.mjs +0 -9
- package/esm2022/scrolling/public-api.mjs +0 -20
- package/esm2022/scrolling/scroll-dispatcher.mjs +0 -163
- package/esm2022/scrolling/scrollable.mjs +0 -177
- package/esm2022/scrolling/scrolling-module.mjs +0 -69
- package/esm2022/scrolling/scrolling_public_index.mjs +0 -5
- package/esm2022/scrolling/viewport-ruler.mjs +0 -146
- package/esm2022/scrolling/virtual-for-of.mjs +0 -299
- package/esm2022/scrolling/virtual-scroll-repeater.mjs +0 -9
- package/esm2022/scrolling/virtual-scroll-strategy.mjs +0 -11
- package/esm2022/scrolling/virtual-scroll-viewport.mjs +0 -445
- package/esm2022/scrolling/virtual-scrollable-element.mjs +0 -42
- package/esm2022/scrolling/virtual-scrollable-window.mjs +0 -41
- package/esm2022/scrolling/virtual-scrollable.mjs +0 -40
- package/esm2022/stepper/index.mjs +0 -9
- package/esm2022/stepper/public-api.mjs +0 -13
- package/esm2022/stepper/step-header.mjs +0 -31
- package/esm2022/stepper/step-label.mjs +0 -24
- package/esm2022/stepper/stepper-button.mjs +0 -58
- package/esm2022/stepper/stepper-module.mjs +0 -41
- package/esm2022/stepper/stepper.mjs +0 -452
- package/esm2022/stepper/stepper_public_index.mjs +0 -5
- package/esm2022/table/can-stick.mjs +0 -46
- package/esm2022/table/cell.mjs +0 -245
- package/esm2022/table/coalesced-style-scheduler.mjs +0 -79
- package/esm2022/table/index.mjs +0 -9
- package/esm2022/table/public-api.mjs +0 -20
- package/esm2022/table/row.mjs +0 -317
- package/esm2022/table/sticky-position-listener.mjs +0 -11
- package/esm2022/table/sticky-styler.mjs +0 -347
- package/esm2022/table/table-errors.mjs +0 -67
- package/esm2022/table/table-module.mjs +0 -93
- package/esm2022/table/table.mjs +0 -1148
- package/esm2022/table/table_public_index.mjs +0 -5
- package/esm2022/table/text-column.mjs +0 -154
- package/esm2022/table/tokens.mjs +0 -16
- package/esm2022/testing/change-detection.mjs +0 -102
- package/esm2022/testing/component-harness.mjs +0 -328
- package/esm2022/testing/element-dimensions.mjs +0 -9
- package/esm2022/testing/harness-environment.mjs +0 -220
- package/esm2022/testing/index.mjs +0 -9
- package/esm2022/testing/public-api.mjs +0 -15
- package/esm2022/testing/selenium-webdriver/index.mjs +0 -9
- package/esm2022/testing/selenium-webdriver/public-api.mjs +0 -10
- package/esm2022/testing/selenium-webdriver/selenium-web-driver-element.mjs +0 -216
- package/esm2022/testing/selenium-webdriver/selenium-web-driver-harness-environment.mjs +0 -88
- package/esm2022/testing/selenium-webdriver/selenium-webdriver-keys.mjs +0 -64
- package/esm2022/testing/test-element-errors.mjs +0 -15
- package/esm2022/testing/test-element.mjs +0 -49
- package/esm2022/testing/testbed/fake-events/dispatch-events.mjs +0 -53
- package/esm2022/testing/testbed/fake-events/element-focus.mjs +0 -39
- package/esm2022/testing/testbed/fake-events/event-objects.mjs +0 -127
- package/esm2022/testing/testbed/fake-events/index.mjs +0 -14
- package/esm2022/testing/testbed/fake-events/type-in-element.mjs +0 -97
- package/esm2022/testing/testbed/index.mjs +0 -9
- package/esm2022/testing/testbed/public-api.mjs +0 -10
- package/esm2022/testing/testbed/task-state-zone-interceptor.mjs +0 -83
- package/esm2022/testing/testbed/testbed-harness-environment.mjs +0 -165
- package/esm2022/testing/testbed/unit-test-element.mjs +0 -258
- package/esm2022/testing/text-filtering.mjs +0 -21
- package/esm2022/text-field/autofill.mjs +0 -114
- package/esm2022/text-field/autosize.mjs +0 -309
- package/esm2022/text-field/index.mjs +0 -9
- package/esm2022/text-field/public-api.mjs +0 -11
- package/esm2022/text-field/text-field-module.mjs +0 -24
- package/esm2022/text-field/text-field_public_index.mjs +0 -5
- package/esm2022/tree/control/base-tree-control.mjs +0 -62
- package/esm2022/tree/control/flat-tree-control.mjs +0 -57
- package/esm2022/tree/control/nested-tree-control.mjs +0 -67
- package/esm2022/tree/control/tree-control.mjs +0 -2
- package/esm2022/tree/index.mjs +0 -9
- package/esm2022/tree/nested-node.mjs +0 -103
- package/esm2022/tree/node.mjs +0 -36
- package/esm2022/tree/outlet.mjs +0 -40
- package/esm2022/tree/padding.mjs +0 -129
- package/esm2022/tree/public-api.mjs +0 -20
- package/esm2022/tree/toggle.mjs +0 -51
- package/esm2022/tree/tree-errors.mjs +0 -44
- package/esm2022/tree/tree-module.mjs +0 -49
- package/esm2022/tree/tree.mjs +0 -1123
- package/esm2022/tree/tree_public_index.mjs +0 -5
- package/esm2022/version.mjs +0 -11
|
@@ -1,345 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google LLC All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
|
-
import { InjectionToken, QueryList } from '@angular/core';
|
|
9
|
-
import { coerceObservable } from '@angular/cdk/coercion/private';
|
|
10
|
-
import { Subject, Subscription, isObservable, of as observableOf } from 'rxjs';
|
|
11
|
-
import { take } from 'rxjs/operators';
|
|
12
|
-
import { Typeahead } from './typeahead';
|
|
13
|
-
/**
|
|
14
|
-
* This class manages keyboard events for trees. If you pass it a QueryList or other list of tree
|
|
15
|
-
* items, it will set the active item, focus, handle expansion and typeahead correctly when
|
|
16
|
-
* keyboard events occur.
|
|
17
|
-
*/
|
|
18
|
-
export class TreeKeyManager {
|
|
19
|
-
_initialFocus() {
|
|
20
|
-
if (this._hasInitialFocused) {
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
if (!this._items.length) {
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
let focusIndex = 0;
|
|
27
|
-
for (let i = 0; i < this._items.length; i++) {
|
|
28
|
-
if (!this._skipPredicateFn(this._items[i]) && !this._isItemDisabled(this._items[i])) {
|
|
29
|
-
focusIndex = i;
|
|
30
|
-
break;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
this.focusItem(focusIndex);
|
|
34
|
-
this._hasInitialFocused = true;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
*
|
|
38
|
-
* @param items List of TreeKeyManager options. Can be synchronous or asynchronous.
|
|
39
|
-
* @param config Optional configuration options. By default, use 'ltr' horizontal orientation. By
|
|
40
|
-
* default, do not skip any nodes. By default, key manager only calls `focus` method when items
|
|
41
|
-
* are focused and does not call `activate`. If `typeaheadDefaultInterval` is `true`, use a
|
|
42
|
-
* default interval of 200ms.
|
|
43
|
-
*/
|
|
44
|
-
constructor(items, config) {
|
|
45
|
-
/** The index of the currently active (focused) item. */
|
|
46
|
-
this._activeItemIndex = -1;
|
|
47
|
-
/** The currently active (focused) item. */
|
|
48
|
-
this._activeItem = null;
|
|
49
|
-
/** Whether or not we activate the item when it's focused. */
|
|
50
|
-
this._shouldActivationFollowFocus = false;
|
|
51
|
-
/**
|
|
52
|
-
* The orientation that the tree is laid out in. In `rtl` mode, the behavior of Left and
|
|
53
|
-
* Right arrow are switched.
|
|
54
|
-
*/
|
|
55
|
-
this._horizontalOrientation = 'ltr';
|
|
56
|
-
/**
|
|
57
|
-
* Predicate function that can be used to check whether an item should be skipped
|
|
58
|
-
* by the key manager.
|
|
59
|
-
*
|
|
60
|
-
* The default value for this doesn't skip any elements in order to keep tree items focusable
|
|
61
|
-
* when disabled. This aligns with ARIA guidelines:
|
|
62
|
-
* https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/#focusabilityofdisabledcontrols.
|
|
63
|
-
*/
|
|
64
|
-
this._skipPredicateFn = (_item) => false;
|
|
65
|
-
/** Function to determine equivalent items. */
|
|
66
|
-
this._trackByFn = (item) => item;
|
|
67
|
-
/** Synchronous cache of the items to manage. */
|
|
68
|
-
this._items = [];
|
|
69
|
-
this._typeaheadSubscription = Subscription.EMPTY;
|
|
70
|
-
this._hasInitialFocused = false;
|
|
71
|
-
/** Stream that emits any time the focused item changes. */
|
|
72
|
-
this.change = new Subject();
|
|
73
|
-
// We allow for the items to be an array or Observable because, in some cases, the consumer may
|
|
74
|
-
// not have access to a QueryList of the items they want to manage (e.g. when the
|
|
75
|
-
// items aren't being collected via `ViewChildren` or `ContentChildren`).
|
|
76
|
-
if (items instanceof QueryList) {
|
|
77
|
-
this._items = items.toArray();
|
|
78
|
-
items.changes.subscribe((newItems) => {
|
|
79
|
-
this._items = newItems.toArray();
|
|
80
|
-
this._typeahead?.setItems(this._items);
|
|
81
|
-
this._updateActiveItemIndex(this._items);
|
|
82
|
-
this._initialFocus();
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
else if (isObservable(items)) {
|
|
86
|
-
items.subscribe(newItems => {
|
|
87
|
-
this._items = newItems;
|
|
88
|
-
this._typeahead?.setItems(newItems);
|
|
89
|
-
this._updateActiveItemIndex(newItems);
|
|
90
|
-
this._initialFocus();
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
this._items = items;
|
|
95
|
-
this._initialFocus();
|
|
96
|
-
}
|
|
97
|
-
if (typeof config.shouldActivationFollowFocus === 'boolean') {
|
|
98
|
-
this._shouldActivationFollowFocus = config.shouldActivationFollowFocus;
|
|
99
|
-
}
|
|
100
|
-
if (config.horizontalOrientation) {
|
|
101
|
-
this._horizontalOrientation = config.horizontalOrientation;
|
|
102
|
-
}
|
|
103
|
-
if (config.skipPredicate) {
|
|
104
|
-
this._skipPredicateFn = config.skipPredicate;
|
|
105
|
-
}
|
|
106
|
-
if (config.trackBy) {
|
|
107
|
-
this._trackByFn = config.trackBy;
|
|
108
|
-
}
|
|
109
|
-
if (typeof config.typeAheadDebounceInterval !== 'undefined') {
|
|
110
|
-
this._setTypeAhead(config.typeAheadDebounceInterval);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
/** Cleans up the key manager. */
|
|
114
|
-
destroy() {
|
|
115
|
-
this._typeaheadSubscription.unsubscribe();
|
|
116
|
-
this._typeahead?.destroy();
|
|
117
|
-
this.change.complete();
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Handles a keyboard event on the tree.
|
|
121
|
-
* @param event Keyboard event that represents the user interaction with the tree.
|
|
122
|
-
*/
|
|
123
|
-
onKeydown(event) {
|
|
124
|
-
const key = event.key;
|
|
125
|
-
switch (key) {
|
|
126
|
-
case 'Tab':
|
|
127
|
-
// Return early here, in order to allow Tab to actually tab out of the tree
|
|
128
|
-
return;
|
|
129
|
-
case 'ArrowDown':
|
|
130
|
-
this._focusNextItem();
|
|
131
|
-
break;
|
|
132
|
-
case 'ArrowUp':
|
|
133
|
-
this._focusPreviousItem();
|
|
134
|
-
break;
|
|
135
|
-
case 'ArrowRight':
|
|
136
|
-
this._horizontalOrientation === 'rtl'
|
|
137
|
-
? this._collapseCurrentItem()
|
|
138
|
-
: this._expandCurrentItem();
|
|
139
|
-
break;
|
|
140
|
-
case 'ArrowLeft':
|
|
141
|
-
this._horizontalOrientation === 'rtl'
|
|
142
|
-
? this._expandCurrentItem()
|
|
143
|
-
: this._collapseCurrentItem();
|
|
144
|
-
break;
|
|
145
|
-
case 'Home':
|
|
146
|
-
this._focusFirstItem();
|
|
147
|
-
break;
|
|
148
|
-
case 'End':
|
|
149
|
-
this._focusLastItem();
|
|
150
|
-
break;
|
|
151
|
-
case 'Enter':
|
|
152
|
-
case ' ':
|
|
153
|
-
this._activateCurrentItem();
|
|
154
|
-
break;
|
|
155
|
-
default:
|
|
156
|
-
if (event.key === '*') {
|
|
157
|
-
this._expandAllItemsAtCurrentItemLevel();
|
|
158
|
-
break;
|
|
159
|
-
}
|
|
160
|
-
this._typeahead?.handleKey(event);
|
|
161
|
-
// Return here, in order to avoid preventing the default action of non-navigational
|
|
162
|
-
// keys or resetting the buffer of pressed letters.
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
// Reset the typeahead since the user has used a navigational key.
|
|
166
|
-
this._typeahead?.reset();
|
|
167
|
-
event.preventDefault();
|
|
168
|
-
}
|
|
169
|
-
/** Index of the currently active item. */
|
|
170
|
-
getActiveItemIndex() {
|
|
171
|
-
return this._activeItemIndex;
|
|
172
|
-
}
|
|
173
|
-
/** The currently active item. */
|
|
174
|
-
getActiveItem() {
|
|
175
|
-
return this._activeItem;
|
|
176
|
-
}
|
|
177
|
-
/** Focus the first available item. */
|
|
178
|
-
_focusFirstItem() {
|
|
179
|
-
this.focusItem(this._findNextAvailableItemIndex(-1));
|
|
180
|
-
}
|
|
181
|
-
/** Focus the last available item. */
|
|
182
|
-
_focusLastItem() {
|
|
183
|
-
this.focusItem(this._findPreviousAvailableItemIndex(this._items.length));
|
|
184
|
-
}
|
|
185
|
-
/** Focus the next available item. */
|
|
186
|
-
_focusNextItem() {
|
|
187
|
-
this.focusItem(this._findNextAvailableItemIndex(this._activeItemIndex));
|
|
188
|
-
}
|
|
189
|
-
/** Focus the previous available item. */
|
|
190
|
-
_focusPreviousItem() {
|
|
191
|
-
this.focusItem(this._findPreviousAvailableItemIndex(this._activeItemIndex));
|
|
192
|
-
}
|
|
193
|
-
focusItem(itemOrIndex, options = {}) {
|
|
194
|
-
// Set default options
|
|
195
|
-
options.emitChangeEvent ??= true;
|
|
196
|
-
let index = typeof itemOrIndex === 'number'
|
|
197
|
-
? itemOrIndex
|
|
198
|
-
: this._items.findIndex(item => this._trackByFn(item) === this._trackByFn(itemOrIndex));
|
|
199
|
-
if (index < 0 || index >= this._items.length) {
|
|
200
|
-
return;
|
|
201
|
-
}
|
|
202
|
-
const activeItem = this._items[index];
|
|
203
|
-
// If we're just setting the same item, don't re-call activate or focus
|
|
204
|
-
if (this._activeItem !== null &&
|
|
205
|
-
this._trackByFn(activeItem) === this._trackByFn(this._activeItem)) {
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
|
-
const previousActiveItem = this._activeItem;
|
|
209
|
-
this._activeItem = activeItem ?? null;
|
|
210
|
-
this._activeItemIndex = index;
|
|
211
|
-
this._typeahead?.setCurrentSelectedItemIndex(index);
|
|
212
|
-
this._activeItem?.focus();
|
|
213
|
-
previousActiveItem?.unfocus();
|
|
214
|
-
if (options.emitChangeEvent) {
|
|
215
|
-
this.change.next(this._activeItem);
|
|
216
|
-
}
|
|
217
|
-
if (this._shouldActivationFollowFocus) {
|
|
218
|
-
this._activateCurrentItem();
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
_updateActiveItemIndex(newItems) {
|
|
222
|
-
const activeItem = this._activeItem;
|
|
223
|
-
if (!activeItem) {
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
226
|
-
const newIndex = newItems.findIndex(item => this._trackByFn(item) === this._trackByFn(activeItem));
|
|
227
|
-
if (newIndex > -1 && newIndex !== this._activeItemIndex) {
|
|
228
|
-
this._activeItemIndex = newIndex;
|
|
229
|
-
this._typeahead?.setCurrentSelectedItemIndex(newIndex);
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
_setTypeAhead(debounceInterval) {
|
|
233
|
-
this._typeahead = new Typeahead(this._items, {
|
|
234
|
-
debounceInterval: typeof debounceInterval === 'number' ? debounceInterval : undefined,
|
|
235
|
-
skipPredicate: item => this._skipPredicateFn(item),
|
|
236
|
-
});
|
|
237
|
-
this._typeaheadSubscription = this._typeahead.selectedItem.subscribe(item => {
|
|
238
|
-
this.focusItem(item);
|
|
239
|
-
});
|
|
240
|
-
}
|
|
241
|
-
_findNextAvailableItemIndex(startingIndex) {
|
|
242
|
-
for (let i = startingIndex + 1; i < this._items.length; i++) {
|
|
243
|
-
if (!this._skipPredicateFn(this._items[i])) {
|
|
244
|
-
return i;
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
return startingIndex;
|
|
248
|
-
}
|
|
249
|
-
_findPreviousAvailableItemIndex(startingIndex) {
|
|
250
|
-
for (let i = startingIndex - 1; i >= 0; i--) {
|
|
251
|
-
if (!this._skipPredicateFn(this._items[i])) {
|
|
252
|
-
return i;
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
return startingIndex;
|
|
256
|
-
}
|
|
257
|
-
/**
|
|
258
|
-
* If the item is already expanded, we collapse the item. Otherwise, we will focus the parent.
|
|
259
|
-
*/
|
|
260
|
-
_collapseCurrentItem() {
|
|
261
|
-
if (!this._activeItem) {
|
|
262
|
-
return;
|
|
263
|
-
}
|
|
264
|
-
if (this._isCurrentItemExpanded()) {
|
|
265
|
-
this._activeItem.collapse();
|
|
266
|
-
}
|
|
267
|
-
else {
|
|
268
|
-
const parent = this._activeItem.getParent();
|
|
269
|
-
if (!parent || this._skipPredicateFn(parent)) {
|
|
270
|
-
return;
|
|
271
|
-
}
|
|
272
|
-
this.focusItem(parent);
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
/**
|
|
276
|
-
* If the item is already collapsed, we expand the item. Otherwise, we will focus the first child.
|
|
277
|
-
*/
|
|
278
|
-
_expandCurrentItem() {
|
|
279
|
-
if (!this._activeItem) {
|
|
280
|
-
return;
|
|
281
|
-
}
|
|
282
|
-
if (!this._isCurrentItemExpanded()) {
|
|
283
|
-
this._activeItem.expand();
|
|
284
|
-
}
|
|
285
|
-
else {
|
|
286
|
-
coerceObservable(this._activeItem.getChildren())
|
|
287
|
-
.pipe(take(1))
|
|
288
|
-
.subscribe(children => {
|
|
289
|
-
const firstChild = children.find(child => !this._skipPredicateFn(child));
|
|
290
|
-
if (!firstChild) {
|
|
291
|
-
return;
|
|
292
|
-
}
|
|
293
|
-
this.focusItem(firstChild);
|
|
294
|
-
});
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
_isCurrentItemExpanded() {
|
|
298
|
-
if (!this._activeItem) {
|
|
299
|
-
return false;
|
|
300
|
-
}
|
|
301
|
-
return typeof this._activeItem.isExpanded === 'boolean'
|
|
302
|
-
? this._activeItem.isExpanded
|
|
303
|
-
: this._activeItem.isExpanded();
|
|
304
|
-
}
|
|
305
|
-
_isItemDisabled(item) {
|
|
306
|
-
return typeof item.isDisabled === 'boolean' ? item.isDisabled : item.isDisabled?.();
|
|
307
|
-
}
|
|
308
|
-
/** For all items that are the same level as the current item, we expand those items. */
|
|
309
|
-
_expandAllItemsAtCurrentItemLevel() {
|
|
310
|
-
if (!this._activeItem) {
|
|
311
|
-
return;
|
|
312
|
-
}
|
|
313
|
-
const parent = this._activeItem.getParent();
|
|
314
|
-
let itemsToExpand;
|
|
315
|
-
if (!parent) {
|
|
316
|
-
itemsToExpand = observableOf(this._items.filter(item => item.getParent() === null));
|
|
317
|
-
}
|
|
318
|
-
else {
|
|
319
|
-
itemsToExpand = coerceObservable(parent.getChildren());
|
|
320
|
-
}
|
|
321
|
-
itemsToExpand.pipe(take(1)).subscribe(items => {
|
|
322
|
-
for (const item of items) {
|
|
323
|
-
item.expand();
|
|
324
|
-
}
|
|
325
|
-
});
|
|
326
|
-
}
|
|
327
|
-
_activateCurrentItem() {
|
|
328
|
-
this._activeItem?.activate();
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
/** @docs-private */
|
|
332
|
-
export function TREE_KEY_MANAGER_FACTORY() {
|
|
333
|
-
return (items, options) => new TreeKeyManager(items, options);
|
|
334
|
-
}
|
|
335
|
-
/** Injection token that determines the key manager to use. */
|
|
336
|
-
export const TREE_KEY_MANAGER = new InjectionToken('tree-key-manager', {
|
|
337
|
-
providedIn: 'root',
|
|
338
|
-
factory: TREE_KEY_MANAGER_FACTORY,
|
|
339
|
-
});
|
|
340
|
-
/** @docs-private */
|
|
341
|
-
export const TREE_KEY_MANAGER_FACTORY_PROVIDER = {
|
|
342
|
-
provide: TREE_KEY_MANAGER,
|
|
343
|
-
useFactory: TREE_KEY_MANAGER_FACTORY,
|
|
344
|
-
};
|
|
345
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1rZXktbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jZGsvYTExeS9rZXktbWFuYWdlci90cmVlLWtleS1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBQyxjQUFjLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQy9ELE9BQU8sRUFBYSxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxFQUFFLElBQUksWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3pGLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQU9wQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQWtDakIsYUFBYTtRQUNuQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDbkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNwRixVQUFVLEdBQUcsQ0FBQyxDQUFDO2dCQUNmLE1BQU07WUFDUixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFlBQVksS0FBMkMsRUFBRSxNQUFnQztRQTlEekYsd0RBQXdEO1FBQ2hELHFCQUFnQixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzlCLDJDQUEyQztRQUNuQyxnQkFBVyxHQUFhLElBQUksQ0FBQztRQUNyQyw2REFBNkQ7UUFDckQsaUNBQTRCLEdBQUcsS0FBSyxDQUFDO1FBQzdDOzs7V0FHRztRQUNLLDJCQUFzQixHQUFrQixLQUFLLENBQUM7UUFFdEQ7Ozs7Ozs7V0FPRztRQUNLLHFCQUFnQixHQUFHLENBQUMsS0FBUSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUM7UUFFL0MsOENBQThDO1FBQ3RDLGVBQVUsR0FBeUIsQ0FBQyxJQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQztRQUU3RCxnREFBZ0Q7UUFDeEMsV0FBTSxHQUFRLEVBQUUsQ0FBQztRQUdqQiwyQkFBc0IsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDO1FBRTVDLHVCQUFrQixHQUFHLEtBQUssQ0FBQztRQXdFbkMsMkRBQTJEO1FBQ2xELFdBQU0sR0FBRyxJQUFJLE9BQU8sRUFBWSxDQUFDO1FBekN4QywrRkFBK0Y7UUFDL0YsaUZBQWlGO1FBQ2pGLHlFQUF5RTtRQUN6RSxJQUFJLEtBQUssWUFBWSxTQUFTLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM5QixLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQXNCLEVBQUUsRUFBRTtnQkFDakQsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDekMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0IsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDcEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFFRCxJQUFJLE9BQU8sTUFBTSxDQUFDLDJCQUEyQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyw0QkFBNEIsR0FBRyxNQUFNLENBQUMsMkJBQTJCLENBQUM7UUFDekUsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQztRQUM3RCxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7UUFDL0MsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNuQyxDQUFDO1FBQ0QsSUFBSSxPQUFPLE1BQU0sQ0FBQyx5QkFBeUIsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUM1RCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7SUFDSCxDQUFDO0lBS0QsaUNBQWlDO0lBQ2pDLE9BQU87UUFDTCxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLENBQUMsS0FBb0I7UUFDNUIsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUV0QixRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ1osS0FBSyxLQUFLO2dCQUNSLDJFQUEyRTtnQkFDM0UsT0FBTztZQUVULEtBQUssV0FBVztnQkFDZCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3RCLE1BQU07WUFFUixLQUFLLFNBQVM7Z0JBQ1osSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzFCLE1BQU07WUFFUixLQUFLLFlBQVk7Z0JBQ2YsSUFBSSxDQUFDLHNCQUFzQixLQUFLLEtBQUs7b0JBQ25DLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7b0JBQzdCLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDOUIsTUFBTTtZQUVSLEtBQUssV0FBVztnQkFDZCxJQUFJLENBQUMsc0JBQXNCLEtBQUssS0FBSztvQkFDbkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtvQkFDM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUNoQyxNQUFNO1lBRVIsS0FBSyxNQUFNO2dCQUNULElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDdkIsTUFBTTtZQUVSLEtBQUssS0FBSztnQkFDUixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3RCLE1BQU07WUFFUixLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssR0FBRztnQkFDTixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDNUIsTUFBTTtZQUVSO2dCQUNFLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztvQkFDdEIsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLENBQUM7b0JBQ3pDLE1BQU07Z0JBQ1IsQ0FBQztnQkFFRCxJQUFJLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbEMsbUZBQW1GO2dCQUNuRixtREFBbUQ7Z0JBQ25ELE9BQU87UUFDWCxDQUFDO1FBRUQsa0VBQWtFO1FBQ2xFLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDekIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7SUFFRCxpQ0FBaUM7SUFDakMsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsc0NBQXNDO0lBQzlCLGVBQWU7UUFDckIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxxQ0FBcUM7SUFDN0IsY0FBYztRQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVELHFDQUFxQztJQUM3QixjQUFjO1FBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVELHlDQUF5QztJQUNqQyxrQkFBa0I7UUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBVUQsU0FBUyxDQUFDLFdBQXVCLEVBQUUsVUFBdUMsRUFBRTtRQUMxRSxzQkFBc0I7UUFDdEIsT0FBTyxDQUFDLGVBQWUsS0FBSyxJQUFJLENBQUM7UUFFakMsSUFBSSxLQUFLLEdBQ1AsT0FBTyxXQUFXLEtBQUssUUFBUTtZQUM3QixDQUFDLENBQUMsV0FBVztZQUNiLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQzVGLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3QyxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdEMsdUVBQXVFO1FBQ3ZFLElBQ0UsSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJO1lBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQ2pFLENBQUM7WUFDRCxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUM1QyxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsSUFBSSxJQUFJLENBQUM7UUFDdEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsVUFBVSxFQUFFLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXBELElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDMUIsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFFOUIsSUFBSSxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRU8sc0JBQXNCLENBQUMsUUFBYTtRQUMxQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQ2pDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUM5RCxDQUFDO1FBRUYsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksUUFBUSxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7WUFDakMsSUFBSSxDQUFDLFVBQVUsRUFBRSwyQkFBMkIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6RCxDQUFDO0lBQ0gsQ0FBQztJQUVPLGFBQWEsQ0FBQyxnQkFBa0M7UUFDdEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQzNDLGdCQUFnQixFQUFFLE9BQU8sZ0JBQWdCLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUNyRixhQUFhLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO1NBQ25ELENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDMUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTywyQkFBMkIsQ0FBQyxhQUFxQjtRQUN2RCxLQUFLLElBQUksQ0FBQyxHQUFHLGFBQWEsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDNUQsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDM0MsT0FBTyxDQUFDLENBQUM7WUFDWCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFFTywrQkFBK0IsQ0FBQyxhQUFxQjtRQUMzRCxLQUFLLElBQUksQ0FBQyxHQUFHLGFBQWEsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzNDLE9BQU8sQ0FBQyxDQUFDO1lBQ1gsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSyxvQkFBb0I7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlCLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFXLENBQUMsRUFBRSxDQUFDO2dCQUNsRCxPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBVyxDQUFDLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGtCQUFrQjtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM1QixDQUFDO2FBQU0sQ0FBQztZQUNOLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7aUJBQzdDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ2IsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUNwQixNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBVSxDQUFDLENBQUMsQ0FBQztnQkFDOUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNoQixPQUFPO2dCQUNULENBQUM7Z0JBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFlLENBQUMsQ0FBQztZQUNsQyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7SUFDSCxDQUFDO0lBRU8sc0JBQXNCO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEIsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsT0FBTyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxLQUFLLFNBQVM7WUFDckQsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVTtZQUM3QixDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRU8sZUFBZSxDQUFDLElBQXdCO1FBQzlDLE9BQU8sT0FBTyxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7SUFDdEYsQ0FBQztJQUVELHdGQUF3RjtJQUNoRixpQ0FBaUM7UUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDNUMsSUFBSSxhQUFhLENBQUM7UUFDbEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osYUFBYSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7YUFBTSxDQUFDO1lBQ04sYUFBYSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFFRCxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM1QyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLG9CQUFvQjtRQUMxQixJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQy9CLENBQUM7Q0FDRjtBQUVELG9CQUFvQjtBQUNwQixNQUFNLFVBQVUsd0JBQXdCO0lBQ3RDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVELDhEQUE4RDtBQUM5RCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLGNBQWMsQ0FBNkIsa0JBQWtCLEVBQUU7SUFDakcsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLHdCQUF3QjtDQUNsQyxDQUFDLENBQUM7QUFFSCxvQkFBb0I7QUFDcEIsTUFBTSxDQUFDLE1BQU0saUNBQWlDLEdBQUc7SUFDL0MsT0FBTyxFQUFFLGdCQUFnQjtJQUN6QixVQUFVLEVBQUUsd0JBQXdCO0NBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtJbmplY3Rpb25Ub2tlbiwgUXVlcnlMaXN0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Y29lcmNlT2JzZXJ2YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uL3ByaXZhdGUnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGlzT2JzZXJ2YWJsZSwgb2YgYXMgb2JzZXJ2YWJsZU9mfSBmcm9tICdyeGpzJztcbmltcG9ydCB7dGFrZX0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgVHJlZUtleU1hbmFnZXJGYWN0b3J5LFxuICBUcmVlS2V5TWFuYWdlckl0ZW0sXG4gIFRyZWVLZXlNYW5hZ2VyT3B0aW9ucyxcbiAgVHJlZUtleU1hbmFnZXJTdHJhdGVneSxcbn0gZnJvbSAnLi90cmVlLWtleS1tYW5hZ2VyLXN0cmF0ZWd5JztcbmltcG9ydCB7VHlwZWFoZWFkfSBmcm9tICcuL3R5cGVhaGVhZCc7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBtYW5hZ2VzIGtleWJvYXJkIGV2ZW50cyBmb3IgdHJlZXMuIElmIHlvdSBwYXNzIGl0IGEgUXVlcnlMaXN0IG9yIG90aGVyIGxpc3Qgb2YgdHJlZVxuICogaXRlbXMsIGl0IHdpbGwgc2V0IHRoZSBhY3RpdmUgaXRlbSwgZm9jdXMsIGhhbmRsZSBleHBhbnNpb24gYW5kIHR5cGVhaGVhZCBjb3JyZWN0bHkgd2hlblxuICoga2V5Ym9hcmQgZXZlbnRzIG9jY3VyLlxuICovXG5leHBvcnQgY2xhc3MgVHJlZUtleU1hbmFnZXI8VCBleHRlbmRzIFRyZWVLZXlNYW5hZ2VySXRlbT4gaW1wbGVtZW50cyBUcmVlS2V5TWFuYWdlclN0cmF0ZWd5PFQ+IHtcbiAgLyoqIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSAoZm9jdXNlZCkgaXRlbS4gKi9cbiAgcHJpdmF0ZSBfYWN0aXZlSXRlbUluZGV4ID0gLTE7XG4gIC8qKiBUaGUgY3VycmVudGx5IGFjdGl2ZSAoZm9jdXNlZCkgaXRlbS4gKi9cbiAgcHJpdmF0ZSBfYWN0aXZlSXRlbTogVCB8IG51bGwgPSBudWxsO1xuICAvKiogV2hldGhlciBvciBub3Qgd2UgYWN0aXZhdGUgdGhlIGl0ZW0gd2hlbiBpdCdzIGZvY3VzZWQuICovXG4gIHByaXZhdGUgX3Nob3VsZEFjdGl2YXRpb25Gb2xsb3dGb2N1cyA9IGZhbHNlO1xuICAvKipcbiAgICogVGhlIG9yaWVudGF0aW9uIHRoYXQgdGhlIHRyZWUgaXMgbGFpZCBvdXQgaW4uIEluIGBydGxgIG1vZGUsIHRoZSBiZWhhdmlvciBvZiBMZWZ0IGFuZFxuICAgKiBSaWdodCBhcnJvdyBhcmUgc3dpdGNoZWQuXG4gICAqL1xuICBwcml2YXRlIF9ob3Jpem9udGFsT3JpZW50YXRpb246ICdsdHInIHwgJ3J0bCcgPSAnbHRyJztcblxuICAvKipcbiAgICogUHJlZGljYXRlIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBhbiBpdGVtIHNob3VsZCBiZSBza2lwcGVkXG4gICAqIGJ5IHRoZSBrZXkgbWFuYWdlci5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgZG9lc24ndCBza2lwIGFueSBlbGVtZW50cyBpbiBvcmRlciB0byBrZWVwIHRyZWUgaXRlbXMgZm9jdXNhYmxlXG4gICAqIHdoZW4gZGlzYWJsZWQuIFRoaXMgYWxpZ25zIHdpdGggQVJJQSBndWlkZWxpbmVzOlxuICAgKiBodHRwczovL3d3dy53My5vcmcvV0FJL0FSSUEvYXBnL3ByYWN0aWNlcy9rZXlib2FyZC1pbnRlcmZhY2UvI2ZvY3VzYWJpbGl0eW9mZGlzYWJsZWRjb250cm9scy5cbiAgICovXG4gIHByaXZhdGUgX3NraXBQcmVkaWNhdGVGbiA9IChfaXRlbTogVCkgPT4gZmFsc2U7XG5cbiAgLyoqIEZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50IGl0ZW1zLiAqL1xuICBwcml2YXRlIF90cmFja0J5Rm46IChpdGVtOiBUKSA9PiB1bmtub3duID0gKGl0ZW06IFQpID0+IGl0ZW07XG5cbiAgLyoqIFN5bmNocm9ub3VzIGNhY2hlIG9mIHRoZSBpdGVtcyB0byBtYW5hZ2UuICovXG4gIHByaXZhdGUgX2l0ZW1zOiBUW10gPSBbXTtcblxuICBwcml2YXRlIF90eXBlYWhlYWQ/OiBUeXBlYWhlYWQ8VD47XG4gIHByaXZhdGUgX3R5cGVhaGVhZFN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcblxuICBwcml2YXRlIF9oYXNJbml0aWFsRm9jdXNlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2luaXRpYWxGb2N1cygpIHtcbiAgICBpZiAodGhpcy5faGFzSW5pdGlhbEZvY3VzZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2l0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBmb2N1c0luZGV4ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2l0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMuX3NraXBQcmVkaWNhdGVGbih0aGlzLl9pdGVtc1tpXSkgJiYgIXRoaXMuX2lzSXRlbURpc2FibGVkKHRoaXMuX2l0ZW1zW2ldKSkge1xuICAgICAgICBmb2N1c0luZGV4ID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5mb2N1c0l0ZW0oZm9jdXNJbmRleCk7XG4gICAgdGhpcy5faGFzSW5pdGlhbEZvY3VzZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBpdGVtcyBMaXN0IG9mIFRyZWVLZXlNYW5hZ2VyIG9wdGlvbnMuIENhbiBiZSBzeW5jaHJvbm91cyBvciBhc3luY2hyb25vdXMuXG4gICAqIEBwYXJhbSBjb25maWcgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zLiBCeSBkZWZhdWx0LCB1c2UgJ2x0cicgaG9yaXpvbnRhbCBvcmllbnRhdGlvbi4gQnlcbiAgICogZGVmYXVsdCwgZG8gbm90IHNraXAgYW55IG5vZGVzLiBCeSBkZWZhdWx0LCBrZXkgbWFuYWdlciBvbmx5IGNhbGxzIGBmb2N1c2AgbWV0aG9kIHdoZW4gaXRlbXNcbiAgICogYXJlIGZvY3VzZWQgYW5kIGRvZXMgbm90IGNhbGwgYGFjdGl2YXRlYC4gSWYgYHR5cGVhaGVhZERlZmF1bHRJbnRlcnZhbGAgaXMgYHRydWVgLCB1c2UgYVxuICAgKiBkZWZhdWx0IGludGVydmFsIG9mIDIwMG1zLlxuICAgKi9cbiAgY29uc3RydWN0b3IoaXRlbXM6IE9ic2VydmFibGU8VFtdPiB8IFF1ZXJ5TGlzdDxUPiB8IFRbXSwgY29uZmlnOiBUcmVlS2V5TWFuYWdlck9wdGlvbnM8VD4pIHtcbiAgICAvLyBXZSBhbGxvdyBmb3IgdGhlIGl0ZW1zIHRvIGJlIGFuIGFycmF5IG9yIE9ic2VydmFibGUgYmVjYXVzZSwgaW4gc29tZSBjYXNlcywgdGhlIGNvbnN1bWVyIG1heVxuICAgIC8vIG5vdCBoYXZlIGFjY2VzcyB0byBhIFF1ZXJ5TGlzdCBvZiB0aGUgaXRlbXMgdGhleSB3YW50IHRvIG1hbmFnZSAoZS5nLiB3aGVuIHRoZVxuICAgIC8vIGl0ZW1zIGFyZW4ndCBiZWluZyBjb2xsZWN0ZWQgdmlhIGBWaWV3Q2hpbGRyZW5gIG9yIGBDb250ZW50Q2hpbGRyZW5gKS5cbiAgICBpZiAoaXRlbXMgaW5zdGFuY2VvZiBRdWVyeUxpc3QpIHtcbiAgICAgIHRoaXMuX2l0ZW1zID0gaXRlbXMudG9BcnJheSgpO1xuICAgICAgaXRlbXMuY2hhbmdlcy5zdWJzY3JpYmUoKG5ld0l0ZW1zOiBRdWVyeUxpc3Q8VD4pID0+IHtcbiAgICAgICAgdGhpcy5faXRlbXMgPSBuZXdJdGVtcy50b0FycmF5KCk7XG4gICAgICAgIHRoaXMuX3R5cGVhaGVhZD8uc2V0SXRlbXModGhpcy5faXRlbXMpO1xuICAgICAgICB0aGlzLl91cGRhdGVBY3RpdmVJdGVtSW5kZXgodGhpcy5faXRlbXMpO1xuICAgICAgICB0aGlzLl9pbml0aWFsRm9jdXMoKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaXNPYnNlcnZhYmxlKGl0ZW1zKSkge1xuICAgICAgaXRlbXMuc3Vic2NyaWJlKG5ld0l0ZW1zID0+IHtcbiAgICAgICAgdGhpcy5faXRlbXMgPSBuZXdJdGVtcztcbiAgICAgICAgdGhpcy5fdHlwZWFoZWFkPy5zZXRJdGVtcyhuZXdJdGVtcyk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUFjdGl2ZUl0ZW1JbmRleChuZXdJdGVtcyk7XG4gICAgICAgIHRoaXMuX2luaXRpYWxGb2N1cygpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2l0ZW1zID0gaXRlbXM7XG4gICAgICB0aGlzLl9pbml0aWFsRm9jdXMoKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNvbmZpZy5zaG91bGRBY3RpdmF0aW9uRm9sbG93Rm9jdXMgPT09ICdib29sZWFuJykge1xuICAgICAgdGhpcy5fc2hvdWxkQWN0aXZhdGlvbkZvbGxvd0ZvY3VzID0gY29uZmlnLnNob3VsZEFjdGl2YXRpb25Gb2xsb3dGb2N1cztcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5ob3Jpem9udGFsT3JpZW50YXRpb24pIHtcbiAgICAgIHRoaXMuX2hvcml6b250YWxPcmllbnRhdGlvbiA9IGNvbmZpZy5ob3Jpem9udGFsT3JpZW50YXRpb247XG4gICAgfVxuICAgIGlmIChjb25maWcuc2tpcFByZWRpY2F0ZSkge1xuICAgICAgdGhpcy5fc2tpcFByZWRpY2F0ZUZuID0gY29uZmlnLnNraXBQcmVkaWNhdGU7XG4gICAgfVxuICAgIGlmIChjb25maWcudHJhY2tCeSkge1xuICAgICAgdGhpcy5fdHJhY2tCeUZuID0gY29uZmlnLnRyYWNrQnk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29uZmlnLnR5cGVBaGVhZERlYm91bmNlSW50ZXJ2YWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLl9zZXRUeXBlQWhlYWQoY29uZmlnLnR5cGVBaGVhZERlYm91bmNlSW50ZXJ2YWwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTdHJlYW0gdGhhdCBlbWl0cyBhbnkgdGltZSB0aGUgZm9jdXNlZCBpdGVtIGNoYW5nZXMuICovXG4gIHJlYWRvbmx5IGNoYW5nZSA9IG5ldyBTdWJqZWN0PFQgfCBudWxsPigpO1xuXG4gIC8qKiBDbGVhbnMgdXAgdGhlIGtleSBtYW5hZ2VyLiAqL1xuICBkZXN0cm95KCkge1xuICAgIHRoaXMuX3R5cGVhaGVhZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3R5cGVhaGVhZD8uZGVzdHJveSgpO1xuICAgIHRoaXMuY2hhbmdlLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIGtleWJvYXJkIGV2ZW50IG9uIHRoZSB0cmVlLlxuICAgKiBAcGFyYW0gZXZlbnQgS2V5Ym9hcmQgZXZlbnQgdGhhdCByZXByZXNlbnRzIHRoZSB1c2VyIGludGVyYWN0aW9uIHdpdGggdGhlIHRyZWUuXG4gICAqL1xuICBvbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCBrZXkgPSBldmVudC5rZXk7XG5cbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgY2FzZSAnVGFiJzpcbiAgICAgICAgLy8gUmV0dXJuIGVhcmx5IGhlcmUsIGluIG9yZGVyIHRvIGFsbG93IFRhYiB0byBhY3R1YWxseSB0YWIgb3V0IG9mIHRoZSB0cmVlXG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgdGhpcy5fZm9jdXNOZXh0SXRlbSgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgIHRoaXMuX2ZvY3VzUHJldmlvdXNJdGVtKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgICAgdGhpcy5faG9yaXpvbnRhbE9yaWVudGF0aW9uID09PSAncnRsJ1xuICAgICAgICAgID8gdGhpcy5fY29sbGFwc2VDdXJyZW50SXRlbSgpXG4gICAgICAgICAgOiB0aGlzLl9leHBhbmRDdXJyZW50SXRlbSgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgdGhpcy5faG9yaXpvbnRhbE9yaWVudGF0aW9uID09PSAncnRsJ1xuICAgICAgICAgID8gdGhpcy5fZXhwYW5kQ3VycmVudEl0ZW0oKVxuICAgICAgICAgIDogdGhpcy5fY29sbGFwc2VDdXJyZW50SXRlbSgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnSG9tZSc6XG4gICAgICAgIHRoaXMuX2ZvY3VzRmlyc3RJdGVtKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdFbmQnOlxuICAgICAgICB0aGlzLl9mb2N1c0xhc3RJdGVtKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICBjYXNlICcgJzpcbiAgICAgICAgdGhpcy5fYWN0aXZhdGVDdXJyZW50SXRlbSgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJyonKSB7XG4gICAgICAgICAgdGhpcy5fZXhwYW5kQWxsSXRlbXNBdEN1cnJlbnRJdGVtTGV2ZWwoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3R5cGVhaGVhZD8uaGFuZGxlS2V5KGV2ZW50KTtcbiAgICAgICAgLy8gUmV0dXJuIGhlcmUsIGluIG9yZGVyIHRvIGF2b2lkIHByZXZlbnRpbmcgdGhlIGRlZmF1bHQgYWN0aW9uIG9mIG5vbi1uYXZpZ2F0aW9uYWxcbiAgICAgICAgLy8ga2V5cyBvciByZXNldHRpbmcgdGhlIGJ1ZmZlciBvZiBwcmVzc2VkIGxldHRlcnMuXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZXNldCB0aGUgdHlwZWFoZWFkIHNpbmNlIHRoZSB1c2VyIGhhcyB1c2VkIGEgbmF2aWdhdGlvbmFsIGtleS5cbiAgICB0aGlzLl90eXBlYWhlYWQ/LnJlc2V0KCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIC8qKiBJbmRleCBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBpdGVtLiAqL1xuICBnZXRBY3RpdmVJdGVtSW5kZXgoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleDtcbiAgfVxuXG4gIC8qKiBUaGUgY3VycmVudGx5IGFjdGl2ZSBpdGVtLiAqL1xuICBnZXRBY3RpdmVJdGVtKCk6IFQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlSXRlbTtcbiAgfVxuXG4gIC8qKiBGb2N1cyB0aGUgZmlyc3QgYXZhaWxhYmxlIGl0ZW0uICovXG4gIHByaXZhdGUgX2ZvY3VzRmlyc3RJdGVtKCk6IHZvaWQge1xuICAgIHRoaXMuZm9jdXNJdGVtKHRoaXMuX2ZpbmROZXh0QXZhaWxhYmxlSXRlbUluZGV4KC0xKSk7XG4gIH1cblxuICAvKiogRm9jdXMgdGhlIGxhc3QgYXZhaWxhYmxlIGl0ZW0uICovXG4gIHByaXZhdGUgX2ZvY3VzTGFzdEl0ZW0oKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c0l0ZW0odGhpcy5fZmluZFByZXZpb3VzQXZhaWxhYmxlSXRlbUluZGV4KHRoaXMuX2l0ZW1zLmxlbmd0aCkpO1xuICB9XG5cbiAgLyoqIEZvY3VzIHRoZSBuZXh0IGF2YWlsYWJsZSBpdGVtLiAqL1xuICBwcml2YXRlIF9mb2N1c05leHRJdGVtKCk6IHZvaWQge1xuICAgIHRoaXMuZm9jdXNJdGVtKHRoaXMuX2ZpbmROZXh0QXZhaWxhYmxlSXRlbUluZGV4KHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCkpO1xuICB9XG5cbiAgLyoqIEZvY3VzIHRoZSBwcmV2aW91cyBhdmFpbGFibGUgaXRlbS4gKi9cbiAgcHJpdmF0ZSBfZm9jdXNQcmV2aW91c0l0ZW0oKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c0l0ZW0odGhpcy5fZmluZFByZXZpb3VzQXZhaWxhYmxlSXRlbUluZGV4KHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvY3VzIHRoZSBwcm92aWRlZCBpdGVtIGJ5IGluZGV4LlxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIGZvY3VzLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBBZGRpdGlvbmFsIGZvY3VzaW5nIG9wdGlvbnMuXG4gICAqL1xuICBmb2N1c0l0ZW0oaW5kZXg6IG51bWJlciwgb3B0aW9ucz86IHtlbWl0Q2hhbmdlRXZlbnQ/OiBib29sZWFufSk6IHZvaWQ7XG4gIGZvY3VzSXRlbShpdGVtOiBULCBvcHRpb25zPzoge2VtaXRDaGFuZ2VFdmVudD86IGJvb2xlYW59KTogdm9pZDtcbiAgZm9jdXNJdGVtKGl0ZW1PckluZGV4OiBudW1iZXIgfCBULCBvcHRpb25zPzoge2VtaXRDaGFuZ2VFdmVudD86IGJvb2xlYW59KTogdm9pZDtcbiAgZm9jdXNJdGVtKGl0ZW1PckluZGV4OiBudW1iZXIgfCBULCBvcHRpb25zOiB7ZW1pdENoYW5nZUV2ZW50PzogYm9vbGVhbn0gPSB7fSkge1xuICAgIC8vIFNldCBkZWZhdWx0IG9wdGlvbnNcbiAgICBvcHRpb25zLmVtaXRDaGFuZ2VFdmVudCA/Pz0gdHJ1ZTtcblxuICAgIGxldCBpbmRleCA9XG4gICAgICB0eXBlb2YgaXRlbU9ySW5kZXggPT09ICdudW1iZXInXG4gICAgICAgID8gaXRlbU9ySW5kZXhcbiAgICAgICAgOiB0aGlzLl9pdGVtcy5maW5kSW5kZXgoaXRlbSA9PiB0aGlzLl90cmFja0J5Rm4oaXRlbSkgPT09IHRoaXMuX3RyYWNrQnlGbihpdGVtT3JJbmRleCkpO1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5faXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGFjdGl2ZUl0ZW0gPSB0aGlzLl9pdGVtc1tpbmRleF07XG5cbiAgICAvLyBJZiB3ZSdyZSBqdXN0IHNldHRpbmcgdGhlIHNhbWUgaXRlbSwgZG9uJ3QgcmUtY2FsbCBhY3RpdmF0ZSBvciBmb2N1c1xuICAgIGlmIChcbiAgICAgIHRoaXMuX2FjdGl2ZUl0ZW0gIT09IG51bGwgJiZcbiAgICAgIHRoaXMuX3RyYWNrQnlGbihhY3RpdmVJdGVtKSA9PT0gdGhpcy5fdHJhY2tCeUZuKHRoaXMuX2FjdGl2ZUl0ZW0pXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlvdXNBY3RpdmVJdGVtID0gdGhpcy5fYWN0aXZlSXRlbTtcbiAgICB0aGlzLl9hY3RpdmVJdGVtID0gYWN0aXZlSXRlbSA/PyBudWxsO1xuICAgIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCA9IGluZGV4O1xuICAgIHRoaXMuX3R5cGVhaGVhZD8uc2V0Q3VycmVudFNlbGVjdGVkSXRlbUluZGV4KGluZGV4KTtcblxuICAgIHRoaXMuX2FjdGl2ZUl0ZW0/LmZvY3VzKCk7XG4gICAgcHJldmlvdXNBY3RpdmVJdGVtPy51bmZvY3VzKCk7XG5cbiAgICBpZiAob3B0aW9ucy5lbWl0Q2hhbmdlRXZlbnQpIHtcbiAgICAgIHRoaXMuY2hhbmdlLm5leHQodGhpcy5fYWN0aXZlSXRlbSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3Nob3VsZEFjdGl2YXRpb25Gb2xsb3dGb2N1cykge1xuICAgICAgdGhpcy5fYWN0aXZhdGVDdXJyZW50SXRlbSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZUFjdGl2ZUl0ZW1JbmRleChuZXdJdGVtczogVFtdKSB7XG4gICAgY29uc3QgYWN0aXZlSXRlbSA9IHRoaXMuX2FjdGl2ZUl0ZW07XG4gICAgaWYgKCFhY3RpdmVJdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3SW5kZXggPSBuZXdJdGVtcy5maW5kSW5kZXgoXG4gICAgICBpdGVtID0+IHRoaXMuX3RyYWNrQnlGbihpdGVtKSA9PT0gdGhpcy5fdHJhY2tCeUZuKGFjdGl2ZUl0ZW0pLFxuICAgICk7XG5cbiAgICBpZiAobmV3SW5kZXggPiAtMSAmJiBuZXdJbmRleCAhPT0gdGhpcy5fYWN0aXZlSXRlbUluZGV4KSB7XG4gICAgICB0aGlzLl9hY3RpdmVJdGVtSW5kZXggPSBuZXdJbmRleDtcbiAgICAgIHRoaXMuX3R5cGVhaGVhZD8uc2V0Q3VycmVudFNlbGVjdGVkSXRlbUluZGV4KG5ld0luZGV4KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRUeXBlQWhlYWQoZGVib3VuY2VJbnRlcnZhbDogbnVtYmVyIHwgYm9vbGVhbikge1xuICAgIHRoaXMuX3R5cGVhaGVhZCA9IG5ldyBUeXBlYWhlYWQodGhpcy5faXRlbXMsIHtcbiAgICAgIGRlYm91bmNlSW50ZXJ2YWw6IHR5cGVvZiBkZWJvdW5jZUludGVydmFsID09PSAnbnVtYmVyJyA/IGRlYm91bmNlSW50ZXJ2YWwgOiB1bmRlZmluZWQsXG4gICAgICBza2lwUHJlZGljYXRlOiBpdGVtID0+IHRoaXMuX3NraXBQcmVkaWNhdGVGbihpdGVtKSxcbiAgICB9KTtcblxuICAgIHRoaXMuX3R5cGVhaGVhZFN1YnNjcmlwdGlvbiA9IHRoaXMuX3R5cGVhaGVhZC5zZWxlY3RlZEl0ZW0uc3Vic2NyaWJlKGl0ZW0gPT4ge1xuICAgICAgdGhpcy5mb2N1c0l0ZW0oaXRlbSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9maW5kTmV4dEF2YWlsYWJsZUl0ZW1JbmRleChzdGFydGluZ0luZGV4OiBudW1iZXIpIHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnRpbmdJbmRleCArIDE7IGkgPCB0aGlzLl9pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCF0aGlzLl9za2lwUHJlZGljYXRlRm4odGhpcy5faXRlbXNbaV0pKSB7XG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RhcnRpbmdJbmRleDtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmRQcmV2aW91c0F2YWlsYWJsZUl0ZW1JbmRleChzdGFydGluZ0luZGV4OiBudW1iZXIpIHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnRpbmdJbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAoIXRoaXMuX3NraXBQcmVkaWNhdGVGbih0aGlzLl9pdGVtc1tpXSkpIHtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdGFydGluZ0luZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBpdGVtIGlzIGFscmVhZHkgZXhwYW5kZWQsIHdlIGNvbGxhcHNlIHRoZSBpdGVtLiBPdGhlcndpc2UsIHdlIHdpbGwgZm9jdXMgdGhlIHBhcmVudC5cbiAgICovXG4gIHByaXZhdGUgX2NvbGxhcHNlQ3VycmVudEl0ZW0oKSB7XG4gICAgaWYgKCF0aGlzLl9hY3RpdmVJdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzQ3VycmVudEl0ZW1FeHBhbmRlZCgpKSB7XG4gICAgICB0aGlzLl9hY3RpdmVJdGVtLmNvbGxhcHNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX2FjdGl2ZUl0ZW0uZ2V0UGFyZW50KCk7XG4gICAgICBpZiAoIXBhcmVudCB8fCB0aGlzLl9za2lwUHJlZGljYXRlRm4ocGFyZW50IGFzIFQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZm9jdXNJdGVtKHBhcmVudCBhcyBUKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIGl0ZW0gaXMgYWxyZWFkeSBjb2xsYXBzZWQsIHdlIGV4cGFuZCB0aGUgaXRlbS4gT3RoZXJ3aXNlLCB3ZSB3aWxsIGZvY3VzIHRoZSBmaXJzdCBjaGlsZC5cbiAgICovXG4gIHByaXZhdGUgX2V4cGFuZEN1cnJlbnRJdGVtKCkge1xuICAgIGlmICghdGhpcy5fYWN0aXZlSXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5faXNDdXJyZW50SXRlbUV4cGFuZGVkKCkpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZUl0ZW0uZXhwYW5kKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZXJjZU9ic2VydmFibGUodGhpcy5fYWN0aXZlSXRlbS5nZXRDaGlsZHJlbigpKVxuICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAuc3Vic2NyaWJlKGNoaWxkcmVuID0+IHtcbiAgICAgICAgICBjb25zdCBmaXJzdENoaWxkID0gY2hpbGRyZW4uZmluZChjaGlsZCA9PiAhdGhpcy5fc2tpcFByZWRpY2F0ZUZuKGNoaWxkIGFzIFQpKTtcbiAgICAgICAgICBpZiAoIWZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5mb2N1c0l0ZW0oZmlyc3RDaGlsZCBhcyBUKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaXNDdXJyZW50SXRlbUV4cGFuZGVkKCkge1xuICAgIGlmICghdGhpcy5fYWN0aXZlSXRlbSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIHRoaXMuX2FjdGl2ZUl0ZW0uaXNFeHBhbmRlZCA9PT0gJ2Jvb2xlYW4nXG4gICAgICA/IHRoaXMuX2FjdGl2ZUl0ZW0uaXNFeHBhbmRlZFxuICAgICAgOiB0aGlzLl9hY3RpdmVJdGVtLmlzRXhwYW5kZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzSXRlbURpc2FibGVkKGl0ZW06IFRyZWVLZXlNYW5hZ2VySXRlbSkge1xuICAgIHJldHVybiB0eXBlb2YgaXRlbS5pc0Rpc2FibGVkID09PSAnYm9vbGVhbicgPyBpdGVtLmlzRGlzYWJsZWQgOiBpdGVtLmlzRGlzYWJsZWQ/LigpO1xuICB9XG5cbiAgLyoqIEZvciBhbGwgaXRlbXMgdGhhdCBhcmUgdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIGN1cnJlbnQgaXRlbSwgd2UgZXhwYW5kIHRob3NlIGl0ZW1zLiAqL1xuICBwcml2YXRlIF9leHBhbmRBbGxJdGVtc0F0Q3VycmVudEl0ZW1MZXZlbCgpIHtcbiAgICBpZiAoIXRoaXMuX2FjdGl2ZUl0ZW0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl9hY3RpdmVJdGVtLmdldFBhcmVudCgpO1xuICAgIGxldCBpdGVtc1RvRXhwYW5kO1xuICAgIGlmICghcGFyZW50KSB7XG4gICAgICBpdGVtc1RvRXhwYW5kID0gb2JzZXJ2YWJsZU9mKHRoaXMuX2l0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0uZ2V0UGFyZW50KCkgPT09IG51bGwpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbXNUb0V4cGFuZCA9IGNvZXJjZU9ic2VydmFibGUocGFyZW50LmdldENoaWxkcmVuKCkpO1xuICAgIH1cblxuICAgIGl0ZW1zVG9FeHBhbmQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoaXRlbXMgPT4ge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgIGl0ZW0uZXhwYW5kKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9hY3RpdmF0ZUN1cnJlbnRJdGVtKCkge1xuICAgIHRoaXMuX2FjdGl2ZUl0ZW0/LmFjdGl2YXRlKCk7XG4gIH1cbn1cblxuLyoqIEBkb2NzLXByaXZhdGUgKi9cbmV4cG9ydCBmdW5jdGlvbiBUUkVFX0tFWV9NQU5BR0VSX0ZBQ1RPUlk8VCBleHRlbmRzIFRyZWVLZXlNYW5hZ2VySXRlbT4oKTogVHJlZUtleU1hbmFnZXJGYWN0b3J5PFQ+IHtcbiAgcmV0dXJuIChpdGVtcywgb3B0aW9ucykgPT4gbmV3IFRyZWVLZXlNYW5hZ2VyKGl0ZW1zLCBvcHRpb25zKTtcbn1cblxuLyoqIEluamVjdGlvbiB0b2tlbiB0aGF0IGRldGVybWluZXMgdGhlIGtleSBtYW5hZ2VyIHRvIHVzZS4gKi9cbmV4cG9ydCBjb25zdCBUUkVFX0tFWV9NQU5BR0VSID0gbmV3IEluamVjdGlvblRva2VuPFRyZWVLZXlNYW5hZ2VyRmFjdG9yeTxhbnk+PigndHJlZS1rZXktbWFuYWdlcicsIHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICBmYWN0b3J5OiBUUkVFX0tFWV9NQU5BR0VSX0ZBQ1RPUlksXG59KTtcblxuLyoqIEBkb2NzLXByaXZhdGUgKi9cbmV4cG9ydCBjb25zdCBUUkVFX0tFWV9NQU5BR0VSX0ZBQ1RPUllfUFJPVklERVIgPSB7XG4gIHByb3ZpZGU6IFRSRUVfS0VZX01BTkFHRVIsXG4gIHVzZUZhY3Rvcnk6IFRSRUVfS0VZX01BTkFHRVJfRkFDVE9SWSxcbn07XG4iXX0=
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google LLC All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
|
-
import { A, NINE, Z, ZERO } from '@angular/cdk/keycodes';
|
|
9
|
-
import { Subject } from 'rxjs';
|
|
10
|
-
import { debounceTime, filter, map, tap } from 'rxjs/operators';
|
|
11
|
-
const DEFAULT_TYPEAHEAD_DEBOUNCE_INTERVAL_MS = 200;
|
|
12
|
-
/**
|
|
13
|
-
* Selects items based on keyboard inputs. Implements the typeahead functionality of
|
|
14
|
-
* `role="listbox"` or `role="tree"` and other related roles.
|
|
15
|
-
*/
|
|
16
|
-
export class Typeahead {
|
|
17
|
-
constructor(initialItems, config) {
|
|
18
|
-
this._letterKeyStream = new Subject();
|
|
19
|
-
this._items = [];
|
|
20
|
-
this._selectedItemIndex = -1;
|
|
21
|
-
/** Buffer for the letters that the user has pressed */
|
|
22
|
-
this._pressedLetters = [];
|
|
23
|
-
this._selectedItem = new Subject();
|
|
24
|
-
this.selectedItem = this._selectedItem;
|
|
25
|
-
const typeAheadInterval = typeof config?.debounceInterval === 'number'
|
|
26
|
-
? config.debounceInterval
|
|
27
|
-
: DEFAULT_TYPEAHEAD_DEBOUNCE_INTERVAL_MS;
|
|
28
|
-
if (config?.skipPredicate) {
|
|
29
|
-
this._skipPredicateFn = config.skipPredicate;
|
|
30
|
-
}
|
|
31
|
-
if ((typeof ngDevMode === 'undefined' || ngDevMode) &&
|
|
32
|
-
initialItems.length &&
|
|
33
|
-
initialItems.some(item => typeof item.getLabel !== 'function')) {
|
|
34
|
-
throw new Error('KeyManager items in typeahead mode must implement the `getLabel` method.');
|
|
35
|
-
}
|
|
36
|
-
this.setItems(initialItems);
|
|
37
|
-
this._setupKeyHandler(typeAheadInterval);
|
|
38
|
-
}
|
|
39
|
-
destroy() {
|
|
40
|
-
this._pressedLetters = [];
|
|
41
|
-
this._letterKeyStream.complete();
|
|
42
|
-
this._selectedItem.complete();
|
|
43
|
-
}
|
|
44
|
-
setCurrentSelectedItemIndex(index) {
|
|
45
|
-
this._selectedItemIndex = index;
|
|
46
|
-
}
|
|
47
|
-
setItems(items) {
|
|
48
|
-
this._items = items;
|
|
49
|
-
}
|
|
50
|
-
handleKey(event) {
|
|
51
|
-
const keyCode = event.keyCode;
|
|
52
|
-
// Attempt to use the `event.key` which also maps it to the user's keyboard language,
|
|
53
|
-
// otherwise fall back to resolving alphanumeric characters via the keyCode.
|
|
54
|
-
if (event.key && event.key.length === 1) {
|
|
55
|
-
this._letterKeyStream.next(event.key.toLocaleUpperCase());
|
|
56
|
-
}
|
|
57
|
-
else if ((keyCode >= A && keyCode <= Z) || (keyCode >= ZERO && keyCode <= NINE)) {
|
|
58
|
-
this._letterKeyStream.next(String.fromCharCode(keyCode));
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
/** Gets whether the user is currently typing into the manager using the typeahead feature. */
|
|
62
|
-
isTyping() {
|
|
63
|
-
return this._pressedLetters.length > 0;
|
|
64
|
-
}
|
|
65
|
-
/** Resets the currently stored sequence of typed letters. */
|
|
66
|
-
reset() {
|
|
67
|
-
this._pressedLetters = [];
|
|
68
|
-
}
|
|
69
|
-
_setupKeyHandler(typeAheadInterval) {
|
|
70
|
-
// Debounce the presses of non-navigational keys, collect the ones that correspond to letters
|
|
71
|
-
// and convert those letters back into a string. Afterwards find the first item that starts
|
|
72
|
-
// with that string and select it.
|
|
73
|
-
this._letterKeyStream
|
|
74
|
-
.pipe(tap(letter => this._pressedLetters.push(letter)), debounceTime(typeAheadInterval), filter(() => this._pressedLetters.length > 0), map(() => this._pressedLetters.join('').toLocaleUpperCase()))
|
|
75
|
-
.subscribe(inputString => {
|
|
76
|
-
// Start at 1 because we want to start searching at the item immediately
|
|
77
|
-
// following the current active item.
|
|
78
|
-
for (let i = 1; i < this._items.length + 1; i++) {
|
|
79
|
-
const index = (this._selectedItemIndex + i) % this._items.length;
|
|
80
|
-
const item = this._items[index];
|
|
81
|
-
if (!this._skipPredicateFn?.(item) &&
|
|
82
|
-
item.getLabel?.().toLocaleUpperCase().trim().indexOf(inputString) === 0) {
|
|
83
|
-
this._selectedItem.next(item);
|
|
84
|
-
break;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
this._pressedLetters = [];
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWFoZWFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2Nkay9hMTF5L2tleS1tYW5hZ2VyL3R5cGVhaGVhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDdkQsT0FBTyxFQUFDLE9BQU8sRUFBYSxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUQsTUFBTSxzQ0FBc0MsR0FBRyxHQUFHLENBQUM7QUFXbkQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLFNBQVM7SUFhcEIsWUFBWSxZQUEwQixFQUFFLE1BQTJCO1FBWmxELHFCQUFnQixHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7UUFDbEQsV0FBTSxHQUFpQixFQUFFLENBQUM7UUFDMUIsdUJBQWtCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFaEMsdURBQXVEO1FBQy9DLG9CQUFlLEdBQWEsRUFBRSxDQUFDO1FBSXRCLGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQUssQ0FBQztRQUN6QyxpQkFBWSxHQUFrQixJQUFJLENBQUMsYUFBYSxDQUFDO1FBR3hELE1BQU0saUJBQWlCLEdBQ3JCLE9BQU8sTUFBTSxFQUFFLGdCQUFnQixLQUFLLFFBQVE7WUFDMUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0I7WUFDekIsQ0FBQyxDQUFDLHNDQUFzQyxDQUFDO1FBRTdDLElBQUksTUFBTSxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO1FBQy9DLENBQUM7UUFFRCxJQUNFLENBQUMsT0FBTyxTQUFTLEtBQUssV0FB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LE1BQU0sQ0FBQztnQkFDakUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFaEMsSUFDRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLElBQUksQ0FBQztvQkFDOUIsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUN2RSxDQUFDO29CQUNELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM5QixNQUFNO2dCQUNSLENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtBLCBOSU5FLCBaLCBaRVJPfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHtTdWJqZWN0LCBPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBmaWx0ZXIsIG1hcCwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmNvbnN0IERFRkFVTFRfVFlQRUFIRUFEX0RFQk9VTkNFX0lOVEVSVkFMX01TID0gMjAwO1xuXG5pbnRlcmZhY2UgVHlwZWFoZWFkSXRlbSB7XG4gIGdldExhYmVsPygpOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUeXBlYWhlYWRDb25maWc8VD4ge1xuICBkZWJvdW5jZUludGVydmFsPzogbnVtYmVyO1xuICBza2lwUHJlZGljYXRlPzogKGl0ZW06IFQpID0+IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU2VsZWN0cyBpdGVtcyBiYXNlZCBvbiBrZXlib2FyZCBpbnB1dHMuIEltcGxlbWVudHMgdGhlIHR5cGVhaGVhZCBmdW5jdGlvbmFsaXR5IG9mXG4gKiBgcm9sZT1cImxpc3Rib3hcImAgb3IgYHJvbGU9XCJ0cmVlXCJgIGFuZCBvdGhlciByZWxhdGVkIHJvbGVzLlxuICovXG5leHBvcnQgY2xhc3MgVHlwZWFoZWFkPFQgZXh0ZW5kcyBUeXBlYWhlYWRJdGVtPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2xldHRlcktleVN0cmVhbSA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBfaXRlbXM6IHJlYWRvbmx5IFRbXSA9IFtdO1xuICBwcml2YXRlIF9zZWxlY3RlZEl0ZW1JbmRleCA9IC0xO1xuXG4gIC8qKiBCdWZmZXIgZm9yIHRoZSBsZXR0ZXJzIHRoYXQgdGhlIHVzZXIgaGFzIHByZXNzZWQgKi9cbiAgcHJpdmF0ZSBfcHJlc3NlZExldHRlcnM6IHN0cmluZ1tdID0gW107XG5cbiAgcHJpdmF0ZSBfc2tpcFByZWRpY2F0ZUZuPzogKGl0ZW06IFQpID0+IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc2VsZWN0ZWRJdGVtID0gbmV3IFN1YmplY3Q8VD4oKTtcbiAgcmVhZG9ubHkgc2VsZWN0ZWRJdGVtOiBPYnNlcnZhYmxlPFQ+ID0gdGhpcy5fc2VsZWN0ZWRJdGVtO1xuXG4gIGNvbnN0cnVjdG9yKGluaXRpYWxJdGVtczogcmVhZG9ubHkgVFtdLCBjb25maWc/OiBUeXBlYWhlYWRDb25maWc8VD4pIHtcbiAgICBjb25zdCB0eXBlQWhlYWRJbnRlcnZhbCA9XG4gICAgICB0eXBlb2YgY29uZmlnPy5kZWJvdW5jZUludGVydmFsID09PSAnbnVtYmVyJ1xuICAgICAgICA/IGNvbmZpZy5kZWJvdW5jZUludGVydmFsXG4gICAgICAgIDogREVGQVVMVF9UWVBFQUhFQURfREVCT1VOQ0VfSU5URVJWQUxfTVM7XG5cbiAgICBpZiAoY29uZmlnPy5za2lwUHJlZGljYXRlKSB7XG4gICAgICB0aGlzLl9za2lwUHJlZGljYXRlRm4gPSBjb25maWcuc2tpcFByZWRpY2F0ZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSAmJlxuICAgICAgaW5pdGlhbEl0ZW1zLmxlbmd0aCAmJlxuICAgICAgaW5pdGlhbEl0ZW1zLnNvbWUoaXRlbSA9PiB0eXBlb2YgaXRlbS5nZXRMYWJlbCAhPT0gJ2Z1bmN0aW9uJylcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignS2V5TWFuYWdlciBpdGVtcyBpbiB0eXBlYWhlYWQgbW9kZSBtdXN0IGltcGxlbWVudCB0aGUgYGdldExhYmVsYCBtZXRob2QuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRJdGVtcyhpbml0aWFsSXRlbXMpO1xuICAgIHRoaXMuX3NldHVwS2V5SGFuZGxlcih0eXBlQWhlYWRJbnRlcnZhbCk7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuX3ByZXNzZWRMZXR0ZXJzID0gW107XG4gICAgdGhpcy5fbGV0dGVyS2V5U3RyZWFtLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fc2VsZWN0ZWRJdGVtLmNvbXBsZXRlKCk7XG4gIH1cblxuICBzZXRDdXJyZW50U2VsZWN0ZWRJdGVtSW5kZXgoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuX3NlbGVjdGVkSXRlbUluZGV4ID0gaW5kZXg7XG4gIH1cblxuICBzZXRJdGVtcyhpdGVtczogcmVhZG9ubHkgVFtdKSB7XG4gICAgdGhpcy5faXRlbXMgPSBpdGVtcztcbiAgfVxuXG4gIGhhbmRsZUtleShldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGtleUNvZGUgPSBldmVudC5rZXlDb2RlO1xuXG4gICAgLy8gQXR0ZW1wdCB0byB1c2UgdGhlIGBldmVudC5rZXlgIHdoaWNoIGFsc28gbWFwcyBpdCB0byB0aGUgdXNlcidzIGtleWJvYXJkIGxhbmd1YWdlLFxuICAgIC8vIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gcmVzb2x2aW5nIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIHZpYSB0aGUga2V5Q29kZS5cbiAgICBpZiAoZXZlbnQua2V5ICYmIGV2ZW50LmtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRoaXMuX2xldHRlcktleVN0cmVhbS5uZXh0KGV2ZW50LmtleS50b0xvY2FsZVVwcGVyQ2FzZSgpKTtcbiAgICB9IGVsc2UgaWYgKChrZXlDb2RlID49IEEgJiYga2V5Q29kZSA8PSBaKSB8fCAoa2V5Q29kZSA+PSBaRVJPICYmIGtleUNvZGUgPD0gTklORSkpIHtcbiAgICAgIHRoaXMuX2xldHRlcktleVN0cmVhbS5uZXh0KFN0cmluZy5mcm9tQ2hhckNvZGUoa2V5Q29kZSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBHZXRzIHdoZXRoZXIgdGhlIHVzZXIgaXMgY3VycmVudGx5IHR5cGluZyBpbnRvIHRoZSBtYW5hZ2VyIHVzaW5nIHRoZSB0eXBlYWhlYWQgZmVhdHVyZS4gKi9cbiAgaXNUeXBpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXNzZWRMZXR0ZXJzLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKiogUmVzZXRzIHRoZSBjdXJyZW50bHkgc3RvcmVkIHNlcXVlbmNlIG9mIHR5cGVkIGxldHRlcnMuICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX3ByZXNzZWRMZXR0ZXJzID0gW107XG4gIH1cblxuICBwcml2YXRlIF9zZXR1cEtleUhhbmRsZXIodHlwZUFoZWFkSW50ZXJ2YWw6IG51bWJlcikge1xuICAgIC8vIERlYm91bmNlIHRoZSBwcmVzc2VzIG9mIG5vbi1uYXZpZ2F0aW9uYWwga2V5cywgY29sbGVjdCB0aGUgb25lcyB0aGF0IGNvcnJlc3BvbmQgdG8gbGV0dGVyc1xuICAgIC8vIGFuZCBjb252ZXJ0IHRob3NlIGxldHRlcnMgYmFjayBpbnRvIGEgc3RyaW5nLiBBZnRlcndhcmRzIGZpbmQgdGhlIGZpcnN0IGl0ZW0gdGhhdCBzdGFydHNcbiAgICAvLyB3aXRoIHRoYXQgc3RyaW5nIGFuZCBzZWxlY3QgaXQuXG4gICAgdGhpcy5fbGV0dGVyS2V5U3RyZWFtXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKGxldHRlciA9PiB0aGlzLl9wcmVzc2VkTGV0dGVycy5wdXNoKGxldHRlcikpLFxuICAgICAgICBkZWJvdW5jZVRpbWUodHlwZUFoZWFkSW50ZXJ2YWwpLFxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5fcHJlc3NlZExldHRlcnMubGVuZ3RoID4gMCksXG4gICAgICAgIG1hcCgoKSA9PiB0aGlzLl9wcmVzc2VkTGV0dGVycy5qb2luKCcnKS50b0xvY2FsZVVwcGVyQ2FzZSgpKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoaW5wdXRTdHJpbmcgPT4ge1xuICAgICAgICAvLyBTdGFydCBhdCAxIGJlY2F1c2Ugd2Ugd2FudCB0byBzdGFydCBzZWFyY2hpbmcgYXQgdGhlIGl0ZW0gaW1tZWRpYXRlbHlcbiAgICAgICAgLy8gZm9sbG93aW5nIHRoZSBjdXJyZW50IGFjdGl2ZSBpdGVtLlxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuX2l0ZW1zLmxlbmd0aCArIDE7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gKHRoaXMuX3NlbGVjdGVkSXRlbUluZGV4ICsgaSkgJSB0aGlzLl9pdGVtcy5sZW5ndGg7XG4gICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2l0ZW1zW2luZGV4XTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICF0aGlzLl9za2lwUHJlZGljYXRlRm4/LihpdGVtKSAmJlxuICAgICAgICAgICAgaXRlbS5nZXRMYWJlbD8uKCkudG9Mb2NhbGVVcHBlckNhc2UoKS50cmltKCkuaW5kZXhPZihpbnB1dFN0cmluZykgPT09IDBcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkSXRlbS5uZXh0KGl0ZW0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcHJlc3NlZExldHRlcnMgPSBbXTtcbiAgICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google LLC All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
|
-
import { InjectionToken } from '@angular/core';
|
|
9
|
-
export const LIVE_ANNOUNCER_ELEMENT_TOKEN = new InjectionToken('liveAnnouncerElement', {
|
|
10
|
-
providedIn: 'root',
|
|
11
|
-
factory: LIVE_ANNOUNCER_ELEMENT_TOKEN_FACTORY,
|
|
12
|
-
});
|
|
13
|
-
/** @docs-private */
|
|
14
|
-
export function LIVE_ANNOUNCER_ELEMENT_TOKEN_FACTORY() {
|
|
15
|
-
return null;
|
|
16
|
-
}
|
|
17
|
-
/** Injection token that can be used to configure the default options for the LiveAnnouncer. */
|
|
18
|
-
export const LIVE_ANNOUNCER_DEFAULT_OPTIONS = new InjectionToken('LIVE_ANNOUNCER_DEFAULT_OPTIONS');
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl2ZS1hbm5vdW5jZXItdG9rZW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2Nkay9hMTF5L2xpdmUtYW5ub3VuY2VyL2xpdmUtYW5ub3VuY2VyLXRva2Vucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBUTdDLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLElBQUksY0FBYyxDQUM1RCxzQkFBc0IsRUFDdEI7SUFDRSxVQUFVLEVBQUUsTUFBTTtJQUNsQixPQUFPLEVBQUUsb0NBQW9DO0NBQzlDLENBQ0YsQ0FBQztBQUVGLG9CQUFvQjtBQUNwQixNQUFNLFVBQVUsb0NBQW9DO0lBQ2xELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQVdELCtGQUErRjtBQUMvRixNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLGNBQWMsQ0FDOUQsZ0NBQWdDLENBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtJbmplY3Rpb25Ub2tlbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8vIFRoZSB0b2tlbnMgZm9yIHRoZSBsaXZlIGFubm91bmNlciBhcmUgZGVmaW5lZCBpbiBhIHNlcGFyYXRlIGZpbGUgZnJvbSBMaXZlQW5ub3VuY2VyXG4vLyBhcyBhIHdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzIyNTU5XG5cbi8qKiBQb3NzaWJsZSBwb2xpdGVuZXNzIGxldmVscy4gKi9cbmV4cG9ydCB0eXBlIEFyaWFMaXZlUG9saXRlbmVzcyA9ICdvZmYnIHwgJ3BvbGl0ZScgfCAnYXNzZXJ0aXZlJztcblxuZXhwb3J0IGNvbnN0IExJVkVfQU5OT1VOQ0VSX0VMRU1FTlRfVE9LRU4gPSBuZXcgSW5qZWN0aW9uVG9rZW48SFRNTEVsZW1lbnQgfCBudWxsPihcbiAgJ2xpdmVBbm5vdW5jZXJFbGVtZW50JyxcbiAge1xuICAgIHByb3ZpZGVkSW46ICdyb290JyxcbiAgICBmYWN0b3J5OiBMSVZFX0FOTk9VTkNFUl9FTEVNRU5UX1RPS0VOX0ZBQ1RPUlksXG4gIH0sXG4pO1xuXG4vKiogQGRvY3MtcHJpdmF0ZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIExJVkVfQU5OT1VOQ0VSX0VMRU1FTlRfVE9LRU5fRkFDVE9SWSgpOiBudWxsIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBPYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIGRlZmF1bHQgb3B0aW9ucyBmb3IgdGhlIExpdmVBbm5vdW5jZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIExpdmVBbm5vdW5jZXJEZWZhdWx0T3B0aW9ucyB7XG4gIC8qKiBEZWZhdWx0IHBvbGl0ZW5lc3MgZm9yIHRoZSBhbm5vdW5jZW1lbnRzLiAqL1xuICBwb2xpdGVuZXNzPzogQXJpYUxpdmVQb2xpdGVuZXNzO1xuXG4gIC8qKiBEZWZhdWx0IGR1cmF0aW9uIGZvciB0aGUgYW5ub3VuY2VtZW50IG1lc3NhZ2VzLiAqL1xuICBkdXJhdGlvbj86IG51bWJlcjtcbn1cblxuLyoqIEluamVjdGlvbiB0b2tlbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgZGVmYXVsdCBvcHRpb25zIGZvciB0aGUgTGl2ZUFubm91bmNlci4gKi9cbmV4cG9ydCBjb25zdCBMSVZFX0FOTk9VTkNFUl9ERUZBVUxUX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48TGl2ZUFubm91bmNlckRlZmF1bHRPcHRpb25zPihcbiAgJ0xJVkVfQU5OT1VOQ0VSX0RFRkFVTFRfT1BUSU9OUycsXG4pO1xuIl19
|