@ngrdt/menu 0.0.17 → 0.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +160 -160
- package/fesm2022/ngrdt-menu.mjs +324 -358
- package/fesm2022/ngrdt-menu.mjs.map +1 -1
- package/index.d.ts +335 -4
- package/package.json +1 -3
- package/esm2022/index.mjs +0 -5
- package/esm2022/lib/menu/rdt-menu.component.mjs +0 -93
- package/esm2022/lib/menu-bar/rdt-menu-bar.component.mjs +0 -58
- package/esm2022/lib/menu-base/rdt-menu-base.component.mjs +0 -458
- package/esm2022/lib/menu-overlay/rdt-menu-overlay.component.mjs +0 -597
- package/esm2022/lib/models.mjs +0 -15
- package/esm2022/lib/private-models.mjs +0 -73
- package/esm2022/lib/rdt-menu.module.mjs +0 -41
- package/esm2022/lib/utils.mjs +0 -79
- package/esm2022/ngrdt-menu.mjs +0 -5
- package/lib/menu/rdt-menu.component.d.ts +0 -23
- package/lib/menu-bar/rdt-menu-bar.component.d.ts +0 -18
- package/lib/menu-base/rdt-menu-base.component.d.ts +0 -103
- package/lib/menu-overlay/rdt-menu-overlay.component.d.ts +0 -85
- package/lib/models.d.ts +0 -35
- package/lib/private-models.d.ts +0 -53
- package/lib/rdt-menu.module.d.ts +0 -14
- package/lib/utils.d.ts +0 -36
|
@@ -1,458 +0,0 @@
|
|
|
1
|
-
import { DOCUMENT } from '@angular/common';
|
|
2
|
-
import { booleanAttribute, ChangeDetectorRef, DestroyRef, Directive, ElementRef, EnvironmentInjector, HostBinding, HostListener, inject, Input, numberAttribute, QueryList, Renderer2, ViewChildren, } from '@angular/core';
|
|
3
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
|
-
import { Router } from '@angular/router';
|
|
5
|
-
import { RdtRouterService } from '@ngrdt/router';
|
|
6
|
-
import { RdtShortcutService } from '@ngrdt/shortcuts';
|
|
7
|
-
import { KB_CODE, RdtStringUtils, } from '@ngrdt/utils';
|
|
8
|
-
import { animationFrameScheduler, fromEvent, Subscription, throttleTime, } from 'rxjs';
|
|
9
|
-
import { RdtMenuOverlayComponent } from '../menu-overlay/rdt-menu-overlay.component';
|
|
10
|
-
import { DEFAULT_MENU_HORIZONTAL_DIR, DEFAULT_MENU_VERTICAL_DIR, RDT_MENU_MARGIN_BOTTOM_PROPERTY_NAME, RDT_MENU_MARGIN_LEFT_PROPERTY_NAME, RDT_MENU_MARGIN_RIGHT_PROPERTY_NAME, RDT_MENU_MARGIN_TOP_PROPERTY_NAME, RdtMenuShortcutMode, } from '../models';
|
|
11
|
-
import { RdtMenuExpandSource, } from '../private-models';
|
|
12
|
-
import { findNextItemWithPrefix, FOCUS_VISIBLE, getChildRoutesMap, getMenuItemsShortcuts, menuItemHasChildren, menuItemHasRoute, } from '../utils';
|
|
13
|
-
import * as i0 from "@angular/core";
|
|
14
|
-
export class RdtMenuBaseComponent {
|
|
15
|
-
preferredVerticalDir = DEFAULT_MENU_VERTICAL_DIR;
|
|
16
|
-
preferredHorizontalDir = DEFAULT_MENU_HORIZONTAL_DIR;
|
|
17
|
-
// Mode only matters if item has shortcut and only children, no command nor routerLink
|
|
18
|
-
// FOCUS_ITEM will put focus on item with shortcut
|
|
19
|
-
// OPEN_SUBMENU will open its submenu and put focus on the first item in it
|
|
20
|
-
// If item has command or routerLink, it will always be activated and everything closed
|
|
21
|
-
shortcutMode = RdtMenuShortcutMode.OPEN_SUBMENU;
|
|
22
|
-
closeOnFocusOut = false;
|
|
23
|
-
openOnHover = false;
|
|
24
|
-
hitboxMargin = 10;
|
|
25
|
-
cd = inject(ChangeDetectorRef);
|
|
26
|
-
destroyRef = inject(DestroyRef);
|
|
27
|
-
rdtRouter = inject(RdtRouterService);
|
|
28
|
-
elRef = inject(ElementRef);
|
|
29
|
-
document = inject(DOCUMENT);
|
|
30
|
-
renderer = inject(Renderer2);
|
|
31
|
-
router = inject(Router);
|
|
32
|
-
shortcutService = inject(RdtShortcutService);
|
|
33
|
-
injector = inject(EnvironmentInjector);
|
|
34
|
-
children;
|
|
35
|
-
focusableElements;
|
|
36
|
-
classes = 'rdt-menu-base';
|
|
37
|
-
expandedChild = null;
|
|
38
|
-
autofocusSubmenuItem = null;
|
|
39
|
-
parsedItems;
|
|
40
|
-
get clientSize() {
|
|
41
|
-
return this._clientSize;
|
|
42
|
-
}
|
|
43
|
-
_clientSize;
|
|
44
|
-
get bodyMargin() {
|
|
45
|
-
return this._bodyMargin;
|
|
46
|
-
}
|
|
47
|
-
_bodyMargin;
|
|
48
|
-
get buttonContainerRect() {
|
|
49
|
-
return this._buttonContainerRect;
|
|
50
|
-
}
|
|
51
|
-
_buttonContainerRect;
|
|
52
|
-
allParsedItems;
|
|
53
|
-
childRoutesMap = new Map();
|
|
54
|
-
shortcutSub = new Subscription();
|
|
55
|
-
shortcutMap = {};
|
|
56
|
-
keyActions = {
|
|
57
|
-
[KB_CODE.ARROW.LEFT]: (index) => this.focusPrevItem(index),
|
|
58
|
-
[KB_CODE.ARROW.RIGHT]: (index) => this.focusNextItem(index),
|
|
59
|
-
[KB_CODE.ARROW.DOWN]: (index) => this.openSubmenu(index, 'first', RdtMenuExpandSource.Shortcut),
|
|
60
|
-
[KB_CODE.ARROW.UP]: (index) => this.openSubmenu(index, 'last', RdtMenuExpandSource.Shortcut),
|
|
61
|
-
[KB_CODE.HOME]: () => this.focusItem(0),
|
|
62
|
-
[KB_CODE.END]: () => this.focusItem(this.parsedItems.length - 1),
|
|
63
|
-
[KB_CODE.ENTER]: (index) => this.invokeItemClickByIndex(index),
|
|
64
|
-
[KB_CODE.SPACEBAR]: (index) => this.invokeItemClickByIndex(index),
|
|
65
|
-
};
|
|
66
|
-
// Returns all routes asociated with item or its subitems.
|
|
67
|
-
getChildRoutes(item) {
|
|
68
|
-
return this.childRoutesMap.get(item) ?? [];
|
|
69
|
-
}
|
|
70
|
-
ngOnInit() {
|
|
71
|
-
this.rdtRouter.navigationEnd$
|
|
72
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
73
|
-
.subscribe((ev) => this.filterItems());
|
|
74
|
-
this.measure();
|
|
75
|
-
}
|
|
76
|
-
ngOnChanges(changes) {
|
|
77
|
-
if (this.children) {
|
|
78
|
-
this.recalculateChildren();
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
ngAfterViewInit() {
|
|
82
|
-
this.listenWindowResize();
|
|
83
|
-
// Not using timeout results in horizontal overflow on html element
|
|
84
|
-
setTimeout(() => {
|
|
85
|
-
this.measure();
|
|
86
|
-
this.recalculateChildren();
|
|
87
|
-
}, 50);
|
|
88
|
-
}
|
|
89
|
-
recalculateChildren() {
|
|
90
|
-
this.children.forEach((child) => {
|
|
91
|
-
child.recalculatePosition(this.preferredHorizontalDir, this.preferredVerticalDir);
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
closeSubmenus(focusExpanded = false) {
|
|
95
|
-
if (focusExpanded && this.expandedChild) {
|
|
96
|
-
this.focusItem(this.expandedChild.item);
|
|
97
|
-
}
|
|
98
|
-
this.expandedChild = null;
|
|
99
|
-
this.cd.markForCheck();
|
|
100
|
-
}
|
|
101
|
-
onItemClick(item) {
|
|
102
|
-
if ((menuItemHasChildren(item) && this.expandedChild?.item !== item) ||
|
|
103
|
-
(this.openOnHover &&
|
|
104
|
-
this.expandedChild?.src === RdtMenuExpandSource.Hover)) {
|
|
105
|
-
this.autofocusSubmenuItem = null;
|
|
106
|
-
this.expandedChild = { item, src: RdtMenuExpandSource.Click };
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
this.expandedChild = null;
|
|
110
|
-
}
|
|
111
|
-
if (typeof item.command === 'function') {
|
|
112
|
-
item.command();
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
onItemPointerEnter(item) {
|
|
116
|
-
if (this.openOnHover) {
|
|
117
|
-
if (menuItemHasChildren(item) &&
|
|
118
|
-
this.expandedChild?.src !== RdtMenuExpandSource.Click) {
|
|
119
|
-
this.autofocusSubmenuItem = null;
|
|
120
|
-
this.expandedChild = { item, src: RdtMenuExpandSource.Hover };
|
|
121
|
-
}
|
|
122
|
-
else {
|
|
123
|
-
this.expandedChild = null;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
onKeyDown(itemIndex, event) {
|
|
128
|
-
const hasAction = event.code in this.keyActions;
|
|
129
|
-
const isLetter = RdtStringUtils.isAlphabetCharacter(event.key) ||
|
|
130
|
-
RdtStringUtils.isNumericCharacter(event.key);
|
|
131
|
-
if (hasAction || isLetter) {
|
|
132
|
-
event.preventDefault();
|
|
133
|
-
}
|
|
134
|
-
if (hasAction) {
|
|
135
|
-
event.stopPropagation();
|
|
136
|
-
}
|
|
137
|
-
if (hasAction) {
|
|
138
|
-
this.keyActions[event.code](itemIndex);
|
|
139
|
-
}
|
|
140
|
-
else if (isLetter) {
|
|
141
|
-
const next = findNextItemWithPrefix(this.parsedItems, itemIndex, event.key);
|
|
142
|
-
if (next !== null) {
|
|
143
|
-
this.focusItem(next);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
invokeItemClick(item) {
|
|
148
|
-
if (menuItemHasRoute(item) && item.routerLink) {
|
|
149
|
-
this.router.navigate(item.routerLink);
|
|
150
|
-
}
|
|
151
|
-
this.onItemClick(item);
|
|
152
|
-
this.autofocusSubmenuItem = 'first';
|
|
153
|
-
}
|
|
154
|
-
filterItems() {
|
|
155
|
-
const current = this.rdtRouter.parseAbsoluteUrl();
|
|
156
|
-
if (!current) {
|
|
157
|
-
this.parsedItems = this.allParsedItems;
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
this.parsedItems = this.filterRec(this.allParsedItems, current);
|
|
161
|
-
}
|
|
162
|
-
this.childRoutesMap = getChildRoutesMap(this.parsedItems);
|
|
163
|
-
this.listenShortcuts();
|
|
164
|
-
this.cd.markForCheck();
|
|
165
|
-
}
|
|
166
|
-
filterRec(items, current) {
|
|
167
|
-
let currentParent = current.route;
|
|
168
|
-
const currentParams = current.params;
|
|
169
|
-
const filtered = items.filter((item) => {
|
|
170
|
-
if (!item.requiredParent) {
|
|
171
|
-
return true;
|
|
172
|
-
}
|
|
173
|
-
const required = item.requiredParent;
|
|
174
|
-
while (currentParent.absolutePath !== required.absolutePath) {
|
|
175
|
-
currentParent = currentParent.parent;
|
|
176
|
-
if (!currentParent) {
|
|
177
|
-
return false;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
let requiredParent = required;
|
|
181
|
-
do {
|
|
182
|
-
const path = requiredParent.absolutePath;
|
|
183
|
-
if (path in currentParams) {
|
|
184
|
-
for (const key in requiredParent.staticParams) {
|
|
185
|
-
if (currentParams[path][key] !== requiredParent.staticParams[key]) {
|
|
186
|
-
return false;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
requiredParent = requiredParent.parent;
|
|
191
|
-
} while (requiredParent);
|
|
192
|
-
return true;
|
|
193
|
-
});
|
|
194
|
-
return filtered.map((item) => {
|
|
195
|
-
if (item.items) {
|
|
196
|
-
return {
|
|
197
|
-
...item,
|
|
198
|
-
items: this.filterRec(item.items, current),
|
|
199
|
-
};
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
return item;
|
|
203
|
-
}
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
invokeItemClickByIndex(itemIndex) {
|
|
207
|
-
const item = this.parsedItems[itemIndex];
|
|
208
|
-
if (!item) {
|
|
209
|
-
return;
|
|
210
|
-
}
|
|
211
|
-
this.invokeItemClick(item);
|
|
212
|
-
}
|
|
213
|
-
openSubmenu(itemIndex, visibleFocus, src) {
|
|
214
|
-
if (itemIndex < this.parsedItems.length &&
|
|
215
|
-
menuItemHasChildren(this.parsedItems[itemIndex])) {
|
|
216
|
-
const item = this.parsedItems[itemIndex];
|
|
217
|
-
this.autofocusSubmenuItem = visibleFocus;
|
|
218
|
-
this.expandedChild = { item, src };
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
focusItem(item) {
|
|
222
|
-
let itemIndex;
|
|
223
|
-
if (typeof item === 'number') {
|
|
224
|
-
itemIndex = item;
|
|
225
|
-
}
|
|
226
|
-
else {
|
|
227
|
-
itemIndex = this.parsedItems.indexOf(item);
|
|
228
|
-
}
|
|
229
|
-
if (itemIndex >= 0 && itemIndex < this.focusableElements.length) {
|
|
230
|
-
this.blurAllFocusable();
|
|
231
|
-
this.focusFocusable(itemIndex);
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
focusNextItem(itemIndex) {
|
|
235
|
-
const next = (itemIndex + 1) % this.parsedItems.length;
|
|
236
|
-
this.focusItem(next);
|
|
237
|
-
}
|
|
238
|
-
focusPrevItem(itemIndex) {
|
|
239
|
-
const prev = (itemIndex - 1 + this.parsedItems.length) % this.parsedItems.length;
|
|
240
|
-
this.focusItem(prev);
|
|
241
|
-
}
|
|
242
|
-
blurAllFocusable() {
|
|
243
|
-
this.focusableElements.forEach((el) => this.renderer.removeClass(el.nativeElement, FOCUS_VISIBLE));
|
|
244
|
-
}
|
|
245
|
-
focusFocusable(itemIndex) {
|
|
246
|
-
const elRef = this.focusableElements.get(itemIndex);
|
|
247
|
-
if (elRef) {
|
|
248
|
-
this.renderer.addClass(elRef.nativeElement, FOCUS_VISIBLE);
|
|
249
|
-
elRef.nativeElement.focus();
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
onPointerMove(event) {
|
|
253
|
-
if (this.openOnHover && this.expandedChild) {
|
|
254
|
-
const hitboxes = this.getHitboxes();
|
|
255
|
-
const isInside = hitboxes.some((hitbox) => this.isPointerInsideHitbox(hitbox.rect, event));
|
|
256
|
-
for (let i = hitboxes.length - 1; i >= 0; i--) {
|
|
257
|
-
const hitbox = hitboxes[i];
|
|
258
|
-
if (!hitbox.fixed && !isInside) {
|
|
259
|
-
hitbox.close();
|
|
260
|
-
break;
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
// Closes menu if user navigates outside it using Tab.
|
|
266
|
-
checkActiveElement(event) {
|
|
267
|
-
if (this.closeOnFocusOut && !this.openOnHover) {
|
|
268
|
-
console.log('focusout', event);
|
|
269
|
-
const thisEl = this.elRef.nativeElement;
|
|
270
|
-
const target = event.relatedTarget;
|
|
271
|
-
if (!(target instanceof HTMLElement) || !thisEl.contains(target)) {
|
|
272
|
-
this.expandedChild = null;
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
onDocumentClick(event) {
|
|
277
|
-
const target = event.target;
|
|
278
|
-
const elRef = this.elRef.nativeElement;
|
|
279
|
-
if (!elRef.contains(target)) {
|
|
280
|
-
this.closeSubmenus();
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
measure() {
|
|
284
|
-
this.measureButtonContainer();
|
|
285
|
-
this.measureClientSize();
|
|
286
|
-
this.readMargin();
|
|
287
|
-
}
|
|
288
|
-
readMargin() {
|
|
289
|
-
const computedStyle = getComputedStyle(this.elRef.nativeElement);
|
|
290
|
-
const topVal = computedStyle.getPropertyValue(RDT_MENU_MARGIN_TOP_PROPERTY_NAME);
|
|
291
|
-
const bottomVal = computedStyle.getPropertyValue(RDT_MENU_MARGIN_BOTTOM_PROPERTY_NAME);
|
|
292
|
-
const leftVal = computedStyle.getPropertyValue(RDT_MENU_MARGIN_LEFT_PROPERTY_NAME);
|
|
293
|
-
const rightVal = computedStyle.getPropertyValue(RDT_MENU_MARGIN_RIGHT_PROPERTY_NAME);
|
|
294
|
-
this._bodyMargin = {
|
|
295
|
-
top: parseInt(topVal) || 0,
|
|
296
|
-
bottom: parseInt(bottomVal) || 0,
|
|
297
|
-
left: parseInt(leftVal) || 0,
|
|
298
|
-
right: parseInt(rightVal) || 0,
|
|
299
|
-
};
|
|
300
|
-
}
|
|
301
|
-
measureClientSize() {
|
|
302
|
-
this._clientSize = {
|
|
303
|
-
width: this.document.body.clientWidth,
|
|
304
|
-
height: this.document.body.clientHeight,
|
|
305
|
-
};
|
|
306
|
-
}
|
|
307
|
-
measureButtonContainer() {
|
|
308
|
-
const el = this.buttonContainer;
|
|
309
|
-
if (el) {
|
|
310
|
-
this._buttonContainerRect = el.getBoundingClientRect();
|
|
311
|
-
}
|
|
312
|
-
else {
|
|
313
|
-
this._buttonContainerRect = undefined;
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
listenWindowResize() {
|
|
317
|
-
fromEvent(window, 'resize')
|
|
318
|
-
.pipe(throttleTime(0, animationFrameScheduler, { trailing: true }), takeUntilDestroyed(this.destroyRef))
|
|
319
|
-
.subscribe(() => {
|
|
320
|
-
this.measure();
|
|
321
|
-
this.recalculateChildren();
|
|
322
|
-
});
|
|
323
|
-
}
|
|
324
|
-
listenShortcuts() {
|
|
325
|
-
const itemsWithShortcuts = getMenuItemsShortcuts(this.parsedItems);
|
|
326
|
-
const shortcuts = itemsWithShortcuts.map((it) => it.shortcut);
|
|
327
|
-
this.shortcutMap = this.getShortcutMap(itemsWithShortcuts);
|
|
328
|
-
this.shortcutSub.unsubscribe();
|
|
329
|
-
this.shortcutSub = this.shortcutService
|
|
330
|
-
.listen(shortcuts)
|
|
331
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
332
|
-
.subscribe((evt) => this.onShortcut(evt.shortcut));
|
|
333
|
-
}
|
|
334
|
-
getShortcutMap(itemsWithShortcuts) {
|
|
335
|
-
const shortcutMap = {};
|
|
336
|
-
itemsWithShortcuts.forEach((item) => {
|
|
337
|
-
shortcutMap[item.shortcut.hotkeysValue] = item.path;
|
|
338
|
-
});
|
|
339
|
-
return shortcutMap;
|
|
340
|
-
}
|
|
341
|
-
onShortcut(shortcut) {
|
|
342
|
-
const path = this.shortcutMap[shortcut.hotkeysValue];
|
|
343
|
-
if (!path) {
|
|
344
|
-
console.warn(`Menu shortcut ${shortcut.hotkeysValue} was detected, but there is no path associated with it.`, this.shortcutMap);
|
|
345
|
-
}
|
|
346
|
-
const last = path[path.length - 1];
|
|
347
|
-
const hasRoute = menuItemHasRoute(last);
|
|
348
|
-
const hasCommand = typeof last.command === 'function';
|
|
349
|
-
if (hasRoute || hasCommand) {
|
|
350
|
-
this.closeSubmenus(false);
|
|
351
|
-
if (hasCommand) {
|
|
352
|
-
last.command();
|
|
353
|
-
}
|
|
354
|
-
if (hasRoute) {
|
|
355
|
-
this.router.navigate(last.routerLink);
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
else {
|
|
359
|
-
this.activateItemRecursively(path, RdtMenuExpandSource.Shortcut);
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
activateItemRecursively(path, src) {
|
|
363
|
-
const children = [...path];
|
|
364
|
-
if (this.shortcutMode === RdtMenuShortcutMode.OPEN_SUBMENU) {
|
|
365
|
-
const last = children[children.length - 1];
|
|
366
|
-
if (menuItemHasChildren(last) && last.items[0]) {
|
|
367
|
-
children.push(last.items[0]);
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
const thisItem = children.shift();
|
|
371
|
-
if (children.length > 0) {
|
|
372
|
-
this.expandedChild = { item: thisItem, src };
|
|
373
|
-
const overlay = this.children.find((child) => child.item === thisItem);
|
|
374
|
-
overlay.focusItemRecursively(children);
|
|
375
|
-
}
|
|
376
|
-
else {
|
|
377
|
-
this.expandedChild = null;
|
|
378
|
-
this.focusItem(thisItem);
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
isPointerInsideHitbox(hitbox, event) {
|
|
382
|
-
const rect = hitbox;
|
|
383
|
-
const x = event.clientX;
|
|
384
|
-
const y = event.clientY;
|
|
385
|
-
return (x >= rect.left - this.hitboxMargin &&
|
|
386
|
-
x <= rect.right + this.hitboxMargin &&
|
|
387
|
-
y >= rect.top - this.hitboxMargin &&
|
|
388
|
-
y <= rect.bottom + this.hitboxMargin);
|
|
389
|
-
}
|
|
390
|
-
getHitboxes() {
|
|
391
|
-
const boxes = this.getOpenMenuBoundingBoxes();
|
|
392
|
-
const buttonContainerRect = this.buttonContainerRect;
|
|
393
|
-
if (buttonContainerRect) {
|
|
394
|
-
boxes.push({ rect: buttonContainerRect, fixed: true, close: () => { } });
|
|
395
|
-
}
|
|
396
|
-
return boxes;
|
|
397
|
-
}
|
|
398
|
-
getOpenMenuBoundingBoxes() {
|
|
399
|
-
const boxes = [];
|
|
400
|
-
this.children.forEach((overlay) => {
|
|
401
|
-
this.getOpenMenuBoundingBoxesRec(overlay, boxes);
|
|
402
|
-
});
|
|
403
|
-
return boxes;
|
|
404
|
-
}
|
|
405
|
-
getOpenMenuBoundingBoxesRec(overlay, boxes) {
|
|
406
|
-
if (overlay.expanded) {
|
|
407
|
-
let someByClick = false;
|
|
408
|
-
overlay.children.forEach((child) => (someByClick ||= this.getOpenMenuBoundingBoxesRec(child, boxes)));
|
|
409
|
-
const fixed = someByClick || overlay.selfExpandSrc === RdtMenuExpandSource.Click;
|
|
410
|
-
boxes.push({
|
|
411
|
-
rect: overlay.box,
|
|
412
|
-
fixed: fixed,
|
|
413
|
-
close: () => overlay.closeSelf(false),
|
|
414
|
-
});
|
|
415
|
-
return fixed;
|
|
416
|
-
}
|
|
417
|
-
return false;
|
|
418
|
-
}
|
|
419
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtMenuBaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
420
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.2.7", type: RdtMenuBaseComponent, inputs: { preferredVerticalDir: "preferredVerticalDir", preferredHorizontalDir: "preferredHorizontalDir", shortcutMode: "shortcutMode", closeOnFocusOut: ["closeOnFocusOut", "closeOnFocusOut", booleanAttribute], openOnHover: ["openOnHover", "openOnHover", booleanAttribute], hitboxMargin: ["hitboxMargin", "hitboxMargin", numberAttribute] }, host: { listeners: { "window:pointermove": "onPointerMove($event)", "window:focusout": "checkActiveElement($event)", "document:click": "onDocumentClick($event)" }, properties: { "class": "this.classes" } }, viewQueries: [{ propertyName: "children", predicate: RdtMenuOverlayComponent, descendants: true }, { propertyName: "focusableElements", predicate: ["focusableItem"], descendants: true }], usesOnChanges: true, ngImport: i0 });
|
|
421
|
-
}
|
|
422
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtMenuBaseComponent, decorators: [{
|
|
423
|
-
type: Directive
|
|
424
|
-
}], propDecorators: { preferredVerticalDir: [{
|
|
425
|
-
type: Input
|
|
426
|
-
}], preferredHorizontalDir: [{
|
|
427
|
-
type: Input
|
|
428
|
-
}], shortcutMode: [{
|
|
429
|
-
type: Input
|
|
430
|
-
}], closeOnFocusOut: [{
|
|
431
|
-
type: Input,
|
|
432
|
-
args: [{ transform: booleanAttribute }]
|
|
433
|
-
}], openOnHover: [{
|
|
434
|
-
type: Input,
|
|
435
|
-
args: [{ transform: booleanAttribute }]
|
|
436
|
-
}], hitboxMargin: [{
|
|
437
|
-
type: Input,
|
|
438
|
-
args: [{ transform: numberAttribute }]
|
|
439
|
-
}], children: [{
|
|
440
|
-
type: ViewChildren,
|
|
441
|
-
args: [RdtMenuOverlayComponent]
|
|
442
|
-
}], focusableElements: [{
|
|
443
|
-
type: ViewChildren,
|
|
444
|
-
args: ['focusableItem']
|
|
445
|
-
}], classes: [{
|
|
446
|
-
type: HostBinding,
|
|
447
|
-
args: ['class']
|
|
448
|
-
}], onPointerMove: [{
|
|
449
|
-
type: HostListener,
|
|
450
|
-
args: ['window:pointermove', ['$event']]
|
|
451
|
-
}], checkActiveElement: [{
|
|
452
|
-
type: HostListener,
|
|
453
|
-
args: ['window:focusout', ['$event']]
|
|
454
|
-
}], onDocumentClick: [{
|
|
455
|
-
type: HostListener,
|
|
456
|
-
args: ['document:click', ['$event']]
|
|
457
|
-
}] } });
|
|
458
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LW1lbnUtYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9AbmdyZHQvbWVudS9zcmMvbGliL21lbnUtYmFzZS9yZHQtbWVudS1iYXNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUVMLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsVUFBVSxFQUNWLFNBQVMsRUFDVCxVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxlQUFlLEVBR2YsU0FBUyxFQUNULFNBQVMsRUFFVCxZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBWSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQWUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRSxPQUFPLEVBQ0wsT0FBTyxFQUVQLGNBQWMsR0FFZixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxHQUNiLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDckYsT0FBTyxFQUNMLDJCQUEyQixFQUMzQix5QkFBeUIsRUFDekIsb0NBQW9DLEVBQ3BDLGtDQUFrQyxFQUNsQyxtQ0FBbUMsRUFDbkMsaUNBQWlDLEVBQ2pDLG1CQUFtQixHQUNwQixNQUFNLFdBQVcsQ0FBQztBQUNuQixPQUFPLEVBR0wsbUJBQW1CLEdBQ3BCLE1BQU0s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TixlQUFlO3NCQURkLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBSXRDLFdBQVc7c0JBRFYsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFJdEMsWUFBWTtzQkFEWCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFjM0IsUUFBUTtzQkFEakIsWUFBWTt1QkFBQyx1QkFBdUI7Z0JBSTNCLGlCQUFpQjtzQkFEMUIsWUFBWTt1QkFBQyxlQUFlO2dCQU03QixPQUFPO3NCQUROLFdBQVc7dUJBQUMsT0FBTztnQkFzUlYsYUFBYTtzQkFEdEIsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFtQnBDLGtCQUFrQjtzQkFEM0IsWUFBWTt1QkFBQyxpQkFBaUIsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFjakMsZUFBZTtzQkFEeEIsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgRGVzdHJveVJlZixcclxuICBEaXJlY3RpdmUsXHJcbiAgRWxlbWVudFJlZixcclxuICBFbnZpcm9ubWVudEluamVjdG9yLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBpbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgbnVtYmVyQXR0cmlidXRlLFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkluaXQsXHJcbiAgUXVlcnlMaXN0LFxyXG4gIFJlbmRlcmVyMixcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFZpZXdDaGlsZHJlbixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBSZHRSb3V0ZSwgUmR0Um91dGVyU2VydmljZSB9IGZyb20gJ0BuZ3JkdC9yb3V0ZXInO1xyXG5pbXBvcnQgeyBSZHRTaG9ydGN1dCwgUmR0U2hvcnRjdXRTZXJ2aWNlIH0gZnJvbSAnQG5ncmR0L3Nob3J0Y3V0cyc7XHJcbmltcG9ydCB7XHJcbiAgS0JfQ09ERSxcclxuICBSZHRIb3Jpem9udGFsRGlyZWN0aW9uLFxyXG4gIFJkdFN0cmluZ1V0aWxzLFxyXG4gIFJkdFZlcnRpY2FsRGlyZWN0aW9uLFxyXG59IGZyb20gJ0BuZ3JkdC91dGlscyc7XHJcbmltcG9ydCB7XHJcbiAgYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIsXHJcbiAgZnJvbUV2ZW50LFxyXG4gIFN1YnNjcmlwdGlvbixcclxuICB0aHJvdHRsZVRpbWUsXHJcbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFJkdE1lbnVPdmVybGF5Q29tcG9uZW50IH0gZnJvbSAnLi4vbWVudS1vdmVybGF5L3JkdC1tZW51LW92ZXJsYXkuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBERUZBVUxUX01FTlVfSE9SSVpPTlRBTF9ESVIsXHJcbiAgREVGQVVMVF9NRU5VX1ZFUlRJQ0FMX0RJUixcclxuICBSRFRfTUVOVV9NQVJHSU5fQk9UVE9NX1BST1BFUlRZX05BTUUsXHJcbiAgUkRUX01FTlVfTUFSR0lOX0xFRlRfUFJPUEVSVFlfTkFNRSxcclxuICBSRFRfTUVOVV9NQVJHSU5fUklHSFRfUFJPUEVSVFlfTkFNRSxcclxuICBSRFRfTUVOVV9NQVJHSU5fVE9QX1BST1BFUlRZX05BTUUsXHJcbiAgUmR0TWVudVNob3J0Y3V0TW9kZSxcclxufSBmcm9tICcuLi9tb2RlbHMnO1xyXG5pbXBvcnQge1xyXG4gIFBhcnNlZFJkdE1lbnVJdGVtLFxyXG4gIFJkdE1lbnVFeHBhbmRlZENoaWxkLFxyXG4gIFJkdE1lbnVFeHBhbmRTb3VyY2UsXHJcbn0gZnJvbSAnLi4vcHJpdmF0ZS1tb2RlbHMnO1xyXG5pbXBvcnQge1xyXG4gIGZpbmROZXh0SXRlbVdpdGhQcmVmaXgsXHJcbiAgRk9DVVNfVklTSUJMRSxcclxuICBnZXRDaGlsZFJvdXRlc01hcCxcclxuICBnZXRNZW51SXRlbXNTaG9ydGN1dHMsXHJcbiAgbWVudUl0ZW1IYXNDaGlsZHJlbixcclxuICBtZW51SXRlbUhhc1JvdXRlLFxyXG4gIFBhcnNlZFJkdE1lbnVJdGVtV2l0aFNob3J0Y3V0LFxyXG4gIFNpemUsXHJcbn0gZnJvbSAnLi4vdXRpbHMnO1xyXG5cclxuQERpcmVjdGl2ZSgpXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZHRNZW51QmFzZUNvbXBvbmVudFxyXG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXRcclxue1xyXG4gIEBJbnB1dCgpXHJcbiAgcHJlZmVycmVkVmVydGljYWxEaXI6IFJkdFZlcnRpY2FsRGlyZWN0aW9uID0gREVGQVVMVF9NRU5VX1ZFUlRJQ0FMX0RJUjtcclxuXHJcbiAgQElucHV0KClcclxuICBwcmVmZXJyZWRIb3Jpem9udGFsRGlyOiBSZHRIb3Jpem9udGFsRGlyZWN0aW9uID0gREVGQVVMVF9NRU5VX0hPUklaT05UQUxfRElSO1xyXG5cclxuICAvLyBNb2RlIG9ubHkgbWF0dGVycyBpZiBpdGVtIGhhcyBzaG9ydGN1dCBhbmQgb25seSBjaGlsZHJlbiwgbm8gY29tbWFuZCBub3Igcm91dGVyTGlua1xyXG4gIC8vIEZPQ1VTX0lURU0gd2lsbCBwdXQgZm9jdXMgb24gaXRlbSB3aXRoIHNob3J0Y3V0XHJcbiAgLy8gT1BFTl9TVUJNRU5VIHdpbGwgb3BlbiBpdHMgc3VibWVudSBhbmQgcHV0IGZvY3VzIG9uIHRoZSBmaXJzdCBpdGVtIGluIGl0XHJcbiAgLy8gSWYgaXRlbSBoYXMgY29tbWFuZCBvciByb3V0ZXJMaW5rLCBpdCB3aWxsIGFsd2F5cyBiZSBhY3RpdmF0ZWQgYW5kIGV2ZXJ5dGhpbmcgY2xvc2VkXHJcbiAgQElucHV0KClcclxuICBzaG9ydGN1dE1vZGU6ICdmb2N1cy1pdGVtJyB8ICdvcGVuLXN1Ym1lbnUnID1cclxuICAgIFJkdE1lbnVTaG9ydGN1dE1vZGUuT1BFTl9TVUJNRU5VO1xyXG5cclxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcclxuICBjbG9zZU9uRm9jdXNPdXQgPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXHJcbiAgb3Blbk9uSG92ZXIgPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSlcclxuICBoaXRib3hNYXJnaW4gPSAxMDtcclxuXHJcbiAgcmVhZG9ubHkgY2QgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG4gIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJkdFJvdXRlciA9IGluamVjdChSZHRSb3V0ZXJTZXJ2aWNlKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZWxSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+ID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBkb2N1bWVudCA9IGluamVjdChET0NVTUVOVCk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBzaG9ydGN1dFNlcnZpY2UgPSBpbmplY3QoUmR0U2hvcnRjdXRTZXJ2aWNlKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW5qZWN0b3IgPSBpbmplY3QoRW52aXJvbm1lbnRJbmplY3Rvcik7XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oUmR0TWVudU92ZXJsYXlDb21wb25lbnQpXHJcbiAgcHJvdGVjdGVkIGNoaWxkcmVuITogUXVlcnlMaXN0PFJkdE1lbnVPdmVybGF5Q29tcG9uZW50PjtcclxuXHJcbiAgQFZpZXdDaGlsZHJlbignZm9jdXNhYmxlSXRlbScpXHJcbiAgcHJvdGVjdGVkIGZvY3VzYWJsZUVsZW1lbnRzITogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PjtcclxuXHJcbiAgYWJzdHJhY3QgZ2V0IGJ1dHRvbkNvbnRhaW5lcigpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXHJcbiAgY2xhc3NlcyA9ICdyZHQtbWVudS1iYXNlJztcclxuXHJcbiAgZXhwYW5kZWRDaGlsZDogUmR0TWVudUV4cGFuZGVkQ2hpbGQgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJvdGVjdGVkIGF1dG9mb2N1c1N1Ym1lbnVJdGVtOiAnZmlyc3QnIHwgJ2xhc3QnIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJvdGVjdGVkIHBhcnNlZEl0ZW1zITogUGFyc2VkUmR0TWVudUl0ZW1bXTtcclxuXHJcbiAgZ2V0IGNsaWVudFNpemUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50U2l6ZTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfY2xpZW50U2l6ZSE6IFNpemU7XHJcblxyXG4gIGdldCBib2R5TWFyZ2luKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2JvZHlNYXJnaW47XHJcbiAgfVxyXG4gIHByaXZhdGUgX2JvZHlNYXJnaW4hOiB7XHJcbiAgICB0b3A6IG51bWJlcjtcclxuICAgIGJvdHRvbTogbnVtYmVyO1xyXG4gICAgbGVmdDogbnVtYmVyO1xyXG4gICAgcmlnaHQ6IG51bWJlcjtcclxuICB9O1xyXG5cclxuICBnZXQgYnV0dG9uQ29udGFpbmVyUmVjdCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9idXR0b25Db250YWluZXJSZWN0O1xyXG4gIH1cclxuICBwcml2YXRlIF9idXR0b25Db250YWluZXJSZWN0PzogRE9NUmVjdDtcclxuXHJcbiAgcHJvdGVjdGVkIGFsbFBhcnNlZEl0ZW1zITogUGFyc2VkUmR0TWVudUl0ZW1bXTtcclxuICBwcm90ZWN0ZWQgY2hpbGRSb3V0ZXNNYXA6IE1hcDxQYXJzZWRSZHRNZW51SXRlbSwgc3RyaW5nW11bXT4gPSBuZXcgTWFwKCk7XHJcbiAgcHJvdGVjdGVkIHNob3J0Y3V0U3ViID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG4gIHByb3RlY3RlZCBzaG9ydGN1dE1hcDogUmVjb3JkPHN0cmluZywgUGFyc2VkUmR0TWVudUl0ZW1bXT4gPSB7fTtcclxuXHJcbiAgcmVhZG9ubHkga2V5QWN0aW9ucyA9IHtcclxuICAgIFtLQl9DT0RFLkFSUk9XLkxFRlRdOiAoaW5kZXg6IG51bWJlcikgPT4gdGhpcy5mb2N1c1ByZXZJdGVtKGluZGV4KSxcclxuICAgIFtLQl9DT0RFLkFSUk9XLlJJR0hUXTogKGluZGV4OiBudW1iZXIpID0+IHRoaXMuZm9jdXNOZXh0SXRlbShpbmRleCksXHJcbiAgICBbS0JfQ09ERS5BUlJPVy5ET1dOXTogKGluZGV4OiBudW1iZXIpID0+XHJcbiAgICAgIHRoaXMub3BlblN1Ym1lbnUoaW5kZXgsICdmaXJzdCcsIFJkdE1lbnVFeHBhbmRTb3VyY2UuU2hvcnRjdXQpLFxyXG4gICAgW0tCX0NPREUuQVJST1cuVVBdOiAoaW5kZXg6IG51bWJlcikgPT5cclxuICAgICAgdGhpcy5vcGVuU3VibWVudShpbmRleCwgJ2xhc3QnLCBSZHRNZW51RXhwYW5kU291cmNlLlNob3J0Y3V0KSxcclxuICAgIFtLQl9DT0RFLkhPTUVdOiAoKSA9PiB0aGlzLmZvY3VzSXRlbSgwKSxcclxuICAgIFtLQl9DT0RFLkVORF06ICgpID0+IHRoaXMuZm9jdXNJdGVtKHRoaXMucGFyc2VkSXRlbXMubGVuZ3RoIC0gMSksXHJcbiAgICBbS0JfQ09ERS5FTlRFUl06IChpbmRleDogbnVtYmVyKSA9PiB0aGlzLmludm9rZUl0ZW1DbGlja0J5SW5kZXgoaW5kZXgpLFxyXG4gICAgW0tCX0NPREUuU1BBQ0VCQVJdOiAoaW5kZXg6IG51bWJlcikgPT4gdGhpcy5pbnZva2VJdGVtQ2xpY2tCeUluZGV4KGluZGV4KSxcclxuICB9O1xyXG5cclxuICAvLyBSZXR1cm5zIGFsbCByb3V0ZXMgYXNvY2lhdGVkIHdpdGggaXRlbSBvciBpdHMgc3ViaXRlbXMuXHJcbiAgZ2V0Q2hpbGRSb3V0ZXMoaXRlbTogUGFyc2VkUmR0TWVudUl0ZW0pIHtcclxuICAgIHJldHVybiB0aGlzLmNoaWxkUm91dGVzTWFwLmdldChpdGVtKSA/PyBbXTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5yZHRSb3V0ZXIubmF2aWdhdGlvbkVuZCRcclxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGV2KSA9PiB0aGlzLmZpbHRlckl0ZW1zKCkpO1xyXG4gICAgdGhpcy5tZWFzdXJlKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAodGhpcy5jaGlsZHJlbikge1xyXG4gICAgICB0aGlzLnJlY2FsY3VsYXRlQ2hpbGRyZW4oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMubGlzdGVuV2luZG93UmVzaXplKCk7XHJcblxyXG4gICAgLy8gTm90IHVzaW5nIHRpbWVvdXQgcmVzdWx0cyBpbiBob3Jpem9udGFsIG92ZXJmbG93IG9uIGh0bWwgZWxlbWVudFxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMubWVhc3VyZSgpO1xyXG4gICAgICB0aGlzLnJlY2FsY3VsYXRlQ2hpbGRyZW4oKTtcclxuICAgIH0sIDUwKTtcclxuICB9XHJcblxyXG4gIHJlY2FsY3VsYXRlQ2hpbGRyZW4oKSB7XHJcbiAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgICAgIGNoaWxkLnJlY2FsY3VsYXRlUG9zaXRpb24oXHJcbiAgICAgICAgdGhpcy5wcmVmZXJyZWRIb3Jpem9udGFsRGlyLFxyXG4gICAgICAgIHRoaXMucHJlZmVycmVkVmVydGljYWxEaXJcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VTdWJtZW51cyhmb2N1c0V4cGFuZGVkID0gZmFsc2UpIHtcclxuICAgIGlmIChmb2N1c0V4cGFuZGVkICYmIHRoaXMuZXhwYW5kZWRDaGlsZCkge1xyXG4gICAgICB0aGlzLmZvY3VzSXRlbSh0aGlzLmV4cGFuZGVkQ2hpbGQuaXRlbSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmV4cGFuZGVkQ2hpbGQgPSBudWxsO1xyXG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvbkl0ZW1DbGljayhpdGVtOiBQYXJzZWRSZHRNZW51SXRlbSkge1xyXG4gICAgaWYgKFxyXG4gICAgICAobWVudUl0ZW1IYXNDaGlsZHJlbihpdGVtKSAmJiB0aGlzLmV4cGFuZGVkQ2hpbGQ/Lml0ZW0gIT09IGl0ZW0pIHx8XHJcbiAgICAgICh0aGlzLm9wZW5PbkhvdmVyICYmXHJcbiAgICAgICAgdGhpcy5leHBhbmRlZENoaWxkPy5zcmMgPT09IFJkdE1lbnVFeHBhbmRTb3VyY2UuSG92ZXIpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5hdXRvZm9jdXNTdWJtZW51SXRlbSA9IG51bGw7XHJcbiAgICAgIHRoaXMuZXhwYW5kZWRDaGlsZCA9IHsgaXRlbSwgc3JjOiBSZHRNZW51RXhwYW5kU291cmNlLkNsaWNrIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmV4cGFuZGVkQ2hpbGQgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBpdGVtLmNvbW1hbmQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgaXRlbS5jb21tYW5kKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25JdGVtUG9pbnRlckVudGVyKGl0ZW06IFBhcnNlZFJkdE1lbnVJdGVtKSB7XHJcbiAgICBpZiAodGhpcy5vcGVuT25Ib3Zlcikge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgbWVudUl0ZW1IYXNDaGlsZHJlbihpdGVtKSAmJlxyXG4gICAgICAgIHRoaXMuZXhwYW5kZWRDaGlsZD8uc3JjICE9PSBSZHRNZW51RXhwYW5kU291cmNlLkNsaWNrXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuYXV0b2ZvY3VzU3VibWVudUl0ZW0gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZXhwYW5kZWRDaGlsZCA9IHsgaXRlbSwgc3JjOiBSZHRNZW51RXhwYW5kU291cmNlLkhvdmVyIH07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5leHBhbmRlZENoaWxkID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uS2V5RG93bihpdGVtSW5kZXg6IG51bWJlciwgZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGNvbnN0IGhhc0FjdGlvbiA9IGV2ZW50LmNvZGUgaW4gdGhpcy5rZXlBY3Rpb25zO1xyXG4gICAgY29uc3QgaXNMZXR0ZXIgPVxyXG4gICAgICBSZHRTdHJpbmdVdGlscy5pc0FscGhhYmV0Q2hhcmFjdGVyKGV2ZW50LmtleSkgfHxcclxuICAgICAgUmR0U3RyaW5nVXRpbHMuaXNOdW1lcmljQ2hhcmFjdGVyKGV2ZW50LmtleSk7XHJcblxyXG4gICAgaWYgKGhhc0FjdGlvbiB8fCBpc0xldHRlcikge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChoYXNBY3Rpb24pIHtcclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGhhc0FjdGlvbikge1xyXG4gICAgICB0aGlzLmtleUFjdGlvbnNbZXZlbnQuY29kZV0oaXRlbUluZGV4KTtcclxuICAgIH0gZWxzZSBpZiAoaXNMZXR0ZXIpIHtcclxuICAgICAgY29uc3QgbmV4dCA9IGZpbmROZXh0SXRlbVdpdGhQcmVmaXgoXHJcbiAgICAgICAgdGhpcy5wYXJzZWRJdGVtcyxcclxuICAgICAgICBpdGVtSW5kZXgsXHJcbiAgICAgICAgZXZlbnQua2V5XHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChuZXh0ICE9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5mb2N1c0l0ZW0obmV4dCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBpbnZva2VJdGVtQ2xpY2soaXRlbTogUGFyc2VkUmR0TWVudUl0ZW0pIHtcclxuICAgIGlmIChtZW51SXRlbUhhc1JvdXRlKGl0ZW0pICYmIGl0ZW0ucm91dGVyTGluaykge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShpdGVtLnJvdXRlckxpbmspO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vbkl0ZW1DbGljayhpdGVtKTtcclxuICAgIHRoaXMuYXV0b2ZvY3VzU3VibWVudUl0ZW0gPSAnZmlyc3QnO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGZpbHRlckl0ZW1zKCkge1xyXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMucmR0Um91dGVyLnBhcnNlQWJzb2x1dGVVcmwoKTtcclxuICAgIGlmICghY3VycmVudCkge1xyXG4gICAgICB0aGlzLnBhcnNlZEl0ZW1zID0gdGhpcy5hbGxQYXJzZWRJdGVtcztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucGFyc2VkSXRlbXMgPSB0aGlzLmZpbHRlclJlYyh0aGlzLmFsbFBhcnNlZEl0ZW1zLCBjdXJyZW50KTtcclxuICAgIH1cclxuICAgIHRoaXMuY2hpbGRSb3V0ZXNNYXAgPSBnZXRDaGlsZFJvdXRlc01hcCh0aGlzLnBhcnNlZEl0ZW1zKTtcclxuICAgIHRoaXMubGlzdGVuU2hvcnRjdXRzKCk7XHJcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGZpbHRlclJlYyhcclxuICAgIGl0ZW1zOiBQYXJzZWRSZHRNZW51SXRlbVtdLFxyXG4gICAgY3VycmVudDogeyByb3V0ZTogUmR0Um91dGU7IHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PiB9XHJcbiAgKTogUGFyc2VkUmR0TWVudUl0ZW1bXSB7XHJcbiAgICBsZXQgY3VycmVudFBhcmVudCA9IGN1cnJlbnQucm91dGU7XHJcbiAgICBjb25zdCBjdXJyZW50UGFyYW1zID0gY3VycmVudC5wYXJhbXM7XHJcblxyXG4gICAgY29uc3QgZmlsdGVyZWQgPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHtcclxuICAgICAgaWYgKCFpdGVtLnJlcXVpcmVkUGFyZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgcmVxdWlyZWQgPSBpdGVtLnJlcXVpcmVkUGFyZW50O1xyXG4gICAgICB3aGlsZSAoY3VycmVudFBhcmVudC5hYnNvbHV0ZVBhdGggIT09IHJlcXVpcmVkLmFic29sdXRlUGF0aCkge1xyXG4gICAgICAgIGN1cnJlbnRQYXJlbnQgPSBjdXJyZW50UGFyZW50LnBhcmVudCE7XHJcbiAgICAgICAgaWYgKCFjdXJyZW50UGFyZW50KSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGxldCByZXF1aXJlZFBhcmVudDogUmR0Um91dGUgfCBudWxsID0gcmVxdWlyZWQ7XHJcbiAgICAgIGRvIHtcclxuICAgICAgICBjb25zdCBwYXRoID0gcmVxdWlyZWRQYXJlbnQuYWJzb2x1dGVQYXRoO1xyXG4gICAgICAgIGlmIChwYXRoIGluIGN1cnJlbnRQYXJhbXMpIHtcclxuICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHJlcXVpcmVkUGFyZW50LnN0YXRpY1BhcmFtcykge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudFBhcmFtc1twYXRoXVtrZXldICE9PSByZXF1aXJlZFBhcmVudC5zdGF0aWNQYXJhbXNba2V5XSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXF1aXJlZFBhcmVudCA9IHJlcXVpcmVkUGFyZW50LnBhcmVudDtcclxuICAgICAgfSB3aGlsZSAocmVxdWlyZWRQYXJlbnQpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBmaWx0ZXJlZC5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgaWYgKGl0ZW0uaXRlbXMpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgIGl0ZW1zOiB0aGlzLmZpbHRlclJlYyhpdGVtLml0ZW1zLCBjdXJyZW50KSxcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBpbnZva2VJdGVtQ2xpY2tCeUluZGV4KGl0ZW1JbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBpdGVtID0gdGhpcy5wYXJzZWRJdGVtc1tpdGVtSW5kZXhdO1xyXG4gICAgaWYgKCFpdGVtKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaW52b2tlSXRlbUNsaWNrKGl0ZW0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9wZW5TdWJtZW51KFxyXG4gICAgaXRlbUluZGV4OiBudW1iZXIsXHJcbiAgICB2aXNpYmxlRm9jdXM6ICdmaXJzdCcgfCAnbGFzdCcsXHJcbiAgICBzcmM6IFJkdE1lbnVFeHBhbmRTb3VyY2VcclxuICApIHtcclxuICAgIGlmIChcclxuICAgICAgaXRlbUluZGV4IDwgdGhpcy5wYXJzZWRJdGVtcy5sZW5ndGggJiZcclxuICAgICAgbWVudUl0ZW1IYXNDaGlsZHJlbih0aGlzLnBhcnNlZEl0ZW1zW2l0ZW1JbmRleF0pXHJcbiAgICApIHtcclxuICAgICAgY29uc3QgaXRlbSA9IHRoaXMucGFyc2VkSXRlbXNbaXRlbUluZGV4XTtcclxuICAgICAgdGhpcy5hdXRvZm9jdXNTdWJtZW51SXRlbSA9IHZpc2libGVGb2N1cztcclxuICAgICAgdGhpcy5leHBhbmRlZENoaWxkID0geyBpdGVtLCBzcmMgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBmb2N1c0l0ZW0oaXRlbTogbnVtYmVyIHwgUGFyc2VkUmR0TWVudUl0ZW0pIHtcclxuICAgIGxldCBpdGVtSW5kZXg6IG51bWJlcjtcclxuXHJcbiAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdudW1iZXInKSB7XHJcbiAgICAgIGl0ZW1JbmRleCA9IGl0ZW07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpdGVtSW5kZXggPSB0aGlzLnBhcnNlZEl0ZW1zLmluZGV4T2YoaXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGl0ZW1JbmRleCA+PSAwICYmIGl0ZW1JbmRleCA8IHRoaXMuZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuYmx1ckFsbEZvY3VzYWJsZSgpO1xyXG4gICAgICB0aGlzLmZvY3VzRm9jdXNhYmxlKGl0ZW1JbmRleCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZm9jdXNOZXh0SXRlbShpdGVtSW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgbmV4dCA9IChpdGVtSW5kZXggKyAxKSAlIHRoaXMucGFyc2VkSXRlbXMubGVuZ3RoO1xyXG4gICAgdGhpcy5mb2N1c0l0ZW0obmV4dCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZm9jdXNQcmV2SXRlbShpdGVtSW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgcHJldiA9XHJcbiAgICAgIChpdGVtSW5kZXggLSAxICsgdGhpcy5wYXJzZWRJdGVtcy5sZW5ndGgpICUgdGhpcy5wYXJzZWRJdGVtcy5sZW5ndGg7XHJcbiAgICB0aGlzLmZvY3VzSXRlbShwcmV2KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBibHVyQWxsRm9jdXNhYmxlKCkge1xyXG4gICAgdGhpcy5mb2N1c2FibGVFbGVtZW50cy5mb3JFYWNoKChlbCkgPT5cclxuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhlbC5uYXRpdmVFbGVtZW50LCBGT0NVU19WSVNJQkxFKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBmb2N1c0ZvY3VzYWJsZShpdGVtSW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgZWxSZWYgPSB0aGlzLmZvY3VzYWJsZUVsZW1lbnRzLmdldChpdGVtSW5kZXgpO1xyXG4gICAgaWYgKGVsUmVmKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZWxSZWYubmF0aXZlRWxlbWVudCwgRk9DVVNfVklTSUJMRSk7XHJcbiAgICAgIGVsUmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpwb2ludGVybW92ZScsIFsnJGV2ZW50J10pXHJcbiAgcHJvdGVjdGVkIG9uUG9pbnRlck1vdmUoZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xyXG4gICAgaWYgKHRoaXMub3Blbk9uSG92ZXIgJiYgdGhpcy5leHBhbmRlZENoaWxkKSB7XHJcbiAgICAgIGNvbnN0IGhpdGJveGVzID0gdGhpcy5nZXRIaXRib3hlcygpO1xyXG4gICAgICBjb25zdCBpc0luc2lkZSA9IGhpdGJveGVzLnNvbWUoKGhpdGJveCkgPT5cclxuICAgICAgICB0aGlzLmlzUG9pbnRlckluc2lkZUhpdGJveChoaXRib3gucmVjdCwgZXZlbnQpXHJcbiAgICAgICk7XHJcbiAgICAgIGZvciAobGV0IGkgPSBoaXRib3hlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIGNvbnN0IGhpdGJveCA9IGhpdGJveGVzW2ldO1xyXG4gICAgICAgIGlmICghaGl0Ym94LmZpeGVkICYmICFpc0luc2lkZSkge1xyXG4gICAgICAgICAgaGl0Ym94LmNsb3NlKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIENsb3NlcyBtZW51IGlmIHVzZXIgbmF2aWdhdGVzIG91dHNpZGUgaXQgdXNpbmcgVGFiLlxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpmb2N1c291dCcsIFsnJGV2ZW50J10pXHJcbiAgcHJvdGVjdGVkIGNoZWNrQWN0aXZlRWxlbWVudChldmVudDogRm9jdXNFdmVudCkge1xyXG4gICAgaWYgKHRoaXMuY2xvc2VPbkZvY3VzT3V0ICYmICF0aGlzLm9wZW5PbkhvdmVyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdmb2N1c291dCcsIGV2ZW50KTtcclxuXHJcbiAgICAgIGNvbnN0IHRoaXNFbCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudDtcclxuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldDtcclxuICAgICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHx8ICF0aGlzRWwuY29udGFpbnModGFyZ2V0KSkge1xyXG4gICAgICAgIHRoaXMuZXhwYW5kZWRDaGlsZCA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICBwcm90ZWN0ZWQgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBQb2ludGVyRXZlbnQpIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGNvbnN0IGVsUmVmID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgaWYgKCFlbFJlZi5jb250YWlucyh0YXJnZXQpKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VTdWJtZW51cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG1lYXN1cmUoKSB7XHJcbiAgICB0aGlzLm1lYXN1cmVCdXR0b25Db250YWluZXIoKTtcclxuICAgIHRoaXMubWVhc3VyZUNsaWVudFNpemUoKTtcclxuICAgIHRoaXMucmVhZE1hcmdpbigpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlYWRNYXJnaW4oKSB7XHJcbiAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgY29uc3QgdG9wVmFsID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFxyXG4gICAgICBSRFRfTUVOVV9NQVJHSU5fVE9QX1BST1BFUlRZX05BTUVcclxuICAgICk7XHJcbiAgICBjb25zdCBib3R0b21WYWwgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoXHJcbiAgICAgIFJEVF9NRU5VX01BUkdJTl9CT1RUT01fUFJPUEVSVFlfTkFNRVxyXG4gICAgKTtcclxuICAgIGNvbnN0IGxlZnRWYWwgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoXHJcbiAgICAgIFJEVF9NRU5VX01BUkdJTl9MRUZUX1BST1BFUlRZX05BTUVcclxuICAgICk7XHJcbiAgICBjb25zdCByaWdodFZhbCA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcclxuICAgICAgUkRUX01FTlVfTUFSR0lOX1JJR0hUX1BST1BFUlRZX05BTUVcclxuICAgICk7XHJcbiAgICB0aGlzLl9ib2R5TWFyZ2luID0ge1xyXG4gICAgICB0b3A6IHBhcnNlSW50KHRvcFZhbCkgfHwgMCxcclxuICAgICAgYm90dG9tOiBwYXJzZUludChib3R0b21WYWwpIHx8IDAsXHJcbiAgICAgIGxlZnQ6IHBhcnNlSW50KGxlZnRWYWwpIHx8IDAsXHJcbiAgICAgIHJpZ2h0OiBwYXJzZUludChyaWdodFZhbCkgfHwgMCxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgbWVhc3VyZUNsaWVudFNpemUoKSB7XHJcbiAgICB0aGlzLl9jbGllbnRTaXplID0ge1xyXG4gICAgICB3aWR0aDogdGhpcy5kb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoLFxyXG4gICAgICBoZWlnaHQ6IHRoaXMuZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG1lYXN1cmVCdXR0b25Db250YWluZXIoKSB7XHJcbiAgICBjb25zdCBlbCA9IHRoaXMuYnV0dG9uQ29udGFpbmVyO1xyXG4gICAgaWYgKGVsKSB7XHJcbiAgICAgIHRoaXMuX2J1dHRvbkNvbnRhaW5lclJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2J1dHRvbkNvbnRhaW5lclJlY3QgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgbGlzdGVuV2luZG93UmVzaXplKCkge1xyXG4gICAgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRocm90dGxlVGltZSgwLCBhbmltYXRpb25GcmFtZVNjaGVkdWxlciwgeyB0cmFpbGluZzogdHJ1ZSB9KSxcclxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubWVhc3VyZSgpO1xyXG4gICAgICAgIHRoaXMucmVjYWxjdWxhdGVDaGlsZHJlbigpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBsaXN0ZW5TaG9ydGN1dHMoKSB7XHJcbiAgICBjb25zdCBpdGVtc1dpdGhTaG9ydGN1dHMgPSBnZXRNZW51SXRlbXNTaG9ydGN1dHModGhpcy5wYXJzZWRJdGVtcyk7XHJcbiAgICBjb25zdCBzaG9ydGN1dHM6IFJkdFNob3J0Y3V0W10gPSBpdGVtc1dpdGhTaG9ydGN1dHMubWFwKFxyXG4gICAgICAoaXQpID0+IGl0LnNob3J0Y3V0XHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuc2hvcnRjdXRNYXAgPSB0aGlzLmdldFNob3J0Y3V0TWFwKGl0ZW1zV2l0aFNob3J0Y3V0cyk7XHJcbiAgICB0aGlzLnNob3J0Y3V0U3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLnNob3J0Y3V0U3ViID0gdGhpcy5zaG9ydGN1dFNlcnZpY2VcclxuICAgICAgLmxpc3RlbihzaG9ydGN1dHMpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxyXG4gICAgICAuc3Vic2NyaWJlKChldnQpID0+IHRoaXMub25TaG9ydGN1dChldnQuc2hvcnRjdXQpKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXRTaG9ydGN1dE1hcChcclxuICAgIGl0ZW1zV2l0aFNob3J0Y3V0czogUGFyc2VkUmR0TWVudUl0ZW1XaXRoU2hvcnRjdXRbXVxyXG4gICkge1xyXG4gICAgY29uc3Qgc2hvcnRjdXRNYXA6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFJkdE1lbnVJdGVtW10+ID0ge307XHJcbiAgICBpdGVtc1dpdGhTaG9ydGN1dHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBzaG9ydGN1dE1hcFtpdGVtLnNob3J0Y3V0LmhvdGtleXNWYWx1ZV0gPSBpdGVtLnBhdGg7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBzaG9ydGN1dE1hcDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvblNob3J0Y3V0KHNob3J0Y3V0OiBSZHRTaG9ydGN1dCkge1xyXG4gICAgY29uc3QgcGF0aCA9IHRoaXMuc2hvcnRjdXRNYXBbc2hvcnRjdXQuaG90a2V5c1ZhbHVlXTtcclxuICAgIGlmICghcGF0aCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYE1lbnUgc2hvcnRjdXQgJHtzaG9ydGN1dC5ob3RrZXlzVmFsdWV9IHdhcyBkZXRlY3RlZCwgYnV0IHRoZXJlIGlzIG5vIHBhdGggYXNzb2NpYXRlZCB3aXRoIGl0LmAsXHJcbiAgICAgICAgdGhpcy5zaG9ydGN1dE1hcFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbGFzdCA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcclxuICAgIGNvbnN0IGhhc1JvdXRlID0gbWVudUl0ZW1IYXNSb3V0ZShsYXN0KTtcclxuICAgIGNvbnN0IGhhc0NvbW1hbmQgPSB0eXBlb2YgbGFzdC5jb21tYW5kID09PSAnZnVuY3Rpb24nO1xyXG4gICAgaWYgKGhhc1JvdXRlIHx8IGhhc0NvbW1hbmQpIHtcclxuICAgICAgdGhpcy5jbG9zZVN1Ym1lbnVzKGZhbHNlKTtcclxuICAgICAgaWYgKGhhc0NvbW1hbmQpIHtcclxuICAgICAgICBsYXN0LmNvbW1hbmQhKCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGhhc1JvdXRlKSB7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUobGFzdC5yb3V0ZXJMaW5rISk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWN0aXZhdGVJdGVtUmVjdXJzaXZlbHkocGF0aCwgUmR0TWVudUV4cGFuZFNvdXJjZS5TaG9ydGN1dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYWN0aXZhdGVJdGVtUmVjdXJzaXZlbHkoXHJcbiAgICBwYXRoOiBQYXJzZWRSZHRNZW51SXRlbVtdLFxyXG4gICAgc3JjOiBSZHRNZW51RXhwYW5kU291cmNlXHJcbiAgKSB7XHJcbiAgICBjb25zdCBjaGlsZHJlbiA9IFsuLi5wYXRoXTtcclxuXHJcbiAgICBpZiAodGhpcy5zaG9ydGN1dE1vZGUgPT09IFJkdE1lbnVTaG9ydGN1dE1vZGUuT1BFTl9TVUJNRU5VKSB7XHJcbiAgICAgIGNvbnN0IGxhc3QgPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXTtcclxuICAgICAgaWYgKG1lbnVJdGVtSGFzQ2hpbGRyZW4obGFzdCkgJiYgbGFzdC5pdGVtc1swXSkge1xyXG4gICAgICAgIGNoaWxkcmVuLnB1c2gobGFzdC5pdGVtc1swXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0aGlzSXRlbSA9IGNoaWxkcmVuLnNoaWZ0KCkhO1xyXG5cclxuICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuZXhwYW5kZWRDaGlsZCA9IHsgaXRlbTogdGhpc0l0ZW0sIHNyYyB9O1xyXG4gICAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5jaGlsZHJlbi5maW5kKChjaGlsZCkgPT4gY2hpbGQuaXRlbSA9PT0gdGhpc0l0ZW0pO1xyXG4gICAgICBvdmVybGF5IS5mb2N1c0l0ZW1SZWN1cnNpdmVseShjaGlsZHJlbik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmV4cGFuZGVkQ2hpbGQgPSBudWxsO1xyXG4gICAgICB0aGlzLmZvY3VzSXRlbSh0aGlzSXRlbSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc1BvaW50ZXJJbnNpZGVIaXRib3goaGl0Ym94OiBET01SZWN0LCBldmVudDogUG9pbnRlckV2ZW50KSB7XHJcbiAgICBjb25zdCByZWN0ID0gaGl0Ym94O1xyXG4gICAgY29uc3QgeCA9IGV2ZW50LmNsaWVudFg7XHJcbiAgICBjb25zdCB5ID0gZXZlbnQuY2xpZW50WTtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB4ID49IHJlY3QubGVmdCAtIHRoaXMuaGl0Ym94TWFyZ2luICYmXHJcbiAgICAgIHggPD0gcmVjdC5yaWdodCArIHRoaXMuaGl0Ym94TWFyZ2luICYmXHJcbiAgICAgIHkgPj0gcmVjdC50b3AgLSB0aGlzLmhpdGJveE1hcmdpbiAmJlxyXG4gICAgICB5IDw9IHJlY3QuYm90dG9tICsgdGhpcy5oaXRib3hNYXJnaW5cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRIaXRib3hlcygpOiB7IHJlY3Q6IERPTVJlY3Q7IGZpeGVkOiBib29sZWFuOyBjbG9zZTogKCkgPT4gdm9pZCB9W10ge1xyXG4gICAgY29uc3QgYm94ZXMgPSB0aGlzLmdldE9wZW5NZW51Qm91bmRpbmdCb3hlcygpO1xyXG4gICAgY29uc3QgYnV0dG9uQ29udGFpbmVyUmVjdCA9IHRoaXMuYnV0dG9uQ29udGFpbmVyUmVjdDtcclxuICAgIGlmIChidXR0b25Db250YWluZXJSZWN0KSB7XHJcbiAgICAgIGJveGVzLnB1c2goeyByZWN0OiBidXR0b25Db250YWluZXJSZWN0LCBmaXhlZDogdHJ1ZSwgY2xvc2U6ICgpID0+IHt9IH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJveGVzO1xyXG4gIH1cclxuXHJcbiAgZ2V0T3Blbk1lbnVCb3VuZGluZ0JveGVzKCkge1xyXG4gICAgY29uc3QgYm94ZXM6IHsgcmVjdDogRE9NUmVjdDsgZml4ZWQ6IGJvb2xlYW47IGNsb3NlOiAoKSA9PiB2b2lkIH1bXSA9IFtdO1xyXG4gICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKChvdmVybGF5KSA9PiB7XHJcbiAgICAgIHRoaXMuZ2V0T3Blbk1lbnVCb3VuZGluZ0JveGVzUmVjKG92ZXJsYXksIGJveGVzKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGJveGVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRPcGVuTWVudUJvdW5kaW5nQm94ZXNSZWMoXHJcbiAgICBvdmVybGF5OiBSZHRNZW51T3ZlcmxheUNvbXBvbmVudCxcclxuICAgIGJveGVzOiB7IHJlY3Q6IERPTVJlY3Q7IGZpeGVkOiBib29sZWFuOyBjbG9zZTogKCkgPT4gdm9pZCB9W11cclxuICApOiBib29sZWFuIHtcclxuICAgIGlmIChvdmVybGF5LmV4cGFuZGVkKSB7XHJcbiAgICAgIGxldCBzb21lQnlDbGljayA9IGZhbHNlO1xyXG4gICAgICBvdmVybGF5LmNoaWxkcmVuLmZvckVhY2goXHJcbiAgICAgICAgKGNoaWxkKSA9PlxyXG4gICAgICAgICAgKHNvbWVCeUNsaWNrIHx8PSB0aGlzLmdldE9wZW5NZW51Qm91bmRpbmdCb3hlc1JlYyhjaGlsZCwgYm94ZXMpKVxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBmaXhlZCA9XHJcbiAgICAgICAgc29tZUJ5Q2xpY2sgfHwgb3ZlcmxheS5zZWxmRXhwYW5kU3JjID09PSBSZHRNZW51RXhwYW5kU291cmNlLkNsaWNrO1xyXG4gICAgICBib3hlcy5wdXNoKHtcclxuICAgICAgICByZWN0OiBvdmVybGF5LmJveCxcclxuICAgICAgICBmaXhlZDogZml4ZWQsXHJcbiAgICAgICAgY2xvc2U6ICgpID0+IG92ZXJsYXkuY2xvc2VTZWxmKGZhbHNlKSxcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBmaXhlZDtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbn1cclxuIl19
|