@angular/cdk 18.2.0-next.0 → 18.2.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.
Files changed (164) hide show
  1. package/a11y/index.d.ts +283 -2
  2. package/coercion/private/index.d.ts +9 -0
  3. package/esm2022/a11y/a11y-module.mjs +5 -5
  4. package/esm2022/a11y/aria-describer/aria-describer.mjs +4 -4
  5. package/esm2022/a11y/focus-monitor/focus-monitor.mjs +7 -7
  6. package/esm2022/a11y/focus-trap/configurable-focus-trap-factory.mjs +4 -4
  7. package/esm2022/a11y/focus-trap/focus-trap-manager.mjs +4 -4
  8. package/esm2022/a11y/focus-trap/focus-trap.mjs +7 -7
  9. package/esm2022/a11y/high-contrast-mode/high-contrast-mode-detector.mjs +4 -4
  10. package/esm2022/a11y/input-modality/input-modality-detector.mjs +4 -4
  11. package/esm2022/a11y/interactivity-checker/interactivity-checker.mjs +4 -4
  12. package/esm2022/a11y/key-manager/list-key-manager.mjs +18 -38
  13. package/esm2022/a11y/key-manager/noop-tree-key-manager.mjs +94 -0
  14. package/esm2022/a11y/key-manager/tree-key-manager-strategy.mjs +9 -0
  15. package/esm2022/a11y/key-manager/tree-key-manager.mjs +345 -0
  16. package/esm2022/a11y/key-manager/typeahead.mjs +91 -0
  17. package/esm2022/a11y/live-announcer/live-announcer.mjs +7 -7
  18. package/esm2022/a11y/public-api.mjs +4 -1
  19. package/esm2022/accordion/accordion-item.mjs +4 -4
  20. package/esm2022/accordion/accordion-module.mjs +5 -5
  21. package/esm2022/accordion/accordion.mjs +4 -4
  22. package/esm2022/bidi/bidi-module.mjs +5 -5
  23. package/esm2022/bidi/dir.mjs +4 -4
  24. package/esm2022/bidi/directionality.mjs +4 -4
  25. package/esm2022/clipboard/clipboard-module.mjs +5 -5
  26. package/esm2022/clipboard/clipboard.mjs +4 -4
  27. package/esm2022/clipboard/copy-to-clipboard.mjs +4 -4
  28. package/esm2022/coercion/private/index.mjs +9 -0
  29. package/esm2022/coercion/private/observable.mjs +19 -0
  30. package/esm2022/coercion/private/private_public_index.mjs +5 -0
  31. package/esm2022/collections/unique-selection-dispatcher.mjs +4 -4
  32. package/esm2022/dialog/dialog-container.mjs +4 -4
  33. package/esm2022/dialog/dialog-module.mjs +5 -5
  34. package/esm2022/dialog/dialog.mjs +4 -4
  35. package/esm2022/drag-drop/directives/drag-handle.mjs +4 -4
  36. package/esm2022/drag-drop/directives/drag-placeholder.mjs +4 -4
  37. package/esm2022/drag-drop/directives/drag-preview.mjs +4 -4
  38. package/esm2022/drag-drop/directives/drag.mjs +4 -4
  39. package/esm2022/drag-drop/directives/drop-list-group.mjs +4 -4
  40. package/esm2022/drag-drop/directives/drop-list.mjs +4 -4
  41. package/esm2022/drag-drop/drag-drop-module.mjs +5 -5
  42. package/esm2022/drag-drop/drag-drop-registry.mjs +7 -7
  43. package/esm2022/drag-drop/drag-drop.mjs +4 -4
  44. package/esm2022/drag-drop/drag-ref.mjs +4 -2
  45. package/esm2022/drag-drop/preview-ref.mjs +4 -1
  46. package/esm2022/layout/breakpoints-observer.mjs +4 -4
  47. package/esm2022/layout/layout-module.mjs +5 -5
  48. package/esm2022/layout/media-matcher.mjs +4 -4
  49. package/esm2022/listbox/listbox-module.mjs +5 -5
  50. package/esm2022/listbox/listbox.mjs +7 -7
  51. package/esm2022/menu/context-menu-trigger.mjs +7 -7
  52. package/esm2022/menu/menu-aim.mjs +7 -7
  53. package/esm2022/menu/menu-bar.mjs +4 -4
  54. package/esm2022/menu/menu-base.mjs +4 -4
  55. package/esm2022/menu/menu-group.mjs +4 -4
  56. package/esm2022/menu/menu-item-checkbox.mjs +4 -4
  57. package/esm2022/menu/menu-item-radio.mjs +4 -4
  58. package/esm2022/menu/menu-item-selectable.mjs +4 -4
  59. package/esm2022/menu/menu-item.mjs +4 -4
  60. package/esm2022/menu/menu-module.mjs +5 -5
  61. package/esm2022/menu/menu-stack.mjs +4 -4
  62. package/esm2022/menu/menu-trigger-base.mjs +4 -4
  63. package/esm2022/menu/menu-trigger.mjs +4 -4
  64. package/esm2022/menu/menu.mjs +4 -4
  65. package/esm2022/observers/observe-content.mjs +14 -14
  66. package/esm2022/observers/private/shared-resize-observer.mjs +4 -4
  67. package/esm2022/overlay/dispatchers/base-overlay-dispatcher.mjs +4 -4
  68. package/esm2022/overlay/dispatchers/overlay-keyboard-dispatcher.mjs +4 -4
  69. package/esm2022/overlay/dispatchers/overlay-outside-click-dispatcher.mjs +4 -4
  70. package/esm2022/overlay/fullscreen-overlay-container.mjs +4 -4
  71. package/esm2022/overlay/overlay-container.mjs +4 -4
  72. package/esm2022/overlay/overlay-directives.mjs +7 -7
  73. package/esm2022/overlay/overlay-module.mjs +5 -5
  74. package/esm2022/overlay/overlay.mjs +4 -4
  75. package/esm2022/overlay/position/overlay-position-builder.mjs +4 -4
  76. package/esm2022/overlay/scroll/scroll-strategy-options.mjs +4 -4
  77. package/esm2022/platform/platform-module.mjs +5 -5
  78. package/esm2022/platform/platform.mjs +4 -4
  79. package/esm2022/portal/portal-directives.mjs +17 -17
  80. package/esm2022/scrolling/fixed-size-virtual-scroll.mjs +4 -4
  81. package/esm2022/scrolling/scroll-dispatcher.mjs +4 -4
  82. package/esm2022/scrolling/scrollable.mjs +4 -4
  83. package/esm2022/scrolling/scrolling-module.mjs +9 -9
  84. package/esm2022/scrolling/viewport-ruler.mjs +4 -4
  85. package/esm2022/scrolling/virtual-for-of.mjs +4 -4
  86. package/esm2022/scrolling/virtual-scroll-viewport.mjs +4 -4
  87. package/esm2022/scrolling/virtual-scrollable-element.mjs +4 -4
  88. package/esm2022/scrolling/virtual-scrollable-window.mjs +4 -4
  89. package/esm2022/scrolling/virtual-scrollable.mjs +4 -4
  90. package/esm2022/stepper/step-header.mjs +4 -4
  91. package/esm2022/stepper/step-label.mjs +4 -4
  92. package/esm2022/stepper/stepper-button.mjs +7 -7
  93. package/esm2022/stepper/stepper-module.mjs +5 -5
  94. package/esm2022/stepper/stepper.mjs +7 -7
  95. package/esm2022/table/cell.mjs +22 -22
  96. package/esm2022/table/coalesced-style-scheduler.mjs +4 -4
  97. package/esm2022/table/row.mjs +28 -28
  98. package/esm2022/table/table-module.mjs +5 -5
  99. package/esm2022/table/table.mjs +19 -19
  100. package/esm2022/table/text-column.mjs +4 -4
  101. package/esm2022/text-field/autofill.mjs +7 -7
  102. package/esm2022/text-field/autosize.mjs +4 -4
  103. package/esm2022/text-field/text-field-module.mjs +5 -5
  104. package/esm2022/tree/control/base-tree-control.mjs +7 -2
  105. package/esm2022/tree/control/flat-tree-control.mjs +8 -2
  106. package/esm2022/tree/control/nested-tree-control.mjs +11 -2
  107. package/esm2022/tree/control/tree-control.mjs +1 -1
  108. package/esm2022/tree/nested-node.mjs +9 -18
  109. package/esm2022/tree/node.mjs +4 -4
  110. package/esm2022/tree/outlet.mjs +4 -4
  111. package/esm2022/tree/padding.mjs +5 -7
  112. package/esm2022/tree/toggle.mjs +17 -10
  113. package/esm2022/tree/tree-errors.mjs +7 -6
  114. package/esm2022/tree/tree-module.mjs +5 -5
  115. package/esm2022/tree/tree.mjs +810 -70
  116. package/esm2022/version.mjs +1 -1
  117. package/fesm2022/a11y.mjs +560 -80
  118. package/fesm2022/a11y.mjs.map +1 -1
  119. package/fesm2022/accordion.mjs +10 -10
  120. package/fesm2022/accordion.mjs.map +1 -1
  121. package/fesm2022/bidi.mjs +10 -10
  122. package/fesm2022/bidi.mjs.map +1 -1
  123. package/fesm2022/cdk.mjs +1 -1
  124. package/fesm2022/cdk.mjs.map +1 -1
  125. package/fesm2022/clipboard.mjs +10 -10
  126. package/fesm2022/clipboard.mjs.map +1 -1
  127. package/fesm2022/coercion/private.mjs +19 -0
  128. package/fesm2022/coercion/private.mjs.map +1 -0
  129. package/fesm2022/collections.mjs +3 -3
  130. package/fesm2022/collections.mjs.map +1 -1
  131. package/fesm2022/dialog.mjs +10 -10
  132. package/fesm2022/dialog.mjs.map +1 -1
  133. package/fesm2022/drag-drop.mjs +37 -32
  134. package/fesm2022/drag-drop.mjs.map +1 -1
  135. package/fesm2022/layout.mjs +10 -10
  136. package/fesm2022/layout.mjs.map +1 -1
  137. package/fesm2022/listbox.mjs +10 -10
  138. package/fesm2022/listbox.mjs.map +1 -1
  139. package/fesm2022/menu.mjs +49 -49
  140. package/fesm2022/menu.mjs.map +1 -1
  141. package/fesm2022/observers/private.mjs +3 -3
  142. package/fesm2022/observers/private.mjs.map +1 -1
  143. package/fesm2022/observers.mjs +13 -13
  144. package/fesm2022/observers.mjs.map +1 -1
  145. package/fesm2022/overlay.mjs +34 -34
  146. package/fesm2022/overlay.mjs.map +1 -1
  147. package/fesm2022/platform.mjs +7 -7
  148. package/fesm2022/platform.mjs.map +1 -1
  149. package/fesm2022/portal.mjs +16 -16
  150. package/fesm2022/portal.mjs.map +1 -1
  151. package/fesm2022/scrolling.mjs +35 -35
  152. package/fesm2022/scrolling.mjs.map +1 -1
  153. package/fesm2022/stepper.mjs +22 -22
  154. package/fesm2022/stepper.mjs.map +1 -1
  155. package/fesm2022/table.mjs +76 -76
  156. package/fesm2022/table.mjs.map +1 -1
  157. package/fesm2022/text-field.mjs +13 -13
  158. package/fesm2022/text-field.mjs.map +1 -1
  159. package/fesm2022/tree.mjs +868 -118
  160. package/fesm2022/tree.mjs.map +1 -1
  161. package/package.json +7 -1
  162. package/schematics/ng-add/index.js +1 -1
  163. package/schematics/ng-add/index.mjs +1 -1
  164. package/tree/index.d.ts +303 -25
