@villedemontreal/angular-ui 3.2.0-pre.build.1 → 3.3.1

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.
@@ -0,0 +1,522 @@
1
+ /*
2
+ * Copyright (c) 2022 Ville de Montreal. All rights reserved.
3
+ * Licensed under the MIT license.
4
+ * See LICENSE file in the project root for full license information.
5
+ */
6
+ import { OverlayConfig } from '@angular/cdk/overlay';
7
+ import { DomPortal } from '@angular/cdk/portal';
8
+ import { ChangeDetectionStrategy, Component, ContentChildren, Directive, EventEmitter, HostListener, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/cdk/overlay";
11
+ /**
12
+ * Unique ID for each dropdown menu
13
+ */
14
+ let dropdownMenuUniqueId = 0;
15
+ export class BaoDropdownMenuItem {
16
+ constructor(renderer, elementRef, _parent) {
17
+ this.renderer = renderer;
18
+ this.elementRef = elementRef;
19
+ this._parent = _parent;
20
+ /**
21
+ * Is the list item disabled
22
+ */
23
+ this.disabled = false;
24
+ }
25
+ get nativeElement() {
26
+ return this.elementRef.nativeElement;
27
+ }
28
+ spaceKeyEvent() {
29
+ if (document.activeElement == this.nativeElement) {
30
+ this.nativeElement.click();
31
+ }
32
+ }
33
+ onClick(el) {
34
+ if (this.nativeElement.attributes['href']) {
35
+ this._parent.setNavigationAttribute(this.nativeElement);
36
+ }
37
+ // Prevent double-click on checkbox input that undoes the toggle
38
+ if (!el.classList.contains('bao-checkbox-content-container')) {
39
+ this.propagateClick();
40
+ }
41
+ }
42
+ enterKeyEvent() {
43
+ if (document.activeElement == this.nativeElement) {
44
+ if (this.nativeElement.attributes['href']) {
45
+ this._parent.setNavigationAttribute(this.nativeElement);
46
+ }
47
+ this.propagateClick();
48
+ }
49
+ }
50
+ ngAfterViewInit() {
51
+ this.addContentDiv();
52
+ if (!this.disabled) {
53
+ this.renderer.setAttribute(this.nativeElement, 'tabIndex', '0');
54
+ }
55
+ this.addPaddingClass();
56
+ // Remove input element inside item from keyboard navigation sequence
57
+ if (this.nativeElement.classList.contains('has-element-left')) {
58
+ this.renderer.setAttribute(this.nativeElement.children.item(0).firstElementChild, 'tabIndex', '-1');
59
+ }
60
+ }
61
+ ngOnChanges(changes) {
62
+ if (changes['disabled'] && changes['disabled'].currentValue == true) {
63
+ this.disableItem();
64
+ }
65
+ }
66
+ /** Regroups label and description in a new div to help with layout */
67
+ addContentDiv() {
68
+ const children = Array.from(this.nativeElement.children);
69
+ const labelIndex = children.findIndex(c => c.localName === 'bao-dropdown-menu-item-label');
70
+ const labelElement = children[labelIndex];
71
+ this.renderer.removeChild(this.nativeElement, children[labelIndex]);
72
+ const contentDiv = this.renderer.createElement('div');
73
+ this.renderer.addClass(contentDiv, 'bao-dropdown-menu-item-content');
74
+ this.renderer.appendChild(this.nativeElement, contentDiv);
75
+ this.renderer.appendChild(contentDiv, labelElement);
76
+ const descriptionIndex = children.findIndex(c => c.localName === 'bao-dropdown-menu-item-description');
77
+ if (descriptionIndex > 0) {
78
+ const descriptionElement = children[descriptionIndex];
79
+ this.renderer.removeChild(this.nativeElement, children[descriptionIndex]);
80
+ this.renderer.appendChild(contentDiv, descriptionElement);
81
+ }
82
+ }
83
+ addPaddingClass() {
84
+ const children = Array.from(this.nativeElement.children);
85
+ // Menu item has extra element next to label
86
+ if (children.length > 1) {
87
+ // Only toggle element can be on the right
88
+ if (children.findIndex(c => c.localName === 'bao-toggle') > 0) {
89
+ this.renderer.addClass(this.nativeElement, 'has-element-right');
90
+ }
91
+ // Icon, checkbox, radio button or avatar must be on the left
92
+ else {
93
+ this.renderer.addClass(this.nativeElement, 'has-element-left');
94
+ }
95
+ }
96
+ }
97
+ disableItem() {
98
+ if (this.disabled) {
99
+ this.renderer.setAttribute(this.nativeElement, 'aria-disabled', 'true');
100
+ this.renderer.setAttribute(this.nativeElement, 'tabIndex', '-1');
101
+ }
102
+ }
103
+ /**
104
+ * This method propagates a click event to menu item children with inputs (checkbox, radio button)
105
+ */
106
+ propagateClick() {
107
+ for (let i = 0; i < this.nativeElement.children.length; i++) {
108
+ if (this.nativeElement.children.item(i).firstElementChild.localName ==
109
+ 'input') {
110
+ this.nativeElement.children.item(i).firstElementChild.click();
111
+ }
112
+ }
113
+ }
114
+ }
115
+ BaoDropdownMenuItem.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuItem, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: BaoDropdownMenuComponent }], target: i0.ɵɵFactoryTarget.Directive });
116
+ BaoDropdownMenuItem.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.1", type: BaoDropdownMenuItem, selector: "bao-dropdown-menu-item, [bao-dropdown-menu-item]", inputs: { disabled: "disabled" }, host: { listeners: { "window:keyup.space": "spaceKeyEvent()", "click": "onClick($event.target)", "window:keydown.enter": "enterKeyEvent()" }, properties: { "class.bao-dropdown-menu-item-disabled": "disabled===true" }, classAttribute: "bao-dropdown-menu-item" }, usesOnChanges: true, ngImport: i0 });
117
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuItem, decorators: [{
118
+ type: Directive,
119
+ args: [{
120
+ selector: 'bao-dropdown-menu-item, [bao-dropdown-menu-item]',
121
+ host: {
122
+ class: 'bao-dropdown-menu-item',
123
+ '[class.bao-dropdown-menu-item-disabled]': 'disabled===true'
124
+ }
125
+ }]
126
+ }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: BaoDropdownMenuComponent }]; }, propDecorators: { disabled: [{
127
+ type: Input
128
+ }], spaceKeyEvent: [{
129
+ type: HostListener,
130
+ args: ['window:keyup.space']
131
+ }], onClick: [{
132
+ type: HostListener,
133
+ args: ['click', ['$event.target']]
134
+ }], enterKeyEvent: [{
135
+ type: HostListener,
136
+ args: ['window:keydown.enter']
137
+ }] } });
138
+ export class BaoDropdownMenuComponent {
139
+ constructor(cdr, renderer, elementRef) {
140
+ this.cdr = cdr;
141
+ this.renderer = renderer;
142
+ this.elementRef = elementRef;
143
+ /**
144
+ * Fired when the dropdown-menu changes its 'isOpen' value
145
+ */
146
+ this.isOpenChange = new EventEmitter();
147
+ /**
148
+ * Fired when menu is closed by key event triggered from menu item
149
+ */
150
+ this.isClosedByKeyEvent = new EventEmitter();
151
+ /**
152
+ * Unique identifier of the dropdown menu
153
+ */
154
+ this.menuId = `bao-dropdown-menu-${++dropdownMenuUniqueId}`;
155
+ /**
156
+ * Is the dropwdown menu currently open
157
+ */
158
+ this._isOpen = false;
159
+ }
160
+ get isOpen() {
161
+ return this._isOpen;
162
+ }
163
+ get activeItemIndex() {
164
+ return this._activeItemIndex;
165
+ }
166
+ get menuPortal() {
167
+ return this._menuPortal;
168
+ }
169
+ get nativeElement() {
170
+ return this.elementRef.nativeElement;
171
+ }
172
+ set isOpen(isOpen) {
173
+ this._isOpen = isOpen;
174
+ this.cdr.detectChanges();
175
+ this.isOpenChange.emit(isOpen);
176
+ }
177
+ set activeItemIndex(index) {
178
+ this._activeItemIndex = index;
179
+ }
180
+ upKeyEvent() {
181
+ if (this.isOpen) {
182
+ const index = isNaN(this._activeItemIndex) ? 0 : this._activeItemIndex;
183
+ const nextIndex = this.getNextActivableItemIndex(index, false);
184
+ this.focusNextItem(nextIndex);
185
+ }
186
+ }
187
+ downKeyEvent() {
188
+ if (this.isOpen) {
189
+ const index = isNaN(this._activeItemIndex) ? 0 : this._activeItemIndex;
190
+ const nextIndex = this.getNextActivableItemIndex(index, true);
191
+ this.focusNextItem(nextIndex);
192
+ }
193
+ }
194
+ /** Prevents focus to be lost when TAB has reached end of menu */
195
+ tabKeyEvent() {
196
+ if (this.isOpen) {
197
+ if (document.activeElement === this._listItems.last.nativeElement) {
198
+ this.isClosedByKeyEvent.emit();
199
+ }
200
+ }
201
+ }
202
+ /** Prevents focus to be lost when SHIFT + TAB has reached beginning of menu */
203
+ shiftTabKeyEvent() {
204
+ if (this.isOpen) {
205
+ if (document.activeElement === this._listItems.first.nativeElement) {
206
+ this.isClosedByKeyEvent.emit();
207
+ }
208
+ }
209
+ }
210
+ ngAfterViewInit() {
211
+ this.renderer.setAttribute(this.nativeElement, 'id', this.menuId);
212
+ this._menuPortal = new DomPortal(this._menuContent);
213
+ }
214
+ focusFirstItem() {
215
+ this._activeItemIndex = 0;
216
+ this._listItems.first.nativeElement.focus();
217
+ }
218
+ open() {
219
+ this.isOpen = true;
220
+ }
221
+ close() {
222
+ this.isOpen = false;
223
+ }
224
+ /** Move the aria-current attribute to new active page */
225
+ setNavigationAttribute(activePageElement) {
226
+ const previousActivePage = this._listItems.find((item) => {
227
+ return item.nativeElement.attributes['aria-current'] === 'page';
228
+ });
229
+ if (previousActivePage) {
230
+ this.renderer.removeAttribute(previousActivePage.nativeElement, 'aria-current');
231
+ this.renderer.removeClass(previousActivePage.nativeElement, 'active-link');
232
+ }
233
+ this.renderer.setAttribute(activePageElement, 'aria-current', 'page');
234
+ this.renderer.addClass(activePageElement, 'active-link');
235
+ }
236
+ focusNextItem(nextIndex) {
237
+ this._activeItemIndex = nextIndex;
238
+ this._listItems.get(nextIndex).nativeElement.focus();
239
+ }
240
+ /**
241
+ * Finds the next activable tab index when navigating with up and down arrow or TAB keys
242
+ * @param currentIndex List item index which currently has focus
243
+ * @param isDown Whether the navigation is going in the down direction or not
244
+ * @param isBackward If recursive function is going backward looking for last activable item in list
245
+ * @returns Index of the next item that will receive focus
246
+ */
247
+ getNextActivableItemIndex(currentIndex, isDown, isBackward = false) {
248
+ if (!this._listItems.get(currentIndex).disabled) {
249
+ if (!this.canMove(currentIndex, isDown)) {
250
+ return currentIndex;
251
+ }
252
+ }
253
+ else {
254
+ if (!this.canMove(currentIndex, isDown)) {
255
+ const previousIndex = isDown ? currentIndex - 1 : currentIndex + 1;
256
+ return this.getNextActivableItemIndex(previousIndex, isDown, true);
257
+ }
258
+ }
259
+ const nextIndex = isDown ? currentIndex + 1 : currentIndex - 1;
260
+ if (this._listItems.get(nextIndex).disabled) {
261
+ if (isBackward) {
262
+ return currentIndex;
263
+ }
264
+ return this.getNextActivableItemIndex(nextIndex, isDown);
265
+ }
266
+ return nextIndex;
267
+ }
268
+ /**
269
+ * Finds if focus has reached end or beginning of list
270
+ * @param currentIndex List item index which currently has focus
271
+ * @param isDown Whether the navigation is going in the down direction or not
272
+ * @returns Can focus move to next item or not
273
+ */
274
+ canMove(currentIndex, isDown) {
275
+ return !((currentIndex == 0 && !isDown) ||
276
+ (currentIndex == this._listItems.length - 1 && isDown));
277
+ }
278
+ }
279
+ BaoDropdownMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
280
+ BaoDropdownMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.1", type: BaoDropdownMenuComponent, selector: "bao-dropdown-menu", outputs: { isOpenChange: "isOpenChange", isClosedByKeyEvent: "isClosedByKeyEvent" }, host: { listeners: { "window:keyup.arrowup": "upKeyEvent()", "window:keyup.arrowdown": "downKeyEvent()", "window:keydown.tab": "tabKeyEvent()", "window:keydown.shift.tab": "shiftTabKeyEvent()" }, properties: { "class.bao-overlay-transparent-backdrop": "isOpen===false", "class.bao-dropdown-menu-closed": "isOpen===false", "attr.aria-expanded": "isOpen" }, classAttribute: "bao-dropdown-menu-container" }, queries: [{ propertyName: "_listItems", predicate: BaoDropdownMenuItem, descendants: true }], viewQueries: [{ propertyName: "_menuContent", first: true, predicate: ["menuContent"], descendants: true }], ngImport: i0, template: "<div #menuContent class=\"bao-dropdown-menu\" tabindex=\"-1\">\n <ng-content></ng-content>\n</div>\n", styles: [".bao-dropdown-menu-container.bao-dropdown-menu-closed{display:none}.bao-dropdown-menu{min-width:16rem;max-width:32rem;overflow-y:auto;background:#ffffff;box-shadow:0 .5rem 2rem #0000001a;border-radius:.25rem;padding-top:.5rem;padding-bottom:.5rem}.bao-dropdown-menu .bao-overlay-transparent-backdrop{background-color:#fff0;display:none}.bao-dropdown-menu ul{list-style-type:none;padding:0;margin:0}.bao-dropdown-menu h5{padding:.5rem 0 .5rem 1rem;margin:0}.bao-dropdown-menu .bao-dropdown-menu-item{display:flex;align-items:center;text-decoration:none;border-bottom:none;cursor:default}.bao-dropdown-menu .bao-dropdown-menu-item:hover{background-color:#f8f9fa}.bao-dropdown-menu .bao-dropdown-menu-item:active{background-color:#eefaf8}.bao-dropdown-menu .bao-dropdown-menu-item:focus{box-shadow:inset 0 0 0 .25rem #98bcde}.bao-dropdown-menu .bao-dropdown-menu-item.active-link{background-color:#eefaf8}.bao-dropdown-menu .bao-dropdown-menu-item.has-element-right{padding-right:1.5rem}.bao-dropdown-menu .bao-dropdown-menu-item.has-element-left{padding-left:1rem}.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled{cursor:not-allowed;pointer-events:none}.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled:hover,.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled:active{background:#ffffff}.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled .bao-dropdown-menu-item-content .bao-dropdown-menu-item-label,.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled .bao-dropdown-menu-item-content .bao-dropdown-menu-item-description{color:#adb2bd}.bao-dropdown-menu .bao-dropdown-menu-item>.bao-dropdown-menu-item-content{display:flex;flex-direction:column;margin:.5rem 1rem;background-color:inherit}.bao-dropdown-menu .bao-dropdown-menu-item>.bao-dropdown-menu-item-content .bao-dropdown-menu-item-label{font-weight:400;font-size:1rem;line-height:1.5rem;color:#212529}.bao-dropdown-menu .bao-dropdown-menu-item>.bao-dropdown-menu-item-content .bao-dropdown-menu-item-description{font-weight:400;font-size:.875rem;line-height:1.25rem;color:#637381}.bao-dropdown-menu .bao-dropdown-menu-item>.bao-icon{color:#adb2bd;flex-shrink:0}.bao-dropdown-menu .bao-dropdown-menu-divider hr{margin-top:.5rem;margin-bottom:.5rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
281
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuComponent, decorators: [{
282
+ type: Component,
283
+ args: [{ selector: 'bao-dropdown-menu', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
284
+ class: 'bao-dropdown-menu-container',
285
+ '[class.bao-overlay-transparent-backdrop]': 'isOpen===false',
286
+ '[class.bao-dropdown-menu-closed]': 'isOpen===false',
287
+ '[attr.aria-expanded]': 'isOpen'
288
+ }, template: "<div #menuContent class=\"bao-dropdown-menu\" tabindex=\"-1\">\n <ng-content></ng-content>\n</div>\n", styles: [".bao-dropdown-menu-container.bao-dropdown-menu-closed{display:none}.bao-dropdown-menu{min-width:16rem;max-width:32rem;overflow-y:auto;background:#ffffff;box-shadow:0 .5rem 2rem #0000001a;border-radius:.25rem;padding-top:.5rem;padding-bottom:.5rem}.bao-dropdown-menu .bao-overlay-transparent-backdrop{background-color:#fff0;display:none}.bao-dropdown-menu ul{list-style-type:none;padding:0;margin:0}.bao-dropdown-menu h5{padding:.5rem 0 .5rem 1rem;margin:0}.bao-dropdown-menu .bao-dropdown-menu-item{display:flex;align-items:center;text-decoration:none;border-bottom:none;cursor:default}.bao-dropdown-menu .bao-dropdown-menu-item:hover{background-color:#f8f9fa}.bao-dropdown-menu .bao-dropdown-menu-item:active{background-color:#eefaf8}.bao-dropdown-menu .bao-dropdown-menu-item:focus{box-shadow:inset 0 0 0 .25rem #98bcde}.bao-dropdown-menu .bao-dropdown-menu-item.active-link{background-color:#eefaf8}.bao-dropdown-menu .bao-dropdown-menu-item.has-element-right{padding-right:1.5rem}.bao-dropdown-menu .bao-dropdown-menu-item.has-element-left{padding-left:1rem}.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled{cursor:not-allowed;pointer-events:none}.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled:hover,.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled:active{background:#ffffff}.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled .bao-dropdown-menu-item-content .bao-dropdown-menu-item-label,.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled .bao-dropdown-menu-item-content .bao-dropdown-menu-item-description{color:#adb2bd}.bao-dropdown-menu .bao-dropdown-menu-item>.bao-dropdown-menu-item-content{display:flex;flex-direction:column;margin:.5rem 1rem;background-color:inherit}.bao-dropdown-menu .bao-dropdown-menu-item>.bao-dropdown-menu-item-content .bao-dropdown-menu-item-label{font-weight:400;font-size:1rem;line-height:1.5rem;color:#212529}.bao-dropdown-menu .bao-dropdown-menu-item>.bao-dropdown-menu-item-content .bao-dropdown-menu-item-description{font-weight:400;font-size:.875rem;line-height:1.25rem;color:#637381}.bao-dropdown-menu .bao-dropdown-menu-item>.bao-icon{color:#adb2bd;flex-shrink:0}.bao-dropdown-menu .bao-dropdown-menu-divider hr{margin-top:.5rem;margin-bottom:.5rem}\n"] }]
289
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i0.ElementRef }]; }, propDecorators: { isOpenChange: [{
290
+ type: Output
291
+ }], isClosedByKeyEvent: [{
292
+ type: Output
293
+ }], _menuContent: [{
294
+ type: ViewChild,
295
+ args: ['menuContent']
296
+ }], _listItems: [{
297
+ type: ContentChildren,
298
+ args: [BaoDropdownMenuItem, { descendants: true }]
299
+ }], upKeyEvent: [{
300
+ type: HostListener,
301
+ args: ['window:keyup.arrowup']
302
+ }], downKeyEvent: [{
303
+ type: HostListener,
304
+ args: ['window:keyup.arrowdown']
305
+ }], tabKeyEvent: [{
306
+ type: HostListener,
307
+ args: ['window:keydown.tab']
308
+ }], shiftTabKeyEvent: [{
309
+ type: HostListener,
310
+ args: ['window:keydown.shift.tab']
311
+ }] } });
312
+ /**
313
+ * Directive to be applied on element that will trigger the opening and closing of menu.
314
+ */
315
+ export class BaoDropdownMenuTrigger {
316
+ constructor(renderer, elementRef, overlay) {
317
+ this.renderer = renderer;
318
+ this.elementRef = elementRef;
319
+ this.overlay = overlay;
320
+ this._overlayRef = null;
321
+ this._isMenuOpen = false;
322
+ }
323
+ get nativeElement() {
324
+ return this.elementRef.nativeElement;
325
+ }
326
+ escapeKeyEvent() {
327
+ if (this._isMenuOpen) {
328
+ this.closeMenu();
329
+ this.nativeElement.focus();
330
+ }
331
+ }
332
+ /** Enter key event triggers click event which opens menu,
333
+ * then focus is put on first item in the menu */
334
+ enterKeyEvent() {
335
+ if (this._isMenuOpen && document.activeElement === this.nativeElement) {
336
+ this.menu.focusFirstItem();
337
+ }
338
+ }
339
+ onClick() {
340
+ this.toggleMenu();
341
+ }
342
+ ngAfterViewInit() {
343
+ this.renderer.setAttribute(this.nativeElement, 'role', 'button');
344
+ this.renderer.setAttribute(this.nativeElement, 'aria-controls', `bao-dropdown-menu-${dropdownMenuUniqueId}`);
345
+ this.menu.isClosedByKeyEvent.subscribe(() => {
346
+ this.closeMenu();
347
+ this.nativeElement.focus();
348
+ });
349
+ }
350
+ ngOnDestroy() {
351
+ if (this._overlayRef) {
352
+ this._overlayRef.dispose();
353
+ }
354
+ }
355
+ toggleMenu() {
356
+ return this._isMenuOpen ? this.closeMenu() : this.openMenu();
357
+ }
358
+ closeMenu() {
359
+ this._isMenuOpen = false;
360
+ this.menu.close();
361
+ if (this._overlayRef) {
362
+ this._overlayRef.detach();
363
+ }
364
+ }
365
+ openMenu() {
366
+ if (!this.menu) {
367
+ return;
368
+ }
369
+ const overlayRef = this.createOverlay();
370
+ overlayRef.attach(this.menu.menuPortal);
371
+ this._isMenuOpen = true;
372
+ this.menu.open();
373
+ }
374
+ createOverlay() {
375
+ if (!this._overlayRef) {
376
+ const config = this.getOverlayConfig();
377
+ this._overlayRef = this.overlay.create(config);
378
+ }
379
+ this._overlayRef.backdropClick().subscribe(() => {
380
+ this.closeMenu();
381
+ });
382
+ return this._overlayRef;
383
+ }
384
+ getOverlayConfig() {
385
+ return new OverlayConfig({
386
+ positionStrategy: this.overlay
387
+ .position()
388
+ .flexibleConnectedTo(this.elementRef)
389
+ .withLockedPosition()
390
+ .withGrowAfterOpen()
391
+ .withPositions([
392
+ {
393
+ // top-left of the overlay is connected to bottom-left of the origin;
394
+ originX: 'start',
395
+ originY: 'bottom',
396
+ overlayX: 'start',
397
+ overlayY: 'top'
398
+ },
399
+ {
400
+ // bottom-left of the overlay is connected to top-left of the origin;
401
+ originX: 'start',
402
+ originY: 'top',
403
+ overlayX: 'start',
404
+ overlayY: 'bottom'
405
+ }
406
+ ]),
407
+ backdropClass: 'bao-overlay-transparent-backdrop',
408
+ hasBackdrop: true,
409
+ scrollStrategy: this.overlay.scrollStrategies.block()
410
+ });
411
+ }
412
+ }
413
+ BaoDropdownMenuTrigger.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuTrigger, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i1.Overlay }], target: i0.ɵɵFactoryTarget.Directive });
414
+ BaoDropdownMenuTrigger.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.1", type: BaoDropdownMenuTrigger, selector: "bao-dropdown-menu-trigger, [bao-dropdown-menu-trigger], [baoDropdownMenuTriggerFor]", inputs: { menu: ["baoDropdownMenuTriggerFor", "menu"] }, host: { listeners: { "window:keyup.escape": "escapeKeyEvent()", "window:keyup.enter": "enterKeyEvent()", "click": "onClick()" }, classAttribute: "bao-dropdown-menu-trigger" }, ngImport: i0 });
415
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuTrigger, decorators: [{
416
+ type: Directive,
417
+ args: [{
418
+ selector: 'bao-dropdown-menu-trigger, [bao-dropdown-menu-trigger], [baoDropdownMenuTriggerFor]',
419
+ host: { class: 'bao-dropdown-menu-trigger' }
420
+ }]
421
+ }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.Overlay }]; }, propDecorators: { menu: [{
422
+ type: Input,
423
+ args: ['baoDropdownMenuTriggerFor']
424
+ }], escapeKeyEvent: [{
425
+ type: HostListener,
426
+ args: ['window:keyup.escape']
427
+ }], enterKeyEvent: [{
428
+ type: HostListener,
429
+ args: ['window:keyup.enter']
430
+ }], onClick: [{
431
+ type: HostListener,
432
+ args: ['click']
433
+ }] } });
434
+ /**
435
+ * Sections of list items in menu. Apply proper styling to section's title if there is one.
436
+ */
437
+ export class BaoDropdownMenuSection {
438
+ constructor(elementRef, renderer) {
439
+ this.elementRef = elementRef;
440
+ this.renderer = renderer;
441
+ }
442
+ get nativeElement() {
443
+ return this.elementRef.nativeElement;
444
+ }
445
+ ngAfterViewInit() {
446
+ const children = Array.from(this.nativeElement.childNodes);
447
+ const textIndex = children.findIndex((c) => c.nodeName === '#text');
448
+ if (textIndex > -1) {
449
+ this.insertTitle(children, textIndex);
450
+ }
451
+ }
452
+ insertTitle(children, txtIdx) {
453
+ const titleElement = this.renderer.createElement('h5');
454
+ this.renderer.setProperty(titleElement, 'textContent', children[txtIdx].nodeValue);
455
+ this.renderer.removeChild(this.nativeElement, children[txtIdx]);
456
+ const listIndex = children.findIndex((c) => c.nodeName === 'UL');
457
+ this.renderer.insertBefore(this.nativeElement, titleElement, children[listIndex]);
458
+ }
459
+ }
460
+ BaoDropdownMenuSection.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuSection, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
461
+ BaoDropdownMenuSection.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.1", type: BaoDropdownMenuSection, selector: "bao-dropdown-menu-section, [bao-dropdown-menu-section]", host: { classAttribute: "bao-dropdown-menu-section" }, ngImport: i0 });
462
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuSection, decorators: [{
463
+ type: Directive,
464
+ args: [{
465
+ selector: 'bao-dropdown-menu-section, [bao-dropdown-menu-section]',
466
+ host: { class: 'bao-dropdown-menu-section' }
467
+ }]
468
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; } });
469
+ /**
470
+ * Label of a list item, add css class to apply proper styling.
471
+ */
472
+ export class BaoDropdownMenuItemLabel {
473
+ }
474
+ BaoDropdownMenuItemLabel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuItemLabel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
475
+ BaoDropdownMenuItemLabel.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.1", type: BaoDropdownMenuItemLabel, selector: "bao-dropdown-menu-item-label, [bao-dropdown-menu-item-label]", host: { classAttribute: "bao-dropdown-menu-item-label" }, ngImport: i0 });
476
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuItemLabel, decorators: [{
477
+ type: Directive,
478
+ args: [{
479
+ selector: 'bao-dropdown-menu-item-label, [bao-dropdown-menu-item-label]',
480
+ host: { class: 'bao-dropdown-menu-item-label' }
481
+ }]
482
+ }] });
483
+ /**
484
+ * Description of a list item, add css class to apply proper styling.
485
+ */
486
+ export class BaoDropdownMenuItemDescription {
487
+ }
488
+ BaoDropdownMenuItemDescription.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuItemDescription, deps: [], target: i0.ɵɵFactoryTarget.Directive });
489
+ BaoDropdownMenuItemDescription.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.1", type: BaoDropdownMenuItemDescription, selector: "bao-dropdown-menu-item-description, [bao-dropdown-menu-item-description]", host: { classAttribute: "bao-dropdown-menu-item-description" }, ngImport: i0 });
490
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuItemDescription, decorators: [{
491
+ type: Directive,
492
+ args: [{
493
+ selector: 'bao-dropdown-menu-item-description, [bao-dropdown-menu-item-description]',
494
+ host: { class: 'bao-dropdown-menu-item-description' }
495
+ }]
496
+ }] });
497
+ /**
498
+ * Divider to separate sections.
499
+ */
500
+ export class BaoDropdownMenuDivider {
501
+ constructor(renderer, elementRef) {
502
+ this.renderer = renderer;
503
+ this.elementRef = elementRef;
504
+ }
505
+ get nativeElement() {
506
+ return this.elementRef.nativeElement;
507
+ }
508
+ ngAfterContentInit() {
509
+ this.renderer.setAttribute(this.nativeElement, 'role', 'separator');
510
+ }
511
+ }
512
+ BaoDropdownMenuDivider.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuDivider, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
513
+ BaoDropdownMenuDivider.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.1", type: BaoDropdownMenuDivider, selector: "bao-dropdown-menu-divider, [bao-dropdown-menu-divider]", host: { classAttribute: "bao-dropdown-menu-divider" }, ngImport: i0, template: `<hr />`, isInline: true });
514
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuDivider, decorators: [{
515
+ type: Component,
516
+ args: [{
517
+ template: `<hr />`,
518
+ selector: 'bao-dropdown-menu-divider, [bao-dropdown-menu-divider]',
519
+ host: { class: 'bao-dropdown-menu-divider' }
520
+ }]
521
+ }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }]; } });
522
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tbWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXVpL3NyYy9saWIvZHJvcGRvd24tbWVudS9kcm9wZG93bi1tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItdWkvc3JjL2xpYi9kcm9wZG93bi1tZW51L2Ryb3Bkb3duLW1lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFHTCxhQUFhLEVBRWQsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUdMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsZUFBZSxFQUNmLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBSU4sU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQzs7O0FBRXZCOztHQUVHO0FBQ0gsSUFBSSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7QUFRN0IsTUFBTSxPQUFPLG1CQUFtQjtJQU05QixZQUNVLFFBQW1CLEVBQ25CLFVBQW1DLEVBQ25DLE9BQWlDO1FBRmpDLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFDbkMsWUFBTyxHQUFQLE9BQU8sQ0FBMEI7UUFSM0M7O1dBRUc7UUFDYSxhQUFRLEdBQUcsS0FBSyxDQUFDO0lBTTlCLENBQUM7SUFFSixJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO0lBQ3ZDLENBQUM7SUFHRCxhQUFhO1FBQ1gsSUFBSSxRQUFRLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDaEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxL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LEVBQUUsS0FBSyxFQUFFLDhCQUE4QixFQUFFO2lCQUNoRDs7QUFFRDs7R0FFRztBQU1ILE1BQU0sT0FBTyw4QkFBOEI7OzJIQUE5Qiw4QkFBOEI7K0dBQTlCLDhCQUE4QjsyRkFBOUIsOEJBQThCO2tCQUwxQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFDTiwwRUFBMEU7b0JBQzVFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxvQ0FBb0MsRUFBRTtpQkFDdEQ7O0FBRUQ7O0dBRUc7QUFNSCxNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDLFlBQ1UsUUFBbUIsRUFDbkIsVUFBbUM7UUFEbkMsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixlQUFVLEdBQVYsVUFBVSxDQUF5QjtJQUMxQyxDQUFDO0lBRUosSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztJQUN2QyxDQUFDO0lBRU0sa0JBQWtCO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7O21IQVpVLHNCQUFzQjt1R0FBdEIsc0JBQXNCLHFKQUp2QixRQUFROzJGQUlQLHNCQUFzQjtrQkFMbEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsUUFBUTtvQkFDbEIsUUFBUSxFQUFFLHdEQUF3RDtvQkFDbEUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLDJCQUEyQixFQUFFO2lCQUM3QyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgVmlsbGUgZGUgTW9udHJlYWwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBTZWUgTElDRU5TRSBmaWxlIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqL1xuXG5pbXBvcnQge1xuICBDb25uZWN0ZWRQb3NpdGlvbixcbiAgT3ZlcmxheSxcbiAgT3ZlcmxheUNvbmZpZyxcbiAgT3ZlcmxheVJlZlxufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBEb21Qb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBVbmlxdWUgSUQgZm9yIGVhY2ggZHJvcGRvd24gbWVudVxuICovXG5sZXQgZHJvcGRvd25NZW51VW5pcXVlSWQgPSAwO1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnYmFvLWRyb3Bkb3duLW1lbnUtaXRlbSwgW2Jhby1kcm9wZG93bi1tZW51LWl0ZW1dJyxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAnYmFvLWRyb3Bkb3duLW1lbnUtaXRlbScsXG4gICAgJ1tjbGFzcy5iYW8tZHJvcGRvd24tbWVudS1pdGVtLWRpc2FibGVkXSc6ICdkaXNhYmxlZD09PXRydWUnXG4gIH1cbn0pXG5leHBvcnQgY2xhc3MgQmFvRHJvcGRvd25NZW51SXRlbSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XG4gIC8qKlxuICAgKiBJcyB0aGUgbGlzdCBpdGVtIGRpc2FibGVkXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgZGlzYWJsZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBwcml2YXRlIF9wYXJlbnQ6IEJhb0Ryb3Bkb3duTWVudUNvbXBvbmVudFxuICApIHt9XG5cbiAgZ2V0IG5hdGl2ZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXl1cC5zcGFjZScpXG4gIHNwYWNlS2V5RXZlbnQoKSB7XG4gICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT0gdGhpcy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50LnRhcmdldCddKVxuICBvbkNsaWNrKGVsOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuYXR0cmlidXRlc1snaHJlZiddKSB7XG4gICAgICB0aGlzLl9wYXJlbnQuc2V0TmF2aWdhdGlvbkF0dHJpYnV0ZSh0aGlzLm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cbiAgICAvLyBQcmV2ZW50IGRvdWJsZS1jbGljayBvbiBjaGVja2JveCBpbnB1dCB0aGF0IHVuZG9lcyB0aGUgdG9nZ2xlXG4gICAgaWYgKCFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2Jhby1jaGVja2JveC1jb250ZW50LWNvbnRhaW5lcicpKSB7XG4gICAgICB0aGlzLnByb3BhZ2F0ZUNsaWNrKCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleWRvd24uZW50ZXInKVxuICBlbnRlcktleUV2ZW50KCkge1xuICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09IHRoaXMubmF0aXZlRWxlbWVudCkge1xuICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5hdHRyaWJ1dGVzWydocmVmJ10pIHtcbiAgICAgICAgdGhpcy5fcGFyZW50LnNldE5hdmlnYXRpb25BdHRyaWJ1dGUodGhpcy5uYXRpdmVFbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIHRoaXMucHJvcGFnYXRlQ2xpY2soKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYWRkQ29udGVudERpdigpO1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5uYXRpdmVFbGVtZW50LCAndGFiSW5kZXgnLCAnMCcpO1xuICAgIH1cbiAgICB0aGlzLmFkZFBhZGRpbmdDbGFzcygpO1xuICAgIC8vIFJlbW92ZSBpbnB1dCBlbGVtZW50IGluc2lkZSBpdGVtIGZyb20ga2V5Ym9hcmQgbmF2aWdhdGlvbiBzZXF1ZW5jZVxuICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdoYXMtZWxlbWVudC1sZWZ0JykpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKFxuICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW4uaXRlbSgwKS5maXJzdEVsZW1lbnRDaGlsZCxcbiAgICAgICAgJ3RhYkluZGV4JyxcbiAgICAgICAgJy0xJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydkaXNhYmxlZCddICYmIGNoYW5nZXNbJ2Rpc2FibGVkJ10uY3VycmVudFZhbHVlID09IHRydWUpIHtcbiAgICAgIHRoaXMuZGlzYWJsZUl0ZW0oKTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVncm91cHMgbGFiZWwgYW5kIGRlc2NyaXB0aW9uIGluIGEgbmV3IGRpdiB0byBoZWxwIHdpdGggbGF5b3V0ICovXG4gIHByaXZhdGUgYWRkQ29udGVudERpdigpOiB2b2lkIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20odGhpcy5uYXRpdmVFbGVtZW50LmNoaWxkcmVuKTtcbiAgICBjb25zdCBsYWJlbEluZGV4ID0gY2hpbGRyZW4uZmluZEluZGV4KFxuICAgICAgYyA9PiBjLmxvY2FsTmFtZSA9PT0gJ2Jhby1kcm9wZG93bi1tZW51LWl0ZW0tbGFiZWwnXG4gICAgKTtcbiAgICBjb25zdCBsYWJlbEVsZW1lbnQgPSBjaGlsZHJlbltsYWJlbEluZGV4XTtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHRoaXMubmF0aXZlRWxlbWVudCwgY2hpbGRyZW5bbGFiZWxJbmRleF0pO1xuICAgIGNvbnN0IGNvbnRlbnREaXYgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoY29udGVudERpdiwgJ2Jhby1kcm9wZG93bi1tZW51LWl0ZW0tY29udGVudCcpO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5uYXRpdmVFbGVtZW50LCBjb250ZW50RGl2KTtcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGNvbnRlbnREaXYsIGxhYmVsRWxlbWVudCk7XG4gICAgY29uc3QgZGVzY3JpcHRpb25JbmRleCA9IGNoaWxkcmVuLmZpbmRJbmRleChcbiAgICAgIGMgPT4gYy5sb2NhbE5hbWUgPT09ICdiYW8tZHJvcGRvd24tbWVudS1pdGVtLWRlc2NyaXB0aW9uJ1xuICAgICk7XG4gICAgaWYgKGRlc2NyaXB0aW9uSW5kZXggPiAwKSB7XG4gICAgICBjb25zdCBkZXNjcmlwdGlvbkVsZW1lbnQgPSBjaGlsZHJlbltkZXNjcmlwdGlvbkluZGV4XTtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQodGhpcy5uYXRpdmVFbGVtZW50LCBjaGlsZHJlbltkZXNjcmlwdGlvbkluZGV4XSk7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGNvbnRlbnREaXYsIGRlc2NyaXB0aW9uRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRQYWRkaW5nQ2xhc3MoKTogdm9pZCB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKHRoaXMubmF0aXZlRWxlbWVudC5jaGlsZHJlbik7XG4gICAgLy8gTWVudSBpdGVtIGhhcyBleHRyYSBlbGVtZW50IG5leHQgdG8gbGFiZWxcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMSkge1xuICAgICAgLy8gT25seSB0b2dnbGUgZWxlbWVudCBjYW4gYmUgb24gdGhlIHJpZ2h0XG4gICAgICBpZiAoY2hpbGRyZW4uZmluZEluZGV4KGMgPT4gYy5sb2NhbE5hbWUgPT09ICdiYW8tdG9nZ2xlJykgPiAwKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5uYXRpdmVFbGVtZW50LCAnaGFzLWVsZW1lbnQtcmlnaHQnKTtcbiAgICAgIH1cbiAgICAgIC8vIEljb24sIGNoZWNrYm94LCByYWRpbyBidXR0b24gb3IgYXZhdGFyIG11c3QgYmUgb24gdGhlIGxlZnRcbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMubmF0aXZlRWxlbWVudCwgJ2hhcy1lbGVtZW50LWxlZnQnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRpc2FibGVJdGVtKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLm5hdGl2ZUVsZW1lbnQsICdhcmlhLWRpc2FibGVkJywgJ3RydWUnKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMubmF0aXZlRWxlbWVudCwgJ3RhYkluZGV4JywgJy0xJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHByb3BhZ2F0ZXMgYSBjbGljayBldmVudCB0byBtZW51IGl0ZW0gY2hpbGRyZW4gd2l0aCBpbnB1dHMgKGNoZWNrYm94LCByYWRpbyBidXR0b24pXG4gICAqL1xuICBwcml2YXRlIHByb3BhZ2F0ZUNsaWNrKCk6IHZvaWQge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uYXRpdmVFbGVtZW50LmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5jaGlsZHJlbi5pdGVtKGkpLmZpcnN0RWxlbWVudENoaWxkLmxvY2FsTmFtZSA9PVxuICAgICAgICAnaW5wdXQnXG4gICAgICApIHtcbiAgICAgICAgKFxuICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5jaGlsZHJlbi5pdGVtKGkpLmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50XG4gICAgICAgICkuY2xpY2soKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Jhby1kcm9wZG93bi1tZW51JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Ryb3Bkb3duLW1lbnUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kcm9wZG93bi1tZW51LmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdiYW8tZHJvcGRvd24tbWVudS1jb250YWluZXInLFxuICAgICdbY2xhc3MuYmFvLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BdJzogJ2lzT3Blbj09PWZhbHNlJyxcbiAgICAnW2NsYXNzLmJhby1kcm9wZG93bi1tZW51LWNsb3NlZF0nOiAnaXNPcGVuPT09ZmFsc2UnLFxuICAgICdbYXR0ci5hcmlhLWV4cGFuZGVkXSc6ICdpc09wZW4nXG4gIH1cbn0pXG5leHBvcnQgY2xhc3MgQmFvRHJvcGRvd25NZW51Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIHRoZSBkcm9wZG93bi1tZW51IGNoYW5nZXMgaXRzICdpc09wZW4nIHZhbHVlXG4gICAqL1xuICBAT3V0cHV0KCkgcHVibGljIGlzT3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogRmlyZWQgd2hlbiBtZW51IGlzIGNsb3NlZCBieSBrZXkgZXZlbnQgdHJpZ2dlcmVkIGZyb20gbWVudSBpdGVtXG4gICAqL1xuICBAT3V0cHV0KCkgcHVibGljIGlzQ2xvc2VkQnlLZXlFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICogQ29udGVudCBvZiBtZW51IHRvIGJlIGxvYWRlZCBpbnNpZGUgT3ZlcmxheVxuICAgKi9cbiAgQFZpZXdDaGlsZCgnbWVudUNvbnRlbnQnKSBfbWVudUNvbnRlbnQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIC8qKlxuICAgKiBBbGwgbGlzdCBpdGVtcyBpbnNpZGUgbWVudVxuICAgKi9cbiAgQENvbnRlbnRDaGlsZHJlbihCYW9Ecm9wZG93bk1lbnVJdGVtLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gIF9saXN0SXRlbXM6IFF1ZXJ5TGlzdDxCYW9Ecm9wZG93bk1lbnVJdGVtPjtcblxuICAvKipcbiAgICogVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGRyb3Bkb3duIG1lbnVcbiAgICovXG4gIHJlYWRvbmx5IG1lbnVJZCA9IGBiYW8tZHJvcGRvd24tbWVudS0keysrZHJvcGRvd25NZW51VW5pcXVlSWR9YDtcblxuICAvKipcbiAgICogSXMgdGhlIGRyb3B3ZG93biBtZW51IGN1cnJlbnRseSBvcGVuXG4gICAqL1xuICBwcml2YXRlIF9pc09wZW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHBvcnRhbCB3aGljaCBpcyBhdHRhY2hlZCB0byBPdmVybGF5XG4gICAqL1xuICBwcml2YXRlIF9tZW51UG9ydGFsOiBEb21Qb3J0YWw7XG5cbiAgLyoqXG4gICAqIEluZGV4IG9mIGN1cnJlbnRseSBhY3RpdmUgbGlzdCBpdGVtXG4gICAqL1xuICBwcml2YXRlIF9hY3RpdmVJdGVtSW5kZXg6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD5cbiAgKSB7fVxuXG4gIGdldCBpc09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzT3BlbjtcbiAgfVxuICBnZXQgYWN0aXZlSXRlbUluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleDtcbiAgfVxuICBnZXQgbWVudVBvcnRhbCgpOiBEb21Qb3J0YWwge1xuICAgIHJldHVybiB0aGlzLl9tZW51UG9ydGFsO1xuICB9XG4gIGdldCBuYXRpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cbiAgc2V0IGlzT3Blbihpc09wZW46IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc09wZW4gPSBpc09wZW47XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMuaXNPcGVuQ2hhbmdlLmVtaXQoaXNPcGVuKTtcbiAgfVxuICBzZXQgYWN0aXZlSXRlbUluZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLl9hY3RpdmVJdGVtSW5kZXggPSBpbmRleDtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXl1cC5hcnJvd3VwJylcbiAgdXBLZXlFdmVudCgpIHtcbiAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gaXNOYU4odGhpcy5fYWN0aXZlSXRlbUluZGV4KSA/IDAgOiB0aGlzLl9hY3RpdmVJdGVtSW5kZXg7XG4gICAgICBjb25zdCBuZXh0SW5kZXggPSB0aGlzLmdldE5leHRBY3RpdmFibGVJdGVtSW5kZXgoaW5kZXgsIGZhbHNlKTtcbiAgICAgIHRoaXMuZm9jdXNOZXh0SXRlbShuZXh0SW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXl1cC5hcnJvd2Rvd24nKVxuICBkb3duS2V5RXZlbnQoKSB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICBjb25zdCBpbmRleCA9IGlzTmFOKHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCkgPyAwIDogdGhpcy5fYWN0aXZlSXRlbUluZGV4O1xuICAgICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5nZXROZXh0QWN0aXZhYmxlSXRlbUluZGV4KGluZGV4LCB0cnVlKTtcbiAgICAgIHRoaXMuZm9jdXNOZXh0SXRlbShuZXh0SW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBQcmV2ZW50cyBmb2N1cyB0byBiZSBsb3N0IHdoZW4gVEFCIGhhcyByZWFjaGVkIGVuZCBvZiBtZW51ICAqL1xuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bi50YWInKVxuICB0YWJLZXlFdmVudCgpIHtcbiAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLl9saXN0SXRlbXMubGFzdC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuaXNDbG9zZWRCeUtleUV2ZW50LmVtaXQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogUHJldmVudHMgZm9jdXMgdG8gYmUgbG9zdCB3aGVuIFNISUZUICsgVEFCIGhhcyByZWFjaGVkIGJlZ2lubmluZyBvZiBtZW51ICAqL1xuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bi5zaGlmdC50YWInKVxuICBzaGlmdFRhYktleUV2ZW50KCkge1xuICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMuX2xpc3RJdGVtcy5maXJzdC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuaXNDbG9zZWRCeUtleUV2ZW50LmVtaXQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMubmF0aXZlRWxlbWVudCwgJ2lkJywgdGhpcy5tZW51SWQpO1xuICAgIHRoaXMuX21lbnVQb3J0YWwgPSBuZXcgRG9tUG9ydGFsKHRoaXMuX21lbnVDb250ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBmb2N1c0ZpcnN0SXRlbSgpOiB2b2lkIHtcbiAgICB0aGlzLl9hY3RpdmVJdGVtSW5kZXggPSAwO1xuICAgIHRoaXMuX2xpc3RJdGVtcy5maXJzdC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICBwdWJsaWMgb3BlbigpOiB2b2lkIHtcbiAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBNb3ZlIHRoZSBhcmlhLWN1cnJlbnQgYXR0cmlidXRlIHRvIG5ldyBhY3RpdmUgcGFnZSAqL1xuICBwdWJsaWMgc2V0TmF2aWdhdGlvbkF0dHJpYnV0ZShhY3RpdmVQYWdlRWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91c0FjdGl2ZVBhZ2UgPSB0aGlzLl9saXN0SXRlbXMuZmluZChcbiAgICAgIChpdGVtOiBCYW9Ecm9wZG93bk1lbnVJdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtLm5hdGl2ZUVsZW1lbnQuYXR0cmlidXRlc1snYXJpYS1jdXJyZW50J10gPT09ICdwYWdlJztcbiAgICAgIH1cbiAgICApO1xuICAgIGlmIChwcmV2aW91c0FjdGl2ZVBhZ2UpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKFxuICAgICAgICBwcmV2aW91c0FjdGl2ZVBhZ2UubmF0aXZlRWxlbWVudCxcbiAgICAgICAgJ2FyaWEtY3VycmVudCdcbiAgICAgICk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKFxuICAgICAgICBwcmV2aW91c0FjdGl2ZVBhZ2UubmF0aXZlRWxlbWVudCxcbiAgICAgICAgJ2FjdGl2ZS1saW5rJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoYWN0aXZlUGFnZUVsZW1lbnQsICdhcmlhLWN1cnJlbnQnLCAncGFnZScpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoYWN0aXZlUGFnZUVsZW1lbnQsICdhY3RpdmUtbGluaycpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c05leHRJdGVtKG5leHRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fYWN0aXZlSXRlbUluZGV4ID0gbmV4dEluZGV4O1xuICAgIHRoaXMuX2xpc3RJdGVtcy5nZXQobmV4dEluZGV4KS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIG5leHQgYWN0aXZhYmxlIHRhYiBpbmRleCB3aGVuIG5hdmlnYXRpbmcgd2l0aCB1cCBhbmQgZG93biBhcnJvdyBvciBUQUIga2V5c1xuICAgKiBAcGFyYW0gY3VycmVudEluZGV4IExpc3QgaXRlbSBpbmRleCB3aGljaCBjdXJyZW50bHkgaGFzIGZvY3VzXG4gICAqIEBwYXJhbSBpc0Rvd24gV2hldGhlciB0aGUgbmF2aWdhdGlvbiBpcyBnb2luZyBpbiB0aGUgZG93biBkaXJlY3Rpb24gb3Igbm90XG4gICAqIEBwYXJhbSBpc0JhY2t3YXJkIElmIHJlY3Vyc2l2ZSBmdW5jdGlvbiBpcyBnb2luZyBiYWNrd2FyZCBsb29raW5nIGZvciBsYXN0IGFjdGl2YWJsZSBpdGVtIGluIGxpc3RcbiAgICogQHJldHVybnMgSW5kZXggb2YgdGhlIG5leHQgaXRlbSB0aGF0IHdpbGwgcmVjZWl2ZSBmb2N1c1xuICAgKi9cbiAgcHJpdmF0ZSBnZXROZXh0QWN0aXZhYmxlSXRlbUluZGV4KFxuICAgIGN1cnJlbnRJbmRleDogbnVtYmVyLFxuICAgIGlzRG93bjogYm9vbGVhbixcbiAgICBpc0JhY2t3YXJkID0gZmFsc2VcbiAgKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuX2xpc3RJdGVtcy5nZXQoY3VycmVudEluZGV4KS5kaXNhYmxlZCkge1xuICAgICAgaWYgKCF0aGlzLmNhbk1vdmUoY3VycmVudEluZGV4LCBpc0Rvd24pKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50SW5kZXg7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghdGhpcy5jYW5Nb3ZlKGN1cnJlbnRJbmRleCwgaXNEb3duKSkge1xuICAgICAgICBjb25zdCBwcmV2aW91c0luZGV4ID0gaXNEb3duID8gY3VycmVudEluZGV4IC0gMSA6IGN1cnJlbnRJbmRleCArIDE7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE5leHRBY3RpdmFibGVJdGVtSW5kZXgocHJldmlvdXNJbmRleCwgaXNEb3duLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV4dEluZGV4ID0gaXNEb3duID8gY3VycmVudEluZGV4ICsgMSA6IGN1cnJlbnRJbmRleCAtIDE7XG4gICAgaWYgKHRoaXMuX2xpc3RJdGVtcy5nZXQobmV4dEluZGV4KS5kaXNhYmxlZCkge1xuICAgICAgaWYgKGlzQmFja3dhcmQpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRJbmRleDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmdldE5leHRBY3RpdmFibGVJdGVtSW5kZXgobmV4dEluZGV4LCBpc0Rvd24pO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dEluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGlmIGZvY3VzIGhhcyByZWFjaGVkIGVuZCBvciBiZWdpbm5pbmcgb2YgbGlzdFxuICAgKiBAcGFyYW0gY3VycmVudEluZGV4IExpc3QgaXRlbSBpbmRleCB3aGljaCBjdXJyZW50bHkgaGFzIGZvY3VzXG4gICAqIEBwYXJhbSBpc0Rvd24gV2hldGhlciB0aGUgbmF2aWdhdGlvbiBpcyBnb2luZyBpbiB0aGUgZG93biBkaXJlY3Rpb24gb3Igbm90XG4gICAqIEByZXR1cm5zIENhbiBmb2N1cyBtb3ZlIHRvIG5leHQgaXRlbSBvciBub3RcbiAgICovXG4gIHByaXZhdGUgY2FuTW92ZShjdXJyZW50SW5kZXg6IG51bWJlciwgaXNEb3duOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEoXG4gICAgICAoY3VycmVudEluZGV4ID09IDAgJiYgIWlzRG93bikgfHxcbiAgICAgIChjdXJyZW50SW5kZXggPT0gdGhpcy5fbGlzdEl0ZW1zLmxlbmd0aCAtIDEgJiYgaXNEb3duKVxuICAgICk7XG4gIH1cbn1cbi8qKlxuICogRGlyZWN0aXZlIHRvIGJlIGFwcGxpZWQgb24gZWxlbWVudCB0aGF0IHdpbGwgdHJpZ2dlciB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyBvZiBtZW51LlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6XG4gICAgJ2Jhby1kcm9wZG93bi1tZW51LXRyaWdnZXIsIFtiYW8tZHJvcGRvd24tbWVudS10cmlnZ2VyXSwgW2Jhb0Ryb3Bkb3duTWVudVRyaWdnZXJGb3JdJyxcbiAgaG9zdDogeyBjbGFzczogJ2Jhby1kcm9wZG93bi1tZW51LXRyaWdnZXInIH1cbn0pXG5leHBvcnQgY2xhc3MgQmFvRHJvcGRvd25NZW51VHJpZ2dlciBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgnYmFvRHJvcGRvd25NZW51VHJpZ2dlckZvcicpIG1lbnU6IEJhb0Ryb3Bkb3duTWVudUNvbXBvbmVudCB8IG51bGw7XG4gIHByaXZhdGUgX292ZXJsYXlSZWY6IE92ZXJsYXlSZWYgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfaXNNZW51T3BlbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheVxuICApIHt9XG5cbiAgZ2V0IG5hdGl2ZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXl1cC5lc2NhcGUnKVxuICBlc2NhcGVLZXlFdmVudCgpIHtcbiAgICBpZiAodGhpcy5faXNNZW51T3Blbikge1xuICAgICAgdGhpcy5jbG9zZU1lbnUoKTtcbiAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBFbnRlciBrZXkgZXZlbnQgdHJpZ2dlcnMgY2xpY2sgZXZlbnQgd2hpY2ggb3BlbnMgbWVudSxcbiAgICogIHRoZW4gZm9jdXMgaXMgcHV0IG9uIGZpcnN0IGl0ZW0gaW4gdGhlIG1lbnUgKi9cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleXVwLmVudGVyJylcbiAgZW50ZXJLZXlFdmVudCgpIHtcbiAgICBpZiAodGhpcy5faXNNZW51T3BlbiAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMubWVudS5mb2N1c0ZpcnN0SXRlbSgpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJylcbiAgb25DbGljaygpIHtcbiAgICB0aGlzLnRvZ2dsZU1lbnUoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5uYXRpdmVFbGVtZW50LCAncm9sZScsICdidXR0b24nKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShcbiAgICAgIHRoaXMubmF0aXZlRWxlbWVudCxcbiAgICAgICdhcmlhLWNvbnRyb2xzJyxcbiAgICAgIGBiYW8tZHJvcGRvd24tbWVudS0ke2Ryb3Bkb3duTWVudVVuaXF1ZUlkfWBcbiAgICApO1xuICAgIHRoaXMubWVudS5pc0Nsb3NlZEJ5S2V5RXZlbnQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuY2xvc2VNZW51KCk7XG4gICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fb3ZlcmxheVJlZikge1xuICAgICAgdGhpcy5fb3ZlcmxheVJlZi5kaXNwb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0b2dnbGVNZW51KCk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLl9pc01lbnVPcGVuID8gdGhpcy5jbG9zZU1lbnUoKSA6IHRoaXMub3Blbk1lbnUoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvc2VNZW51KCk6IHZvaWQge1xuICAgIHRoaXMuX2lzTWVudU9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLm1lbnUuY2xvc2UoKTtcbiAgICBpZiAodGhpcy5fb3ZlcmxheVJlZikge1xuICAgICAgdGhpcy5fb3ZlcmxheVJlZi5kZXRhY2goKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9wZW5NZW51KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tZW51KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG92ZXJsYXlSZWYgPSB0aGlzLmNyZWF0ZU92ZXJsYXkoKTtcbiAgICBvdmVybGF5UmVmLmF0dGFjaCh0aGlzLm1lbnUubWVudVBvcnRhbCk7XG4gICAgdGhpcy5faXNNZW51T3BlbiA9IHRydWU7XG4gICAgdGhpcy5tZW51Lm9wZW4oKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlT3ZlcmxheSgpOiBPdmVybGF5UmVmIHtcbiAgICBpZiAoIXRoaXMuX292ZXJsYXlSZWYpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0T3ZlcmxheUNvbmZpZygpO1xuICAgICAgdGhpcy5fb3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoY29uZmlnKTtcbiAgICB9XG4gICAgdGhpcy5fb3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuY2xvc2VNZW51KCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuX292ZXJsYXlSZWY7XG4gIH1cblxuICBwcml2YXRlIGdldE92ZXJsYXlDb25maWcoKTogT3ZlcmxheUNvbmZpZyB7XG4gICAgcmV0dXJuIG5ldyBPdmVybGF5Q29uZmlnKHtcbiAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMub3ZlcmxheVxuICAgICAgICAucG9zaXRpb24oKVxuICAgICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLmVsZW1lbnRSZWYpXG4gICAgICAgIC53aXRoTG9ja2VkUG9zaXRpb24oKVxuICAgICAgICAud2l0aEdyb3dBZnRlck9wZW4oKVxuICAgICAgICAud2l0aFBvc2l0aW9ucyhbXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gdG9wLWxlZnQgb2YgdGhlIG92ZXJsYXkgaXMgY29ubmVjdGVkIHRvIGJvdHRvbS1sZWZ0IG9mIHRoZSBvcmlnaW47XG4gICAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgICAgICAgIG92ZXJsYXlZOiAndG9wJ1xuICAgICAgICAgIH0gYXMgQ29ubmVjdGVkUG9zaXRpb24sXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gYm90dG9tLWxlZnQgb2YgdGhlIG92ZXJsYXkgaXMgY29ubmVjdGVkIHRvIHRvcC1sZWZ0IG9mIHRoZSBvcmlnaW47XG4gICAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJ1xuICAgICAgICAgIH0gYXMgQ29ubmVjdGVkUG9zaXRpb25cbiAgICAgICAgXSksXG4gICAgICBiYWNrZHJvcENsYXNzOiAnYmFvLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AnLFxuICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMuYmxvY2soKVxuICAgIH0pO1xuICB9XG59XG4vKipcbiAqIFNlY3Rpb25zIG9mIGxpc3QgaXRlbXMgaW4gbWVudS4gQXBwbHkgcHJvcGVyIHN0eWxpbmcgdG8gc2VjdGlvbidzIHRpdGxlIGlmIHRoZXJlIGlzIG9uZS5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnYmFvLWRyb3Bkb3duLW1lbnUtc2VjdGlvbiwgW2Jhby1kcm9wZG93bi1tZW51LXNlY3Rpb25dJyxcbiAgaG9zdDogeyBjbGFzczogJ2Jhby1kcm9wZG93bi1tZW51LXNlY3Rpb24nIH1cbn0pXG5leHBvcnQgY2xhc3MgQmFvRHJvcGRvd25NZW51U2VjdGlvbiBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMlxuICApIHt9XG5cbiAgZ2V0IG5hdGl2ZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKHRoaXMubmF0aXZlRWxlbWVudC5jaGlsZE5vZGVzKTtcbiAgICBjb25zdCB0ZXh0SW5kZXggPSBjaGlsZHJlbi5maW5kSW5kZXgoXG4gICAgICAoYzogQ2hpbGROb2RlKSA9PiBjLm5vZGVOYW1lID09PSAnI3RleHQnXG4gICAgKTtcbiAgICBpZiAodGV4dEluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuaW5zZXJ0VGl0bGUoY2hpbGRyZW4sIHRleHRJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbnNlcnRUaXRsZShjaGlsZHJlbjogQ2hpbGROb2RlW10sIHR4dElkeDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdGl0bGVFbGVtZW50ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdoNScpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoXG4gICAgICB0aXRsZUVsZW1lbnQsXG4gICAgICAndGV4dENvbnRlbnQnLFxuICAgICAgY2hpbGRyZW5bdHh0SWR4XS5ub2RlVmFsdWVcbiAgICApO1xuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQodGhpcy5uYXRpdmVFbGVtZW50LCBjaGlsZHJlblt0eHRJZHhdKTtcbiAgICBjb25zdCBsaXN0SW5kZXggPSBjaGlsZHJlbi5maW5kSW5kZXgoKGM6IENoaWxkTm9kZSkgPT4gYy5ub2RlTmFtZSA9PT0gJ1VMJyk7XG4gICAgdGhpcy5yZW5kZXJlci5pbnNlcnRCZWZvcmUoXG4gICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQsXG4gICAgICB0aXRsZUVsZW1lbnQsXG4gICAgICBjaGlsZHJlbltsaXN0SW5kZXhdXG4gICAgKTtcbiAgfVxufVxuLyoqXG4gKiBMYWJlbCBvZiBhIGxpc3QgaXRlbSwgYWRkIGNzcyBjbGFzcyB0byBhcHBseSBwcm9wZXIgc3R5bGluZy5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnYmFvLWRyb3Bkb3duLW1lbnUtaXRlbS1sYWJlbCwgW2Jhby1kcm9wZG93bi1tZW51LWl0ZW0tbGFiZWxdJyxcbiAgaG9zdDogeyBjbGFzczogJ2Jhby1kcm9wZG93bi1tZW51LWl0ZW0tbGFiZWwnIH1cbn0pXG5leHBvcnQgY2xhc3MgQmFvRHJvcGRvd25NZW51SXRlbUxhYmVsIHt9XG4vKipcbiAqIERlc2NyaXB0aW9uIG9mIGEgbGlzdCBpdGVtLCBhZGQgY3NzIGNsYXNzIHRvIGFwcGx5IHByb3BlciBzdHlsaW5nLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6XG4gICAgJ2Jhby1kcm9wZG93bi1tZW51LWl0ZW0tZGVzY3JpcHRpb24sIFtiYW8tZHJvcGRvd24tbWVudS1pdGVtLWRlc2NyaXB0aW9uXScsXG4gIGhvc3Q6IHsgY2xhc3M6ICdiYW8tZHJvcGRvd24tbWVudS1pdGVtLWRlc2NyaXB0aW9uJyB9XG59KVxuZXhwb3J0IGNsYXNzIEJhb0Ryb3Bkb3duTWVudUl0ZW1EZXNjcmlwdGlvbiB7fVxuLyoqXG4gKiBEaXZpZGVyIHRvIHNlcGFyYXRlIHNlY3Rpb25zLlxuICovXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGU6IGA8aHIgLz5gLFxuICBzZWxlY3RvcjogJ2Jhby1kcm9wZG93bi1tZW51LWRpdmlkZXIsIFtiYW8tZHJvcGRvd24tbWVudS1kaXZpZGVyXScsXG4gIGhvc3Q6IHsgY2xhc3M6ICdiYW8tZHJvcGRvd24tbWVudS1kaXZpZGVyJyB9XG59KVxuZXhwb3J0IGNsYXNzIEJhb0Ryb3Bkb3duTWVudURpdmlkZXIgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD5cbiAgKSB7fVxuXG4gIGdldCBuYXRpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMubmF0aXZlRWxlbWVudCwgJ3JvbGUnLCAnc2VwYXJhdG9yJyk7XG4gIH1cbn1cbiIsIjxkaXYgI21lbnVDb250ZW50IGNsYXNzPVwiYmFvLWRyb3Bkb3duLW1lbnVcIiB0YWJpbmRleD1cIi0xXCI+XG4gIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvZGl2PlxuIl19
@@ -0,0 +1,8 @@
1
+ /*
2
+ * Copyright (c) 2022 Ville de Montreal. All rights reserved.
3
+ * Licensed under the MIT license.
4
+ * See LICENSE file in the project root for full license information.
5
+ */
6
+ export * from './module';
7
+ export * from './dropdown-menu.component';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXVpL3NyYy9saWIvZHJvcGRvd24tbWVudS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYywyQkFBMkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgVmlsbGUgZGUgTW9udHJlYWwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBTZWUgTElDRU5TRSBmaWxlIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9kcm9wZG93bi1tZW51LmNvbXBvbmVudCc7XG4iXX0=