@angular/cdk 14.0.0-next.11 → 14.0.0-next.12

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 (227) hide show
  1. package/a11y/focus-monitor/focus-monitor.d.ts +1 -1
  2. package/a11y/focus-trap/focus-trap.d.ts +1 -1
  3. package/a11y/live-announcer/live-announcer.d.ts +1 -1
  4. package/accordion/accordion-item.d.ts +1 -1
  5. package/accordion/accordion.d.ts +1 -1
  6. package/bidi/dir.d.ts +1 -1
  7. package/clipboard/copy-to-clipboard.d.ts +1 -1
  8. package/dialog/dialog-config.d.ts +115 -0
  9. package/dialog/dialog-container.d.ts +95 -0
  10. package/dialog/dialog-injectors.d.ts +24 -0
  11. package/dialog/dialog-module.d.ts +10 -0
  12. package/dialog/dialog-ref.d.ts +64 -0
  13. package/dialog/dialog.d.ts +103 -0
  14. package/dialog/dialog_public_index.d.ts +4 -0
  15. package/dialog/index.d.ts +8 -0
  16. package/dialog/package.json +9 -0
  17. package/dialog/public-api.d.ts +13 -0
  18. package/drag-drop/directives/drag-handle.d.ts +1 -1
  19. package/drag-drop/directives/drag-placeholder.d.ts +1 -1
  20. package/drag-drop/directives/drag-preview.d.ts +1 -1
  21. package/drag-drop/directives/drag.d.ts +8 -9
  22. package/drag-drop/directives/drop-list-group.d.ts +1 -1
  23. package/drag-drop/directives/drop-list.d.ts +1 -1
  24. package/esm2020/a11y/a11y-module.mjs +4 -4
  25. package/esm2020/a11y/aria-describer/aria-describer.mjs +3 -3
  26. package/esm2020/a11y/focus-monitor/focus-monitor.mjs +6 -6
  27. package/esm2020/a11y/focus-trap/configurable-focus-trap-factory.mjs +3 -3
  28. package/esm2020/a11y/focus-trap/focus-trap-manager.mjs +3 -3
  29. package/esm2020/a11y/focus-trap/focus-trap.mjs +6 -6
  30. package/esm2020/a11y/high-contrast-mode/high-contrast-mode-detector.mjs +3 -3
  31. package/esm2020/a11y/input-modality/input-modality-detector.mjs +3 -3
  32. package/esm2020/a11y/interactivity-checker/interactivity-checker.mjs +3 -3
  33. package/esm2020/a11y/live-announcer/live-announcer.mjs +6 -6
  34. package/esm2020/accordion/accordion-item.mjs +3 -3
  35. package/esm2020/accordion/accordion-module.mjs +4 -4
  36. package/esm2020/accordion/accordion.mjs +3 -3
  37. package/esm2020/bidi/bidi-module.mjs +4 -4
  38. package/esm2020/bidi/dir.mjs +3 -3
  39. package/esm2020/bidi/directionality.mjs +3 -3
  40. package/esm2020/clipboard/clipboard-module.mjs +4 -4
  41. package/esm2020/clipboard/clipboard.mjs +3 -3
  42. package/esm2020/clipboard/copy-to-clipboard.mjs +3 -3
  43. package/esm2020/collections/unique-selection-dispatcher.mjs +3 -3
  44. package/esm2020/dialog/dialog-config.mjs +58 -0
  45. package/esm2020/dialog/dialog-container.mjs +265 -0
  46. package/esm2020/dialog/dialog-injectors.mjs +26 -0
  47. package/esm2020/dialog/dialog-module.mjs +42 -0
  48. package/esm2020/dialog/dialog-ref.mjs +76 -0
  49. package/esm2020/dialog/dialog.mjs +285 -0
  50. package/esm2020/dialog/dialog_public_index.mjs +5 -0
  51. package/esm2020/dialog/index.mjs +9 -0
  52. package/esm2020/dialog/public-api.mjs +14 -0
  53. package/esm2020/drag-drop/directives/drag-handle.mjs +3 -3
  54. package/esm2020/drag-drop/directives/drag-placeholder.mjs +3 -3
  55. package/esm2020/drag-drop/directives/drag-preview.mjs +3 -3
  56. package/esm2020/drag-drop/directives/drag.mjs +11 -4
  57. package/esm2020/drag-drop/directives/drop-list-group.mjs +3 -3
  58. package/esm2020/drag-drop/directives/drop-list.mjs +3 -3
  59. package/esm2020/drag-drop/drag-drop-module.mjs +4 -4
  60. package/esm2020/drag-drop/drag-drop-registry.mjs +3 -3
  61. package/esm2020/drag-drop/drag-drop.mjs +3 -3
  62. package/esm2020/layout/breakpoints-observer.mjs +3 -3
  63. package/esm2020/layout/layout-module.mjs +4 -4
  64. package/esm2020/layout/media-matcher.mjs +3 -3
  65. package/esm2020/menu/context-menu-trigger.mjs +227 -0
  66. package/esm2020/menu/index.mjs +9 -0
  67. package/esm2020/menu/menu-aim.mjs +204 -0
  68. package/esm2020/menu/menu-bar.mjs +159 -0
  69. package/esm2020/menu/menu-base.mjs +203 -0
  70. package/esm2020/menu/menu-errors.mjs +22 -0
  71. package/esm2020/menu/menu-group.mjs +30 -0
  72. package/esm2020/menu/menu-interface.mjs +11 -0
  73. package/esm2020/menu/menu-item-checkbox.mjs +48 -0
  74. package/esm2020/menu/menu-item-radio.mjs +114 -0
  75. package/esm2020/menu/menu-item-selectable.mjs +42 -0
  76. package/esm2020/menu/menu-item.mjs +289 -0
  77. package/esm2020/menu/menu-module.mjs +62 -0
  78. package/esm2020/menu/menu-stack.mjs +156 -0
  79. package/esm2020/menu/menu-trigger-base.mjs +114 -0
  80. package/esm2020/menu/menu-trigger.mjs +302 -0
  81. package/esm2020/menu/menu.mjs +168 -0
  82. package/esm2020/menu/menu_public_index.mjs +5 -0
  83. package/esm2020/menu/pointer-focus-tracker.mjs +51 -0
  84. package/esm2020/menu/public-api.mjs +24 -0
  85. package/esm2020/observers/observe-content.mjs +13 -13
  86. package/esm2020/overlay/dispatchers/base-overlay-dispatcher.mjs +3 -3
  87. package/esm2020/overlay/dispatchers/overlay-keyboard-dispatcher.mjs +3 -3
  88. package/esm2020/overlay/dispatchers/overlay-outside-click-dispatcher.mjs +3 -3
  89. package/esm2020/overlay/fullscreen-overlay-container.mjs +3 -3
  90. package/esm2020/overlay/overlay-container.mjs +3 -3
  91. package/esm2020/overlay/overlay-directives.mjs +6 -6
  92. package/esm2020/overlay/overlay-module.mjs +4 -4
  93. package/esm2020/overlay/overlay-ref.mjs +4 -3
  94. package/esm2020/overlay/overlay.mjs +3 -3
  95. package/esm2020/overlay/position/overlay-position-builder.mjs +3 -3
  96. package/esm2020/overlay/scroll/scroll-strategy-options.mjs +3 -3
  97. package/esm2020/platform/platform-module.mjs +4 -4
  98. package/esm2020/platform/platform.mjs +3 -3
  99. package/esm2020/portal/portal-directives.mjs +16 -16
  100. package/esm2020/scrolling/fixed-size-virtual-scroll.mjs +3 -3
  101. package/esm2020/scrolling/scroll-dispatcher.mjs +3 -3
  102. package/esm2020/scrolling/scrollable.mjs +3 -3
  103. package/esm2020/scrolling/scrolling-module.mjs +8 -8
  104. package/esm2020/scrolling/viewport-ruler.mjs +3 -3
  105. package/esm2020/scrolling/virtual-for-of.mjs +3 -3
  106. package/esm2020/scrolling/virtual-scroll-viewport.mjs +3 -3
  107. package/esm2020/stepper/step-header.mjs +3 -3
  108. package/esm2020/stepper/step-label.mjs +3 -3
  109. package/esm2020/stepper/stepper-button.mjs +6 -6
  110. package/esm2020/stepper/stepper-module.mjs +4 -4
  111. package/esm2020/stepper/stepper.mjs +6 -6
  112. package/esm2020/table/cell.mjs +21 -21
  113. package/esm2020/table/coalesced-style-scheduler.mjs +3 -3
  114. package/esm2020/table/row.mjs +28 -28
  115. package/esm2020/table/table-module.mjs +4 -4
  116. package/esm2020/table/table.mjs +20 -20
  117. package/esm2020/table/text-column.mjs +4 -4
  118. package/esm2020/text-field/autofill.mjs +6 -6
  119. package/esm2020/text-field/autosize.mjs +3 -3
  120. package/esm2020/text-field/text-field-module.mjs +4 -4
  121. package/esm2020/tree/nested-node.mjs +3 -3
  122. package/esm2020/tree/node.mjs +3 -3
  123. package/esm2020/tree/outlet.mjs +3 -3
  124. package/esm2020/tree/padding.mjs +3 -3
  125. package/esm2020/tree/toggle.mjs +3 -3
  126. package/esm2020/tree/tree-module.mjs +4 -4
  127. package/esm2020/tree/tree.mjs +6 -6
  128. package/esm2020/version.mjs +1 -1
  129. package/fesm2015/a11y.mjs +40 -40
  130. package/fesm2015/accordion.mjs +10 -10
  131. package/fesm2015/bidi.mjs +10 -10
  132. package/fesm2015/cdk.mjs +1 -1
  133. package/fesm2015/cdk.mjs.map +1 -1
  134. package/fesm2015/clipboard.mjs +10 -10
  135. package/fesm2015/collections.mjs +3 -3
  136. package/fesm2015/dialog.mjs +749 -0
  137. package/fesm2015/dialog.mjs.map +1 -0
  138. package/fesm2015/drag-drop.mjs +35 -28
  139. package/fesm2015/drag-drop.mjs.map +1 -1
  140. package/fesm2015/layout.mjs +10 -10
  141. package/fesm2015/menu.mjs +2131 -0
  142. package/fesm2015/menu.mjs.map +1 -0
  143. package/fesm2015/observers.mjs +13 -13
  144. package/fesm2015/overlay.mjs +37 -36
  145. package/fesm2015/overlay.mjs.map +1 -1
  146. package/fesm2015/platform.mjs +7 -7
  147. package/fesm2015/portal.mjs +16 -16
  148. package/fesm2015/scrolling.mjs +26 -26
  149. package/fesm2015/stepper.mjs +22 -22
  150. package/fesm2015/table.mjs +78 -78
  151. package/fesm2015/table.mjs.map +1 -1
  152. package/fesm2015/text-field.mjs +13 -13
  153. package/fesm2015/tree.mjs +25 -25
  154. package/fesm2015/tree.mjs.map +1 -1
  155. package/fesm2020/a11y.mjs +40 -40
  156. package/fesm2020/accordion.mjs +10 -10
  157. package/fesm2020/bidi.mjs +10 -10
  158. package/fesm2020/cdk.mjs +1 -1
  159. package/fesm2020/cdk.mjs.map +1 -1
  160. package/fesm2020/clipboard.mjs +10 -10
  161. package/fesm2020/collections.mjs +3 -3
  162. package/fesm2020/dialog.mjs +753 -0
  163. package/fesm2020/dialog.mjs.map +1 -0
  164. package/fesm2020/drag-drop.mjs +35 -28
  165. package/fesm2020/drag-drop.mjs.map +1 -1
  166. package/fesm2020/layout.mjs +10 -10
  167. package/fesm2020/menu.mjs +2104 -0
  168. package/fesm2020/menu.mjs.map +1 -0
  169. package/fesm2020/observers.mjs +13 -13
  170. package/fesm2020/overlay.mjs +37 -36
  171. package/fesm2020/overlay.mjs.map +1 -1
  172. package/fesm2020/platform.mjs +7 -7
  173. package/fesm2020/portal.mjs +16 -16
  174. package/fesm2020/scrolling.mjs +26 -26
  175. package/fesm2020/stepper.mjs +22 -22
  176. package/fesm2020/table.mjs +78 -78
  177. package/fesm2020/table.mjs.map +1 -1
  178. package/fesm2020/text-field.mjs +13 -13
  179. package/fesm2020/tree.mjs +25 -25
  180. package/fesm2020/tree.mjs.map +1 -1
  181. package/menu/context-menu-trigger.d.ts +98 -0
  182. package/menu/index.d.ts +8 -0
  183. package/menu/menu-aim.d.ts +107 -0
  184. package/menu/menu-bar.d.ts +52 -0
  185. package/menu/menu-base.d.ts +104 -0
  186. package/menu/menu-errors.d.ts +17 -0
  187. package/menu/menu-group.d.ts +8 -0
  188. package/menu/menu-interface.d.ts +25 -0
  189. package/menu/menu-item-checkbox.d.ts +18 -0
  190. package/menu/menu-item-radio.d.ts +59 -0
  191. package/menu/menu-item-selectable.d.ts +21 -0
  192. package/menu/menu-item.d.ts +140 -0
  193. package/menu/menu-module.d.ts +17 -0
  194. package/menu/menu-stack.d.ts +122 -0
  195. package/menu/menu-trigger-base.d.ts +77 -0
  196. package/menu/menu-trigger.d.ts +104 -0
  197. package/menu/menu.d.ts +60 -0
  198. package/menu/menu_public_index.d.ts +4 -0
  199. package/menu/package.json +9 -0
  200. package/menu/pointer-focus-tracker.d.ts +47 -0
  201. package/menu/public-api.d.ts +23 -0
  202. package/observers/observe-content.d.ts +1 -1
  203. package/overlay/overlay-directives.d.ts +2 -2
  204. package/package.json +17 -1
  205. package/portal/portal-directives.d.ts +4 -4
  206. package/schematics/ng-add/index.js +1 -1
  207. package/schematics/ng-add/index.mjs +1 -1
  208. package/scrolling/fixed-size-virtual-scroll.d.ts +1 -1
  209. package/scrolling/scrollable.d.ts +1 -1
  210. package/scrolling/virtual-for-of.d.ts +1 -1
  211. package/scrolling/virtual-scroll-viewport.d.ts +1 -1
  212. package/stepper/step-header.d.ts +1 -1
  213. package/stepper/step-label.d.ts +1 -1
  214. package/stepper/stepper-button.d.ts +2 -2
  215. package/stepper/stepper.d.ts +2 -2
  216. package/table/cell.d.ts +7 -7
  217. package/table/row.d.ts +9 -9
  218. package/table/table.d.ts +6 -6
  219. package/table/text-column.d.ts +1 -1
  220. package/text-field/autofill.d.ts +1 -1
  221. package/text-field/autosize.d.ts +1 -1
  222. package/tree/nested-node.d.ts +1 -1
  223. package/tree/node.d.ts +1 -1
  224. package/tree/outlet.d.ts +1 -1
  225. package/tree/padding.d.ts +1 -1
  226. package/tree/toggle.d.ts +1 -1
  227. package/tree/tree.d.ts +2 -2