@@ -0,0 +1,94 @@
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 { Subject } from 'rxjs';
9
+ import { TREE_KEY_MANAGER } from './tree-key-manager';
10
+ // NoopTreeKeyManager is a "noop" implementation of TreeKeyMangerStrategy. Methods are noops. Does
11
+ // not emit to streams.
12
+ //
13
+ // Used for applications built before TreeKeyManager to opt-out of TreeKeyManager and revert to
14
+ // legacy behavior.
15
+ /**
16
+ * @docs-private
17
+ *
18
+ * Opt-out of Tree of key manager behavior.
19
+ *
20
+ * When provided, Tree has same focus management behavior as before TreeKeyManager was introduced.
21
+ * - Tree does not respond to keyboard interaction
22
+ * - Tree node allows tabindex to be set by Input binding
23
+ * - Tree node allows tabindex to be set by attribute binding
24
+ *
25
+ * @deprecated NoopTreeKeyManager deprecated. Use TreeKeyManager or inject a
26
+ * TreeKeyManagerStrategy instead. To be removed in a future version.
27
+ *
28
+ * @breaking-change 21.0.0
29
+ */
30
+ export class NoopTreeKeyManager {
31
+ constructor() {
32
+ this._isNoopTreeKeyManager = true;
33
+ // Provide change as required by TreeKeyManagerStrategy. NoopTreeKeyManager is a "noop"
34
+ // implementation that does not emit to streams.
35
+ this.change = new Subject();
36
+ }
37
+ destroy() {
38
+ this.change.complete();
39
+ }
40
+ onKeydown() {
41
+ // noop
42
+ }
43
+ getActiveItemIndex() {
44
+ // Always return null. NoopTreeKeyManager is a "noop" implementation that does not maintain
45
+ // the active item.
46
+ return null;
47
+ }
48
+ getActiveItem() {
49
+ // Always return null. NoopTreeKeyManager is a "noop" implementation that does not maintain
50
+ // the active item.
51
+ return null;
52
+ }
53
+ focusItem() {
54
+ // noop
55
+ }
56
+ }
57
+ /**
58
+ * @docs-private
59
+ *
60
+ * Opt-out of Tree of key manager behavior.
61
+ *
62
+ * When provided, Tree has same focus management behavior as before TreeKeyManager was introduced.
63
+ * - Tree does not respond to keyboard interaction
64
+ * - Tree node allows tabindex to be set by Input binding
65
+ * - Tree node allows tabindex to be set by attribute binding
66
+ *
67
+ * @deprecated NoopTreeKeyManager deprecated. Use TreeKeyManager or inject a
68
+ * TreeKeyManagerStrategy instead. To be removed in a future version.
69
+ *
70
+ * @breaking-change 21.0.0
71
+ */
72
+ export function NOOP_TREE_KEY_MANAGER_FACTORY() {
73
+ return () => new NoopTreeKeyManager();
74
+ }
75
+ /**
76
+ * @docs-private
77
+ *
78
+ * Opt-out of Tree of key manager behavior.
79
+ *
80
+ * When provided, Tree has same focus management behavior as before TreeKeyManager was introduced.
81
+ * - Tree does not respond to keyboard interaction
82
+ * - Tree node allows tabindex to be set by Input binding
83
+ * - Tree node allows tabindex to be set by attribute binding
84
+ *
85
+ * @deprecated NoopTreeKeyManager deprecated. Use TreeKeyManager or inject a
86
+ * TreeKeyManagerStrategy instead. To be removed in a future version.
87
+ *
88
+ * @breaking-change 21.0.0
89
+ */
90
+ export const NOOP_TREE_KEY_MANAGER_FACTORY_PROVIDER = {
91
+ provide: TREE_KEY_MANAGER,
92
+ useFactory: NOOP_TREE_KEY_MANAGER_FACTORY,
93
+ };
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9vcC10cmVlLWtleS1tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2Nkay9hMTF5L2tleS1tYW5hZ2VyL25vb3AtdHJlZS1rZXktbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBT3BELGtHQUFrRztBQUNsRyx1QkFBdUI7QUFDdkIsRUFBRTtBQUNGLCtGQUErRjtBQUMvRixtQkFBbUI7QUFDbkI7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBQS9CO1FBQ1csMEJBQXFCLEdBQUcsSUFBSSxDQUFDO1FBRXRDLHVGQUF1RjtRQUN2RixnREFBZ0Q7UUFDdkMsV0FBTSxHQUFHLElBQUksT0FBTyxFQUFZLENBQUM7SUF5QjVDLENBQUM7SUF2QkMsT0FBTztRQUNMLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPO0lBQ1QsQ0FBQztJQUVELGtCQUFrQjtRQUNoQiwyRkFBMkY7UUFDM0YsbUJBQW1CO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGFBQWE7UUFDWCwyRkFBMkY7UUFDM0YsbUJBQW1CO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPO0lBQ1QsQ0FBQztDQUNGO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUsNkJBQTZCO0lBRzNDLE9BQU8sR0FBRyxFQUFFLENBQUMsSUFBSSxrQkFBa0IsRUFBSyxDQUFDO0FBQzNDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNDQUFzQyxHQUFHO0lBQ3BELE9BQU8sRUFBRSxnQkFBZ0I7SUFDekIsVUFBVSxFQUFFLDZCQUE2QjtDQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1RSRUVfS0VZX01BTkFHRVJ9IGZyb20gJy4vdHJlZS1rZXktbWFuYWdlcic7XG5pbXBvcnQge1xuICBUcmVlS2V5TWFuYWdlckZhY3RvcnksXG4gIFRyZWVLZXlNYW5hZ2VySXRlbSxcbiAgVHJlZUtleU1hbmFnZXJTdHJhdGVneSxcbn0gZnJvbSAnLi90cmVlLWtleS1tYW5hZ2VyLXN0cmF0ZWd5JztcblxuLy8gTm9vcFRyZWVLZXlNYW5hZ2VyIGlzIGEgXCJub29wXCIgaW1wbGVtZW50YXRpb24gb2YgVHJlZUtleU1hbmdlclN0cmF0ZWd5LiBNZXRob2RzIGFyZSBub29wcy4gRG9lc1xuLy8gbm90IGVtaXQgdG8gc3RyZWFtcy5cbi8vXG4vLyBVc2VkIGZvciBhcHBsaWNhdGlvbnMgYnVpbHQgYmVmb3JlIFRyZWVLZXlNYW5hZ2VyIHRvIG9wdC1vdXQgb2YgVHJlZUtleU1hbmFnZXIgYW5kIHJldmVydCB0b1xuLy8gbGVnYWN5IGJlaGF2aW9yLlxuLyoqXG4gKiBAZG9jcy1wcml2YXRlXG4gKlxuICogT3B0LW91dCBvZiBUcmVlIG9mIGtleSBtYW5hZ2VyIGJlaGF2aW9yLlxuICpcbiAqIFdoZW4gcHJvdmlkZWQsIFRyZWUgaGFzIHNhbWUgZm9jdXMgbWFuYWdlbWVudCBiZWhhdmlvciBhcyBiZWZvcmUgVHJlZUtleU1hbmFnZXIgd2FzIGludHJvZHVjZWQuXG4gKiAgLSBUcmVlIGRvZXMgbm90IHJlc3BvbmQgdG8ga2V5Ym9hcmQgaW50ZXJhY3Rpb25cbiAqICAtIFRyZWUgbm9kZSBhbGxvd3MgdGFiaW5kZXggdG8gYmUgc2V0IGJ5IElucHV0IGJpbmRpbmdcbiAqICAtIFRyZWUgbm9kZSBhbGxvd3MgdGFiaW5kZXggdG8gYmUgc2V0IGJ5IGF0dHJpYnV0ZSBiaW5kaW5nXG4gKlxuICogQGRlcHJlY2F0ZWQgTm9vcFRyZWVLZXlNYW5hZ2VyIGRlcHJlY2F0ZWQuIFVzZSBUcmVlS2V5TWFuYWdlciBvciBpbmplY3QgYVxuICogVHJlZUtleU1hbmFnZXJTdHJhdGVneSBpbnN0ZWFkLiBUbyBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uXG4gKlxuICogQGJyZWFraW5nLWNoYW5nZSAyMS4wLjBcbiAqL1xuZXhwb3J0IGNsYXNzIE5vb3BUcmVlS2V5TWFuYWdlcjxUIGV4dGVuZHMgVHJlZUtleU1hbmFnZXJJdGVtPiBpbXBsZW1lbnRzIFRyZWVLZXlNYW5hZ2VyU3RyYXRlZ3k8VD4ge1xuICByZWFkb25seSBfaXNOb29wVHJlZUtleU1hbmFnZXIgPSB0cnVlO1xuXG4gIC8vIFByb3ZpZGUgY2hhbmdlIGFzIHJlcXVpcmVkIGJ5IFRyZWVLZXlNYW5hZ2VyU3RyYXRlZ3kuIE5vb3BUcmVlS2V5TWFuYWdlciBpcyBhIFwibm9vcFwiXG4gIC8vIGltcGxlbWVudGF0aW9uIHRoYXQgZG9lcyBub3QgZW1pdCB0byBzdHJlYW1zLlxuICByZWFkb25seSBjaGFuZ2UgPSBuZXcgU3ViamVjdDxUIHwgbnVsbD4oKTtcblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuY2hhbmdlLmNvbXBsZXRlKCk7XG4gIH1cblxuICBvbktleWRvd24oKSB7XG4gICAgLy8gbm9vcFxuICB9XG5cbiAgZ2V0QWN0aXZlSXRlbUluZGV4KCkge1xuICAgIC8vIEFsd2F5cyByZXR1cm4gbnVsbC4gTm9vcFRyZWVLZXlNYW5hZ2VyIGlzIGEgXCJub29wXCIgaW1wbGVtZW50YXRpb24gdGhhdCBkb2VzIG5vdCBtYWludGFpblxuICAgIC8vIHRoZSBhY3RpdmUgaXRlbS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGdldEFjdGl2ZUl0ZW0oKSB7XG4gICAgLy8gQWx3YXlzIHJldHVybiBudWxsLiBOb29wVHJlZUtleU1hbmFnZXIgaXMgYSBcIm5vb3BcIiBpbXBsZW1lbnRhdGlvbiB0aGF0IGRvZXMgbm90IG1haW50YWluXG4gICAgLy8gdGhlIGFjdGl2ZSBpdGVtLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZm9jdXNJdGVtKCkge1xuICAgIC8vIG5vb3BcbiAgfVxufVxuXG4vKipcbiAqIEBkb2NzLXByaXZhdGVcbiAqXG4gKiBPcHQtb3V0IG9mIFRyZWUgb2Yga2V5IG1hbmFnZXIgYmVoYXZpb3IuXG4gKlxuICogV2hlbiBwcm92aWRlZCwgVHJlZSBoYXMgc2FtZSBmb2N1cyBtYW5hZ2VtZW50IGJlaGF2aW9yIGFzIGJlZm9yZSBUcmVlS2V5TWFuYWdlciB3YXMgaW50cm9kdWNlZC5cbiAqICAtIFRyZWUgZG9lcyBub3QgcmVzcG9uZCB0byBrZXlib2FyZCBpbnRlcmFjdGlvblxuICogIC0gVHJlZSBub2RlIGFsbG93cyB0YWJpbmRleCB0byBiZSBzZXQgYnkgSW5wdXQgYmluZGluZ1xuICogIC0gVHJlZSBub2RlIGFsbG93cyB0YWJpbmRleCB0byBiZSBzZXQgYnkgYXR0cmlidXRlIGJpbmRpbmdcbiAqXG4gKiBAZGVwcmVjYXRlZCBOb29wVHJlZUtleU1hbmFnZXIgZGVwcmVjYXRlZC4gVXNlIFRyZWVLZXlNYW5hZ2VyIG9yIGluamVjdCBhXG4gKiBUcmVlS2V5TWFuYWdlclN0cmF0ZWd5IGluc3RlYWQuIFRvIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi5cbiAqXG4gKiBAYnJlYWtpbmctY2hhbmdlIDIxLjAuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gTk9PUF9UUkVFX0tFWV9NQU5BR0VSX0ZBQ1RPUlk8XG4gIFQgZXh0ZW5kcyBUcmVlS2V5TWFuYWdlckl0ZW0sXG4+KCk6IFRyZWVLZXlNYW5hZ2VyRmFjdG9yeTxUPiB7XG4gIHJldHVybiAoKSA9PiBuZXcgTm9vcFRyZWVLZXlNYW5hZ2VyPFQ+KCk7XG59XG5cbi8qKlxuICogQGRvY3MtcHJpdmF0ZVxuICpcbiAqIE9wdC1vdXQgb2YgVHJlZSBvZiBrZXkgbWFuYWdlciBiZWhhdmlvci5cbiAqXG4gKiBXaGVuIHByb3ZpZGVkLCBUcmVlIGhhcyBzYW1lIGZvY3VzIG1hbmFnZW1lbnQgYmVoYXZpb3IgYXMgYmVmb3JlIFRyZWVLZXlNYW5hZ2VyIHdhcyBpbnRyb2R1Y2VkLlxuICogIC0gVHJlZSBkb2VzIG5vdCByZXNwb25kIHRvIGtleWJvYXJkIGludGVyYWN0aW9uXG4gKiAgLSBUcmVlIG5vZGUgYWxsb3dzIHRhYmluZGV4IHRvIGJlIHNldCBieSBJbnB1dCBiaW5kaW5nXG4gKiAgLSBUcmVlIG5vZGUgYWxsb3dzIHRhYmluZGV4IHRvIGJlIHNldCBieSBhdHRyaWJ1dGUgYmluZGluZ1xuICpcbiAqIEBkZXByZWNhdGVkIE5vb3BUcmVlS2V5TWFuYWdlciBkZXByZWNhdGVkLiBVc2UgVHJlZUtleU1hbmFnZXIgb3IgaW5qZWN0IGFcbiAqIFRyZWVLZXlNYW5hZ2VyU3RyYXRlZ3kgaW5zdGVhZC4gVG8gYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLlxuICpcbiAqIEBicmVha2luZy1jaGFuZ2UgMjEuMC4wXG4gKi9cbmV4cG9ydCBjb25zdCBOT09QX1RSRUVfS0VZX01BTkFHRVJfRkFDVE9SWV9QUk9WSURFUiA9IHtcbiAgcHJvdmlkZTogVFJFRV9LRVlfTUFOQUdFUixcbiAgdXNlRmFjdG9yeTogTk9PUF9UUkVFX0tFWV9NQU5BR0VSX0ZBQ1RPUlksXG59O1xuIl19
@@ -0,0 +1,9 @@
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
+ export {};
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1rZXktbWFuYWdlci1zdHJhdGVneS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jZGsvYTExeS9rZXktbWFuYWdlci90cmVlLWtleS1tYW5hZ2VyLXN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge1F1ZXJ5TGlzdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge09ic2VydmFibGUsIFN1YmplY3R9IGZyb20gJ3J4anMnO1xuXG4vKiogUmVwcmVzZW50cyBhbiBpdGVtIHdpdGhpbiBhIHRyZWUgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIGEgVHJlZUtleU1hbmFnZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVLZXlNYW5hZ2VySXRlbSB7XG4gIC8qKiBXaGV0aGVyIHRoZSBpdGVtIGlzIGRpc2FibGVkLiAqL1xuICBpc0Rpc2FibGVkPzogKCgpID0+IGJvb2xlYW4pIHwgYm9vbGVhbjtcblxuICAvKiogVGhlIHVzZXItZmFjaW5nIGxhYmVsIGZvciB0aGlzIGl0ZW0uICovXG4gIGdldExhYmVsPygpOiBzdHJpbmc7XG5cbiAgLyoqIFBlcmZvcm0gdGhlIG1haW4gYWN0aW9uIChpLmUuIHNlbGVjdGlvbikgZm9yIHRoaXMgaXRlbS4gKi9cbiAgYWN0aXZhdGUoKTogdm9pZDtcblxuICAvKiogUmV0cmlldmVzIHRoZSBwYXJlbnQgZm9yIHRoaXMgaXRlbS4gVGhpcyBpcyBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gcGFyZW50LiAqL1xuICBnZXRQYXJlbnQoKTogVHJlZUtleU1hbmFnZXJJdGVtIHwgbnVsbDtcblxuICAvKiogUmV0cmlldmVzIHRoZSBjaGlsZHJlbiBmb3IgdGhpcyBpdGVtLiAqL1xuICBnZXRDaGlsZHJlbigpOiBUcmVlS2V5TWFuYWdlckl0ZW1bXSB8IE9ic2VydmFibGU8VHJlZUtleU1hbmFnZXJJdGVtW10+O1xuXG4gIC8qKiBEZXRlcm1pbmVzIGlmIHRoZSBpdGVtIGlzIGN1cnJlbnRseSBleHBhbmRlZC4gKi9cbiAgaXNFeHBhbmRlZDogKCgpID0+IGJvb2xlYW4pIHwgYm9vbGVhbjtcblxuICAvKiogQ29sbGFwc2VzIHRoZSBpdGVtLCBoaWRpbmcgaXRzIGNoaWxkcmVuLiAqL1xuICBjb2xsYXBzZSgpOiB2b2lkO1xuXG4gIC8qKiBFeHBhbmRzIHRoZSBpdGVtLCBzaG93aW5nIGl0cyBjaGlsZHJlbi4gKi9cbiAgZXhwYW5kKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEZvY3VzZXMgdGhlIGl0ZW0uIFRoaXMgc2hvdWxkIHByb3ZpZGUgc29tZSBpbmRpY2F0aW9uIHRvIHRoZSB1c2VyIHRoYXQgdGhpcyBpdGVtIGlzIGZvY3VzZWQuXG4gICAqL1xuICBmb2N1cygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBVbmZvY3VzIHRoZSBpdGVtLiBUaGlzIHNob3VsZCByZW1vdmUgdGhlIGZvY3VzIHN0YXRlLlxuICAgKi9cbiAgdW5mb2N1cygpOiB2b2lkO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBUcmVlS2V5TWFuYWdlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmVlS2V5TWFuYWdlck9wdGlvbnM8VCBleHRlbmRzIFRyZWVLZXlNYW5hZ2VySXRlbT4ge1xuICAvKipcbiAgICogSWYgdHJ1ZSwgdGhlbiB0aGUga2V5IG1hbmFnZXIgd2lsbCBjYWxsIGBhY3RpdmF0ZWAgaW4gYWRkaXRpb24gdG8gY2FsbGluZyBgZm9jdXNgIHdoZW4gYVxuICAgKiBwYXJ0aWN1bGFyIGl0ZW0gaXMgZm9jdXNlZC5cbiAgICovXG4gIHNob3VsZEFjdGl2YXRpb25Gb2xsb3dGb2N1cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdGhlIHRyZWUgaXRlbXMgYXJlIGxhaWQgb3V0IGhvcml6b250YWxseS4gVGhpcyBpbmZsdWVuY2VzIHdoaWNoIGtleVxuICAgKiB3aWxsIGJlIGludGVycHJldGVkIGFzIGV4cGFuZCBvciBjb2xsYXBzZS5cbiAgICovXG4gIGhvcml6b250YWxPcmllbnRhdGlvbj86ICdydGwnIHwgJ2x0cic7XG5cbiAgLyoqXG4gICAqIElmIHByb3ZpZGVkLCBuYXZpZ2F0aW9uIFwic2tpcHNcIiBvdmVyIGl0ZW1zIHRoYXQgcGFzcyB0aGUgZ2l2ZW4gcHJlZGljYXRlLlxuICAgKlxuICAgKiBJZiB0aGUgaXRlbSBpcyB0byBiZSBza2lwcGVkLCBwcmVkaWNhdGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBmYWxzZS5cbiAgICovXG4gIHNraXBQcmVkaWNhdGU/OiAoaXRlbTogVCkgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgcHJvdmlkZWQsIGRldGVybWluZXMgaG93IHRoZSBrZXkgbWFuYWdlciBkZXRlcm1pbmVzIGlmIHR3byBpdGVtcyBhcmUgZXF1aXZhbGVudC5cbiAgICpcbiAgICogSXQgc2hvdWxkIHByb3ZpZGUgYSB1bmlxdWUga2V5IGZvciBlYWNoIHVuaXF1ZSB0cmVlIGl0ZW0uIElmIHR3byB0cmVlIGl0ZW1zIGFyZSBlcXVpdmFsZW50LFxuICAgKiB0aGVuIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgc2FtZSB2YWx1ZS5cbiAgICovXG4gIHRyYWNrQnk/OiAodHJlZUl0ZW06IFQpID0+IHVua25vd247XG5cbiAgLyoqXG4gICAqIElmIGEgdmFsdWUgaXMgcHJvdmlkZWQsIGVuYWJsZXMgdHlwZWFoZWFkIG1vZGUsIHdoaWNoIGFsbG93cyB1c2VycyB0byBzZXQgdGhlIGFjdGl2ZSBpdGVtXG4gICAqIGJ5IHR5cGluZyB0aGUgdmlzaWJsZSBsYWJlbCBvZiB0aGUgaXRlbS5cbiAgICpcbiAgICogSWYgYSBudW1iZXIgaXMgcHJvdmlkZWQsIHRoaXMgd2lsbCBiZSB0aGUgdGltZSB0byB3YWl0IGFmdGVyIHRoZSBsYXN0IGtleXN0cm9rZSBiZWZvcmVcbiAgICogc2V0dGluZyB0aGUgYWN0aXZlIGl0ZW0uIElmIGB0cnVlYCBpcyBwcm92aWRlZCwgdGhlIGRlZmF1bHQgaW50ZXJ2YWwgb2YgMjAwbXMgd2lsbCBiZSB1c2VkLlxuICAgKi9cbiAgdHlwZUFoZWFkRGVib3VuY2VJbnRlcnZhbD86IHRydWUgfCBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJlZUtleU1hbmFnZXJTdHJhdGVneTxUIGV4dGVuZHMgVHJlZUtleU1hbmFnZXJJdGVtPiB7XG4gIC8qKiBTdHJlYW0gdGhhdCBlbWl0cyBhbnkgdGltZSB0aGUgZm9jdXNlZCBpdGVtIGNoYW5nZXMuICovXG4gIHJlYWRvbmx5IGNoYW5nZTogU3ViamVjdDxUIHwgbnVsbD47XG5cbiAgLyoqXG4gICAqIENsZWFucyB1cCB0aGUga2V5IG1hbmFnZXIuXG4gICAqL1xuICBkZXN0cm95KCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBrZXlib2FyZCBldmVudCBvbiB0aGUgdHJlZS5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IEtleWJvYXJkIGV2ZW50IHRoYXQgcmVwcmVzZW50cyB0aGUgdXNlciBpbnRlcmFjdGlvbiB3aXRoIHRoZSB0cmVlLlxuICAgKi9cbiAgb25LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZDtcblxuICAvKiogSW5kZXggb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgaXRlbS4gKi9cbiAgZ2V0QWN0aXZlSXRlbUluZGV4KCk6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqIFRoZSBjdXJyZW50bHkgYWN0aXZlIGl0ZW0uICovXG4gIGdldEFjdGl2ZUl0ZW0oKTogVCB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEZvY3VzIHRoZSBwcm92aWRlZCBpdGVtIGJ5IGluZGV4LlxuICAgKlxuICAgKiBVcGRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBpdGVtLiBFbWl0cyB0byBgY2hhbmdlYCBzdHJlYW0gaWYgYWN0aXZlIGl0ZW1cbiAgICogQ2hhbmdlcy5cbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byBmb2N1cy5cbiAgICogQHBhcmFtIG9wdGlvbnMgQWRkaXRpb25hbCBmb2N1c2luZyBvcHRpb25zLlxuICAgKi9cbiAgZm9jdXNJdGVtKGluZGV4OiBudW1iZXIsIG9wdGlvbnM/OiB7ZW1pdENoYW5nZUV2ZW50PzogYm9vbGVhbn0pOiB2b2lkO1xuICAvKipcbiAgICogRm9jdXMgdGhlIHByb3ZpZGVkIGl0ZW0uXG4gICAqXG4gICAqIFVwZGF0ZXMgdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIGl0ZW0uIEVtaXRzIHRvIGBjaGFuZ2VgIHN0cmVhbSBpZiBhY3RpdmUgaXRlbVxuICAgKiBDaGFuZ2VzLlxuICAgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0byBmb2N1cy4gRXF1YWxpdHkgaXMgZGV0ZXJtaW5lZCB2aWEgdGhlIHRyYWNrQnkgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSBvcHRpb25zIEFkZGl0aW9uYWwgZm9jdXNpbmcgb3B0aW9ucy5cbiAgICovXG4gIGZvY3VzSXRlbShpdGVtOiBULCBvcHRpb25zPzoge2VtaXRDaGFuZ2VFdmVudD86IGJvb2xlYW59KTogdm9pZDtcbiAgZm9jdXNJdGVtKGl0ZW1PckluZGV4OiBudW1iZXIgfCBULCBvcHRpb25zPzoge2VtaXRDaGFuZ2VFdmVudD86IGJvb2xlYW59KTogdm9pZDtcbn1cblxuZXhwb3J0IHR5cGUgVHJlZUtleU1hbmFnZXJGYWN0b3J5PFQgZXh0ZW5kcyBUcmVlS2V5TWFuYWdlckl0ZW0+ID0gKFxuICBpdGVtczogT2JzZXJ2YWJsZTxUW10+IHwgUXVlcnlMaXN0PFQ+IHwgVFtdLFxuICBvcHRpb25zOiBUcmVlS2V5TWFuYWdlck9wdGlvbnM8VD4sXG4pID0+IFRyZWVLZXlNYW5hZ2VyU3RyYXRlZ3k8VD47XG4iXX0=
@@ -0,0 +1,345 @@
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1rZXktbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jZGsvYTExeS9rZXktbWFuYWdlci90cmVlLWtleS1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBQyxjQUFjLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQy9ELE9BQU8sRUFBYSxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxFQUFFLElBQUksWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3pGLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQU9wQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQWtDakIsYUFBYTtRQUNuQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDbkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNwRixVQUFVLEdB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QUFDO0lBQ0wsQ0FBQztJQUVPLG9CQUFvQjtRQUMxQixJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQy9CLENBQUM7Q0FDRjtBQUVELG9CQUFvQjtBQUNwQixNQUFNLFVBQVUsd0JBQXdCO0lBQ3RDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVELDhEQUE4RDtBQUM5RCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLGNBQWMsQ0FBNkIsa0JBQWtCLEVBQUU7SUFDakcsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLHdCQUF3QjtDQUNsQyxDQUFDLENBQUM7QUFFSCxvQkFBb0I7QUFDcEIsTUFBTSxDQUFDLE1BQU0saUNBQWlDLEdBQUc7SUFDL0MsT0FBTyxFQUFFLGdCQUFnQjtJQUN6QixVQUFVLEVBQUUsd0JBQXdCO0NBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtJbmplY3Rpb25Ub2tlbiwgUXVlcnlMaXN0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Y29lcmNlT2JzZXJ2YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uL3ByaXZhdGUnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGlzT2JzZXJ2YWJsZSwgb2YgYXMgb2JzZXJ2YWJsZU9mfSBmcm9tICdyeGpzJztcbmltcG9ydCB7dGFrZX0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgVHJlZUtleU1hbmFnZXJGYWN0b3J5LFxuICBUcmVlS2V5TWFuYWdlckl0ZW0sXG4gIFRyZWVLZXlNYW5hZ2VyT3B0aW9ucyxcbiAgVHJlZUtleU1hbmFnZXJTdHJhdGVneSxcbn0gZnJvbSAnLi90cmVlLWtleS1tYW5hZ2VyLXN0cmF0ZWd5JztcbmltcG9ydCB7VHlwZWFoZWFkfSBmcm9tICcuL3R5cGVhaGVhZCc7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBtYW5hZ2VzIGtleWJvYXJkIGV2ZW50cyBmb3IgdHJlZXMuIElmIHlvdSBwYXNzIGl0IGEgUXVlcnlMaXN0IG9yIG90aGVyIGxpc3Qgb2YgdHJlZVxuICogaXRlbXMsIGl0IHdpbGwgc2V0IHRoZSBhY3RpdmUgaXRlbSwgZm9jdXMsIGhhbmRsZSBleHBhbnNpb24gYW5kIHR5cGVhaGVhZCBjb3JyZWN0bHkgd2hlblxuICoga2V5Ym9hcmQgZXZlbnRzIG9jY3VyLlxuICovXG5leHBvcnQgY2xhc3MgVHJlZUtleU1hbmFnZXI8VCBleHRlbmRzIFRyZWVLZXlNYW5hZ2VySXRlbT4gaW1wbGVtZW50cyBUcmVlS2V5TWFuYWdlclN0cmF0ZWd5PFQ+IHtcbiAgLyoqIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSAoZm9jdXNlZCkgaXRlbS4gKi9cbiAgcHJpdmF0ZSBfYWN0aXZlSXRlbUluZGV4ID0gLTE7XG4gIC8qKiBUaGUgY3VycmVudGx5IGFjdGl2ZSAoZm9jdXNlZCkgaXRlbS4gKi9cbiAgcHJpdmF0ZSBfYWN0aXZlSXRlbTogVCB8IG51bGwgPSBudWxsO1xuICAvKiogV2hldGhlciBvciBub3Qgd2UgYWN0aXZhdGUgdGhlIGl0ZW0gd2hlbiBpdCdzIGZvY3VzZWQuICovXG4gIHByaXZhdGUgX3Nob3VsZEFjdGl2YXRpb25Gb2xsb3dGb2N1cyA9IGZhbHNlO1xuICAvKipcbiAgICogVGhlIG9yaWVudGF0aW9uIHRoYXQgdGhlIHRyZWUgaXMgbGFpZCBvdXQgaW4uIEluIGBydGxgIG1vZGUsIHRoZSBiZWhhdmlvciBvZiBMZWZ0IGFuZFxuICAgKiBSaWdodCBhcnJvdyBhcmUgc3dpdGNoZWQuXG4gICAqL1xuICBwcml2YXRlIF9ob3Jpem9udGFsT3JpZW50YXRpb246ICdsdHInIHwgJ3J0bCcgPSAnbHRyJztcblxuICAvKipcbiAgICogUHJlZGljYXRlIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBhbiBpdGVtIHNob3VsZCBiZSBza2lwcGVkXG4gICAqIGJ5IHRoZSBrZXkgbWFuYWdlci5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgZG9lc24ndCBza2lwIGFueSBlbGVtZW50cyBpbiBvcmRlciB0byBrZWVwIHRyZWUgaXRlbXMgZm9jdXNhYmxlXG4gICAqIHdoZW4gZGlzYWJsZWQuIFRoaXMgYWxpZ25zIHdpdGggQVJJQSBndWlkZWxpbmVzOlxuICAgKiBodHRwczovL3d3dy53My5vcmcvV0FJL0FSSUEvYXBnL3ByYWN0aWNlcy9rZXlib2FyZC1pbnRlcmZhY2UvI2ZvY3VzYWJpbGl0eW9mZGlzYWJsZWRjb250cm9scy5cbiAgICovXG4gIHByaXZhdGUgX3NraXBQcmVkaWNhdGVGbiA9IChfaXRlbTogVCkgPT4gZmFsc2U7XG5cbiAgLyoqIEZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50IGl0ZW1zLiAqL1xuICBwcml2YXRlIF90cmFja0J5Rm46IChpdGVtOiBUKSA9PiB1bmtub3duID0gKGl0ZW06IFQpID0+IGl0ZW07XG5cbiAgLyoqIFN5bmNocm9ub3VzIGNhY2hlIG9mIHRoZSBpdGVtcyB0byBtYW5hZ2UuICovXG4gIHByaXZhdGUgX2l0ZW1zOiBUW10gPSBbXTtcblxuICBwcml2YXRlIF90eXBlYWhlYWQ/OiBUeXBlYWhlYWQ8VD47XG4gIHByaXZhdGUgX3R5cGVhaGVhZFN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcblxuICBwcml2YXRlIF9oYXNJbml0aWFsRm9jdXNlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2luaXRpYWxGb2N1cygpIHtcbiAgICBpZiAodGhpcy5faGFzSW5pdGlhbEZvY3VzZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2l0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBmb2N1c0luZGV4ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2l0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMuX3NraXBQcmVkaWNhdGVGbih0aGlzLl9pdGVtc1tpXSkgJiYgIXRoaXMuX2lzSXRlbURpc2FibGVkKHRoaXMuX2l0ZW1zW2ldKSkge1xuICAgICAgICBmb2N1c0luZGV4ID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5mb2N1c0l0ZW0oZm9jdXNJbmRleCk7XG4gICAgdGhpcy5faGFzSW5pdGlhbEZvY3VzZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBpdGVtcyBMaXN0IG9mIFRyZWVLZXlNYW5hZ2VyIG9wdGlvbnMuIENhbiBiZSBzeW5jaHJvbm91cyBvciBhc3luY2hyb25vdXMuXG4gICAqIEBwYXJhbSBjb25maWcgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zLiBCeSBkZWZhdWx0LCB1c2UgJ2x0cicgaG9yaXpvbnRhbCBvcmllbnRhdGlvbi4gQnlcbiAgICogZGVmYXVsdCwgZG8gbm90IHNraXAgYW55IG5vZGVzLiBCeSBkZWZhdWx0LCBrZXkgbWFuYWdlciBvbmx5IGNhbGxzIGBmb2N1c2AgbWV0aG9kIHdoZW4gaXRlbXNcbiAgICogYXJlIGZvY3VzZWQgYW5kIGRvZXMgbm90IGNhbGwgYGFjdGl2YXRlYC4gSWYgYHR5cGVhaGVhZERlZmF1bHRJbnRlcnZhbGAgaXMgYHRydWVgLCB1c2UgYVxuICAgKiBkZWZhdWx0IGludGVydmFsIG9mIDIwMG1zLlxuICAgKi9cbiAgY29uc3RydWN0b3IoaXRlbXM6IE9ic2VydmFibGU8VFtdPiB8IFF1ZXJ5TGlzdDxUPiB8IFRbXSwgY29uZmlnOiBUcmVlS2V5TWFuYWdlck9wdGlvbnM8VD4pIHtcbiAgICAvLyBXZSBhbGxvdyBmb3IgdGhlIGl0ZW1zIHRvIGJlIGFuIGFycmF5IG9yIE9ic2VydmFibGUgYmVjYXVzZSwgaW4gc29tZSBjYXNlcywgdGhlIGNvbnN1bWVyIG1heVxuICAgIC8vIG5vdCBoYXZlIGFjY2VzcyB0byBhIFF1ZXJ5TGlzdCBvZiB0aGUgaXRlbXMgdGhleSB3YW50IHRvIG1hbmFnZSAoZS5nLiB3aGVuIHRoZVxuICAgIC8vIGl0ZW1zIGFyZW4ndCBiZWluZyBjb2xsZWN0ZWQgdmlhIGBWaWV3Q2hpbGRyZW5gIG9yIGBDb250ZW50Q2hpbGRyZW5gKS5cbiAgICBpZiAoaXRlbXMgaW5zdGFuY2VvZiBRdWVyeUxpc3QpIHtcbiAgICAgIHRoaXMuX2l0ZW1zID0gaXRlbXMudG9BcnJheSgpO1xuICAgICAgaXRlbXMuY2hhbmdlcy5zdWJzY3JpYmUoKG5ld0l0ZW1zOiBRdWVyeUxpc3Q8VD4pID0+IHtcbiAgICAgICAgdGhpcy5faXRlbXMgPSBuZXdJdGVtcy50b0FycmF5KCk7XG4gICAgICAgIHRoaXMuX3R5cGVhaGVhZD8uc2V0SXRlbXModGhpcy5faXRlbXMpO1xuICAgICAgICB0aGlzLl91cGRhdGVBY3RpdmVJdGVtSW5kZXgodGhpcy5faXRlbXMpO1xuICAgICAgICB0aGlzLl9pbml0aWFsRm9jdXMoKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaXNPYnNlcnZhYmxlKGl0ZW1zKSkge1xuICAgICAgaXRlbXMuc3Vic2NyaWJlKG5ld0l0ZW1zID0+IHtcbiAgICAgICAgdGhpcy5faXRlbXMgPSBuZXdJdGVtcztcbiAgICAgICAgdGhpcy5fdHlwZWFoZWFkPy5zZXRJdGVtcyhuZXdJdGVtcyk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUFjdGl2ZUl0ZW1JbmRleChuZXdJdGVtcyk7XG4gICAgICAgIHRoaXMuX2luaXRpYWxGb2N1cygpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2l0ZW1zID0gaXRlbXM7XG4gICAgICB0aGlzLl9pbml0aWFsRm9jdXMoKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNvbmZpZy5zaG91bGRBY3RpdmF0aW9uRm9sbG93Rm9jdXMgPT09ICdib29sZWFuJykge1xuICAgICAgdGhpcy5fc2hvdWxkQWN0aXZhdGlvbkZvbGxvd0ZvY3VzID0gY29uZmlnLnNob3VsZEFjdGl2YXRpb25Gb2xsb3dGb2N1cztcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5ob3Jpem9udGFsT3JpZW50YXRpb24pIHtcbiAgICAgIHRoaXMuX2hvcml6b250YWxPcmllbnRhdGlvbiA9IGNvbmZpZy5ob3Jpem9udGFsT3JpZW50YXRpb247XG4gICAgfVxuICAgIGlmIChjb25maWcuc2tpcFByZWRpY2F0ZSkge1xuICAgICAgdGhpcy5fc2tpcFByZWRpY2F0ZUZuID0gY29uZmlnLnNraXBQcmVkaWNhdGU7XG4gICAgfVxuICAgIGlmIChjb25maWcudHJhY2tCeSkge1xuICAgICAgdGhpcy5fdHJhY2tCeUZuID0gY29uZmlnLnRyYWNrQnk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29uZmlnLnR5cGVBaGVhZERlYm91bmNlSW50ZXJ2YWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLl9zZXRUeXBlQWhlYWQoY29uZmlnLnR5cGVBaGVhZERlYm91bmNlSW50ZXJ2YWwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTdHJlYW0gdGhhdCBlbWl0cyBhbnkgdGltZSB0aGUgZm9jdXNlZCBpdGVtIGNoYW5nZXMuICovXG4gIHJlYWRvbmx5IGNoYW5nZSA9IG5ldyBTdWJqZWN0PFQgfCBudWxsPigpO1xuXG4gIC8qKiBDbGVhbnMgdXAgdGhlIGtleSBtYW5hZ2VyLiAqL1xuICBkZXN0cm95KCkge1xuICAgIHRoaXMuX3R5cGVhaGVhZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3R5cGVhaGVhZD8uZGVzdHJveSgpO1xuICAgIHRoaXMuY2hhbmdlLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIGtleWJvYXJkIGV2ZW50IG9uIHRoZSB0cmVlLlxuICAgKiBAcGFyYW0gZXZlbnQgS2V5Ym9hcmQgZXZlbnQgdGhhdCByZXByZXNlbnRzIHRoZSB1c2VyIGludGVyYWN0aW9uIHdpdGggdGhlIHRyZWUuXG4gICAqL1xuICBvbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCBrZXkgPSBldmVudC5rZXk7XG5cbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgY2FzZSAnVGFiJzpcbiAgICAgICAgLy8gUmV0dXJuIGVhcmx5IGhlcmUsIGluIG9yZGVyIHRvIGFsbG93IFRhYiB0byBhY3R1YWxseSB0YWIgb3V0IG9mIHRoZSB0cmVlXG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgdGhpcy5fZm9jdXNOZXh0SXRlbSgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgIHRoaXMuX2ZvY3VzUHJldmlvdXNJdGVtKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgICAgdGhpcy5faG9yaXpvbnRhbE9yaWVudGF0aW9uID09PSAncnRsJ1xuICAgICAgICAgID8gdGhpcy5fY29sbGFwc2VDdXJyZW50SXRlbSgpXG4gICAgICAgICAgOiB0aGlzLl9leHBhbmRDdXJyZW50SXRlbSgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgdGhpcy5faG9yaXpvbnRhbE9yaWVudGF0aW9uID09PSAncnRsJ1xuICAgICAgICAgID8gdGhpcy5fZXhwYW5kQ3VycmVudEl0ZW0oKVxuICAgICAgICAgIDogdGhpcy5fY29sbGFwc2VDdXJyZW50SXRlbSgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnSG9tZSc6XG4gICAgICAgIHRoaXMuX2ZvY3VzRmlyc3RJdGVtKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdFbmQnOlxuICAgICAgICB0aGlzLl9mb2N1c0xhc3RJdGVtKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICBjYXNlICcgJzpcbiAgICAgICAgdGhpcy5fYWN0aXZhdGVDdXJyZW50SXRlbSgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJyonKSB7XG4gICAgICAgICAgdGhpcy5fZXhwYW5kQWxsSXRlbXNBdEN1cnJlbnRJdGVtTGV2ZWwoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3R5cGVhaGVhZD8uaGFuZGxlS2V5KGV2ZW50KTtcbiAgICAgICAgLy8gUmV0dXJuIGhlcmUsIGluIG9yZGVyIHRvIGF2b2lkIHByZXZlbnRpbmcgdGhlIGRlZmF1bHQgYWN0aW9uIG9mIG5vbi1uYXZpZ2F0aW9uYWxcbiAgICAgICAgLy8ga2V5cyBvciByZXNldHRpbmcgdGhlIGJ1ZmZlciBvZiBwcmVzc2VkIGxldHRlcnMuXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZXNldCB0aGUgdHlwZWFoZWFkIHNpbmNlIHRoZSB1c2VyIGhhcyB1c2VkIGEgbmF2aWdhdGlvbmFsIGtleS5cbiAgICB0aGlzLl90eXBlYWhlYWQ/LnJlc2V0KCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIC8qKiBJbmRleCBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBpdGVtLiAqL1xuICBnZXRBY3RpdmVJdGVtSW5kZXgoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleDtcbiAgfVxuXG4gIC8qKiBUaGUgY3VycmVudGx5IGFjdGl2ZSBpdGVtLiAqL1xuICBnZXRBY3RpdmVJdGVtKCk6IFQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlSXRlbTtcbiAgfVxuXG4gIC8qKiBGb2N1cyB0aGUgZmlyc3QgYXZhaWxhYmxlIGl0ZW0uICovXG4gIHByaXZhdGUgX2ZvY3VzRmlyc3RJdGVtKCk6IHZvaWQge1xuICAgIHRoaXMuZm9jdXNJdGVtKHRoaXMuX2ZpbmROZXh0QXZhaWxhYmxlSXRlbUluZGV4KC0xKSk7XG4gIH1cblxuICAvKiogRm9jdXMgdGhlIGxhc3QgYXZhaWxhYmxlIGl0ZW0uICovXG4gIHByaXZhdGUgX2ZvY3VzTGFzdEl0ZW0oKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c0l0ZW0odGhpcy5fZmluZFByZXZpb3VzQXZhaWxhYmxlSXRlbUluZGV4KHRoaXMuX2l0ZW1zLmxlbmd0aCkpO1xuICB9XG5cbiAgLyoqIEZvY3VzIHRoZSBuZXh0IGF2YWlsYWJsZSBpdGVtLiAqL1xuICBwcml2YXRlIF9mb2N1c05leHRJdGVtKCk6IHZvaWQge1xuICAgIHRoaXMuZm9jdXNJdGVtKHRoaXMuX2ZpbmROZXh0QXZhaWxhYmxlSXRlbUluZGV4KHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCkpO1xuICB9XG5cbiAgLyoqIEZvY3VzIHRoZSBwcmV2aW91cyBhdmFpbGFibGUgaXRlbS4gKi9cbiAgcHJpdmF0ZSBfZm9jdXNQcmV2aW91c0l0ZW0oKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c0l0ZW0odGhpcy5fZmluZFByZXZpb3VzQXZhaWxhYmxlSXRlbUluZGV4KHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvY3VzIHRoZSBwcm92aWRlZCBpdGVtIGJ5IGluZGV4LlxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIGZvY3VzLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBBZGRpdGlvbmFsIGZvY3VzaW5nIG9wdGlvbnMuXG4gICAqL1xuICBmb2N1c0l0ZW0oaW5kZXg6IG51bWJlciwgb3B0aW9ucz86IHtlbWl0Q2hhbmdlRXZlbnQ/OiBib29sZWFufSk6IHZvaWQ7XG4gIGZvY3VzSXRlbShpdGVtOiBULCBvcHRpb25zPzoge2VtaXRDaGFuZ2VFdmVudD86IGJvb2xlYW59KTogdm9pZDtcbiAgZm9jdXNJdGVtKGl0ZW1PckluZGV4OiBudW1iZXIgfCBULCBvcHRpb25zPzoge2VtaXRDaGFuZ2VFdmVudD86IGJvb2xlYW59KTogdm9pZDtcbiAgZm9jdXNJdGVtKGl0ZW1PckluZGV4OiBudW1iZXIgfCBULCBvcHRpb25zOiB7ZW1pdENoYW5nZUV2ZW50PzogYm9vbGVhbn0gPSB7fSkge1xuICAgIC8vIFNldCBkZWZhdWx0IG9wdGlvbnNcbiAgICBvcHRpb25zLmVtaXRDaGFuZ2VFdmVudCA/Pz0gdHJ1ZTtcblxuICAgIGxldCBpbmRleCA9XG4gICAgICB0eXBlb2YgaXRlbU9ySW5kZXggPT09ICdudW1iZXInXG4gICAgICAgID8gaXRlbU9ySW5kZXhcbiAgICAgICAgOiB0aGlzLl9pdGVtcy5maW5kSW5kZXgoaXRlbSA9PiB0aGlzLl90cmFja0J5Rm4oaXRlbSkgPT09IHRoaXMuX3RyYWNrQnlGbihpdGVtT3JJbmRleCkpO1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5faXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGFjdGl2ZUl0ZW0gPSB0aGlzLl9pdGVtc1tpbmRleF07XG5cbiAgICAvLyBJZiB3ZSdyZSBqdXN0IHNldHRpbmcgdGhlIHNhbWUgaXRlbSwgZG9uJ3QgcmUtY2FsbCBhY3RpdmF0ZSBvciBmb2N1c1xuICAgIGlmIChcbiAgICAgIHRoaXMuX2FjdGl2ZUl0ZW0gIT09IG51bGwgJiZcbiAgICAgIHRoaXMuX3RyYWNrQnlGbihhY3RpdmVJdGVtKSA9PT0gdGhpcy5fdHJhY2tCeUZuKHRoaXMuX2FjdGl2ZUl0ZW0pXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlvdXNBY3RpdmVJdGVtID0gdGhpcy5fYWN0aXZlSXRlbTtcbiAgICB0aGlzLl9hY3RpdmVJdGVtID0gYWN0aXZlSXRlbSA/PyBudWxsO1xuICAgIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCA9IGluZGV4O1xuICAgIHRoaXMuX3R5cGVhaGVhZD8uc2V0Q3VycmVudFNlbGVjdGVkSXRlbUluZGV4KGluZGV4KTtcblxuICAgIHRoaXMuX2FjdGl2ZUl0ZW0/LmZvY3VzKCk7XG4gICAgcHJldmlvdXNBY3RpdmVJdGVtPy51bmZvY3VzKCk7XG5cbiAgICBpZiAob3B0aW9ucy5lbWl0Q2hhbmdlRXZlbnQpIHtcbiAgICAgIHRoaXMuY2hhbmdlLm5leHQodGhpcy5fYWN0aXZlSXRlbSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3Nob3VsZEFjdGl2YXRpb25Gb2xsb3dGb2N1cykge1xuICAgICAgdGhpcy5fYWN0aXZhdGVDdXJyZW50SXRlbSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZUFjdGl2ZUl0ZW1JbmRleChuZXdJdGVtczogVFtdKSB7XG4gICAgY29uc3QgYWN0aXZlSXRlbSA9IHRoaXMuX2FjdGl2ZUl0ZW07XG4gICAgaWYgKCFhY3RpdmVJdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3SW5kZXggPSBuZXdJdGVtcy5maW5kSW5kZXgoXG4gICAgICBpdGVtID0+IHRoaXMuX3RyYWNrQnlGbihpdGVtKSA9PT0gdGhpcy5fdHJhY2tCeUZuKGFjdGl2ZUl0ZW0pLFxuICAgICk7XG5cbiAgICBpZiAobmV3SW5kZXggPiAtMSAmJiBuZXdJbmRleCAhPT0gdGhpcy5fYWN0aXZlSXRlbUluZGV4KSB7XG4gICAgICB0aGlzLl9hY3RpdmVJdGVtSW5kZXggPSBuZXdJbmRleDtcbiAgICAgIHRoaXMuX3R5cGVhaGVhZD8uc2V0Q3VycmVudFNlbGVjdGVkSXRlbUluZGV4KG5ld0luZGV4KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRUeXBlQWhlYWQoZGVib3VuY2VJbnRlcnZhbDogbnVtYmVyIHwgYm9vbGVhbikge1xuICAgIHRoaXMuX3R5cGVhaGVhZCA9IG5ldyBUeXBlYWhlYWQodGhpcy5faXRlbXMsIHtcbiAgICAgIGRlYm91bmNlSW50ZXJ2YWw6IHR5cGVvZiBkZWJvdW5jZUludGVydmFsID09PSAnbnVtYmVyJyA/IGRlYm91bmNlSW50ZXJ2YWwgOiB1bmRlZmluZWQsXG4gICAgICBza2lwUHJlZGljYXRlOiBpdGVtID0+IHRoaXMuX3NraXBQcmVkaWNhdGVGbihpdGVtKSxcbiAgICB9KTtcblxuICAgIHRoaXMuX3R5cGVhaGVhZFN1YnNjcmlwdGlvbiA9IHRoaXMuX3R5cGVhaGVhZC5zZWxlY3RlZEl0ZW0uc3Vic2NyaWJlKGl0ZW0gPT4ge1xuICAgICAgdGhpcy5mb2N1c0l0ZW0oaXRlbSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9maW5kTmV4dEF2YWlsYWJsZUl0ZW1JbmRleChzdGFydGluZ0luZGV4OiBudW1iZXIpIHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnRpbmdJbmRleCArIDE7IGkgPCB0aGlzLl9pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCF0aGlzLl9za2lwUHJlZGljYXRlRm4odGhpcy5faXRlbXNbaV0pKSB7XG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RhcnRpbmdJbmRleDtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmRQcmV2aW91c0F2YWlsYWJsZUl0ZW1JbmRleChzdGFydGluZ0luZGV4OiBudW1iZXIpIHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnRpbmdJbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAoIXRoaXMuX3NraXBQcmVkaWNhdGVGbih0aGlzLl9pdGVtc1tpXSkpIHtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdGFydGluZ0luZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBpdGVtIGlzIGFscmVhZHkgZXhwYW5kZWQsIHdlIGNvbGxhcHNlIHRoZSBpdGVtLiBPdGhlcndpc2UsIHdlIHdpbGwgZm9jdXMgdGhlIHBhcmVudC5cbiAgICovXG4gIHByaXZhdGUgX2NvbGxhcHNlQ3VycmVudEl0ZW0oKSB7XG4gICAgaWYgKCF0aGlzLl9hY3RpdmVJdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzQ3VycmVudEl0ZW1FeHBhbmRlZCgpKSB7XG4gICAgICB0aGlzLl9hY3RpdmVJdGVtLmNvbGxhcHNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX2FjdGl2ZUl0ZW0uZ2V0UGFyZW50KCk7XG4gICAgICBpZiAoIXBhcmVudCB8fCB0aGlzLl9za2lwUHJlZGljYXRlRm4ocGFyZW50IGFzIFQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZm9jdXNJdGVtKHBhcmVudCBhcyBUKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIGl0ZW0gaXMgYWxyZWFkeSBjb2xsYXBzZWQsIHdlIGV4cGFuZCB0aGUgaXRlbS4gT3RoZXJ3aXNlLCB3ZSB3aWxsIGZvY3VzIHRoZSBmaXJzdCBjaGlsZC5cbiAgICovXG4gIHByaXZhdGUgX2V4cGFuZEN1cnJlbnRJdGVtKCkge1xuICAgIGlmICghdGhpcy5fYWN0aXZlSXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5faXNDdXJyZW50SXRlbUV4cGFuZGVkKCkpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZUl0ZW0uZXhwYW5kKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZXJjZU9ic2VydmFibGUodGhpcy5fYWN0aXZlSXRlbS5nZXRDaGlsZHJlbigpKVxuICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAuc3Vic2NyaWJlKGNoaWxkcmVuID0+IHtcbiAgICAgICAgICBjb25zdCBmaXJzdENoaWxkID0gY2hpbGRyZW4uZmluZChjaGlsZCA9PiAhdGhpcy5fc2tpcFByZWRpY2F0ZUZuKGNoaWxkIGFzIFQpKTtcbiAgICAgICAgICBpZiAoIWZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5mb2N1c0l0ZW0oZmlyc3RDaGlsZCBhcyBUKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaXNDdXJyZW50SXRlbUV4cGFuZGVkKCkge1xuICAgIGlmICghdGhpcy5fYWN0aXZlSXRlbSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIHRoaXMuX2FjdGl2ZUl0ZW0uaXNFeHBhbmRlZCA9PT0gJ2Jvb2xlYW4nXG4gICAgICA/IHRoaXMuX2FjdGl2ZUl0ZW0uaXNFeHBhbmRlZFxuICAgICAgOiB0aGlzLl9hY3RpdmVJdGVtLmlzRXhwYW5kZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzSXRlbURpc2FibGVkKGl0ZW06IFRyZWVLZXlNYW5hZ2VySXRlbSkge1xuICAgIHJldHVybiB0eXBlb2YgaXRlbS5pc0Rpc2FibGVkID09PSAnYm9vbGVhbicgPyBpdGVtLmlzRGlzYWJsZWQgOiBpdGVtLmlzRGlzYWJsZWQ/LigpO1xuICB9XG5cbiAgLyoqIEZvciBhbGwgaXRlbXMgdGhhdCBhcmUgdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIGN1cnJlbnQgaXRlbSwgd2UgZXhwYW5kIHRob3NlIGl0ZW1zLiAqL1xuICBwcml2YXRlIF9leHBhbmRBbGxJdGVtc0F0Q3VycmVudEl0ZW1MZXZlbCgpIHtcbiAgICBpZiAoIXRoaXMuX2FjdGl2ZUl0ZW0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl9hY3RpdmVJdGVtLmdldFBhcmVudCgpO1xuICAgIGxldCBpdGVtc1RvRXhwYW5kO1xuICAgIGlmICghcGFyZW50KSB7XG4gICAgICBpdGVtc1RvRXhwYW5kID0gb2JzZXJ2YWJsZU9mKHRoaXMuX2l0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0uZ2V0UGFyZW50KCkgPT09IG51bGwpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbXNUb0V4cGFuZCA9IGNvZXJjZU9ic2VydmFibGUocGFyZW50LmdldENoaWxkcmVuKCkpO1xuICAgIH1cblxuICAgIGl0ZW1zVG9FeHBhbmQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoaXRlbXMgPT4ge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgIGl0ZW0uZXhwYW5kKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9hY3RpdmF0ZUN1cnJlbnRJdGVtKCkge1xuICAgIHRoaXMuX2FjdGl2ZUl0ZW0/LmFjdGl2YXRlKCk7XG4gIH1cbn1cblxuLyoqIEBkb2NzLXByaXZhdGUgKi9cbmV4cG9ydCBmdW5jdGlvbiBUUkVFX0tFWV9NQU5BR0VSX0ZBQ1RPUlk8VCBleHRlbmRzIFRyZWVLZXlNYW5hZ2VySXRlbT4oKTogVHJlZUtleU1hbmFnZXJGYWN0b3J5PFQ+IHtcbiAgcmV0dXJuIChpdGVtcywgb3B0aW9ucykgPT4gbmV3IFRyZWVLZXlNYW5hZ2VyKGl0ZW1zLCBvcHRpb25zKTtcbn1cblxuLyoqIEluamVjdGlvbiB0b2tlbiB0aGF0IGRldGVybWluZXMgdGhlIGtleSBtYW5hZ2VyIHRvIHVzZS4gKi9cbmV4cG9ydCBjb25zdCBUUkVFX0tFWV9NQU5BR0VSID0gbmV3IEluamVjdGlvblRva2VuPFRyZWVLZXlNYW5hZ2VyRmFjdG9yeTxhbnk+PigndHJlZS1rZXktbWFuYWdlcicsIHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICBmYWN0b3J5OiBUUkVFX0tFWV9NQU5BR0VSX0ZBQ1RPUlksXG59KTtcblxuLyoqIEBkb2NzLXByaXZhdGUgKi9cbmV4cG9ydCBjb25zdCBUUkVFX0tFWV9NQU5BR0VSX0ZBQ1RPUllfUFJPVklERVIgPSB7XG4gIHByb3ZpZGU6IFRSRUVfS0VZX01BTkFHRVIsXG4gIHVzZUZhY3Rvcnk6IFRSRUVfS0VZX01BTkFHRVJfRkFDVE9SWSxcbn07XG4iXX0=
@@ -0,0 +1,91 @@
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=