@ruc-lib/overlay 2.0.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -14,7 +14,7 @@ npm install @uxpractice/ruc-lib
14
14
  ### Install Individual Component
15
15
  If you only need the Overlay component:
16
16
  ```bash
17
- npm install @uxpractice/overlay
17
+ npm install @ruc-lib/overlay
18
18
  ```
19
19
 
20
20
  ## Usage
@@ -23,7 +23,7 @@ npm install @uxpractice/overlay
23
23
  In your Angular module file (e.g., `app.module.ts`), import the `RuclibOverlayModule`:
24
24
 
25
25
  ```typescript
26
- import { RuclibOverlayModule } from '@uxpractice/overlay';
26
+ import { RuclibOverlayModule } from '@ruc-lib/overlay';
27
27
  import { AppComponent } from './app.component';
28
28
  import { NgModule } from '@angular/core';
29
29
  import { BrowserModule } from '@angular/platform-browser';
@@ -39,12 +39,20 @@ import { BrowserModule } from '@angular/platform-browser';
39
39
  })
40
40
  export class AppModule {}
41
41
  ```
42
+ ### 2. Update the style.scss file
43
+ @use 'sass:map';
44
+ @use '@angular/material' as mat;
45
+ @include mat.core();
42
46
 
43
- ### 2. Use the Component
47
+ ### 3. Include material icon cdn in your index.html
48
+ <link href="https://fonts.googleapis.com/css2?family=Material+Icons&display=swap" rel="stylesheet">
49
+
50
+ ### 4. Use the Component
44
51
  In your component's template, use the `<uxp-ruclib-overlay>` selector and pass the configuration object to the `rucInputData` input.
45
52
 
53
+
46
54
  ```html
47
- <uxp-ruclib-overlay [rucInputData]="OverlayConfig"></uxp-ruclib-overlay>
55
+ <uxp-ruclib-overlay [rucInputData]="OverlayConfig"></uxp-ruclib-overlay>
48
56
  ```
49
57
 
50
58
  ## API Reference
@@ -81,14 +89,45 @@ This is the main configuration object for the overlay
81
89
  Here's an example of how to configure the Overlay in your component's TypeScript file.
82
90
 
83
91
  ```typescript
84
- import { Component } from '@angular/core';
85
- import { OverlayConfig } from '@uxpractice/overlay';
92
+ import { Component, AfterViewInit, ViewChild, TemplateRef } from '@angular/core';
93
+ import { OverlayConfig, OverlayService } from '@ruc-lib/overlay';
94
+
95
+ export const chartConfig = {
96
+ doughnut: {
97
+ type: 'doughnut',
98
+ data: {
99
+ labels: [
100
+ 'Red',
101
+ 'Blue',
102
+ 'Yellow'
103
+ ],
104
+ datasets: [{
105
+ label: '',
106
+ data: [300, 50, 100],
107
+ backgroundColor: [
108
+ 'rgb(255, 99, 132)',
109
+ 'rgb(54, 162, 235)',
110
+ 'rgb(255, 205, 86)'
111
+ ],
112
+ hoverOffset: 4
113
+ }]
114
+ },
115
+ options: {
116
+ cutout: 70,
117
+ // rotation: -Math.PI / 2,
118
+ // circumference: Math.PI,
119
+ legend: {
120
+ display: false,
121
+ },
122
+ },
123
+ }
124
+ }
86
125
 
87
126
  @Component({
88
127
  selector: 'app-root',
89
128
  templateUrl: './app.component.html',
90
129
  })
91
- export class AppComponent {
130
+ export class AppComponent implements AfterViewInit {
92
131
  overlayConfig: OverlayConfig = {
93
132
  placement: 'left',
94
133
  overlayTitle: 'Animated Popover with fade',
@@ -97,13 +136,127 @@ export class AppComponent {
97
136
  animation: 'fade',
98
137
  closeIcon: 'close',
99
138
  showCloseButton : true,;
139
+ };
140
+
141
+ overlayBasicTableConfig:OverlayConfig = {
142
+ placement: 'top',
143
+ overlayTitle: 'User Data',
144
+ content: '', // Not used when tableData is present
145
+ showCloseButton: true,
146
+ tableData: [
147
+ { id: 1, firstName: 'John', lastName: 'Doe', role: 'Admin' },
148
+ { id: 2, firstName: 'Jane', lastName: 'Smith', role: 'User' },
149
+ { id: 3, firstName: 'Peter', lastName: 'Jones', role: 'Editor' },
150
+ { id: 1, firstName: 'John', lastName: 'Doe', role: 'Admin' },
151
+ { id: 2, firstName: 'Jane', lastName: 'Smith', role: 'User' },
152
+ { id: 3, firstName: 'Peter', lastName: 'Jones', role: 'Editor' },
153
+ { id: 1, firstName: 'John', lastName: 'Doe', role: 'Admin' },
154
+ { id: 2, firstName: 'Jane', lastName: 'Smith', role: 'User' },
155
+ { id: 3, firstName: 'Peter', lastName: 'Jones', role: 'Editor' },
156
+ ],
157
+ tableClass: 'basic-table'
158
+ };
159
+
160
+ //for custom template
161
+ templateConfig:OverlayConfig = {
162
+ placement: 'top',
163
+ overlayTitle: 'Custom Template Content',
164
+ showCloseButton: true,
165
+ content: '' // Placeholder, will be replaced in ngOnInit
166
+ };
167
+
168
+ //for chart config
169
+ doughnutPopoverConfig:OverlayConfig = {
170
+ placement: 'bottom',
171
+ overlayTitle: 'Doughnut Chart Popover',
172
+ content: '',
173
+ trigger: 'click',
174
+ animation: 'fade',
175
+ closeIcon: 'remove',
176
+ showCloseButton : true,
177
+ chartConfig:chartConfig.doughnut//you can provide chart.js configuration here.
178
+ };
179
+
180
+
181
+ @ViewChild('myCustomTemplate', {static:false}) myCustomTemplateRef! : TemplateRef<any>
182
+ @ViewChild('serviceCustomTemplate', {static:false}) serviceCustomTemplate! : TemplateRef<any>
183
+ public finalTemplateConfig:any;
184
+
185
+ serviceStringConfig:OverlayConfig = {
186
+ placement: 'left',
187
+ overlayTitle: 'Service Popover',
188
+ content: 'I was opened by the service with close icon.',
189
+ closeIcon: 'close', // Assuming you have Font Awesome installed
190
+ animation: 'fade'
191
+ };
192
+
193
+ constructor(
194
+ public overlayService:OverlayService
195
+ ) { }
196
+
197
+ ngAfterViewInit(): void {
198
+ //prepare the final config object here
199
+ //this runs after the @viewchild ready
200
+ this.finalTemplateConfig = {
201
+ ...this.mockTemplateConfig,
202
+ content : this.myCustomTemplateRef
203
+ }
204
+ }
205
+
206
+ // Service-Controlled Overlay
207
+ openServiceString(trigger :HTMLElement) {
208
+ this.overlayService.open(this.serviceStringConfig, trigger);
209
+ }
210
+
211
+ //Service-Controlled - template
212
+ openServiceTemplate(trigger: MatButton | HTMLElement) {
213
+ const triggerElement = trigger instanceof MatButton ? trigger._elementRef.nativeElement : trigger;
214
+ const configForTemplate = {
215
+ placement: 'left',
216
+ overlayTitle: 'Dynamic Template via Service',
217
+ showCloseButton: true,
218
+ closeIcon: 'close',
219
+ content: this.serviceCustomTemplate
220
+ };
221
+ this.overlayService.open(configForTemplate, triggerElement);
100
222
  }
223
+
224
+
101
225
  }
102
226
  ```
103
227
 