@@ -0,0 +1,156 @@
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 { Inject, Injectable, InjectionToken, Optional, SkipSelf } from '@angular/core';
9
+ import { Subject } from 'rxjs';
10
+ import { debounceTime, distinctUntilChanged, startWith } from 'rxjs/operators';
11
+ import * as i0 from "@angular/core";
12
+ /** Injection token used for an implementation of MenuStack. */
13
+ export const MENU_STACK = new InjectionToken('cdk-menu-stack');
14
+ /** Provider that provides the parent menu stack, or a new menu stack if there is no parent one. */
15
+ export const PARENT_OR_NEW_MENU_STACK_PROVIDER = {
16
+ provide: MENU_STACK,
17
+ deps: [[new Optional(), new SkipSelf(), new Inject(MENU_STACK)]],
18
+ useFactory: (parentMenuStack) => parentMenuStack || new MenuStack(),
19
+ };
20
+ /** Provider that provides the parent menu stack, or a new inline menu stack if there is no parent one. */
21
+ export const PARENT_OR_NEW_INLINE_MENU_STACK_PROVIDER = (orientation) => ({
22
+ provide: MENU_STACK,
23
+ deps: [[new Optional(), new SkipSelf(), new Inject(MENU_STACK)]],
24
+ useFactory: (parentMenuStack) => parentMenuStack || MenuStack.inline(orientation),
25
+ });
26
+ /** The next available menu stack ID. */
27
+ let nextId = 0;
28
+ /**
29
+ * MenuStack allows subscribers to listen for close events (when a MenuStackItem is popped off
30
+ * of the stack) in order to perform closing actions. Upon the MenuStack being empty it emits
31
+ * from the `empty` observable specifying the next focus action which the listener should perform
32
+ * as requested by the closer.
33
+ */
34
+ export class MenuStack {
35
+ constructor() {
36
+ /** The ID of this menu stack. */
37
+ this.id = `${nextId++}`;
38
+ /** All MenuStackItems tracked by this MenuStack. */
39
+ this._elements = [];
40
+ /** Emits the element which was popped off of the stack when requested by a closer. */
41
+ this._close = new Subject();
42
+ /** Emits once the MenuStack has become empty after popping off elements. */
43
+ this._empty = new Subject();
44
+ /** Emits whether any menu in the menu stack has focus. */
45
+ this._hasFocus = new Subject();
46
+ /** Observable which emits the MenuStackItem which has been requested to close. */
47
+ this.closed = this._close;
48
+ /** Observable which emits whether any menu in the menu stack has focus. */
49
+ this.hasFocus = this._hasFocus.pipe(startWith(false), debounceTime(0), distinctUntilChanged());
50
+ /**
51
+ * Observable which emits when the MenuStack is empty after popping off the last element. It
52
+ * emits a FocusNext event which specifies the action the closer has requested the listener
53
+ * perform.
54
+ */
55
+ this.emptied = this._empty;
56
+ /**
57
+ * Whether the inline menu associated with this menu stack is vertical or horizontal.
58
+ * `null` indicates there is no inline menu associated with this menu stack.
59
+ */
60
+ this._inlineMenuOrientation = null;
61
+ }
62
+ /** Creates a menu stack that originates from an inline menu. */
63
+ static inline(orientation) {
64
+ const stack = new MenuStack();
65
+ stack._inlineMenuOrientation = orientation;
66
+ return stack;
67
+ }
68
+ /**
69
+ * Adds an item to the menu stack.
70
+ * @param menu the MenuStackItem to put on the stack.
71
+ */
72
+ push(menu) {
73
+ this._elements.push(menu);
74
+ }
75
+ /**
76
+ * Pop items off of the stack up to and including `lastItem` and emit each on the close
77
+ * observable. If the stack is empty or `lastItem` is not on the stack it does nothing.
78
+ * @param lastItem the last item to pop off the stack.
79
+ * @param options Options that configure behavior on close.
80
+ */
81
+ close(lastItem, options) {
82
+ const { focusNextOnEmpty, focusParentTrigger } = { ...options };
83
+ if (this._elements.indexOf(lastItem) >= 0) {
84
+ let poppedElement;
85
+ do {
86
+ poppedElement = this._elements.pop();
87
+ this._close.next({ item: poppedElement, focusParentTrigger });
88
+ } while (poppedElement !== lastItem);
89
+ if (this.isEmpty()) {
90
+ this._empty.next(focusNextOnEmpty);
91
+ }
92
+ }
93
+ }
94
+ /**
95
+ * Pop items off of the stack up to but excluding `lastItem` and emit each on the close
96
+ * observable. If the stack is empty or `lastItem` is not on the stack it does nothing.
97
+ * @param lastItem the element which should be left on the stack
98
+ * @return whether or not an item was removed from the stack
99
+ */
100
+ closeSubMenuOf(lastItem) {
101
+ let removed = false;
102
+ if (this._elements.indexOf(lastItem) >= 0) {
103
+ removed = this.peek() !== lastItem;
104
+ while (this.peek() !== lastItem) {
105
+ this._close.next({ item: this._elements.pop() });
106
+ }
107
+ }
108
+ return removed;
109
+ }
110
+ /**
111
+ * Pop off all MenuStackItems and emit each one on the `close` observable one by one.
112
+ * @param options Options that configure behavior on close.
113
+ */
114
+ closeAll(options) {
115
+ const { focusNextOnEmpty, focusParentTrigger } = { ...options };
116
+ if (!this.isEmpty()) {
117
+ while (!this.isEmpty()) {
118
+ const menuStackItem = this._elements.pop();
119
+ if (menuStackItem) {
120
+ this._close.next({ item: menuStackItem, focusParentTrigger });
121
+ }
122
+ }
123
+ this._empty.next(focusNextOnEmpty);
124
+ }
125
+ }
126
+ /** Return true if this stack is empty. */
127
+ isEmpty() {
128
+ return !this._elements.length;
129
+ }
130
+ /** Return the length of the stack. */
131
+ length() {
132
+ return this._elements.length;
133
+ }
134
+ /** Get the top most element on the stack. */
135
+ peek() {
136
+ return this._elements[this._elements.length - 1];
137
+ }
138
+ /** Whether the menu stack is associated with an inline menu. */
139
+ hasInlineMenu() {
140
+ return this._inlineMenuOrientation != null;
141
+ }
142
+ /** The orientation of the associated inline menu. */
143
+ inlineMenuOrientation() {
144
+ return this._inlineMenuOrientation;
145
+ }
146
+ /** Sets whether the menu stack contains the focused element. */
147
+ setHasFocus(hasFocus) {
148
+ this._hasFocus.next(hasFocus);
149
+ }
150
+ }
151
+ MenuStack.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0-next.14", ngImport: i0, type: MenuStack, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
152
+ MenuStack.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.0-next.14", ngImport: i0, type: MenuStack });
153
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0-next.14", ngImport: i0, type: MenuStack, decorators: [{
154
+ type: Injectable
155
+ }] });
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jZGsvbWVudS9tZW51LXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3JGLE9BQU8sRUFBYSxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDekMsT0FBTyxFQUFDLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFlN0UsK0RBQStEO0FBQy9ELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxJQUFJLGNBQWMsQ0FBWSxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTFFLG1HQUFtRztBQUNuRyxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBRztJQUMvQyxPQUFPLEVBQUUsVUFBVTtJQUNuQixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksUUFBUSxFQUFFLEVBQUUsSUFBSSxRQUFRLEVBQUUsRUFBRSxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLFVBQVUsRUFBRSxDQUFDLGVBQTJCLEVBQUUsRUFBRSxDQUFDLGVBQWUsSUFBSSxJQUFJLFNBQVMsRUFBRTtDQUNoRixDQUFDO0FBRUYsMEdBQTBHO0FBQzFHLE1BQU0sQ0FBQyxNQUFNLHdDQUF3QyxHQUFHLENBQ3RELFdBQXNDLEVBQ3RDLEVBQUUsQ0FBQyxDQUFDO0lBQ0osT0FBTyxFQUFFLFVBQVU7SUFDbkIsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLFFBQVEsRUFBRSxFQUFFLElBQUksUUFBUSxFQUFFLEVBQUUsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUNoRSxVQUFVLEVBQUUsQ0FBQyxlQUEyQixFQUFFLEVBQUUsQ0FBQyxl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QUM7OzhHQXpJVSxTQUFTO2tIQUFULFNBQVM7bUdBQVQsU0FBUztrQkFEckIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIE9wdGlvbmFsLCBTa2lwU2VsZn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge09ic2VydmFibGUsIFN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBzdGFydFdpdGh9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuLyoqIFRoZSByZWxhdGl2ZSBpdGVtIGluIHRoZSBpbmxpbmUgbWVudSB0byBmb2N1cyBhZnRlciBjbG9zaW5nIGFsbCBwb3B1cCBtZW51cy4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIEZvY3VzTmV4dCB7XG4gIG5leHRJdGVtLFxuICBwcmV2aW91c0l0ZW0sXG4gIGN1cnJlbnRJdGVtLFxufVxuXG4vKiogQSBzaW5nbGUgaXRlbSAobWVudSkgaW4gdGhlIG1lbnUgc3RhY2suICovXG5leHBvcnQgaW50ZXJmYWNlIE1lbnVTdGFja0l0ZW0ge1xuICAvKiogQSByZWZlcmVuY2UgdG8gdGhlIG1lbnUgc3RhY2sgdGhpcyBtZW51IHN0YWNrIGl0ZW0gYmVsb25ncyB0by4gKi9cbiAgbWVudVN0YWNrPzogTWVudVN0YWNrO1xufVxuXG4vKiogSW5qZWN0aW9uIHRva2VuIHVzZWQgZm9yIGFuIGltcGxlbWVudGF0aW9uIG9mIE1lbnVTdGFjay4gKi9cbmV4cG9ydCBjb25zdCBNRU5VX1NUQUNLID0gbmV3IEluamVjdGlvblRva2VuPE1lbnVTdGFjaz4oJ2Nkay1tZW51LXN0YWNrJyk7XG5cbi8qKiBQcm92aWRlciB0aGF0IHByb3ZpZGVzIHRoZSBwYXJlbnQgbWVudSBzdGFjaywgb3IgYSBuZXcgbWVudSBzdGFjayBpZiB0aGVyZSBpcyBubyBwYXJlbnQgb25lLiAqL1xuZXhwb3J0IGNvbnN0IFBBUkVOVF9PUl9ORVdfTUVOVV9TVEFDS19QUk9WSURFUiA9IHtcbiAgcHJvdmlkZTogTUVOVV9TVEFDSyxcbiAgZGVwczogW1tuZXcgT3B0aW9uYWwoKSwgbmV3IFNraXBTZWxmKCksIG5ldyBJbmplY3QoTUVOVV9TVEFDSyldXSxcbiAgdXNlRmFjdG9yeTogKHBhcmVudE1lbnVTdGFjaz86IE1lbnVTdGFjaykgPT4gcGFyZW50TWVudVN0YWNrIHx8IG5ldyBNZW51U3RhY2soKSxcbn07XG5cbi8qKiBQcm92aWRlciB0aGF0IHByb3ZpZGVzIHRoZSBwYXJlbnQgbWVudSBzdGFjaywgb3IgYSBuZXcgaW5saW5lIG1lbnUgc3RhY2sgaWYgdGhlcmUgaXMgbm8gcGFyZW50IG9uZS4gKi9cbmV4cG9ydCBjb25zdCBQQVJFTlRfT1JfTkVXX0lOTElORV9NRU5VX1NUQUNLX1BST1ZJREVSID0gKFxuICBvcmllbnRhdGlvbjogJ3ZlcnRpY2FsJyB8ICdob3Jpem9udGFsJyxcbikgPT4gKHtcbiAgcHJvdmlkZTogTUVOVV9TVEFDSyxcbiAgZGVwczogW1tuZXcgT3B0aW9uYWwoKSwgbmV3IFNraXBTZWxmKCksIG5ldyBJbmplY3QoTUVOVV9TVEFDSyldXSxcbiAgdXNlRmFjdG9yeTogKHBhcmVudE1lbnVTdGFjaz86IE1lbnVTdGFjaykgPT4gcGFyZW50TWVudVN0YWNrIHx8IE1lbnVTdGFjay5pbmxpbmUob3JpZW50YXRpb24pLFxufSk7XG5cbi8qKiBPcHRpb25zIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIHRoZSBjbG9zZSBvciBjbG9zZUFsbCBtZXRob2RzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbG9zZU9wdGlvbnMge1xuICAvKiogVGhlIGVsZW1lbnQgdG8gZm9jdXMgbmV4dCBpZiB0aGUgY2xvc2Ugb3BlcmF0aW9uIGNhdXNlcyB0aGUgbWVudSBzdGFjayB0byBiZWNvbWUgZW1wdHkuICovXG4gIGZvY3VzTmV4dE9uRW1wdHk/OiBGb2N1c05leHQ7XG4gIC8qKiBXaGV0aGVyIHRvIGZvY3VzIHRoZSBwYXJlbnQgdHJpZ2dlciBhZnRlciBjbG9zaW5nIHRoZSBtZW51LiAqL1xuICBmb2N1c1BhcmVudFRyaWdnZXI/OiBib29sZWFuO1xufVxuXG4vKiogRXZlbnQgZGlzcGF0Y2hlZCB3aGVuIGEgbWVudSBpcyBjbG9zZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lbnVTdGFja0Nsb3NlRXZlbnQge1xuICAvKiogVGhlIG1lbnUgYmVpbmcgY2xvc2VkLiAqL1xuICBpdGVtOiBNZW51U3RhY2tJdGVtO1xuICAvKiogV2hldGhlciB0byBmb2N1cyB0aGUgcGFyZW50IHRyaWdnZXIgYWZ0ZXIgY2xvc2luZyB0aGUgbWVudS4gKi9cbiAgZm9jdXNQYXJlbnRUcmlnZ2VyPzogYm9vbGVhbjtcbn1cblxuLyoqIFRoZSBuZXh0IGF2YWlsYWJsZSBtZW51IHN0YWNrIElELiAqL1xubGV0IG5leHRJZCA9IDA7XG5cbi8qKlxuICogTWVudVN0YWNrIGFsbG93cyBzdWJzY3JpYmVycyB0byBsaXN0ZW4gZm9yIGNsb3NlIGV2ZW50cyAod2hlbiBhIE1lbnVTdGFja0l0ZW0gaXMgcG9wcGVkIG9mZlxuICogb2YgdGhlIHN0YWNrKSBpbiBvcmRlciB0byBwZXJmb3JtIGNsb3NpbmcgYWN0aW9ucy4gVXBvbiB0aGUgTWVudVN0YWNrIGJlaW5nIGVtcHR5IGl0IGVtaXRzXG4gKiBmcm9tIHRoZSBgZW1wdHlgIG9ic2VydmFibGUgc3BlY2lmeWluZyB0aGUgbmV4dCBmb2N1cyBhY3Rpb24gd2hpY2ggdGhlIGxpc3RlbmVyIHNob3VsZCBwZXJmb3JtXG4gKiBhcyByZXF1ZXN0ZWQgYnkgdGhlIGNsb3Nlci5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1lbnVTdGFjayB7XG4gIC8qKiBUaGUgSUQgb2YgdGhpcyBtZW51IHN0YWNrLiAqL1xuICByZWFkb25seSBpZCA9IGAke25leHRJZCsrfWA7XG5cbiAgLyoqIEFsbCBNZW51U3RhY2tJdGVtcyB0cmFja2VkIGJ5IHRoaXMgTWVudVN0YWNrLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9lbGVtZW50czogTWVudVN0YWNrSXRlbVtdID0gW107XG5cbiAgLyoqIEVtaXRzIHRoZSBlbGVtZW50IHdoaWNoIHdhcyBwb3BwZWQgb2ZmIG9mIHRoZSBzdGFjayB3aGVuIHJlcXVlc3RlZCBieSBhIGNsb3Nlci4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfY2xvc2UgPSBuZXcgU3ViamVjdDxNZW51U3RhY2tDbG9zZUV2ZW50PigpO1xuXG4gIC8qKiBFbWl0cyBvbmNlIHRoZSBNZW51U3RhY2sgaGFzIGJlY29tZSBlbXB0eSBhZnRlciBwb3BwaW5nIG9mZiBlbGVtZW50cy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZW1wdHkgPSBuZXcgU3ViamVjdDxGb2N1c05leHQgfCB1bmRlZmluZWQ+KCk7XG5cbiAgLyoqIEVtaXRzIHdoZXRoZXIgYW55IG1lbnUgaW4gdGhlIG1lbnUgc3RhY2sgaGFzIGZvY3VzLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9oYXNGb2N1cyA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG5cbiAgLyoqIE9ic2VydmFibGUgd2hpY2ggZW1pdHMgdGhlIE1lbnVTdGFja0l0ZW0gd2hpY2ggaGFzIGJlZW4gcmVxdWVzdGVkIHRvIGNsb3NlLiAqL1xuICByZWFkb25seSBjbG9zZWQ6IE9ic2VydmFibGU8TWVudVN0YWNrQ2xvc2VFdmVudD4gPSB0aGlzLl9jbG9zZTtcblxuICAvKiogT2JzZXJ2YWJsZSB3aGljaCBlbWl0cyB3aGV0aGVyIGFueSBtZW51IGluIHRoZSBtZW51IHN0YWNrIGhhcyBmb2N1cy4gKi9cbiAgcmVhZG9ubHkgaGFzRm9jdXM6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLl9oYXNGb2N1cy5waXBlKFxuICAgIHN0YXJ0V2l0aChmYWxzZSksXG4gICAgZGVib3VuY2VUaW1lKDApLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICk7XG5cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgd2hpY2ggZW1pdHMgd2hlbiB0aGUgTWVudVN0YWNrIGlzIGVtcHR5IGFmdGVyIHBvcHBpbmcgb2ZmIHRoZSBsYXN0IGVsZW1lbnQuIEl0XG4gICAqIGVtaXRzIGEgRm9jdXNOZXh0IGV2ZW50IHdoaWNoIHNwZWNpZmllcyB0aGUgYWN0aW9uIHRoZSBjbG9zZXIgaGFzIHJlcXVlc3RlZCB0aGUgbGlzdGVuZXJcbiAgICogcGVyZm9ybS5cbiAgICovXG4gIHJlYWRvbmx5IGVtcHRpZWQ6IE9ic2VydmFibGU8Rm9jdXNOZXh0IHwgdW5kZWZpbmVkPiA9IHRoaXMuX2VtcHR5O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBpbmxpbmUgbWVudSBhc3NvY2lhdGVkIHdpdGggdGhpcyBtZW51IHN0YWNrIGlzIHZlcnRpY2FsIG9yIGhvcml6b250YWwuXG4gICAqIGBudWxsYCBpbmRpY2F0ZXMgdGhlcmUgaXMgbm8gaW5saW5lIG1lbnUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWVudSBzdGFjay5cbiAgICovXG4gIHByaXZhdGUgX2lubGluZU1lbnVPcmllbnRhdGlvbjogJ3ZlcnRpY2FsJyB8ICdob3Jpem9udGFsJyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBDcmVhdGVzIGEgbWVudSBzdGFjayB0aGF0IG9yaWdpbmF0ZXMgZnJvbSBhbiBpbmxpbmUgbWVudS4gKi9cbiAgc3RhdGljIGlubGluZShvcmllbnRhdGlvbjogJ3ZlcnRpY2FsJyB8ICdob3Jpem9udGFsJykge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IE1lbnVTdGFjaygpO1xuICAgIHN0YWNrLl9pbmxpbmVNZW51T3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjtcbiAgICByZXR1cm4gc3RhY2s7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBpdGVtIHRvIHRoZSBtZW51IHN0YWNrLlxuICAgKiBAcGFyYW0gbWVudSB0aGUgTWVudVN0YWNrSXRlbSB0byBwdXQgb24gdGhlIHN0YWNrLlxuICAgKi9cbiAgcHVzaChtZW51OiBNZW51U3RhY2tJdGVtKSB7XG4gICAgdGhpcy5fZWxlbWVudHMucHVzaChtZW51KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3AgaXRlbXMgb2ZmIG9mIHRoZSBzdGFjayB1cCB0byBhbmQgaW5jbHVkaW5nIGBsYXN0SXRlbWAgYW5kIGVtaXQgZWFjaCBvbiB0aGUgY2xvc2VcbiAgICogb2JzZXJ2YWJsZS4gSWYgdGhlIHN0YWNrIGlzIGVtcHR5IG9yIGBsYXN0SXRlbWAgaXMgbm90IG9uIHRoZSBzdGFjayBpdCBkb2VzIG5vdGhpbmcuXG4gICAqIEBwYXJhbSBsYXN0SXRlbSB0aGUgbGFzdCBpdGVtIHRvIHBvcCBvZmYgdGhlIHN0YWNrLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHRoYXQgY29uZmlndXJlIGJlaGF2aW9yIG9uIGNsb3NlLlxuICAgKi9cbiAgY2xvc2UobGFzdEl0ZW06IE1lbnVTdGFja0l0ZW0sIG9wdGlvbnM/OiBDbG9zZU9wdGlvbnMpIHtcbiAgICBjb25zdCB7Zm9jdXNOZXh0T25FbXB0eSwgZm9jdXNQYXJlbnRUcmlnZ2VyfSA9IHsuLi5vcHRpb25zfTtcbiAgICBpZiAodGhpcy5fZWxlbWVudHMuaW5kZXhPZihsYXN0SXRlbSkgPj0gMCkge1xuICAgICAgbGV0IHBvcHBlZEVsZW1lbnQ7XG4gICAgICBkbyB7XG4gICAgICAgIHBvcHBlZEVsZW1lbnQgPSB0aGlzLl9lbGVtZW50cy5wb3AoKSE7XG4gICAgICAgIHRoaXMuX2Nsb3NlLm5leHQoe2l0ZW06IHBvcHBlZEVsZW1lbnQsIGZvY3VzUGFyZW50VHJpZ2dlcn0pO1xuICAgICAgfSB3aGlsZSAocG9wcGVkRWxlbWVudCAhPT0gbGFzdEl0ZW0pO1xuXG4gICAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgdGhpcy5fZW1wdHkubmV4dChmb2N1c05leHRPbkVtcHR5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUG9wIGl0ZW1zIG9mZiBvZiB0aGUgc3RhY2sgdXAgdG8gYnV0IGV4Y2x1ZGluZyBgbGFzdEl0ZW1gIGFuZCBlbWl0IGVhY2ggb24gdGhlIGNsb3NlXG4gICAqIG9ic2VydmFibGUuIElmIHRoZSBzdGFjayBpcyBlbXB0eSBvciBgbGFzdEl0ZW1gIGlzIG5vdCBvbiB0aGUgc3RhY2sgaXQgZG9lcyBub3RoaW5nLlxuICAgKiBAcGFyYW0gbGFzdEl0ZW0gdGhlIGVsZW1lbnQgd2hpY2ggc2hvdWxkIGJlIGxlZnQgb24gdGhlIHN0YWNrXG4gICAqIEByZXR1cm4gd2hldGhlciBvciBub3QgYW4gaXRlbSB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBzdGFja1xuICAgKi9cbiAgY2xvc2VTdWJNZW51T2YobGFzdEl0ZW06IE1lbnVTdGFja0l0ZW0pIHtcbiAgICBsZXQgcmVtb3ZlZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLl9lbGVtZW50cy5pbmRleE9mKGxhc3RJdGVtKSA+PSAwKSB7XG4gICAgICByZW1vdmVkID0gdGhpcy5wZWVrKCkgIT09IGxhc3RJdGVtO1xuICAgICAgd2hpbGUgKHRoaXMucGVlaygpICE9PSBsYXN0SXRlbSkge1xuICAgICAgICB0aGlzLl9jbG9zZS5uZXh0KHtpdGVtOiB0aGlzLl9lbGVtZW50cy5wb3AoKSF9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlbW92ZWQ7XG4gIH1cblxuICAvKipcbiAgICogUG9wIG9mZiBhbGwgTWVudVN0YWNrSXRlbXMgYW5kIGVtaXQgZWFjaCBvbmUgb24gdGhlIGBjbG9zZWAgb2JzZXJ2YWJsZSBvbmUgYnkgb25lLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHRoYXQgY29uZmlndXJlIGJlaGF2aW9yIG9uIGNsb3NlLlxuICAgKi9cbiAgY2xvc2VBbGwob3B0aW9ucz86IENsb3NlT3B0aW9ucykge1xuICAgIGNvbnN0IHtmb2N1c05leHRPbkVtcHR5LCBmb2N1c1BhcmVudFRyaWdnZXJ9ID0gey4uLm9wdGlvbnN9O1xuICAgIGlmICghdGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHdoaWxlICghdGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgY29uc3QgbWVudVN0YWNrSXRlbSA9IHRoaXMuX2VsZW1lbnRzLnBvcCgpO1xuICAgICAgICBpZiAobWVudVN0YWNrSXRlbSkge1xuICAgICAgICAgIHRoaXMuX2Nsb3NlLm5leHQoe2l0ZW06IG1lbnVTdGFja0l0ZW0sIGZvY3VzUGFyZW50VHJpZ2dlcn0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9lbXB0eS5uZXh0KGZvY3VzTmV4dE9uRW1wdHkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHN0YWNrIGlzIGVtcHR5LiAqL1xuICBpc0VtcHR5KCkge1xuICAgIHJldHVybiAhdGhpcy5fZWxlbWVudHMubGVuZ3RoO1xuICB9XG5cbiAgLyoqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBzdGFjay4gKi9cbiAgbGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50cy5sZW5ndGg7XG4gIH1cblxuICAvKiogR2V0IHRoZSB0b3AgbW9zdCBlbGVtZW50IG9uIHRoZSBzdGFjay4gKi9cbiAgcGVlaygpOiBNZW51U3RhY2tJdGVtIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudHNbdGhpcy5fZWxlbWVudHMubGVuZ3RoIC0gMV07XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgbWVudSBzdGFjayBpcyBhc3NvY2lhdGVkIHdpdGggYW4gaW5saW5lIG1lbnUuICovXG4gIGhhc0lubGluZU1lbnUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lubGluZU1lbnVPcmllbnRhdGlvbiAhPSBudWxsO1xuICB9XG5cbiAgLyoqIFRoZSBvcmllbnRhdGlvbiBvZiB0aGUgYXNzb2NpYXRlZCBpbmxpbmUgbWVudS4gKi9cbiAgaW5saW5lTWVudU9yaWVudGF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9pbmxpbmVNZW51T3JpZW50YXRpb247XG4gIH1cblxuICAvKiogU2V0cyB3aGV0aGVyIHRoZSBtZW51IHN0YWNrIGNvbnRhaW5zIHRoZSBmb2N1c2VkIGVsZW1lbnQuICovXG4gIHNldEhhc0ZvY3VzKGhhc0ZvY3VzOiBib29sZWFuKSB7XG4gICAgdGhpcy5faGFzRm9jdXMubmV4dChoYXNGb2N1cyk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,114 @@
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 { Directive, EventEmitter, Inject, InjectionToken, Injector, ViewContainerRef, } from '@angular/core';
9
+ import { MENU_STACK, MenuStack } from './menu-stack';
10
+ import { TemplatePortal } from '@angular/cdk/portal';
11
+ import { merge, Subject } from 'rxjs';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "./menu-stack";
14
+ /** Injection token used for an implementation of MenuStack. */
15
+ export const MENU_TRIGGER = new InjectionToken('cdk-menu-trigger');
16
+ /**
17
+ * Abstract directive that implements shared logic common to all menu triggers.
18
+ * This class can be extended to create custom menu trigger types.
19
+ */
20
+ export class CdkMenuTriggerBase {
21
+ constructor(
22
+ /** The DI injector for this component */
23
+ injector,
24
+ /** The view container ref for this component */
25
+ viewContainerRef,
26
+ /** The menu stack this menu is part of. */
27
+ menuStack) {
28
+ this.injector = injector;
29
+ this.viewContainerRef = viewContainerRef;
30
+ this.menuStack = menuStack;
31
+ /** Emits when the attached menu is requested to open */
32
+ this.opened = new EventEmitter();
33
+ /** Emits when the attached menu is requested to close */
34
+ this.closed = new EventEmitter();
35
+ /** A reference to the overlay which manages the triggered menu */
36
+ this.overlayRef = null;
37
+ /** Emits when this trigger is destroyed. */
38
+ this.destroyed = new Subject();
39
+ /** Emits when the outside pointer events listener on the overlay should be stopped. */
40
+ this.stopOutsideClicksListener = merge(this.closed, this.destroyed);
41
+ }
42
+ ngOnDestroy() {
43
+ this._destroyOverlay();
44
+ this.destroyed.next();
45
+ this.destroyed.complete();
46
+ }
47
+ /** Whether the attached menu is open. */
48
+ isOpen() {
49
+ return !!this.overlayRef?.hasAttached();
50
+ }
51
+ /** Registers a child menu as having been opened by this trigger. */
52
+ registerChildMenu(child) {
53
+ this.childMenu = child;
54
+ }
55
+ /**
56
+ * Get the portal to be attached to the overlay which contains the menu. Allows for the menu
57
+ * content to change dynamically and be reflected in the application.
58
+ */
59
+ getMenuContentPortal() {
60
+ const hasMenuContentChanged = this.menuTemplateRef !== this._menuPortal?.templateRef;
61
+ if (this.menuTemplateRef && (!this._menuPortal || hasMenuContentChanged)) {
62
+ this._menuPortal = new TemplatePortal(this.menuTemplateRef, this.viewContainerRef, undefined, this._getChildMenuInjector());
63
+ }
64
+ return this._menuPortal;
65
+ }
66
+ /**
67
+ * Whether the given element is inside the scope of this trigger's menu stack.
68
+ * @param element The element to check.
69
+ * @return Whether the element is inside the scope of this trigger's menu stack.
70
+ */
71
+ isElementInsideMenuStack(element) {
72
+ for (let el = element; el; el = el?.parentElement ?? null) {
73
+ if (el.getAttribute('data-cdk-menu-stack-id') === this.menuStack.id) {
74
+ return true;
75
+ }
76
+ }
77
+ return false;
78
+ }
79
+ /** Destroy and unset the overlay reference it if exists */
80
+ _destroyOverlay() {
81
+ if (this.overlayRef) {
82
+ this.overlayRef.dispose();
83
+ this.overlayRef = null;
84
+ }
85
+ }
86
+ /** Gets the injector to use when creating a child menu. */
87
+ _getChildMenuInjector() {
88
+ this._childMenuInjector =
89
+ this._childMenuInjector ||
90
+ Injector.create({
91
+ providers: [
92
+ { provide: MENU_TRIGGER, useValue: this },
93
+ { provide: MENU_STACK, useValue: this.menuStack },
94
+ ],
95
+ parent: this.injector,
96
+ });
97
+ return this._childMenuInjector;
98
+ }
99
+ }
100
+ CdkMenuTriggerBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0-next.14", ngImport: i0, type: CdkMenuTriggerBase, deps: [{ token: i0.Injector }, { token: i0.ViewContainerRef }, { token: MENU_STACK }], target: i0.ɵɵFactoryTarget.Directive });
101
+ CdkMenuTriggerBase.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "14.0.0-next.14", type: CdkMenuTriggerBase, host: { properties: { "attr.aria-controls": "childMenu?.id", "attr.data-cdk-menu-stack-id": "menuStack.id" } }, ngImport: i0 });
102
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0-next.14", ngImport: i0, type: CdkMenuTriggerBase, decorators: [{
103
+ type: Directive,
104
+ args: [{
105
+ host: {
106
+ '[attr.aria-controls]': 'childMenu?.id',
107
+ '[attr.data-cdk-menu-stack-id]': 'menuStack.id',
108
+ },
109
+ }]
110
+ }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i0.ViewContainerRef }, { type: i1.MenuStack, decorators: [{
111
+ type: Inject,
112
+ args: [MENU_STACK]
113
+ }] }]; } });
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS10cmlnZ2VyLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY2RrL21lbnUvbWVudS10cmlnZ2VyLWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLGNBQWMsRUFDZCxRQUFRLEVBR1IsZ0JBQWdCLEdBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBQyxVQUFVLEVBQUUsU0FBUyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRW5ELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQzs7O0FBRXBDLCtEQUErRDtBQUMvRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxjQUFjLENBQXFCLGtCQUFrQixDQUFDLENBQUM7QUFFdkY7OztHQUdHO0FBT0gsTUFBTSxPQUFnQixrQkFBa0I7SUErQnRDO0lBQ0UseUNBQXlDO0lBQ3RCLFFBQWtCO0lBQ3JDLGdEQUFnRDtJQUM3QixnQkFBa0M7SUFDckQsMkNBQTJDO0lBQ0osU0FBb0I7UUFKeEMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUVsQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBRWQsY0FBUyxHQUFULFNBQVMsQ0FBVztRQWpDN0Qsd0RBQXdEO1FBQy9DLFdBQU0sR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV6RCx5REFBeUQ7UUFDaEQsV0FBTSxHQUF1QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBS3pELGtFQUFrRTtRQUN4RCxlQUFVLEdBQXNCLElBQUksQ0FBQztRQUUvQyw0Q0FBNEM7UUFDekIsY0FBUyxHQUFrQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRTVELHVGQUF1RjtRQUNwRSw4QkFBeUIsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFrQi9FLENBQUM7SUFFSixXQUFXO1FBQ1QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXZCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQseUNBQXlDO0lBQ3pDLE1BQU07UUFDSixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFRCxvRUFBb0U7SUFDcEUsaUJBQWlCLENBQUMsS0FBVztRQUMzQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBRUQ7OztPQUdHO0lBQ08sb0JBQW9CO1FBQzVCLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLGVBQWUsS0FBSyxJQUFJLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQztRQUNyRixJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUkscUJBQXFCLENBQUMsRUFBRTtZQUN4RSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksY0FBYyxDQUNuQyxJQUFJLENBQUMsZUFBZSxFQUNwQixJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLFNBQVMsRUFDVCxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FDN0IsQ0FBQztTQUNIO1FBRUQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7OztPQUlHO0lBQ08sd0JBQXdCLENBQUMsT0FBZ0I7UUFDakQsS0FBSyxJQUFJLEVBQUUsR0FBbUIsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLGFBQWEsSUFBSSxJQUFJLEVBQUU7WUFDekUsSUFBSSxFQUFFLENBQUMsWUFBWSxDQUFDLHdCQUF3QixDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ25FLE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELDJEQUEyRDtJQUNuRCxlQUFlO1FBQ3JCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQztJQUVELDJEQUEyRDtJQUNuRCxxQkFBcUI7UUFDM0IsSUFBSSxDQUFDLGtCQUFrQjtZQUNyQixJQUFJLENBQUMsa0JBQWtCO2dCQUN2QixRQUFRLENBQUMsTUFBTSxDQUFDO29CQUNkLFNBQVMsRUFBRTt3QkFDVCxFQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBQzt3QkFDdkMsRUFBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFDO3FCQUNoRDtvQkFDRCxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVE7aUJBQ3RCLENBQUMsQ0FBQztRQUNMLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ2pDLENBQUM7O3VIQTdHbUIsa0JBQWtCLDBFQXFDNUIsVUFBVTsyR0FyQ0Esa0JBQWtCO21HQUFsQixrQkFBa0I7a0JBTnZDLFNBQVM7bUJBQUM7b0JBQ1QsSUFBSSxFQUFFO3dCQUNKLHNCQUFzQixFQUFFLGVBQWU7d0JBQ3ZDLCtCQUErQixFQUFFLGNBQWM7cUJBQ2hEO2lCQUNGOzswQkFzQ0ksTUFBTTsyQkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIEluamVjdGlvblRva2VuLFxuICBJbmplY3RvcixcbiAgT25EZXN0cm95LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01lbnV9IGZyb20gJy4vbWVudS1pbnRlcmZhY2UnO1xuaW1wb3J0IHtNRU5VX1NUQUNLLCBNZW51U3RhY2t9IGZyb20gJy4vbWVudS1zdGFjayc7XG5pbXBvcnQge0Nvbm5lY3RlZFBvc2l0aW9uLCBPdmVybGF5UmVmfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQge1RlbXBsYXRlUG9ydGFsfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7bWVyZ2UsIFN1YmplY3R9IGZyb20gJ3J4anMnO1xuXG4vKiogSW5qZWN0aW9uIHRva2VuIHVzZWQgZm9yIGFuIGltcGxlbWVudGF0aW9uIG9mIE1lbnVTdGFjay4gKi9cbmV4cG9ydCBjb25zdCBNRU5VX1RSSUdHRVIgPSBuZXcgSW5qZWN0aW9uVG9rZW48Q2RrTWVudVRyaWdnZXJCYXNlPignY2RrLW1lbnUtdHJpZ2dlcicpO1xuXG4vKipcbiAqIEFic3RyYWN0IGRpcmVjdGl2ZSB0aGF0IGltcGxlbWVudHMgc2hhcmVkIGxvZ2ljIGNvbW1vbiB0byBhbGwgbWVudSB0cmlnZ2Vycy5cbiAqIFRoaXMgY2xhc3MgY2FuIGJlIGV4dGVuZGVkIHRvIGNyZWF0ZSBjdXN0b20gbWVudSB0cmlnZ2VyIHR5cGVzLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgaG9zdDoge1xuICAgICdbYXR0ci5hcmlhLWNvbnRyb2xzXSc6ICdjaGlsZE1lbnU/LmlkJyxcbiAgICAnW2F0dHIuZGF0YS1jZGstbWVudS1zdGFjay1pZF0nOiAnbWVudVN0YWNrLmlkJyxcbiAgfSxcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ2RrTWVudVRyaWdnZXJCYXNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgLyoqIEEgbGlzdCBvZiBwcmVmZXJyZWQgbWVudSBwb3NpdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGNvbnN0cnVjdGluZyB0aGUgYEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneWAgZm9yIHRoaXMgdHJpZ2dlcidzIG1lbnUuICovXG4gIG1lbnVQb3NpdGlvbjogQ29ubmVjdGVkUG9zaXRpb25bXTtcblxuICAvKiogRW1pdHMgd2hlbiB0aGUgYXR0YWNoZWQgbWVudSBpcyByZXF1ZXN0ZWQgdG8gb3BlbiAqL1xuICByZWFkb25seSBvcGVuZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKiogRW1pdHMgd2hlbiB0aGUgYXR0YWNoZWQgbWVudSBpcyByZXF1ZXN0ZWQgdG8gY2xvc2UgKi9cbiAgcmVhZG9ubHkgY2xvc2VkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoqIFRlbXBsYXRlIHJlZmVyZW5jZSB2YXJpYWJsZSB0byB0aGUgbWVudSB0aGlzIHRyaWdnZXIgb3BlbnMgKi9cbiAgbWVudVRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICAvKiogQSByZWZlcmVuY2UgdG8gdGhlIG92ZXJsYXkgd2hpY2ggbWFuYWdlcyB0aGUgdHJpZ2dlcmVkIG1lbnUgKi9cbiAgcHJvdGVjdGVkIG92ZXJsYXlSZWY6IE92ZXJsYXlSZWYgfCBudWxsID0gbnVsbDtcblxuICAvKiogRW1pdHMgd2hlbiB0aGlzIHRyaWdnZXIgaXMgZGVzdHJveWVkLiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVzdHJveWVkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcblxuICAvKiogRW1pdHMgd2hlbiB0aGUgb3V0c2lkZSBwb2ludGVyIGV2ZW50cyBsaXN0ZW5lciBvbiB0aGUgb3ZlcmxheSBzaG91bGQgYmUgc3RvcHBlZC4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0b3BPdXRzaWRlQ2xpY2tzTGlzdGVuZXIgPSBtZXJnZSh0aGlzLmNsb3NlZCwgdGhpcy5kZXN0cm95ZWQpO1xuXG4gIC8qKiBUaGUgY2hpbGQgbWVudSBvcGVuZWQgYnkgdGhpcyB0cmlnZ2VyLiAqL1xuICBwcm90ZWN0ZWQgY2hpbGRNZW51PzogTWVudTtcblxuICAvKiogVGhlIGNvbnRlbnQgb2YgdGhlIG1lbnUgcGFuZWwgb3BlbmVkIGJ5IHRoaXMgdHJpZ2dlci4gKi9cbiAgcHJpdmF0ZSBfbWVudVBvcnRhbDogVGVtcGxhdGVQb3J0YWw7XG5cbiAgLyoqIFRoZSBpbmplY3RvciB0byB1c2UgZm9yIHRoZSBjaGlsZCBtZW51IG9wZW5lZCBieSB0aGlzIHRyaWdnZXIuICovXG4gIHByaXZhdGUgX2NoaWxkTWVudUluamVjdG9yPzogSW5qZWN0b3I7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIC8qKiBUaGUgREkgaW5qZWN0b3IgZm9yIHRoaXMgY29tcG9uZW50ICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGluamVjdG9yOiBJbmplY3RvcixcbiAgICAvKiogVGhlIHZpZXcgY29udGFpbmVyIHJlZiBmb3IgdGhpcyBjb21wb25lbnQgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICAvKiogVGhlIG1lbnUgc3RhY2sgdGhpcyBtZW51IGlzIHBhcnQgb2YuICovXG4gICAgQEluamVjdChNRU5VX1NUQUNLKSBwcm90ZWN0ZWQgcmVhZG9ubHkgbWVudVN0YWNrOiBNZW51U3RhY2ssXG4gICkge31cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95T3ZlcmxheSgpO1xuXG4gICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveWVkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgYXR0YWNoZWQgbWVudSBpcyBvcGVuLiAqL1xuICBpc09wZW4oKSB7XG4gICAgcmV0dXJuICEhdGhpcy5vdmVybGF5UmVmPy5oYXNBdHRhY2hlZCgpO1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVycyBhIGNoaWxkIG1lbnUgYXMgaGF2aW5nIGJlZW4gb3BlbmVkIGJ5IHRoaXMgdHJpZ2dlci4gKi9cbiAgcmVnaXN0ZXJDaGlsZE1lbnUoY2hpbGQ6IE1lbnUpIHtcbiAgICB0aGlzLmNoaWxkTWVudSA9IGNoaWxkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcG9ydGFsIHRvIGJlIGF0dGFjaGVkIHRvIHRoZSBvdmVybGF5IHdoaWNoIGNvbnRhaW5zIHRoZSBtZW51LiBBbGxvd3MgZm9yIHRoZSBtZW51XG4gICAqIGNvbnRlbnQgdG8gY2hhbmdlIGR5bmFtaWNhbGx5IGFuZCBiZSByZWZsZWN0ZWQgaW4gdGhlIGFwcGxpY2F0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldE1lbnVDb250ZW50UG9ydGFsKCkge1xuICAgIGNvbnN0IGhhc01lbnVDb250ZW50Q2hhbmdlZCA9IHRoaXMubWVudVRlbXBsYXRlUmVmICE9PSB0aGlzLl9tZW51UG9ydGFsPy50ZW1wbGF0ZVJlZjtcbiAgICBpZiAodGhpcy5tZW51VGVtcGxhdGVSZWYgJiYgKCF0aGlzLl9tZW51UG9ydGFsIHx8IGhhc01lbnVDb250ZW50Q2hhbmdlZCkpIHtcbiAgICAgIHRoaXMuX21lbnVQb3J0YWwgPSBuZXcgVGVtcGxhdGVQb3J0YWwoXG4gICAgICAgIHRoaXMubWVudVRlbXBsYXRlUmVmLFxuICAgICAgICB0aGlzLnZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdGhpcy5fZ2V0Q2hpbGRNZW51SW5qZWN0b3IoKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX21lbnVQb3J0YWw7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBpbnNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgdHJpZ2dlcidzIG1lbnUgc3RhY2suXG4gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIGNoZWNrLlxuICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgaW5zaWRlIHRoZSBzY29wZSBvZiB0aGlzIHRyaWdnZXIncyBtZW51IHN0YWNrLlxuICAgKi9cbiAgcHJvdGVjdGVkIGlzRWxlbWVudEluc2lkZU1lbnVTdGFjayhlbGVtZW50OiBFbGVtZW50KSB7XG4gICAgZm9yIChsZXQgZWw6IEVsZW1lbnQgfCBudWxsID0gZWxlbWVudDsgZWw7IGVsID0gZWw/LnBhcmVudEVsZW1lbnQgPz8gbnVsbCkge1xuICAgICAgaWYgKGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1jZGstbWVudS1zdGFjay1pZCcpID09PSB0aGlzLm1lbnVTdGFjay5pZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqIERlc3Ryb3kgYW5kIHVuc2V0IHRoZSBvdmVybGF5IHJlZmVyZW5jZSBpdCBpZiBleGlzdHMgKi9cbiAgcHJpdmF0ZSBfZGVzdHJveU92ZXJsYXkoKSB7XG4gICAgaWYgKHRoaXMub3ZlcmxheVJlZikge1xuICAgICAgdGhpcy5vdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMub3ZlcmxheVJlZiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqIEdldHMgdGhlIGluamVjdG9yIHRvIHVzZSB3aGVuIGNyZWF0aW5nIGEgY2hpbGQgbWVudS4gKi9cbiAgcHJpdmF0ZSBfZ2V0Q2hpbGRNZW51SW5qZWN0b3IoKSB7XG4gICAgdGhpcy5fY2hpbGRNZW51SW5qZWN0b3IgPVxuICAgICAgdGhpcy5fY2hpbGRNZW51SW5qZWN0b3IgfHxcbiAgICAgIEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgIHtwcm92aWRlOiBNRU5VX1RSSUdHRVIsIHVzZVZhbHVlOiB0aGlzfSxcbiAgICAgICAgICB7cHJvdmlkZTogTUVOVV9TVEFDSywgdXNlVmFsdWU6IHRoaXMubWVudVN0YWNrfSxcbiAgICAgICAgXSxcbiAgICAgICAgcGFyZW50OiB0aGlzLmluamVjdG9yLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuX2NoaWxkTWVudUluamVjdG9yO1xuICB9XG59XG4iXX0=