@gloww/gloww 0.9.0-beta.52 → 0.9.0-beta.53

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.
@@ -4,10 +4,11 @@ import { FormControl } from '@angular/forms';
4
4
  import { MatPaginator } from '@angular/material/paginator';
5
5
  import { MatSort } from '@angular/material/sort';
6
6
  import { MatTable, MatTableDataSource } from '@angular/material/table';
7
- import { combineLatest, forkJoin, of, Subject } from 'rxjs';
7
+ import { combineLatest, forkJoin, of, Subject, Subscription } from 'rxjs';
8
8
  import { HeaderComponent } from '../header/header.component';
9
9
  import { ResultTableComponent } from '../result-table/result-table.component';
10
10
  import { HttpEventType, HttpParams } from '@angular/common/http';
11
+ import { NavigationEnd } from '@angular/router';
11
12
  import { MatDialogConfig } from '@angular/material/dialog';
12
13
  import { map, catchError, mergeMap, tap, filter, switchMap, take } from 'rxjs/operators';
13
14
  import * as i0 from "@angular/core";
@@ -48,6 +49,7 @@ export class DisplayObjectsComponent {
48
49
  this.displayform = true;
49
50
  this.displayresult = false;
50
51
  this.queryParams = {};
52
+ this.navSubscription = new Subscription();
51
53
  this.glowwService = glowwService;
52
54
  const component = this;
53
55
  this.currentUser = this.authenticationService.currentUserValue.UserInfo;
@@ -84,8 +86,32 @@ export class DisplayObjectsComponent {
84
86
  //this.sort.sortChange.emit(sort);
85
87
  }
86
88
  getValue4Sort(item, header) {
87
- console.log(`previewMatchSortingFn ${item} - ${header}`);
88
- return item[header];
89
+ let fct = "";
90
+ let parts = [];
91
+ if (typeof header === 'object') {
92
+ fct = header["fct"];
93
+ parts = header["parts"];
94
+ }
95
+ else {
96
+ console.log(`previewMatchSortingFn ${item} - ${header}`);
97
+ const headerFct = header.split("---");
98
+ fct = null;
99
+ if (headerFct.length === 2) {
100
+ fct = headerFct[1];
101
+ }
102
+ parts = headerFct[0].split(".");
103
+ }
104
+ let res = item;
105
+ for (let i = 0; i < parts.length; i++) {
106
+ res = res[parts[i]];
107
+ if (!res)
108
+ return null;
109
+ }
110
+ switch (fct) {
111
+ case "insensitive":
112
+ return res.toString().toLowerCase();
113
+ }
114
+ return res;
89
115
  }
90
116
  ngAfterViewInit() {
91
117
  if (!this.objectName)
@@ -131,6 +157,25 @@ export class DisplayObjectsComponent {
131
157
  ngAfterContentInit() {
132
158
  }
133
159
  ngOnInit() {
160
+ this.navSubscription = this.router.events.subscribe((e) => {
161
+ if (e instanceof NavigationEnd) {
162
+ this.parent.form?.reset();
163
+ this.displayform = true;
164
+ this.displayresult = false;
165
+ this.changeDetectorRef.detectChanges();
166
+ this.dataSource = null;
167
+ if (!this.formLayout && this.resultLayout) {
168
+ this.displayform = false;
169
+ this.displayresult = true;
170
+ }
171
+ if (this.displayresult) {
172
+ this.Search();
173
+ }
174
+ }
175
+ });
176
+ }
177
+ ngOnDestroy() {
178
+ this.navSubscription?.unsubscribe(); // this prevents a memory leak
134
179
  }
135
180
  Init(data) {
136
181
  if ((data && Object.keys(data).length > 0) || this.displayresult) {
@@ -159,9 +204,18 @@ export class DisplayObjectsComponent {
159
204
  this.queryParams[name] = this.queryParams[name];
160
205
  });
161
206
  }
207
+ this.queryParams['__guid'] = (Math.random().toString()).substring(2);
208
+ console.log("Before searchRequest");
162
209
  //debugger;
163
210
  this.searchRequest.call(this.glowwService, this.queryParams).subscribe(r => {
164
- this.dataSource = new MatTableDataSource(r);
211
+ console.log("search done");
212
+ try {
213
+ this.dataSource = new MatTableDataSource(r);
214
+ }
215
+ catch (ex) {
216
+ alert(`${ex}`);
217
+ }
218
+ console.log("dataSource changed");
165
219
  this.changeDetectorRef.detectChanges();
166
220
  this.UpdateTable();
167
221
  }, error => {
@@ -201,6 +255,7 @@ export class DisplayObjectsComponent {
201
255
  this.UpdateTable();
202
256
  }
203
257
  UpdateTable() {
258
+ console.log("UpdateTable()");
204
259
  if (this.dataSource) {
205
260
  if (!this.table) {
206
261
  console.log('!this.table');
@@ -489,10 +544,10 @@ export class DisplayObjectsComponent {
489
544
  }
490
545
  }
491
546
  DisplayObjectsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: DisplayObjectsComponent, deps: [{ token: 'glowwService' }, { token: i0.ChangeDetectorRef }, { token: i1.MatDialog }, { token: i2.Router }, { token: i3.Location }, { token: i4.AuthenticationService }, { token: i5.FormBuilder }, { token: i2.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
492
- DisplayObjectsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: DisplayObjectsComponent, selector: "glw-display-objects", inputs: { configuration: "configuration", displayObjLink: "displayObjLink", canDisplayObj: "canDisplayObj", canEdit: "canEdit", canDelete: "canDelete", canAdd: "canAdd", form: "form", SearchForm: "SearchForm", searchRequest: "searchRequest", postRequest: "postRequest", deleteRequest: "deleteRequest", putRequest: "putRequest", maxrows: "maxrows", mandatoryParams: "mandatoryParams", actions: "actions", dialogConfig: "dialogConfig", parent: "parent", columns: "columns", objectName: "objectName", primaryKey: "primaryKey", Editor: "Editor", AddEditor: "AddEditor" }, queries: [{ propertyName: "header", first: true, predicate: HeaderComponent, descendants: true }, { propertyName: "formLayout", first: true, predicate: SearchFormComponent, descendants: true }, { propertyName: "resultLayout", first: true, predicate: ResultTableComponent, descendants: true }], viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div>\r\n <ng-content select=\"glw-header\"></ng-content>\r\n</div>\r\n\r\n<div *ngIf=\"displayform\">\r\n <mat-card>\r\n <mat-card-content>\r\n <mat-error *ngIf=\"resultException\">\r\n Unable to query : {{resultException}}\r\n </mat-error>\r\n <ng-content select=\"glw-search-form\"></ng-content>\r\n <!--<ng-container *ngComponentOutlet=\"SearchForm; injector: objInjector\"></ng-container>-->\r\n <div *ngIf=\"maxrows\" [formGroup]=\"form2\">\r\n <br />\r\n <mat-form-field>\r\n <mat-select placeholder=\"MaxRow\" formControlName=\"_MaxRow_\">\r\n <mat-option *ngFor=\"let maxrow of maxrows\" [value]=\"maxrow\">\r\n <span *ngIf=\"maxrow\">{{maxrow}} objects</span>\r\n <span *ngIf=\"!maxrow\"> Default</span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </mat-card-content>\r\n <mat-card-actions>\r\n <button mat-stroked-button color=\"accent\" (click)=\"onSearch()\">\r\n <mat-icon>search</mat-icon>\r\n Search\r\n </button>\r\n </mat-card-actions>\r\n </mat-card>\r\n</div>\r\n\r\n<div *ngIf=\"displayresult\">\r\n <div class=\"mat-elevation-z8\" *ngIf=\"dataSource; else Spinner\">\r\n <table mat-table [dataSource]=\"dataSource\" matSort>\r\n <ng-container matColumnDef=\"action\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <i class=\"fal fa-plus\" (click)=\"AddObj()\" *ngIf=\"canAddThis()\">\r\n </i>\r\n </th>\r\n <td mat-cell *matCellDef=\"let obj\">\r\n <i class=\"fal fa-eye\" [routerLink]=\"displayObjLinkThis(obj)\" *ngIf=\"canDisplayObjThis(obj)\">\r\n </i>\r\n <ng-container *ngFor=\"let action of actions\">\r\n <i [ngClass]=\"action.icon\" [routerLink]=\"action.routerLinkFct(obj)\" *ngIf=\"action.icon.icon && (!action.display || action.display(obj, action.name))\">\r\n </i>\r\n <i [ngClass]=\"action.icon\" [routerLink]=\"action.routerLinkFct(obj)\" *ngIf=\"!action.icon.icon && (!action.display || action.display(obj, action.name))\"></i>\r\n </ng-container>\r\n <i class=\"fal fa-trash-alt\" (click)=\"DeleteObj(obj)\" *ngIf=\"canDeleteThis(obj)\">\r\n </i>\r\n <i class=\"fal fa-pencil\" (click)=\"EditObj(obj)\" *ngIf=\"canEditThis(obj)\">\r\n </i>\r\n </td>\r\n </ng-container>\r\n <ng-content select=\"glw-result-table\"></ng-content>\r\n <tr mat-header-row *matHeaderRowDef=\"columnsToDisplay\"></tr>\r\n <tr mat-row *matRowDef=\"let myRowData; columns: columnsToDisplay\"></tr>\r\n </table>\r\n <mat-paginator pageSize=\"10\"></mat-paginator>\r\n </div>\r\n <ng-template #Spinner>\r\n <mat-spinner></mat-spinner>\r\n </ng-template>\r\n</div>\r\n", styles: ["table{width:100%}i{cursor:pointer;padding:5px}td{padding-right:10px;padding-left:10px}\n"], components: [{ type: i6.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i8.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i9.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i10.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i12.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { type: i12.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { type: i12.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { type: i13.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { type: i14.MatSpinner, selector: "mat-spinner", inputs: ["color"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { type: i7.MatError, selector: "mat-error", inputs: ["id"] }, { type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { type: i15.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { type: i12.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { type: i12.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { type: i12.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { type: i12.MatCellDef, selector: "[matCellDef]" }, { type: i12.MatCell, selector: "mat-cell, td[mat-cell]" }, { type: i2.RouterLink, selector: ":not(a):not(area)[routerLink]", inputs: ["queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i12.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { type: i12.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }] });
547
+ DisplayObjectsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: DisplayObjectsComponent, selector: "glw-display-objects", inputs: { configuration: "configuration", displayObjLink: "displayObjLink", canDisplayObj: "canDisplayObj", canEdit: "canEdit", canDelete: "canDelete", canAdd: "canAdd", form: "form", SearchForm: "SearchForm", searchRequest: "searchRequest", postRequest: "postRequest", deleteRequest: "deleteRequest", putRequest: "putRequest", maxrows: "maxrows", mandatoryParams: "mandatoryParams", actions: "actions", dialogConfig: "dialogConfig", parent: "parent", columns: "columns", objectName: "objectName", primaryKey: "primaryKey", Editor: "Editor", AddEditor: "AddEditor" }, queries: [{ propertyName: "header", first: true, predicate: HeaderComponent, descendants: true }, { propertyName: "formLayout", first: true, predicate: SearchFormComponent, descendants: true }, { propertyName: "resultLayout", first: true, predicate: ResultTableComponent, descendants: true }], viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div>\r\n <ng-content select=\"glw-header\"></ng-content>\r\n</div>\r\n\r\n<div *ngIf=\"displayform\">\r\n <mat-card>\r\n <mat-card-content>\r\n <mat-error *ngIf=\"resultException\">\r\n Unable to query : {{resultException}}\r\n </mat-error>\r\n <ng-content select=\"glw-search-form\"></ng-content>\r\n <!--<ng-container *ngComponentOutlet=\"SearchForm; injector: objInjector\"></ng-container>-->\r\n <div *ngIf=\"maxrows\" [formGroup]=\"form2\">\r\n <br />\r\n <mat-form-field>\r\n <mat-select placeholder=\"MaxRow\" formControlName=\"_MaxRow_\">\r\n <mat-option *ngFor=\"let maxrow of maxrows\" [value]=\"maxrow\">\r\n <span *ngIf=\"maxrow\">{{maxrow}} objects</span>\r\n <span *ngIf=\"!maxrow\"> Default</span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </mat-card-content>\r\n <mat-card-actions>\r\n <button mat-stroked-button color=\"accent\" (click)=\"onSearch()\">\r\n <mat-icon>search</mat-icon>\r\n Search\r\n </button>\r\n </mat-card-actions>\r\n </mat-card>\r\n</div>\r\n\r\n<div [hidden]=\"!displayresult\">\r\n <!--*ngIf=\"displayresult\"-->\r\n <div class=\"mat-elevation-z8\" [hidden]=\"!dataSource\">\r\n <!--*ngIf=\"dataSource; else Spinner\"-->\r\n <table mat-table [dataSource]=\"dataSource\" matSort>\r\n <ng-container matColumnDef=\"action\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <i class=\"fal fa-plus\" (click)=\"AddObj()\" *ngIf=\"canAddThis()\">\r\n </i>\r\n </th>\r\n <td mat-cell *matCellDef=\"let obj\">\r\n <i class=\"fal fa-eye\" [routerLink]=\"displayObjLinkThis(obj)\" *ngIf=\"canDisplayObjThis(obj)\">\r\n </i>\r\n <ng-container *ngFor=\"let action of actions\">\r\n <i [ngClass]=\"action.icon\" [routerLink]=\"action.routerLinkFct(obj)\" *ngIf=\"action.icon.icon && (!action.display || action.display(obj, action.name))\">\r\n </i>\r\n <i [ngClass]=\"action.icon\" [routerLink]=\"action.routerLinkFct(obj)\" *ngIf=\"!action.icon.icon && (!action.display || action.display(obj, action.name))\"></i>\r\n </ng-container>\r\n <i class=\"fal fa-trash-alt\" (click)=\"DeleteObj(obj)\" *ngIf=\"canDeleteThis(obj)\">\r\n </i>\r\n <i class=\"fal fa-pencil\" (click)=\"EditObj(obj)\" *ngIf=\"canEditThis(obj)\">\r\n </i>\r\n </td>\r\n </ng-container>\r\n <ng-content select=\"glw-result-table\"></ng-content>\r\n <tr mat-header-row *matHeaderRowDef=\"columnsToDisplay\"></tr>\r\n <tr mat-row *matRowDef=\"let myRowData; columns: columnsToDisplay\"></tr>\r\n </table>\r\n <mat-paginator pageSize=\"10\"></mat-paginator>\r\n </div>\r\n <div #Spinner [hidden]=\"dataSource\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n</div>", styles: ["table{width:100%}i{cursor:pointer;padding:5px}\n"], components: [{ type: i6.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i8.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i9.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i10.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i12.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { type: i12.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { type: i12.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { type: i13.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { type: i14.MatSpinner, selector: "mat-spinner", inputs: ["color"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { type: i7.MatError, selector: "mat-error", inputs: ["id"] }, { type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { type: i15.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { type: i12.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { type: i12.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { type: i12.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { type: i12.MatCellDef, selector: "[matCellDef]" }, { type: i12.MatCell, selector: "mat-cell, td[mat-cell]" }, { type: i2.RouterLink, selector: ":not(a):not(area)[routerLink]", inputs: ["queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i12.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { type: i12.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }] });
493
548
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: DisplayObjectsComponent, decorators: [{
494
549
  type: Component,
495
- args: [{ selector: 'glw-display-objects', template: "<div>\r\n <ng-content select=\"glw-header\"></ng-content>\r\n</div>\r\n\r\n<div *ngIf=\"displayform\">\r\n <mat-card>\r\n <mat-card-content>\r\n <mat-error *ngIf=\"resultException\">\r\n Unable to query : {{resultException}}\r\n </mat-error>\r\n <ng-content select=\"glw-search-form\"></ng-content>\r\n <!--<ng-container *ngComponentOutlet=\"SearchForm; injector: objInjector\"></ng-container>-->\r\n <div *ngIf=\"maxrows\" [formGroup]=\"form2\">\r\n <br />\r\n <mat-form-field>\r\n <mat-select placeholder=\"MaxRow\" formControlName=\"_MaxRow_\">\r\n <mat-option *ngFor=\"let maxrow of maxrows\" [value]=\"maxrow\">\r\n <span *ngIf=\"maxrow\">{{maxrow}} objects</span>\r\n <span *ngIf=\"!maxrow\"> Default</span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </mat-card-content>\r\n <mat-card-actions>\r\n <button mat-stroked-button color=\"accent\" (click)=\"onSearch()\">\r\n <mat-icon>search</mat-icon>\r\n Search\r\n </button>\r\n </mat-card-actions>\r\n </mat-card>\r\n</div>\r\n\r\n<div *ngIf=\"displayresult\">\r\n <div class=\"mat-elevation-z8\" *ngIf=\"dataSource; else Spinner\">\r\n <table mat-table [dataSource]=\"dataSource\" matSort>\r\n <ng-container matColumnDef=\"action\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <i class=\"fal fa-plus\" (click)=\"AddObj()\" *ngIf=\"canAddThis()\">\r\n </i>\r\n </th>\r\n <td mat-cell *matCellDef=\"let obj\">\r\n <i class=\"fal fa-eye\" [routerLink]=\"displayObjLinkThis(obj)\" *ngIf=\"canDisplayObjThis(obj)\">\r\n </i>\r\n <ng-container *ngFor=\"let action of actions\">\r\n <i [ngClass]=\"action.icon\" [routerLink]=\"action.routerLinkFct(obj)\" *ngIf=\"action.icon.icon && (!action.display || action.display(obj, action.name))\">\r\n </i>\r\n <i [ngClass]=\"action.icon\" [routerLink]=\"action.routerLinkFct(obj)\" *ngIf=\"!action.icon.icon && (!action.display || action.display(obj, action.name))\"></i>\r\n </ng-container>\r\n <i class=\"fal fa-trash-alt\" (click)=\"DeleteObj(obj)\" *ngIf=\"canDeleteThis(obj)\">\r\n </i>\r\n <i class=\"fal fa-pencil\" (click)=\"EditObj(obj)\" *ngIf=\"canEditThis(obj)\">\r\n </i>\r\n </td>\r\n </ng-container>\r\n <ng-content select=\"glw-result-table\"></ng-content>\r\n <tr mat-header-row *matHeaderRowDef=\"columnsToDisplay\"></tr>\r\n <tr mat-row *matRowDef=\"let myRowData; columns: columnsToDisplay\"></tr>\r\n </table>\r\n <mat-paginator pageSize=\"10\"></mat-paginator>\r\n </div>\r\n <ng-template #Spinner>\r\n <mat-spinner></mat-spinner>\r\n </ng-template>\r\n</div>\r\n", styles: ["table{width:100%}i{cursor:pointer;padding:5px}td{padding-right:10px;padding-left:10px}\n"] }]
550
+ args: [{ selector: 'glw-display-objects', template: "<div>\r\n <ng-content select=\"glw-header\"></ng-content>\r\n</div>\r\n\r\n<div *ngIf=\"displayform\">\r\n <mat-card>\r\n <mat-card-content>\r\n <mat-error *ngIf=\"resultException\">\r\n Unable to query : {{resultException}}\r\n </mat-error>\r\n <ng-content select=\"glw-search-form\"></ng-content>\r\n <!--<ng-container *ngComponentOutlet=\"SearchForm; injector: objInjector\"></ng-container>-->\r\n <div *ngIf=\"maxrows\" [formGroup]=\"form2\">\r\n <br />\r\n <mat-form-field>\r\n <mat-select placeholder=\"MaxRow\" formControlName=\"_MaxRow_\">\r\n <mat-option *ngFor=\"let maxrow of maxrows\" [value]=\"maxrow\">\r\n <span *ngIf=\"maxrow\">{{maxrow}} objects</span>\r\n <span *ngIf=\"!maxrow\"> Default</span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </mat-card-content>\r\n <mat-card-actions>\r\n <button mat-stroked-button color=\"accent\" (click)=\"onSearch()\">\r\n <mat-icon>search</mat-icon>\r\n Search\r\n </button>\r\n </mat-card-actions>\r\n </mat-card>\r\n</div>\r\n\r\n<div [hidden]=\"!displayresult\">\r\n <!--*ngIf=\"displayresult\"-->\r\n <div class=\"mat-elevation-z8\" [hidden]=\"!dataSource\">\r\n <!--*ngIf=\"dataSource; else Spinner\"-->\r\n <table mat-table [dataSource]=\"dataSource\" matSort>\r\n <ng-container matColumnDef=\"action\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <i class=\"fal fa-plus\" (click)=\"AddObj()\" *ngIf=\"canAddThis()\">\r\n </i>\r\n </th>\r\n <td mat-cell *matCellDef=\"let obj\">\r\n <i class=\"fal fa-eye\" [routerLink]=\"displayObjLinkThis(obj)\" *ngIf=\"canDisplayObjThis(obj)\">\r\n </i>\r\n <ng-container *ngFor=\"let action of actions\">\r\n <i [ngClass]=\"action.icon\" [routerLink]=\"action.routerLinkFct(obj)\" *ngIf=\"action.icon.icon && (!action.display || action.display(obj, action.name))\">\r\n </i>\r\n <i [ngClass]=\"action.icon\" [routerLink]=\"action.routerLinkFct(obj)\" *ngIf=\"!action.icon.icon && (!action.display || action.display(obj, action.name))\"></i>\r\n </ng-container>\r\n <i class=\"fal fa-trash-alt\" (click)=\"DeleteObj(obj)\" *ngIf=\"canDeleteThis(obj)\">\r\n </i>\r\n <i class=\"fal fa-pencil\" (click)=\"EditObj(obj)\" *ngIf=\"canEditThis(obj)\">\r\n </i>\r\n </td>\r\n </ng-container>\r\n <ng-content select=\"glw-result-table\"></ng-content>\r\n <tr mat-header-row *matHeaderRowDef=\"columnsToDisplay\"></tr>\r\n <tr mat-row *matRowDef=\"let myRowData; columns: columnsToDisplay\"></tr>\r\n </table>\r\n <mat-paginator pageSize=\"10\"></mat-paginator>\r\n </div>\r\n <div #Spinner [hidden]=\"dataSource\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n</div>", styles: ["table{width:100%}i{cursor:pointer;padding:5px}\n"] }]
496
551
  }], ctorParameters: function () { return [{ type: i16.GlowwService, decorators: [{
497
552
  type: Inject,
498
553
  args: ['glowwService']
@@ -559,4 +614,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImpor
559
614
  }], AddEditor: [{
560
615
  type: Input
561
616
  }] } });
562
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGxheS1vYmplY3RzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dsb3d3L3NyYy9saWIvQ29tcG9uZW50cy9kaXNwbGF5LW9iamVjdHMvZGlzcGxheS1vYmplY3RzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dsb3d3L3NyYy9saWIvQ29tcG9uZW50cy9kaXNwbGF5LW9iamVjdHMvZGlzcGxheS1vYmplY3RzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRTNFLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFVLFNBQVMsRUFBc0ssS0FBSyxFQUFlLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzUSxPQUFPLEVBQUUsV0FBVyxFQUEwQixNQUFNLGdCQUFnQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsT0FBTyxFQUFRLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFnQixRQUFRLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRixPQUFPLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBbUQsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3RyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFOUUsT0FBTyxFQUFnQyxhQUFhLEVBQUUsVUFBVSxFQUFnQixNQUFNLHNCQUFzQixDQUFDO0FBRzdHLE9BQU8sRUFBYSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUl0RSxPQUFPLEVBQUUsR0FBRyxFQUFFLFVB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QWYsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlzcGxheU9iamVjdHNDb25maWd1cmF0aW9uIH0gZnJvbSAnLi8uLi9kaXNwbGF5LW9iamVjdHMtY29uZmlndXJhdGlvbic7XHJcbmltcG9ydCB7IFNlYXJjaEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9zZWFyY2gtZm9ybS9zZWFyY2gtZm9ybS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBSZWZlcmVuY2UgfSBmcm9tICdAYW5ndWxhci9jb21waWxlci9zcmMvcmVuZGVyMy9yM19hc3QnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgT25Jbml0LCBWaWV3Q2hpbGQsIEFmdGVyVmlld0luaXQsIEVsZW1lbnRSZWYsIERpcmVjdGl2ZSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIEluamVjdG9yLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQWZ0ZXJDb250ZW50SW5pdCwgUXVlcnlMaXN0LCBDb250ZW50Q2hpbGRyZW4sIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgSW5wdXQsIFRlbXBsYXRlUmVmLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgRm9ybUJ1aWxkZXIgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdFBhZ2luYXRvciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XHJcbmltcG9ydCB7IE1hdFNvcnQsIFNvcnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcclxuaW1wb3J0IHsgTWF0Q29sdW1uRGVmLCBNYXRUYWJsZSwgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xyXG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBmb3JrSm9pbiwgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IsIG9ic2VydmFibGUsIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4uL2hlYWRlci9oZWFkZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgUmVzdWx0VGFibGVDb21wb25lbnQgfSBmcm9tICcuLi9yZXN1bHQtdGFibGUvcmVzdWx0LXRhYmxlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IGludGVydmFsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwRXZlbnQsIEh0dHBFdmVudFR5cGUsIEh0dHBQYXJhbXMsIEh0dHBSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgRGF0YSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dDb25maWcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBHbG93d1NlcnZpY2UgfSBmcm9tICcuLi8uLi9TZXJ2aWNlcy9nbG93dy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXV0aGVudGljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZ2xvd3ctc2VjdXJpdHkvU2VydmljZXMvYXV0aGVudGljYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IE1vbWVudCB9IGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IG1hcCwgY2F0Y2hFcnJvciwgbWVyZ2VNYXAsIHRhcCwgZmlsdGVyLCBzd2l0Y2hNYXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEFjdGlvbiB7XHJcbiAgaWNvbjogYW55O1xyXG4gIG5hbWU/OiBzdHJpbmc7XHJcbiAgcm91dGVyTGlua0ZjdD86IChvYmopID0+IHN0cmluZ1tdO1xyXG4gIGRpc3BsYXk/OiAob2JqKSA9PiBib29sZWFuO1xyXG59O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdnbHctZGlzcGxheS1vYmplY3RzJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGlzcGxheS1vYmplY3RzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kaXNwbGF5LW9iamVjdHMuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGlzcGxheU9iamVjdHNDb21wb25lbnQ8VE9iaj4gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoSGVhZGVyQ29tcG9uZW50KSBoZWFkZXI6IEhlYWRlckNvbXBvbmVudDtcclxuICBAQ29udGVudENoaWxkKFNlYXJjaEZvcm1Db21wb25lbnQpIGZvcm1MYXlvdXQ6IFNlYXJjaEZvcm1Db21wb25lbnQ7XHJcbiAgQENvbnRlbnRDaGlsZChSZXN1bHRUYWJsZUNvbXBvbmVudCkgcmVzdWx0TGF5b3V0OiBSZXN1bHRUYWJsZUNvbXBvbmVudDtcclxuICBAVmlld0NoaWxkKE1hdFRhYmxlLCB7IHN0YXRpYzogZmFsc2UgfSkgdGFibGU6IE1hdFRhYmxlPGFueT47XHJcbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IsIHsgc3RhdGljOiBmYWxzZSB9KSBwYWdpbmF0b3I6IE1hdFBhZ2luYXRvcjtcclxuICBAVmlld0NoaWxkKE1hdFNvcnQsIHsgc3RhdGljOiBmYWxzZSB9KSBzb3J0OiBNYXRTb3J0O1xyXG5cclxuICAvLyBhZnRlciB0aGUgPG5nLWNvbnRlbnQ+IGhhcyBiZWVuIGluaXRpYWxpemVkLCB0aGUgY29sdW1uIGRlZmluaXRpb25zIGFyZSBhdmFpbGFibGUuXHJcbiAgLy8gQWxsIHRoYXQncyBsZWZ0IGlzIHRvIGFkZCB0aGVtIHRvIHRoZSB0YWJsZSBvdXJzZWx2ZXM6XHJcbiAgQElucHV0KCkgY29uZmlndXJhdGlvbjogRGlzcGxheU9iamVjdHNDb25maWd1cmF0aW9uPFRPYmo+O1xyXG4gIEBJbnB1dCgpIGRpc3BsYXlPYmpMaW5rOiAob2JqOiBUT2JqLCBhY3Rpb24/OiBzdHJpbmcpID0+IChzdHJpbmcgfCBzdHJpbmdbXSk7XHJcbiAgQElucHV0KCkgY2FuRGlzcGxheU9iajogKCh1c2VyOiBhbnksIG9iajogVE9iaiwgYWN0aW9uPzogc3RyaW5nKSA9PiBib29sZWFuKSB8IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBjYW5FZGl0OiAoKHVzZXI6IGFueSwgb2JqOiBUT2JqKSA9PiBib29sZWFuKSB8IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGNhbkRlbGV0ZTogKCh1c2VyOiBhbnksIG9iajogVE9iaikgPT4gYm9vbGVhbikgfCBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBjYW5BZGQ6ICgodXNlcjogYW55KSA9PiBib29sZWFuKSB8IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGZvcm06IEZvcm1Hcm91cDtcclxuICBASW5wdXQoKSBTZWFyY2hGb3JtOiBhbnk7XHJcbiAgQElucHV0KCkgc2VhcmNoUmVxdWVzdDogKG9iaj86IFRPYmogfCBhbnkpID0+IE9ic2VydmFibGU8VE9ialtdPjtcclxuICBASW5wdXQoKSBwb3N0UmVxdWVzdDogKG9iaj86IFRPYmogfCBhbnkpID0+IE9ic2VydmFibGU8VE9iaj47XHJcbiAgQElucHV0KCkgZGVsZXRlUmVxdWVzdDogKG9iaj86IFRPYmogfCBhbnkpID0+IE9ic2VydmFibGU8VE9ialtdPjtcclxuICBASW5wdXQoKSBwdXRSZXF1ZXN0OiAob2JqPzogVE9iaiB8IGFueSkgPT4gT2JzZXJ2YWJsZTxUT2JqW10+O1xyXG4gIEBJbnB1dCgpIG1heHJvd3M6IHN0cmluZ1tdO1xyXG4gIEBJbnB1dCgpIG1hbmRhdG9yeVBhcmFtczogb2JqZWN0ID0ge307XHJcbiAgQElucHV0KCkgYWN0aW9ucyA9IFtdO1xyXG4gIEBJbnB1dCgpIGRpYWxvZ0NvbmZpZzogb2JqZWN0ID0ge307XHJcbiAgLy8vLy8vL0BJbnB1dCgpIGZpbGVGaWVsZHM6IHN0cmluZ1tdO1xyXG4gIEBJbnB1dCgpIHBhcmVudDogYW55O1xyXG5cclxuICBASW5wdXQoKSBjb2x1bW5zOiAoKSA9PiBzdHJpbmdbXTtcclxuICBASW5wdXQoKSBvYmplY3ROYW1lOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcHJpbWFyeUtleTogc3RyaW5nIHwgc3RyaW5nW107XHJcbiAgQElucHV0KCkgRWRpdG9yOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBJbnB1dCgpIEFkZEVkaXRvcjogVGVtcGxhdGVSZWY8YW55PjtcclxuICBjb2x1bW5zVG9EaXNwbGF5ID0gW107XHJcbiAgZGF0YVNvdXJjZTogTWF0VGFibGVEYXRhU291cmNlPFRPYmo+O1xyXG4gIGRpc3BsYXlmb3JtID0gdHJ1ZTtcclxuICBkaXNwbGF5cmVzdWx0ID0gZmFsc2U7XHJcbiAgcXVlcnlQYXJhbXM6IGFueSA9IHt9O1xyXG4gIHJlc3VsdEV4Y2VwdGlvbjogc3RyaW5nO1xyXG4gIGN1cnJlbnRVc2VyOiBhbnk7XHJcbiAgZm9ybTI6IEZvcm1Hcm91cDtcclxuICBkYXRhOiBvYmplY3Q7XHJcbiAgcm91dGVQYXJhbXM6IG9iamVjdDtcclxuICBnbG93d1NlcnZpY2U6IEdsb3d3U2VydmljZTtcclxuXHJcbiAgY29uc3RydWN0b3IoQEluamVjdCgnZ2xvd3dTZXJ2aWNlJykgZ2xvd3dTZXJ2aWNlOiBHbG93d1NlcnZpY2UsIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLCBwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbiwgcHJpdmF0ZSBhdXRoZW50aWNhdGlvblNlcnZpY2U6IEF1dGhlbnRpY2F0aW9uU2VydmljZSwgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlKSB7XHJcbiAgICB0aGlzLmdsb3d3U2VydmljZSA9IGdsb3d3U2VydmljZTtcclxuICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXM7XHJcbiAgICB0aGlzLmN1cnJlbnRVc2VyID0gKHRoaXMuYXV0aGVudGljYXRpb25TZXJ2aWNlLmN1cnJlbnRVc2VyVmFsdWUgYXMgYW55KS5Vc2VySW5mbztcclxuICAgIHRoaXMuZm9ybTIgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgX01heFJvd186IFtudWxsXVxyXG4gICAgfSk7XHJcbiAgICAvL2RlYnVnZ2VyO1xyXG4gICAgdGhpcy5kYXRhID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhO1xyXG4gICAgdGhpcy5yb3V0ZVBhcmFtcyA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zO1xyXG4gICAgcm91dGUucGFyYW1zLnN1YnNjcmliZShyb3V0ZVBhcmFtcyA9PiB7XHJcbiAgICAgIHRoaXMucm91dGVQYXJhbXMgPSByb3V0ZVBhcmFtcztcclxuICAgICAgaWYgKHRoaXMuZGlzcGxheXJlc3VsdCkgdGhpcy5TZWFyY2goKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcblxyXG4gIH1cclxuXHJcbiAgSW5pdFJlcXVlc3QoKSB7XHJcbiAgICBpZiAoIXRoaXMuc2VhcmNoUmVxdWVzdCkge1xyXG4gICAgICB0aGlzLnNlYXJjaFJlcXVlc3QgPSB0aGlzLmdsb3d3U2VydmljZVtgc2VhcmNoJHt0aGlzLm9iamVjdE5hbWV9YF07XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMucG9zdFJlcXVlc3QpIHtcclxuICAgICAgdGhpcy5wb3N0UmVxdWVzdCA9IHRoaXMuZ2xvd3dTZXJ2aWNlW2Bwb3N0JHt0aGlzLm9iamVjdE5hbWV9YF07XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZGVsZXRlUmVxdWVzdCkge1xyXG4gICAgICB0aGlzLmRlbGV0ZVJlcXVlc3QgPSB0aGlzLmdsb3d3U2VydmljZVtgZGVsZXRlJHt0aGlzLm9iamVjdE5hbWV9YF07XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMucHV0UmVxdWVzdCkge1xyXG4gICAgICB0aGlzLnB1dFJlcXVlc3QgPSB0aGlzLmdsb3d3U2VydmljZVtgcHV0JHt0aGlzLm9iamVjdE5hbWV9YF07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzb3J0RGF0YShzb3J0OiBTb3J0KSB7XHJcbiAgICB0aGlzLnNvcnQuc29ydCh7IGlkOiBzb3J0LmFjdGl2ZSwgc3RhcnQ6IHNvcnQuZGlyZWN0aW9uID8gc29ydC5kaXJlY3Rpb24gOiBcImFzY1wiLCBkaXNhYmxlQ2xlYXI6IHRydWUgfSk7XHJcbiAgICAvL3RoaXMuc29ydC5zb3J0Q2hhbmdlLmVtaXQoc29ydCk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIGdldFZhbHVlNFNvcnQoaXRlbTogYW55LCBoZWFkZXI6IHN0cmluZyk6IHN0cmluZyB8IG51bWJlciB7XHJcbiAgICBjb25zb2xlLmxvZyhgcHJldmlld01hdGNoU29ydGluZ0ZuICR7aXRlbX0gLSAke2hlYWRlcn1gKTtcclxuICAgIHJldHVybiBpdGVtW2hlYWRlcl07XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMub2JqZWN0TmFtZSkgdGhpcy5vYmplY3ROYW1lID0gdGhpcy5wYXJlbnQub2JqZWN0TmFtZTtcclxuICAgIGlmICghdGhpcy5hY3Rpb25zIHx8IHRoaXMuYWN0aW9ucy5sZW5ndGggPT09IDApIHRoaXMuYWN0aW9ucyA9IHRoaXMucGFyZW50LmFjdGlvbnM7XHJcbiAgICBpZiAoIXRoaXMucHJpbWFyeUtleSkgdGhpcy5wcmltYXJ5S2V5ID0gdGhpcy5wYXJlbnQucHJpbWFyeUtleTtcclxuICAgIGlmICghdGhpcy5jb2x1bW5zKSB0aGlzLmNvbHVtbnMgPSB0aGlzLnBhcmVudC5jb2x1bW5zVG9EaXNwbGF5O1xyXG4gICAgaWYgKCF0aGlzLkVkaXRvcikgdGhpcy5FZGl0b3IgPSB0aGlzLnBhcmVudC5lZGl0b3I7XHJcbiAgICBpZiAoIXRoaXMuQWRkRWRpdG9yKSB0aGlzLkFkZEVkaXRvciA9IHRoaXMucGFyZW50LmFkZEVkaXRvciA/PyB0aGlzLnBhcmVudC5lZGl0b3I7XHJcbiAgICAvLy8vLy8vaWYgKCF0aGlzLmZpbGVGaWVsZHMpIHRoaXMuZmlsZUZpZWxkcyA9IHRoaXMucGFyZW50LmZpbGVGaWVsZHM7XHJcbiAgICBpZiAoIXRoaXMubWF4cm93cykgdGhpcy5tYXhyb3dzID0gdGhpcy5wYXJlbnQubWF4cm93cztcclxuXHJcbiAgICB0aGlzLkluaXRSZXF1ZXN0KCk7XHJcbiAgICBpZiAodGhpcy5tYXhyb3dzPy5sZW5ndGggPiAwKSB7IHRoaXMuZm9ybS5hZGRDb250cm9sKFwiX01heFJvd19cIiwgbmV3IEZvcm1Db250cm9sKG51bGwpKTsgfVxyXG4gICAgLy9kZWJ1Z2dlcjtcclxuICAgIGNvbnNvbGUubG9nKGBJTklUIDogZm9ybUxheW91dDoke3RoaXMuZm9ybUxheW91dH0tZGlzcGxheWZvcm06JHt0aGlzLmRpc3BsYXlmb3JtfWApXHJcbiAgICBpZiAoIXRoaXMuZm9ybUxheW91dCAmJiB0aGlzLnJlc3VsdExheW91dCkge1xyXG4gICAgICB0aGlzLmRpc3BsYXlmb3JtID0gZmFsc2U7IHRoaXMuZGlzcGxheXJlc3VsdCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLmdsb3d3U2VydmljZS5iYXNlUGF0aENoYW5nZS5zdWJzY3JpYmUobmV3VXJsID0+IHtcclxuICAgICAgY29uc29sZS5sb2coYGJhc2VQYXRoQ2hhbmdlICR7bmV3VXJsfTogZnJvbUxheW91dDoke3RoaXMuZm9ybUxheW91dH0tZGlzcGxheWZvcm06JHt0aGlzLmRpc3BsYXlmb3JtfWApO1xyXG4gICAgICB0aGlzLnBhcmVudC5mb3JtPy5yZXNldCgpO1xyXG4gICAgICBpZiAoIXRoaXMuZm9ybUxheW91dCAmJiB0aGlzLnJlc3VsdExheW91dCkge1xyXG4gICAgICAgIHRoaXMuZGlzcGxheWZvcm0gPSBmYWxzZTsgdGhpcy5kaXNwbGF5cmVzdWx0ID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5kaXNwbGF5cmVzdWx0KSB7IHRoaXMuU2VhcmNoKCk7IH1cclxuICAgIH0pO1xyXG4gICAgaWYgKHRoaXMuZGlzcGxheXJlc3VsdCkgeyB0aGlzLlNlYXJjaCgpOyB9XHJcbiAgfVxyXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcclxuXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIEluaXQoZGF0YT86IERhdGEpIHtcclxuICAgIGlmICgoZGF0YSAmJiBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPiAwKSB8fCB0aGlzLmRpc3BsYXlyZXN1bHQpIHtcclxuICAgICAgdGhpcy5TZWFyY2goZGF0YSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBTZWFyY2goZGF0YT86IERhdGEpIHtcclxuICAgIGNvbnNvbGUubG9nKGBTZWFyY2ggJHt0aGlzLmdsb3d3U2VydmljZS5JbnRlcm5hbEJhc2VQYXRofWApO1xyXG4gICAgaWYgKGRhdGEpIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICB0aGlzLmRpc3BsYXlyZXN1bHQgPSB0cnVlO1xyXG4gICAgdGhpcy5kaXNwbGF5Zm9ybSA9IGZhbHNlO1xyXG4gICAgdGhpcy5yZXN1bHRFeGNlcHRpb24gPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLmRhdGEpIHtcclxuICAgICAgT2JqZWN0LmtleXModGhpcy5kYXRhKS5mb3JFYWNoKG5hbWUgPT4ge1xyXG4gICAgICAgIHRoaXMucXVlcnlQYXJhbXNbbmFtZV0gPSB0aGlzLmRhdGFbbmFtZV07XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucm91dGVQYXJhbXMpIHtcclxuICAgICAgT2JqZWN0LmtleXModGhpcy5yb3V0ZVBhcmFtcykuZm9yRWFjaChuYW1lID0+IHtcclxuICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1zW25hbWVdID0gdGhpcy5yb3V0ZVBhcmFtc1tuYW1lXTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubWFuZGF0b3J5UGFyYW1zKSB7XHJcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMubWFuZGF0b3J5UGFyYW1zKS5mb3JFYWNoKG5hbWUgPT4ge1xyXG4gICAgICAgIHRoaXMucXVlcnlQYXJhbXNbbmFtZV0gPSB0aGlzLnF1ZXJ5UGFyYW1zW25hbWVdO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL2RlYnVnZ2VyO1xyXG4gICAgdGhpcy5zZWFyY2hSZXF1ZXN0LmNhbGwodGhpcy5nbG93d1NlcnZpY2UsIHRoaXMucXVlcnlQYXJhbXMpLnN1YnNjcmliZShyID0+IHtcclxuICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZTxUT2JqPihyKTtcclxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIHRoaXMuVXBkYXRlVGFibGUoKTtcclxuICAgIH0sXHJcbiAgICAgIGVycm9yID0+IHtcclxuICAgICAgICB0aGlzLmRpc3BsYXlyZXN1bHQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmRpc3BsYXlmb3JtID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnJlc3VsdEV4Y2VwdGlvbiA9IGVycm9yO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGNsZWFuKG9iaikge1xyXG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBpbiBvYmopIHtcclxuICAgICAgaWYgKG9ialtwcm9wTmFtZV0gPT09IG51bGwgfHwgb2JqW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgZGVsZXRlIG9ialtwcm9wTmFtZV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uU2VhcmNoKCkge1xyXG4gICAgdGhpcy5xdWVyeVBhcmFtcyA9IHt9O1xyXG4gICAgY29uc3Qgc2VhcmNoRGF0YSA9IHRoaXMucGFyZW50LmZvcm0udmFsdWUuc2VhcmNoRGF0YTtcclxuICAgIGlmIChzZWFyY2hEYXRhKSB7XHJcbiAgICAgIE9iamVjdC5rZXlzKHNlYXJjaERhdGEpLmZvckVhY2gobmFtZSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsID0gc2VhcmNoRGF0YVtuYW1lXTtcclxuICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1zW25hbWVdID0gdmFsO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZvcm0yLnZhbHVlLl9NYXhSb3dfKSB7IHRoaXMucXVlcnlQYXJhbXMuX01heFJvd18gPSB0aGlzLmZvcm0yLnZhbHVlLl9NYXhSb3dfOyB9XHJcbiAgICB0aGlzLmNsZWFuKHRoaXMucXVlcnlQYXJhbXMpO1xyXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoeyBmcm9tT2JqZWN0OiB0aGlzLnF1ZXJ5UGFyYW1zIH0pO1xyXG4gICAgY29uc3QgY3VycmVudHN0YXRlID0gdGhpcy5sb2NhdGlvbi5nZXRTdGF0ZSgpO1xyXG4gICAgdGhpcy5sb2NhdGlvbi5yZXBsYWNlU3RhdGUodGhpcy5yb3V0ZXIudXJsLCBwYXJhbXMudG9TdHJpbmcoKSk7XHJcbiAgICB0aGlzLlNlYXJjaCgpO1xyXG5cclxuICB9XHJcblxyXG4gIFVwZGF0ZURhdGFTb3VyY2UocjogVE9ialtdKSB7XHJcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPFRPYmo+KHIpO1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgdGhpcy5VcGRhdGVUYWJsZSgpO1xyXG5cclxuICB9XHJcblxyXG4gIFVwZGF0ZVRhYmxlKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YVNvdXJjZSkge1xyXG4gICAgICBpZiAoIXRoaXMudGFibGUpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnIXRoaXMudGFibGUnKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZXN1bHRMYXlvdXQuY29sdW1uRGVmcy5mb3JFYWNoKGNvbHVtbkRlZiA9PiB0aGlzLnRhYmxlLmFkZENvbHVtbkRlZihjb2x1bW5EZWYpKTtcclxuICAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuc29ydDtcclxuICAgICAgdGhpcy5kYXRhU291cmNlLnNvcnRpbmdEYXRhQWNjZXNzb3IgPSB0aGlzLmdldFZhbHVlNFNvcnQ7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBBZnRlciAgdGhpcy5kYXRhU291cmNlLnNvcnQgPSAke3RoaXMucGFyZW50LnNvcnR9YCk7XHJcbiAgICAgIHRoaXMuY29sdW1uc1RvRGlzcGxheSA9IHRoaXMuY29sdW1ucygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FuRGlzcGxheU9ialRoaXMob2JqLCBhY3Rpb24/KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoIXRoaXMuZGlzcGxheU9iakxpbmspIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5jYW5EaXNwbGF5T2JqID09PSAnYm9vbGVhbicpIHsgcmV0dXJuIHRoaXMuY2FuRGlzcGxheU9iajsgfVxyXG4gICAgICByZXR1cm4gdGhpcy5jYW5EaXNwbGF5T2JqKHRoaXMuY3VycmVudFVzZXIsIG9iaiwgYWN0aW9uKTtcclxuICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGNhbkFkZFRoaXMoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoIXRoaXMuY2FuQWRkKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgICBpZiAodHlwZW9mIHRoaXMuY2FuQWRkID09PSAnYm9vbGVhbicpIHsgcmV0dXJuIHRoaXMuY2FuQWRkOyB9XHJcbiAgICAgIHJldHVybiB0aGlzLmNhbkFkZCh0aGlzLmN1cnJlbnRVc2VyKTtcclxuICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYW5FZGl0VGhpcyhvYmopIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICghdGhpcy5jYW5FZGl0KSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgICBpZiAodHlwZW9mIHRoaXMuY2FuRWRpdCA9PT0gJ2Jvb2xlYW4nKSB7IHJldHVybiB0aGlzLmNhbkVkaXQ7IH1cclxuICAgICAgcmV0dXJuIHRoaXMuY2FuRWRpdCh0aGlzLmN1cnJlbnRVc2VyLCBvYmopO1xyXG4gICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhbkRlbGV0ZVRoaXMob2JqKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoIXRoaXMuY2FuRGVsZXRlKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgICBpZiAodHlwZW9mIHRoaXMuY2FuRGVsZXRlID09PSAnYm9vbGVhbicpIHsgcmV0dXJuIHRoaXMuY2FuRGVsZXRlOyB9XHJcbiAgICAgIHJldHVybiB0aGlzLmNhbkRlbGV0ZSh0aGlzLmN1cnJlbnRVc2VyLCBvYmopO1xyXG4gICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkaXNwbGF5T2JqTGlua1RoaXMob2JqLCBhY3Rpb24/KSB7XHJcbiAgICBpZiAoIXRoaXMuZGlzcGxheU9iakxpbmspIHsgcmV0dXJuIG51bGw7IH1cclxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlPYmpMaW5rKG9iaiwgYWN0aW9uKTtcclxuICB9XHJcblxyXG5cclxuICBpc1N0cmluZyh2YWx1ZSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmc7XHJcbiAgfVxyXG4gIGdldFByaW1hcnlLZXkob2JqOiBvYmplY3QgfCBUT2JqKTogb2JqZWN0W10ge1xyXG4gICAgbGV0IHJlcyA9IFtdO1xyXG4gICAgaWYgKHRoaXMuaXNTdHJpbmcodGhpcy5wcmltYXJ5S2V5KSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcInN0cmluZ1wiKTtcclxuICAgICAgcmVzLnB1c2gob2JqW3RoaXMucHJpbWFyeUtleSBhcyBzdHJpbmddKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwic3RyaW5nW11cIik7XHJcbiAgICAgICh0aGlzLnByaW1hcnlLZXkgYXMgc3RyaW5nW10pLmZvckVhY2goa2V5ID0+IHJlcy5wdXNoKG9ialtrZXldKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgX3NhdmVPYmoob2JqOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgdmFyIHN1YmplY3QgPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgICB0aGlzLnBvc3RSZXF1ZXN0LmNhbGwodGhpcy5nbG93d1NlcnZpY2UsIG9iaikuc3Vic2NyaWJlKFxyXG4gICAgICBkYXRhID0+IHtcclxuICAgICAgICBjb25zdCB0bXAgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YTtcclxuICAgICAgICB0bXAucHVzaChkYXRhKTtcclxuICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRtcDtcclxuICAgICAgICBzdWJqZWN0Lm5leHQoZGF0YSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yID0+IHtcclxuICAgICAgICBhbGVydChgVW5hYmxlIHRvIGFkZCBPYmplY3QgJHtlcnJvci5zdGF0dXN9ICR7ZXJyb3Iuc3RhdHVzVGV4dH1cXG4ke2Vycm9yLk1lc3NhZ2V9XFxuJHtlcnJvci5lcnJvcn1gKTtcclxuICAgICAgICBzdWJqZWN0LmVycm9yKGVycm9yKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgIHJldHVybiBzdWJqZWN0O1xyXG4gIH1cclxuICBfc2F2ZUZpbGUoZmlsZUZpZWxkOiBzdHJpbmcsIG9iajogYW55LCBmaWxlOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcclxuICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUuZGF0YSk7XHJcbiAgICByZXR1cm4gdGhpcy5nbG93d1NlcnZpY2VbYHBvc3Qke3RoaXMub2JqZWN0TmFtZX0ke2ZpbGVGaWVsZH1gXS5jYWxsKHRoaXMuZ2xvd3dTZXJ2aWNlLCB0aGlzLmdldFByaW1hcnlLZXkob2JqKSwgZm9ybURhdGEpLnBpcGUoXHJcbiAgICAgIHRhcCgoZXZlbnQ6IEh0dHBFdmVudDxhbnk+KSA9PiB7XHJcbiAgICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7XHJcbiAgICAgICAgICBjYXNlIEh0dHBFdmVudFR5cGUuVXBsb2FkUHJvZ3Jlc3M6XHJcbiAgICAgICAgICAgIGZpbGUucHJvZ3Jlc3MgPSBNYXRoLnJvdW5kKGV2ZW50LmxvYWRlZCAqIDEwMCAvIChldmVudC50b3RhbCA/PyAxKSk7XHJcbiAgICAgICAgICAgIGZpbGUuaW5Qcm9ncmVzcyA9IGZpbGUucHJvZ3Jlc3MgIT09IDEwMDtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIEh0dHBFdmVudFR5cGUuUmVzcG9uc2U6XHJcbiAgICAgICAgICAgIGZpbGUucHJvZ3Jlc3MgPSAxMDA7XHJcbiAgICAgICAgICAgIGZpbGUuc3RhdHVzID0gXCJEb25lXCI7XHJcbiAgICAgICAgICAgIGZpbGUuaW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgICBmaWx0ZXIoKGV2ZW50OiBIdHRwRXZlbnQ8YW55PikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBmaWx0ZXIgJHtldmVudC50eXBlfWApO1xyXG4gICAgICAgIHJldHVybiBldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLlJlc3BvbnNlXHJcbiAgICAgIH0pLFxyXG4gICAgICBtYXAoKGV2ZW50OiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBtYXAgJHtldmVudC50eXBlfWApO1xyXG4gICAgICAgIGNvbnN0IHRtcCA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhO1xyXG4gICAgICAgIHRtcFt0bXAuaW5kZXhPZihvYmopXSA9IGV2ZW50LmJvZHk7XHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSB0bXA7XHJcbiAgICAgICAgY29uc29sZS5sb2coYGFmdGVyIHJlcGxhY2UuLi5gKTtcclxuICAgICAgICByZXR1cm4gZXZlbnQuYm9keTtcclxuICAgICAgfSksXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGZpbGUuaW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgICAgIGZpbGUuc3RhdHVzID0gXCJFcnJvclwiO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGAke2ZpbGUuZGF0YS5uYW1lfSB1cGxvYWQgZmFpbGVkLmApO1xyXG4gICAgICAgIC8vc3ViamVjdC5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgcmV0dXJuIG9mKGAke2ZpbGUuZGF0YS5uYW1lfSB1cGxvYWQgZmFpbGVkLmApO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIEFkZE9iaigpIHtcclxuICAgIGNvbnN0IGRpYWxvZ0NvbmZpZyA9IG5ldyBNYXREaWFsb2dDb25maWcoKTtcclxuICAgIGRpYWxvZ0NvbmZpZy5kaXNhYmxlQ2xvc2UgPSB0cnVlO1xyXG4gICAgZGlhbG9nQ29uZmlnLmF1dG9Gb2N1cyA9IHRydWU7XHJcbiAgICBkaWFsb2dDb25maWcuY2xvc2VPbk5hdmlnYXRpb24gPSBmYWxzZTtcclxuICAgIGRpYWxvZ0NvbmZpZy5tYXhIZWlnaHQgPSBcIjk1JVwiO1xyXG4gICAgZGlhbG9nQ29uZmlnLm1heFdpZHRoID0gXCI5NSVcIjtcclxuICAgIGRpYWxvZ0NvbmZpZy5oZWlnaHQgPSBcIjEwMCVcIlxyXG4gICAgaWYgKHRoaXMuZGlhbG9nQ29uZmlnKSB7XHJcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuZGlhbG9nQ29uZmlnKS5mb3JFYWNoKFxyXG4gICAgICAgIG5hbWUgPT4ge1xyXG4gICAgICAgICAgZGlhbG9nQ29uZmlnW25hbWVdID0gdGhpcy5kaWFsb2dDb25maWdbbmFtZV07XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgbGV0IGFyZ3MgPSB7fTtcclxuICAgIE9iamVjdC5rZXlzKHRoaXMucm91dGUuc25hcHNob3Q/LnBhcmFtcykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICBhcmdzW2tleV0gPSB0aGlzLnJvdXRlLnNuYXBzaG90Py5wYXJhbXNba2V5XTtcclxuICAgICAgZGlhbG9nQ29uZmlnLmRhdGEgPSBhcmdzO1xyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIGNvbnN0IGRsZyA9IHRoaXMuZGlhbG9nLm9wZW4odGhpcy5BZGRFZGl0b3IsIGRpYWxvZ0NvbmZpZyk7XHJcbiAgICBkbGcuY29tcG9uZW50SW5zdGFuY2UuY2FsbGJhY2sgPSAoXHJcbiAgICAgIGRhdGEgPT4ge1xyXG4gICAgICAgIGxldCBkYXRhY29weSA9IHsgLi4uZGF0YSB9O1xyXG4gICAgICAgIGNvbnN0IGZpbGVGaWVsZHMgPSAodGhpcy5FZGl0b3IgYXMgYW55KS5maWxlRmllbGRzO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBmaWxlRmllbGRzICR7ZmlsZUZpZWxkcz8ubGVuZ3RofWApO1xyXG4gICAgICAgIGlmIChmaWxlRmllbGRzPy5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgLy8gVW4gc2V1bCBjaGFtcCwgaWwgcGV1dCDDqnRyZSBtdWx0aXBsZVxyXG4gICAgICAgICAgY29uc3QgZmlsZUZpZWxkID0gZmlsZUZpZWxkc1swXTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGBmaWxlRmllbGQgJHtmaWxlRmllbGR9YCk7XHJcbiAgICAgICAgICBjb25zdCBmaWxlcyA9IGRhdGFjb3B5W2ZpbGVGaWVsZF07XHJcbiAgICAgICAgICBkZWxldGUgZGF0YWNvcHlbZmlsZUZpZWxkXTtcclxuICAgICAgICAgIGNvbnN0IGFsbG9iczogeyBba2V5OiBzdHJpbmddOiBPYnNlcnZhYmxlPGFueT47IH0gPSB7fVxyXG4gICAgICAgICAgZmlsZXMuZm9yRWFjaChmaWxlID0+IHtcclxuICAgICAgICAgICAgaWYgKGZpbGUuc3RhdHV0ICE9PSAnRG9uZScgJiYgZmlsZS5zdGF0dXQgIT09ICdFcnJvcicpIHtcclxuICAgICAgICAgICAgICBjb25zdCBvYnMgPSB0aGlzLl9zYXZlT2JqKGRhdGFjb3B5KS5waXBlKFxyXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKG5ld2RhdGEgPT4gdGhpcy5fc2F2ZUZpbGUoZmlsZUZpZWxkLCBuZXdkYXRhLCBmaWxlKVxyXG4gICAgICAgICAgICAgICAgKSk7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coYGZpbGUuZmlsZU5hbWUgJHtmaWxlLmZpbGVOYW1lfWApO1xyXG4gICAgICAgICAgICAgIGFsbG9ic1tmaWxlLmZpbGVOYW1lXSA9IG9icztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICByZXR1cm4gY29tYmluZUxhdGVzdChhbGxvYnMpLnBpcGUodGFrZSgxKSk7XHJcblxyXG4gICAgICAgIH0gZWxzZSBpZiAoZmlsZUZpZWxkcz8ubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgLy8gUGx1c2lldXJzIGNoYW1wcyBmaWxlLCBpbCBuZSBwZXV0IHkgYXZvaXIgcXUndW5lIHNldWwgZmljaGllciBwYXIgY2hhbXAuXHJcbiAgICAgICAgICBjb25zdCBmaWVsZHMgPSB7fTtcclxuICAgICAgICAgIGZpbGVGaWVsZHMuZm9yRWFjaChmZiA9PiB7XHJcbiAgICAgICAgICAgIGZpZWxkc1tmZl0gPSBkYXRhY29weVtmZl07XHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRhY29weVtmZl07XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zYXZlT2JqKGRhdGFjb3B5KS5waXBlKFxyXG4gICAgICAgICAgICAgIG1lcmdlTWFwKG5ld2RhdGEgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIGFsbG9iczogT2JzZXJ2YWJsZTxhbnk+W10gPSBbXTtcclxuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGZpZWxkcykuZm9yRWFjaCgoW2ZpbGVGaWVsZCwgZmlsZXNdOiBbc3RyaW5nLCBhbnlbXV0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBhbGxvYnMucHVzaCh0aGlzLl9zYXZlRmlsZShmaWxlRmllbGQsIG5ld2RhdGEsIGZpbGVzWzBdKSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9ya0pvaW4oYWxsb2JzKTsgLy8gVE9ETyA6IFBBUyBURVJNSU5FLi4uIEpBTUFJUyBVVElMSVNFLi4uXHJcbiAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gRm9ybSBzYW5zIGZpY2hpZXJcclxuICAgICAgICAgIHJldHVybiB0aGlzLl9zYXZlT2JqKGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIERlbGV0ZU9iaihvYmopIHtcclxuICAgIGlmIChjb25maXJtKCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgb2JqZXQgPyAnKSkge1xyXG4gICAgICB0aGlzLmRlbGV0ZVJlcXVlc3QuYXBwbHkodGhpcy5nbG93d1NlcnZpY2UsIHRoaXMuZ2V0UHJpbWFyeUtleShvYmopKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgcCA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpID0gdGhpcy5kYXRhU291cmNlLmRhdGEuaW5kZXhPZihvYmopO1xyXG4gICAgICAgICAgY29uc3QgdG1wID0gdGhpcy5kYXRhU291cmNlLmRhdGE7XHJcbiAgICAgICAgICB0bXAuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSB0bXA7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICBhbGVydChgVW5hYmxlIHRvIGRlbGV0ZSBPYmplY3QgJHtlcnJvci5zdGF0dXN9ICR7ZXJyb3Iuc3RhdHVzVGV4dH1cXG4ke2Vycm9yLk1lc3NhZ2V9XFxuJHtlcnJvci5lcnJvcn1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBfdXBkYXRlT2JqKGN1cnJlbnQ6IGFueSwgbmV3RGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGxldCBhcmdzOiBvYmplY3RbXSA9IHRoaXMuZ2V0UHJpbWFyeUtleShjdXJyZW50KTsgYXJncy5wdXNoKG5ld0RhdGEpO1xyXG4gICAgdmFyIHN1YmplY3QgPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgICB0aGlzLnB1dFJlcXVlc3QuYXBwbHkodGhpcy5nbG93d1NlcnZpY2UsIGFyZ3MpLnN1YnNjcmliZShcclxuICAgICAgZGF0YSA9PiB7XHJcbiAgICAgICAgY29uc3QgaSA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmluZGV4T2YoY3VycmVudCk7XHJcbiAgICAgICAgY29uc3QgdG1wID0gdGhpcy5kYXRhU291cmNlLmRhdGE7XHJcbiAgICAgICAgdG1wW2ldID0gZGF0YTtcclxuICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRtcDtcclxuICAgICAgICBzdWJqZWN0Lm5leHQoZGF0YSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yID0+IHtcclxuICAgICAgICBhbGVydChgVW5hYmxlIHRvIHVwZGF0ZSBPYmplY3QgJHtlcnJvci5zdGF0dXN9ICR7ZXJyb3Iuc3RhdHVzVGV4dH1cXG4ke2Vycm9yLk1lc3NhZ2V9XFxuJHtlcnJvci5lcnJvcn1gKTtcclxuICAgICAgICBzdWJqZWN0LmVycm9yKGVycm9yKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgIHJldHVybiBzdWJqZWN0O1xyXG4gIH1cclxuXHJcblxyXG4gIEVkaXRPYmoob2JqOiBUT2JqKSB7XHJcbiAgICBjb25zdCBkaWFsb2dDb25maWcgPSBuZXcgTWF0RGlhbG9nQ29uZmlnKCk7XHJcbiAgICBkaWFsb2dDb25maWcuZGlzYWJsZUNsb3NlID0gdHJ1ZTtcclxuICAgIGRpYWxvZ0NvbmZpZy5hdXRvRm9jdXMgPSB0cnVlO1xyXG4gICAgZGlhbG9nQ29uZmlnLmNsb3NlT25OYXZpZ2F0aW9uID0gZmFsc2U7XHJcbiAgICBkaWFsb2dDb25maWcubWF4SGVpZ2h0ID0gXCI5NSVcIjtcclxuICAgIGRpYWxvZ0NvbmZpZy5tYXhXaWR0aCA9IFwiOTUlXCI7XHJcbiAgICBkaWFsb2dDb25maWcuaGVpZ2h0ID0gXCIxMDAlXCJcclxuXHJcbiAgICBpZiAodGhpcy5kaWFsb2dDb25maWcpIHtcclxuICAgICAgT2JqZWN0LmtleXModGhpcy5kaWFsb2dDb25maWcpLmZvckVhY2goXHJcbiAgICAgICAgbmFtZSA9PiB7XHJcbiAgICAgICAgICBkaWFsb2dDb25maWdbbmFtZV0gPSB0aGlzLmRpYWxvZ0NvbmZpZ1tuYW1lXTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjdXJyZW50ID0geyAuLi5vYmogfTtcclxuICAgIGRpYWxvZ0NvbmZpZy5kYXRhID0gb2JqO1xyXG4gICAgY29uc3QgZGxnID0gdGhpcy5kaWFsb2cub3Blbih0aGlzLkVkaXRvciwgZGlhbG9nQ29uZmlnKTtcclxuICAgIGRsZy5jb21wb25lbnRJbnN0YW5jZS5jYWxsYmFjayA9IChcclxuICAgICAgZGF0YSA9PiB7XHJcbiAgICAgICAgbGV0IGRhdGFjb3B5ID0geyAuLi5kYXRhIH07XHJcbiAgICAgICAgY29uc3QgZmlsZUZpZWxkcyA9ICh0aGlzLkVkaXRvciBhcyBhbnkpLmZpbGVGaWVsZHM7XHJcbiAgICAgICAgaWYgKGZpbGVGaWVsZHM/Lmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAvLyBVbiBzZXVsIGNoYW1wLCBpbCBwZXV0IMOqdHJlIG11bHRpcGxlXHJcbiAgICAgICAgICBjb25zdCBmaWxlRmllbGQgPSBmaWxlRmllbGRzWzBdO1xyXG4gICAgICAgICAgY29uc3QgZmlsZXMgPSBkYXRhY29weVtmaWxlRmllbGRdO1xyXG4gICAgICAgICAgZGVsZXRlIGRhdGFjb3B5W2ZpbGVGaWVsZF07XHJcbiAgICAgICAgICBjb25zdCBhbGxvYnM6IHsgW2tleTogc3RyaW5nXTogT2JzZXJ2YWJsZTxhbnk+OyB9ID0ge31cclxuICAgICAgICAgIGZpbGVzLmZvckVhY2goZmlsZSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChmaWxlLnN0YXR1dCAhPT0gJ0RvbmUnICYmIGZpbGUuc3RhdHV0ICE9PSAnRXJyb3InKSB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgb2JzID0gdGhpcy5fdXBkYXRlT2JqKGN1cnJlbnQsIGRhdGFjb3B5KS5waXBlKFxyXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKG5ld2RhdGEgPT4gdGhpcy5fc2F2ZUZpbGUoZmlsZUZpZWxkLCBuZXdkYXRhLCBmaWxlKVxyXG4gICAgICAgICAgICAgICAgKSk7XHJcbiAgICAgICAgICAgICAgYWxsb2JzW2ZpbGUuZmlsZU5hbWVdID0gb2JzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KGFsbG9icykucGlwZSh0YWtlKDEpKTtcclxuXHJcbiAgICAgICAgfSBlbHNlIGlmIChmaWxlRmllbGRzPy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAvLyBQbHVzaWV1cnMgY2hhbXBzIGZpbGUsIGlsIG5lIHBldXQgeSBhdm9pciBxdSd1bmUgc2V1bCBmaWNoaWVyIHBhciBjaGFtcC5cclxuICAgICAgICAgIGNvbnN0IGZpZWxkcyA9IHt9O1xyXG4gICAgICAgICAgZmlsZUZpZWxkcy5mb3JFYWNoKGZmID0+IHtcclxuICAgICAgICAgICAgZmllbGRzW2ZmXSA9IGRhdGFjb3B5W2ZmXTtcclxuICAgICAgICAgICAgZGVsZXRlIGRhdGFjb3B5W2ZmXTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZU9iaihjdXJyZW50LCBkYXRhY29weSkucGlwZShcclxuICAgICAgICAgICAgICBtZXJnZU1hcChuZXdkYXRhID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciBhbGxvYnM6IE9ic2VydmFibGU8YW55PltdID0gW107XHJcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhmaWVsZHMpLmZvckVhY2goKFtmaWxlRmllbGQsIGZpbGVzXTogW3N0cmluZywgYW55W11dKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxsb2JzLnB1c2godGhpcy5fc2F2ZUZpbGUoZmlsZUZpZWxkLCBuZXdkYXRhLCBmaWxlc1swXSkpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKGFsbG9icyk7IC8vIFRPRE8gOiBQQVMgVEVSTUlORS4uLiBKQU1BSVMgVVRJTElTRS4uLlxyXG4gICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIEZvcm0gc2FucyBmaWNoaWVyXHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlT2JqKGN1cnJlbnQsIGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG59XHJcbiIsIjxkaXY+XHJcbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJnbHctaGVhZGVyXCI+PC9uZy1jb250ZW50PlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgKm5nSWY9XCJkaXNwbGF5Zm9ybVwiPlxyXG4gICAgPG1hdC1jYXJkPlxyXG4gICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicmVzdWx0RXhjZXB0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICBVbmFibGUgdG8gcXVlcnkgOiB7e3Jlc3VsdEV4Y2VwdGlvbn19XHJcbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJnbHctc2VhcmNoLWZvcm1cIj48L25nLWNvbnRlbnQ+XHJcbiAgICAgICAgICAgIDwhLS08bmctY29udGFpbmVyICpuZ0NvbXBvbmVudE91dGxldD1cIlNlYXJjaEZvcm07IGluamVjdG9yOiBvYmpJbmplY3RvclwiPjwvbmctY29udGFpbmVyPi0tPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibWF4cm93c1wiIFtmb3JtR3JvdXBdPVwiZm9ybTJcIj5cclxuICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IHBsYWNlaG9sZGVyPVwiTWF4Um93XCIgZm9ybUNvbnRyb2xOYW1lPVwiX01heFJvd19cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG1heHJvdyBvZiBtYXhyb3dzXCIgW3ZhbHVlXT1cIm1heHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtYXhyb3dcIj57e21heHJvd319IG9iamVjdHM8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFtYXhyb3dcIj4gRGVmYXVsdDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cclxuICAgICAgICA8bWF0LWNhcmQtYWN0aW9ucz5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gY29sb3I9XCJhY2NlbnRcIiAoY2xpY2spPVwib25TZWFyY2goKVwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5zZWFyY2g8L21hdC1pY29uPlxyXG4gICAgICAgIFNlYXJjaFxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L21hdC1jYXJkLWFjdGlvbnM+XHJcbiAgICA8L21hdC1jYXJkPlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgKm5nSWY9XCJkaXNwbGF5cmVzdWx0XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWF0LWVsZXZhdGlvbi16OFwiICpuZ0lmPVwiZGF0YVNvdXJjZTsgZWxzZSBTcGlubmVyXCI+XHJcbiAgICAgICAgPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCIgbWF0U29ydD5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYWwgZmEtcGx1c1wiIChjbGljayk9XCJBZGRPYmooKVwiICpuZ0lmPVwiY2FuQWRkVGhpcygpXCI+XHJcbiAgICAgICAgICA8L2k+XHJcbiAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IG9ialwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFsIGZhLWV5ZVwiIFtyb3V0ZXJMaW5rXT1cImRpc3BsYXlPYmpMaW5rVGhpcyhvYmopXCIgKm5nSWY9XCJjYW5EaXNwbGF5T2JqVGhpcyhvYmopXCI+XHJcbiAgICAgICAgICA8L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGFjdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgW25nQ2xhc3NdPVwiYWN0aW9uLmljb25cIiBbcm91dGVyTGlua109XCJhY3Rpb24ucm91dGVyTGlua0ZjdChvYmopXCIgKm5nSWY9XCJhY3Rpb24uaWNvbi5pY29uICYmICghYWN0aW9uLmRpc3BsYXkgfHwgYWN0aW9uLmRpc3BsYXkob2JqLCBhY3Rpb24ubmFtZSkpXCI+XHJcbiAgICAgICAgICAgIDwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgW25nQ2xhc3NdPVwiYWN0aW9uLmljb25cIiBbcm91dGVyTGlua109XCJhY3Rpb24ucm91dGVyTGlua0ZjdChvYmopXCIgKm5nSWY9XCIhYWN0aW9uLmljb24uaWNvbiAmJiAoIWFjdGlvbi5kaXNwbGF5IHx8IGFjdGlvbi5kaXNwbGF5KG9iaiwgYWN0aW9uLm5hbWUpKVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhbCBmYS10cmFzaC1hbHRcIiAoY2xpY2spPVwiRGVsZXRlT2JqKG9iailcIiAqbmdJZj1cImNhbkRlbGV0ZVRoaXMob2JqKVwiPlxyXG4gICAgICAgICAgPC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFsIGZhLXBlbmNpbFwiIChjbGljayk9XCJFZGl0T2JqKG9iailcIiAqbmdJZj1cImNhbkVkaXRUaGlzKG9iailcIj5cclxuICAgICAgICAgIDwvaT5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJnbHctcmVzdWx0LXRhYmxlXCI+PC9uZy1jb250ZW50PlxyXG4gICAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImNvbHVtbnNUb0Rpc3BsYXlcIj48L3RyPlxyXG4gICAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IG15Um93RGF0YTsgY29sdW1uczogY29sdW1uc1RvRGlzcGxheVwiPjwvdHI+XHJcbiAgICAgICAgPC90YWJsZT5cclxuICAgICAgICA8bWF0LXBhZ2luYXRvciBwYWdlU2l6ZT1cIjEwXCI+PC9tYXQtcGFnaW5hdG9yPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bmctdGVtcGxhdGUgI1NwaW5uZXI+XHJcbiAgICAgICAgPG1hdC1zcGlubmVyPjwvbWF0LXNwaW5uZXI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG48L2Rpdj5cclxuIl19
617
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGxheS1vYmplY3RzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dsb3d3L3NyYy9saWIvQ29tcG9uZW50cy9kaXNwbGF5LW9iamVjdHMvZGlzcGxheS1vYmplY3RzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dsb3d3L3NyYy9saWIvQ29tcG9uZW50cy9kaXNwbGF5LW9iamVjdHMvZGlzcGxheS1vYmplY3RzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRTNFLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFVLFNBQVMsRUFBc0ssS0FBSyxFQUFlLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzUSxPQUFPLEVBQUUsV0FBVyxFQUEwQixNQUFNLGdCQUFnQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsT0FBTyxFQUFRLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFnQixRQUFRLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRixPQUFPLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBbUQsRUFBRSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0gsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRTlFLE9BQU8sRUFBZ0MsYUFBYSxFQUFFLFVBQVUsRUFBZ0IsTUFBTSxzQkFBc0IsQ0FBQztBQUU3RyxPQUFPLEVBQXdCLGFBQWEsRUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBQzlFLE9BQU8sRUFBYSxl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TztzQkFBZixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXNwbGF5T2JqZWN0c0NvbmZpZ3VyYXRpb24gfSBmcm9tICcuLy4uL2Rpc3BsYXktb2JqZWN0cy1jb25maWd1cmF0aW9uJztcclxuaW1wb3J0IHsgU2VhcmNoRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL3NlYXJjaC1mb3JtL3NlYXJjaC1mb3JtLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFJlZmVyZW5jZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyL3NyYy9yZW5kZXIzL3IzX2FzdCc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgQ29udGVudENoaWxkLCBPbkluaXQsIFZpZXdDaGlsZCwgQWZ0ZXJWaWV3SW5pdCwgRWxlbWVudFJlZiwgRGlyZWN0aXZlLCBDaGFuZ2VEZXRlY3RvclJlZiwgSW5qZWN0b3IsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBBZnRlckNvbnRlbnRJbml0LCBRdWVyeUxpc3QsIENvbnRlbnRDaGlsZHJlbiwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBJbnB1dCwgVGVtcGxhdGVSZWYsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBGb3JtQnVpbGRlciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0UGFnaW5hdG9yIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuaW1wb3J0IHsgTWF0U29ydCwgU29ydCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xyXG5pbXBvcnQgeyBNYXRDb2x1bW5EZWYsIE1hdFRhYmxlLCBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XHJcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIGZvcmtKb2luLCBPYmplY3RVbnN1YnNjcmliZWRFcnJvciwgb2JzZXJ2YWJsZSwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuLi9oZWFkZXIvaGVhZGVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFJlc3VsdFRhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi4vcmVzdWx0LXRhYmxlL3Jlc3VsdC10YWJsZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBpbnRlcnZhbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cEV2ZW50LCBIdHRwRXZlbnRUeXBlLCBIdHRwUGFyYW1zLCBIdHRwUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIERhdGEsIE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nQ29uZmlnIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgR2xvd3dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vU2VydmljZXMvZ2xvd3cuc2VydmljZSc7XHJcbmltcG9ydCB7IEF1dGhlbnRpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2dsb3d3LXNlY3VyaXR5L1NlcnZpY2VzL2F1dGhlbnRpY2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNb21lbnQgfSBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgeyBtYXAsIGNhdGNoRXJyb3IsIG1lcmdlTWFwLCB0YXAsIGZpbHRlciwgc3dpdGNoTWFwLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBY3Rpb24ge1xyXG4gIGljb246IGFueTtcclxuICBuYW1lPzogc3RyaW5nO1xyXG4gIHJvdXRlckxpbmtGY3Q/OiAob2JqKSA9PiBzdHJpbmdbXTtcclxuICBkaXNwbGF5PzogKG9iaikgPT4gYm9vbGVhbjtcclxufTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZ2x3LWRpc3BsYXktb2JqZWN0cycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2Rpc3BsYXktb2JqZWN0cy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZGlzcGxheS1vYmplY3RzLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIERpc3BsYXlPYmplY3RzQ29tcG9uZW50PFRPYmo+IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xyXG5cclxuICBAQ29udGVudENoaWxkKEhlYWRlckNvbXBvbmVudCkgaGVhZGVyOiBIZWFkZXJDb21wb25lbnQ7XHJcbiAgQENvbnRlbnRDaGlsZChTZWFyY2hGb3JtQ29tcG9uZW50KSBmb3JtTGF5b3V0OiBTZWFyY2hGb3JtQ29tcG9uZW50O1xyXG4gIEBDb250ZW50Q2hpbGQoUmVzdWx0VGFibGVDb21wb25lbnQpIHJlc3VsdExheW91dDogUmVzdWx0VGFibGVDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZChNYXRUYWJsZSwgeyBzdGF0aWM6IGZhbHNlIH0pIHRhYmxlOiBNYXRUYWJsZTxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoTWF0UGFnaW5hdG9yLCB7IHN0YXRpYzogZmFsc2UgfSkgcGFnaW5hdG9yOiBNYXRQYWdpbmF0b3I7XHJcbiAgQFZpZXdDaGlsZChNYXRTb3J0LCB7IHN0YXRpYzogZmFsc2UgfSkgc29ydDogTWF0U29ydDtcclxuXHJcbiAgLy8gYWZ0ZXIgdGhlIDxuZy1jb250ZW50PiBoYXMgYmVlbiBpbml0aWFsaXplZCwgdGhlIGNvbHVtbiBkZWZpbml0aW9ucyBhcmUgYXZhaWxhYmxlLlxyXG4gIC8vIEFsbCB0aGF0J3MgbGVmdCBpcyB0byBhZGQgdGhlbSB0byB0aGUgdGFibGUgb3Vyc2VsdmVzOlxyXG4gIEBJbnB1dCgpIGNvbmZpZ3VyYXRpb246IERpc3BsYXlPYmplY3RzQ29uZmlndXJhdGlvbjxUT2JqPjtcclxuICBASW5wdXQoKSBkaXNwbGF5T2JqTGluazogKG9iajogVE9iaiwgYWN0aW9uPzogc3RyaW5nKSA9PiAoc3RyaW5nIHwgc3RyaW5nW10pO1xyXG4gIEBJbnB1dCgpIGNhbkRpc3BsYXlPYmo6ICgodXNlcjogYW55LCBvYmo6IFRPYmosIGFjdGlvbj86IHN0cmluZykgPT4gYm9vbGVhbikgfCBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgY2FuRWRpdDogKCh1c2VyOiBhbnksIG9iajogVE9iaikgPT4gYm9vbGVhbikgfCBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBjYW5EZWxldGU6ICgodXNlcjogYW55LCBvYmo6IFRPYmopID0+IGJvb2xlYW4pIHwgYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgY2FuQWRkOiAoKHVzZXI6IGFueSkgPT4gYm9vbGVhbikgfCBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBmb3JtOiBGb3JtR3JvdXA7XHJcbiAgQElucHV0KCkgU2VhcmNoRm9ybTogYW55O1xyXG4gIEBJbnB1dCgpIHNlYXJjaFJlcXVlc3Q6IChvYmo/OiBUT2JqIHwgYW55KSA9PiBPYnNlcnZhYmxlPFRPYmpbXT47XHJcbiAgQElucHV0KCkgcG9zdFJlcXVlc3Q6IChvYmo/OiBUT2JqIHwgYW55KSA9PiBPYnNlcnZhYmxlPFRPYmo+O1xyXG4gIEBJbnB1dCgpIGRlbGV0ZVJlcXVlc3Q6IChvYmo/OiBUT2JqIHwgYW55KSA9PiBPYnNlcnZhYmxlPFRPYmpbXT47XHJcbiAgQElucHV0KCkgcHV0UmVxdWVzdDogKG9iaj86IFRPYmogfCBhbnkpID0+IE9ic2VydmFibGU8VE9ialtdPjtcclxuICBASW5wdXQoKSBtYXhyb3dzOiBzdHJpbmdbXTtcclxuICBASW5wdXQoKSBtYW5kYXRvcnlQYXJhbXM6IG9iamVjdCA9IHt9O1xyXG4gIEBJbnB1dCgpIGFjdGlvbnMgPSBbXTtcclxuICBASW5wdXQoKSBkaWFsb2dDb25maWc6IG9iamVjdCA9IHt9O1xyXG4gIC8vLy8vLy9ASW5wdXQoKSBmaWxlRmllbGRzOiBzdHJpbmdbXTtcclxuICBASW5wdXQoKSBwYXJlbnQ6IGFueTtcclxuXHJcbiAgQElucHV0KCkgY29sdW1uczogKCkgPT4gc3RyaW5nW107XHJcbiAgQElucHV0KCkgb2JqZWN0TmFtZTogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHByaW1hcnlLZXk6IHN0cmluZyB8IHN0cmluZ1tdO1xyXG4gIEBJbnB1dCgpIEVkaXRvcjogVGVtcGxhdGVSZWY8YW55PjtcclxuICBASW5wdXQoKSBBZGRFZGl0b3I6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgY29sdW1uc1RvRGlzcGxheSA9IFtdO1xyXG4gIGRhdGFTb3VyY2U6IE1hdFRhYmxlRGF0YVNvdXJjZTxUT2JqPjtcclxuICBkaXNwbGF5Zm9ybSA9IHRydWU7XHJcbiAgZGlzcGxheXJlc3VsdCA9IGZhbHNlO1xyXG4gIHF1ZXJ5UGFyYW1zOiBhbnkgPSB7fTtcclxuICByZXN1bHRFeGNlcHRpb246IHN0cmluZztcclxuICBjdXJyZW50VXNlcjogYW55O1xyXG4gIGZvcm0yOiBGb3JtR3JvdXA7XHJcbiAgZGF0YTogb2JqZWN0O1xyXG4gIHJvdXRlUGFyYW1zOiBvYmplY3Q7XHJcbiAgZ2xvd3dTZXJ2aWNlOiBHbG93d1NlcnZpY2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoJ2dsb3d3U2VydmljZScpIGdsb3d3U2VydmljZTogR2xvd3dTZXJ2aWNlLCBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZywgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlciwgcHJpdmF0ZSBsb2NhdGlvbjogTG9jYXRpb24sIHByaXZhdGUgYXV0aGVudGljYXRpb25TZXJ2aWNlOiBBdXRoZW50aWNhdGlvblNlcnZpY2UsIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLCBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSkge1xyXG4gICAgdGhpcy5nbG93d1NlcnZpY2UgPSBnbG93d1NlcnZpY2U7XHJcbiAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzO1xyXG4gICAgdGhpcy5jdXJyZW50VXNlciA9ICh0aGlzLmF1dGhlbnRpY2F0aW9uU2VydmljZS5jdXJyZW50VXNlclZhbHVlIGFzIGFueSkuVXNlckluZm87XHJcbiAgICB0aGlzLmZvcm0yID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIF9NYXhSb3dfOiBbbnVsbF1cclxuICAgIH0pO1xyXG4gICAgLy9kZWJ1Z2dlcjtcclxuICAgIHRoaXMuZGF0YSA9IHRoaXMucm91dGUuc25hcHNob3QuZGF0YTtcclxuICAgIHRoaXMucm91dGVQYXJhbXMgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtcztcclxuICAgIHJvdXRlLnBhcmFtcy5zdWJzY3JpYmUocm91dGVQYXJhbXMgPT4ge1xyXG4gICAgICB0aGlzLnJvdXRlUGFyYW1zID0gcm91dGVQYXJhbXM7XHJcbiAgICAgIGlmICh0aGlzLmRpc3BsYXlyZXN1bHQpIHRoaXMuU2VhcmNoKCk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIEluaXRSZXF1ZXN0KCkge1xyXG4gICAgaWYgKCF0aGlzLnNlYXJjaFJlcXVlc3QpIHtcclxuICAgICAgdGhpcy5zZWFyY2hSZXF1ZXN0ID0gdGhpcy5nbG93d1NlcnZpY2VbYHNlYXJjaCR7dGhpcy5vYmplY3ROYW1lfWBdO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnBvc3RSZXF1ZXN0KSB7XHJcbiAgICAgIHRoaXMucG9zdFJlcXVlc3QgPSB0aGlzLmdsb3d3U2VydmljZVtgcG9zdCR7dGhpcy5vYmplY3ROYW1lfWBdO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmRlbGV0ZVJlcXVlc3QpIHtcclxuICAgICAgdGhpcy5kZWxldGVSZXF1ZXN0ID0gdGhpcy5nbG93d1NlcnZpY2VbYGRlbGV0ZSR7dGhpcy5vYmplY3ROYW1lfWBdO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnB1dFJlcXVlc3QpIHtcclxuICAgICAgdGhpcy5wdXRSZXF1ZXN0ID0gdGhpcy5nbG93d1NlcnZpY2VbYHB1dCR7dGhpcy5vYmplY3ROYW1lfWBdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc29ydERhdGEoc29ydDogU29ydCkge1xyXG4gICAgdGhpcy5zb3J0LnNvcnQoeyBpZDogc29ydC5hY3RpdmUsIHN0YXJ0OiBzb3J0LmRpcmVjdGlvbiA/IHNvcnQuZGlyZWN0aW9uIDogXCJhc2NcIiwgZGlzYWJsZUNsZWFyOiB0cnVlIH0pO1xyXG4gICAgLy90aGlzLnNvcnQuc29ydENoYW5nZS5lbWl0KHNvcnQpO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBnZXRWYWx1ZTRTb3J0KGl0ZW06IGFueSwgaGVhZGVyOiBzdHJpbmcgfCBvYmplY3QpOiBzdHJpbmcgfCBudW1iZXIge1xyXG4gICAgbGV0IGZjdCA9IFwiXCI7XHJcbiAgICBsZXQgcGFydHMgPSBbXTtcclxuICAgIGlmICh0eXBlb2YgaGVhZGVyID09PSAnb2JqZWN0Jykge1xyXG4gICAgICBmY3QgPSBoZWFkZXJbXCJmY3RcIl07XHJcbiAgICAgIHBhcnRzID0gaGVhZGVyW1wicGFydHNcIl07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmxvZyhgcHJldmlld01hdGNoU29ydGluZ0ZuICR7aXRlbX0gLSAke2hlYWRlcn1gKTtcclxuICAgICAgY29uc3QgaGVhZGVyRmN0ID0gaGVhZGVyLnNwbGl0KFwiLS0tXCIpO1xyXG4gICAgICBmY3QgPSBudWxsO1xyXG4gICAgICBpZiAoaGVhZGVyRmN0Lmxlbmd0aCA9PT0gMikgeyBmY3QgPSBoZWFkZXJGY3RbMV07IH1cclxuICAgICAgcGFydHMgPSBoZWFkZXJGY3RbMF0uc3BsaXQoXCIuXCIpO1xyXG4gICAgfVxyXG4gICAgbGV0IHJlcyA9IGl0ZW07XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHJlcyA9IHJlc1twYXJ0c1tpXV07XHJcbiAgICAgIGlmICghcmVzKSByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHN3aXRjaCAoZmN0KSB7XHJcbiAgICAgIGNhc2UgXCJpbnNlbnNpdGl2ZVwiOlxyXG4gICAgICAgIHJldHVybiByZXMudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5vYmplY3ROYW1lKSB0aGlzLm9iamVjdE5hbWUgPSB0aGlzLnBhcmVudC5vYmplY3ROYW1lO1xyXG4gICAgaWYgKCF0aGlzLmFjdGlvbnMgfHwgdGhpcy5hY3Rpb25zLmxlbmd0aCA9PT0gMCkgdGhpcy5hY3Rpb25zID0gdGhpcy5wYXJlbnQuYWN0aW9ucztcclxuICAgIGlmICghdGhpcy5wcmltYXJ5S2V5KSB0aGlzLnByaW1hcnlLZXkgPSB0aGlzLnBhcmVudC5wcmltYXJ5S2V5O1xyXG4gICAgaWYgKCF0aGlzLmNvbHVtbnMpIHRoaXMuY29sdW1ucyA9IHRoaXMucGFyZW50LmNvbHVtbnNUb0Rpc3BsYXk7XHJcbiAgICBpZiAoIXRoaXMuRWRpdG9yKSB0aGlzLkVkaXRvciA9IHRoaXMucGFyZW50LmVkaXRvcjtcclxuICAgIGlmICghdGhpcy5BZGRFZGl0b3IpIHRoaXMuQWRkRWRpdG9yID0gdGhpcy5wYXJlbnQuYWRkRWRpdG9yID8/IHRoaXMucGFyZW50LmVkaXRvcjtcclxuICAgIC8vLy8vLy9pZiAoIXRoaXMuZmlsZUZpZWxkcykgdGhpcy5maWxlRmllbGRzID0gdGhpcy5wYXJlbnQuZmlsZUZpZWxkcztcclxuICAgIGlmICghdGhpcy5tYXhyb3dzKSB0aGlzLm1heHJvd3MgPSB0aGlzLnBhcmVudC5tYXhyb3dzO1xyXG5cclxuICAgIHRoaXMuSW5pdFJlcXVlc3QoKTtcclxuICAgIGlmICh0aGlzLm1heHJvd3M/Lmxlbmd0aCA+IDApIHsgdGhpcy5mb3JtLmFkZENvbnRyb2woXCJfTWF4Um93X1wiLCBuZXcgRm9ybUNvbnRyb2wobnVsbCkpOyB9XHJcbiAgICAvL2RlYnVnZ2VyO1xyXG4gICAgY29uc29sZS5sb2coYElOSVQgOiBmb3JtTGF5b3V0OiR7dGhpcy5mb3JtTGF5b3V0fS1kaXNwbGF5Zm9ybToke3RoaXMuZGlzcGxheWZvcm19YClcclxuICAgIGlmICghdGhpcy5mb3JtTGF5b3V0ICYmIHRoaXMucmVzdWx0TGF5b3V0KSB7XHJcbiAgICAgIHRoaXMuZGlzcGxheWZvcm0gPSBmYWxzZTsgdGhpcy5kaXNwbGF5cmVzdWx0ID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMuZ2xvd3dTZXJ2aWNlLmJhc2VQYXRoQ2hhbmdlLnN1YnNjcmliZShuZXdVcmwgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhgYmFzZVBhdGhDaGFuZ2UgJHtuZXdVcmx9OiBmcm9tTGF5b3V0OiR7dGhpcy5mb3JtTGF5b3V0fS1kaXNwbGF5Zm9ybToke3RoaXMuZGlzcGxheWZvcm19YCk7XHJcbiAgICAgIHRoaXMucGFyZW50LmZvcm0/LnJlc2V0KCk7XHJcbiAgICAgIGlmICghdGhpcy5mb3JtTGF5b3V0ICYmIHRoaXMucmVzdWx0TGF5b3V0KSB7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5Zm9ybSA9IGZhbHNlOyB0aGlzLmRpc3BsYXlyZXN1bHQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmRpc3BsYXlyZXN1bHQpIHsgdGhpcy5TZWFyY2goKTsgfVxyXG4gICAgfSk7XHJcbiAgICBpZiAodGhpcy5kaXNwbGF5cmVzdWx0KSB7IHRoaXMuU2VhcmNoKCk7IH1cclxuICB9XHJcbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbmF2U3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMubmF2U3Vic2NyaXB0aW9uID0gdGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZSgoZTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkge1xyXG4gICAgICAgIHRoaXMucGFyZW50LmZvcm0/LnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5Zm9ybSA9IHRydWU7IHRoaXMuZGlzcGxheXJlc3VsdCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG51bGw7XHJcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1MYXlvdXQgJiYgdGhpcy5yZXN1bHRMYXlvdXQpIHtcclxuICAgICAgICAgIHRoaXMuZGlzcGxheWZvcm0gPSBmYWxzZTsgdGhpcy5kaXNwbGF5cmVzdWx0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZGlzcGxheXJlc3VsdCkgeyB0aGlzLlNlYXJjaCgpOyB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLm5hdlN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTsgLy8gdGhpcyBwcmV2ZW50cyBhIG1lbW9yeSBsZWFrXHJcbiAgfVxyXG5cclxuICBJbml0KGRhdGE/OiBEYXRhKSB7XHJcbiAgICBpZiAoKGRhdGEgJiYgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID4gMCkgfHwgdGhpcy5kaXNwbGF5cmVzdWx0KSB7XHJcbiAgICAgIHRoaXMuU2VhcmNoKGRhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgU2VhcmNoKGRhdGE/OiBEYXRhKSB7XHJcbiAgICBjb25zb2xlLmxvZyhgU2VhcmNoICR7dGhpcy5nbG93d1NlcnZpY2UuSW50ZXJuYWxCYXNlUGF0aH1gKTtcclxuICAgIGlmIChkYXRhKSB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgdGhpcy5kaXNwbGF5cmVzdWx0ID0gdHJ1ZTtcclxuICAgIHRoaXMuZGlzcGxheWZvcm0gPSBmYWxzZTtcclxuICAgIHRoaXMucmVzdWx0RXhjZXB0aW9uID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5kYXRhKSB7XHJcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuZGF0YSkuZm9yRWFjaChuYW1lID0+IHtcclxuICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1zW25hbWVdID0gdGhpcy5kYXRhW25hbWVdO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnJvdXRlUGFyYW1zKSB7XHJcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMucm91dGVQYXJhbXMpLmZvckVhY2gobmFtZSA9PiB7XHJcbiAgICAgICAgdGhpcy5xdWVyeVBhcmFtc1tuYW1lXSA9IHRoaXMucm91dGVQYXJhbXNbbmFtZV07XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm1hbmRhdG9yeVBhcmFtcykge1xyXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLm1hbmRhdG9yeVBhcmFtcykuZm9yRWFjaChuYW1lID0+IHtcclxuICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1zW25hbWVdID0gdGhpcy5xdWVyeVBhcmFtc1tuYW1lXTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnF1ZXJ5UGFyYW1zWydfX2d1aWQnXSA9IChNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCkpLnN1YnN0cmluZygyKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcIkJlZm9yZSBzZWFyY2hSZXF1ZXN0XCIpO1xyXG4gICAgLy9kZWJ1Z2dlcjtcclxuICAgIHRoaXMuc2VhcmNoUmVxdWVzdC5jYWxsKHRoaXMuZ2xvd3dTZXJ2aWNlLCB0aGlzLnF1ZXJ5UGFyYW1zKS5zdWJzY3JpYmUociA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwic2VhcmNoIGRvbmVcIik7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZTxUT2JqPihyKTtcclxuICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICBhbGVydChgJHtleH1gKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zb2xlLmxvZyhcImRhdGFTb3VyY2UgY2hhbmdlZFwiKTtcclxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIHRoaXMuVXBkYXRlVGFibGUoKTtcclxuICAgIH0sXHJcbiAgICAgIGVycm9yID0+IHtcclxuICAgICAgICB0aGlzLmRpc3BsYXlyZXN1bHQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmRpc3BsYXlmb3JtID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnJlc3VsdEV4Y2VwdGlvbiA9IGVycm9yO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGNsZWFuKG9iaikge1xyXG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBpbiBvYmopIHtcclxuICAgICAgaWYgKG9ialtwcm9wTmFtZV0gPT09IG51bGwgfHwgb2JqW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgZGVsZXRlIG9ialtwcm9wTmFtZV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uU2VhcmNoKCkge1xyXG4gICAgdGhpcy5xdWVyeVBhcmFtcyA9IHt9O1xyXG4gICAgY29uc3Qgc2VhcmNoRGF0YSA9IHRoaXMucGFyZW50LmZvcm0udmFsdWUuc2VhcmNoRGF0YTtcclxuICAgIGlmIChzZWFyY2hEYXRhKSB7XHJcbiAgICAgIE9iamVjdC5rZXlzKHNlYXJjaERhdGEpLmZvckVhY2gobmFtZSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsID0gc2VhcmNoRGF0YVtuYW1lXTtcclxuICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1zW25hbWVdID0gdmFsO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZvcm0yLnZhbHVlLl9NYXhSb3dfKSB7IHRoaXMucXVlcnlQYXJhbXMuX01heFJvd18gPSB0aGlzLmZvcm0yLnZhbHVlLl9NYXhSb3dfOyB9XHJcbiAgICB0aGlzLmNsZWFuKHRoaXMucXVlcnlQYXJhbXMpO1xyXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoeyBmcm9tT2JqZWN0OiB0aGlzLnF1ZXJ5UGFyYW1zIH0pO1xyXG4gICAgY29uc3QgY3VycmVudHN0YXRlID0gdGhpcy5sb2NhdGlvbi5nZXRTdGF0ZSgpO1xyXG4gICAgdGhpcy5sb2NhdGlvbi5yZXBsYWNlU3RhdGUodGhpcy5yb3V0ZXIudXJsLCBwYXJhbXMudG9TdHJpbmcoKSk7XHJcbiAgICB0aGlzLlNlYXJjaCgpO1xyXG5cclxuICB9XHJcblxyXG4gIFVwZGF0ZURhdGFTb3VyY2UocjogVE9ialtdKSB7XHJcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPFRPYmo+KHIpO1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgdGhpcy5VcGRhdGVUYWJsZSgpO1xyXG5cclxuICB9XHJcblxyXG4gIFVwZGF0ZVRhYmxlKCkge1xyXG4gICAgY29uc29sZS5sb2coXCJVcGRhdGVUYWJsZSgpXCIpO1xyXG4gICAgaWYgKHRoaXMuZGF0YVNvdXJjZSkge1xyXG4gICAgICBpZiAoIXRoaXMudGFibGUpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnIXRoaXMudGFibGUnKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZXN1bHRMYXlvdXQuY29sdW1uRGVmcy5mb3JFYWNoKGNvbHVtbkRlZiA9PiB0aGlzLnRhYmxlLmFkZENvbHVtbkRlZihjb2x1bW5EZWYpKTtcclxuICAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuc29ydDtcclxuICAgICAgdGhpcy5kYXRhU291cmNlLnNvcnRpbmdEYXRhQWNjZXNzb3IgPSB0aGlzLmdldFZhbHVlNFNvcnQ7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBBZnRlciAgdGhpcy5kYXRhU291cmNlLnNvcnQgPSAke3RoaXMucGFyZW50LnNvcnR9YCk7XHJcbiAgICAgIHRoaXMuY29sdW1uc1RvRGlzcGxheSA9IHRoaXMuY29sdW1ucygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FuRGlzcGxheU9ialRoaXMob2JqLCBhY3Rpb24/KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoIXRoaXMuZGlzcGxheU9iakxpbmspIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5jYW5EaXNwbGF5T2JqID09PSAnYm9vbGVhbicpIHsgcmV0dXJuIHRoaXMuY2FuRGlzcGxheU9iajsgfVxyXG4gICAgICByZXR1cm4gdGhpcy5jYW5EaXNwbGF5T2JqKHRoaXMuY3VycmVudFVzZXIsIG9iaiwgYWN0aW9uKTtcclxuICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGNhbkFkZFRoaXMoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoIXRoaXMuY2FuQWRkKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgICBpZiAodHlwZW9mIHRoaXMuY2FuQWRkID09PSAnYm9vbGVhbicpIHsgcmV0dXJuIHRoaXMuY2FuQWRkOyB9XHJcbiAgICAgIHJldHVybiB0aGlzLmNhbkFkZCh0aGlzLmN1cnJlbnRVc2VyKTtcclxuICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYW5FZGl0VGhpcyhvYmopIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICghdGhpcy5jYW5FZGl0KSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgICBpZiAodHlwZW9mIHRoaXMuY2FuRWRpdCA9PT0gJ2Jvb2xlYW4nKSB7IHJldHVybiB0aGlzLmNhbkVkaXQ7IH1cclxuICAgICAgcmV0dXJuIHRoaXMuY2FuRWRpdCh0aGlzLmN1cnJlbnRVc2VyLCBvYmopO1xyXG4gICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhbkRlbGV0ZVRoaXMob2JqKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoIXRoaXMuY2FuRGVsZXRlKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgICBpZiAodHlwZW9mIHRoaXMuY2FuRGVsZXRlID09PSAnYm9vbGVhbicpIHsgcmV0dXJuIHRoaXMuY2FuRGVsZXRlOyB9XHJcbiAgICAgIHJldHVybiB0aGlzLmNhbkRlbGV0ZSh0aGlzLmN1cnJlbnRVc2VyLCBvYmopO1xyXG4gICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkaXNwbGF5T2JqTGlua1RoaXMob2JqLCBhY3Rpb24/KSB7XHJcbiAgICBpZiAoIXRoaXMuZGlzcGxheU9iakxpbmspIHsgcmV0dXJuIG51bGw7IH1cclxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlPYmpMaW5rKG9iaiwgYWN0aW9uKTtcclxuICB9XHJcblxyXG5cclxuICBpc1N0cmluZyh2YWx1ZSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmc7XHJcbiAgfVxyXG4gIGdldFByaW1hcnlLZXkob2JqOiBvYmplY3QgfCBUT2JqKTogb2JqZWN0W10ge1xyXG4gICAgbGV0IHJlcyA9IFtdO1xyXG4gICAgaWYgKHRoaXMuaXNTdHJpbmcodGhpcy5wcmltYXJ5S2V5KSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcInN0cmluZ1wiKTtcclxuICAgICAgcmVzLnB1c2gob2JqW3RoaXMucHJpbWFyeUtleSBhcyBzdHJpbmddKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwic3RyaW5nW11cIik7XHJcbiAgICAgICh0aGlzLnByaW1hcnlLZXkgYXMgc3RyaW5nW10pLmZvckVhY2goa2V5ID0+IHJlcy5wdXNoKG9ialtrZXldKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgX3NhdmVPYmoob2JqOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgdmFyIHN1YmplY3QgPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgICB0aGlzLnBvc3RSZXF1ZXN0LmNhbGwodGhpcy5nbG93d1NlcnZpY2UsIG9iaikuc3Vic2NyaWJlKFxyXG4gICAgICBkYXRhID0+IHtcclxuICAgICAgICBjb25zdCB0bXAgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YTtcclxuICAgICAgICB0bXAucHVzaChkYXRhKTtcclxuICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRtcDtcclxuICAgICAgICBzdWJqZWN0Lm5leHQoZGF0YSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yID0+IHtcclxuICAgICAgICBhbGVydChgVW5hYmxlIHRvIGFkZCBPYmplY3QgJHtlcnJvci5zdGF0dXN9ICR7ZXJyb3Iuc3RhdHVzVGV4dH1cXG4ke2Vycm9yLk1lc3NhZ2V9XFxuJHtlcnJvci5lcnJvcn1gKTtcclxuICAgICAgICBzdWJqZWN0LmVycm9yKGVycm9yKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgIHJldHVybiBzdWJqZWN0O1xyXG4gIH1cclxuICBfc2F2ZUZpbGUoZmlsZUZpZWxkOiBzdHJpbmcsIG9iajogYW55LCBmaWxlOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcclxuICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUuZGF0YSk7XHJcbiAgICByZXR1cm4gdGhpcy5nbG93d1NlcnZpY2VbYHBvc3Qke3RoaXMub2JqZWN0TmFtZX0ke2ZpbGVGaWVsZH1gXS5jYWxsKHRoaXMuZ2xvd3dTZXJ2aWNlLCB0aGlzLmdldFByaW1hcnlLZXkob2JqKSwgZm9ybURhdGEpLnBpcGUoXHJcbiAgICAgIHRhcCgoZXZlbnQ6IEh0dHBFdmVudDxhbnk+KSA9PiB7XHJcbiAgICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7XHJcbiAgICAgICAgICBjYXNlIEh0dHBFdmVudFR5cGUuVXBsb2FkUHJvZ3Jlc3M6XHJcbiAgICAgICAgICAgIGZpbGUucHJvZ3Jlc3MgPSBNYXRoLnJvdW5kKGV2ZW50LmxvYWRlZCAqIDEwMCAvIChldmVudC50b3RhbCA/PyAxKSk7XHJcbiAgICAgICAgICAgIGZpbGUuaW5Qcm9ncmVzcyA9IGZpbGUucHJvZ3Jlc3MgIT09IDEwMDtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIEh0dHBFdmVudFR5cGUuUmVzcG9uc2U6XHJcbiAgICAgICAgICAgIGZpbGUucHJvZ3Jlc3MgPSAxMDA7XHJcbiAgICAgICAgICAgIGZpbGUuc3RhdHVzID0gXCJEb25lXCI7XHJcbiAgICAgICAgICAgIGZpbGUuaW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgICBmaWx0ZXIoKGV2ZW50OiBIdHRwRXZlbnQ8YW55PikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBmaWx0ZXIgJHtldmVudC50eXBlfWApO1xyXG4gICAgICAgIHJldHVybiBldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLlJlc3BvbnNlXHJcbiAgICAgIH0pLFxyXG4gICAgICBtYXAoKGV2ZW50OiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBtYXAgJHtldmVudC50eXBlfWApO1xyXG4gICAgICAgIGNvbnN0IHRtcCA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhO1xyXG4gICAgICAgIHRtcFt0bXAuaW5kZXhPZihvYmopXSA9IGV2ZW50LmJvZHk7XHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSB0bXA7XHJcbiAgICAgICAgY29uc29sZS5sb2coYGFmdGVyIHJlcGxhY2UuLi5gKTtcclxuICAgICAgICByZXR1cm4gZXZlbnQuYm9keTtcclxuICAgICAgfSksXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGZpbGUuaW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgICAgIGZpbGUuc3RhdHVzID0gXCJFcnJvclwiO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGAke2ZpbGUuZGF0YS5uYW1lfSB1cGxvYWQgZmFpbGVkLmApO1xyXG4gICAgICAgIC8vc3ViamVjdC5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgcmV0dXJuIG9mKGAke2ZpbGUuZGF0YS5uYW1lfSB1cGxvYWQgZmFpbGVkLmApO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIEFkZE9iaigpIHtcclxuICAgIGNvbnN0IGRpYWxvZ0NvbmZpZyA9IG5ldyBNYXREaWFsb2dDb25maWcoKTtcclxuICAgIGRpYWxvZ0NvbmZpZy5kaXNhYmxlQ2xvc2UgPSB0cnVlO1xyXG4gICAgZGlhbG9nQ29uZmlnLmF1dG9Gb2N1cyA9IHRydWU7XHJcbiAgICBkaWFsb2dDb25maWcuY2xvc2VPbk5hdmlnYXRpb24gPSBmYWxzZTtcclxuICAgIGRpYWxvZ0NvbmZpZy5tYXhIZWlnaHQgPSBcIjk1JVwiO1xyXG4gICAgZGlhbG9nQ29uZmlnLm1heFdpZHRoID0gXCI5NSVcIjtcclxuICAgIGRpYWxvZ0NvbmZpZy5oZWlnaHQgPSBcIjEwMCVcIlxyXG4gICAgaWYgKHRoaXMuZGlhbG9nQ29uZmlnKSB7XHJcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuZGlhbG9nQ29uZmlnKS5mb3JFYWNoKFxyXG4gICAgICAgIG5hbWUgPT4ge1xyXG4gICAgICAgICAgZGlhbG9nQ29uZmlnW25hbWVdID0gdGhpcy5kaWFsb2dDb25maWdbbmFtZV07XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgbGV0IGFyZ3MgPSB7fTtcclxuICAgIE9iamVjdC5rZXlzKHRoaXMucm91dGUuc25hcHNob3Q/LnBhcmFtcykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICBhcmdzW2tleV0gPSB0aGlzLnJvdXRlLnNuYXBzaG90Py5wYXJhbXNba2V5XTtcclxuICAgICAgZGlhbG9nQ29uZmlnLmRhdGEgPSBhcmdzO1xyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIGNvbnN0IGRsZyA9IHRoaXMuZGlhbG9nLm9wZW4odGhpcy5BZGRFZGl0b3IsIGRpYWxvZ0NvbmZpZyk7XHJcbiAgICBkbGcuY29tcG9uZW50SW5zdGFuY2UuY2FsbGJhY2sgPSAoXHJcbiAgICAgIGRhdGEgPT4ge1xyXG4gICAgICAgIGxldCBkYXRhY29weSA9IHsgLi4uZGF0YSB9O1xyXG4gICAgICAgIGNvbnN0IGZpbGVGaWVsZHMgPSAodGhpcy5FZGl0b3IgYXMgYW55KS5maWxlRmllbGRzO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBmaWxlRmllbGRzICR7ZmlsZUZpZWxkcz8ubGVuZ3RofWApO1xyXG4gICAgICAgIGlmIChmaWxlRmllbGRzPy5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgLy8gVW4gc2V1bCBjaGFtcCwgaWwgcGV1dCDDqnRyZSBtdWx0aXBsZVxyXG4gICAgICAgICAgY29uc3QgZmlsZUZpZWxkID0gZmlsZUZpZWxkc1swXTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGBmaWxlRmllbGQgJHtmaWxlRmllbGR9YCk7XHJcbiAgICAgICAgICBjb25zdCBmaWxlcyA9IGRhdGFjb3B5W2ZpbGVGaWVsZF07XHJcbiAgICAgICAgICBkZWxldGUgZGF0YWNvcHlbZmlsZUZpZWxkXTtcclxuICAgICAgICAgIGNvbnN0IGFsbG9iczogeyBba2V5OiBzdHJpbmddOiBPYnNlcnZhYmxlPGFueT47IH0gPSB7fVxyXG4gICAgICAgICAgZmlsZXMuZm9yRWFjaChmaWxlID0+IHtcclxuICAgICAgICAgICAgaWYgKGZpbGUuc3RhdHV0ICE9PSAnRG9uZScgJiYgZmlsZS5zdGF0dXQgIT09ICdFcnJvcicpIHtcclxuICAgICAgICAgICAgICBjb25zdCBvYnMgPSB0aGlzLl9zYXZlT2JqKGRhdGFjb3B5KS5waXBlKFxyXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKG5ld2RhdGEgPT4gdGhpcy5fc2F2ZUZpbGUoZmlsZUZpZWxkLCBuZXdkYXRhLCBmaWxlKVxyXG4gICAgICAgICAgICAgICAgKSk7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coYGZpbGUuZmlsZU5hbWUgJHtmaWxlLmZpbGVOYW1lfWApO1xyXG4gICAgICAgICAgICAgIGFsbG9ic1tmaWxlLmZpbGVOYW1lXSA9IG9icztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICByZXR1cm4gY29tYmluZUxhdGVzdChhbGxvYnMpLnBpcGUodGFrZSgxKSk7XHJcblxyXG4gICAgICAgIH0gZWxzZSBpZiAoZmlsZUZpZWxkcz8ubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgLy8gUGx1c2lldXJzIGNoYW1wcyBmaWxlLCBpbCBuZSBwZXV0IHkgYXZvaXIgcXUndW5lIHNldWwgZmljaGllciBwYXIgY2hhbXAuXHJcbiAgICAgICAgICBjb25zdCBmaWVsZHMgPSB7fTtcclxuICAgICAgICAgIGZpbGVGaWVsZHMuZm9yRWFjaChmZiA9PiB7XHJcbiAgICAgICAgICAgIGZpZWxkc1tmZl0gPSBkYXRhY29weVtmZl07XHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRhY29weVtmZl07XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zYXZlT2JqKGRhdGFjb3B5KS5waXBlKFxyXG4gICAgICAgICAgICAgIG1lcmdlTWFwKG5ld2RhdGEgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIGFsbG9iczogT2JzZXJ2YWJsZTxhbnk+W10gPSBbXTtcclxuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGZpZWxkcykuZm9yRWFjaCgoW2ZpbGVGaWVsZCwgZmlsZXNdOiBbc3RyaW5nLCBhbnlbXV0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBhbGxvYnMucHVzaCh0aGlzLl9zYXZlRmlsZShmaWxlRmllbGQsIG5ld2RhdGEsIGZpbGVzWzBdKSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9ya0pvaW4oYWxsb2JzKTsgLy8gVE9ETyA6IFBBUyBURVJNSU5FLi4uIEpBTUFJUyBVVElMSVNFLi4uXHJcbiAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gRm9ybSBzYW5zIGZpY2hpZXJcclxuICAgICAgICAgIHJldHVybiB0aGlzLl9zYXZlT2JqKGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIERlbGV0ZU9iaihvYmopIHtcclxuICAgIGlmIChjb25maXJtKCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgb2JqZXQgPyAnKSkge1xyXG4gICAgICB0aGlzLmRlbGV0ZVJlcXVlc3QuYXBwbHkodGhpcy5nbG93d1NlcnZpY2UsIHRoaXMuZ2V0UHJpbWFyeUtleShvYmopKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgcCA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpID0gdGhpcy5kYXRhU291cmNlLmRhdGEuaW5kZXhPZihvYmopO1xyXG4gICAgICAgICAgY29uc3QgdG1wID0gdGhpcy5kYXRhU291cmNlLmRhdGE7XHJcbiAgICAgICAgICB0bXAuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSB0bXA7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICBhbGVydChgVW5hYmxlIHRvIGRlbGV0ZSBPYmplY3QgJHtlcnJvci5zdGF0dXN9ICR7ZXJyb3Iuc3RhdHVzVGV4dH1cXG4ke2Vycm9yLk1lc3NhZ2V9XFxuJHtlcnJvci5lcnJvcn1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBfdXBkYXRlT2JqKGN1cnJlbnQ6IGFueSwgbmV3RGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGxldCBhcmdzOiBvYmplY3RbXSA9IHRoaXMuZ2V0UHJpbWFyeUtleShjdXJyZW50KTsgYXJncy5wdXNoKG5ld0RhdGEpO1xyXG4gICAgdmFyIHN1YmplY3QgPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgICB0aGlzLnB1dFJlcXVlc3QuYXBwbHkodGhpcy5nbG93d1NlcnZpY2UsIGFyZ3MpLnN1YnNjcmliZShcclxuICAgICAgZGF0YSA9PiB7XHJcbiAgICAgICAgY29uc3QgaSA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmluZGV4T2YoY3VycmVudCk7XHJcbiAgICAgICAgY29uc3QgdG1wID0gdGhpcy5kYXRhU291cmNlLmRhdGE7XHJcbiAgICAgICAgdG1wW2ldID0gZGF0YTtcclxuICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRtcDtcclxuICAgICAgICBzdWJqZWN0Lm5leHQoZGF0YSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yID0+IHtcclxuICAgICAgICBhbGVydChgVW5hYmxlIHRvIHVwZGF0ZSBPYmplY3QgJHtlcnJvci5zdGF0dXN9ICR7ZXJyb3Iuc3RhdHVzVGV4dH1cXG4ke2Vycm9yLk1lc3NhZ2V9XFxuJHtlcnJvci5lcnJvcn1gKTtcclxuICAgICAgICBzdWJqZWN0LmVycm9yKGVycm9yKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgIHJldHVybiBzdWJqZWN0O1xyXG4gIH1cclxuXHJcblxyXG4gIEVkaXRPYmoob2JqOiBUT2JqKSB7XHJcbiAgICBjb25zdCBkaWFsb2dDb25maWcgPSBuZXcgTWF0RGlhbG9nQ29uZmlnKCk7XHJcbiAgICBkaWFsb2dDb25maWcuZGlzYWJsZUNsb3NlID0gdHJ1ZTtcclxuICAgIGRpYWxvZ0NvbmZpZy5hdXRvRm9jdXMgPSB0cnVlO1xyXG4gICAgZGlhbG9nQ29uZmlnLmNsb3NlT25OYXZpZ2F0aW9uID0gZmFsc2U7XHJcbiAgICBkaWFsb2dDb25maWcubWF4SGVpZ2h0ID0gXCI5NSVcIjtcclxuICAgIGRpYWxvZ0NvbmZpZy5tYXhXaWR0aCA9IFwiOTUlXCI7XHJcbiAgICBkaWFsb2dDb25maWcuaGVpZ2h0ID0gXCIxMDAlXCJcclxuXHJcbiAgICBpZiAodGhpcy5kaWFsb2dDb25maWcpIHtcclxuICAgICAgT2JqZWN0LmtleXModGhpcy5kaWFsb2dDb25maWcpLmZvckVhY2goXHJcbiAgICAgICAgbmFtZSA9PiB7XHJcbiAgICAgICAgICBkaWFsb2dDb25maWdbbmFtZV0gPSB0aGlzLmRpYWxvZ0NvbmZpZ1tuYW1lXTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjdXJyZW50ID0geyAuLi5vYmogfTtcclxuICAgIGRpYWxvZ0NvbmZpZy5kYXRhID0gb2JqO1xyXG4gICAgY29uc3QgZGxnID0gdGhpcy5kaWFsb2cub3Blbih0aGlzLkVkaXRvciwgZGlhbG9nQ29uZmlnKTtcclxuICAgIGRsZy5jb21wb25lbnRJbnN0YW5jZS5jYWxsYmFjayA9IChcclxuICAgICAgZGF0YSA9PiB7XHJcbiAgICAgICAgbGV0IGRhdGFjb3B5ID0geyAuLi5kYXRhIH07XHJcbiAgICAgICAgY29uc3QgZmlsZUZpZWxkcyA9ICh0aGlzLkVkaXRvciBhcyBhbnkpLmZpbGVGaWVsZHM7XHJcbiAgICAgICAgaWYgKGZpbGVGaWVsZHM/Lmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAvLyBVbiBzZXVsIGNoYW1wLCBpbCBwZXV0IMOqdHJlIG11bHRpcGxlXHJcbiAgICAgICAgICBjb25zdCBmaWxlRmllbGQgPSBmaWxlRmllbGRzWzBdO1xyXG4gICAgICAgICAgY29uc3QgZmlsZXMgPSBkYXRhY29weVtmaWxlRmllbGRdO1xyXG4gICAgICAgICAgZGVsZXRlIGRhdGFjb3B5W2ZpbGVGaWVsZF07XHJcbiAgICAgICAgICBjb25zdCBhbGxvYnM6IHsgW2tleTogc3RyaW5nXTogT2JzZXJ2YWJsZTxhbnk+OyB9ID0ge31cclxuICAgICAgICAgIGZpbGVzLmZvckVhY2goZmlsZSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChmaWxlLnN0YXR1dCAhPT0gJ0RvbmUnICYmIGZpbGUuc3RhdHV0ICE9PSAnRXJyb3InKSB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgb2JzID0gdGhpcy5fdXBkYXRlT2JqKGN1cnJlbnQsIGRhdGFjb3B5KS5waXBlKFxyXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKG5ld2RhdGEgPT4gdGhpcy5fc2F2ZUZpbGUoZmlsZUZpZWxkLCBuZXdkYXRhLCBmaWxlKVxyXG4gICAgICAgICAgICAgICAgKSk7XHJcbiAgICAgICAgICAgICAgYWxsb2JzW2ZpbGUuZmlsZU5hbWVdID0gb2JzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KGFsbG9icykucGlwZSh0YWtlKDEpKTtcclxuXHJcbiAgICAgICAgfSBlbHNlIGlmIChmaWxlRmllbGRzPy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAvLyBQbHVzaWV1cnMgY2hhbXBzIGZpbGUsIGlsIG5lIHBldXQgeSBhdm9pciBxdSd1bmUgc2V1bCBmaWNoaWVyIHBhciBjaGFtcC5cclxuICAgICAgICAgIGNvbnN0IGZpZWxkcyA9IHt9O1xyXG4gICAgICAgICAgZmlsZUZpZWxkcy5mb3JFYWNoKGZmID0+IHtcclxuICAgICAgICAgICAgZmllbGRzW2ZmXSA9IGRhdGFjb3B5W2ZmXTtcclxuICAgICAgICAgICAgZGVsZXRlIGRhdGFjb3B5W2ZmXTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZU9iaihjdXJyZW50LCBkYXRhY29weSkucGlwZShcclxuICAgICAgICAgICAgICBtZXJnZU1hcChuZXdkYXRhID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciBhbGxvYnM6IE9ic2VydmFibGU8YW55PltdID0gW107XHJcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhmaWVsZHMpLmZvckVhY2goKFtmaWxlRmllbGQsIGZpbGVzXTogW3N0cmluZywgYW55W11dKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxsb2JzLnB1c2godGhpcy5fc2F2ZUZpbGUoZmlsZUZpZWxkLCBuZXdkYXRhLCBmaWxlc1swXSkpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKGFsbG9icyk7IC8vIFRPRE8gOiBQQVMgVEVSTUlORS4uLiBKQU1BSVMgVVRJTElTRS4uLlxyXG4gICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIEZvcm0gc2FucyBmaWNoaWVyXHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlT2JqKGN1cnJlbnQsIGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG59XHJcbiIsIjxkaXY+XHJcbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJnbHctaGVhZGVyXCI+PC9uZy1jb250ZW50PlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgKm5nSWY9XCJkaXNwbGF5Zm9ybVwiPlxyXG4gICAgPG1hdC1jYXJkPlxyXG4gICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicmVzdWx0RXhjZXB0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICBVbmFibGUgdG8gcXVlcnkgOiB7e3Jlc3VsdEV4Y2VwdGlvbn19XHJcbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJnbHctc2VhcmNoLWZvcm1cIj48L25nLWNvbnRlbnQ+XHJcbiAgICAgICAgICAgIDwhLS08bmctY29udGFpbmVyICpuZ0NvbXBvbmVudE91dGxldD1cIlNlYXJjaEZvcm07IGluamVjdG9yOiBvYmpJbmplY3RvclwiPjwvbmctY29udGFpbmVyPi0tPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibWF4cm93c1wiIFtmb3JtR3JvdXBdPVwiZm9ybTJcIj5cclxuICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IHBsYWNlaG9sZGVyPVwiTWF4Um93XCIgZm9ybUNvbnRyb2xOYW1lPVwiX01heFJvd19cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG1heHJvdyBvZiBtYXhyb3dzXCIgW3ZhbHVlXT1cIm1heHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtYXhyb3dcIj57e21heHJvd319IG9iamVjdHM8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFtYXhyb3dcIj4gRGVmYXVsdDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cclxuICAgICAgICA8bWF0LWNhcmQtYWN0aW9ucz5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gY29sb3I9XCJhY2NlbnRcIiAoY2xpY2spPVwib25TZWFyY2goKVwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5zZWFyY2g8L21hdC1pY29uPlxyXG4gICAgICAgIFNlYXJjaFxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L21hdC1jYXJkLWFjdGlvbnM+XHJcbiAgICA8L21hdC1jYXJkPlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgW2hpZGRlbl09XCIhZGlzcGxheXJlc3VsdFwiPlxyXG4gICAgPCEtLSpuZ0lmPVwiZGlzcGxheXJlc3VsdFwiLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWF0LWVsZXZhdGlvbi16OFwiIFtoaWRkZW5dPVwiIWRhdGFTb3VyY2VcIj5cclxuICAgICAgICA8IS0tKm5nSWY9XCJkYXRhU291cmNlOyBlbHNlIFNwaW5uZXJcIi0tPlxyXG4gICAgICAgIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiIG1hdFNvcnQ+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiYWN0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFsIGZhLXBsdXNcIiAoY2xpY2spPVwiQWRkT2JqKClcIiAqbmdJZj1cImNhbkFkZFRoaXMoKVwiPlxyXG4gICAgICAgICAgPC9pPlxyXG4gICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBvYmpcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhbCBmYS1leWVcIiBbcm91dGVyTGlua109XCJkaXNwbGF5T2JqTGlua1RoaXMob2JqKVwiICpuZ0lmPVwiY2FuRGlzcGxheU9ialRoaXMob2JqKVwiPlxyXG4gICAgICAgICAgPC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBhY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIFtuZ0NsYXNzXT1cImFjdGlvbi5pY29uXCIgW3JvdXRlckxpbmtdPVwiYWN0aW9uLnJvdXRlckxpbmtGY3Qob2JqKVwiICpuZ0lmPVwiYWN0aW9uLmljb24uaWNvbiAmJiAoIWFjdGlvbi5kaXNwbGF5IHx8IGFjdGlvbi5kaXNwbGF5KG9iaiwgYWN0aW9uLm5hbWUpKVwiPlxyXG4gICAgICAgICAgICA8L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIFtuZ0NsYXNzXT1cImFjdGlvbi5pY29uXCIgW3JvdXRlckxpbmtdPVwiYWN0aW9uLnJvdXRlckxpbmtGY3Qob2JqKVwiICpuZ0lmPVwiIWFjdGlvbi5pY29uLmljb24gJiYgKCFhY3Rpb24uZGlzcGxheSB8fCBhY3Rpb24uZGlzcGxheShvYmosIGFjdGlvbi5uYW1lKSlcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYWwgZmEtdHJhc2gtYWx0XCIgKGNsaWNrKT1cIkRlbGV0ZU9iaihvYmopXCIgKm5nSWY9XCJjYW5EZWxldGVUaGlzKG9iailcIj5cclxuICAgICAgICAgIDwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhbCBmYS1wZW5jaWxcIiAoY2xpY2spPVwiRWRpdE9iaihvYmopXCIgKm5nSWY9XCJjYW5FZGl0VGhpcyhvYmopXCI+XHJcbiAgICAgICAgICA8L2k+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiZ2x3LXJlc3VsdC10YWJsZVwiPjwvbmctY29udGVudD5cclxuICAgICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJjb2x1bW5zVG9EaXNwbGF5XCI+PC90cj5cclxuICAgICAgICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCBteVJvd0RhdGE7IGNvbHVtbnM6IGNvbHVtbnNUb0Rpc3BsYXlcIj48L3RyPlxyXG4gICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgPG1hdC1wYWdpbmF0b3IgcGFnZVNpemU9XCIxMFwiPjwvbWF0LXBhZ2luYXRvcj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAjU3Bpbm5lciBbaGlkZGVuXT1cImRhdGFTb3VyY2VcIj5cclxuICAgICAgICA8bWF0LXNwaW5uZXI+PC9tYXQtc3Bpbm5lcj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj4iXX0=