104
228
  ```html
105
229
  <uxp-ruclib-overlay [rucInputData]="overlayConfig"></uxp-ruclib-overlay>
106
230
 
231
+ <uxp-ruclib-overlay [rucInputData]="overlayBasicTableConfig"></uxp-ruclib-overlay>
232
+
233
+ <uxp-ruclib-overlay [buttonText]="'Doughnut Chart Overlay'" [rucInputData]="doughnutPopoverConfig" ></uxp-ruclib-overlay>
234
+
235
+ <!--custom template selector-->
236
+ <uxp-ruclib-overlay [buttonText]="'Custom Template'" [rucInputData]="finalTemplateConfig"></uxp-ruclib-overlay>
237
+ <!--custom template-->
238
+ <ng-template #myCustomTemplate>
239
+ <div>
240
+ In Angular, a custom template using templateRef is a reusable section of HTML that can be referenced and rendered within a component.
241
+ </div>
242
+ </ng-template>
243
+
244
+
245
+ <!--Service controlled overlay-->
246
+ <!--Below is the mandatory receiver for service controlled overlay-->
247
+ <uxp-ruclib-overlay></uxp-ruclib-overlay>
248
+ <!--------->
249
+ <a href="javascript:void(0);" #serviceStringConfig (click)="openServiceString(serviceStringConfig)"> Click Me </a>
250
+
251
+ <button
252
+ mat-raised-button
253
+ color="accent"
254
+ #serviceTemplateTrigger="matButton"
255
+ (click)="openServiceTemplate(serviceTemplateTrigger)">
256
+ Trigger Service (Template)
257
+ </button>
258
+ <!---->
259
+
107
260
  ## Contribution
108
261
 
109
262
  Contributions are welcome! Feel free to open issues or pull requests for any enhancements or fixes.
@@ -1,10 +1,12 @@
1
- import { Component, EventEmitter, HostBinding, Inject, Output, TemplateRef, } from '@angular/core';
1
+ import { Component, EventEmitter, HostBinding, Inject, Input, Output, TemplateRef, } from '@angular/core';
2
2
  import { animate, state, style, transition, trigger, } from '@angular/animations';
3
3
  import { OVERLAY_CONTROL } from '../model/overlay.types';
4
4
  import * as i0 from "@angular/core";
5
5
  import * as i1 from "@angular/common";
6
6
  import * as i2 from "@angular/material/icon";
7
- import * as i3 from "../ruc-overlay-chart/ruc-overlay-chart.component";
7
+ import * as i3 from "@angular/material/button";
8
+ import * as i4 from "@angular/material/card";
9
+ import * as i5 from "../ruc-overlay-chart/ruc-overlay-chart.component";
8
10
  export class OverlayContentComponent {
9
11
  ngOnInit() {
10
12
  if (this.control.config.tableData) {
@@ -20,6 +22,7 @@ export class OverlayContentComponent {
20
22
  this.control = control;
21
23
  this.actualPlacement = 'bottom';
22
24
  this.tableHeaders = [];
25
+ this.arrowOffset = 0;
23
26
  this.mouseEnterPopover = new EventEmitter();
24
27
  this.mouseLeavePopover = new EventEmitter();
25
28
  this.actualPlacement = this.control.config.placement || 'bottom';
@@ -40,7 +43,7 @@ export class OverlayContentComponent {
40
43
  }
41
44
  }
42
45
  OverlayContentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OverlayContentComponent, deps: [{ token: OVERLAY_CONTROL }], target: i0.ɵɵFactoryTarget.Component });
43
- OverlayContentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OverlayContentComponent, selector: "uxp-overlay-content", outputs: { mouseEnterPopover: "mouseEnterPopover", mouseLeavePopover: "mouseLeavePopover" }, host: { properties: { "@popoverAnimation": "this.animationState" } }, ngImport: i0, template: "<div class=\"popover-container\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"popover-arrow\" [attr.data-placement]=\"actualPlacement\"></div>\r\n <!-- Header with optional title and close button -->\r\n <div\r\n *ngIf=\"\r\n control.config.overlayTitle ||\r\n control.config.showCloseButton ||\r\n control.config.closeIcon\r\n \"\r\n class=\"popover-header\"\r\n >\r\n <h3 *ngIf=\"control.config.overlayTitle\">\r\n {{ control.config.overlayTitle }}\r\n </h3>\r\n\r\n\r\n <ng-container *ngIf=\"control.config.showCloseButton\">\r\n <button\r\n type=\"button\"\r\n class=\"close-btn\"\r\n aria-label=\"Close\"\r\n (click)=\"control.close()\"\r\n >\r\n <mat-icon>{{ control.config.closeIcon }}</mat-icon>\r\n </button>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Body with dynamic content -->\r\n <div class=\"popover-body\">\r\n <!-- Case 1: Content is a simple string -->\r\n <ng-container\r\n *ngIf=\"\r\n !isTemplateRef(control.config.content) && !control.config.tableData\r\n \"\r\n >\r\n {{ control.config.content }}\r\n </ng-container>\r\n\r\n <!-- Case 2: Content is a TemplateRef -->\r\n <ng-container *ngIf=\"isTemplateRef(control.config.content)\">\r\n <ng-container *ngTemplateOutlet=\"control.config.content\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"control.config.chartConfig\">\r\n\r\n <uxp-ruc-overlay-chart [chartConfig]=\"control.config.chartConfig\"></uxp-ruc-overlay-chart>\r\n </ng-container>\r\n\r\n <!-- Case 3: Content is table data -->\r\n <ng-container *ngIf=\"control.config.tableData?.length\">\r\n <table\r\n class=\"popover-table\"\r\n [class]=\"control.config.tableClass || 'basic-table'\"\r\n >\r\n <thead>\r\n <tr>\r\n <th\r\n *ngFor=\"let header of this.tableHeaders!\"\r\n >\r\n {{ header }}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of control.config.tableData\">\r\n <td\r\n *ngFor=\"let header of this.tableHeaders!\"\r\n >\r\n {{ row[header] }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </ng-container>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block}.popover-container{z-index:1080;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 5px 10px #0003;position:relative;color:#333;max-width:300px}.popover-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid;border-width:10px}.popover-arrow[data-placement^=top]{bottom:-10px;left:50%;transform:translate(-50%);border-bottom-width:0;border-top-color:#fff;filter:drop-shadow(0 -1px 1px rgba(0,0,0,.1))}.popover-arrow[data-placement^=bottom]{top:-10px;left:50%;transform:translate(-50%);border-top-width:0;border-bottom-color:#fff;filter:drop-shadow(0 1px 1px rgba(0,0,0,.1))}.popover-arrow[data-placement^=left]{right:-10px;top:50%;transform:translateY(-50%);border-right-width:0;border-left-color:#fff;filter:drop-shadow(-1px 0 1px rgba(0,0,0,.1))}.popover-arrow[data-placement^=right]{left:-10px;top:50%;transform:translateY(-50%);border-left-width:0;border-right-color:#fff;filter:drop-shadow(1px 0 1px rgba(0,0,0,.1))}.popover-header{display:flex;justify-content:space-between;align-items:center;padding:.5rem 1rem;margin:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid #dcdcdc;border-radius:5px 5px 0 0}.popover-header h3{margin:0;font-size:1rem}.popover-body{padding:9px 14px;color:#212529}.close-btn,.close-icon{border:none;background:transparent;font-size:1.5rem;line-height:1;cursor:pointer;padding:0;margin-left:10px;opacity:.5}.close-btn:hover,.close-icon:hover{opacity:1}.popover-table{width:100%;border-collapse:collapse;margin-top:5px}.popover-table th,.popover-table td{border:1px solid #ddd;padding:8px;text-align:left}.popover-table th{background-color:#f2f2f2;text-transform:capitalize}.popover-table.striped-table tbody tr:nth-of-type(odd){background-color:#f9f9f9}.striped-table{width:100%;border-collapse:collapse;font-size:.9em}.striped-table th,.striped-table td{border:1px solid #ddd;padding:8px;text-align:left}.striped-table thead th{background-color:#f2f2f2;font-weight:700}.striped-table tbody tr:nth-child(even){background-color:#e9ecef}.striped-table tbody tr:hover{background-color:#f1f1f1}.basic-table{width:100%;border-collapse:collapse;font-size:.9em}.basic-table th,.basic-table td{border:1px solid #ddd;padding:8px;text-align:left}.basic-table thead th{background-color:#fff;font-weight:700}.basic-table tbody tr:nth-child(even){background-color:#fff}.basic-table tbody tr:hover{background-color:#f1f1f1}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.RucOverlayChartComponent, selector: "uxp-ruc-overlay-chart", inputs: ["index", "chartConfig"] }], animations: [
46
+ OverlayContentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OverlayContentComponent, selector: "uxp-overlay-content", inputs: { customTheme: "customTheme" }, outputs: { mouseEnterPopover: "mouseEnterPopover", mouseLeavePopover: "mouseLeavePopover" }, host: { properties: { "@popoverAnimation": "this.animationState" } }, ngImport: i0, template: "<mat-card class=\"popover-container\" class={{customTheme}} (click)=\"$event.stopPropagation()\">\r\n\r\n <div class=\"popover-arrow\"\r\n[attr.data-placement]=\"actualPlacement\"\r\n [style.left.px]=\"(actualPlacement.startsWith('top') || actualPlacement.startsWith('bottom')) ? arrowOffset : null\"\r\n[style.top.px]=\"(actualPlacement.startsWith('left') || actualPlacement.startsWith('right')) ? arrowOffset : null\">\r\n </div>\r\n <!-- Header with optional title and close button -->\r\n\r\n <mat-card-header *ngIf=\"\r\n control.config.overlayTitle ||\r\n control.config.showCloseButton ||\r\n control.config.closeIcon\r\n \"\r\n class=\"popover-header\"\r\n >\r\n <mat-card-title class=\"popover-title\" *ngIf=\"control.config.overlayTitle\">{{ control.config.overlayTitle }}</mat-card-title>\r\n <ng-container *ngIf=\"control.config.showCloseButton\">\r\n <button mat-icon-button class=\"close-btn\" (click)=\"control.close()\" color=\"primary\" aria-label=\"Close popover icon\">\r\n <mat-icon>{{ control.config.closeIcon }}</mat-icon>\r\n </button>\r\n </ng-container>\r\n </mat-card-header>\r\n\r\n\r\n <!-- Body with dynamic content -->\r\n <mat-card-content class=\"popover-body\">\r\n <!-- Case 1: Content is a simple string -->\r\n <ng-container\r\n *ngIf=\"\r\n !isTemplateRef(control.config.content) && !control.config.tableData\r\n \"\r\n >\r\n {{ control.config.content }}\r\n </ng-container>\r\n\r\n <!-- Case 2: Content is a TemplateRef -->\r\n <ng-container *ngIf=\"isTemplateRef(control.config.content)\">\r\n <ng-container *ngTemplateOutlet=\"control.config.content\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"control.config.chartConfig\">\r\n\r\n <uxp-ruc-overlay-chart [chartConfig]=\"control.config.chartConfig\"></uxp-ruc-overlay-chart>\r\n </ng-container>\r\n\r\n <!-- Case 3: Content is table data -->\r\n <ng-container *ngIf=\"control.config.tableData?.length\">\r\n <table\r\n class=\"popover-table\"\r\n [class]=\"control.config.tableClass || 'basic-table'\"\r\n >\r\n <thead>\r\n <tr>\r\n <th\r\n *ngFor=\"let header of this.tableHeaders!\"\r\n >\r\n {{ header }}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of control.config.tableData\">\r\n <td\r\n *ngFor=\"let header of this.tableHeaders!\"\r\n >\r\n {{ row[header] }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </ng-container>\r\n </mat-card-content>\r\n</mat-card>\r\n", styles: [":host{display:block}.popover-container{z-index:1080;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 5px 10px #0003;position:relative;max-width:300px}.popover-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid;border-width:10px}.close-btn .mat-mdc-icon-button.mat-mdc-button-base{width:30px;height:30px;padding:2px}.popover-title{font-size:16px;font-weight:600}.mat-card-header.mat-mdc-card-header.popover-header .mat-mdc-card-header-text .mat-card-title.mat-mdc-card-title{font-size:16px}button.close-btn.mdc-icon-button.mat-mdc-icon-button.mat-mdc-button-base{width:30px;height:30px;padding:2px}.popover-arrow[data-placement^=bottom]{top:-10px;transform:translate(-50%);border-width:0 10px 10px 10px;border-bottom-color:#fff;filter:drop-shadow(0 -1px 1px rgba(0,0,0,.15))}.popover-arrow[data-placement^=top]{bottom:-10px;transform:translate(-50%);border-width:10px 10px 0 10px;border-top-color:#fff;filter:drop-shadow(0 1px 1px rgba(0,0,0,.15))}.popover-arrow[data-placement^=right]{left:-10px;transform:translateY(-50%);border-width:10px 10px 10px 0;border-right-color:#fff;filter:drop-shadow(-1px 0 1px rgba(0,0,0,.15))}.popover-arrow[data-placement^=left]{right:-10px;transform:translateY(-50%);border-width:10px 0 10px 10px;border-left-color:#fff;filter:drop-shadow(1px 0 1px rgba(0,0,0,.15))}.popover-header{display:flex;justify-content:space-between;align-items:center;padding:.5rem 1rem;margin:0;font-size:1rem;border-bottom:1px solid #dcdcdc;border-radius:5px 5px 0 0}.popover-header h3{margin:0;font-size:1rem}.popover-body{padding:9px 14px}.popover-table{width:100%;border-collapse:collapse;margin-top:5px}.popover-table th,.popover-table td{border:1px solid #ddd;padding:8px;text-align:left}.popover-table th{text-transform:capitalize}.striped-table{width:100%;border-collapse:collapse;font-size:.9em}.striped-table th,.striped-table td{border:1px solid #ddd;padding:8px;text-align:left}.striped-table thead th{font-weight:700}.striped-table tbody tr:nth-child(even){background-color:#00000061}.basic-table{width:100%;border-collapse:collapse;font-size:.9em}.basic-table th,.basic-table td{border:1px solid #ddd;padding:8px;text-align:left}.basic-table thead th{font-weight:700}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i4.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i4.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i4.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "component", type: i5.RucOverlayChartComponent, selector: "uxp-ruc-overlay-chart", inputs: ["index", "chartConfig"] }], animations: [
44
47
  trigger('popoverAnimation', [
45
48
  state('void', style({ transform: 'scale(0.9)', opacity: 0 })),
46
49
  state('enter-scale', style({ transform: 'scale(1)', opacity: 1 })),
@@ -71,11 +74,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
71
74
  animate('500ms', style({ opacity: 0, transform: 'translateY(10px)' })),
72
75
  ]),
73
76
  ]),
74
- ], template: "<div class=\"popover-container\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"popover-arrow\" [attr.data-placement]=\"actualPlacement\"></div>\r\n <!-- Header with optional title and close button -->\r\n <div\r\n *ngIf=\"\r\n control.config.overlayTitle ||\r\n control.config.showCloseButton ||\r\n control.config.closeIcon\r\n \"\r\n class=\"popover-header\"\r\n >\r\n <h3 *ngIf=\"control.config.overlayTitle\">\r\n {{ control.config.overlayTitle }}\r\n </h3>\r\n\r\n\r\n <ng-container *ngIf=\"control.config.showCloseButton\">\r\n <button\r\n type=\"button\"\r\n class=\"close-btn\"\r\n aria-label=\"Close\"\r\n (click)=\"control.close()\"\r\n >\r\n <mat-icon>{{ control.config.closeIcon }}</mat-icon>\r\n </button>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Body with dynamic content -->\r\n <div class=\"popover-body\">\r\n <!-- Case 1: Content is a simple string -->\r\n <ng-container\r\n *ngIf=\"\r\n !isTemplateRef(control.config.content) && !control.config.tableData\r\n \"\r\n >\r\n {{ control.config.content }}\r\n </ng-container>\r\n\r\n <!-- Case 2: Content is a TemplateRef -->\r\n <ng-container *ngIf=\"isTemplateRef(control.config.content)\">\r\n <ng-container *ngTemplateOutlet=\"control.config.content\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"control.config.chartConfig\">\r\n\r\n <uxp-ruc-overlay-chart [chartConfig]=\"control.config.chartConfig\"></uxp-ruc-overlay-chart>\r\n </ng-container>\r\n\r\n <!-- Case 3: Content is table data -->\r\n <ng-container *ngIf=\"control.config.tableData?.length\">\r\n <table\r\n class=\"popover-table\"\r\n [class]=\"control.config.tableClass || 'basic-table'\"\r\n >\r\n <thead>\r\n <tr>\r\n <th\r\n *ngFor=\"let header of this.tableHeaders!\"\r\n >\r\n {{ header }}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of control.config.tableData\">\r\n <td\r\n *ngFor=\"let header of this.tableHeaders!\"\r\n >\r\n {{ row[header] }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </ng-container>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block}.popover-container{z-index:1080;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 5px 10px #0003;position:relative;color:#333;max-width:300px}.popover-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid;border-width:10px}.popover-arrow[data-placement^=top]{bottom:-10px;left:50%;transform:translate(-50%);border-bottom-width:0;border-top-color:#fff;filter:drop-shadow(0 -1px 1px rgba(0,0,0,.1))}.popover-arrow[data-placement^=bottom]{top:-10px;left:50%;transform:translate(-50%);border-top-width:0;border-bottom-color:#fff;filter:drop-shadow(0 1px 1px rgba(0,0,0,.1))}.popover-arrow[data-placement^=left]{right:-10px;top:50%;transform:translateY(-50%);border-right-width:0;border-left-color:#fff;filter:drop-shadow(-1px 0 1px rgba(0,0,0,.1))}.popover-arrow[data-placement^=right]{left:-10px;top:50%;transform:translateY(-50%);border-left-width:0;border-right-color:#fff;filter:drop-shadow(1px 0 1px rgba(0,0,0,.1))}.popover-header{display:flex;justify-content:space-between;align-items:center;padding:.5rem 1rem;margin:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid #dcdcdc;border-radius:5px 5px 0 0}.popover-header h3{margin:0;font-size:1rem}.popover-body{padding:9px 14px;color:#212529}.close-btn,.close-icon{border:none;background:transparent;font-size:1.5rem;line-height:1;cursor:pointer;padding:0;margin-left:10px;opacity:.5}.close-btn:hover,.close-icon:hover{opacity:1}.popover-table{width:100%;border-collapse:collapse;margin-top:5px}.popover-table th,.popover-table td{border:1px solid #ddd;padding:8px;text-align:left}.popover-table th{background-color:#f2f2f2;text-transform:capitalize}.popover-table.striped-table tbody tr:nth-of-type(odd){background-color:#f9f9f9}.striped-table{width:100%;border-collapse:collapse;font-size:.9em}.striped-table th,.striped-table td{border:1px solid #ddd;padding:8px;text-align:left}.striped-table thead th{background-color:#f2f2f2;font-weight:700}.striped-table tbody tr:nth-child(even){background-color:#e9ecef}.striped-table tbody tr:hover{background-color:#f1f1f1}.basic-table{width:100%;border-collapse:collapse;font-size:.9em}.basic-table th,.basic-table td{border:1px solid #ddd;padding:8px;text-align:left}.basic-table thead th{background-color:#fff;font-weight:700}.basic-table tbody tr:nth-child(even){background-color:#fff}.basic-table tbody tr:hover{background-color:#f1f1f1}\n"] }]
77
+ ], template: "<mat-card class=\"popover-container\" class={{customTheme}} (click)=\"$event.stopPropagation()\">\r\n\r\n <div class=\"popover-arrow\"\r\n[attr.data-placement]=\"actualPlacement\"\r\n [style.left.px]=\"(actualPlacement.startsWith('top') || actualPlacement.startsWith('bottom')) ? arrowOffset : null\"\r\n[style.top.px]=\"(actualPlacement.startsWith('left') || actualPlacement.startsWith('right')) ? arrowOffset : null\">\r\n </div>\r\n <!-- Header with optional title and close button -->\r\n\r\n <mat-card-header *ngIf=\"\r\n control.config.overlayTitle ||\r\n control.config.showCloseButton ||\r\n control.config.closeIcon\r\n \"\r\n class=\"popover-header\"\r\n >\r\n <mat-card-title class=\"popover-title\" *ngIf=\"control.config.overlayTitle\">{{ control.config.overlayTitle }}</mat-card-title>\r\n <ng-container *ngIf=\"control.config.showCloseButton\">\r\n <button mat-icon-button class=\"close-btn\" (click)=\"control.close()\" color=\"primary\" aria-label=\"Close popover icon\">\r\n <mat-icon>{{ control.config.closeIcon }}</mat-icon>\r\n </button>\r\n </ng-container>\r\n </mat-card-header>\r\n\r\n\r\n <!-- Body with dynamic content -->\r\n <mat-card-content class=\"popover-body\">\r\n <!-- Case 1: Content is a simple string -->\r\n <ng-container\r\n *ngIf=\"\r\n !isTemplateRef(control.config.content) && !control.config.tableData\r\n \"\r\n >\r\n {{ control.config.content }}\r\n </ng-container>\r\n\r\n <!-- Case 2: Content is a TemplateRef -->\r\n <ng-container *ngIf=\"isTemplateRef(control.config.content)\">\r\n <ng-container *ngTemplateOutlet=\"control.config.content\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"control.config.chartConfig\">\r\n\r\n <uxp-ruc-overlay-chart [chartConfig]=\"control.config.chartConfig\"></uxp-ruc-overlay-chart>\r\n </ng-container>\r\n\r\n <!-- Case 3: Content is table data -->\r\n <ng-container *ngIf=\"control.config.tableData?.length\">\r\n <table\r\n class=\"popover-table\"\r\n [class]=\"control.config.tableClass || 'basic-table'\"\r\n >\r\n <thead>\r\n <tr>\r\n <th\r\n *ngFor=\"let header of this.tableHeaders!\"\r\n >\r\n {{ header }}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of control.config.tableData\">\r\n <td\r\n *ngFor=\"let header of this.tableHeaders!\"\r\n >\r\n {{ row[header] }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </ng-container>\r\n </mat-card-content>\r\n</mat-card>\r\n", styles: [":host{display:block}.popover-container{z-index:1080;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 5px 10px #0003;position:relative;max-width:300px}.popover-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid;border-width:10px}.close-btn .mat-mdc-icon-button.mat-mdc-button-base{width:30px;height:30px;padding:2px}.popover-title{font-size:16px;font-weight:600}.mat-card-header.mat-mdc-card-header.popover-header .mat-mdc-card-header-text .mat-card-title.mat-mdc-card-title{font-size:16px}button.close-btn.mdc-icon-button.mat-mdc-icon-button.mat-mdc-button-base{width:30px;height:30px;padding:2px}.popover-arrow[data-placement^=bottom]{top:-10px;transform:translate(-50%);border-width:0 10px 10px 10px;border-bottom-color:#fff;filter:drop-shadow(0 -1px 1px rgba(0,0,0,.15))}.popover-arrow[data-placement^=top]{bottom:-10px;transform:translate(-50%);border-width:10px 10px 0 10px;border-top-color:#fff;filter:drop-shadow(0 1px 1px rgba(0,0,0,.15))}.popover-arrow[data-placement^=right]{left:-10px;transform:translateY(-50%);border-width:10px 10px 10px 0;border-right-color:#fff;filter:drop-shadow(-1px 0 1px rgba(0,0,0,.15))}.popover-arrow[data-placement^=left]{right:-10px;transform:translateY(-50%);border-width:10px 0 10px 10px;border-left-color:#fff;filter:drop-shadow(1px 0 1px rgba(0,0,0,.15))}.popover-header{display:flex;justify-content:space-between;align-items:center;padding:.5rem 1rem;margin:0;font-size:1rem;border-bottom:1px solid #dcdcdc;border-radius:5px 5px 0 0}.popover-header h3{margin:0;font-size:1rem}.popover-body{padding:9px 14px}.popover-table{width:100%;border-collapse:collapse;margin-top:5px}.popover-table th,.popover-table td{border:1px solid #ddd;padding:8px;text-align:left}.popover-table th{text-transform:capitalize}.striped-table{width:100%;border-collapse:collapse;font-size:.9em}.striped-table th,.striped-table td{border:1px solid #ddd;padding:8px;text-align:left}.striped-table thead th{font-weight:700}.striped-table tbody tr:nth-child(even){background-color:#00000061}.basic-table{width:100%;border-collapse:collapse;font-size:.9em}.basic-table th,.basic-table td{border:1px solid #ddd;padding:8px;text-align:left}.basic-table thead th{font-weight:700}\n"] }]
75
78
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
76
79
  type: Inject,
77
80
  args: [OVERLAY_CONTROL]
78
- }] }]; }, propDecorators: { mouseEnterPopover: [{
81
+ }] }]; }, propDecorators: { customTheme: [{
82
+ type: Input
83
+ }], mouseEnterPopover: [{
79
84
  type: Output
80
85
  }], mouseLeavePopover: [{
81
86
  type: Output
@@ -83,4 +88,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
83
88
  type: HostBinding,
84
89
  args: ['@popoverAnimation']
85
90
  }] } });
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS1jb250ZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvb3ZlcmxheS1jb250ZW50L292ZXJsYXktY29udGVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL292ZXJsYXktY29udGVudC9vdmVybGF5LWNvbnRlbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osV0FBVyxFQUNYLE1BQU0sRUFFTixNQUFNLEVBQ04sV0FBVyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxPQUFPLEVBQ1AsS0FBSyxFQUNMLEtBQUssRUFDTCxVQUFVLEVBQ1YsT0FBTyxHQUNSLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7OztBQTJCekQsTUFBTSxPQUFPLHVCQUF1QjtJQVFsQyxRQUFRO1FBQ04sSUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7WUFDOUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQzFCO0lBQ0gsQ0FBQztJQUVELElBQ0ksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsS0FBSyxPQUFPO1lBQzlDLENBQUMsQ0FBQyxhQUFhO1lBQ2YsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUNuQixDQUFDO0lBRUQsWUFBNEMsT0FBdUI7UUFBdkIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFwQjVELG9CQUFlLEdBQThCLFFBQVEsQ0FBQztRQUN0RCxpQkFBWSxHQUFPLEVBQUUsQ0FBQztRQUVuQixzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQzdDLHNCQUFpQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFpQnJE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QVcsRUFBRTtnQ0FDdEIsT0FBTyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7NkJBQ3ZFLENBQUM7eUJBQ0gsQ0FBQztxQkFDSDs7MEJBd0JZLE1BQU07MkJBQUMsZUFBZTs0Q0FqQnpCLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBVUgsY0FBYztzQkFEakIsV0FBVzt1QkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPdmVybGF5Q29udHJvbCB9IGZyb20gJy4vLi4vbW9kZWwvb3ZlcmxheS50eXBlcyc7XHJcblxyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgSW5qZWN0LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgYW5pbWF0ZSxcclxuICBzdGF0ZSxcclxuICBzdHlsZSxcclxuICB0cmFuc2l0aW9uLFxyXG4gIHRyaWdnZXIsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IE9WRVJMQVlfQ09OVFJPTCB9IGZyb20gJy4uL21vZGVsL292ZXJsYXkudHlwZXMnO1xyXG5pbXBvcnQgeyBQb3BvdmVyUGxhY2VtZW50IH0gZnJvbSAnLi4vcnVjbGliLW92ZXJsYXkvcnVjbGliLW92ZXJsYXkuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndXhwLW92ZXJsYXktY29udGVudCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL292ZXJsYXktY29udGVudC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vb3ZlcmxheS1jb250ZW50LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcigncG9wb3ZlckFuaW1hdGlvbicsIFtcclxuICAgICAgc3RhdGUoJ3ZvaWQnLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3NjYWxlKDAuOSknLCBvcGFjaXR5OiAwIH0pKSxcclxuICAgICAgc3RhdGUoJ2VudGVyLXNjYWxlJywgc3R5bGUoeyB0cmFuc2Zvcm06ICdzY2FsZSgxKScsIG9wYWNpdHk6IDEgfSkpLFxyXG4gICAgICBzdGF0ZSgnZW50ZXItZmFkZScsIHN0eWxlKHsgb3BhY2l0eTogMSB9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oXHJcbiAgICAgICAgJ3ZvaWQgPT4gZW50ZXItc2NhbGUnLFxyXG4gICAgICAgIGFuaW1hdGUoJzE1MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpJylcclxuICAgICAgKSxcclxuICAgICAgdHJhbnNpdGlvbigndm9pZCA9PiBlbnRlci1mYWRlJywgW1xyXG4gICAgICAgIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgxMHB4KScgfSksXHJcbiAgICAgICAgYW5pbWF0ZSgnNTAwbXMnLCBzdHlsZSh7IG9wYWNpdHk6IDEsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMCknIH0pKSxcclxuICAgICAgXSksXHJcbiAgICAgIHRyYW5zaXRpb24oJyogPT4gdm9pZCcsIFtcclxuICAgICAgICBhbmltYXRlKCc1MDBtcycsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgxMHB4KScgfSkpLFxyXG4gICAgICBdKSxcclxuICAgIF0pLFxyXG4gIF0sXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgT3ZlcmxheUNvbnRlbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHB1YmxpYyBhY3R1YWxQbGFjZW1lbnQ6IHN0cmluZyB8IFBvcG92ZXJQbGFjZW1lbnQgPSAnYm90dG9tJztcclxuICBwdWJsaWMgdGFibGVIZWFkZXJzOmFueVtdPVtdO1xyXG5cclxuICBAT3V0cHV0KCkgbW91c2VFbnRlclBvcG92ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIG1vdXNlTGVhdmVQb3BvdmVyID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZih0aGlzLmNvbnRyb2wuY29uZmlnLnRhYmxlRGF0YSkge1xyXG4gICAgICAgIHRoaXMuZ2V0VGFibGVIZWFkZXJzKCk7XHJcbiAgICB9ICAgIFxyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdAcG9wb3ZlckFuaW1hdGlvbicpXHJcbiAgZ2V0IGFuaW1hdGlvblN0YXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY29udHJvbC5jb25maWcuYW5pbWF0aW9uID09PSAnc2NhbGUnXHJcbiAgICAgID8gJ2VudGVyLXNjYWxlJ1xyXG4gICAgICA6ICdlbnRlci1mYWRlJztcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoT1ZFUkxBWV9DT05UUk9MKSBwdWJsaWMgY29udHJvbDogT3ZlcmxheUNvbnRyb2wpIHtcclxuICAgIHRoaXMuYWN0dWFsUGxhY2VtZW50ID0gdGhpcy5jb250cm9sLmNvbmZpZy5wbGFjZW1lbnQgfHwgJ2JvdHRvbSc7XHJcbiAgfVxyXG5cclxuICAvLyBIZWxwZXIgdG8gY2hlY2sgaWYgY29udGVudCBpcyBhIFRlbXBsYXRlUmVmXHJcbiAgaXNUZW1wbGF0ZVJlZihjb250ZW50OiBhbnkpOiBjb250ZW50IGlzIFRlbXBsYXRlUmVmPGFueT4ge1xyXG4gICAgcmV0dXJuIGNvbnRlbnQgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZjtcclxuICB9XHJcblxyXG4gIC8vIEhlbHBlciB0byBnZXQga2V5cyBmb3IgdGhlIHRhYmxlIGhlYWRlciwgcm9idXN0bHlcclxuICBnZXRUYWJsZUhlYWRlcnMoKTogdm9pZCB7XHJcbiAgICBjb25zdCB0ZW1wRGF0YSA9IHRoaXMuY29udHJvbC5jb25maWcudGFibGVEYXRhO1xyXG5cclxuICAgIGlmICghdGVtcERhdGEgfHwgdGVtcERhdGEubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMudGFibGVIZWFkZXJzID0gW107XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIEFzc3VtZXMgYWxsIG9iamVjdHMgaW4gdGhlIGFycmF5IGhhdmUgdGhlIHNhbWUgc2hhcGVcclxuICAgIHRoaXMudGFibGVIZWFkZXJzID0gT2JqZWN0LmtleXModGVtcERhdGFbMF0pO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwicG9wb3Zlci1jb250YWluZXJcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgPGRpdiBjbGFzcz1cInBvcG92ZXItYXJyb3dcIiBbYXR0ci5kYXRhLXBsYWNlbWVudF09XCJhY3R1YWxQbGFjZW1lbnRcIj48L2Rpdj5cclxuICA8IS0tIEhlYWRlciB3aXRoIG9wdGlvbmFsIHRpdGxlIGFuZCBjbG9zZSBidXR0b24gLS0+XHJcbiAgPGRpdlxyXG4gICAgKm5nSWY9XCJcclxuICAgICAgY29udHJvbC5jb25maWcub3ZlcmxheVRpdGxlIHx8XHJcbiAgICAgIGNvbnRyb2wuY29uZmlnLnNob3dDbG9zZUJ1dHRvbiB8fFxyXG4gICAgICBjb250cm9sLmNvbmZpZy5jbG9zZUljb25cclxuICAgIFwiXHJcbiAgICBjbGFzcz1cInBvcG92ZXItaGVhZGVyXCJcclxuICA+XHJcbiAgICA8aDMgKm5nSWY9XCJjb250cm9sLmNvbmZpZy5vdmVybGF5VGl0bGVcIj5cclxuICAgICAge3sgY29udHJvbC5jb25maWcub3ZlcmxheVRpdGxlIH19XHJcbiAgICA8L2gzPlxyXG5cclxuXHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udHJvbC5jb25maWcuc2hvd0Nsb3NlQnV0dG9uXCI+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICBjbGFzcz1cImNsb3NlLWJ0blwiXHJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlXCJcclxuICAgICAgICAoY2xpY2spPVwiY29udHJvbC5jbG9zZSgpXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxtYXQtaWNvbj57eyBjb250cm9sLmNvbmZpZy5jbG9zZUljb24gfX08L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIEJvZHkgd2l0aCBkeW5hbWljIGNvbnRlbnQgLS0+XHJcbiAgPGRpdiBjbGFzcz1cInBvcG92ZXItYm9keVwiPlxyXG4gICAgPCEtLSBDYXNlIDE6IENvbnRlbnQgaXMgYSBzaW1wbGUgc3RyaW5nIC0tPlxyXG4gICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAqbmdJZj1cIlxyXG4gICAgICAgICFpc1RlbXBsYXRlUmVmKGNvbnRyb2wuY29uZmlnLmNvbnRlbnQpICYmICFjb250cm9sLmNvbmZpZy50YWJsZURhdGFcclxuICAgICAgXCJcclxuICAgID5cclxuICAgICAge3sgY29udHJvbC5jb25maWcuY29udGVudCB9fVxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPCEtLSBDYXNlIDI6IENvbnRlbnQgaXMgYSBUZW1wbGF0ZVJlZiAtLT5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1RlbXBsYXRlUmVmKGNvbnRyb2wuY29uZmlnLmNvbnRlbnQpXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250cm9sLmNvbmZpZy5jb250ZW50XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udHJvbC5jb25maWcuY2hhcnRDb25maWdcIj5cclxuXHJcbiAgICAgIDx1eHAtcnVjLW92ZXJsYXktY2hhcnQgIFtjaGFydENvbmZpZ109XCJjb250cm9sLmNvbmZpZy5jaGFydENvbmZpZ1wiPjwvdXhwLXJ1Yy1vdmVybGF5LWNoYXJ0PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPCEtLSBDYXNlIDM6IENvbnRlbnQgaXMgdGFibGUgZGF0YSAtLT5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250cm9sLmNvbmZpZy50YWJsZURhdGE/Lmxlbmd0aFwiPlxyXG4gICAgICA8dGFibGVcclxuICAgICAgICBjbGFzcz1cInBvcG92ZXItdGFibGVcIlxyXG4gICAgICAgIFtjbGFzc109XCJjb250cm9sLmNvbmZpZy50YWJsZUNsYXNzIHx8ICdiYXNpYy10YWJsZSdcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICA8dGhcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaGVhZGVyIG9mIHRoaXMudGFibGVIZWFkZXJzIVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICB7eyBoZWFkZXIgfX1cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90aGVhZD5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBjb250cm9sLmNvbmZpZy50YWJsZURhdGFcIj5cclxuICAgICAgICAgICAgPHRkXHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGhlYWRlciBvZiB0aGlzLnRhYmxlSGVhZGVycyFcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgcm93W2hlYWRlcl0gfX1cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90Ym9keT5cclxuICAgICAgPC90YWJsZT5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS1jb250ZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvb3ZlcmxheS1jb250ZW50L292ZXJsYXktY29udGVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL292ZXJsYXktY29udGVudC9vdmVybGF5LWNvbnRlbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsT0FBTyxFQUNQLEtBQUssRUFDTCxLQUFLLEVBQ0wsVUFBVSxFQUNWLE9BQU8sR0FDUixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7OztBQTJCekQsTUFBTSxPQUFPLHVCQUF1QjtJQVVsQyxRQUFRO1FBQ04sSUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7WUFDOUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQzFCO0lBQ0gsQ0FBQztJQUVELElBQ0ksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsS0FBSyxPQUFPO1lBQzlDLENBQUMsQ0FBQyxhQUFhO1lBQ2YsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUNuQixDQUFDO0lBRUQsWUFBNEMsT0FBdUI7UUFBdkIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUF0QjVELG9CQUFlLEdBQThCLFFBQVEsQ0FBQztRQUN0RCxpQkFBWSxHQUFPLEVBQUUsQ0FBQztRQUVyQixnQkFBVyxHQUFFLENBQUMsQ0FBQztRQUViLHNCQUFpQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDN0Ms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QUMsQ0FBQzs2QkFDcEUsQ0FBQzs0QkFDRixVQUFVLENBQUMsV0FBVyxFQUFFO2dDQUN0QixPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQzs2QkFDdkUsQ0FBQzt5QkFDSCxDQUFDO3FCQUNIOzswQkEwQlksTUFBTTsyQkFBQyxlQUFlOzRDQXBCekIsV0FBVztzQkFBbkIsS0FBSztnQkFHRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQVVILGNBQWM7c0JBRGpCLFdBQVc7dUJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheUNvbnRyb2wgfSBmcm9tICcuLy4uL21vZGVsL292ZXJsYXkudHlwZXMnO1xyXG5cclxuaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFRlbXBsYXRlUmVmLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIGFuaW1hdGUsXHJcbiAgc3RhdGUsXHJcbiAgc3R5bGUsXHJcbiAgdHJhbnNpdGlvbixcclxuICB0cmlnZ2VyLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5pbXBvcnQgeyBPVkVSTEFZX0NPTlRST0wgfSBmcm9tICcuLi9tb2RlbC9vdmVybGF5LnR5cGVzJztcclxuaW1wb3J0IHsgUG9wb3ZlclBsYWNlbWVudCB9IGZyb20gJy4uL3J1Y2xpYi1vdmVybGF5L3J1Y2xpYi1vdmVybGF5LmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3V4cC1vdmVybGF5LWNvbnRlbnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9vdmVybGF5LWNvbnRlbnQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL292ZXJsYXktY29udGVudC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGFuaW1hdGlvbnM6IFtcclxuICAgIHRyaWdnZXIoJ3BvcG92ZXJBbmltYXRpb24nLCBbXHJcbiAgICAgIHN0YXRlKCd2b2lkJywgc3R5bGUoeyB0cmFuc2Zvcm06ICdzY2FsZSgwLjkpJywgb3BhY2l0eTogMCB9KSksXHJcbiAgICAgIHN0YXRlKCdlbnRlci1zY2FsZScsIHN0eWxlKHsgdHJhbnNmb3JtOiAnc2NhbGUoMSknLCBvcGFjaXR5OiAxIH0pKSxcclxuICAgICAgc3RhdGUoJ2VudGVyLWZhZGUnLCBzdHlsZSh7IG9wYWNpdHk6IDEgfSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKFxyXG4gICAgICAgICd2b2lkID0+IGVudGVyLXNjYWxlJyxcclxuICAgICAgICBhbmltYXRlKCcxNTBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKScpXHJcbiAgICAgICksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gZW50ZXItZmFkZScsIFtcclxuICAgICAgICBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMTBweCknIH0pLFxyXG4gICAgICAgIGFuaW1hdGUoJzUwMG1zJywgc3R5bGUoeyBvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDApJyB9KSksXHJcbiAgICAgIF0pLFxyXG4gICAgICB0cmFuc2l0aW9uKCcqID0+IHZvaWQnLCBbXHJcbiAgICAgICAgYW5pbWF0ZSgnNTAwbXMnLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMTBweCknIH0pKSxcclxuICAgICAgXSksXHJcbiAgICBdKSxcclxuICBdLFxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIE92ZXJsYXlDb250ZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBwdWJsaWMgYWN0dWFsUGxhY2VtZW50OiBzdHJpbmcgfCBQb3BvdmVyUGxhY2VtZW50ID0gJ2JvdHRvbSc7XHJcbiAgcHVibGljIHRhYmxlSGVhZGVyczphbnlbXT1bXTtcclxuICAgQElucHV0KCkgY3VzdG9tVGhlbWUhOnN0cmluZztcclxuICAgcHVibGljIGFycm93T2Zmc2V0ID0wO1xyXG5cclxuICBAT3V0cHV0KCkgbW91c2VFbnRlclBvcG92ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIG1vdXNlTGVhdmVQb3BvdmVyID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZih0aGlzLmNvbnRyb2wuY29uZmlnLnRhYmxlRGF0YSkge1xyXG4gICAgICAgIHRoaXMuZ2V0VGFibGVIZWFkZXJzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ0Bwb3BvdmVyQW5pbWF0aW9uJylcclxuICBnZXQgYW5pbWF0aW9uU3RhdGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb250cm9sLmNvbmZpZy5hbmltYXRpb24gPT09ICdzY2FsZSdcclxuICAgICAgPyAnZW50ZXItc2NhbGUnXHJcbiAgICAgIDogJ2VudGVyLWZhZGUnO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoQEluamVjdChPVkVSTEFZX0NPTlRST0wpIHB1YmxpYyBjb250cm9sOiBPdmVybGF5Q29udHJvbCkge1xyXG4gICAgdGhpcy5hY3R1YWxQbGFjZW1lbnQgPSB0aGlzLmNvbnRyb2wuY29uZmlnLnBsYWNlbWVudCB8fCAnYm90dG9tJztcclxuICB9XHJcblxyXG4gIC8vIEhlbHBlciB0byBjaGVjayBpZiBjb250ZW50IGlzIGEgVGVtcGxhdGVSZWZcclxuICBpc1RlbXBsYXRlUmVmKGNvbnRlbnQ6IGFueSk6IGNvbnRlbnQgaXMgVGVtcGxhdGVSZWY8YW55PiB7XHJcbiAgICByZXR1cm4gY29udGVudCBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmO1xyXG4gIH1cclxuXHJcbiAgLy8gSGVscGVyIHRvIGdldCBrZXlzIGZvciB0aGUgdGFibGUgaGVhZGVyLCByb2J1c3RseVxyXG4gIGdldFRhYmxlSGVhZGVycygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHRlbXBEYXRhID0gdGhpcy5jb250cm9sLmNvbmZpZy50YWJsZURhdGE7XHJcblxyXG4gICAgaWYgKCF0ZW1wRGF0YSB8fCB0ZW1wRGF0YS5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy50YWJsZUhlYWRlcnMgPSBbXTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gQXNzdW1lcyBhbGwgb2JqZWN0cyBpbiB0aGUgYXJyYXkgaGF2ZSB0aGUgc2FtZSBzaGFwZVxyXG4gICAgdGhpcy50YWJsZUhlYWRlcnMgPSBPYmplY3Qua2V5cyh0ZW1wRGF0YVswXSk7XHJcbiAgfVxyXG59XHJcbiIsIjxtYXQtY2FyZCBjbGFzcz1cInBvcG92ZXItY29udGFpbmVyXCIgY2xhc3M9e3tjdXN0b21UaGVtZX19IChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwicG9wb3Zlci1hcnJvd1wiXHJcblthdHRyLmRhdGEtcGxhY2VtZW50XT1cImFjdHVhbFBsYWNlbWVudFwiXHJcbiAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIihhY3R1YWxQbGFjZW1lbnQuc3RhcnRzV2l0aCgndG9wJykgfHwgYWN0dWFsUGxhY2VtZW50LnN0YXJ0c1dpdGgoJ2JvdHRvbScpKSA/IGFycm93T2Zmc2V0IDogbnVsbFwiXHJcbltzdHlsZS50b3AucHhdPVwiKGFjdHVhbFBsYWNlbWVudC5zdGFydHNXaXRoKCdsZWZ0JykgfHwgYWN0dWFsUGxhY2VtZW50LnN0YXJ0c1dpdGgoJ3JpZ2h0JykpID8gYXJyb3dPZmZzZXQgOiBudWxsXCI+XHJcbiAgICA8L2Rpdj5cclxuICA8IS0tIEhlYWRlciB3aXRoIG9wdGlvbmFsIHRpdGxlIGFuZCBjbG9zZSBidXR0b24gLS0+XHJcblxyXG4gIDxtYXQtY2FyZC1oZWFkZXIgICpuZ0lmPVwiXHJcbiAgICAgIGNvbnRyb2wuY29uZmlnLm92ZXJsYXlUaXRsZSB8fFxyXG4gICAgICBjb250cm9sLmNvbmZpZy5zaG93Q2xvc2VCdXR0b24gfHxcclxuICAgICAgY29udHJvbC5jb25maWcuY2xvc2VJY29uXHJcbiAgICBcIlxyXG4gICAgY2xhc3M9XCJwb3BvdmVyLWhlYWRlclwiXHJcbiAgPlxyXG4gICAgPG1hdC1jYXJkLXRpdGxlIGNsYXNzPVwicG9wb3Zlci10aXRsZVwiICpuZ0lmPVwiY29udHJvbC5jb25maWcub3ZlcmxheVRpdGxlXCI+e3sgY29udHJvbC5jb25maWcub3ZlcmxheVRpdGxlIH19PC9tYXQtY2FyZC10aXRsZT5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250cm9sLmNvbmZpZy5zaG93Q2xvc2VCdXR0b25cIj5cclxuICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gICBjbGFzcz1cImNsb3NlLWJ0blwiIChjbGljayk9XCJjb250cm9sLmNsb3NlKClcIiBjb2xvcj1cInByaW1hcnlcIiBhcmlhLWxhYmVsPVwiQ2xvc2UgcG9wb3ZlciBpY29uXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPnt7IGNvbnRyb2wuY29uZmlnLmNsb3NlSWNvbiB9fTwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgIDwvbWF0LWNhcmQtaGVhZGVyPlxyXG5cclxuXHJcbiAgPCEtLSBCb2R5IHdpdGggZHluYW1pYyBjb250ZW50IC0tPlxyXG4gIDxtYXQtY2FyZC1jb250ZW50IGNsYXNzPVwicG9wb3Zlci1ib2R5XCI+XHJcbiAgICA8IS0tIENhc2UgMTogQ29udGVudCBpcyBhIHNpbXBsZSBzdHJpbmcgLS0+XHJcbiAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgIWlzVGVtcGxhdGVSZWYoY29udHJvbC5jb25maWcuY29udGVudCkgJiYgIWNvbnRyb2wuY29uZmlnLnRhYmxlRGF0YVxyXG4gICAgICBcIlxyXG4gICAgPlxyXG4gICAgICB7eyBjb250cm9sLmNvbmZpZy5jb250ZW50IH19XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8IS0tIENhc2UgMjogQ29udGVudCBpcyBhIFRlbXBsYXRlUmVmIC0tPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzVGVtcGxhdGVSZWYoY29udHJvbC5jb25maWcuY29udGVudClcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRyb2wuY29uZmlnLmNvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250cm9sLmNvbmZpZy5jaGFydENvbmZpZ1wiPlxyXG5cclxuICAgICAgPHV4cC1ydWMtb3ZlcmxheS1jaGFydCAgW2NoYXJ0Q29uZmlnXT1cImNvbnRyb2wuY29uZmlnLmNoYXJ0Q29uZmlnXCI+PC91eHAtcnVjLW92ZXJsYXktY2hhcnQ+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8IS0tIENhc2UgMzogQ29udGVudCBpcyB0YWJsZSBkYXRhIC0tPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRyb2wuY29uZmlnLnRhYmxlRGF0YT8ubGVuZ3RoXCI+XHJcbiAgICAgIDx0YWJsZVxyXG4gICAgICAgIGNsYXNzPVwicG9wb3Zlci10YWJsZVwiXHJcbiAgICAgICAgW2NsYXNzXT1cImNvbnRyb2wuY29uZmlnLnRhYmxlQ2xhc3MgfHwgJ2Jhc2ljLXRhYmxlJ1wiXHJcbiAgICAgID5cclxuICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0aFxyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBoZWFkZXIgb2YgdGhpcy50YWJsZUhlYWRlcnMhXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IGhlYWRlciB9fVxyXG4gICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIGNvbnRyb2wuY29uZmlnLnRhYmxlRGF0YVwiPlxyXG4gICAgICAgICAgICA8dGRcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaGVhZGVyIG9mIHRoaXMudGFibGVIZWFkZXJzIVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICB7eyByb3dbaGVhZGVyXSB9fVxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgICA8L3RhYmxlPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9tYXQtY2FyZC1jb250ZW50PlxyXG48L21hdC1jYXJkPlxyXG4iXX0=
@@ -1,12 +1,10 @@
1
- import { Overlay } from '@angular/cdk/overlay';
2
- import { Component, ElementRef, HostListener, Injector, Input, ViewChild } from '@angular/core';
3
- import { OVERLAY_CONTROL } from '../model/overlay.types';
4
- import { filter } from 'rxjs';
1
+ import { Overlay, } from '@angular/cdk/overlay';
2
+ import { Component, ElementRef, HostListener, Injector, Input, ViewChild, } from '@angular/core';
3
+ import { OVERLAY_CONTROL, } from '../model/overlay.types';
5
4
  import { ComponentPortal } from '@angular/cdk/portal';
6
5
  import { OverlayService } from '../service/overlay.service';
7
6
  import { OverlayContentComponent } from '../overlay-content/overlay-content.component';
8
7
  import { MatButton } from '@angular/material/button';
9
- import { ESCAPE } from '@angular/cdk/keycodes';
10
8
  import { positions } from '../constants/positions';
11
9
  import * as i0 from "@angular/core";
12
10
  import * as i1 from "@angular/cdk/overlay";
@@ -46,7 +44,9 @@ export class RuclibOverlayComponent {
46
44
  // --- Trigger Handlers for self-contained button ---
47
45
  toggle() {
48
46
  if (this.rucInputData.trigger !== 'hover') {
49
- this.isOpen ? this.destroy() : this.show(this.triggerButtonRef.nativeElement, this.rucInputData);
47
+ this.isOpen
48
+ ? this.destroy()
49
+ : this.show(this.triggerButtonRef.nativeElement, this.rucInputData);
50
50
  }
51
51
  }
52
52
  handleMouseEnter() {
@@ -64,47 +64,56 @@ export class RuclibOverlayComponent {
64
64
  }
65
65
  }
66
66
  show(trigger, config) {
67
- if (this.isOpen) {
67
+ if (this.isOpen)
68
68
  return;
69
- }
70
69
  const positionStrategy = this.createPositionStrategy(trigger, config.placement || 'bottom');
71
70
  this.overlayRef = this.overlay.create({
72
71
  positionStrategy,
73
72
  hasBackdrop: config.trigger !== 'hover',
74
73
  backdropClass: 'cdk-overlay-transparent-backdrop',
75
74
  scrollStrategy: this.overlay.scrollStrategies.reposition(),
76
- disposeOnNavigation: true
77
75
  });
78
- this.overlayRef.keydownEvents().pipe(filter(event => event.keyCode === ESCAPE)).subscribe(() => this.destroy());
79
- // Create the control object with the close callback
80
- const control = {
81
- config,
82
- close: this.destroy.bind(this),
83
- };
76
+ const control = { config, close: this.destroy.bind(this) };
84
77
  const injector = Injector.create({
85
78
  parent: this.injector,
86
79
  providers: [{ provide: OVERLAY_CONTROL, useValue: control }],
87
80
  });
88
81
  const portal = new ComponentPortal(OverlayContentComponent, null, injector);
89
82
  const componentRef = this.overlayRef.attach(portal);
90
- this.positionSubscription = positionStrategy.positionChanges.subscribe(change => {
83
+ // --- START: MODIFICATION FOR DYNAMIC ARROW ---
84
+ this.positionSubscription = positionStrategy.positionChanges.subscribe((change) => {
85
+ // 1. Get the new placement ('top', 'bottom', etc.)
91
86
  const newPlacement = this.getPlacementFromPosition(change.connectionPair);
92
87
  componentRef.instance.actualPlacement = newPlacement;
88
+ // 2. Calculate the arrow's offset
89
+ if (this.overlayRef) {
90
+ const triggerRect = trigger.getBoundingClientRect();
91
+ const popoverRect = this.overlayRef.overlayElement.getBoundingClientRect();
92
+ let arrowOffset = 0;
93
+ // If popover is top/bottom, arrow moves horizontally (left)
94
+ if (newPlacement.startsWith('top') ||
95
+ newPlacement.startsWith('bottom')) {
96
+ const triggerCenter = triggerRect.left + triggerRect.width / 2;
97
+ arrowOffset = triggerCenter - popoverRect.left;
98
+ }
99
+ // If popover is left/right, arrow moves vertically (top)
100
+ else {
101
+ const triggerCenter = triggerRect.top + triggerRect.height / 2;
102
+ arrowOffset = triggerCenter - popoverRect.top;
103
+ }
104
+ // 3. Pass the offset to the content component
105
+ componentRef.instance.arrowOffset = arrowOffset;
106
+ }
93
107
  componentRef.changeDetectorRef.detectChanges();
94
108
  });
95
- // --- NEW: Subscribe to the content component's events ---
96
109
  componentRef.instance.mouseEnterPopover.subscribe(() => {
97
110
  if (this.closeTimeout)
98
111
  clearTimeout(this.closeTimeout);
99
112
  });
100
- componentRef.instance.mouseLeavePopover.subscribe(() => {
101
- this.handleMouseLeave(); // Re-use the same logic
102
- });
103
- // Close on backdrop click for 'click' triggers
113
+ componentRef.instance.mouseLeavePopover.subscribe(() => this.handleMouseLeave());
104
114
  if (config.trigger !== 'hover') {
105
115
  this.overlayRef.backdropClick().subscribe(() => this.destroy());
106
116
  }
107
- // --- NEW: Accessibility ---
108
117
  const popoverId = `popover-${Math.random().toString(36).substring(2, 9)}`;
109
118
  componentRef.location.nativeElement.setAttribute('id', popoverId);
110
119
  trigger.setAttribute('aria-describedby', popoverId);
@@ -149,7 +158,8 @@ export class RuclibOverlayComponent {
149
158
  preferredPosition = positions[0];
150
159
  break;
151
160
  }
152
- return this.overlay.position()
161
+ return this.overlay
162
+ .position()
153
163
  .flexibleConnectedTo(origin)
154
164
  .withPositions([preferredPosition, ...positions])
155
165
  .withPush(true);
@@ -162,10 +172,10 @@ export class RuclibOverlayComponent {
162
172
  }
163
173
  }
164
174
  RuclibOverlayComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibOverlayComponent, deps: [{ token: i1.Overlay }, { token: i0.Injector }, { token: i2.OverlayService }], target: i0.ɵɵFactoryTarget.Component });
165
- RuclibOverlayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: RuclibOverlayComponent, selector: "uxp-ruclib-overlay", inputs: { buttonText: "buttonText", rucInputData: "rucInputData", customTheme: "customTheme" }, host: { listeners: { "document:keydown:escape": "onEscape()" } }, viewQueries: [{ propertyName: "triggerButtonRef", first: true, predicate: MatButton, descendants: true, read: ElementRef }], ngImport: i0, template: "<button\r\nmat-raised-button\r\n color=\"primary\"\r\n *ngIf=\"buttonText\"\r\n #triggerButton\r\n (click)=\"toggle()\"\r\n (mouseenter)=\"handleMouseEnter()\"\r\n (mouseleave)=\"handleMouseLeave()\"\r\n class=\"popover-trigger-btn\">\r\n {{ buttonText }}\r\n</button>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }] });
175
+ RuclibOverlayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: RuclibOverlayComponent, selector: "uxp-ruclib-overlay", inputs: { buttonText: "buttonText", rucInputData: "rucInputData", customTheme: "customTheme" }, host: { listeners: { "document:keydown:escape": "onEscape()" } }, viewQueries: [{ propertyName: "triggerButtonRef", first: true, predicate: MatButton, descendants: true, read: ElementRef }], ngImport: i0, template: "<button\r\nmat-raised-button\r\n\r\n *ngIf=\"buttonText\"\r\n #triggerButton\r\n (click)=\"toggle()\"\r\n (mouseenter)=\"handleMouseEnter()\"\r\n (mouseleave)=\"handleMouseLeave()\"\r\n class=\"popover-trigger-btn\">\r\n {{ buttonText }}\r\n</button>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }] });
166
176
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibOverlayComponent, decorators: [{
167
177
  type: Component,
168
- args: [{ selector: 'uxp-ruclib-overlay', template: "<button\r\nmat-raised-button\r\n color=\"primary\"\r\n *ngIf=\"buttonText\"\r\n #triggerButton\r\n (click)=\"toggle()\"\r\n (mouseenter)=\"handleMouseEnter()\"\r\n (mouseleave)=\"handleMouseLeave()\"\r\n class=\"popover-trigger-btn\">\r\n {{ buttonText }}\r\n</button>\r\n" }]
178
+ args: [{ selector: 'uxp-ruclib-overlay', template: "<button\r\nmat-raised-button\r\n\r\n *ngIf=\"buttonText\"\r\n #triggerButton\r\n (click)=\"toggle()\"\r\n (mouseenter)=\"handleMouseEnter()\"\r\n (mouseleave)=\"handleMouseLeave()\"\r\n class=\"popover-trigger-btn\">\r\n {{ buttonText }}\r\n</button>\r\n" }]
169
179
  }], ctorParameters: function () { return [{ type: i1.Overlay }, { type: i0.Injector }, { type: i2.OverlayService }]; }, propDecorators: { buttonText: [{
170
180
  type: Input
171
181
  }], rucInputData: [{
@@ -179,4 +189,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
179
189
  type: HostListener,
180
190
  args: ['document:keydown:escape']
181
191
  }] } });
182
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVjbGliLW92ZXJsYXkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9ydWNsaWItb3ZlcmxheS9ydWNsaWItb3ZlcmxheS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL3J1Y2xpYi1vdmVybGF5L3J1Y2xpYi1vdmVybGF5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0YsT0FBTyxFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFDekksT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQXFCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuSCxPQUFPLEVBQUUsZUFBZSxFQUE4QyxNQUFNLHdCQUF3QixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxNQUFNLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDdkYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7OztBQWlCbkQsTUFBTSxPQUFPLHNCQUFzQjtJQWlCakMsWUFDVSxPQUFnQixFQUNoQixRQUFrQixFQUNsQixjQUE4QjtRQUY5QixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2hCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBbEIvQixpQkFBWSxHQUFrQjtZQUNyQyxPQUFPLEVBQUUsaUJBQWlCO1NBQzNCLENBQUM7UUFNTSxlQUFVLEdBQXNCLElBQUksQ0FBQztJQVcxQyxDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQ3BFLENBQUMsSUFBUSxFQUFFLEVBQUU7Z0JBQ1gsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO29CQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUN0QztxQkFBTSxJQUFJLENBQUMsSUFBSSxFQUFFO29CQUNoQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7aUJBQ2hCO1lBQ0gsQ0FBQyxDQUNGLENBQUM7U0FDSDtJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLG9CQUFvQixFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDM0IsQ0FBQztJQUVELHFEQUFxRDtJQUNyRCxNQUFNO1FBQ0osSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sS0FBSyxPQUFPLEVBQUU7WUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQzVGO0lBQ0gsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEtBQUssT0FBTyxFQUFFO1lBQ3pDLElBQUksSUFBSSxDQUFDLFlBQVk7Z0JBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGtDQUFrQztZQUNoRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQzdEO0lBQ0gsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEtBQUssT0FBTyxFQUFFO1lBQ3pDLGtDQUFrQztZQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUM7WUFDbEQsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzdEO0lBQ0gsQ0FBQztJQUdPLElBQUksQ0FBQyxPQUFvQixFQUFFLE1BQXFCO1FBQ3RELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLE9BQU87U0FDUjtRQUVELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUNsRCxPQUFPLEVBQ1AsTUFBTSxDQUFDLFNBQVMsSUFBSSxRQUFRLENBQzdCLENBQUM7UUFFRixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQ3BDLGdCQUFnQjtZQUNoQixXQUFXLEVBQUUsTUFBTSxDQUFDLE9BQU8sS0FBSyxPQUFPO1lBQ3ZDLGFBQWEsRUFBRSxrQ0FBa0M7WUFDakQsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFO1lBQzFELG1CQUFtQixFQUFDLElBQUk7U0FDekIsQ0FBQyxDQUFDO1FBR0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUU5RyxvREFBb0Q7UUFDcEQsTUFBTSxPQUFPLEdBQW1CO1lBQzlCLE1BQU07WUFDTixLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQy9CLENBQUM7UUFFRixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQy9CLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUTtZQUNyQixTQUFTLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDO1NBQzdELENBQUMsQ0FBQztRQUVILE1BQU0sTUFBTSxHQUFHLElBQUksZUFBZSxDQUFDLHVCQUF1QixFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM1RSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVwRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM5RSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzFFLFlBQVksQ0FBQyxRQUFRLENBQUMsZUFBZSxHQUFHLFlBQVksQ0FBQztZQUNyRCxZQUFZLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7UUFFSCwyREFBMkQ7UUFDM0QsWUFBWSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ3JELElBQUksSUFBSSxDQUFDLFlBQVk7Z0JBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN6RCxDQUFDLENBQUMsQ0FBQztRQUNILFlBQVksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNyRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLHdCQUF3QjtRQUNuRCxDQUFDLENBQUMsQ0FBQztRQUVBLCtDQUErQztRQUNsRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssT0FBTyxFQUFFO1lBQzlCLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQ2pFO1FBRUQsNkJBQTZCO1FBQzdCLE1BQU0sU0FBUyxHQUFHLFdBQVcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDMUUsWUFBWSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRSxPQUFPLENBQUMsWUFBWSxDQUFDLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxPQUFPLENBQUM7SUFFcEMsQ0FBQztJQUVBLCtDQUErQztJQUN6QyxPQUFPO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTyxDQUFDLHlCQUF5QjtRQUV2RCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUMzQixJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztTQUNyQztRQUNELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxRQUFnQztRQUMvRCxJQUFJLFFBQVEsQ0FBQyxPQUFPLEtBQUssS0FBSyxJQUFJLFFBQVEsQ0FBQyxRQUFRLEtBQUssUUFBUTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQy9FLElBQUksUUFBUSxDQUFDLE9BQU8sS0FBSyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsS0FBSyxLQUFLO1lBQUUsT0FBTyxRQUFRLENBQUM7UUFDbEYsSUFBSSxRQUFRLENBQUMsT0FBTyxLQUFLLE9BQU8sSUFBSSxRQUFRLENBQUMsUUFBUSxLQUFLLEtBQUs7WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUMvRSxJQUFJLFFBQVEsQ0FBQyxPQUFPLEtBQUssS0FBSyxJQUFJLFFBQVEsQ0FBQyxRQUFRLEtBQUssT0FBTztZQUFFLE9BQU8sT0FBTyxDQUFDO1FBQ2hGLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxNQUFtQixFQUFFLFNBQWlCO1FBQ25FLElBQUksaUJBQW9DLENBQUM7UUFDekMsUUFBUSxTQUFTLEVBQUU7WUFDakIsS0FBSyxLQUFLO2dCQUFFLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFBQyxNQUFNO1lBQ3BELEtBQUssT0FBTztnQkFBRSxpQkFBaUIsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQUMsTUFBTTtZQUN0RCxLQUFLLE1BQU07Z0JBQUUsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUFDLE1BQU07WUFDckQ7Z0JBQVMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUFDLE1BQU07U0FDbEQ7UUFFRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO2FBQzNCLG1CQUFtQixDQUFDLE1BQU0sQ0FBQzthQUMzQixhQUFhLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO2FBQ2hELFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUEsc0NBQXNDO0lBRXRDLFFBQVE7UUFDUixJQUFJLENBQUMsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNoQixDQUFDOztvSEE5S1Msc0JBQXNCO3dHQUF0QixzQkFBc0IsOFFBUXRCLFNBQVMsMkJBQVUsVUFBVSw2QkNsQzFDLDhTQVdBOzRGRGVhLHNCQUFzQjtrQkFObEMsU0FBUzsrQkFDRSxvQkFBb0I7a0pBTXJCLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUc4QyxnQkFBZ0I7c0JBQW5FLFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFrS3pDLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25uZWN0ZWRQb3NpdGlvbiwgQ29ubmVjdGlvblBvc2l0aW9uUGFpciwgRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5LCBPdmVybGF5LCBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgSW5qZWN0b3IsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9WRVJMQVlfQ09OVFJPTCwgT3ZlcmxheUNvbmZpZywgT3ZlcmxheUNvbnRyb2wsIE92ZXJsYXlEYXRhIH0gZnJvbSAnLi4vbW9kZWwvb3ZlcmxheS50eXBlcyc7XHJcbmltcG9ydCB7IGZpbHRlciwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xyXG5pbXBvcnQgeyBPdmVybGF5U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2Uvb3ZlcmxheS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgT3ZlcmxheUNvbnRlbnRDb21wb25lbnQgfSBmcm9tICcuLi9vdmVybGF5LWNvbnRlbnQvb3ZlcmxheS1jb250ZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IEVTQ0FQRSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XHJcbmltcG9ydCB7IHBvc2l0aW9ucyB9IGZyb20gJy4uL2NvbnN0YW50cy9wb3NpdGlvbnMnO1xyXG5cclxuZXhwb3J0IHR5cGUgUG9wb3ZlclBsYWNlbWVudCA9ICd0b3AnIHwgJ2JvdHRvbScgfCAnbGVmdCcgfCAncmlnaHQnO1xyXG5leHBvcnQgdHlwZSBQb3BvdmVyQW5pbWF0aW9uID0gJ2ZhZGUnIHwgJ3NjYWxlJztcclxuZXhwb3J0IHR5cGUgQ2hhcnRUeXBlID0gJ2RvdWdobnV0JyB8ICdwaWUnIHwgJ2Jhcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENoYXJ0TW9kZWwge1xyXG4gIGNoYXJ0VHlwZTogQ2hhcnRUeXBlO1xyXG4gIGRhdGE6IGFueTtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd1eHAtcnVjbGliLW92ZXJsYXknLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ydWNsaWItb3ZlcmxheS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcnVjbGliLW92ZXJsYXkuY29tcG9uZW50LnNjc3MnXSxcclxuXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSdWNsaWJPdmVybGF5Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIGJ1dHRvblRleHQ/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcnVjSW5wdXREYXRhOiBPdmVybGF5Q29uZmlnID0ge1xyXG4gICAgY29udGVudDogJ0RlZmF1bHQgY29udGVudCcsXHJcbiAgfTtcclxuICBASW5wdXQoKSBjdXN0b21UaGVtZSE6c3RyaW5nO1xyXG5cclxuICBcclxuICBAVmlld0NoaWxkKE1hdEJ1dHRvbiwgeyByZWFkOiBFbGVtZW50UmVmIH0pIHByaXZhdGUgdHJpZ2dlckJ1dHRvblJlZiE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIHByaXZhdGUgb3ZlcmxheVJlZjogT3ZlcmxheVJlZiB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgc2VydmljZVN1YnNjcmlwdGlvbiE6IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIGNsb3NlVGltZW91dD86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+OyAvLyBVc2UgdGhlIGNvcnJlY3QgdHlwZVxyXG4gIHByaXZhdGUgbGFzdFRyaWdnZXJFbGVtZW50PzogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBwb3NpdGlvblN1YnNjcmlwdGlvbiE6IFN1YnNjcmlwdGlvbjtcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5LFxyXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICBwcml2YXRlIG92ZXJsYXlTZXJ2aWNlOiBPdmVybGF5U2VydmljZVxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuYnV0dG9uVGV4dCkge1xyXG4gICAgICB0aGlzLnNlcnZpY2VTdWJzY3JpcHRpb24gPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLnBvcG92ZXJTdGF0ZSQuc3Vic2NyaWJlKFxyXG4gICAgICAgIChkYXRhOmFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGRhdGEgJiYgIXRoaXMuaXNPcGVuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvdyhkYXRhLnRyaWdnZXIsIGRhdGEuY29uZmlnKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoIWRhdGEpIHtcclxuICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnBvc2l0aW9uU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5zZXJ2aWNlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5kZXN0cm95KCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhdGhpcy5vdmVybGF5UmVmO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tIFRyaWdnZXIgSGFuZGxlcnMgZm9yIHNlbGYtY29udGFpbmVkIGJ1dHRvbiAtLS1cclxuICB0b2dnbGUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5ydWNJbnB1dERhdGEudHJpZ2dlciAhPT0gJ2hvdmVyJykge1xyXG50aGlzLmlzT3BlbiA/IHRoaXMuZGVzdHJveSgpIDogdGhpcy5zaG93KHRoaXMudHJpZ2dlckJ1dHRvblJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLnJ1Y0lucHV0RGF0YSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVNb3VzZUVudGVyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucnVjSW5wdXREYXRhLnRyaWdnZXIgPT09ICdob3ZlcicpIHtcclxuICAgICAgaWYgKHRoaXMuY2xvc2VUaW1lb3V0KSBjbGVhclRpbWVvdXQodGhpcy5jbG9zZVRpbWVvdXQpOyAvLyBDbGVhciBhbnkgcGVuZGluZyBjbG9zZSBjb21tYW5kXHJcbnRoaXMuc2hvdyh0aGlzLnRyaWdnZXJCdXR0b25SZWYubmF0aXZlRWxlbWVudCwgdGhpcy5ydWNJbnB1dERhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlTW91c2VMZWF2ZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnJ1Y0lucHV0RGF0YS50cmlnZ2VyID09PSAnaG92ZXInKSB7XHJcbiAgICAgIC8vIFVzZSB0aGUgY29uZmlndXJhYmxlIGNsb3NlRGVsYXlcclxuICAgICAgY29uc3QgZGVsYXkgPSB0aGlzLnJ1Y0lucHV0RGF0YS5jbG9zZURlbGF5ID8/IDIwMDtcclxuICAgICAgdGhpcy5jbG9zZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZGVzdHJveSgpLCBkZWxheSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBzaG93KHRyaWdnZXI6IEhUTUxFbGVtZW50LCBjb25maWc6IE92ZXJsYXlDb25maWcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzT3Blbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHRoaXMuY3JlYXRlUG9zaXRpb25TdHJhdGVneShcclxuICAgICAgdHJpZ2dlcixcclxuICAgICAgY29uZmlnLnBsYWNlbWVudCB8fCAnYm90dG9tJ1xyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLm92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKHtcclxuICAgICAgcG9zaXRpb25TdHJhdGVneSxcclxuICAgICAgaGFzQmFja2Ryb3A6IGNvbmZpZy50cmlnZ2VyICE9PSAnaG92ZXInLCAvLyBObyBiYWNrZHJvcCBmb3IgaG92ZXJcclxuICAgICAgYmFja2Ryb3BDbGFzczogJ2Nkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wJyxcclxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKSxcclxuICAgICAgZGlzcG9zZU9uTmF2aWdhdGlvbjp0cnVlXHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgdGhpcy5vdmVybGF5UmVmLmtleWRvd25FdmVudHMoKS5waXBlKGZpbHRlcihldmVudD0+IGV2ZW50LmtleUNvZGUgPT09IEVTQ0FQRSkpLnN1YnNjcmliZSgoKT0+IHRoaXMuZGVzdHJveSgpKTtcclxuXHJcbiAgICAvLyBDcmVhdGUgdGhlIGNvbnRyb2wgb2JqZWN0IHdpdGggdGhlIGNsb3NlIGNhbGxiYWNrXHJcbiAgICBjb25zdCBjb250cm9sOiBPdmVybGF5Q29udHJvbCA9IHtcclxuICAgICAgY29uZmlnLFxyXG4gICAgICBjbG9zZTogdGhpcy5kZXN0cm95LmJpbmQodGhpcyksXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcclxuICAgICAgcGFyZW50OiB0aGlzLmluamVjdG9yLFxyXG4gICAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE9WRVJMQVlfQ09OVFJPTCwgdXNlVmFsdWU6IGNvbnRyb2wgfV0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBwb3J0YWwgPSBuZXcgQ29tcG9uZW50UG9ydGFsKE92ZXJsYXlDb250ZW50Q29tcG9uZW50LCBudWxsLCBpbmplY3Rvcik7XHJcbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKHBvcnRhbCk7XHJcblxyXG4gICAgdGhpcy5wb3NpdGlvblN1YnNjcmlwdGlvbiA9IHBvc2l0aW9uU3RyYXRlZ3kucG9zaXRpb25DaGFuZ2VzLnN1YnNjcmliZShjaGFuZ2UgPT4ge1xyXG4gICAgICBjb25zdCBuZXdQbGFjZW1lbnQgPSB0aGlzLmdldFBsYWNlbWVudEZyb21Qb3NpdGlvbihjaGFuZ2UuY29ubmVjdGlvblBhaXIpO1xyXG4gICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UuYWN0dWFsUGxhY2VtZW50ID0gbmV3UGxhY2VtZW50O1xyXG4gICAgICBjb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gLS0tIE5FVzogU3Vic2NyaWJlIHRvIHRoZSBjb250ZW50IGNvbXBvbmVudCdzIGV2ZW50cyAtLS1cclxuICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5tb3VzZUVudGVyUG9wb3Zlci5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5jbG9zZVRpbWVvdXQpIGNsZWFyVGltZW91dCh0aGlzLmNsb3NlVGltZW91dCk7XHJcbiAgICB9KTtcclxuICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5tb3VzZUxlYXZlUG9wb3Zlci5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmhhbmRsZU1vdXNlTGVhdmUoKTsgLy8gUmUtdXNlIHRoZSBzYW1lIGxvZ2ljXHJcbiAgICB9KTtcclxuXHJcbiAgICAgICAvLyBDbG9zZSBvbiBiYWNrZHJvcCBjbGljayBmb3IgJ2NsaWNrJyB0cmlnZ2Vyc1xyXG4gICAgaWYgKGNvbmZpZy50cmlnZ2VyICE9PSAnaG92ZXInKSB7XHJcbiAgICAgIHRoaXMub3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuZGVzdHJveSgpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAtLS0gTkVXOiBBY2Nlc3NpYmlsaXR5IC0tLVxyXG4gICAgY29uc3QgcG9wb3ZlcklkID0gYHBvcG92ZXItJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOSl9YDtcclxuICAgIGNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnaWQnLCBwb3BvdmVySWQpO1xyXG4gICAgdHJpZ2dlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCBwb3BvdmVySWQpO1xyXG4gICAgdGhpcy5sYXN0VHJpZ2dlckVsZW1lbnQgPSB0cmlnZ2VyO1xyXG5cclxuICB9XHJcblxyXG4gICAvLyBSZW5hbWVkIGZyb20gaGlkZSgpIHRvIGRlc3Ryb3koKSBmb3IgY2xhcml0eVxyXG4gcHJpdmF0ZSBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLm92ZXJsYXlSZWYpIHJldHVybjsgLy8gUHJldmVudCBtdWx0aXBsZSBjYWxsc1xyXG5cclxuICAgIGlmICh0aGlzLmxhc3RUcmlnZ2VyRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmxhc3RUcmlnZ2VyRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKTtcclxuICAgICAgdGhpcy5sYXN0VHJpZ2dlckVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLnBvc2l0aW9uU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5vdmVybGF5UmVmLmRpc3Bvc2UoKTtcclxuICAgIHRoaXMub3ZlcmxheVJlZiA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFBsYWNlbWVudEZyb21Qb3NpdGlvbihwb3NpdGlvbjogQ29ubmVjdGlvblBvc2l0aW9uUGFpcik6IFBvcG92ZXJQbGFjZW1lbnQge1xyXG4gICAgaWYgKHBvc2l0aW9uLm9yaWdpblkgPT09ICd0b3AnICYmIHBvc2l0aW9uLm92ZXJsYXlZID09PSAnYm90dG9tJykgcmV0dXJuICd0b3AnO1xyXG4gICAgaWYgKHBvc2l0aW9uLm9yaWdpblkgPT09ICdib3R0b20nICYmIHBvc2l0aW9uLm92ZXJsYXlZID09PSAndG9wJykgcmV0dXJuICdib3R0b20nO1xyXG4gICAgaWYgKHBvc2l0aW9uLm9yaWdpblggPT09ICdzdGFydCcgJiYgcG9zaXRpb24ub3ZlcmxheVggPT09ICdlbmQnKSByZXR1cm4gJ2xlZnQnO1xyXG4gICAgaWYgKHBvc2l0aW9uLm9yaWdpblggPT09ICdlbmQnICYmIHBvc2l0aW9uLm92ZXJsYXlYID09PSAnc3RhcnQnKSByZXR1cm4gJ3JpZ2h0JztcclxuICAgIHJldHVybiAnYm90dG9tJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlUG9zaXRpb25TdHJhdGVneShvcmlnaW46IEhUTUxFbGVtZW50LCBwbGFjZW1lbnQ6IHN0cmluZyk6IEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSB7XHJcbiAgICBsZXQgcHJlZmVycmVkUG9zaXRpb246IENvbm5lY3RlZFBvc2l0aW9uO1xyXG4gICAgc3dpdGNoIChwbGFjZW1lbnQpIHtcclxuICAgICAgY2FzZSAndG9wJzogcHJlZmVycmVkUG9zaXRpb24gPSBwb3NpdGlvbnNbMV07IGJyZWFrO1xyXG4gICAgICBjYXNlICdyaWdodCc6IHByZWZlcnJlZFBvc2l0aW9uID0gcG9zaXRpb25zWzJdOyBicmVhaztcclxuICAgICAgY2FzZSAnbGVmdCc6IHByZWZlcnJlZFBvc2l0aW9uID0gcG9zaXRpb25zWzNdOyBicmVhaztcclxuICAgICAgZGVmYXVsdDogcHJlZmVycmVkUG9zaXRpb24gPSBwb3NpdGlvbnNbMF07IGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLm92ZXJsYXkucG9zaXRpb24oKVxyXG4gICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyhvcmlnaW4pXHJcbiAgICAgIC53aXRoUG9zaXRpb25zKFtwcmVmZXJyZWRQb3NpdGlvbiwgLi4ucG9zaXRpb25zXSlcclxuICAgICAgLndpdGhQdXNoKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgIC8vRG9jdW1lbnQtbGV2ZWwgbGlzdGVuZXJzIGZvciBjbG9zaW5nXHJcbiAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd246ZXNjYXBlJylcclxuICAgb25Fc2NhcGUoKTp2b2lkIHtcclxuICAgdGhpcy5wb3NpdGlvblN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuc2VydmljZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuZGVzdHJveSgpO1xyXG4gICB9XHJcblxyXG59XHJcbiIsIjxidXR0b25cclxubWF0LXJhaXNlZC1idXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgKm5nSWY9XCJidXR0b25UZXh0XCJcclxuICAjdHJpZ2dlckJ1dHRvblxyXG4gIChjbGljayk9XCJ0b2dnbGUoKVwiXHJcbiAgKG1vdXNlZW50ZXIpPVwiaGFuZGxlTW91c2VFbnRlcigpXCJcclxuICAobW91c2VsZWF2ZSk9XCJoYW5kbGVNb3VzZUxlYXZlKClcIlxyXG4gIGNsYXNzPVwicG9wb3Zlci10cmlnZ2VyLWJ0blwiPlxyXG4gIHt7IGJ1dHRvblRleHQgfX1cclxuPC9idXR0b24+XHJcbiJdfQ==
192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVjbGliLW92ZXJsYXkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9ydWNsaWItb3ZlcmxheS9ydWNsaWItb3ZlcmxheS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL3J1Y2xpYi1vdmVybGF5L3J1Y2xpYi1vdmVybGF5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFJTCxPQUFPLEdBRVIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFHTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLGVBQWUsR0FJaEIsTUFBTSx3QkFBd0IsQ0FBQztBQUVoQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7OztBQWdCbkQsTUFBTSxPQUFPLHNCQUFzQjtJQWdCakMsWUFDVSxPQUFnQixFQUNoQixRQUFrQixFQUNsQixjQUE4QjtRQUY5QixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2hCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBakIvQixpQkFBWSxHQUFrQjtZQUNyQyxPQUFPLEVBQUUsaUJBQWlCO1NBQzNCLENBQUM7UUFNTSxlQUFVLEdBQXNCLElBQUksQ0FBQztJQVUxQyxDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENB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TztnQkFDVixpQkFBaUIsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLE1BQU07WUFDUixLQUFLLE1BQU07Z0JBQ1QsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqQyxNQUFNO1lBQ1I7Z0JBQ0UsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqQyxNQUFNO1NBQ1Q7UUFFRCxPQUFPLElBQUksQ0FBQyxPQUFPO2FBQ2hCLFFBQVEsRUFBRTthQUNWLG1CQUFtQixDQUFDLE1BQU0sQ0FBQzthQUMzQixhQUFhLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO2FBQ2hELFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQsc0NBQXNDO0lBRXRDLFFBQVE7UUFDTixJQUFJLENBQUMsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQixDQUFDOztvSEFoTlUsc0JBQXNCO3dHQUF0QixzQkFBc0IsOFFBT3RCLFNBQVMsMkJBQVUsVUFBVSw2QkNwRDFDLHVRQVdBOzRGRGtDYSxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0Usb0JBQW9CO2tKQUtyQixVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFHRSxnQkFBZ0I7c0JBRHZCLFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFxTTFDLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbm5lY3RlZFBvc2l0aW9uLFxyXG4gIENvbm5lY3Rpb25Qb3NpdGlvblBhaXIsXHJcbiAgRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5LFxyXG4gIE92ZXJsYXksXHJcbiAgT3ZlcmxheVJlZixcclxufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XHJcbmltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIEluamVjdG9yLFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIE9WRVJMQVlfQ09OVFJPTCxcclxuICBPdmVybGF5Q29uZmlnLFxyXG4gIE92ZXJsYXlDb250cm9sLFxyXG4gIE92ZXJsYXlEYXRhLFxyXG59IGZyb20gJy4uL21vZGVsL292ZXJsYXkudHlwZXMnO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcclxuaW1wb3J0IHsgT3ZlcmxheVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL292ZXJsYXkuc2VydmljZSc7XHJcbmltcG9ydCB7IE92ZXJsYXlDb250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi4vb3ZlcmxheS1jb250ZW50L292ZXJsYXktY29udGVudC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNYXRCdXR0b24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xyXG5pbXBvcnQgeyBFU0NBUEUgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvbnMgfSBmcm9tICcuLi9jb25zdGFudHMvcG9zaXRpb25zJztcclxuXHJcbmV4cG9ydCB0eXBlIFBvcG92ZXJQbGFjZW1lbnQgPSAndG9wJyB8ICdib3R0b20nIHwgJ2xlZnQnIHwgJ3JpZ2h0JztcclxuZXhwb3J0IHR5cGUgUG9wb3ZlckFuaW1hdGlvbiA9ICdmYWRlJyB8ICdzY2FsZSc7XHJcbmV4cG9ydCB0eXBlIENoYXJ0VHlwZSA9ICdkb3VnaG51dCcgfCAncGllJyB8ICdiYXInO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDaGFydE1vZGVsIHtcclxuICBjaGFydFR5cGU6IENoYXJ0VHlwZTtcclxuICBkYXRhOiBhbnk7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndXhwLXJ1Y2xpYi1vdmVybGF5JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcnVjbGliLW92ZXJsYXkuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3J1Y2xpYi1vdmVybGF5LmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSdWNsaWJPdmVybGF5Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIGJ1dHRvblRleHQ/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcnVjSW5wdXREYXRhOiBPdmVybGF5Q29uZmlnID0ge1xyXG4gICAgY29udGVudDogJ0RlZmF1bHQgY29udGVudCcsXHJcbiAgfTtcclxuICBASW5wdXQoKSBjdXN0b21UaGVtZSE6IHN0cmluZztcclxuXHJcbiAgQFZpZXdDaGlsZChNYXRCdXR0b24sIHsgcmVhZDogRWxlbWVudFJlZiB9KVxyXG4gIHByaXZhdGUgdHJpZ2dlckJ1dHRvblJlZiE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIHByaXZhdGUgb3ZlcmxheVJlZjogT3ZlcmxheVJlZiB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgc2VydmljZVN1YnNjcmlwdGlvbiE6IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIGNsb3NlVGltZW91dD86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+OyAvLyBVc2UgdGhlIGNvcnJlY3QgdHlwZVxyXG4gIHByaXZhdGUgbGFzdFRyaWdnZXJFbGVtZW50PzogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBwb3NpdGlvblN1YnNjcmlwdGlvbiE6IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG92ZXJsYXk6IE92ZXJsYXksXHJcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcclxuICAgIHByaXZhdGUgb3ZlcmxheVNlcnZpY2U6IE92ZXJsYXlTZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5idXR0b25UZXh0KSB7XHJcbiAgICAgIHRoaXMuc2VydmljZVN1YnNjcmlwdGlvbiA9IHRoaXMub3ZlcmxheVNlcnZpY2UucG9wb3ZlclN0YXRlJC5zdWJzY3JpYmUoXHJcbiAgICAgICAgKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGRhdGEgJiYgIXRoaXMuaXNPcGVuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvdyhkYXRhLnRyaWdnZXIsIGRhdGEuY29uZmlnKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoIWRhdGEpIHtcclxuICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnBvc2l0aW9uU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5zZXJ2aWNlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5kZXN0cm95KCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhdGhpcy5vdmVybGF5UmVmO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tIFRyaWdnZXIgSGFuZGxlcnMgZm9yIHNlbGYtY29udGFpbmVkIGJ1dHRvbiAtLS1cclxuICB0b2dnbGUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5ydWNJbnB1dERhdGEudHJpZ2dlciAhPT0gJ2hvdmVyJykge1xyXG4gICAgICB0aGlzLmlzT3BlblxyXG4gICAgICAgID8gdGhpcy5kZXN0cm95KClcclxuICAgICAgICA6IHRoaXMuc2hvdyh0aGlzLnRyaWdnZXJCdXR0b25SZWYubmF0aXZlRWxlbWVudCwgdGhpcy5ydWNJbnB1dERhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlTW91c2VFbnRlcigpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnJ1Y0lucHV0RGF0YS50cmlnZ2VyID09PSAnaG92ZXInKSB7XHJcbiAgICAgIGlmICh0aGlzLmNsb3NlVGltZW91dCkgY2xlYXJUaW1lb3V0KHRoaXMuY2xvc2VUaW1lb3V0KTsgLy8gQ2xlYXIgYW55IHBlbmRpbmcgY2xvc2UgY29tbWFuZFxyXG4gICAgICB0aGlzLnNob3codGhpcy50cmlnZ2VyQnV0dG9uUmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMucnVjSW5wdXREYXRhKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZU1vdXNlTGVhdmUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5ydWNJbnB1dERhdGEudHJpZ2dlciA9PT0gJ2hvdmVyJykge1xyXG4gICAgICAvLyBVc2UgdGhlIGNvbmZpZ3VyYWJsZSBjbG9zZURlbGF5XHJcbiAgICAgIGNvbnN0IGRlbGF5ID0gdGhpcy5ydWNJbnB1dERhdGEuY2xvc2VEZWxheSA/PyAyMDA7XHJcbiAgICAgIHRoaXMuY2xvc2VUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLmRlc3Ryb3koKSwgZGVsYXkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzaG93KHRyaWdnZXI6IEhUTUxFbGVtZW50LCBjb25maWc6IE92ZXJsYXlDb25maWcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzT3BlbikgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLmNyZWF0ZVBvc2l0aW9uU3RyYXRlZ3koXHJcbiAgICAgIHRyaWdnZXIsXHJcbiAgICAgIGNvbmZpZy5wbGFjZW1lbnQgfHwgJ2JvdHRvbSdcclxuICAgICk7XHJcbiAgICB0aGlzLm92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKHtcclxuICAgICAgcG9zaXRpb25TdHJhdGVneSxcclxuICAgICAgaGFzQmFja2Ryb3A6IGNvbmZpZy50cmlnZ2VyICE9PSAnaG92ZXInLFxyXG4gICAgICBiYWNrZHJvcENsYXNzOiAnY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AnLFxyXG4gICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbigpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgY29udHJvbDogT3ZlcmxheUNvbnRyb2wgPSB7IGNvbmZpZywgY2xvc2U6IHRoaXMuZGVzdHJveS5iaW5kKHRoaXMpIH07XHJcbiAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XHJcbiAgICAgIHBhcmVudDogdGhpcy5pbmplY3RvcixcclxuICAgICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBPVkVSTEFZX0NPTlRST0wsIHVzZVZhbHVlOiBjb250cm9sIH1dLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgcG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbChPdmVybGF5Q29udGVudENvbXBvbmVudCwgbnVsbCwgaW5qZWN0b3IpO1xyXG4gICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5vdmVybGF5UmVmLmF0dGFjaChwb3J0YWwpO1xyXG5cclxuICAgIC8vIC0tLSBTVEFSVDogTU9ESUZJQ0FUSU9OIEZPUiBEWU5BTUlDIEFSUk9XIC0tLVxyXG4gICAgdGhpcy5wb3NpdGlvblN1YnNjcmlwdGlvbiA9IHBvc2l0aW9uU3RyYXRlZ3kucG9zaXRpb25DaGFuZ2VzLnN1YnNjcmliZShcclxuICAgICAgKGNoYW5nZSkgPT4ge1xyXG4gICAgICAgIC8vIDEuIEdldCB0aGUgbmV3IHBsYWNlbWVudCAoJ3RvcCcsICdib3R0b20nLCBldGMuKVxyXG4gICAgICAgIGNvbnN0IG5ld1BsYWNlbWVudCA9IHRoaXMuZ2V0UGxhY2VtZW50RnJvbVBvc2l0aW9uKFxyXG4gICAgICAgICAgY2hhbmdlLmNvbm5lY3Rpb25QYWlyXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UuYWN0dWFsUGxhY2VtZW50ID0gbmV3UGxhY2VtZW50O1xyXG5cclxuICAgICAgICAvLyAyLiBDYWxjdWxhdGUgdGhlIGFycm93J3Mgb2Zmc2V0XHJcbiAgICAgICAgaWYgKHRoaXMub3ZlcmxheVJlZikge1xyXG4gICAgICAgICAgY29uc3QgdHJpZ2dlclJlY3QgPSB0cmlnZ2VyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgY29uc3QgcG9wb3ZlclJlY3QgPVxyXG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgICAgbGV0IGFycm93T2Zmc2V0ID0gMDtcclxuICAgICAgICAgIC8vIElmIHBvcG92ZXIgaXMgdG9wL2JvdHRvbSwgYXJyb3cgbW92ZXMgaG9yaXpvbnRhbGx5IChsZWZ0KVxyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBuZXdQbGFjZW1lbnQuc3RhcnRzV2l0aCgndG9wJykgfHxcclxuICAgICAgICAgICAgbmV3UGxhY2VtZW50LnN0YXJ0c1dpdGgoJ2JvdHRvbScpXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgY29uc3QgdHJpZ2dlckNlbnRlciA9IHRyaWdnZXJSZWN0LmxlZnQgKyB0cmlnZ2VyUmVjdC53aWR0aCAvIDI7XHJcbiAgICAgICAgICAgIGFycm93T2Zmc2V0ID0gdHJpZ2dlckNlbnRlciAtIHBvcG92ZXJSZWN0LmxlZnQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBJZiBwb3BvdmVyIGlzIGxlZnQvcmlnaHQsIGFycm93IG1vdmVzIHZlcnRpY2FsbHkgKHRvcClcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB0cmlnZ2VyQ2VudGVyID0gdHJpZ2dlclJlY3QudG9wICsgdHJpZ2dlclJlY3QuaGVpZ2h0IC8gMjtcclxuICAgICAgICAgICAgYXJyb3dPZmZzZXQgPSB0cmlnZ2VyQ2VudGVyIC0gcG9wb3ZlclJlY3QudG9wO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIDMuIFBhc3MgdGhlIG9mZnNldCB0byB0aGUgY29udGVudCBjb21wb25lbnRcclxuICAgICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5hcnJvd09mZnNldCA9IGFycm93T2Zmc2V0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UubW91c2VFbnRlclBvcG92ZXIuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuY2xvc2VUaW1lb3V0KSBjbGVhclRpbWVvdXQodGhpcy5jbG9zZVRpbWVvdXQpO1xyXG4gICAgfSk7XHJcbiAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UubW91c2VMZWF2ZVBvcG92ZXIuc3Vic2NyaWJlKCgpID0+XHJcbiAgICAgIHRoaXMuaGFuZGxlTW91c2VMZWF2ZSgpXHJcbiAgICApO1xyXG5cclxuICAgIGlmIChjb25maWcudHJpZ2dlciAhPT0gJ2hvdmVyJykge1xyXG4gICAgICB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmRlc3Ryb3koKSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcG9wb3ZlcklkID0gYHBvcG92ZXItJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOSl9YDtcclxuICAgIGNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnaWQnLCBwb3BvdmVySWQpO1xyXG4gICAgdHJpZ2dlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCBwb3BvdmVySWQpO1xyXG4gICAgdGhpcy5sYXN0VHJpZ2dlckVsZW1lbnQgPSB0cmlnZ2VyO1xyXG4gIH1cclxuXHJcbiAgLy8gUmVuYW1lZCBmcm9tIGhpZGUoKSB0byBkZXN0cm95KCkgZm9yIGNsYXJpdHlcclxuICBwcml2YXRlIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMub3ZlcmxheVJlZikgcmV0dXJuOyAvLyBQcmV2ZW50IG11bHRpcGxlIGNhbGxzXHJcblxyXG4gICAgaWYgKHRoaXMubGFzdFRyaWdnZXJFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMubGFzdFRyaWdnZXJFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScpO1xyXG4gICAgICB0aGlzLmxhc3RUcmlnZ2VyRWxlbWVudCA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIHRoaXMucG9zaXRpb25TdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLm92ZXJsYXlSZWYuZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5vdmVybGF5UmVmID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UGxhY2VtZW50RnJvbVBvc2l0aW9uKFxyXG4gICAgcG9zaXRpb246IENvbm5lY3Rpb25Qb3NpdGlvblBhaXJcclxuICApOiBQb3BvdmVyUGxhY2VtZW50IHtcclxuICAgIGlmIChwb3NpdGlvbi5vcmlnaW5ZID09PSAndG9wJyAmJiBwb3NpdGlvbi5vdmVybGF5WSA9PT0gJ2JvdHRvbScpXHJcbiAgICAgIHJldHVybiAndG9wJztcclxuICAgIGlmIChwb3NpdGlvbi5vcmlnaW5ZID09PSAnYm90dG9tJyAmJiBwb3NpdGlvbi5vdmVybGF5WSA9PT0gJ3RvcCcpXHJcbiAgICAgIHJldHVybiAnYm90dG9tJztcclxuICAgIGlmIChwb3NpdGlvbi5vcmlnaW5YID09PSAnc3RhcnQnICYmIHBvc2l0aW9uLm92ZXJsYXlYID09PSAnZW5kJylcclxuICAgICAgcmV0dXJuICdsZWZ0JztcclxuICAgIGlmIChwb3NpdGlvbi5vcmlnaW5YID09PSAnZW5kJyAmJiBwb3NpdGlvbi5vdmVybGF5WCA9PT0gJ3N0YXJ0JylcclxuICAgICAgcmV0dXJuICdyaWdodCc7XHJcbiAgICByZXR1cm4gJ2JvdHRvbSc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVBvc2l0aW9uU3RyYXRlZ3koXHJcbiAgICBvcmlnaW46IEhUTUxFbGVtZW50LFxyXG4gICAgcGxhY2VtZW50OiBzdHJpbmdcclxuICApOiBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3kge1xyXG4gICAgbGV0IHByZWZlcnJlZFBvc2l0aW9uOiBDb25uZWN0ZWRQb3NpdGlvbjtcclxuICAgIHN3aXRjaCAocGxhY2VtZW50KSB7XHJcbiAgICAgIGNhc2UgJ3RvcCc6XHJcbiAgICAgICAgcHJlZmVycmVkUG9zaXRpb24gPSBwb3NpdGlvbnNbMV07XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcclxuICAgICAgICBwcmVmZXJyZWRQb3NpdGlvbiA9IHBvc2l0aW9uc1syXTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnbGVmdCc6XHJcbiAgICAgICAgcHJlZmVycmVkUG9zaXRpb24gPSBwb3NpdGlvbnNbM107XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcHJlZmVycmVkUG9zaXRpb24gPSBwb3NpdGlvbnNbMF07XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMub3ZlcmxheVxyXG4gICAgICAucG9zaXRpb24oKVxyXG4gICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyhvcmlnaW4pXHJcbiAgICAgIC53aXRoUG9zaXRpb25zKFtwcmVmZXJyZWRQb3NpdGlvbiwgLi4ucG9zaXRpb25zXSlcclxuICAgICAgLndpdGhQdXNoKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy9Eb2N1bWVudC1sZXZlbCBsaXN0ZW5lcnMgZm9yIGNsb3NpbmdcclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duOmVzY2FwZScpXHJcbiAgb25Fc2NhcGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLnBvc2l0aW9uU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5zZXJ2aWNlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5kZXN0cm95KCk7XHJcbiAgfVxyXG59XHJcbiIsIjxidXR0b25cclxubWF0LXJhaXNlZC1idXR0b25cclxuXHJcbiAgKm5nSWY9XCJidXR0b25UZXh0XCJcclxuICAjdHJpZ2dlckJ1dHRvblxyXG4gIChjbGljayk9XCJ0b2dnbGUoKVwiXHJcbiAgKG1vdXNlZW50ZXIpPVwiaGFuZGxlTW91c2VFbnRlcigpXCJcclxuICAobW91c2VsZWF2ZSk9XCJoYW5kbGVNb3VzZUxlYXZlKClcIlxyXG4gIGNsYXNzPVwicG9wb3Zlci10cmlnZ2VyLWJ0blwiPlxyXG4gIHt7IGJ1dHRvblRleHQgfX1cclxuPC9idXR0b24+XHJcbiJdfQ==