@dotglitch/ngx-common 1.0.38 → 1.0.40

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.
@@ -1,4 +1,4 @@
1
- import { EventEmitter, OnInit, TemplateRef, ViewContainerRef } from '@angular/core';
1
+ import { OnInit, TemplateRef, ViewContainerRef } from '@angular/core';
2
2
  import { DomSanitizer } from '@angular/platform-browser';
3
3
  import { MatDialog, MatDialogRef } from '@angular/material/dialog';
4
4
  import { ComponentPortal } from '@angular/cdk/portal';
@@ -15,9 +15,13 @@ export declare class MenuComponent implements OnInit {
15
15
  items: MenuItem[];
16
16
  config: MenuOptions;
17
17
  id: string;
18
+ overlayOverlap: number;
19
+ hoverDelay: number;
20
+ showDebugOverlay: boolean;
18
21
  ownerCords: DOMRect;
19
22
  selfCords: any;
20
- closeSignal: EventEmitter<any>;
23
+ parentItem: any;
24
+ parentContext: any;
21
25
  hasBootstrapped: boolean;
22
26
  pointerIsOnVoid: boolean;
23
27
  isLockedOpen: boolean;
@@ -37,13 +41,15 @@ export declare class MenuComponent implements OnInit {
37
41
  constructor(viewContainer: ViewContainerRef, sanitizer: DomSanitizer, _data: any, dialog: MatDialog, // optional only for the purpose of estimating dimensions
38
42
  dialogRef: MatDialogRef<any>);
39
43
  ngOnInit(): void;
44
+ ngAfterViewInit(): void;
45
+ ngOnDestroy(): void;
40
46
  /**
41
47
  *
42
48
  * @param item
43
49
  * @param evt
44
50
  * @returns
45
51
  */
46
- onMenuItemClick(item: MenuItem, row: HTMLTableRowElement, hideBackdrop?: boolean): Promise<MatDialogRef<unknown, any>>;
52
+ onMenuItemClick(item: MenuItem, row: HTMLTableRowElement): Promise<any>;
47
53
  /**
48
54
  *
49
55
  * @param label
@@ -55,6 +61,8 @@ export declare class MenuComponent implements OnInit {
55
61
  */
56
62
  close(result?: any): void;
57
63
  closeOnVoid(force?: boolean): void;
64
+ startHoverTimer(item: any, row: any): void;
65
+ stopHoverTimer(item: any): void;
58
66
  /**
59
67
  * Check if the dialog is clipping offscreen
60
68
  * if so, move it back into view.
@@ -62,5 +70,5 @@ export declare class MenuComponent implements OnInit {
62
70
  private onResize;
63
71
  onWheel(evt: WheelEvent): void;
64
72
  static ɵfac: i0.ɵɵFactoryDeclaration<MenuComponent, [null, null, { optional: true; }, { optional: true; }, { optional: true; }]>;
65
- static ɵcmp: i0.ɵɵComponentDeclaration<MenuComponent, "ngx-menu", never, { "data": "data"; "items": "items"; "config": "config"; "id": "id"; "ownerCords": "ownerCords"; "selfCords": "selfCords"; }, { "closeSignal": "closeSignal"; }, never, never, true, never>;
73
+ static ɵcmp: i0.ɵɵComponentDeclaration<MenuComponent, "ngx-menu", never, { "data": "data"; "items": "items"; "config": "config"; "id": "id"; "overlayOverlap": "overlayOverlap"; "hoverDelay": "hoverDelay"; "showDebugOverlay": "showDebugOverlay"; "ownerCords": "ownerCords"; "selfCords": "selfCords"; "parentItem": "parentItem"; "parentContext": "parentContext"; }, {}, never, never, true, never>;
66
74
  }
@@ -24,7 +24,7 @@ export declare class MenuDirective {
24
24
  config: MenuOptions;
25
25
  constructor(dialog: MatDialog, viewContainer: ViewContainerRef);
26
26
  ngAfterViewInit(): void;
27
- openMenu(evt: PointerEvent, items?: MenuItem<any>[]): Promise<[value: any]>;
27
+ openMenu(evt: PointerEvent, items?: MenuItem<any, any>[]): Promise<[value: any]>;
28
28
  static ɵfac: i0.ɵɵFactoryDeclaration<MenuDirective, never>;
29
29
  static ɵdir: i0.ɵɵDirectiveDeclaration<MenuDirective, "[ngx-contextmenu],[ngx-menu],[ngxContextmenu],[ngxMenu]", never, { "data": "ngx-menu-context"; "ctxMenuItems": "ngx-contextmenu"; "menuItems": "ngx-menu"; "config": "ngx-menu-config"; }, {}, never, never, true, never>;
30
30
  }
@@ -1,5 +1,5 @@
1
1
  import { NgForOf, NgIf, NgTemplateOutlet } from '@angular/common';
2
- import { Component, EventEmitter, HostListener, Inject, Input, Optional, Output, TemplateRef } from '@angular/core';
2
+ import { Component, HostListener, Inject, Input, Optional, TemplateRef } from '@angular/core';
3
3
  import { createApplication } from '@angular/platform-browser';
4
4
  import { MAT_DIALOG_DATA } from '@angular/material/dialog';
5
5
  import { MatIconModule } from '@angular/material/icon';
@@ -44,6 +44,8 @@ const calcComponentBounds = async (component, data) => {
44
44
  del.remove();
45
45
  return rect;
46
46
  };
47
+ const $data = Symbol("data");
48
+ const $hover = Symbol("hover");
47
49
  export class MenuComponent {
48
50
  constructor(viewContainer, sanitizer, _data, dialog, // optional only for the purpose of estimating dimensions
49
51
  dialogRef) {
@@ -52,7 +54,9 @@ export class MenuComponent {
52
54
  this._data = _data;
53
55
  this.dialog = dialog;
54
56
  this.dialogRef = dialogRef;
55
- this.closeSignal = new EventEmitter();
57
+ this.overlayOverlap = 32;
58
+ this.hoverDelay = 300;
59
+ this.showDebugOverlay = false;
56
60
  this.hasBootstrapped = false;
57
61
  this.pointerIsOnVoid = false;
58
62
  this.isLockedOpen = false;
@@ -68,12 +72,15 @@ export class MenuComponent {
68
72
  this.showShortcutColumn = true;
69
73
  this.childDialogs = [];
70
74
  // Defaults are set before @Input() hooks evaluate
75
+ this.dialog = this.dialog || this._data?.dialog;
71
76
  this.data = this._data?.data;
72
77
  this.ownerCords = this._data?.ownerCords;
73
78
  this.selfCords = this._data?.selfCords;
74
79
  this.items = this._data?.items;
75
80
  this.config = this._data?.config;
76
81
  this.id = this._data?.id;
82
+ this.parentItem = this._data?.parentItem;
83
+ this.parentContext = this._data?.parentContext;
77
84
  this.template = _data.template;
78
85
  this.templateType = this.template instanceof TemplateRef ? "template" : "component";
79
86
  if (this.templateType == "component") {
@@ -87,6 +94,9 @@ export class MenuComponent {
87
94
  // Set defaults
88
95
  i['_disabled'] = false;
89
96
  i['_visible'] = true;
97
+ i['_context'] = (typeof i.context == "function")
98
+ ? i.context(this.data)
99
+ : i.context;
90
100
  if (i.label)
91
101
  try {
92
102
  i['_formattedLabel'] = this.formatLabel(i.label);
@@ -96,21 +106,21 @@ export class MenuComponent {
96
106
  }
97
107
  if (typeof i.isDisabled == "function")
98
108
  try {
99
- i['_disabled'] = i.isDisabled(this.data || {});
109
+ i['_disabled'] = i.isDisabled(this.data || {}, i['_context']);
100
110
  }
101
111
  catch (e) {
102
112
  console.warn(e);
103
113
  }
104
114
  if (typeof i.isVisible == "function")
105
115
  try {
106
- i['_visible'] = i.isVisible(this.data || {});
116
+ i['_visible'] = i.isVisible(this.data || {}, i['_context']);
107
117
  }
108
118
  catch (e) {
109
119
  console.warn(e);
110
120
  }
111
121
  if (typeof i.linkTemplate == "function")
112
122
  try {
113
- i['_link'] = i.linkTemplate(this.data || {});
123
+ i['_link'] = i.linkTemplate(this.data || {}, i['_context']);
114
124
  }
115
125
  catch (e) {
116
126
  console.warn(e);
@@ -127,38 +137,64 @@ export class MenuComponent {
127
137
  const selfY = parseInt(this.selfCords.top?.replace('px', '') || '0');
128
138
  const selfX = parseInt(this.selfCords.left?.replace('px', '') || '0');
129
139
  this.coverRectCords = {
130
- top: this.ownerCords.y - selfY - 16,
131
- left: this.ownerCords.x - selfX - 16,
132
- height: this.ownerCords.height + 32,
133
- width: this.ownerCords.width + 32
140
+ top: this.ownerCords.y - selfY - (this.overlayOverlap / 2),
141
+ left: this.ownerCords.x - selfX - (this.overlayOverlap / 2),
142
+ height: this.ownerCords.height + this.overlayOverlap,
143
+ width: this.ownerCords.width + this.overlayOverlap
134
144
  };
135
145
  }
136
146
  setTimeout(() => {
137
147
  this.hasBootstrapped = true;
138
148
  }, 200);
139
149
  }
150
+ ngAfterViewInit() {
151
+ const el = this.viewContainer.element.nativeElement;
152
+ el.addEventListener("keydown", evt => {
153
+ this.isLockedOpen = true;
154
+ });
155
+ el.addEventListener("pointerdown", evt => {
156
+ this.isLockedOpen = true;
157
+ });
158
+ el.addEventListener("touch", evt => {
159
+ this.isLockedOpen = true;
160
+ });
161
+ }
162
+ ngOnDestroy() {
163
+ //
164
+ this.childDialogs.forEach(d => d.close({ [$data]: true }));
165
+ }
140
166
  /**
141
167
  *
142
168
  * @param item
143
169
  * @param evt
144
170
  * @returns
145
171
  */
146
- async onMenuItemClick(item, row, hideBackdrop = false) {
172
+ async onMenuItemClick(item, row) {
147
173
  if (typeof item == 'string')
148
174
  return null;
149
175
  if (item.separator)
150
176
  return null;
177
+ const context = await item['_context'];
151
178
  // If cache is enabled, only load if we don't have any children.
152
179
  const forceLoad = (item.cacheResolvedChildren ? !item.children : true);
153
180
  if (item.childrenResolver && forceLoad) {
154
181
  item['_isResolving'] = true;
155
- item.children = await item.childrenResolver(this.data);
182
+ item['_children'] = await item.childrenResolver(this.data, context);
156
183
  item['_isResolving'] = false;
157
184
  }
185
+ else if (typeof item.children == "function" && forceLoad) {
186
+ item['_isResolving'] = true;
187
+ item['_children'] = await item.children(this.data, context);
188
+ item['_isResolving'] = false;
189
+ }
190
+ else {
191
+ item['_children'] = item.children;
192
+ }
158
193
  if (!item.childTemplate && !item.children) {
159
- if (item.action) {
160
- item.action(this.data);
161
- this.close();
194
+ if (typeof item.action == "function") {
195
+ const res = await item.action(this.data, context);
196
+ this.close(res);
197
+ return res;
162
198
  }
163
199
  // If no action, this is simply a text item.
164
200
  return null;
@@ -174,7 +210,7 @@ export class MenuComponent {
174
210
  // Set position coordinates
175
211
  const { width, height } = await (item.childTemplate
176
212
  ? calcComponentBounds(MenuComponent, { template: item.childTemplate })
177
- : calcMenuItemBounds(item.children, this.data));
213
+ : calcMenuItemBounds(item['_children'], this.data));
178
214
  if (bounds.y + height > window.innerHeight)
179
215
  cords.bottom = "0px";
180
216
  if (bounds.x + bounds.width + width > window.innerWidth)
@@ -183,8 +219,7 @@ export class MenuComponent {
183
219
  cords.top = bounds.y + "px";
184
220
  if (!cords.left)
185
221
  cords.left = bounds.x + bounds.width + "px";
186
- const component = item.children ? MenuComponent : MenuComponent;
187
- const dialogRef = this.dialog.open(component, {
222
+ const dialogRef = this.dialog.open(MenuComponent, {
188
223
  position: cords,
189
224
  panelClass: ["ngx-menu"].concat(this.config?.customClass || []),
190
225
  backdropClass: "ngx-menu-backdrop",
@@ -193,23 +228,35 @@ export class MenuComponent {
193
228
  data: this.data,
194
229
  ownerCords: row.getBoundingClientRect(),
195
230
  selfCords: cords,
196
- items: item.children,
231
+ parentItem: item,
232
+ parentContext: context,
233
+ items: item['_children'],
197
234
  template: item.childTemplate,
198
235
  config: this.config
199
236
  }
200
237
  });
201
238
  let _s = dialogRef
202
239
  .afterClosed()
203
- .subscribe((result) => {
204
- if (result !== null && result != -1) {
205
- if (result && typeof item.action == 'function')
206
- item.action(result);
207
- this.close();
240
+ .subscribe(async (result) => {
241
+ // Clicked "void" on a submenu
242
+ if (typeof result == "object" && result[$data] == true) {
243
+ this.close(result);
244
+ }
245
+ // Went back to parent menu -- do not close (same as result == null)
246
+ else if (typeof result == "object" && result[$data] == false) {
208
247
  }
209
- else {
210
- item['_selfclose'] = Date.now();
248
+ // Got some other result value
249
+ else if (result != null) {
250
+ // Perform action callback
251
+ if (typeof item.action == 'function') {
252
+ this.close(await item.action(result, context));
253
+ }
254
+ // Just close.
255
+ else {
256
+ this.close();
257
+ }
211
258
  }
212
- this.childDialogs.splice(this.childDialogs.findIndex(d => d == dialogRef), 1);
259
+ this.childDialogs.splice(this.childDialogs.indexOf(dialogRef), 1);
213
260
  _s.unsubscribe();
214
261
  });
215
262
  this.childDialogs.push(dialogRef);
@@ -229,14 +276,26 @@ export class MenuComponent {
229
276
  // @HostListener("window:resize", ['event'])
230
277
  // @HostListener("window:blur", ['event'])
231
278
  close(result) {
232
- if (result != -1)
233
- this.closeSignal.emit();
234
279
  this.childDialogs.forEach(d => d.close());
235
280
  this.dialogRef?.close(result);
236
281
  }
237
282
  closeOnVoid(force = false) {
238
- if (!this.isLockedOpen || force)
239
- this.close(-1);
283
+ if (!this.isLockedOpen || force) {
284
+ this.close({ [$data]: force });
285
+ }
286
+ }
287
+ startHoverTimer(item, row) {
288
+ item[$hover] = setTimeout(() => {
289
+ delete item[$hover];
290
+ if (item.children || item.childTemplate || item.childrenResolver) {
291
+ row['hover'] = true;
292
+ this.onMenuItemClick(item, row);
293
+ }
294
+ }, this.hoverDelay);
295
+ }
296
+ stopHoverTimer(item) {
297
+ item[$hover] && clearTimeout(item[$hover]);
298
+ delete item[$hover];
240
299
  }
241
300
  /**
242
301
  * Check if the dialog is clipping offscreen
@@ -275,7 +334,7 @@ export class MenuComponent {
275
334
  }
276
335
  }
277
336
  MenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: MenuComponent, deps: [{ token: i0.ViewContainerRef }, { token: i1.DomSanitizer }, { token: MAT_DIALOG_DATA, optional: true }, { token: i2.MatDialog, optional: true }, { token: i2.MatDialogRef, optional: true }], target: i0.ɵɵFactoryTarget.Component });
278
- MenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: MenuComponent, isStandalone: true, selector: "ngx-menu", inputs: { data: "data", items: "items", config: "config", id: "id", ownerCords: "ownerCords", selfCords: "selfCords" }, outputs: { closeSignal: "closeSignal" }, host: { listeners: { "window:resize": "onResize()" } }, ngImport: i0, template: "<!-- Mouse event blocker for pointer leave -->\n<div\n *ngIf=\"coverRectCords\"\n class=\"owner-mask\"\n [style.top]=\"coverRectCords.top + 'px'\"\n [style.left]=\"coverRectCords.left + 'px'\"\n [style.height]=\"coverRectCords.height + 'px'\"\n [style.width]=\"coverRectCords.width + 'px'\"\n style=\"z-index: -1\"\n></div>\n\n<div class=\"void\"\n (pointerenter)=\"pointerIsOnVoid = true; hasBootstrapped && !isLockedOpen && closeOnVoid()\"\n (pointerleave)=\"pointerIsOnVoid = false\"\n (pointerdown)=\"hasBootstrapped && closeOnVoid(true)\"\n (wheel)=\"onWheel($event)\"\n></div>\n\n<table *ngIf=\"!template\">\n <tbody>\n <ng-container *ngFor=\"let item of items\">\n <ng-container>\n\n <!-- A row with a click action -->\n <tr #row\n *ngIf=\"item != 'separator' && item.separator != true && item['_visible']\"\n [class.disabled]=\"item['_disabled']\"\n (click)=\"!item['_disabled'] && onMenuItemClick(item, row)\"\n [class.hover]=\"item['children'] && row['hover']\"\n (pointerenter)=\"row['hover'] = true;\"\n (pointerleave)=\"row['hover'] = false\"\n >\n <!-- (item['children']?.length > 0 || item['childTemplate']) && onHover(item, row); closeOnLeave=true -->\n <td class=\"icon\" *ngIf=\"showIconColumn\">\n <img *ngIf=\"matIconRx.test(item.icon); else matIcon\" [src]=\"item.icon\" />\n <ng-template #matIcon>\n <mat-icon [fontIcon]=\"item.icon\" [style.color]=\"item.iconColor\"></mat-icon>\n </ng-template>\n </td>\n\n <!-- 'Normal' action based item -->\n <ng-container>\n <td class=\"label\"\n [style.padding-left]=\"showIconColumn ? 0 : '16px'\"\n >\n <a\n [attr.target]=\"item.linkTarget\"\n [attr.href]=\"(item['_link'] || item.link) ? sanitizer.bypassSecurityTrustUrl(item['_link'] || item.link) : undefined\"\n >\n <ng-container\n *ngIf=\"$any(item.labelTemplate)?.prototype; else labelTemplate\"\n [ngTemplateOutlet]=\"$any(item).labelTemplate\"\n [ngTemplateOutletContext]=\"{ '$implicit': data, 'dialog': dialogRef }\"\n />\n\n <ng-template #labelTemplate>\n <ng-container *ngIf=\"!$any(item)?.labelTemplate\">\n <div [innerHTML]=\"item['_formattedLabel']\"></div>\n </ng-container>\n <ng-container *ngIf=\"$any(item)?.labelTemplate\">\n {{$any(item)?.labelTemplate(data || {})}}\n </ng-container>\n </ng-template>\n </a>\n </td>\n </ng-container>\n\n <td class=\"shortcut\" *ngIf=\"showShortcutColumn\">\n {{item.shortcutLabel}}\n </td>\n <td style=\"min-width: 16px\">\n <mat-icon *ngIf=\"\n (item.children && item.children.length > 0) ||\n item.childTemplate ||\n (item.childrenResolver && !item['_isResolving'])\n \"\n sytle=\"transform: translateY(2px)\"\n >\n chevron_right\n </mat-icon>\n\n <mat-progress-spinner *ngIf=\"item['_isResolving']\" mode=\"indeterminate\" [diameter]=\"20\" style=\"margin-right: 4px\"/>\n </td>\n </tr>\n\n <tr *ngIf=\"item != 'separator' && item.separator == true\" class=\"disabled separator\">\n <td class=\"center\" [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\">\n <span class=\"hr\">\n {{item['label'] || ''}}\n </span>\n </td>\n </tr>\n <tr *ngIf=\"item == 'separator'\" class=\"disabled separator\">\n <td [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\">\n <hr/>\n </td>\n </tr>\n </ng-container>\n </ng-container>\n </tbody>\n</table>\n\n<ng-container *ngIf=\"template\">\n <ng-container *ngIf=\"templateType == 'template'; else portalOutlet\">\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ '$implicit': data, dialog: dialogRef }\"\n />\n </ng-container>\n <ng-template #portalOutlet [cdkPortalOutlet]=\"componentPortal\" ></ng-template>\n</ng-container>\n", styles: ["::ng-deep .cdk-overlay-container .ngx-menu{--mdc-dialog-container-color: var(--ngx-menu-background-color, #2f2f2f)}::ng-deep .cdk-overlay-container .ngx-menu .mdc-dialog__container{transform-origin:top left}::ng-deep .cdk-overlay-container .ngx-menu .mdc-dialog--open .mdc-dialog__container{transform:none}::ng-deep .cdk-overlay-pane.ngx-menu .mat-mdc-dialog-surface{overflow:visible}:host{-webkit-user-select:none;user-select:none;z-index:1;position:relative;display:block}table{border-spacing:0;border-radius:5px;padding:4px 0}tr{color:var(--ngx-menu-text-color, #ccc);font-size:14px;cursor:pointer;transition:background-color 75ms ease,color 75ms ease}tr:not(.disabled):hover{background-color:var(--ngx-menu-hover-background-color, #94ebeb);color:var(--ngx-menu-hover-text-color, #000)}tr:not(.disabled):hover a{color:var(--ngx-menu-hover-text-color, #000)}tr:not(.separator){height:36px}tr.disabled .label{color:var(--ngx-menu-disabled-text-color, #919191)}tr .center{text-align:center}tr a{outline:0;display:flex;align-items:center;gap:10px;justify-content:space-between;height:100%;width:100%}tr .label{min-width:100px}.hr{height:1px;text-align:center;position:relative}.hr:before,.hr:after{content:\"\";background:var(--ngx-menu-separator-color, #2a2a2a);display:block;position:absolute;top:0;bottom:0;height:1px;margin:auto;width:300px}.hr:before{right:calc(100% + 4px)}.hr:after{left:calc(100% + 4px)}hr{background:var(--ngx-menu-separator-color, #2a2a2a);border:0;height:1px;margin:0}.icon{width:24px;height:24px;padding-left:10px}.icon mat-icon{transform:translateY(2px)}.shortcut{color:var(--ngx-menu-shortcut-text-color, #848484);text-align:end;padding-right:10px;padding-left:12px}.label{height:var(--ngx-menu-item-height, 30px)}td{vertical-align:middle}.void,.owner-mask{position:absolute}.void{top:-100vh;right:-100vw;bottom:-100vh;left:-100vw;z-index:-2}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i3.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i5.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] });
337
+ MenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: MenuComponent, isStandalone: true, selector: "ngx-menu", inputs: { data: "data", items: "items", config: "config", id: "id", overlayOverlap: "overlayOverlap", hoverDelay: "hoverDelay", showDebugOverlay: "showDebugOverlay", ownerCords: "ownerCords", selfCords: "selfCords", parentItem: "parentItem", parentContext: "parentContext" }, host: { listeners: { "window:resize": "onResize()" } }, ngImport: i0, template: "<!-- Mouse event blocker for pointer leave -->\n<div\n *ngIf=\"coverRectCords\"\n class=\"owner-mask\"\n [style.top]=\"coverRectCords.top + 'px'\"\n [style.left]=\"coverRectCords.left + 'px'\"\n [style.height]=\"coverRectCords.height + 'px'\"\n [style.width]=\"coverRectCords.width + 'px'\"\n [style.background]=\"showDebugOverlay ? '#f004' : '#0000'\"\n style=\"z-index: -1\"\n></div>\n\n<div class=\"void\"\n [style.background]=\"showDebugOverlay ? '#00f4' : '#0000'\"\n (pointerenter)=\"pointerIsOnVoid = true; hasBootstrapped && !isLockedOpen && closeOnVoid()\"\n (pointerleave)=\"pointerIsOnVoid = false\"\n (pointerdown)=\"hasBootstrapped && closeOnVoid(true)\"\n (wheel)=\"onWheel($event)\"\n></div>\n\n<table *ngIf=\"!template\">\n <tbody>\n <ng-container *ngFor=\"let item of items\">\n <!-- A row with a click action -->\n <tr #row\n *ngIf=\"item != 'separator' && item.separator != true && item['_visible']\"\n [class.disabled]=\"item['_disabled']\"\n (click)=\"!item['_disabled'] && onMenuItemClick(item, row)\"\n [class.hover]=\"item['children'] && row['hover']\"\n (pointerenter)=\"row['hover'] = true; startHoverTimer(item, row)\"\n (pointerleave)=\"row['hover'] = false; stopHoverTimer(item)\"\n >\n\n <td class=\"icon\" *ngIf=\"showIconColumn\">\n <img *ngIf=\"matIconRx.test(item.icon); else matIcon\" [src]=\"item.icon\" />\n <ng-template #matIcon>\n <mat-icon [fontIcon]=\"item.icon\" [style.color]=\"item.iconColor\"></mat-icon>\n </ng-template>\n </td>\n\n <!-- 'Normal' action based item -->\n <td class=\"label\"\n [style.padding-left]=\"showIconColumn ? 0 : '16px'\"\n >\n <a\n #anchor\n [attr.target]=\"item.linkTarget\"\n [attr.href]=\"(item['_link'] || item.link) ? sanitizer.bypassSecurityTrustUrl(item['_link'] || item.link) : undefined\"\n >\n <ng-container\n *ngIf=\"$any(item.labelTemplate)?.prototype; else simpleLabel\"\n [ngTemplateOutlet]=\"$any(item).labelTemplate\"\n [ngTemplateOutletContext]=\"{\n '$implicit': data,\n 'dialog': dialogRef,\n 'context': item['_context'],\n 'item': item,\n 'element': anchor,\n 'menu': this\n }\"\n />\n\n <ng-template #simpleLabel>\n <ng-container *ngIf=\"!$any(item)?.labelTemplate\">\n <div [innerHTML]=\"item['_formattedLabel']\"></div>\n </ng-container>\n <ng-container *ngIf=\"$any(item)?.labelTemplate\">\n {{$any(item)?.labelTemplate(data || {})}}\n </ng-container>\n </ng-template>\n </a>\n </td>\n\n <td class=\"shortcut\" *ngIf=\"showShortcutColumn\">\n {{item.shortcutLabel}}\n </td>\n <td style=\"min-width: 16px\">\n <mat-icon *ngIf=\"(\n (item['children']?.length > 0) ||\n (item['_children']?.length > 0) ||\n item.childTemplate ||\n item.children?.['call'] ||\n item.childrenResolver\n ) &&\n !item['_isResolving']\n \"\n style=\"transform: translateY(2px)\"\n >\n chevron_right\n </mat-icon>\n\n <mat-progress-spinner\n *ngIf=\"item['_isResolving']\"\n mode=\"indeterminate\"\n [diameter]=\"20\"\n style=\"margin-right: 4px\"\n />\n </td>\n </tr>\n\n <!-- Separator with label -->\n <tr\n *ngIf=\"item != 'separator' && item.separator == true\"\n class=\"disabled separator\"\n >\n <td\n class=\"center\"\n [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\"\n >\n <span class=\"hr\">\n {{item['label'] || ''}}\n </span>\n </td>\n </tr>\n\n <!-- Separator -->\n <tr\n *ngIf=\"item == 'separator'\"\n class=\"disabled separator\"\n >\n <td\n [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\"\n >\n <hr/>\n </td>\n </tr>\n </ng-container>\n </tbody>\n</table>\n\n<ng-container *ngIf=\"template\">\n <ng-container *ngIf=\"templateType == 'template'; else portalOutlet\">\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n '$implicit': data,\n 'dialog': dialogRef,\n 'context': parentContext,\n 'item': parentItem,\n 'element': this.viewContainer?.element?.nativeElement,\n 'menu': this\n }\"\n />\n </ng-container>\n <ng-template\n #portalOutlet\n [cdkPortalOutlet]=\"componentPortal\"\n />\n</ng-container>\n", styles: ["::ng-deep .cdk-overlay-container .ngx-menu{--mdc-dialog-container-color: var(--ngx-menu-background-color, #2f2f2f)}::ng-deep .cdk-overlay-container .ngx-menu .mdc-dialog__container{transform-origin:top left}::ng-deep .cdk-overlay-container .ngx-menu .mdc-dialog--open .mdc-dialog__container{transform:none}::ng-deep .cdk-overlay-pane.ngx-menu .mat-mdc-dialog-surface{overflow:visible}:host{-webkit-user-select:none;user-select:none;z-index:1;position:relative;display:block}table{border-spacing:0;border-radius:5px;padding:4px 0}tr{color:var(--ngx-menu-text-color, #ccc);font-size:14px;cursor:pointer;transition:background-color 75ms ease,color 75ms ease}tr:not(.disabled):hover{background-color:var(--ngx-menu-hover-background-color, #94ebeb);color:var(--ngx-menu-hover-text-color, #000)}tr:not(.disabled):hover a{color:var(--ngx-menu-hover-text-color, #000)}tr:not(.separator){height:36px}tr.disabled .label{color:var(--ngx-menu-disabled-text-color, #919191)}tr .center{text-align:center}tr a{outline:0;display:flex;align-items:center;gap:10px;justify-content:space-between;height:100%;width:100%}tr .label{min-width:100px}.hr{height:1px;text-align:center;position:relative}.hr:before,.hr:after{content:\"\";background:var(--ngx-menu-separator-color, #2a2a2a);display:block;position:absolute;top:0;bottom:0;height:1px;margin:auto;width:300px}.hr:before{right:calc(100% + 4px)}.hr:after{left:calc(100% + 4px)}hr{background:var(--ngx-menu-separator-color, #2a2a2a);border:0;height:1px;margin:0}.icon{width:24px;height:24px;padding-left:10px}.icon mat-icon{transform:translateY(2px)}.shortcut{color:var(--ngx-menu-shortcut-text-color, #848484);text-align:end;padding-right:10px;padding-left:12px}.label{height:var(--ngx-menu-item-height, 30px)}td{vertical-align:middle}.void,.owner-mask{position:absolute}.void{top:-100vh;right:-100vw;bottom:-100vh;left:-100vw;z-index:-2}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i3.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i5.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] });
279
338
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: MenuComponent, decorators: [{
280
339
  type: Component,
281
340
  args: [{ selector: 'ngx-menu', imports: [
@@ -286,7 +345,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
286
345
  MatIconModule,
287
346
  MatProgressSpinnerModule,
288
347
  TooltipDirective
289
- ], standalone: true, template: "<!-- Mouse event blocker for pointer leave -->\n<div\n *ngIf=\"coverRectCords\"\n class=\"owner-mask\"\n [style.top]=\"coverRectCords.top + 'px'\"\n [style.left]=\"coverRectCords.left + 'px'\"\n [style.height]=\"coverRectCords.height + 'px'\"\n [style.width]=\"coverRectCords.width + 'px'\"\n style=\"z-index: -1\"\n></div>\n\n<div class=\"void\"\n (pointerenter)=\"pointerIsOnVoid = true; hasBootstrapped && !isLockedOpen && closeOnVoid()\"\n (pointerleave)=\"pointerIsOnVoid = false\"\n (pointerdown)=\"hasBootstrapped && closeOnVoid(true)\"\n (wheel)=\"onWheel($event)\"\n></div>\n\n<table *ngIf=\"!template\">\n <tbody>\n <ng-container *ngFor=\"let item of items\">\n <ng-container>\n\n <!-- A row with a click action -->\n <tr #row\n *ngIf=\"item != 'separator' && item.separator != true && item['_visible']\"\n [class.disabled]=\"item['_disabled']\"\n (click)=\"!item['_disabled'] && onMenuItemClick(item, row)\"\n [class.hover]=\"item['children'] && row['hover']\"\n (pointerenter)=\"row['hover'] = true;\"\n (pointerleave)=\"row['hover'] = false\"\n >\n <!-- (item['children']?.length > 0 || item['childTemplate']) && onHover(item, row); closeOnLeave=true -->\n <td class=\"icon\" *ngIf=\"showIconColumn\">\n <img *ngIf=\"matIconRx.test(item.icon); else matIcon\" [src]=\"item.icon\" />\n <ng-template #matIcon>\n <mat-icon [fontIcon]=\"item.icon\" [style.color]=\"item.iconColor\"></mat-icon>\n </ng-template>\n </td>\n\n <!-- 'Normal' action based item -->\n <ng-container>\n <td class=\"label\"\n [style.padding-left]=\"showIconColumn ? 0 : '16px'\"\n >\n <a\n [attr.target]=\"item.linkTarget\"\n [attr.href]=\"(item['_link'] || item.link) ? sanitizer.bypassSecurityTrustUrl(item['_link'] || item.link) : undefined\"\n >\n <ng-container\n *ngIf=\"$any(item.labelTemplate)?.prototype; else labelTemplate\"\n [ngTemplateOutlet]=\"$any(item).labelTemplate\"\n [ngTemplateOutletContext]=\"{ '$implicit': data, 'dialog': dialogRef }\"\n />\n\n <ng-template #labelTemplate>\n <ng-container *ngIf=\"!$any(item)?.labelTemplate\">\n <div [innerHTML]=\"item['_formattedLabel']\"></div>\n </ng-container>\n <ng-container *ngIf=\"$any(item)?.labelTemplate\">\n {{$any(item)?.labelTemplate(data || {})}}\n </ng-container>\n </ng-template>\n </a>\n </td>\n </ng-container>\n\n <td class=\"shortcut\" *ngIf=\"showShortcutColumn\">\n {{item.shortcutLabel}}\n </td>\n <td style=\"min-width: 16px\">\n <mat-icon *ngIf=\"\n (item.children && item.children.length > 0) ||\n item.childTemplate ||\n (item.childrenResolver && !item['_isResolving'])\n \"\n sytle=\"transform: translateY(2px)\"\n >\n chevron_right\n </mat-icon>\n\n <mat-progress-spinner *ngIf=\"item['_isResolving']\" mode=\"indeterminate\" [diameter]=\"20\" style=\"margin-right: 4px\"/>\n </td>\n </tr>\n\n <tr *ngIf=\"item != 'separator' && item.separator == true\" class=\"disabled separator\">\n <td class=\"center\" [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\">\n <span class=\"hr\">\n {{item['label'] || ''}}\n </span>\n </td>\n </tr>\n <tr *ngIf=\"item == 'separator'\" class=\"disabled separator\">\n <td [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\">\n <hr/>\n </td>\n </tr>\n </ng-container>\n </ng-container>\n </tbody>\n</table>\n\n<ng-container *ngIf=\"template\">\n <ng-container *ngIf=\"templateType == 'template'; else portalOutlet\">\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ '$implicit': data, dialog: dialogRef }\"\n />\n </ng-container>\n <ng-template #portalOutlet [cdkPortalOutlet]=\"componentPortal\" ></ng-template>\n</ng-container>\n", styles: ["::ng-deep .cdk-overlay-container .ngx-menu{--mdc-dialog-container-color: var(--ngx-menu-background-color, #2f2f2f)}::ng-deep .cdk-overlay-container .ngx-menu .mdc-dialog__container{transform-origin:top left}::ng-deep .cdk-overlay-container .ngx-menu .mdc-dialog--open .mdc-dialog__container{transform:none}::ng-deep .cdk-overlay-pane.ngx-menu .mat-mdc-dialog-surface{overflow:visible}:host{-webkit-user-select:none;user-select:none;z-index:1;position:relative;display:block}table{border-spacing:0;border-radius:5px;padding:4px 0}tr{color:var(--ngx-menu-text-color, #ccc);font-size:14px;cursor:pointer;transition:background-color 75ms ease,color 75ms ease}tr:not(.disabled):hover{background-color:var(--ngx-menu-hover-background-color, #94ebeb);color:var(--ngx-menu-hover-text-color, #000)}tr:not(.disabled):hover a{color:var(--ngx-menu-hover-text-color, #000)}tr:not(.separator){height:36px}tr.disabled .label{color:var(--ngx-menu-disabled-text-color, #919191)}tr .center{text-align:center}tr a{outline:0;display:flex;align-items:center;gap:10px;justify-content:space-between;height:100%;width:100%}tr .label{min-width:100px}.hr{height:1px;text-align:center;position:relative}.hr:before,.hr:after{content:\"\";background:var(--ngx-menu-separator-color, #2a2a2a);display:block;position:absolute;top:0;bottom:0;height:1px;margin:auto;width:300px}.hr:before{right:calc(100% + 4px)}.hr:after{left:calc(100% + 4px)}hr{background:var(--ngx-menu-separator-color, #2a2a2a);border:0;height:1px;margin:0}.icon{width:24px;height:24px;padding-left:10px}.icon mat-icon{transform:translateY(2px)}.shortcut{color:var(--ngx-menu-shortcut-text-color, #848484);text-align:end;padding-right:10px;padding-left:12px}.label{height:var(--ngx-menu-item-height, 30px)}td{vertical-align:middle}.void,.owner-mask{position:absolute}.void{top:-100vh;right:-100vw;bottom:-100vh;left:-100vw;z-index:-2}\n"] }]
348
+ ], standalone: true, template: "<!-- Mouse event blocker for pointer leave -->\n<div\n *ngIf=\"coverRectCords\"\n class=\"owner-mask\"\n [style.top]=\"coverRectCords.top + 'px'\"\n [style.left]=\"coverRectCords.left + 'px'\"\n [style.height]=\"coverRectCords.height + 'px'\"\n [style.width]=\"coverRectCords.width + 'px'\"\n [style.background]=\"showDebugOverlay ? '#f004' : '#0000'\"\n style=\"z-index: -1\"\n></div>\n\n<div class=\"void\"\n [style.background]=\"showDebugOverlay ? '#00f4' : '#0000'\"\n (pointerenter)=\"pointerIsOnVoid = true; hasBootstrapped && !isLockedOpen && closeOnVoid()\"\n (pointerleave)=\"pointerIsOnVoid = false\"\n (pointerdown)=\"hasBootstrapped && closeOnVoid(true)\"\n (wheel)=\"onWheel($event)\"\n></div>\n\n<table *ngIf=\"!template\">\n <tbody>\n <ng-container *ngFor=\"let item of items\">\n <!-- A row with a click action -->\n <tr #row\n *ngIf=\"item != 'separator' && item.separator != true && item['_visible']\"\n [class.disabled]=\"item['_disabled']\"\n (click)=\"!item['_disabled'] && onMenuItemClick(item, row)\"\n [class.hover]=\"item['children'] && row['hover']\"\n (pointerenter)=\"row['hover'] = true; startHoverTimer(item, row)\"\n (pointerleave)=\"row['hover'] = false; stopHoverTimer(item)\"\n >\n\n <td class=\"icon\" *ngIf=\"showIconColumn\">\n <img *ngIf=\"matIconRx.test(item.icon); else matIcon\" [src]=\"item.icon\" />\n <ng-template #matIcon>\n <mat-icon [fontIcon]=\"item.icon\" [style.color]=\"item.iconColor\"></mat-icon>\n </ng-template>\n </td>\n\n <!-- 'Normal' action based item -->\n <td class=\"label\"\n [style.padding-left]=\"showIconColumn ? 0 : '16px'\"\n >\n <a\n #anchor\n [attr.target]=\"item.linkTarget\"\n [attr.href]=\"(item['_link'] || item.link) ? sanitizer.bypassSecurityTrustUrl(item['_link'] || item.link) : undefined\"\n >\n <ng-container\n *ngIf=\"$any(item.labelTemplate)?.prototype; else simpleLabel\"\n [ngTemplateOutlet]=\"$any(item).labelTemplate\"\n [ngTemplateOutletContext]=\"{\n '$implicit': data,\n 'dialog': dialogRef,\n 'context': item['_context'],\n 'item': item,\n 'element': anchor,\n 'menu': this\n }\"\n />\n\n <ng-template #simpleLabel>\n <ng-container *ngIf=\"!$any(item)?.labelTemplate\">\n <div [innerHTML]=\"item['_formattedLabel']\"></div>\n </ng-container>\n <ng-container *ngIf=\"$any(item)?.labelTemplate\">\n {{$any(item)?.labelTemplate(data || {})}}\n </ng-container>\n </ng-template>\n </a>\n </td>\n\n <td class=\"shortcut\" *ngIf=\"showShortcutColumn\">\n {{item.shortcutLabel}}\n </td>\n <td style=\"min-width: 16px\">\n <mat-icon *ngIf=\"(\n (item['children']?.length > 0) ||\n (item['_children']?.length > 0) ||\n item.childTemplate ||\n item.children?.['call'] ||\n item.childrenResolver\n ) &&\n !item['_isResolving']\n \"\n style=\"transform: translateY(2px)\"\n >\n chevron_right\n </mat-icon>\n\n <mat-progress-spinner\n *ngIf=\"item['_isResolving']\"\n mode=\"indeterminate\"\n [diameter]=\"20\"\n style=\"margin-right: 4px\"\n />\n </td>\n </tr>\n\n <!-- Separator with label -->\n <tr\n *ngIf=\"item != 'separator' && item.separator == true\"\n class=\"disabled separator\"\n >\n <td\n class=\"center\"\n [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\"\n >\n <span class=\"hr\">\n {{item['label'] || ''}}\n </span>\n </td>\n </tr>\n\n <!-- Separator -->\n <tr\n *ngIf=\"item == 'separator'\"\n class=\"disabled separator\"\n >\n <td\n [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\"\n >\n <hr/>\n </td>\n </tr>\n </ng-container>\n </tbody>\n</table>\n\n<ng-container *ngIf=\"template\">\n <ng-container *ngIf=\"templateType == 'template'; else portalOutlet\">\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n '$implicit': data,\n 'dialog': dialogRef,\n 'context': parentContext,\n 'item': parentItem,\n 'element': this.viewContainer?.element?.nativeElement,\n 'menu': this\n }\"\n />\n </ng-container>\n <ng-template\n #portalOutlet\n [cdkPortalOutlet]=\"componentPortal\"\n />\n</ng-container>\n", styles: ["::ng-deep .cdk-overlay-container .ngx-menu{--mdc-dialog-container-color: var(--ngx-menu-background-color, #2f2f2f)}::ng-deep .cdk-overlay-container .ngx-menu .mdc-dialog__container{transform-origin:top left}::ng-deep .cdk-overlay-container .ngx-menu .mdc-dialog--open .mdc-dialog__container{transform:none}::ng-deep .cdk-overlay-pane.ngx-menu .mat-mdc-dialog-surface{overflow:visible}:host{-webkit-user-select:none;user-select:none;z-index:1;position:relative;display:block}table{border-spacing:0;border-radius:5px;padding:4px 0}tr{color:var(--ngx-menu-text-color, #ccc);font-size:14px;cursor:pointer;transition:background-color 75ms ease,color 75ms ease}tr:not(.disabled):hover{background-color:var(--ngx-menu-hover-background-color, #94ebeb);color:var(--ngx-menu-hover-text-color, #000)}tr:not(.disabled):hover a{color:var(--ngx-menu-hover-text-color, #000)}tr:not(.separator){height:36px}tr.disabled .label{color:var(--ngx-menu-disabled-text-color, #919191)}tr .center{text-align:center}tr a{outline:0;display:flex;align-items:center;gap:10px;justify-content:space-between;height:100%;width:100%}tr .label{min-width:100px}.hr{height:1px;text-align:center;position:relative}.hr:before,.hr:after{content:\"\";background:var(--ngx-menu-separator-color, #2a2a2a);display:block;position:absolute;top:0;bottom:0;height:1px;margin:auto;width:300px}.hr:before{right:calc(100% + 4px)}.hr:after{left:calc(100% + 4px)}hr{background:var(--ngx-menu-separator-color, #2a2a2a);border:0;height:1px;margin:0}.icon{width:24px;height:24px;padding-left:10px}.icon mat-icon{transform:translateY(2px)}.shortcut{color:var(--ngx-menu-shortcut-text-color, #848484);text-align:end;padding-right:10px;padding-left:12px}.label{height:var(--ngx-menu-item-height, 30px)}td{vertical-align:middle}.void,.owner-mask{position:absolute}.void{top:-100vh;right:-100vw;bottom:-100vh;left:-100vw;z-index:-2}\n"] }]
290
349
  }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i1.DomSanitizer }, { type: undefined, decorators: [{
291
350
  type: Optional
292
351
  }, {
@@ -304,14 +363,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
304
363
  type: Input
305
364
  }], id: [{
306
365
  type: Input
366
+ }], overlayOverlap: [{
367
+ type: Input
368
+ }], hoverDelay: [{
369
+ type: Input
370
+ }], showDebugOverlay: [{
371
+ type: Input
307
372
  }], ownerCords: [{
308
373
  type: Input
309
374
  }], selfCords: [{
310
375
  type: Input
311
- }], closeSignal: [{
312
- type: Output
376
+ }], parentItem: [{
377
+ type: Input
378
+ }], parentContext: [{
379
+ type: Input
313
380
  }], onResize: [{
314
381
  type: HostListener,
315
382
  args: ["window:resize"]
316
383
  }] } });
317
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL2NvbXBvbmVudHMvbWVudS9tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvY29tcG9uZW50cy9tZW51L21lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRSxPQUFPLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsUUFBUSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQTBCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZLLE9BQU8sRUFBZ0IsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM1RSxPQUFPLEVBQTJCLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUU5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7QUFFdEUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxFQUFFLFNBQXFCLEVBQUUsT0FBWSxFQUFFLEVBQUU7SUFDNUUsTUFBTSxJQUFJLEdBQUc7UUFDVCxJQUFJLEVBQUUsT0FBTztRQUNiLEtBQUssRUFBRSxTQUFTO1FBQ2hCLE1BQU0sRUFBRSxFQUFFO1FBQ1YsU0FBUyxFQUFF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QWdCO3FCQUNuQixjQUNXLElBQUk7OzBCQXFDWCxRQUFROzswQkFBSSxNQUFNOzJCQUFDLGVBQWU7OzBCQUNsQyxRQUFROzswQkFDUixRQUFROzRDQXBDRyxJQUFJO3NCQUFuQixLQUFLO2dCQUNVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBQ1UsTUFBTTtzQkFBckIsS0FBSztnQkFDVSxFQUFFO3NCQUFqQixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNO2dCQThOQyxRQUFRO3NCQURmLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nRm9yT2YsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIEluamVjdCwgSW5wdXQsIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgVGVtcGxhdGVSZWYsIFR5cGUsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgY3JlYXRlQXBwbGljYXRpb24gfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nUmVmLCBNQVRfRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XG5cbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCwgUG9ydGFsTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTWVudUl0ZW0sIE1lbnVPcHRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvbWVudSc7XG5pbXBvcnQgeyBUb29sdGlwRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy90b29sdGlwLmRpcmVjdGl2ZSc7XG5cbmV4cG9ydCBjb25zdCBjYWxjTWVudUl0ZW1Cb3VuZHMgPSBhc3luYyAobWVudUl0ZW1zOiBNZW51SXRlbVtdLCBkYXRhT2JqOiBhbnkpID0+IHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICBkYXRhOiBkYXRhT2JqLFxuICAgICAgICBpdGVtczogbWVudUl0ZW1zLFxuICAgICAgICBjb25maWc6IHt9LFxuICAgICAgICBzZWxmQ29yZHM6IHsgbGVmdDogXCIwcHhcIiwgdG9wOiBcIjBweFwiIH0sXG4gICAgICAgIG93bmVyQ29yZHM6IHsgeDogMCwgeTogMCwgd2lkdGg6IDAsIGhlaWdodDogMCB9LFxuICAgICAgICBpZDogbnVsbFxuICAgIH1cblxuICAgIHJldHVybiBjYWxjQ29tcG9uZW50Qm91bmRzKE1lbnVDb21wb25lbnQsIGRhdGEpO1xufVxuXG5jb25zdCBjYWxjQ29tcG9uZW50Qm91bmRzID0gYXN5bmMgKGNvbXBvbmVudDogVHlwZTxhbnk+LCBkYXRhOiBhbnkpID0+IHtcbiAgICAvLyBGb3JjaWJseSBib290c3RyYXAgdGhlIGN0eCBtZW51IG91dHNpZGUgb2YgdGhlIGNsaWVudCBhcHBsaWNhdGlvbidzIHpvbmUuXG4gICAgY29uc3QgYXBwID0gYXdhaXQgY3JlYXRlQXBwbGljYXRpb24oe1xuICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgIHsgcHJvdmlkZTogTUFUX0RJQUxPR19EQVRBLCB1c2VWYWx1ZTogZGF0YSB9XG4gICAgICAgIF1cbiAgICB9KTtcblxuICAgIGNvbnN0IGRlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZGVsLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgIGRlbC5zdHlsZS5sZWZ0ID0gJy0xMDAwdncnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKGRlbCk7XG5cbiAgICBjb25zdCBiYXNlID0gYXBwLmJvb3RzdHJhcChjb21wb25lbnQsIGRlbCk7XG4gICAgY29uc3QgeyBpbnN0YW5jZSB9ID0gYmFzZTtcblxuICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKGFwcC5pc1N0YWJsZSk7XG5cbiAgICBjb25zdCBlbDogSFRNTEVsZW1lbnQgPSBpbnN0YW5jZS52aWV3Q29udGFpbmVyPy5lbGVtZW50Py5uYXRpdmVFbGVtZW50O1xuXG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGFwcC5kZXN0cm95KCk7XG4gICAgZGVsLnJlbW92ZSgpO1xuICAgIHJldHVybiByZWN0O1xufVxuXG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd4LW1lbnUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9tZW51LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9tZW51LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0lmLFxuICAgICAgICBOZ0Zvck9mLFxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICBQb3J0YWxNb2R1bGUsXG4gICAgICAgIE1hdEljb25Nb2R1bGUsXG4gICAgICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcbiAgICAgICAgVG9vbHRpcERpcmVjdGl2ZVxuICAgIF0sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBNZW51Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBASW5wdXQoKSBwdWJsaWMgZGF0YTogYW55O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpdGVtczogTWVudUl0ZW1bXTtcbiAgICBASW5wdXQoKSBwdWJsaWMgY29uZmlnOiBNZW51T3B0aW9ucztcbiAgICBASW5wdXQoKSBwdWJsaWMgaWQ6IHN0cmluZztcblxuICAgIEBJbnB1dCgpIG93bmVyQ29yZHM6IERPTVJlY3Q7XG4gICAgQElucHV0KCkgc2VsZkNvcmRzO1xuXG4gICAgQE91dHB1dCgpIGNsb3NlU2lnbmFsID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgcHVibGljIGhhc0Jvb3RzdHJhcHBlZCA9IGZhbHNlO1xuICAgIHB1YmxpYyBwb2ludGVySXNPblZvaWQgPSBmYWxzZTtcbiAgICBwdWJsaWMgaXNMb2NrZWRPcGVuID0gZmFsc2U7XG5cbiAgICBjb3ZlclJlY3RDb3JkcyA9IHtcbiAgICAgICAgdG9wOiAwLFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgIHdpZHRoOiAwXG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBzbGFzaGVzIG9yIGRvdHMgLS0gdGhhdCB3aWxsIGNsZWFybHkgZXhjbHVkZSBpdCBmcm9tIGJlaW5nIGEgbWF0IGljb25cbiAgICBwdWJsaWMgcmVhZG9ubHkgbWF0SWNvblJ4ID0gL1tcXC9cXC5dL2k7XG4gICAgc2hvd0ljb25Db2x1bW4gPSB0cnVlO1xuICAgIHNob3dTaG9ydGN1dENvbHVtbiA9IHRydWU7XG5cbiAgICB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICB0ZW1wbGF0ZVR5cGU6IFwidGVtcGxhdGVcIiB8IFwiY29tcG9uZW50XCI7XG4gICAgY29tcG9uZW50UG9ydGFsOiBDb21wb25lbnRQb3J0YWw8YW55PjtcbiAgICBwcml2YXRlIGNoaWxkRGlhbG9nczogTWF0RGlhbG9nUmVmPGFueT5bXSA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyB2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBwdWJsaWMgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwcml2YXRlIF9kYXRhOiBhbnksXG4gICAgICAgIEBPcHRpb25hbCgpIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZywgLy8gb3B0aW9uYWwgb25seSBmb3IgdGhlIHB1cnBvc2Ugb2YgZXN0aW1hdGluZyBkaW1lbnNpb25zXG4gICAgICAgIEBPcHRpb25hbCgpIHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxhbnk+XG4gICAgKSB7XG4gICAgICAgIC8vIERlZmF1bHRzIGFyZSBzZXQgYmVmb3JlIEBJbnB1dCgpIGhvb2tzIGV2YWx1YXRlXG4gICAgICAgIHRoaXMuZGF0YSAgPSB0aGlzLl9kYXRhPy5kYXRhO1xuICAgICAgICB0aGlzLm93bmVyQ29yZHMgPSB0aGlzLl9kYXRhPy5vd25lckNvcmRzO1xuICAgICAgICB0aGlzLnNlbGZDb3JkcyA9IHRoaXMuX2RhdGE/LnNlbGZDb3JkcztcbiAgICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuX2RhdGE/Lml0ZW1zO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IHRoaXMuX2RhdGE/LmNvbmZpZztcbiAgICAgICAgdGhpcy5pZCA9IHRoaXMuX2RhdGE/LmlkO1xuXG5cbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IF9kYXRhLnRlbXBsYXRlO1xuXG4gICAgICAgIHRoaXMudGVtcGxhdGVUeXBlID0gdGhpcy50ZW1wbGF0ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmID8gXCJ0ZW1wbGF0ZVwiIDogXCJjb21wb25lbnRcIjtcblxuICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZVR5cGUgPT0gXCJjb21wb25lbnRcIikge1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRQb3J0YWwgPSBuZXcgQ29tcG9uZW50UG9ydGFsKHRoaXMudGVtcGxhdGUgYXMgYW55KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLml0ZW1zPy5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpID09IFwic3RyaW5nXCIpIHJldHVybjtcblxuICAgICAgICAgICAgLy8gU2V0IGRlZmF1bHRzXG4gICAgICAgICAgICBpWydfZGlzYWJsZWQnXSA9IGZhbHNlO1xuICAgICAgICAgICAgaVsnX3Zpc2libGUnXSA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmIChpLmxhYmVsKVxuICAgICAgICAgICAgICAgIHRyeSB7IGlbJ19mb3JtYXR0ZWRMYWJlbCddID0gdGhpcy5mb3JtYXRMYWJlbChpLmxhYmVsKTsgfSBjYXRjaCAoZSkgeyBjb25zb2xlLndhcm4oZSkgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGkuaXNEaXNhYmxlZCA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgICAgdHJ5IHsgaVsnX2Rpc2FibGVkJ10gPSBpLmlzRGlzYWJsZWQodGhpcy5kYXRhIHx8IHt9KTsgfSBjYXRjaChlKSB7IGNvbnNvbGUud2FybihlKSB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgaS5pc1Zpc2libGUgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICAgIHRyeSB7IGlbJ192aXNpYmxlJ10gPSBpLmlzVmlzaWJsZSh0aGlzLmRhdGEgfHwge30pOyB9IGNhdGNoIChlKSB7IGNvbnNvbGUud2FybihlKSB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgaS5saW5rVGVtcGxhdGUgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICAgIHRyeSB7IGlbJ19saW5rJ10gPSBpLmxpbmtUZW1wbGF0ZSh0aGlzLmRhdGEgfHwge30pOyB9IGNhdGNoIChlKSB7IGNvbnNvbGUud2FybihlKSB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNob3cgdGhlIGljb24gY29sdW1uIGlmIHRoZXJlIGFyZSBhbnkgaXRlbXMgd2l0aCBhbiBpY29uXG4gICAgICAgIHRoaXMuc2hvd0ljb25Db2x1bW4gPSAhIXRoaXMuaXRlbXM/LmZpbmQoaSA9PlxuICAgICAgICAgICAgICAgIHR5cGVvZiBpID09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgaVsnaWNvbiddID09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICBpWydpY29uJ10ubGVuZ3RoID4gMlxuICAgICAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnNob3dTaG9ydGN1dENvbHVtbiA9ICEhdGhpcy5pdGVtcz8uZmluZChpID0+XG4gICAgICAgICAgICAgICAgdHlwZW9mIGkgPT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBpWydzaG9ydGN1dCddID09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICBpWydzaG9ydGN1dCddLmxlbmd0aCA+IDJcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMub3duZXJDb3Jkcykge1xuICAgICAgICAgICAgY29uc3Qgc2VsZlkgPSBwYXJzZUludCh0aGlzLnNlbGZDb3Jkcy50b3A/LnJlcGxhY2UoJ3B4JywgJycpIHx8ICcwJyk7XG4gICAgICAgICAgICBjb25zdCBzZWxmWCA9IHBhcnNlSW50KHRoaXMuc2VsZkNvcmRzLmxlZnQ/LnJlcGxhY2UoJ3B4JywgJycpIHx8ICcwJyk7XG5cbiAgICAgICAgICAgIHRoaXMuY292ZXJSZWN0Q29yZHMgPSB7XG4gICAgICAgICAgICAgICAgdG9wOiB0aGlzLm93bmVyQ29yZHMueSAtIHNlbGZZIC0gMTYsXG4gICAgICAgICAgICAgICAgbGVmdDogdGhpcy5vd25lckNvcmRzLnggLSBzZWxmWCAtIDE2LFxuICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy5vd25lckNvcmRzLmhlaWdodCArIDMyLFxuICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLm93bmVyQ29yZHMud2lkdGggKyAzMlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhc0Jvb3RzdHJhcHBlZCA9IHRydWU7XG4gICAgICAgIH0sIDIwMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbVxuICAgICAqIEBwYXJhbSBldnRcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIGFzeW5jIG9uTWVudUl0ZW1DbGljayhpdGVtOiBNZW51SXRlbSwgcm93OiBIVE1MVGFibGVSb3dFbGVtZW50LCBoaWRlQmFja2Ryb3AgPSBmYWxzZSkge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT0gJ3N0cmluZycpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoaXRlbS5zZXBhcmF0b3IpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIElmIGNhY2hlIGlzIGVuYWJsZWQsIG9ubHkgbG9hZCBpZiB3ZSBkb24ndCBoYXZlIGFueSBjaGlsZHJlbi5cbiAgICAgICAgY29uc3QgZm9yY2VMb2FkID0gKGl0ZW0uY2FjaGVSZXNvbHZlZENoaWxkcmVuID8gIWl0ZW0uY2hpbGRyZW4gOiB0cnVlKTtcblxuICAgICAgICBpZiAoaXRlbS5jaGlsZHJlblJlc29sdmVyICYmIGZvcmNlTG9hZCkge1xuICAgICAgICAgICAgaXRlbVsnX2lzUmVzb2x2aW5nJ10gPSB0cnVlO1xuICAgICAgICAgICAgaXRlbS5jaGlsZHJlbiA9IGF3YWl0IGl0ZW0uY2hpbGRyZW5SZXNvbHZlcih0aGlzLmRhdGEpO1xuICAgICAgICAgICAgaXRlbVsnX2lzUmVzb2x2aW5nJ10gPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXRlbS5jaGlsZFRlbXBsYXRlICYmICFpdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAoaXRlbS5hY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBpdGVtLmFjdGlvbih0aGlzLmRhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIG5vIGFjdGlvbiwgdGhpcyBpcyBzaW1wbHkgYSB0ZXh0IGl0ZW0uXG5cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTmVlZCBYIHBvcywgWSBwb3MsIHdpZHRoIGFuZCBoZWlnaHRcbiAgICAgICAgY29uc3QgYm91bmRzID0gcm93LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIGNvbnN0IGNvcmRzID0ge1xuICAgICAgICAgICAgdG9wOiBudWxsLFxuICAgICAgICAgICAgbGVmdDogbnVsbCxcbiAgICAgICAgICAgIGJvdHRvbTogbnVsbCxcbiAgICAgICAgICAgIHJpZ2h0OiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gU2V0IHBvc2l0aW9uIGNvb3JkaW5hdGVzXG4gICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gYXdhaXQgKGl0ZW0uY2hpbGRUZW1wbGF0ZVxuICAgICAgICAgICAgPyBjYWxjQ29tcG9uZW50Qm91bmRzKE1lbnVDb21wb25lbnQsIHsgdGVtcGxhdGU6IGl0ZW0uY2hpbGRUZW1wbGF0ZSB9KVxuICAgICAgICAgICAgOiBjYWxjTWVudUl0ZW1Cb3VuZHMoaXRlbS5jaGlsZHJlbiwgdGhpcy5kYXRhKSk7XG5cbiAgICAgICAgaWYgKGJvdW5kcy55ICsgaGVpZ2h0ID4gd2luZG93LmlubmVySGVpZ2h0KVxuICAgICAgICAgICAgY29yZHMuYm90dG9tID0gXCIwcHhcIjtcbiAgICAgICAgaWYgKGJvdW5kcy54ICsgYm91bmRzLndpZHRoICsgd2lkdGggPiB3aW5kb3cuaW5uZXJXaWR0aClcbiAgICAgICAgICAgIGNvcmRzLmxlZnQgPSAoKGJvdW5kcy54IC0gd2lkdGgpKSArIFwicHhcIjtcblxuICAgICAgICBpZiAoIWNvcmRzLmJvdHRvbSkgY29yZHMudG9wID0gYm91bmRzLnkgKyBcInB4XCI7XG4gICAgICAgIGlmICghY29yZHMubGVmdCkgY29yZHMubGVmdCA9IGJvdW5kcy54ICsgYm91bmRzLndpZHRoICsgXCJweFwiO1xuXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGl0ZW0uY2hpbGRyZW4gPyBNZW51Q29tcG9uZW50IDogTWVudUNvbXBvbmVudCBhcyBhbnk7XG5cbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3Blbihjb21wb25lbnQsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBjb3JkcyxcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFtcIm5neC1tZW51XCJdLmNvbmNhdCh0aGlzLmNvbmZpZz8uY3VzdG9tQ2xhc3MgfHwgW10pLFxuICAgICAgICAgICAgYmFja2Ryb3BDbGFzczogXCJuZ3gtbWVudS1iYWNrZHJvcFwiLFxuICAgICAgICAgICAgaGFzQmFja2Ryb3A6IGZhbHNlLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICAgICAgICAgICAgICBvd25lckNvcmRzOiByb3cuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICAgICAgc2VsZkNvcmRzOiBjb3JkcyxcbiAgICAgICAgICAgICAgICBpdGVtczogaXRlbS5jaGlsZHJlbixcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogaXRlbS5jaGlsZFRlbXBsYXRlLFxuICAgICAgICAgICAgICAgIGNvbmZpZzogdGhpcy5jb25maWdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IF9zID0gZGlhbG9nUmVmXG4gICAgICAgICAgICAuYWZ0ZXJDbG9zZWQoKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIHJlc3VsdCAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgaXRlbS5hY3Rpb24gPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFjdGlvbihyZXN1bHQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtWydfc2VsZmNsb3NlJ10gPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZERpYWxvZ3Muc3BsaWNlKHRoaXMuY2hpbGREaWFsb2dzLmZpbmRJbmRleChkID0+IGQgPT0gZGlhbG9nUmVmKSwgMSk7XG5cbiAgICAgICAgICAgICAgICAgICAgX3MudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNoaWxkRGlhbG9ncy5wdXNoKGRpYWxvZ1JlZik7XG4gICAgICAgIHJldHVybiBkaWFsb2dSZWY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGFiZWxcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIGZvcm1hdExhYmVsKGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbGFiZWwucmVwbGFjZSgvXyhbYS16MC05XSlfL2ksIChtYXRjaCwgZ3JvdXApID0+IGA8dT4ke2dyb3VwfTwvdT5gKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZSB0aGUgY29udGV4dCBtZW51IHVuZGVyIHRoZXNlIGNpcmN1bXN0YW5jZXNcbiAgICAgKi9cbiAgICAvLyBASG9zdExpc3RlbmVyKFwid2luZG93OnJlc2l6ZVwiLCBbJ2V2ZW50J10pXG4gICAgLy8gQEhvc3RMaXN0ZW5lcihcIndpbmRvdzpibHVyXCIsIFsnZXZlbnQnXSlcbiAgICBjbG9zZShyZXN1bHQ/KSB7XG4gICAgICAgIGlmIChyZXN1bHQgIT0gLTEpXG4gICAgICAgICAgICB0aGlzLmNsb3NlU2lnbmFsLmVtaXQoKTtcblxuICAgICAgICB0aGlzLmNoaWxkRGlhbG9ncy5mb3JFYWNoKGQgPT4gZC5jbG9zZSgpKVxuICAgICAgICB0aGlzLmRpYWxvZ1JlZj8uY2xvc2UocmVzdWx0KTtcbiAgICB9XG5cbiAgICBjbG9zZU9uVm9pZChmb3JjZSA9IGZhbHNlKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0xvY2tlZE9wZW4gfHwgZm9yY2UpXG4gICAgICAgICAgICB0aGlzLmNsb3NlKC0xKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgZGlhbG9nIGlzIGNsaXBwaW5nIG9mZnNjcmVlblxuICAgICAqIGlmIHNvLCBtb3ZlIGl0IGJhY2sgaW50byB2aWV3LlxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoXCJ3aW5kb3c6cmVzaXplXCIpXG4gICAgcHJpdmF0ZSBvblJlc2l6ZSgpIHtcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLnZpZXdDb250YWluZXI/LmVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghZWwpIHJldHVybjtcblxuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHgsIHkgfSA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIubmd4LW1lbnVcIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG5cbiAgICAgICAgLy8gTW92ZSBiYWNrIGludG8gdmlldyBpZiB3ZSdyZSBjbGlwcGluZyBvdXRzaWRlIG9mIHRoZSBib3R0b21cbiAgICAgICAgaWYgKHkgKyBoZWlnaHQgPiB3aW5kb3cuaW5uZXJIZWlnaHQpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1RvcCA9ICh3aW5kb3cuaW5uZXJIZWlnaHQgLSAoaGVpZ2h0ICsgKHRoaXMuY29uZmlnLmVkZ2VQYWRkaW5nIHx8IDEyKSkpICsgXCJweFwiO1xuICAgICAgICAgICAgdGFyZ2V0LnN0eWxlWydtYXJnaW4tdG9wJ10gPSBuZXdUb3A7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNb3ZlIGJhY2sgaW50byB2aWV3IGlmIHdlJ3JlIGNsaXBwaW5nIG9mZiB0aGUgcmlnaHRcbiAgICAgICAgaWYgKHggKyB3aWR0aCA+IHdpbmRvdy5pbm5lcldpZHRoKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdMZWZ0ID0gKHdpbmRvdy5pbm5lcldpZHRoIC0gKHdpZHRoICsgKHRoaXMuY29uZmlnLmVkZ2VQYWRkaW5nIHx8IDEyKSkpICsgXCJweFwiXG4gICAgICAgICAgICB0YXJnZXQuc3R5bGVbJ21hcmdpbi1sZWZ0J10gPSBuZXdMZWZ0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHZvaWQgZWxlbWVudCBnZXRzIHN0dWNrIG9wZW4sIG1ha2Ugd2hlZWwgZXZlbnRzIHBhc3MgdGhyb3VnaC5cbiAgICBvbldoZWVsKGV2dDogV2hlZWxFdmVudCkge1xuICAgICAgICBjb25zdCBlbCA9IHRoaXMudmlld0NvbnRhaW5lci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChldnQuY2xpZW50WCwgZXZ0LmNsaWVudFkpO1xuICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuXG4gICAgICAgIHRhcmdldC5zY3JvbGwoe1xuICAgICAgICAgICAgdG9wOiBldnQuZGVsdGFZICsgdGFyZ2V0LnNjcm9sbFRvcCxcbiAgICAgICAgICAgIGxlZnQ6IGV2dC5kZWx0YVggKyB0YXJnZXQuc2Nyb2xsTGVmdCxcbiAgICAgICAgICAgIGJlaGF2aW9yOiBcInNtb290aFwiXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwiPCEtLSBNb3VzZSBldmVudCBibG9ja2VyIGZvciBwb2ludGVyIGxlYXZlIC0tPlxuPGRpdlxuICAgICpuZ0lmPVwiY292ZXJSZWN0Q29yZHNcIlxuICAgIGNsYXNzPVwib3duZXItbWFza1wiXG4gICAgW3N0eWxlLnRvcF09XCJjb3ZlclJlY3RDb3Jkcy50b3AgKyAncHgnXCJcbiAgICBbc3R5bGUubGVmdF09XCJjb3ZlclJlY3RDb3Jkcy5sZWZ0ICsgJ3B4J1wiXG4gICAgW3N0eWxlLmhlaWdodF09XCJjb3ZlclJlY3RDb3Jkcy5oZWlnaHQgKyAncHgnXCJcbiAgICBbc3R5bGUud2lkdGhdPVwiY292ZXJSZWN0Q29yZHMud2lkdGggKyAncHgnXCJcbiAgICBzdHlsZT1cInotaW5kZXg6IC0xXCJcbj48L2Rpdj5cblxuPGRpdiBjbGFzcz1cInZvaWRcIlxuICAgIChwb2ludGVyZW50ZXIpPVwicG9pbnRlcklzT25Wb2lkID0gdHJ1ZTsgaGFzQm9vdHN0cmFwcGVkICYmICFpc0xvY2tlZE9wZW4gJiYgY2xvc2VPblZvaWQoKVwiXG4gICAgKHBvaW50ZXJsZWF2ZSk9XCJwb2ludGVySXNPblZvaWQgPSBmYWxzZVwiXG4gICAgKHBvaW50ZXJkb3duKT1cImhhc0Jvb3RzdHJhcHBlZCAmJiBjbG9zZU9uVm9pZCh0cnVlKVwiXG4gICAgKHdoZWVsKT1cIm9uV2hlZWwoJGV2ZW50KVwiXG4+PC9kaXY+XG5cbjx0YWJsZSAqbmdJZj1cIiF0ZW1wbGF0ZVwiPlxuICAgIDx0Ym9keT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtc1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDwhLS0gQSByb3cgd2l0aCBhIGNsaWNrIGFjdGlvbiAtLT5cbiAgICAgICAgICAgICAgICA8dHIgI3Jvd1xuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0gIT0gJ3NlcGFyYXRvcicgJiYgaXRlbS5zZXBhcmF0b3IgIT0gdHJ1ZSAmJiBpdGVtWydfdmlzaWJsZSddXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIml0ZW1bJ19kaXNhYmxlZCddXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiFpdGVtWydfZGlzYWJsZWQnXSAmJiBvbk1lbnVJdGVtQ2xpY2soaXRlbSwgcm93KVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5ob3Zlcl09XCJpdGVtWydjaGlsZHJlbiddICYmIHJvd1snaG92ZXInXVwiXG4gICAgICAgICAgICAgICAgICAgIChwb2ludGVyZW50ZXIpPVwicm93Wydob3ZlciddID0gdHJ1ZTtcIlxuICAgICAgICAgICAgICAgICAgICAocG9pbnRlcmxlYXZlKT1cInJvd1snaG92ZXInXSA9IGZhbHNlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPCEtLSAgKGl0ZW1bJ2NoaWxkcmVuJ10/Lmxlbmd0aCA+IDAgfHwgaXRlbVsnY2hpbGRUZW1wbGF0ZSddKSAmJiBvbkhvdmVyKGl0ZW0sIHJvdyk7IGNsb3NlT25MZWF2ZT10cnVlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJpY29uXCIgKm5nSWY9XCJzaG93SWNvbkNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cIm1hdEljb25SeC50ZXN0KGl0ZW0uaWNvbik7IGVsc2UgbWF0SWNvblwiIFtzcmNdPVwiaXRlbS5pY29uXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbWF0SWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gW2ZvbnRJY29uXT1cIml0ZW0uaWNvblwiIFtzdHlsZS5jb2xvcl09XCJpdGVtLmljb25Db2xvclwiPjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gJ05vcm1hbCcgYWN0aW9uIGJhc2VkIGl0ZW0gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJsYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmctbGVmdF09XCJzaG93SWNvbkNvbHVtbiA/IDAgOiAnMTZweCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhcmdldF09XCJpdGVtLmxpbmtUYXJnZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5ocmVmXT1cIihpdGVtWydfbGluayddIHx8IGl0ZW0ubGluaykgPyBzYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFVybChpdGVtWydfbGluayddIHx8IGl0ZW0ubGluaykgOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIkYW55KGl0ZW0ubGFiZWxUZW1wbGF0ZSk/LnByb3RvdHlwZTsgZWxzZSBsYWJlbFRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIiRhbnkoaXRlbSkubGFiZWxUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAnJGltcGxpY2l0JzogZGF0YSwgJ2RpYWxvZyc6IGRpYWxvZ1JlZiB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xhYmVsVGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiISRhbnkoaXRlbSk/LmxhYmVsVGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwiaXRlbVsnX2Zvcm1hdHRlZExhYmVsJ11cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiRhbnkoaXRlbSk/LmxhYmVsVGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyRhbnkoaXRlbSk/LmxhYmVsVGVtcGxhdGUoZGF0YSB8fCB7fSl9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwic2hvcnRjdXRcIiAqbmdJZj1cInNob3dTaG9ydGN1dENvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLnNob3J0Y3V0TGFiZWx9fVxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJtaW4td2lkdGg6IDE2cHhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtLmNoaWxkcmVuICYmIGl0ZW0uY2hpbGRyZW4ubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNoaWxkVGVtcGxhdGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRlbS5jaGlsZHJlblJlc29sdmVyICYmICFpdGVtWydfaXNSZXNvbHZpbmcnXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3l0bGU9XCJ0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMnB4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hldnJvbl9yaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyICpuZ0lmPVwiaXRlbVsnX2lzUmVzb2x2aW5nJ11cIiBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiIFtkaWFtZXRlcl09XCIyMFwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA0cHhcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPC90cj5cblxuICAgICAgICAgICAgICAgIDx0ciAqbmdJZj1cIml0ZW0gIT0gJ3NlcGFyYXRvcicgJiYgaXRlbS5zZXBhcmF0b3IgPT0gdHJ1ZVwiIGNsYXNzPVwiZGlzYWJsZWQgc2VwYXJhdG9yXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNlbnRlclwiIFthdHRyLmNvbHNwYW5dPVwiMiArIChzaG93SWNvbkNvbHVtbiA/IDEgOiAwKSArIChzaG93U2hvcnRjdXRDb2x1bW4gPyAxIDogMClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaHJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW1bJ2xhYmVsJ10gfHwgJyd9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwiaXRlbSA9PSAnc2VwYXJhdG9yJ1wiIGNsYXNzPVwiZGlzYWJsZWQgc2VwYXJhdG9yXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cIjIgKyAoc2hvd0ljb25Db2x1bW4gPyAxIDogMCkgKyAoc2hvd1Nob3J0Y3V0Q29sdW1uID8gMSA6IDApXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aHIvPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC90Ym9keT5cbjwvdGFibGU+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJ0ZW1wbGF0ZVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0ZW1wbGF0ZVR5cGUgPT0gJ3RlbXBsYXRlJzsgZWxzZSBwb3J0YWxPdXRsZXRcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJyRpbXBsaWNpdCc6IGRhdGEsIGRpYWxvZzogZGlhbG9nUmVmIH1cIlxuICAgICAgICAvPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjcG9ydGFsT3V0bGV0IFtjZGtQb3J0YWxPdXRsZXRdPVwiY29tcG9uZW50UG9ydGFsXCIgPjwvbmctdGVtcGxhdGU+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
384
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL2NvbXBvbmVudHMvbWVudS9tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvY29tcG9uZW50cy9tZW51L21lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRSxPQUFPLEVBQXFCLFNBQVMsRUFBZ0IsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsUUFBUSxFQUFVLFdBQVcsRUFBMEIsTUFBTSxlQUFlLENBQUM7QUFDdkssT0FBTyxFQUFnQixpQkFBaUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVFLE9BQU8sRUFBMkIsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDcEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRTlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7Ozs7OztBQUV0RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLEVBQUUsU0FBcUIsRUFBRSxPQUFZLEVBQUUsRUFBRTtJQUM1RSxNQUFNLElBQUksR0FBRztRQUNULElBQUksRUFBRSxPQUFPO1FBQ2IsS0FBSyxFQUFFLFNBQVM7UUFDaEIsTUFBTSxFQUFFLEVBQUU7UUFDVixTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FB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LE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDVixHQUFHLEVBQUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUztZQUNsQyxJQUFJLEVBQUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsVUFBVTtZQUNwQyxRQUFRLEVBQUUsUUFBUTtTQUNyQixDQUFDLENBQUE7SUFDTixDQUFDOzswR0FyVVEsYUFBYSw4RUFzQ0UsZUFBZTs4RkF0QzlCLGFBQWEsZ1pDckUxQixzOUxBcUpBLDI0REQxRlEsSUFBSSw2RkFDSixPQUFPLG1IQUNQLGdCQUFnQixtSkFDaEIsWUFBWSxpTUFDWixhQUFhLG1MQUNiLHdCQUF3QjsyRkFLbkIsYUFBYTtrQkFmekIsU0FBUzsrQkFDSSxVQUFVLFdBR1g7d0JBQ0wsSUFBSTt3QkFDSixPQUFPO3dCQUNQLGdCQUFnQjt3QkFDaEIsWUFBWTt3QkFDWixhQUFhO3dCQUNiLHdCQUF3Qjt3QkFDeEIsZ0JBQWdCO3FCQUNuQixjQUNXLElBQUk7OzBCQXdDWCxRQUFROzswQkFBSSxNQUFNOzJCQUFDLGVBQWU7OzBCQUNsQyxRQUFROzswQkFDUixRQUFROzRDQXZDRyxJQUFJO3NCQUFuQixLQUFLO2dCQUNVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBQ1UsTUFBTTtzQkFBckIsS0FBSztnQkFDVSxFQUFFO3NCQUFqQixLQUFLO2dCQUNVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFDVSxnQkFBZ0I7c0JBQS9CLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkF1UkUsUUFBUTtzQkFEZixZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0Zvck9mLCBOZ0lmLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbmplY3QsIElucHV0LCBPbkluaXQsIE9wdGlvbmFsLCBPdXRwdXQsIFRlbXBsYXRlUmVmLCBUeXBlLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIGNyZWF0ZUFwcGxpY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ1JlZiwgTUFUX0RJQUxPR19EQVRBIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXInO1xuXG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwsIFBvcnRhbE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1lbnVJdGVtLCBNZW51T3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzL21lbnUnO1xuaW1wb3J0IHsgVG9vbHRpcERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvdG9vbHRpcC5kaXJlY3RpdmUnO1xuXG5leHBvcnQgY29uc3QgY2FsY01lbnVJdGVtQm91bmRzID0gYXN5bmMgKG1lbnVJdGVtczogTWVudUl0ZW1bXSwgZGF0YU9iajogYW55KSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgZGF0YTogZGF0YU9iaixcbiAgICAgICAgaXRlbXM6IG1lbnVJdGVtcyxcbiAgICAgICAgY29uZmlnOiB7fSxcbiAgICAgICAgc2VsZkNvcmRzOiB7IGxlZnQ6IFwiMHB4XCIsIHRvcDogXCIwcHhcIiB9LFxuICAgICAgICBvd25lckNvcmRzOiB7IHg6IDAsIHk6IDAsIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSxcbiAgICAgICAgaWQ6IG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gY2FsY0NvbXBvbmVudEJvdW5kcyhNZW51Q29tcG9uZW50LCBkYXRhKTtcbn1cblxuY29uc3QgY2FsY0NvbXBvbmVudEJvdW5kcyA9IGFzeW5jIChjb21wb25lbnQ6IFR5cGU8YW55PiwgZGF0YTogYW55KSA9PiB7XG4gICAgLy8gRm9yY2libHkgYm9vdHN0cmFwIHRoZSBjdHggbWVudSBvdXRzaWRlIG9mIHRoZSBjbGllbnQgYXBwbGljYXRpb24ncyB6b25lLlxuICAgIGNvbnN0IGFwcCA9IGF3YWl0IGNyZWF0ZUFwcGxpY2F0aW9uKHtcbiAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICB7IHByb3ZpZGU6IE1BVF9ESUFMT0dfREFUQSwgdXNlVmFsdWU6IGRhdGEgfVxuICAgICAgICBdXG4gICAgfSk7XG5cbiAgICBjb25zdCBkZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGRlbC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICBkZWwuc3R5bGUubGVmdCA9ICctMTAwMHZ3JztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZChkZWwpO1xuXG4gICAgY29uc3QgYmFzZSA9IGFwcC5ib290c3RyYXAoY29tcG9uZW50LCBkZWwpO1xuICAgIGNvbnN0IHsgaW5zdGFuY2UgfSA9IGJhc2U7XG5cbiAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbShhcHAuaXNTdGFibGUpO1xuXG4gICAgY29uc3QgZWw6IEhUTUxFbGVtZW50ID0gaW5zdGFuY2Uudmlld0NvbnRhaW5lcj8uZWxlbWVudD8ubmF0aXZlRWxlbWVudDtcblxuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBhcHAuZGVzdHJveSgpO1xuICAgIGRlbC5yZW1vdmUoKTtcbiAgICByZXR1cm4gcmVjdDtcbn1cblxuY29uc3QgJGRhdGEgPSBTeW1ib2woXCJkYXRhXCIpO1xuY29uc3QgJGhvdmVyID0gU3ltYm9sKFwiaG92ZXJcIik7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd4LW1lbnUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9tZW51LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9tZW51LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0lmLFxuICAgICAgICBOZ0Zvck9mLFxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICBQb3J0YWxNb2R1bGUsXG4gICAgICAgIE1hdEljb25Nb2R1bGUsXG4gICAgICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcbiAgICAgICAgVG9vbHRpcERpcmVjdGl2ZVxuICAgIF0sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBNZW51Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBASW5wdXQoKSBwdWJsaWMgZGF0YTogYW55O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpdGVtczogTWVudUl0ZW1bXTtcbiAgICBASW5wdXQoKSBwdWJsaWMgY29uZmlnOiBNZW51T3B0aW9ucztcbiAgICBASW5wdXQoKSBwdWJsaWMgaWQ6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgb3ZlcmxheU92ZXJsYXAgPSAzMjtcbiAgICBASW5wdXQoKSBwdWJsaWMgaG92ZXJEZWxheSA9IDMwMDtcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd0RlYnVnT3ZlcmxheSA9IGZhbHNlO1xuXG4gICAgQElucHV0KCkgb3duZXJDb3JkczogRE9NUmVjdDtcbiAgICBASW5wdXQoKSBzZWxmQ29yZHM7XG4gICAgQElucHV0KCkgcGFyZW50SXRlbTtcbiAgICBASW5wdXQoKSBwYXJlbnRDb250ZXh0O1xuXG4gICAgcHVibGljIGhhc0Jvb3RzdHJhcHBlZCA9IGZhbHNlO1xuICAgIHB1YmxpYyBwb2ludGVySXNPblZvaWQgPSBmYWxzZTtcbiAgICBwdWJsaWMgaXNMb2NrZWRPcGVuID0gZmFsc2U7XG5cbiAgICBjb3ZlclJlY3RDb3JkcyA9IHtcbiAgICAgICAgdG9wOiAwLFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgIHdpZHRoOiAwXG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBzbGFzaGVzIG9yIGRvdHMgLS0gdGhhdCB3aWxsIGNsZWFybHkgZXhjbHVkZSBpdCBmcm9tIGJlaW5nIGEgbWF0IGljb25cbiAgICBwdWJsaWMgcmVhZG9ubHkgbWF0SWNvblJ4ID0gL1tcXC9cXC5dL2k7XG4gICAgc2hvd0ljb25Db2x1bW4gPSB0cnVlO1xuICAgIHNob3dTaG9ydGN1dENvbHVtbiA9IHRydWU7XG5cbiAgICB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICB0ZW1wbGF0ZVR5cGU6IFwidGVtcGxhdGVcIiB8IFwiY29tcG9uZW50XCI7XG4gICAgY29tcG9uZW50UG9ydGFsOiBDb21wb25lbnRQb3J0YWw8YW55PjtcbiAgICBwcml2YXRlIGNoaWxkRGlhbG9nczogTWF0RGlhbG9nUmVmPGFueT5bXSA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyB2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBwdWJsaWMgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwcml2YXRlIF9kYXRhOiBhbnksXG4gICAgICAgIEBPcHRpb25hbCgpIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZywgLy8gb3B0aW9uYWwgb25seSBmb3IgdGhlIHB1cnBvc2Ugb2YgZXN0aW1hdGluZyBkaW1lbnNpb25zXG4gICAgICAgIEBPcHRpb25hbCgpIHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxhbnk+XG4gICAgKSB7XG4gICAgICAgIC8vIERlZmF1bHRzIGFyZSBzZXQgYmVmb3JlIEBJbnB1dCgpIGhvb2tzIGV2YWx1YXRlXG4gICAgICAgIHRoaXMuZGlhbG9nID0gdGhpcy5kaWFsb2cgfHwgdGhpcy5fZGF0YT8uZGlhbG9nO1xuICAgICAgICB0aGlzLmRhdGEgID0gdGhpcy5fZGF0YT8uZGF0YTtcbiAgICAgICAgdGhpcy5vd25lckNvcmRzID0gdGhpcy5fZGF0YT8ub3duZXJDb3JkcztcbiAgICAgICAgdGhpcy5zZWxmQ29yZHMgPSB0aGlzLl9kYXRhPy5zZWxmQ29yZHM7XG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLl9kYXRhPy5pdGVtcztcbiAgICAgICAgdGhpcy5jb25maWcgPSB0aGlzLl9kYXRhPy5jb25maWc7XG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLl9kYXRhPy5pZDtcbiAgICAgICAgdGhpcy5wYXJlbnRJdGVtID0gdGhpcy5fZGF0YT8ucGFyZW50SXRlbTtcbiAgICAgICAgdGhpcy5wYXJlbnRDb250ZXh0ID0gdGhpcy5fZGF0YT8ucGFyZW50Q29udGV4dDtcblxuICAgICAgICB0aGlzLnRlbXBsYXRlID0gX2RhdGEudGVtcGxhdGU7XG5cbiAgICAgICAgdGhpcy50ZW1wbGF0ZVR5cGUgPSB0aGlzLnRlbXBsYXRlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYgPyBcInRlbXBsYXRlXCIgOiBcImNvbXBvbmVudFwiO1xuXG4gICAgICAgIGlmICh0aGlzLnRlbXBsYXRlVHlwZSA9PSBcImNvbXBvbmVudFwiKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFBvcnRhbCA9IG5ldyBDb21wb25lbnRQb3J0YWwodGhpcy50ZW1wbGF0ZSBhcyBhbnkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG5cbiAgICAgICAgdGhpcy5pdGVtcz8uZm9yRWFjaChpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaSA9PSBcInN0cmluZ1wiKSByZXR1cm47XG5cbiAgICAgICAgICAgIC8vIFNldCBkZWZhdWx0c1xuICAgICAgICAgICAgaVsnX2Rpc2FibGVkJ10gPSBmYWxzZTtcbiAgICAgICAgICAgIGlbJ192aXNpYmxlJ10gPSB0cnVlO1xuICAgICAgICAgICAgaVsnX2NvbnRleHQnXSA9ICh0eXBlb2YgaS5jb250ZXh0ID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpLmNvbnRleHQodGhpcy5kYXRhKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGkuY29udGV4dDtcblxuICAgICAgICAgICAgaWYgKGkubGFiZWwpXG4gICAgICAgICAgICAgICAgdHJ5IHsgaVsnX2Zvcm1hdHRlZExhYmVsJ10gPSB0aGlzLmZvcm1hdExhYmVsKGkubGFiZWwpOyB9IGNhdGNoIChlKSB7IGNvbnNvbGUud2FybihlKSB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgaS5pc0Rpc2FibGVkID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgICAgICB0cnkgeyBpWydfZGlzYWJsZWQnXSA9IGkuaXNEaXNhYmxlZCh0aGlzLmRhdGEgfHwge30sIGlbJ19jb250ZXh0J10pOyB9IGNhdGNoKGUpIHsgY29uc29sZS53YXJuKGUpIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpLmlzVmlzaWJsZSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgICAgdHJ5IHsgaVsnX3Zpc2libGUnXSA9IGkuaXNWaXNpYmxlKHRoaXMuZGF0YSB8fCB7fSwgaVsnX2NvbnRleHQnXSk7IH0gY2F0Y2ggKGUpIHsgY29uc29sZS53YXJuKGUpIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpLmxpbmtUZW1wbGF0ZSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgICAgdHJ5IHsgaVsnX2xpbmsnXSA9IGkubGlua1RlbXBsYXRlKHRoaXMuZGF0YSB8fCB7fSwgaVsnX2NvbnRleHQnXSk7IH0gY2F0Y2ggKGUpIHsgY29uc29sZS53YXJuKGUpIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU2hvdyB0aGUgaWNvbiBjb2x1bW4gaWYgdGhlcmUgYXJlIGFueSBpdGVtcyB3aXRoIGFuIGljb25cbiAgICAgICAgdGhpcy5zaG93SWNvbkNvbHVtbiA9ICEhdGhpcy5pdGVtcz8uZmluZChpID0+XG4gICAgICAgICAgICAgICAgdHlwZW9mIGkgPT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBpWydpY29uJ10gPT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIGlbJ2ljb24nXS5sZW5ndGggPiAyXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuc2hvd1Nob3J0Y3V0Q29sdW1uID0gISF0aGlzLml0ZW1zPy5maW5kKGkgPT5cbiAgICAgICAgICAgICAgICB0eXBlb2YgaSA9PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGlbJ3Nob3J0Y3V0J10gPT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIGlbJ3Nob3J0Y3V0J10ubGVuZ3RoID4gMlxuICAgICAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhpcy5vd25lckNvcmRzKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxmWSA9IHBhcnNlSW50KHRoaXMuc2VsZkNvcmRzLnRvcD8ucmVwbGFjZSgncHgnLCAnJykgfHwgJzAnKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGZYID0gcGFyc2VJbnQodGhpcy5zZWxmQ29yZHMubGVmdD8ucmVwbGFjZSgncHgnLCAnJykgfHwgJzAnKTtcblxuICAgICAgICAgICAgdGhpcy5jb3ZlclJlY3RDb3JkcyA9IHtcbiAgICAgICAgICAgICAgICB0b3A6IHRoaXMub3duZXJDb3Jkcy55IC0gc2VsZlkgLSAodGhpcy5vdmVybGF5T3ZlcmxhcC8yKSxcbiAgICAgICAgICAgICAgICBsZWZ0OiB0aGlzLm93bmVyQ29yZHMueCAtIHNlbGZYIC0gKHRoaXMub3ZlcmxheU92ZXJsYXAvMiksXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLm93bmVyQ29yZHMuaGVpZ2h0ICsgdGhpcy5vdmVybGF5T3ZlcmxhcCxcbiAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy5vd25lckNvcmRzLndpZHRoICsgdGhpcy5vdmVybGF5T3ZlcmxhcFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhc0Jvb3RzdHJhcHBlZCA9IHRydWU7XG4gICAgICAgIH0sIDIwMCk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICBjb25zdCBlbCA9IHRoaXMudmlld0NvbnRhaW5lci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGV2dCA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzTG9ja2VkT3BlbiA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgZXZ0ID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNMb2NrZWRPcGVuID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaFwiLCBldnQgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc0xvY2tlZE9wZW4gPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgLy9cbiAgICAgICAgdGhpcy5jaGlsZERpYWxvZ3MuZm9yRWFjaChkID0+IGQuY2xvc2Uoe1skZGF0YV06IHRydWV9KSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSBpdGVtXG4gICAgICogQHBhcmFtIGV2dFxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgYXN5bmMgb25NZW51SXRlbUNsaWNrKGl0ZW06IE1lbnVJdGVtLCByb3c6IEhUTUxUYWJsZVJvd0VsZW1lbnQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09ICdzdHJpbmcnKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKGl0ZW0uc2VwYXJhdG9yKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgaXRlbVsnX2NvbnRleHQnXTtcblxuICAgICAgICAvLyBJZiBjYWNoZSBpcyBlbmFibGVkLCBvbmx5IGxvYWQgaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgY2hpbGRyZW4uXG4gICAgICAgIGNvbnN0IGZvcmNlTG9hZCA9IChpdGVtLmNhY2hlUmVzb2x2ZWRDaGlsZHJlbiA/ICFpdGVtLmNoaWxkcmVuIDogdHJ1ZSk7XG5cbiAgICAgICAgaWYgKGl0ZW0uY2hpbGRyZW5SZXNvbHZlciAmJiBmb3JjZUxvYWQpIHtcbiAgICAgICAgICAgIGl0ZW1bJ19pc1Jlc29sdmluZyddID0gdHJ1ZTtcbiAgICAgICAgICAgIGl0ZW1bJ19jaGlsZHJlbiddID0gYXdhaXQgaXRlbS5jaGlsZHJlblJlc29sdmVyKHRoaXMuZGF0YSwgY29udGV4dCk7XG4gICAgICAgICAgICBpdGVtWydfaXNSZXNvbHZpbmcnXSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBpdGVtLmNoaWxkcmVuID09IFwiZnVuY3Rpb25cIiAmJiBmb3JjZUxvYWQpIHtcbiAgICAgICAgICAgIGl0ZW1bJ19pc1Jlc29sdmluZyddID0gdHJ1ZTtcbiAgICAgICAgICAgIGl0ZW1bJ19jaGlsZHJlbiddID0gYXdhaXQgaXRlbS5jaGlsZHJlbih0aGlzLmRhdGEsIGNvbnRleHQpO1xuICAgICAgICAgICAgaXRlbVsnX2lzUmVzb2x2aW5nJ10gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGl0ZW1bJ19jaGlsZHJlbiddID0gaXRlbS5jaGlsZHJlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXRlbS5jaGlsZFRlbXBsYXRlICYmICFpdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0uYWN0aW9uID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGl0ZW0uYWN0aW9uKHRoaXMuZGF0YSwgY29udGV4dClcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKHJlcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgbm8gYWN0aW9uLCB0aGlzIGlzIHNpbXBseSBhIHRleHQgaXRlbS5cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTmVlZCBYIHBvcywgWSBwb3MsIHdpZHRoIGFuZCBoZWlnaHRcbiAgICAgICAgY29uc3QgYm91bmRzID0gcm93LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIGNvbnN0IGNvcmRzID0ge1xuICAgICAgICAgICAgdG9wOiBudWxsLFxuICAgICAgICAgICAgbGVmdDogbnVsbCxcbiAgICAgICAgICAgIGJvdHRvbTogbnVsbCxcbiAgICAgICAgICAgIHJpZ2h0OiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gU2V0IHBvc2l0aW9uIGNvb3JkaW5hdGVzXG4gICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gYXdhaXQgKGl0ZW0uY2hpbGRUZW1wbGF0ZVxuICAgICAgICAgICAgPyBjYWxjQ29tcG9uZW50Qm91bmRzKE1lbnVDb21wb25lbnQsIHsgdGVtcGxhdGU6IGl0ZW0uY2hpbGRUZW1wbGF0ZSB9KVxuICAgICAgICAgICAgOiBjYWxjTWVudUl0ZW1Cb3VuZHMoaXRlbVsnX2NoaWxkcmVuJ10sIHRoaXMuZGF0YSkpO1xuXG4gICAgICAgIGlmIChib3VuZHMueSArIGhlaWdodCA+IHdpbmRvdy5pbm5lckhlaWdodClcbiAgICAgICAgICAgIGNvcmRzLmJvdHRvbSA9IFwiMHB4XCI7XG4gICAgICAgIGlmIChib3VuZHMueCArIGJvdW5kcy53aWR0aCArIHdpZHRoID4gd2luZG93LmlubmVyV2lkdGgpXG4gICAgICAgICAgICBjb3Jkcy5sZWZ0ID0gKChib3VuZHMueCAtIHdpZHRoKSkgKyBcInB4XCI7XG5cbiAgICAgICAgaWYgKCFjb3Jkcy5ib3R0b20pIGNvcmRzLnRvcCAgPSBib3VuZHMueSArIFwicHhcIjtcbiAgICAgICAgaWYgKCFjb3Jkcy5sZWZ0KSAgIGNvcmRzLmxlZnQgPSBib3VuZHMueCArIGJvdW5kcy53aWR0aCArIFwicHhcIjtcblxuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKE1lbnVDb21wb25lbnQsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBjb3JkcyxcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFtcIm5neC1tZW51XCJdLmNvbmNhdCh0aGlzLmNvbmZpZz8uY3VzdG9tQ2xhc3MgfHwgW10pLFxuICAgICAgICAgICAgYmFja2Ryb3BDbGFzczogXCJuZ3gtbWVudS1iYWNrZHJvcFwiLFxuICAgICAgICAgICAgaGFzQmFja2Ryb3A6IGZhbHNlLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICAgICAgICAgICAgICBvd25lckNvcmRzOiByb3cuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICAgICAgc2VsZkNvcmRzOiBjb3JkcyxcbiAgICAgICAgICAgICAgICBwYXJlbnRJdGVtOiBpdGVtLFxuICAgICAgICAgICAgICAgIHBhcmVudENvbnRleHQ6IGNvbnRleHQsXG4gICAgICAgICAgICAgICAgaXRlbXM6IGl0ZW1bJ19jaGlsZHJlbiddLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBpdGVtLmNoaWxkVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZ1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgX3MgPSBkaWFsb2dSZWZcbiAgICAgICAgICAgIC5hZnRlckNsb3NlZCgpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENsaWNrZWQgXCJ2b2lkXCIgb24gYSBzdWJtZW51XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09IFwib2JqZWN0XCIgJiYgcmVzdWx0WyRkYXRhXSA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gV2VudCBiYWNrIHRvIHBhcmVudCBtZW51IC0tIGRvIG5vdCBjbG9zZSAoc2FtZSBhcyByZXN1bHQgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHJlc3VsdCA9PSBcIm9iamVjdFwiICYmIHJlc3VsdFskZGF0YV0gPT0gZmFsc2UpIHtcblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEdvdCBzb21lIG90aGVyIHJlc3VsdCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGVyZm9ybSBhY3Rpb24gY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbS5hY3Rpb24gPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoYXdhaXQgaXRlbS5hY3Rpb24ocmVzdWx0LCBjb250ZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IGNsb3NlLlxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZERpYWxvZ3Muc3BsaWNlKHRoaXMuY2hpbGREaWFsb2dzLmluZGV4T2YoZGlhbG9nUmVmKSwgMSk7XG5cbiAgICAgICAgICAgICAgICAgICAgX3MudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNoaWxkRGlhbG9ncy5wdXNoKGRpYWxvZ1JlZik7XG4gICAgICAgIHJldHVybiBkaWFsb2dSZWY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGFiZWxcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIGZvcm1hdExhYmVsKGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbGFiZWwucmVwbGFjZSgvXyhbYS16MC05XSlfL2ksIChtYXRjaCwgZ3JvdXApID0+IGA8dT4ke2dyb3VwfTwvdT5gKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZSB0aGUgY29udGV4dCBtZW51IHVuZGVyIHRoZXNlIGNpcmN1bXN0YW5jZXNcbiAgICAgKi9cbiAgICAvLyBASG9zdExpc3RlbmVyKFwid2luZG93OnJlc2l6ZVwiLCBbJ2V2ZW50J10pXG4gICAgLy8gQEhvc3RMaXN0ZW5lcihcIndpbmRvdzpibHVyXCIsIFsnZXZlbnQnXSlcbiAgICBjbG9zZShyZXN1bHQ/KSB7XG4gICAgICAgIHRoaXMuY2hpbGREaWFsb2dzLmZvckVhY2goZCA9PiBkLmNsb3NlKCkpXG4gICAgICAgIHRoaXMuZGlhbG9nUmVmPy5jbG9zZShyZXN1bHQpO1xuICAgIH1cblxuICAgIGNsb3NlT25Wb2lkKGZvcmNlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzTG9ja2VkT3BlbiB8fCBmb3JjZSkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZSh7WyRkYXRhXTogZm9yY2V9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXJ0SG92ZXJUaW1lcihpdGVtLCByb3cpIHtcbiAgICAgICAgaXRlbVskaG92ZXJdID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgaXRlbVskaG92ZXJdO1xuICAgICAgICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4gfHwgaXRlbS5jaGlsZFRlbXBsYXRlIHx8IGl0ZW0uY2hpbGRyZW5SZXNvbHZlcikge1xuICAgICAgICAgICAgICAgIHJvd1snaG92ZXInXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5vbk1lbnVJdGVtQ2xpY2soaXRlbSwgcm93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5ob3ZlckRlbGF5KTtcbiAgICB9XG4gICAgc3RvcEhvdmVyVGltZXIoaXRlbSkge1xuICAgICAgICBpdGVtWyRob3Zlcl0gJiYgY2xlYXJUaW1lb3V0KGl0ZW1bJGhvdmVyXSk7XG4gICAgICAgIGRlbGV0ZSBpdGVtWyRob3Zlcl07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGRpYWxvZyBpcyBjbGlwcGluZyBvZmZzY3JlZW5cbiAgICAgKiBpZiBzbywgbW92ZSBpdCBiYWNrIGludG8gdmlldy5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKFwid2luZG93OnJlc2l6ZVwiKVxuICAgIHByaXZhdGUgb25SZXNpemUoKSB7XG4gICAgICAgIGNvbnN0IGVsID0gdGhpcy52aWV3Q29udGFpbmVyPy5lbGVtZW50Py5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoIWVsKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCB4LCB5IH0gPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICBjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLm5neC1tZW51XCIpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIE1vdmUgYmFjayBpbnRvIHZpZXcgaWYgd2UncmUgY2xpcHBpbmcgb3V0c2lkZSBvZiB0aGUgYm90dG9tXG4gICAgICAgIGlmICh5ICsgaGVpZ2h0ID4gd2luZG93LmlubmVySGVpZ2h0KSB7XG4gICAgICAgICAgICBjb25zdCBuZXdUb3AgPSAod2luZG93LmlubmVySGVpZ2h0IC0gKGhlaWdodCArICh0aGlzLmNvbmZpZy5lZGdlUGFkZGluZyB8fCAxMikpKSArIFwicHhcIjtcbiAgICAgICAgICAgIHRhcmdldC5zdHlsZVsnbWFyZ2luLXRvcCddID0gbmV3VG9wO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTW92ZSBiYWNrIGludG8gdmlldyBpZiB3ZSdyZSBjbGlwcGluZyBvZmYgdGhlIHJpZ2h0XG4gICAgICAgIGlmICh4ICsgd2lkdGggPiB3aW5kb3cuaW5uZXJXaWR0aCkge1xuICAgICAgICAgICAgY29uc3QgbmV3TGVmdCA9ICh3aW5kb3cuaW5uZXJXaWR0aCAtICh3aWR0aCArICh0aGlzLmNvbmZpZy5lZGdlUGFkZGluZyB8fCAxMikpKSArIFwicHhcIlxuICAgICAgICAgICAgdGFyZ2V0LnN0eWxlWydtYXJnaW4tbGVmdCddID0gbmV3TGVmdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRoZSB2b2lkIGVsZW1lbnQgZ2V0cyBzdHVjayBvcGVuLCBtYWtlIHdoZWVsIGV2ZW50cyBwYXNzIHRocm91Z2guXG4gICAgb25XaGVlbChldnQ6IFdoZWVsRXZlbnQpIHtcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLnZpZXdDb250YWluZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZXZ0LmNsaWVudFgsIGV2dC5jbGllbnRZKTtcbiAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcblxuICAgICAgICB0YXJnZXQuc2Nyb2xsKHtcbiAgICAgICAgICAgIHRvcDogZXZ0LmRlbHRhWSArIHRhcmdldC5zY3JvbGxUb3AsXG4gICAgICAgICAgICBsZWZ0OiBldnQuZGVsdGFYICsgdGFyZ2V0LnNjcm9sbExlZnQsXG4gICAgICAgICAgICBiZWhhdmlvcjogXCJzbW9vdGhcIlxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsIjwhLS0gTW91c2UgZXZlbnQgYmxvY2tlciBmb3IgcG9pbnRlciBsZWF2ZSAtLT5cbjxkaXZcbiAgICAqbmdJZj1cImNvdmVyUmVjdENvcmRzXCJcbiAgICBjbGFzcz1cIm93bmVyLW1hc2tcIlxuICAgIFtzdHlsZS50b3BdPVwiY292ZXJSZWN0Q29yZHMudG9wICsgJ3B4J1wiXG4gICAgW3N0eWxlLmxlZnRdPVwiY292ZXJSZWN0Q29yZHMubGVmdCArICdweCdcIlxuICAgIFtzdHlsZS5oZWlnaHRdPVwiY292ZXJSZWN0Q29yZHMuaGVpZ2h0ICsgJ3B4J1wiXG4gICAgW3N0eWxlLndpZHRoXT1cImNvdmVyUmVjdENvcmRzLndpZHRoICsgJ3B4J1wiXG4gICAgW3N0eWxlLmJhY2tncm91bmRdPVwic2hvd0RlYnVnT3ZlcmxheSA/ICcjZjAwNCcgOiAnIzAwMDAnXCJcbiAgICBzdHlsZT1cInotaW5kZXg6IC0xXCJcbj48L2Rpdj5cblxuPGRpdiBjbGFzcz1cInZvaWRcIlxuICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cInNob3dEZWJ1Z092ZXJsYXkgPyAnIzAwZjQnIDogJyMwMDAwJ1wiXG4gICAgKHBvaW50ZXJlbnRlcik9XCJwb2ludGVySXNPblZvaWQgPSB0cnVlOyBoYXNCb290c3RyYXBwZWQgJiYgIWlzTG9ja2VkT3BlbiAmJiBjbG9zZU9uVm9pZCgpXCJcbiAgICAocG9pbnRlcmxlYXZlKT1cInBvaW50ZXJJc09uVm9pZCA9IGZhbHNlXCJcbiAgICAocG9pbnRlcmRvd24pPVwiaGFzQm9vdHN0cmFwcGVkICYmIGNsb3NlT25Wb2lkKHRydWUpXCJcbiAgICAod2hlZWwpPVwib25XaGVlbCgkZXZlbnQpXCJcbj48L2Rpdj5cblxuPHRhYmxlICpuZ0lmPVwiIXRlbXBsYXRlXCI+XG4gICAgPHRib2R5PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zXCI+XG4gICAgICAgICAgICA8IS0tIEEgcm93IHdpdGggYSBjbGljayBhY3Rpb24gLS0+XG4gICAgICAgICAgICA8dHIgI3Jvd1xuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbSAhPSAnc2VwYXJhdG9yJyAmJiBpdGVtLnNlcGFyYXRvciAhPSB0cnVlICYmIGl0ZW1bJ192aXNpYmxlJ11cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJpdGVtWydfZGlzYWJsZWQnXVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiFpdGVtWydfZGlzYWJsZWQnXSAmJiBvbk1lbnVJdGVtQ2xpY2soaXRlbSwgcm93KVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmhvdmVyXT1cIml0ZW1bJ2NoaWxkcmVuJ10gJiYgcm93Wydob3ZlciddXCJcbiAgICAgICAgICAgICAgICAocG9pbnRlcmVudGVyKT1cInJvd1snaG92ZXInXSA9IHRydWU7IHN0YXJ0SG92ZXJUaW1lcihpdGVtLCByb3cpXCJcbiAgICAgICAgICAgICAgICAocG9pbnRlcmxlYXZlKT1cInJvd1snaG92ZXInXSA9IGZhbHNlOyBzdG9wSG92ZXJUaW1lcihpdGVtKVwiXG4gICAgICAgICAgICA+XG5cbiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJpY29uXCIgKm5nSWY9XCJzaG93SWNvbkNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwibWF0SWNvblJ4LnRlc3QoaXRlbS5pY29uKTsgZWxzZSBtYXRJY29uXCIgW3NyY109XCJpdGVtLmljb25cIiAvPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI21hdEljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gW2ZvbnRJY29uXT1cIml0ZW0uaWNvblwiIFtzdHlsZS5jb2xvcl09XCJpdGVtLmljb25Db2xvclwiPjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC90ZD5cblxuICAgICAgICAgICAgICAgIDwhLS0gJ05vcm1hbCcgYWN0aW9uIGJhc2VkIGl0ZW0gLS0+XG4gICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwibGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUucGFkZGluZy1sZWZ0XT1cInNob3dJY29uQ29sdW1uID8gMCA6ICcxNnB4J1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICAgI2FuY2hvclxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFyZ2V0XT1cIml0ZW0ubGlua1RhcmdldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5ocmVmXT1cIihpdGVtWydfbGluayddIHx8IGl0ZW0ubGluaykgPyBzYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFVybChpdGVtWydfbGluayddIHx8IGl0ZW0ubGluaykgOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIkYW55KGl0ZW0ubGFiZWxUZW1wbGF0ZSk/LnByb3RvdHlwZTsgZWxzZSBzaW1wbGVMYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShpdGVtKS5sYWJlbFRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJGltcGxpY2l0JzogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RpYWxvZyc6IGRpYWxvZ1JlZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnRleHQnOiBpdGVtWydfY29udGV4dCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXRlbSc6IGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50JzogYW5jaG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVudSc6IHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2ltcGxlTGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEkYW55KGl0ZW0pPy5sYWJlbFRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2lubmVySFRNTF09XCJpdGVtWydfZm9ybWF0dGVkTGFiZWwnXVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIkYW55KGl0ZW0pPy5sYWJlbFRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7JGFueShpdGVtKT8ubGFiZWxUZW1wbGF0ZShkYXRhIHx8IHt9KX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgPC90ZD5cblxuICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInNob3J0Y3V0XCIgKm5nSWY9XCJzaG93U2hvcnRjdXRDb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAge3tpdGVtLnNob3J0Y3V0TGFiZWx9fVxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOiAxNnB4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRlbVsnY2hpbGRyZW4nXT8ubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRlbVsnX2NoaWxkcmVuJ10/Lmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5jaGlsZFRlbXBsYXRlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5jaGlsZHJlbj8uWydjYWxsJ10gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNoaWxkcmVuUmVzb2x2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFpdGVtWydfaXNSZXNvbHZpbmcnXVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMnB4KVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZXZyb25fcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cblxuICAgICAgICAgICAgICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbVsnX2lzUmVzb2x2aW5nJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZT1cImluZGV0ZXJtaW5hdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2RpYW1ldGVyXT1cIjIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA0cHhcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuXG4gICAgICAgICAgICA8IS0tIFNlcGFyYXRvciB3aXRoIGxhYmVsIC0tPlxuICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtICE9ICdzZXBhcmF0b3InICYmIGl0ZW0uc2VwYXJhdG9yID09IHRydWVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZGlzYWJsZWQgc2VwYXJhdG9yXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2xzcGFuXT1cIjIgKyAoc2hvd0ljb25Db2x1bW4gPyAxIDogMCkgKyAoc2hvd1Nob3J0Y3V0Q29sdW1uID8gMSA6IDApXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaHJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbVsnbGFiZWwnXSB8fCAnJ319XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cblxuICAgICAgICAgICAgPCEtLSBTZXBhcmF0b3IgLS0+XG4gICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0gPT0gJ3NlcGFyYXRvcidcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZGlzYWJsZWQgc2VwYXJhdG9yXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sc3Bhbl09XCIyICsgKHNob3dJY29uQ29sdW1uID8gMSA6IDApICsgKHNob3dTaG9ydGN1dENvbHVtbiA/IDEgOiAwKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aHIvPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L3Rib2R5PlxuPC90YWJsZT5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInRlbXBsYXRlXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRlbXBsYXRlVHlwZSA9PSAndGVtcGxhdGUnOyBlbHNlIHBvcnRhbE91dGxldFwiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZVwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICckaW1wbGljaXQnOiBkYXRhLFxuICAgICAgICAgICAgICAgICdkaWFsb2cnOiBkaWFsb2dSZWYsXG4gICAgICAgICAgICAgICAgJ2NvbnRleHQnOiBwYXJlbnRDb250ZXh0LFxuICAgICAgICAgICAgICAgICdpdGVtJzogcGFyZW50SXRlbSxcbiAgICAgICAgICAgICAgICAnZWxlbWVudCc6IHRoaXMudmlld0NvbnRhaW5lcj8uZWxlbWVudD8ubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgICAgICAnbWVudSc6IHRoaXNcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAvPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAjcG9ydGFsT3V0bGV0XG4gICAgICAgIFtjZGtQb3J0YWxPdXRsZXRdPVwiY29tcG9uZW50UG9ydGFsXCJcbiAgICAvPlxuPC9uZy1jb250YWluZXI+XG4iXX0=