@myrmidon/cadmus-refs-asserted-ids 2.1.6 → 2.1.8

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.
@@ -122,11 +122,11 @@ class AssertedIdsComponent {
122
122
  this.saveId(id);
123
123
  this.emitIdsChange();
124
124
  }
125
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: AssertedIdsComponent, deps: [{ token: i1.FormBuilder }, { token: i2.DialogService }], target: i0.ɵɵFactoryTarget.Component }); }
126
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.3", type: AssertedIdsComponent, selector: "cadmus-refs-asserted-ids", inputs: { ids: "ids", idScopeEntries: "idScopeEntries", idTagEntries: "idTagEntries", assTagEntries: "assTagEntries", refTypeEntries: "refTypeEntries", refTagEntries: "refTagEntries" }, outputs: { idsChange: "idsChange" }, ngImport: i0, template: "<form [formGroup]=\"form\">\r\n <div>\r\n <button type=\"button\" mat-flat-button color=\"primary\" (click)=\"addId()\">\r\n <mat-icon>add_circle</mat-icon> ID\r\n </button>\r\n </div>\r\n <table *ngIf=\"entries.value?.length\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>scope</th>\r\n <th>value</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"\r\n let entry of entries.value;\r\n let i = index;\r\n let first = first;\r\n let last = last\r\n \"\r\n >\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Edit this ID\"\r\n (click)=\"editId(entry, i)\"\r\n >\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this ID up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveIdUp(i)\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this ID down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveIdDown(i)\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n matTooltip=\"Delete this ID\"\r\n (click)=\"deleteId(i)\"\r\n >\r\n <mat-icon>remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ entry.scope }}</td>\r\n <td>{{ entry.value }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <mat-expansion-panel [expanded]=\"edited\" [disabled]=\"!edited\">\r\n <mat-expansion-panel-header>ID {{edited?.value}}</mat-expansion-panel-header>\r\n <cadmus-refs-asserted-id\r\n [idScopeEntries]=\"idScopeEntries\"\r\n [idTagEntries]=\"idTagEntries\"\r\n [assTagEntries]=\"assTagEntries\"\r\n [refTypeEntries]=\"refTypeEntries\"\r\n [refTagEntries]=\"refTagEntries\"\r\n [hasSubmit]=\"true\"\r\n [id]=\"edited\"\r\n (idChange)=\"onIdChange($event)\"\r\n (editorClose)=\"closeId()\"\r\n ></cadmus-refs-asserted-id>\r\n </mat-expansion-panel>\r\n</form>\r\n", styles: ["th{font-weight:400;color:silver;text-align:left}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i5.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.AssertedIdComponent, selector: "cadmus-refs-asserted-id", inputs: ["idScopeEntries", "idTagEntries", "assTagEntries", "refTypeEntries", "refTagEntries", "id", "noEidLookup", "hasSubmit"], outputs: ["idChange", "editorClose"] }] }); }
125
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AssertedIdsComponent, deps: [{ token: i1.FormBuilder }, { token: i2.DialogService }], target: i0.ɵɵFactoryTarget.Component }); }
126
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AssertedIdsComponent, selector: "cadmus-refs-asserted-ids", inputs: { ids: "ids", idScopeEntries: "idScopeEntries", idTagEntries: "idTagEntries", assTagEntries: "assTagEntries", refTypeEntries: "refTypeEntries", refTagEntries: "refTagEntries" }, outputs: { idsChange: "idsChange" }, ngImport: i0, template: "<form [formGroup]=\"form\">\r\n <div>\r\n <button type=\"button\" mat-flat-button color=\"primary\" (click)=\"addId()\">\r\n <mat-icon>add_circle</mat-icon> ID\r\n </button>\r\n </div>\r\n <table *ngIf=\"entries.value?.length\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>scope</th>\r\n <th>value</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"\r\n let entry of entries.value;\r\n let i = index;\r\n let first = first;\r\n let last = last\r\n \"\r\n >\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Edit this ID\"\r\n (click)=\"editId(entry, i)\"\r\n >\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this ID up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveIdUp(i)\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this ID down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveIdDown(i)\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n matTooltip=\"Delete this ID\"\r\n (click)=\"deleteId(i)\"\r\n >\r\n <mat-icon>remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ entry.scope }}</td>\r\n <td>{{ entry.value }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <mat-expansion-panel [expanded]=\"edited\" [disabled]=\"!edited\">\r\n <mat-expansion-panel-header>ID {{edited?.value}}</mat-expansion-panel-header>\r\n <cadmus-refs-asserted-id\r\n [idScopeEntries]=\"idScopeEntries\"\r\n [idTagEntries]=\"idTagEntries\"\r\n [assTagEntries]=\"assTagEntries\"\r\n [refTypeEntries]=\"refTypeEntries\"\r\n [refTagEntries]=\"refTagEntries\"\r\n [hasSubmit]=\"true\"\r\n [id]=\"edited\"\r\n (idChange)=\"onIdChange($event)\"\r\n (editorClose)=\"closeId()\"\r\n ></cadmus-refs-asserted-id>\r\n </mat-expansion-panel>\r\n</form>\r\n", styles: ["th{font-weight:400;color:silver;text-align:left}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i5.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.AssertedIdComponent, selector: "cadmus-refs-asserted-id", inputs: ["idScopeEntries", "idTagEntries", "assTagEntries", "refTypeEntries", "refTagEntries", "id", "noEidLookup", "hasSubmit"], outputs: ["idChange", "editorClose"] }] }); }
127
127
  }
128
128
  export { AssertedIdsComponent };
129
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: AssertedIdsComponent, decorators: [{
129
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AssertedIdsComponent, decorators: [{
130
130
  type: Component,
131
131
  args: [{ selector: 'cadmus-refs-asserted-ids', template: "<form [formGroup]=\"form\">\r\n <div>\r\n <button type=\"button\" mat-flat-button color=\"primary\" (click)=\"addId()\">\r\n <mat-icon>add_circle</mat-icon> ID\r\n </button>\r\n </div>\r\n <table *ngIf=\"entries.value?.length\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>scope</th>\r\n <th>value</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"\r\n let entry of entries.value;\r\n let i = index;\r\n let first = first;\r\n let last = last\r\n \"\r\n >\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Edit this ID\"\r\n (click)=\"editId(entry, i)\"\r\n >\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this ID up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveIdUp(i)\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this ID down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveIdDown(i)\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n matTooltip=\"Delete this ID\"\r\n (click)=\"deleteId(i)\"\r\n >\r\n <mat-icon>remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ entry.scope }}</td>\r\n <td>{{ entry.value }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <mat-expansion-panel [expanded]=\"edited\" [disabled]=\"!edited\">\r\n <mat-expansion-panel-header>ID {{edited?.value}}</mat-expansion-panel-header>\r\n <cadmus-refs-asserted-id\r\n [idScopeEntries]=\"idScopeEntries\"\r\n [idTagEntries]=\"idTagEntries\"\r\n [assTagEntries]=\"assTagEntries\"\r\n [refTypeEntries]=\"refTypeEntries\"\r\n [refTagEntries]=\"refTagEntries\"\r\n [hasSubmit]=\"true\"\r\n [id]=\"edited\"\r\n (idChange)=\"onIdChange($event)\"\r\n (editorClose)=\"closeId()\"\r\n ></cadmus-refs-asserted-id>\r\n </mat-expansion-panel>\r\n</form>\r\n", styles: ["th{font-weight:400;color:silver;text-align:left}\n"] }]
132
132
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.DialogService }]; }, propDecorators: { ids: [{
@@ -23,8 +23,8 @@ import { PinTargetLookupComponent } from './pin-target-lookup/pin-target-lookup.
23
23
  import { ScopedPinLookupComponent } from './scoped-pin-lookup/scoped-pin-lookup.component';
24
24
  import * as i0 from "@angular/core";
25
25
  class CadmusRefsAssertedIdsModule {
26
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: CadmusRefsAssertedIdsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
27
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.3", ngImport: i0, type: CadmusRefsAssertedIdsModule, declarations: [AssertedIdComponent,
26
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CadmusRefsAssertedIdsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
27
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: CadmusRefsAssertedIdsModule, declarations: [AssertedIdComponent,
28
28
  AssertedIdsComponent,
29
29
  AssertedCompositeIdComponent,
30
30
  AssertedCompositeIdsComponent,
@@ -54,7 +54,7 @@ class CadmusRefsAssertedIdsModule {
54
54
  AssertedCompositeIdsComponent,
55
55
  PinTargetLookupComponent,
56
56
  ScopedPinLookupComponent] }); }
57
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: CadmusRefsAssertedIdsModule, imports: [CommonModule,
57
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CadmusRefsAssertedIdsModule, imports: [CommonModule,
58
58
  FormsModule,
59
59
  ReactiveFormsModule,
60
60
  // material
@@ -76,7 +76,7 @@ class CadmusRefsAssertedIdsModule {
76
76
  CadmusApiModule] }); }
77
77
  }
78
78
  export { CadmusRefsAssertedIdsModule };
79
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: CadmusRefsAssertedIdsModule, decorators: [{
79
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CadmusRefsAssertedIdsModule, decorators: [{
80
80
  type: NgModule,
81
81
  args: [{
82
82
  declarations: [
@@ -69,6 +69,7 @@ class PinTargetLookupComponent {
69
69
  this.itemParts = [];
70
70
  this._subs = [];
71
71
  this.modelEntries = [];
72
+ this.extLookupConfigs = [];
72
73
  // this is the default filter for the pin lookup, which will
73
74
  // be merged with values provided by user here
74
75
  this.filter = {
@@ -101,6 +102,7 @@ class PinTargetLookupComponent {
101
102
  // events
102
103
  this.targetChange = new EventEmitter();
103
104
  this.editorClose = new EventEmitter();
105
+ this.extMoreRequest = new EventEmitter();
104
106
  }
105
107
  forceByItem() {
106
108
  this.pinByTypeMode = false;
@@ -325,7 +327,7 @@ class PinTargetLookupComponent {
325
327
  });
326
328
  }
327
329
  else {
328
- this.external.setValue(!target.name);
330
+ this.external.setValue(!target.name && !this.internalDefault);
329
331
  this._noTargetUpdate = false;
330
332
  this.updateTarget();
331
333
  }
@@ -387,6 +389,19 @@ class PinTargetLookupComponent {
387
389
  onPinLookupChange(info) {
388
390
  this.loadItemInfo(info);
389
391
  }
392
+ onExtItemChange(event) {
393
+ setTimeout(() => {
394
+ this.gid.setValue(event.itemId);
395
+ this.gid.updateValueAndValidity();
396
+ this.gid.markAsDirty();
397
+ this.label.setValue(event.itemLabel);
398
+ this.label.updateValueAndValidity();
399
+ this.label.markAsDirty();
400
+ });
401
+ }
402
+ onExtMoreRequest(event) {
403
+ this.extMoreRequest.emit(event);
404
+ }
390
405
  onCopied() {
391
406
  this._snackbar.open('Copied to clipboard', 'OK', {
392
407
  duration: 1500,
@@ -402,13 +417,13 @@ class PinTargetLookupComponent {
402
417
  this._target = this.getTarget();
403
418
  this.targetChange.emit(this._target);
404
419
  }
405
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: PinTargetLookupComponent, deps: [{ token: 'indexLookupDefinitions' }, { token: i1.ItemRefLookupService }, { token: i2.PinRefLookupService }, { token: i3.ItemService }, { token: i3.ThesaurusService }, { token: i4.MatSnackBar }, { token: i5.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
406
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.3", type: PinTargetLookupComponent, selector: "cadmus-pin-target-lookup", inputs: { pinByTypeMode: "pinByTypeMode", canSwitchMode: "canSwitchMode", canEditTarget: "canEditTarget", lookupDefinitions: "lookupDefinitions", target: "target", defaultPartTypeKey: "defaultPartTypeKey" }, outputs: { editorClose: "editorClose", targetChange: "targetChange" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- external -->\r\n <mat-checkbox [formControl]=\"external\">external</mat-checkbox>\r\n <!-- mode switcher -->\r\n <div *ngIf=\"!external.value\">\r\n <mat-checkbox [formControl]=\"byTypeMode\" *ngIf=\"canSwitchMode\">\r\n by type</mat-checkbox\r\n >\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-row\">\r\n <!-- label -->\r\n <div>\r\n <mat-form-field *ngIf=\"external.value || canEditTarget\">\r\n <mat-label>label</mat-label>\r\n <input matInput [formControl]=\"label\" />\r\n <mat-error\r\n *ngIf=\"$any(label).errors?.required && (label.dirty || label.touched)\"\r\n >label required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"\r\n $any(label).errors?.maxLength && (label.dirty || label.touched)\r\n \"\r\n >label too long</mat-error\r\n >\r\n </mat-form-field>\r\n <div\r\n *ngIf=\"!external.value && !canEditTarget && label.value\"\r\n class=\"info\"\r\n >\r\n <span class=\"label\">label</span>{{ label.value }}\r\n </div>\r\n </div>\r\n\r\n <!-- gid -->\r\n <div>\r\n <mat-form-field *ngIf=\"external.value || canEditTarget\">\r\n <mat-label>GID</mat-label>\r\n <input matInput [formControl]=\"gid\" />\r\n <mat-error\r\n *ngIf=\"$any(gid).errors?.required && (gid.dirty || gid.touched)\"\r\n >GID required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(gid).errors?.maxLength && (gid.dirty || gid.touched)\"\r\n >GID too long</mat-error\r\n >\r\n </mat-form-field>\r\n <div *ngIf=\"!external.value && !canEditTarget && gid.value\" class=\"info\">\r\n <span class=\"label\">GID</span> <span class=\"gid\">{{ gid.value }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- BY ITEM -->\r\n <div *ngIf=\"!external.value\">\r\n <fieldset *ngIf=\"!byTypeMode.value\" class=\"form-row\">\r\n <legend>pin filters</legend>\r\n <!-- item filter -->\r\n <cadmus-ref-lookup\r\n [service]=\"itemLookupService\"\r\n label=\"item\"\r\n (itemChange)=\"onItemLookupChange($event)\"\r\n ></cadmus-ref-lookup>\r\n\r\n <!-- part filter -->\r\n <mat-form-field *ngIf=\"itemParts.length\">\r\n <mat-label>part</mat-label>\r\n <mat-select [formControl]=\"itemPart\">\r\n <mat-option [value]=\"null\">(any)</mat-option>\r\n <mat-option *ngFor=\"let p of itemParts\" [value]=\"p\">{{\r\n p.typeId | flatLookup : modelEntries : \"id\" : \"value\"\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </fieldset>\r\n\r\n <!-- BY TYPE -->\r\n <div *ngIf=\"byTypeMode.value\">\r\n <!-- par type filter -->\r\n <mat-form-field *ngIf=\"partTypeKeys?.length\">\r\n <mat-label>part type</mat-label>\r\n <mat-select [formControl]=\"partTypeKey\">\r\n <mat-option *ngFor=\"let k of partTypeKeys\" [value]=\"k\">{{\r\n k\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- PIN -->\r\n <div *ngIf=\"partTypeKey.value\">\r\n <!-- pin lookup -->\r\n <cadmus-ref-lookup\r\n [service]=\"pinLookupService\"\r\n [baseFilter]=\"filter\"\r\n [options]=\"pinFilterOptions\"\r\n label=\"pin\"\r\n (itemChange)=\"onPinLookupChange($event)\"\r\n ></cadmus-ref-lookup>\r\n </div>\r\n\r\n <!-- data -->\r\n <mat-expansion-panel id=\"data\" *ngIf=\"lookupData?.pin?.name\">\r\n <mat-expansion-panel-header>pin data</mat-expansion-panel-header>\r\n <!-- table -->\r\n <table>\r\n <thead>\r\n <th></th>\r\n <th>source</th>\r\n <th>value</th>\r\n </thead>\r\n <tbody>\r\n <!-- pin -->\r\n <tr *ngIf=\"lookupData?.pin?.value\">\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.value\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>pin</td>\r\n <td>{{ lookupData!.pin.value }}</td>\r\n </tr>\r\n <!-- item ID -->\r\n <tr *ngIf=\"lookupData?.pin?.itemId\">\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.itemId\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>item ID</td>\r\n <td>{{ lookupData!.pin.itemId }}</td>\r\n </tr>\r\n <!-- item title -->\r\n <tr *ngIf=\"lookupData?.item?.title\">\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"lookupData!.item!.title\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>item title</td>\r\n <td>{{ lookupData!.item!.title }}</td>\r\n </tr>\r\n <!-- part ID -->\r\n <tr *ngIf=\"lookupData?.pin?.partId\">\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.partId\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>part ID</td>\r\n <td>{{ lookupData!.pin.partId }}</td>\r\n </tr>\r\n <!-- part type ID -->\r\n <tr *ngIf=\"lookupData?.pin?.partTypeId\">\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.partTypeId\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>part type ID</td>\r\n <td>{{ lookupData!.pin!.partTypeId }}</td>\r\n </tr>\r\n <!-- part role ID -->\r\n <tr *ngIf=\"lookupData?.pin?.roleId\">\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.roleId!\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>part role ID</td>\r\n <td>{{ lookupData!.pin!.roleId }}</td>\r\n </tr>\r\n\r\n <!-- part's metadata -->\r\n <tr\r\n *ngFor=\"\r\n let m of lookupData?.metaPart?.metadata || [];\r\n let i = index\r\n \"\r\n >\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"m.value\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td class=\"metadata\">{{ m.name }}</td>\r\n <td class=\"metadata\">{{ m.value }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </mat-expansion-panel>\r\n </div>\r\n\r\n <!-- buttons -->\r\n <div>\r\n <button mat-flat-button type=\"button\" (click)=\"close()\">\r\n <mat-icon color=\"warn\">close</mat-icon>\r\n </button>\r\n <button mat-flat-button type=\"submit\" [disabled]=\"form.invalid\">\r\n <mat-icon color=\"primary\">check_circle</mat-icon> target\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".metadata{color:#4a3001}.info{border:1px solid silver;border-radius:6px;background-color:silver;color:#fff;padding:4px;margin:8px 0}.info .label{background-color:#fff;color:silver;margin:0 6px}#data{margin:8px 0}table{border:1px solid silver;border-radius:6px;padding:4px;margin-top:8px}tr:nth-child(odd){background-color:#f0f0f0}th{font-weight:400;text-align:left;color:silver}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}.label{border:1px solid silver;border-radius:6px;padding:4px}fieldset{border:1px solid silver;border-radius:6px;padding:4px 8px;margin-bottom:8px}legend{color:silver}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.CdkCopyToClipboard, selector: "[cdkCopyToClipboard]", inputs: ["cdkCopyToClipboard", "cdkCopyToClipboardAttempts"], outputs: ["cdkCopyToClipboardCopied"] }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i9.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i10.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i10.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "component", type: i11.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i11.MatLabel, selector: "mat-label" }, { kind: "directive", type: i11.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i13.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i14.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i15.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i16.RefLookupComponent, selector: "cadmus-ref-lookup", inputs: ["label", "limit", "baseFilter", "service", "item", "required", "hasMore", "linkTemplate", "optDialog", "options"], outputs: ["itemChange", "moreRequest"] }, { kind: "pipe", type: i17.FlatLookupPipe, name: "flatLookup" }] }); }
420
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PinTargetLookupComponent, deps: [{ token: 'indexLookupDefinitions' }, { token: i1.ItemRefLookupService }, { token: i2.PinRefLookupService }, { token: i3.ItemService }, { token: i3.ThesaurusService }, { token: i4.MatSnackBar }, { token: i5.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
421
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: PinTargetLookupComponent, selector: "cadmus-pin-target-lookup", inputs: { pinByTypeMode: "pinByTypeMode", canSwitchMode: "canSwitchMode", canEditTarget: "canEditTarget", lookupDefinitions: "lookupDefinitions", extLookupConfigs: "extLookupConfigs", internalDefault: "internalDefault", target: "target", defaultPartTypeKey: "defaultPartTypeKey" }, outputs: { editorClose: "editorClose", targetChange: "targetChange", extMoreRequest: "extMoreRequest" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- external -->\r\n <mat-checkbox [formControl]=\"external\">external</mat-checkbox>\r\n <!-- mode switcher -->\r\n <div *ngIf=\"!external.value\">\r\n <mat-checkbox [formControl]=\"byTypeMode\" *ngIf=\"canSwitchMode\">\r\n by type</mat-checkbox\r\n >\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-row\">\r\n <!-- label -->\r\n <div>\r\n <mat-form-field *ngIf=\"external.value || canEditTarget\">\r\n <mat-label>label</mat-label>\r\n <input matInput [formControl]=\"label\" />\r\n <mat-error\r\n *ngIf=\"$any(label).errors?.required && (label.dirty || label.touched)\"\r\n >label required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"\r\n $any(label).errors?.maxLength && (label.dirty || label.touched)\r\n \"\r\n >label too long</mat-error\r\n >\r\n </mat-form-field>\r\n <div\r\n *ngIf=\"!external.value && !canEditTarget && label.value\"\r\n class=\"info\"\r\n >\r\n <span class=\"label\">label</span>{{ label.value }}\r\n </div>\r\n </div>\r\n\r\n <!-- gid -->\r\n <div>\r\n <mat-form-field *ngIf=\"external.value || canEditTarget\">\r\n <mat-label>GID</mat-label>\r\n <input matInput [formControl]=\"gid\" />\r\n <mat-error\r\n *ngIf=\"$any(gid).errors?.required && (gid.dirty || gid.touched)\"\r\n >GID required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(gid).errors?.maxLength && (gid.dirty || gid.touched)\"\r\n >GID too long</mat-error\r\n >\r\n </mat-form-field>\r\n <div *ngIf=\"!external.value && !canEditTarget && gid.value\" class=\"info\">\r\n <span class=\"label\">GID</span> <span class=\"gid\">{{ gid.value }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- external lookup set -->\r\n <div *ngIf=\"external.value && extLookupConfigs?.length\">\r\n <cadmus-ref-lookup-set\r\n [configs]=\"extLookupConfigs\"\r\n (itemChange)=\"onExtItemChange($event)\"\r\n (moreRequest)=\"onExtMoreRequest($event)\"\r\n ></cadmus-ref-lookup-set>\r\n </div>\r\n\r\n <!-- BY ITEM -->\r\n <div *ngIf=\"!external.value\">\r\n <fieldset *ngIf=\"!byTypeMode.value\" class=\"form-row\">\r\n <legend>pin filters</legend>\r\n <!-- item filter -->\r\n <cadmus-ref-lookup\r\n [service]=\"itemLookupService\"\r\n label=\"item\"\r\n (itemChange)=\"onItemLookupChange($event)\"\r\n ></cadmus-ref-lookup>\r\n\r\n <!-- part filter -->\r\n <mat-form-field *ngIf=\"itemParts.length\">\r\n <mat-label>part</mat-label>\r\n <mat-select [formControl]=\"itemPart\">\r\n <mat-option [value]=\"null\">(any)</mat-option>\r\n <mat-option *ngFor=\"let p of itemParts\" [value]=\"p\">{{\r\n p.typeId | flatLookup : modelEntries : \"id\" : \"value\"\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </fieldset>\r\n\r\n <!-- BY TYPE -->\r\n <div *ngIf=\"byTypeMode.value\">\r\n <!-- par type filter -->\r\n <mat-form-field *ngIf=\"partTypeKeys?.length\">\r\n <mat-label>part type</mat-label>\r\n <mat-select [formControl]=\"partTypeKey\">\r\n <mat-option *ngFor=\"let k of partTypeKeys\" [value]=\"k\">{{\r\n k\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- PIN -->\r\n <div *ngIf=\"partTypeKey.value\">\r\n <!-- pin lookup -->\r\n <cadmus-ref-lookup\r\n [service]=\"pinLookupService\"\r\n [baseFilter]=\"filter\"\r\n [options]=\"pinFilterOptions\"\r\n label=\"pin\"\r\n (itemChange)=\"onPinLookupChange($event)\"\r\n ></cadmus-ref-lookup>\r\n </div>\r\n\r\n <!-- data -->\r\n <mat-expansion-panel id=\"data\" *ngIf=\"lookupData?.pin?.name\">\r\n <mat-expansion-panel-header>pin data</mat-expansion-panel-header>\r\n <!-- table -->\r\n <table>\r\n <thead>\r\n <th></th>\r\n <th>source</th>\r\n <th>value</th>\r\n </thead>\r\n <tbody>\r\n <!-- pin -->\r\n <tr *ngIf=\"lookupData?.pin?.value\">\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.value\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>pin</td>\r\n <td>{{ lookupData!.pin.value }}</td>\r\n </tr>\r\n <!-- item ID -->\r\n <tr *ngIf=\"lookupData?.pin?.itemId\">\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.itemId\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>item ID</td>\r\n <td>{{ lookupData!.pin.itemId }}</td>\r\n </tr>\r\n <!-- item title -->\r\n <tr *ngIf=\"lookupData?.item?.title\">\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"lookupData!.item!.title\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>item title</td>\r\n <td>{{ lookupData!.item!.title }}</td>\r\n </tr>\r\n <!-- part ID -->\r\n <tr *ngIf=\"lookupData?.pin?.partId\">\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.partId\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>part ID</td>\r\n <td>{{ lookupData!.pin.partId }}</td>\r\n </tr>\r\n <!-- part type ID -->\r\n <tr *ngIf=\"lookupData?.pin?.partTypeId\">\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.partTypeId\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>part type ID</td>\r\n <td>{{ lookupData!.pin!.partTypeId }}</td>\r\n </tr>\r\n <!-- part role ID -->\r\n <tr *ngIf=\"lookupData?.pin?.roleId\">\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.roleId!\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>part role ID</td>\r\n <td>{{ lookupData!.pin!.roleId }}</td>\r\n </tr>\r\n\r\n <!-- part's metadata -->\r\n <tr\r\n *ngFor=\"\r\n let m of lookupData?.metaPart?.metadata || [];\r\n let i = index\r\n \"\r\n >\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"m.value\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td class=\"metadata\">{{ m.name }}</td>\r\n <td class=\"metadata\">{{ m.value }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </mat-expansion-panel>\r\n </div>\r\n\r\n <!-- buttons -->\r\n <div>\r\n <button mat-flat-button type=\"button\" (click)=\"close()\">\r\n <mat-icon color=\"warn\">close</mat-icon>\r\n </button>\r\n <button mat-flat-button type=\"submit\" [disabled]=\"form.invalid\">\r\n <mat-icon color=\"primary\">check_circle</mat-icon> target\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".metadata{color:#4a3001}.info{border:1px solid silver;border-radius:6px;background-color:silver;color:#fff;padding:4px;margin:8px 0}.info .label{background-color:#fff;color:silver;margin:0 6px}#data{margin:8px 0}table{border:1px solid silver;border-radius:6px;padding:4px;margin-top:8px}tr:nth-child(odd){background-color:#f0f0f0}th{font-weight:400;text-align:left;color:silver}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}.label{border:1px solid silver;border-radius:6px;padding:4px}fieldset{border:1px solid silver;border-radius:6px;padding:4px 8px;margin-bottom:8px}legend{color:silver}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.CdkCopyToClipboard, selector: "[cdkCopyToClipboard]", inputs: ["cdkCopyToClipboard", "cdkCopyToClipboardAttempts"], outputs: ["cdkCopyToClipboardCopied"] }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i9.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i10.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i10.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "component", type: i11.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i11.MatLabel, selector: "mat-label" }, { kind: "directive", type: i11.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i13.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i14.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i15.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i16.RefLookupComponent, selector: "cadmus-ref-lookup", inputs: ["label", "limit", "baseFilter", "service", "item", "required", "hasMore", "linkTemplate", "optDialog", "options"], outputs: ["itemChange", "moreRequest"] }, { kind: "component", type: i16.RefLookupSetComponent, selector: "cadmus-ref-lookup-set", inputs: ["configs", "iconSize"], outputs: ["itemChange", "moreRequest"] }, { kind: "pipe", type: i17.FlatLookupPipe, name: "flatLookup" }] }); }
407
422
  }
408
423
  export { PinTargetLookupComponent };
409
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: PinTargetLookupComponent, decorators: [{
424
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PinTargetLookupComponent, decorators: [{
410
425
  type: Component,
411
- args: [{ selector: 'cadmus-pin-target-lookup', template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- external -->\r\n <mat-checkbox [formControl]=\"external\">external</mat-checkbox>\r\n <!-- mode switcher -->\r\n <div *ngIf=\"!external.value\">\r\n <mat-checkbox [formControl]=\"byTypeMode\" *ngIf=\"canSwitchMode\">\r\n by type</mat-checkbox\r\n >\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-row\">\r\n <!-- label -->\r\n <div>\r\n <mat-form-field *ngIf=\"external.value || canEditTarget\">\r\n <mat-label>label</mat-label>\r\n <input matInput [formControl]=\"label\" />\r\n <mat-error\r\n *ngIf=\"$any(label).errors?.required && (label.dirty || label.touched)\"\r\n >label required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"\r\n $any(label).errors?.maxLength && (label.dirty || label.touched)\r\n \"\r\n >label too long</mat-error\r\n >\r\n </mat-form-field>\r\n <div\r\n *ngIf=\"!external.value && !canEditTarget && label.value\"\r\n class=\"info\"\r\n >\r\n <span class=\"label\">label</span>{{ label.value }}\r\n </div>\r\n </div>\r\n\r\n <!-- gid -->\r\n <div>\r\n <mat-form-field *ngIf=\"external.value || canEditTarget\">\r\n <mat-label>GID</mat-label>\r\n <input matInput [formControl]=\"gid\" />\r\n <mat-error\r\n *ngIf=\"$any(gid).errors?.required && (gid.dirty || gid.touched)\"\r\n >GID required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(gid).errors?.maxLength && (gid.dirty || gid.touched)\"\r\n >GID too long</mat-error\r\n >\r\n </mat-form-field>\r\n <div *ngIf=\"!external.value && !canEditTarget && gid.value\" class=\"info\">\r\n <span class=\"label\">GID</span> <span class=\"gid\">{{ gid.value }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- BY ITEM -->\r\n <div *ngIf=\"!external.value\">\r\n <fieldset *ngIf=\"!byTypeMode.value\" class=\"form-row\">\r\n <legend>pin filters</legend>\r\n <!-- item filter -->\r\n <cadmus-ref-lookup\r\n [service]=\"itemLookupService\"\r\n label=\"item\"\r\n (itemChange)=\"onItemLookupChange($event)\"\r\n ></cadmus-ref-lookup>\r\n\r\n <!-- part filter -->\r\n <mat-form-field *ngIf=\"itemParts.length\">\r\n <mat-label>part</mat-label>\r\n <mat-select [formControl]=\"itemPart\">\r\n <mat-option [value]=\"null\">(any)</mat-option>\r\n <mat-option *ngFor=\"let p of itemParts\" [value]=\"p\">{{\r\n p.typeId | flatLookup : modelEntries : \"id\" : \"value\"\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </fieldset>\r\n\r\n <!-- BY TYPE -->\r\n <div *ngIf=\"byTypeMode.value\">\r\n <!-- par type filter -->\r\n <mat-form-field *ngIf=\"partTypeKeys?.length\">\r\n <mat-label>part type</mat-label>\r\n <mat-select [formControl]=\"partTypeKey\">\r\n <mat-option *ngFor=\"let k of partTypeKeys\" [value]=\"k\">{{\r\n k\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- PIN -->\r\n <div *ngIf=\"partTypeKey.value\">\r\n <!-- pin lookup -->\r\n <cadmus-ref-lookup\r\n [service]=\"pinLookupService\"\r\n [baseFilter]=\"filter\"\r\n [options]=\"pinFilterOptions\"\r\n label=\"pin\"\r\n (itemChange)=\"onPinLookupChange($event)\"\r\n ></cadmus-ref-lookup>\r\n </div>\r\n\r\n <!-- data -->\r\n <mat-expansion-panel id=\"data\" *ngIf=\"lookupData?.pin?.name\">\r\n <mat-expansion-panel-header>pin data</mat-expansion-panel-header>\r\n <!-- table -->\r\n <table>\r\n <thead>\r\n <th></th>\r\n <th>source</th>\r\n <th>value</th>\r\n </thead>\r\n <tbody>\r\n <!-- pin -->\r\n <tr *ngIf=\"lookupData?.pin?.value\">\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.value\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>pin</td>\r\n <td>{{ lookupData!.pin.value }}</td>\r\n </tr>\r\n <!-- item ID -->\r\n <tr *ngIf=\"lookupData?.pin?.itemId\">\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.itemId\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>item ID</td>\r\n <td>{{ lookupData!.pin.itemId }}</td>\r\n </tr>\r\n <!-- item title -->\r\n <tr *ngIf=\"lookupData?.item?.title\">\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"lookupData!.item!.title\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>item title</td>\r\n <td>{{ lookupData!.item!.title }}</td>\r\n </tr>\r\n <!-- part ID -->\r\n <tr *ngIf=\"lookupData?.pin?.partId\">\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.partId\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>part ID</td>\r\n <td>{{ lookupData!.pin.partId }}</td>\r\n </tr>\r\n <!-- part type ID -->\r\n <tr *ngIf=\"lookupData?.pin?.partTypeId\">\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.partTypeId\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>part type ID</td>\r\n <td>{{ lookupData!.pin!.partTypeId }}</td>\r\n </tr>\r\n <!-- part role ID -->\r\n <tr *ngIf=\"lookupData?.pin?.roleId\">\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.roleId!\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>part role ID</td>\r\n <td>{{ lookupData!.pin!.roleId }}</td>\r\n </tr>\r\n\r\n <!-- part's metadata -->\r\n <tr\r\n *ngFor=\"\r\n let m of lookupData?.metaPart?.metadata || [];\r\n let i = index\r\n \"\r\n >\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"m.value\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td class=\"metadata\">{{ m.name }}</td>\r\n <td class=\"metadata\">{{ m.value }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </mat-expansion-panel>\r\n </div>\r\n\r\n <!-- buttons -->\r\n <div>\r\n <button mat-flat-button type=\"button\" (click)=\"close()\">\r\n <mat-icon color=\"warn\">close</mat-icon>\r\n </button>\r\n <button mat-flat-button type=\"submit\" [disabled]=\"form.invalid\">\r\n <mat-icon color=\"primary\">check_circle</mat-icon> target\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".metadata{color:#4a3001}.info{border:1px solid silver;border-radius:6px;background-color:silver;color:#fff;padding:4px;margin:8px 0}.info .label{background-color:#fff;color:silver;margin:0 6px}#data{margin:8px 0}table{border:1px solid silver;border-radius:6px;padding:4px;margin-top:8px}tr:nth-child(odd){background-color:#f0f0f0}th{font-weight:400;text-align:left;color:silver}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}.label{border:1px solid silver;border-radius:6px;padding:4px}fieldset{border:1px solid silver;border-radius:6px;padding:4px 8px;margin-bottom:8px}legend{color:silver}\n"] }]
426
+ args: [{ selector: 'cadmus-pin-target-lookup', template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- external -->\r\n <mat-checkbox [formControl]=\"external\">external</mat-checkbox>\r\n <!-- mode switcher -->\r\n <div *ngIf=\"!external.value\">\r\n <mat-checkbox [formControl]=\"byTypeMode\" *ngIf=\"canSwitchMode\">\r\n by type</mat-checkbox\r\n >\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-row\">\r\n <!-- label -->\r\n <div>\r\n <mat-form-field *ngIf=\"external.value || canEditTarget\">\r\n <mat-label>label</mat-label>\r\n <input matInput [formControl]=\"label\" />\r\n <mat-error\r\n *ngIf=\"$any(label).errors?.required && (label.dirty || label.touched)\"\r\n >label required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"\r\n $any(label).errors?.maxLength && (label.dirty || label.touched)\r\n \"\r\n >label too long</mat-error\r\n >\r\n </mat-form-field>\r\n <div\r\n *ngIf=\"!external.value && !canEditTarget && label.value\"\r\n class=\"info\"\r\n >\r\n <span class=\"label\">label</span>{{ label.value }}\r\n </div>\r\n </div>\r\n\r\n <!-- gid -->\r\n <div>\r\n <mat-form-field *ngIf=\"external.value || canEditTarget\">\r\n <mat-label>GID</mat-label>\r\n <input matInput [formControl]=\"gid\" />\r\n <mat-error\r\n *ngIf=\"$any(gid).errors?.required && (gid.dirty || gid.touched)\"\r\n >GID required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(gid).errors?.maxLength && (gid.dirty || gid.touched)\"\r\n >GID too long</mat-error\r\n >\r\n </mat-form-field>\r\n <div *ngIf=\"!external.value && !canEditTarget && gid.value\" class=\"info\">\r\n <span class=\"label\">GID</span> <span class=\"gid\">{{ gid.value }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- external lookup set -->\r\n <div *ngIf=\"external.value && extLookupConfigs?.length\">\r\n <cadmus-ref-lookup-set\r\n [configs]=\"extLookupConfigs\"\r\n (itemChange)=\"onExtItemChange($event)\"\r\n (moreRequest)=\"onExtMoreRequest($event)\"\r\n ></cadmus-ref-lookup-set>\r\n </div>\r\n\r\n <!-- BY ITEM -->\r\n <div *ngIf=\"!external.value\">\r\n <fieldset *ngIf=\"!byTypeMode.value\" class=\"form-row\">\r\n <legend>pin filters</legend>\r\n <!-- item filter -->\r\n <cadmus-ref-lookup\r\n [service]=\"itemLookupService\"\r\n label=\"item\"\r\n (itemChange)=\"onItemLookupChange($event)\"\r\n ></cadmus-ref-lookup>\r\n\r\n <!-- part filter -->\r\n <mat-form-field *ngIf=\"itemParts.length\">\r\n <mat-label>part</mat-label>\r\n <mat-select [formControl]=\"itemPart\">\r\n <mat-option [value]=\"null\">(any)</mat-option>\r\n <mat-option *ngFor=\"let p of itemParts\" [value]=\"p\">{{\r\n p.typeId | flatLookup : modelEntries : \"id\" : \"value\"\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </fieldset>\r\n\r\n <!-- BY TYPE -->\r\n <div *ngIf=\"byTypeMode.value\">\r\n <!-- par type filter -->\r\n <mat-form-field *ngIf=\"partTypeKeys?.length\">\r\n <mat-label>part type</mat-label>\r\n <mat-select [formControl]=\"partTypeKey\">\r\n <mat-option *ngFor=\"let k of partTypeKeys\" [value]=\"k\">{{\r\n k\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- PIN -->\r\n <div *ngIf=\"partTypeKey.value\">\r\n <!-- pin lookup -->\r\n <cadmus-ref-lookup\r\n [service]=\"pinLookupService\"\r\n [baseFilter]=\"filter\"\r\n [options]=\"pinFilterOptions\"\r\n label=\"pin\"\r\n (itemChange)=\"onPinLookupChange($event)\"\r\n ></cadmus-ref-lookup>\r\n </div>\r\n\r\n <!-- data -->\r\n <mat-expansion-panel id=\"data\" *ngIf=\"lookupData?.pin?.name\">\r\n <mat-expansion-panel-header>pin data</mat-expansion-panel-header>\r\n <!-- table -->\r\n <table>\r\n <thead>\r\n <th></th>\r\n <th>source</th>\r\n <th>value</th>\r\n </thead>\r\n <tbody>\r\n <!-- pin -->\r\n <tr *ngIf=\"lookupData?.pin?.value\">\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.value\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>pin</td>\r\n <td>{{ lookupData!.pin.value }}</td>\r\n </tr>\r\n <!-- item ID -->\r\n <tr *ngIf=\"lookupData?.pin?.itemId\">\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.itemId\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>item ID</td>\r\n <td>{{ lookupData!.pin.itemId }}</td>\r\n </tr>\r\n <!-- item title -->\r\n <tr *ngIf=\"lookupData?.item?.title\">\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"lookupData!.item!.title\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>item title</td>\r\n <td>{{ lookupData!.item!.title }}</td>\r\n </tr>\r\n <!-- part ID -->\r\n <tr *ngIf=\"lookupData?.pin?.partId\">\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.partId\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>part ID</td>\r\n <td>{{ lookupData!.pin.partId }}</td>\r\n </tr>\r\n <!-- part type ID -->\r\n <tr *ngIf=\"lookupData?.pin?.partTypeId\">\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.partTypeId\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>part type ID</td>\r\n <td>{{ lookupData!.pin!.partTypeId }}</td>\r\n </tr>\r\n <!-- part role ID -->\r\n <tr *ngIf=\"lookupData?.pin?.roleId\">\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.roleId!\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>part role ID</td>\r\n <td>{{ lookupData!.pin!.roleId }}</td>\r\n </tr>\r\n\r\n <!-- part's metadata -->\r\n <tr\r\n *ngFor=\"\r\n let m of lookupData?.metaPart?.metadata || [];\r\n let i = index\r\n \"\r\n >\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [cdkCopyToClipboard]=\"m.value\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td class=\"metadata\">{{ m.name }}</td>\r\n <td class=\"metadata\">{{ m.value }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </mat-expansion-panel>\r\n </div>\r\n\r\n <!-- buttons -->\r\n <div>\r\n <button mat-flat-button type=\"button\" (click)=\"close()\">\r\n <mat-icon color=\"warn\">close</mat-icon>\r\n </button>\r\n <button mat-flat-button type=\"submit\" [disabled]=\"form.invalid\">\r\n <mat-icon color=\"primary\">check_circle</mat-icon> target\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".metadata{color:#4a3001}.info{border:1px solid silver;border-radius:6px;background-color:silver;color:#fff;padding:4px;margin:8px 0}.info .label{background-color:#fff;color:silver;margin:0 6px}#data{margin:8px 0}table{border:1px solid silver;border-radius:6px;padding:4px;margin-top:8px}tr:nth-child(odd){background-color:#f0f0f0}th{font-weight:400;text-align:left;color:silver}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}.label{border:1px solid silver;border-radius:6px;padding:4px}fieldset{border:1px solid silver;border-radius:6px;padding:4px 8px;margin-bottom:8px}legend{color:silver}\n"] }]
412
427
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
413
428
  type: Inject,
414
429
  args: ['indexLookupDefinitions']
@@ -420,6 +435,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.3", ngImpor
420
435
  type: Input
421
436
  }], lookupDefinitions: [{
422
437
  type: Input
438
+ }], extLookupConfigs: [{
439
+ type: Input
440
+ }], internalDefault: [{
441
+ type: Input
423
442
  }], target: [{
424
443
  type: Input
425
444
  }], defaultPartTypeKey: [{
@@ -428,5 +447,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.3", ngImpor
428
447
  type: Output
429
448
  }], targetChange: [{
430
449
  type: Output
450
+ }], extMoreRequest: [{
451
+ type: Output
431
452
  }] } });
432
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGluLXRhcmdldC1sb29rdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vY2FkbXVzLXJlZnMtYXNzZXJ0ZWQtaWRzL3NyYy9saWIvcGluLXRhcmdldC1sb29rdXAvcGluLXRhcmdldC1sb29rdXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vY2FkbXVzLXJlZnMtYXNzZXJ0ZWQtaWRzL3NyYy9saWIvcGluLXRhcmdldC1sb29rdXAvcGluLXRhcmdldC1sb29rdXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUlMLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFFTCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLFFBQVEsRUFDUixJQUFJLEdBQ0wsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQmQsNEJBQTRCO0FBQzVCLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUM7QUFtQzdDOzs7Ozs7R0FNRztBQUNILE1BS2Esd0JBQXdCO0lBTW5DOzs7T0FHRztJQUNILElBQ1csYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFDRCxJQUFXLGFBQWEsQ0FBQyxLQUEwQjtRQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNwQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1NBQ25DO2FBQU07WUFDTCxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1NBQzFDO0lBQ0gsQ0FBQztJQXdCRDs7T0FFRztJQUNILElBQ1csTUFBTTtRQUNmLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBQ0QsSUFBVyxNQUFNLENBQUMsS0FBbUM7UUFDbkQsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLEtBQUssRUFBRTtZQUMxQixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssSUFBSSxTQUFTLENBQUM7UUFDbEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQXlDRCxZQUVVLGlCQUF5QyxFQUMxQyxpQkFBdUMsRUFDdkMsZ0JBQXFDLEVBQ3BDLFlBQXlCLEVBQ3pCLFlBQThCLEVBQzlCLFNBQXNCLEVBQzlCLFdBQXdCO1FBTmhCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBd0I7UUFDMUMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFzQjtRQUN2QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXFCO1FBQ3BDLGlCQUFZLEdBQVosWUFBWSxDQUFhO1FBQ3pCLGlCQUFZLEdBQVosWUFBWSxDQUFrQjtRQUM5QixjQUFTLEdBQVQsU0FBUyxDQUFhO1FBRzlCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLDREQUE0RDtRQUM1RCw4Q0FBOEM7UUFDOUMsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLElBQUksRUFBRSxFQUFFO1lBQ1IsS0FBSyxFQUFFLEVBQUU7U0FDVixDQUFDO1FBQ0YsT0FBTztRQUNQLElBQUksQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDbkMsVUFBVSxDQUFDLFFBQVE7WUFDbkIsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7U0FDMUIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtZQUNyQyxVQUFVLENBQUMsUUFBUTtZQUNuQixVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztTQUMxQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUM1QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNiLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQ3hCLENBQUMsQ0FBQztRQUNILFNBQVM7UUFDVCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFhLENBQUM7UUFDbEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQzdDLENBQUM7SUFFTyxXQUFXO1FBQ2pCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQzdCLENBQUM7SUFFTyxTQUFTO1FBQ2YsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDM0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztTQUNqRDtRQUNELDJDQUEyQztRQUMzQyxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFeEQsbURBQW1EO1FBQ25ELHFEQUFxRDtRQUNyRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUU7WUFDN0IsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRTtnQkFDN0IsK0NBQStDO2dCQUMvQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO29CQUM5QixJQUFJLENBQUMsaUJBQWtCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHO3dCQUNqQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUs7d0JBQ2IsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFO3FCQUNiLENBQUM7Z0JBQ0osQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsdUNBQXVDO2dCQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDM0Q7U0FDRjtRQUVELHVDQUF1QztRQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUU7WUFDN0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BCO2FBQU07WUFDTCxrQkFBa0I7WUFDbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUNoRCxDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBRU0sUUFBUTtRQUNiLDZCQUE2QjtRQUM3QixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUM3QixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNoQztRQUVELHdEQUF3RDtRQUN4RCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FDYixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVk7YUFDbkIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQy9DLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRztnQkFDWixHQUFHLElBQUksQ0FBQyxNQUFNO2dCQUNkLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRTthQUNqQixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQ0wsQ0FBQztRQUVGLDhEQUE4RDtRQUM5RCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FDYixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVk7YUFDdkIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQy9DLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRTtnQkFDeEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7YUFDcEM7WUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHO2dCQUNaLEdBQUcsSUFBSSxDQUFDLE1BQU07Z0JBQ2QsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFO2FBQ2pCLENBQUM7WUFDRixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQ0wsQ0FBQztRQUVGLHdEQUF3RDtRQUN4RCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FDYixJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVk7YUFDMUIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQy9DLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHO2dCQUN6QixDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFrQixDQUFDLEdBQUcsQ0FBQztnQkFDOUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FDTCxDQUFDO1FBRUYsNkRBQTZEO1FBQzdELDBDQUEwQztRQUMxQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FDYixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVk7YUFDdkIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQy9DLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ3RCLElBQUksUUFBUSxFQUFFO2dCQUNaLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDO29CQUN2QixVQUFVLENBQUMsUUFBUTtvQkFDbkIsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7aUJBQzFCLENBQUMsQ0FBQzthQUNKO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdkQ7WUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQ0wsQ0FBQztRQUVGLHFDQUFxQztRQUNyQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzVELElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNWLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7Z0JBQ3BDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUU7b0JBQzdCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztpQkFDbEI7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2lCQUNwQjtZQUNILENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNWLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFdBQVc7UUFDaEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDN0I7SUFDSCxDQUFDO0lBRU8sUUFBUTtRQUNkLDZEQUE2RDtRQUM3RCx5QkFBeUI7UUFDekIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUM7UUFDakMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUU7WUFDZixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxHQUFHLENBQUMsTUFBTTtZQUNmLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRTtZQUMvQixDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUU7WUFDekIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE1BQU0sRUFBRSxHQUFhLEVBQUUsQ0FBQztRQUN4QixZQUFZO1FBQ1osSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUU7WUFDN0IsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2hCO1FBQ0QsYUFBYTtRQUNiLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3BFLHFCQUFxQjtRQUNyQixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRTtZQUNsQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FDL0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLFVBQVcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUNoRCxDQUFDO1lBQ0YsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNkLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNwRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRTtnQkFDOUIsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7YUFDNUM7WUFDRCxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2Q7UUFDRCxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVPLFNBQVM7UUFDZixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFO1lBQ3ZCLE9BQU87Z0JBQ0wsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ3pCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxFQUFFO2FBQzlCLENBQUM7U0FDSDthQUFNO1lBQ0wsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUM7WUFDakMsT0FBTztnQkFDTCxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDekIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQzdCLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxJQUFJLEVBQUU7Z0JBQ3pCLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxJQUFJLEVBQUU7Z0JBQ3pCLFVBQVUsRUFBRSxHQUFHLEVBQUUsVUFBVSxJQUFJLEVBQUU7Z0JBQ2pDLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxJQUFJLEVBQUU7Z0JBQ3pCLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUU7Z0JBQ3JCLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxJQUFJLEVBQUU7YUFDeEIsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVPLFlBQVk7UUFDbEIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3hCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRTtZQUN4QixJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUMxQjtRQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFTyxVQUFVLENBQUMsTUFBa0I7UUFDbkMsNkJBQTZCO1FBQzdCLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztZQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25CLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ2hCLEdBQUcsRUFBRTtnQkFDSCxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFO2dCQUMzQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFO2dCQUMzQixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsSUFBSSxFQUFFO2dCQUNuQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFO2dCQUMzQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFO2dCQUN2QixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO2FBQzFCO1NBQ0YsQ0FBQztRQUNGLFdBQVc7UUFDWCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFDakIsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUM3RCxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDYixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7b0JBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNyQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3RCLENBQUM7Z0JBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ2YsSUFBSSxLQUFLLEVBQUU7d0JBQ1QsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7cUJBQ3RDO29CQUNELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNyQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztnQkFDL0IsQ0FBQzthQUNGLENBQUMsQ0FBQztTQUNKO2FBQU07WUFDTCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztZQUM3QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxrQkFBa0IsQ0FBQyxJQUFVO1FBQ2xDLG9CQUFvQjtRQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdkQsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ1YsaURBQWlEO2dCQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDZixJQUFJLEtBQUssRUFBRTtvQkFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztpQkFDdEM7Z0JBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxZQUFZLENBQUMsR0FBZ0I7UUFDbkMsUUFBUSxDQUFDO1lBQ1AsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQztZQUN4RCxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FDNUMsR0FBRyxDQUFDLE1BQU0sRUFDVixnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULElBQUksQ0FDTDtTQUNGLENBQUM7YUFDQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2IsU0FBUyxDQUFDO1lBQ1QsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLFVBQVUsR0FBRztvQkFDaEIsR0FBRyxFQUFFLEdBQUc7b0JBQ1IsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFLO29CQUNsQixRQUFRLEVBQUUsTUFBTSxDQUFDLElBQW9CO2lCQUN0QyxDQUFDO2dCQUNGLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7Z0JBQzVCLE9BQU8sQ0FBQyxLQUFLLENBQ1gsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyw2QkFBNkIsQ0FDOUQsQ0FBQztZQUNKLENBQUM7U0FDRixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSxpQkFBaUIsQ0FBQyxJQUFpQjtRQUN4QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFTSxRQUFRO1FBQ2IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsSUFBSSxFQUFFO1lBQy9DLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLEtBQUs7UUFDVixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTSxJQUFJO1FBQ1QsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNyQixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkMsQ0FBQzs4R0FqZVUsd0JBQXdCLGtCQW9HekIsd0JBQXdCO2tHQXBHdkIsd0JBQXdCLHVWQ3hGckMsb2dSQXlQQTs7U0RqS2Esd0JBQXdCOzJGQUF4Qix3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0UsMEJBQTBCOzswQkF3R2pDLE1BQU07MkJBQUMsd0JBQXdCOzhOQXpGdkIsYUFBYTtzQkFEdkIsS0FBSztnQkFpQkMsYUFBYTtzQkFEbkIsS0FBSztnQkFPQyxhQUFhO3NCQURuQixLQUFLO2dCQVdDLGlCQUFpQjtzQkFEdkIsS0FBSztnQkFPSyxNQUFNO3NCQURoQixLQUFLO2dCQWdCQyxrQkFBa0I7c0JBRHhCLEtBQUs7Z0JBT0MsV0FBVztzQkFEakIsTUFBTTtnQkFPQSxZQUFZO3NCQURsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBGb3JtQnVpbGRlcixcclxuICBGb3JtQ29udHJvbCxcclxuICBGb3JtR3JvdXAsXHJcbiAgVmFsaWRhdG9ycyxcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7XHJcbiAgU3Vic2NyaXB0aW9uLFxyXG4gIGRlYm91bmNlVGltZSxcclxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcclxuICBmb3JrSm9pbixcclxuICB0YWtlLFxyXG59IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XHJcblxyXG5pbXBvcnQgeyBJdGVtU2VydmljZSwgVGhlc2F1cnVzU2VydmljZSB9IGZyb20gJ0BteXJtaWRvbi9jYWRtdXMtYXBpJztcclxuaW1wb3J0IHtcclxuICBEYXRhUGluSW5mbyxcclxuICBJbmRleExvb2t1cERlZmluaXRpb24sXHJcbiAgSW5kZXhMb29rdXBEZWZpbml0aW9ucyxcclxuICBJdGVtLFxyXG4gIFBhcnQsXHJcbiAgVGhlc2F1cnVzRW50cnksXHJcbn0gZnJvbSAnQG15cm1pZG9uL2NhZG11cy1jb3JlJztcclxuXHJcbmltcG9ydCB7XHJcbiAgUGluUmVmTG9va3VwRmlsdGVyLFxyXG4gIFBpblJlZkxvb2t1cFNlcnZpY2UsXHJcbn0gZnJvbSAnLi4vc2VydmljZXMvcGluLXJlZi1sb29rdXAuc2VydmljZSc7XHJcbmltcG9ydCB7IEl0ZW1SZWZMb29rdXBTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvaXRlbS1yZWYtbG9va3VwLnNlcnZpY2UnO1xyXG5cclxuLy8gZnJvbSBDYWRtdXMgZ2VuZXJhbCBwYXJ0c1xyXG5jb25zdCBNRVRBREFUQV9QQVJUX0lEID0gJ2l0LnZlZHBoLm1ldGFkYXRhJztcclxuaW50ZXJmYWNlIE1ldGFkYXRhUGFydCBleHRlbmRzIFBhcnQge1xyXG4gIG1ldGFkYXRhOiB7XHJcbiAgICB0eXBlPzogc3RyaW5nO1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgdmFsdWU6IHN0cmluZztcclxuICB9W107XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQaW4gbG9va3VwIGRhdGEgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb21wb25lbnQuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBpbkxvb2t1cERhdGEge1xyXG4gIHBpbjogRGF0YVBpbkluZm87XHJcbiAgaXRlbT86IEl0ZW07XHJcbiAgbWV0YVBhcnQ/OiBNZXRhZGF0YVBhcnQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIHBpbi1iYXNlZCB0YXJnZXQuIFRoaXMgaW5jbHVkZXMgcGluJ3MgbmFtZSBhbmQgdmFsdWUsIGFuZFxyXG4gKiB0aGUgaXRlbSdzIElEIGFuZCBvcHRpb25hbCBwYXJ0IElEcy4gVGhlIGxhYmVsIGlzIGEgdXNlciBmcmllbmRseVxyXG4gKiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRhcmdldCwgd2hpbGUgdGhlIGdpZCBpcyBhIGdsb2JhbGx5XHJcbiAqIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdGFyZ2V0LlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBQaW5UYXJnZXQge1xyXG4gIGdpZDogc3RyaW5nO1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgaXRlbUlkPzogc3RyaW5nO1xyXG4gIHBhcnRJZD86IHN0cmluZztcclxuICBwYXJ0VHlwZUlkPzogc3RyaW5nO1xyXG4gIHJvbGVJZD86IHN0cmluZztcclxuICBuYW1lPzogc3RyaW5nO1xyXG4gIHZhbHVlPzogc3RyaW5nO1xyXG59XHJcblxyXG4vKlxyXG4gKiBTY29wZWQgcGluLWJhc2VkIGxvb2t1cCBjb21wb25lbnQuIFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgbGlzdFxyXG4gKiBvZiBwaW4tYmFzZWQgc2VhcmNoZXMsIHdpdGggYSBsb29rdXAgY29udHJvbC4gV2hlbmV2ZXIgdGhlIHVzZXJcclxuICogcGlja3MgYSBwaW4gdmFsdWUsIGhlIGdldHMgdGhlIGRldGFpbHMgYWJvdXQgaXRzIGl0ZW0gYW5kIHBhcnQsIGFuZFxyXG4gKiBpdGVtJ3MgbWV0YWRhdGEgcGFydCwgaWYgYW55LiBIZSBjYW4gdGhlbiB1c2UgdGhlc2UgZGF0YSB0byBidWlsZFxyXG4gKiBzb21lIEVJRCBieSB2YXJpb3VzbHkgYXNzZW1ibGluZyB0aGVzZSBjb21wb25lbnRzLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjYWRtdXMtcGluLXRhcmdldC1sb29rdXAnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9waW4tdGFyZ2V0LWxvb2t1cC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcGluLXRhcmdldC1sb29rdXAuY29tcG9uZW50LmNzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUGluVGFyZ2V0TG9va3VwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgX3N1YnM6IFN1YnNjcmlwdGlvbltdO1xyXG4gIHByaXZhdGUgX3RhcmdldDogUGluVGFyZ2V0IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX25vVGFyZ2V0VXBkYXRlPzogYm9vbGVhbjtcclxuICBwcml2YXRlIF9zdGFydFdpdGhCeVR5cGVNb2RlPzogYm9vbGVhbjtcclxuXHJcbiAgLyoqXHJcbiAgICogVHJ1ZSB3aGVuIHRoZSBieS10eXBlIHBpbiBsb29rdXAgbW9kZSBpcyBhY3RpdmUuXHJcbiAgICogVXNlciBjYW4gY2hhbmdlIG1vZGUgdW5sZXNzIG1vZGVTd2l0Y2hpbmcgaXMgZmFsc2UuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IHBpbkJ5VHlwZU1vZGUoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5ieVR5cGVNb2RlPy52YWx1ZTtcclxuICB9XHJcbiAgcHVibGljIHNldCBwaW5CeVR5cGVNb2RlKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XHJcbiAgICBpZiAoIXRoaXMuYnlUeXBlTW9kZSkge1xyXG4gICAgICB0aGlzLl9zdGFydFdpdGhCeVR5cGVNb2RlID0gdmFsdWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmJ5VHlwZU1vZGUuc2V0VmFsdWUodmFsdWUgfHwgZmFsc2UpO1xyXG4gICAgICB0aGlzLmJ5VHlwZU1vZGUudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJ1ZSB3aGVuIHRoZSB1c2VyIGNhbiBzd2l0Y2ggYmV0d2VlbiBieS10eXBlIGFuZCBieS1pdGVtIG1vZGUuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgY2FuU3dpdGNoTW9kZT86IGJvb2xlYW47XHJcbiAgLyoqXHJcbiAgICogVHJ1ZSB3aGVuIHRoZSB1c2VyIGNhbiBlZGl0IHRoZSB0YXJnZXQncyBnaWQvbGFiZWwgZm9yIGludGVybmFsXHJcbiAgICogdGFyZ2V0cy5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBjYW5FZGl0VGFyZ2V0PzogYm9vbGVhbjtcclxuICAvKipcclxuICAgKiBUaGUgbG9va3VwIGRlZmluaXRpb25zIHRvIGJlIHVzZWQgZm9yIHRoZSBieS10eXBlIGxvb2t1cC4gSWZcclxuICAgKiBub3Qgc3BlY2lmaWVkLCB0aGUgbG9va3VwIGRlZmluaXRpb25zIHdpbGwgYmUgZ290IHZpYSBpbmplY3Rpb25cclxuICAgKiB3aGVuIGF2YWlsYWJsZTsgaWYgdGhlIGluamVjdGVkIGRlZmluaXRpb25zIGFyZSBlbXB0eSwgdGhlXHJcbiAgICogbG9va3VwIGRlZmluaXRpb25zIHdpbGwgYmUgYnVpbHQgZnJvbSB0aGUgbW9kZWwtdHlwZXMgdGhlc2F1cnVzO1xyXG4gICAqIGlmIHRoaXMgaXMgbm90IGF2YWlsYWJsZSBlaXRoZXIsIHRoZSBieS10eXBlIGxvb2t1cCB3aWxsIGJlXHJcbiAgICogZGlzYWJsZWQuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgbG9va3VwRGVmaW5pdGlvbnM/OiBJbmRleExvb2t1cERlZmluaXRpb25zO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgdGFyZ2V0IHRvIGJlIGVkaXRlZC5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgdGFyZ2V0KCk6IFBpblRhcmdldCB8IHVuZGVmaW5lZCB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RhcmdldDtcclxuICB9XHJcbiAgcHVibGljIHNldCB0YXJnZXQodmFsdWU6IFBpblRhcmdldCB8IHVuZGVmaW5lZCB8IG51bGwpIHtcclxuICAgIGlmICh0aGlzLl90YXJnZXQgPT09IHZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX3RhcmdldCA9IHZhbHVlIHx8IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudXBkYXRlRm9ybSh0aGlzLl90YXJnZXQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHBhcnQgdHlwZSBrZXkgd2hlbiB0aGUgYnktdHlwZSBtb2RlIGlzIGFjdGl2ZS5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBkZWZhdWx0UGFydFR5cGVLZXk/OiBzdHJpbmcgfCBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0dGVkIHdoZW4gdXNlciBjbG9zZXMgdGhlIGVkaXRvci5cclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgZWRpdG9yQ2xvc2U6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIC8qKlxyXG4gICAqIEVtaXR0ZWQgd2hlbmV2ZXIgdGhlIHRhcmdldCBjaGFuZ2VzLlxyXG4gICAqIFRoZSBldmVudCdzIHZhbHVlIGlzIHRoZSBuZXcgdGFyZ2V0LlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyB0YXJnZXRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxQaW5UYXJnZXQ+O1xyXG5cclxuICAvLyBieSB0eXBlXHJcbiAgcHVibGljIG1vZGVsRW50cmllczogVGhlc2F1cnVzRW50cnlbXTtcclxuICBwdWJsaWMgcGFydFR5cGVLZXlzOiBzdHJpbmdbXTtcclxuICAvLyBieSBpdGVtXHJcbiAgcHVibGljIGl0ZW1QYXJ0czogUGFydFtdO1xyXG4gIC8vIGZvcm0gLSBieSBpdGVtXHJcbiAgcHVibGljIGl0ZW06IEZvcm1Db250cm9sPEl0ZW0gfCBudWxsPjtcclxuICBwdWJsaWMgaXRlbVBhcnQ6IEZvcm1Db250cm9sPFBhcnQgfCBudWxsPjtcclxuICAvLyBmb3JtIC0gYnkgdHlwZVxyXG4gIHB1YmxpYyBwYXJ0VHlwZUtleTogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgLy8gZm9ybSAtIGJvdGhcclxuICBwdWJsaWMgZ2lkOiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuICBwdWJsaWMgbGFiZWw6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIHB1YmxpYyBieVR5cGVNb2RlOiBGb3JtQ29udHJvbDxib29sZWFuPjtcclxuICBwdWJsaWMgZXh0ZXJuYWw6IEZvcm1Db250cm9sPGJvb2xlYW4+O1xyXG4gIHB1YmxpYyBmb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gIHB1YmxpYyBmaWx0ZXI6IFBpblJlZkxvb2t1cEZpbHRlcjtcclxuICBwdWJsaWMgcGluRmlsdGVyT3B0aW9ucz86IEluZGV4TG9va3VwRGVmaW5pdGlvbjtcclxuICBwdWJsaWMgbG9va3VwRGF0YT86IFBpbkxvb2t1cERhdGE7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdCgnaW5kZXhMb29rdXBEZWZpbml0aW9ucycpXHJcbiAgICBwcml2YXRlIF9wcmVzZXRMb29rdXBEZWZzOiBJbmRleExvb2t1cERlZmluaXRpb25zLFxyXG4gICAgcHVibGljIGl0ZW1Mb29rdXBTZXJ2aWNlOiBJdGVtUmVmTG9va3VwU2VydmljZSxcclxuICAgIHB1YmxpYyBwaW5Mb29rdXBTZXJ2aWNlOiBQaW5SZWZMb29rdXBTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfaXRlbVNlcnZpY2U6IEl0ZW1TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfdGhlc1NlcnZpY2U6IFRoZXNhdXJ1c1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9zbmFja2JhcjogTWF0U25hY2tCYXIsXHJcbiAgICBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXJcclxuICApIHtcclxuICAgIHRoaXMucGFydFR5cGVLZXlzID0gW107XHJcbiAgICB0aGlzLml0ZW1QYXJ0cyA9IFtdO1xyXG4gICAgdGhpcy5fc3VicyA9IFtdO1xyXG4gICAgdGhpcy5tb2RlbEVudHJpZXMgPSBbXTtcclxuICAgIC8vIHRoaXMgaXMgdGhlIGRlZmF1bHQgZmlsdGVyIGZvciB0aGUgcGluIGxvb2t1cCwgd2hpY2ggd2lsbFxyXG4gICAgLy8gYmUgbWVyZ2VkIHdpdGggdmFsdWVzIHByb3ZpZGVkIGJ5IHVzZXIgaGVyZVxyXG4gICAgdGhpcy5maWx0ZXIgPSB7XHJcbiAgICAgIHRleHQ6ICcnLFxyXG4gICAgICBsaW1pdDogMTAsXHJcbiAgICB9O1xyXG4gICAgLy8gZm9ybVxyXG4gICAgdGhpcy5pdGVtID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsKTtcclxuICAgIHRoaXMuaXRlbVBhcnQgPSBmb3JtQnVpbGRlci5jb250cm9sKG51bGwpO1xyXG4gICAgdGhpcy5wYXJ0VHlwZUtleSA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCk7XHJcbiAgICB0aGlzLmdpZCA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgW1xyXG4gICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICBWYWxpZGF0b3JzLm1heExlbmd0aCgzMDApLFxyXG4gICAgXSk7XHJcbiAgICB0aGlzLmxhYmVsID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLCBbXHJcbiAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDMwMCksXHJcbiAgICBdKTtcclxuICAgIHRoaXMuYnlUeXBlTW9kZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2woZmFsc2UsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLmV4dGVybmFsID0gZm9ybUJ1aWxkZXIuY29udHJvbChmYWxzZSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuZm9ybSA9IGZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgaXRlbTogdGhpcy5pdGVtLFxyXG4gICAgICBpdGVtUGFydDogdGhpcy5pdGVtUGFydCxcclxuICAgICAgcGFydFR5cGVLZXk6IHRoaXMucGFydFR5cGVLZXksXHJcbiAgICAgIGdpZDogdGhpcy5naWQsXHJcbiAgICAgIGxhYmVsOiB0aGlzLmxhYmVsLFxyXG4gICAgICBieVR5cGVNb2RlOiB0aGlzLmJ5VHlwZU1vZGUsXHJcbiAgICAgIGV4dGVybmFsOiB0aGlzLmV4dGVybmFsLFxyXG4gICAgfSk7XHJcbiAgICAvLyBldmVudHNcclxuICAgIHRoaXMudGFyZ2V0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxQaW5UYXJnZXQ+KCk7XHJcbiAgICB0aGlzLmVkaXRvckNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvcmNlQnlJdGVtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5waW5CeVR5cGVNb2RlID0gZmFsc2U7XHJcbiAgICB0aGlzLmNhblN3aXRjaE1vZGUgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBLZXlzKCk6IHZvaWQge1xyXG4gICAgLy8gdXNlIERJIHByZXNldHMgaWYgbm8gbG9va3VwIGRlZmluaXRpb25zXHJcbiAgICBpZiAoIXRoaXMubG9va3VwRGVmaW5pdGlvbnMpIHtcclxuICAgICAgdGhpcy5sb29rdXBEZWZpbml0aW9ucyA9IHRoaXMuX3ByZXNldExvb2t1cERlZnM7XHJcbiAgICB9XHJcbiAgICAvLyBrZXlzIGFyZSBhbGwgdGhlIGRlZmluZWQgbG9va3VwIHNlYXJjaGVzXHJcbiAgICB0aGlzLnBhcnRUeXBlS2V5cyA9IE9iamVjdC5rZXlzKHRoaXMubG9va3VwRGVmaW5pdGlvbnMpO1xyXG5cclxuICAgIC8vIGlmIG5vIGtleXMsIGdldCB0aGVtIGZyb20gdGhlc2F1cnVzIG1vZGVsLXR5cGVzO1xyXG4gICAgLy8gaWYgdGhpcyBpcyBub3QgYXZhaWxhYmxlLCBqdXN0IGZvcmNlIGJ5IGl0ZW0gbW9kZS5cclxuICAgIGlmICghdGhpcy5wYXJ0VHlwZUtleXMubGVuZ3RoKSB7XHJcbiAgICAgIGlmICh0aGlzLm1vZGVsRW50cmllcz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgLy8gc2V0IGxvb2t1cERlZmluaXRpb25zIGZyb20gdGhlc2F1cnVzIGVudHJpZXNcclxuICAgICAgICB0aGlzLmxvb2t1cERlZmluaXRpb25zID0ge307XHJcbiAgICAgICAgdGhpcy5tb2RlbEVudHJpZXMuZm9yRWFjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sb29rdXBEZWZpbml0aW9ucyFbZS52YWx1ZV0gPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IGUudmFsdWUsXHJcbiAgICAgICAgICAgIHR5cGVJZDogZS5pZCxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gc2V0IHR5cGUga2V5cyBmcm9tIHRoZXNhdXJ1cyBlbnRyaWVzXHJcbiAgICAgICAgdGhpcy5wYXJ0VHlwZUtleXMgPSB0aGlzLm1vZGVsRW50cmllcy5tYXAoKGUpID0+IGUudmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaWYgc3RpbGwgbm8ga2V5cywgZm9yY2UgYnkgaXRlbSBtb2RlXHJcbiAgICBpZiAoIXRoaXMucGFydFR5cGVLZXlzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmZvcmNlQnlJdGVtKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBzZXQgZGVmYXVsdCBrZXlcclxuICAgICAgdGhpcy5wYXJ0VHlwZUtleS5zZXRWYWx1ZShcclxuICAgICAgICB0aGlzLmRlZmF1bHRQYXJ0VHlwZUtleSB8fCB0aGlzLnBhcnRUeXBlS2V5c1swXVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgLy8gc2V0IHN0YXJ0IG1vZGUgaWYgcmVxdWlyZWRcclxuICAgIGlmICh0aGlzLl9zdGFydFdpdGhCeVR5cGVNb2RlKSB7XHJcbiAgICAgIHRoaXMuYnlUeXBlTW9kZS5zZXRWYWx1ZSh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB3aGVuZXZlciBpdGVtIGNoYW5nZXMsIHVwZGF0ZSBpdGVtJ3MgcGFydHMgYW5kIGZpbHRlclxyXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxyXG4gICAgICB0aGlzLml0ZW0udmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgZGVib3VuY2VUaW1lKDMwMCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pdGVtUGFydC5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgICAgIHRoaXMuaXRlbVBhcnRzID0gaXRlbT8ucGFydHMgfHwgW107XHJcbiAgICAgICAgICB0aGlzLmZpbHRlciA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy5maWx0ZXIsXHJcbiAgICAgICAgICAgIGl0ZW1JZDogaXRlbT8uaWQsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIC8vIHdoZW5ldmVyIGl0ZW1QYXJ0IGNoYW5nZXMsIHVwZGF0ZSB0YXJnZXQgYW5kIGV2ZW50dWFsbHkgZ2lkXHJcbiAgICB0aGlzLl9zdWJzLnB1c2goXHJcbiAgICAgIHRoaXMuaXRlbVBhcnQudmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgZGVib3VuY2VUaW1lKDMwMCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgocGFydCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmdpZC52YWx1ZSB8fCB0aGlzLmdpZC5wcmlzdGluZSkge1xyXG4gICAgICAgICAgICB0aGlzLmdpZC5zZXRWYWx1ZSh0aGlzLmJ1aWxkR2lkKCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5maWx0ZXIgPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZmlsdGVyLFxyXG4gICAgICAgICAgICBwYXJ0SWQ6IHBhcnQ/LmlkLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMudXBkYXRlVGFyZ2V0KCk7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgLy8gd2hlbmV2ZXIgcGFydFR5cGVLZXkgY2hhbmdlcywgdXBkYXRlIGZpbHRlcidzIG9wdGlvbnNcclxuICAgIHRoaXMuX3N1YnMucHVzaChcclxuICAgICAgdGhpcy5wYXJ0VHlwZUtleS52YWx1ZUNoYW5nZXNcclxuICAgICAgICAucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCBkZWJvdW5jZVRpbWUoMzAwKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChrZXkpID0+IHtcclxuICAgICAgICAgIHRoaXMucGluRmlsdGVyT3B0aW9ucyA9IGtleVxyXG4gICAgICAgICAgICA/IHRoaXMubG9va3VwRGVmaW5pdGlvbnMhW2tleV1cclxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgLy8gd2hlbmV2ZXIgZXh0ZXJuYWwgY2hhbmdlcywgc2V0IHJlcXVpcmVkIHZhbGlkYXRvciBpbiBsYWJlbFxyXG4gICAgLy8gKHRydWUgZm9yIGV4dGVybmFsLCBmYWxzZSBmb3IgaW50ZXJuYWwpXHJcbiAgICB0aGlzLl9zdWJzLnB1c2goXHJcbiAgICAgIHRoaXMuZXh0ZXJuYWwudmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgZGVib3VuY2VUaW1lKDMwMCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoZXh0ZXJuYWwpID0+IHtcclxuICAgICAgICAgIGlmIChleHRlcm5hbCkge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsLnNldFZhbGlkYXRvcnMoW1xyXG4gICAgICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgICAgICAgICAgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMzAwKSxcclxuICAgICAgICAgICAgXSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDMwMCldKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubGFiZWwudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIC8vIGxvYWQgbW9kZWwtdHlwZXMgdGhlc2F1cnVzIGVudHJpZXNcclxuICAgIHRoaXMuX3RoZXNTZXJ2aWNlLmdldFRoZXNhdXJ1cygnbW9kZWwtdHlwZXMnLCB0cnVlKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAodCkgPT4ge1xyXG4gICAgICAgIHRoaXMubW9kZWxFbnRyaWVzID0gdC5lbnRyaWVzIHx8IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLm1vZGVsRW50cmllcz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aGlzLnNldHVwS2V5cygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmZvcmNlQnlJdGVtKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZm9yY2VCeUl0ZW0oKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9zdWJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMuX3N1YnNbaV0udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRHaWQoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICAvLyB0aGUgR0lEIGlzIHRoZSBwYXJ0IElEIGlmIGFueSwgb3IgdGhlIGl0ZW0gSUQsIGZvbGxvd2VkIGJ5XHJcbiAgICAvLyB0aGUgcGluJ3MgdmFsdWUgKD1FSUQpXHJcbiAgICBjb25zdCBwaW4gPSB0aGlzLmxvb2t1cERhdGE/LnBpbjtcclxuICAgIGlmICghcGluPy52YWx1ZSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiBwaW4ucGFydElkXHJcbiAgICAgID8gYFAke3Bpbi5wYXJ0SWR9LyR7cGluLnZhbHVlfWBcclxuICAgICAgOiBgSSR7cGluLml0ZW1JZH0vJHtwaW4udmFsdWV9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRMYWJlbCgpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGlmICghdGhpcy5sb29rdXBEYXRhPy5waW4pIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzYjogc3RyaW5nW10gPSBbXTtcclxuICAgIC8vIHBpbiB2YWx1ZVxyXG4gICAgaWYgKHRoaXMubG9va3VwRGF0YS5waW4udmFsdWUpIHtcclxuICAgICAgc2IucHVzaCh0aGlzLmxvb2t1cERhdGEucGluLnZhbHVlKTtcclxuICAgICAgc2IucHVzaCgnIHwgJyk7XHJcbiAgICB9XHJcbiAgICAvLyBpdGVtIHRpdGxlXHJcbiAgICBzYi5wdXNoKHRoaXMubG9va3VwRGF0YS5pdGVtPy50aXRsZSB8fCB0aGlzLmxvb2t1cERhdGEucGluPy5pdGVtSWQpO1xyXG4gICAgLy8gcGFydCB0eXBlIGFuZCByb2xlXHJcbiAgICBpZiAodGhpcy5sb29rdXBEYXRhLnBpbi5wYXJ0VHlwZUlkKSB7XHJcbiAgICAgIGNvbnN0IGUgPSB0aGlzLm1vZGVsRW50cmllcz8uZmluZChcclxuICAgICAgICAoZSkgPT4gZS5pZCA9PT0gdGhpcy5sb29rdXBEYXRhIS5waW4ucGFydFR5cGVJZFxyXG4gICAgICApO1xyXG4gICAgICBzYi5wdXNoKCcgKCcpO1xyXG4gICAgICBzYi5wdXNoKGU/LnZhbHVlIHx8IHRoaXMubG9va3VwRGF0YS5waW4ucGFydFR5cGVJZCk7XHJcbiAgICAgIGlmICh0aGlzLmxvb2t1cERhdGEucGluLnJvbGVJZCkge1xyXG4gICAgICAgIHNiLnB1c2goYCwgJHt0aGlzLmxvb2t1cERhdGEucGluLnJvbGVJZH1gKTtcclxuICAgICAgfVxyXG4gICAgICBzYi5wdXNoKCcpJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2Iuam9pbignJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFRhcmdldCgpOiBQaW5UYXJnZXQge1xyXG4gICAgaWYgKHRoaXMuZXh0ZXJuYWwudmFsdWUpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBnaWQ6IHRoaXMuZ2lkLnZhbHVlIHx8ICcnLFxyXG4gICAgICAgIGxhYmVsOiB0aGlzLmxhYmVsLnZhbHVlIHx8ICcnLFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgcGluID0gdGhpcy5sb29rdXBEYXRhPy5waW47XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgZ2lkOiB0aGlzLmdpZC52YWx1ZSB8fCAnJyxcclxuICAgICAgICBsYWJlbDogdGhpcy5sYWJlbC52YWx1ZSB8fCAnJyxcclxuICAgICAgICBpdGVtSWQ6IHBpbj8uaXRlbUlkIHx8ICcnLFxyXG4gICAgICAgIHBhcnRJZDogcGluPy5wYXJ0SWQgfHwgJycsXHJcbiAgICAgICAgcGFydFR5cGVJZDogcGluPy5wYXJ0VHlwZUlkIHx8ICcnLFxyXG4gICAgICAgIHJvbGVJZDogcGluPy5yb2xlSWQgfHwgJycsXHJcbiAgICAgICAgbmFtZTogcGluPy5uYW1lIHx8ICcnLFxyXG4gICAgICAgIHZhbHVlOiBwaW4/LnZhbHVlIHx8ICcnLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVUYXJnZXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fbm9UYXJnZXRVcGRhdGUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmV4dGVybmFsLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZ2lkLnNldFZhbHVlKHRoaXMuYnVpbGRHaWQoKSk7XHJcbiAgICAgIHRoaXMuZ2lkLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgdGhpcy5naWQubWFya0FzRGlydHkoKTtcclxuICAgICAgdGhpcy5sYWJlbC5zZXRWYWx1ZSh0aGlzLmJ1aWxkTGFiZWwoKSk7XHJcbiAgICAgIHRoaXMubGFiZWwudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICB0aGlzLmxhYmVsLm1hcmtBc0RpcnR5KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl90YXJnZXQgPSB0aGlzLmdldFRhcmdldCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVGb3JtKHRhcmdldD86IFBpblRhcmdldCk6IHZvaWQge1xyXG4gICAgLy8gYnVpbGQgcGluIGluZm8gZnJvbSB0YXJnZXRcclxuICAgIGlmICghdGFyZ2V0KSB7XHJcbiAgICAgIHRoaXMubG9va3VwRGF0YSA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5pdGVtLnJlc2V0KCk7XHJcbiAgICAgIHRoaXMuaXRlbVBhcnQucmVzZXQoKTtcclxuICAgICAgdGhpcy5naWQucmVzZXQoKTtcclxuICAgICAgdGhpcy5sYWJlbC5yZXNldCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9ub1RhcmdldFVwZGF0ZSA9IHRydWU7XHJcbiAgICB0aGlzLmdpZC5zZXRWYWx1ZSh0YXJnZXQuZ2lkIHx8ICcnKTtcclxuICAgIHRoaXMubGFiZWwuc2V0VmFsdWUodGFyZ2V0LmxhYmVsIHx8ICcnKTtcclxuICAgIHRoaXMubG9va3VwRGF0YSA9IHtcclxuICAgICAgcGluOiB7XHJcbiAgICAgICAgaXRlbUlkOiB0YXJnZXQuaXRlbUlkIHx8ICcnLFxyXG4gICAgICAgIHBhcnRJZDogdGFyZ2V0LnBhcnRJZCB8fCAnJyxcclxuICAgICAgICBwYXJ0VHlwZUlkOiB0YXJnZXQucGFydFR5cGVJZCB8fCAnJyxcclxuICAgICAgICByb2xlSWQ6IHRhcmdldC5yb2xlSWQgfHwgJycsXHJcbiAgICAgICAgbmFtZTogdGFyZ2V0Lm5hbWUgfHwgJycsXHJcbiAgICAgICAgdmFsdWU6IHRhcmdldC52YWx1ZSB8fCAnJyxcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgICAvLyBnZXQgaXRlbVxyXG4gICAgaWYgKHRhcmdldC5pdGVtSWQpIHtcclxuICAgICAgdGhpcy5faXRlbVNlcnZpY2UuZ2V0SXRlbSh0YXJnZXQuaXRlbUlkLCB0cnVlLCB0cnVlKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChpdGVtKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLml0ZW0uc2V0VmFsdWUoaXRlbSk7XHJcbiAgICAgICAgICB0aGlzLmZvcm0ubWFya0FzUHJpc3RpbmUoKTtcclxuICAgICAgICAgIHRoaXMuX25vVGFyZ2V0VXBkYXRlID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmV4dGVybmFsLnNldFZhbHVlKCF0YXJnZXQubmFtZSk7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRhcmdldCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoSlNPTi5zdHJpbmdpZnkoZXJyb3IpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZXh0ZXJuYWwuc2V0VmFsdWUoIXRhcmdldC5uYW1lKTtcclxuICAgICAgICAgIHRoaXMuX25vVGFyZ2V0VXBkYXRlID0gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmV4dGVybmFsLnNldFZhbHVlKCF0YXJnZXQubmFtZSk7XHJcbiAgICAgIHRoaXMuX25vVGFyZ2V0VXBkYXRlID0gZmFsc2U7XHJcbiAgICAgIHRoaXMudXBkYXRlVGFyZ2V0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxsZWQgd2hlbiB0aGUgaXRlbSBsb29rdXAgY2hhbmdlcyAoaXRlbSBpcyBsb29rZWQgdXBcclxuICAgKiBieSBpdHMgdGl0bGUpLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gZ290IGZyb20gbG9va3VwLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBvbkl0ZW1Mb29rdXBDaGFuZ2UoaXRlbTogSXRlbSk6IHZvaWQge1xyXG4gICAgLy8gbG9hZCBpdGVtJ3MgcGFydHNcclxuICAgIHRoaXMuX2l0ZW1TZXJ2aWNlLmdldEl0ZW0oaXRlbS5pZCwgdHJ1ZSwgdHJ1ZSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGkpID0+IHtcclxuICAgICAgICAvLyBzZXR0aW5nIHRoZSBpdGVtIHdpbGwgdHJpZ2dlciBpdHMgcGFydHMgdXBkYXRlXHJcbiAgICAgICAgdGhpcy5pdGVtLnNldFZhbHVlKGkpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlVGFyZ2V0KCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoSlNPTi5zdHJpbmdpZnkoZXJyb3IpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pdGVtUGFydC5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgICB0aGlzLml0ZW1QYXJ0cyA9IFtdO1xyXG4gICAgICAgIHRoaXMudXBkYXRlVGFyZ2V0KCk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZEl0ZW1JbmZvKHBpbjogRGF0YVBpbkluZm8pOiB2b2lkIHtcclxuICAgIGZvcmtKb2luKHtcclxuICAgICAgaXRlbTogdGhpcy5faXRlbVNlcnZpY2UuZ2V0SXRlbShwaW4uaXRlbUlkLCBmYWxzZSwgdHJ1ZSksXHJcbiAgICAgIHBhcnQ6IHRoaXMuX2l0ZW1TZXJ2aWNlLmdldFBhcnRGcm9tVHlwZUFuZFJvbGUoXHJcbiAgICAgICAgcGluLml0ZW1JZCxcclxuICAgICAgICBNRVRBREFUQV9QQVJUX0lELFxyXG4gICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICB0cnVlXHJcbiAgICAgICksXHJcbiAgICB9KVxyXG4gICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxvb2t1cERhdGEgPSB7XHJcbiAgICAgICAgICAgIHBpbjogcGluLFxyXG4gICAgICAgICAgICBpdGVtOiByZXN1bHQuaXRlbSEsXHJcbiAgICAgICAgICAgIG1ldGFQYXJ0OiByZXN1bHQucGFydCBhcyBNZXRhZGF0YVBhcnQsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVUYXJnZXQoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMubG9va3VwRGF0YSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgICAgICAgICAgIGVycm9yID8gSlNPTi5zdHJpbmdpZnkoZXJyb3IpIDogJ0Vycm9yIGxvYWRpbmcgaXRlbS9tZXRhZGF0YSdcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGluIGxvb2t1cCBjaGFuZ2UuIEEgcGluIGlzIGxvb2tlZCB1cCBieSBpdHNcclxuICAgKiBuYW1lIGFuZCB2YWx1ZSAoPXRoZSBmaWx0ZXIncyB0ZXh0KSwgYW5kIG9wdGlvbmFsbHkgYnk6XHJcbiAgICogLSBpdHMgaW5kZXggbG9va3VwIGRlZmluaXRpb24gKHNlbGVjdGVkIGJ5IHBhcnRUeXBlS2V5KS5cclxuICAgKiAtIGl0cyBpdGVtIChkZWZpbmVkIGJ5IGl0ZW0sIGluIGZpbHRlcikuXHJcbiAgICogLSBpdHMgcGFydCAoZGVmaW5lZCBieSBpdGVtUGFydCwgaW4gZmlsdGVyKS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBpbmZvIFRoZSBwaW4gaW5mbyBmcm9tIHBpbiBsb29rdXAuXHJcbiAgICovXHJcbiAgcHVibGljIG9uUGluTG9va3VwQ2hhbmdlKGluZm86IERhdGFQaW5JbmZvKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvYWRJdGVtSW5mbyhpbmZvKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNvcGllZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3NuYWNrYmFyLm9wZW4oJ0NvcGllZCB0byBjbGlwYm9hcmQnLCAnT0snLCB7XHJcbiAgICAgIGR1cmF0aW9uOiAxNTAwLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmVkaXRvckNsb3NlLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzYXZlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX3RhcmdldCA9IHRoaXMuZ2V0VGFyZ2V0KCk7XHJcbiAgICB0aGlzLnRhcmdldENoYW5nZS5lbWl0KHRoaXMuX3RhcmdldCk7XHJcbiAgfVxyXG59XHJcbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIChzdWJtaXQpPVwic2F2ZSgpXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XHJcbiAgICA8IS0tIGV4dGVybmFsIC0tPlxyXG4gICAgPG1hdC1jaGVja2JveCBbZm9ybUNvbnRyb2xdPVwiZXh0ZXJuYWxcIj5leHRlcm5hbDwvbWF0LWNoZWNrYm94PlxyXG4gICAgPCEtLSBtb2RlIHN3aXRjaGVyIC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cIiFleHRlcm5hbC52YWx1ZVwiPlxyXG4gICAgICA8bWF0LWNoZWNrYm94IFtmb3JtQ29udHJvbF09XCJieVR5cGVNb2RlXCIgKm5nSWY9XCJjYW5Td2l0Y2hNb2RlXCI+XHJcbiAgICAgICAgYnkgdHlwZTwvbWF0LWNoZWNrYm94XHJcbiAgICAgID5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cclxuICAgIDwhLS0gbGFiZWwgLS0+XHJcbiAgICA8ZGl2PlxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJleHRlcm5hbC52YWx1ZSB8fCBjYW5FZGl0VGFyZ2V0XCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbD5sYWJlbDwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwibGFiZWxcIiAvPlxyXG4gICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICpuZ0lmPVwiJGFueShsYWJlbCkuZXJyb3JzPy5yZXF1aXJlZCAmJiAobGFiZWwuZGlydHkgfHwgbGFiZWwudG91Y2hlZClcIlxyXG4gICAgICAgICAgPmxhYmVsIHJlcXVpcmVkPC9tYXQtZXJyb3JcclxuICAgICAgICA+XHJcbiAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgJGFueShsYWJlbCkuZXJyb3JzPy5tYXhMZW5ndGggJiYgKGxhYmVsLmRpcnR5IHx8IGxhYmVsLnRvdWNoZWQpXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgICAgPmxhYmVsIHRvbyBsb25nPC9tYXQtZXJyb3JcclxuICAgICAgICA+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIiFleHRlcm5hbC52YWx1ZSAmJiAhY2FuRWRpdFRhcmdldCAmJiBsYWJlbC52YWx1ZVwiXHJcbiAgICAgICAgY2xhc3M9XCJpbmZvXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5sYWJlbDwvc3Bhbj57eyBsYWJlbC52YWx1ZSB9fVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gZ2lkIC0tPlxyXG4gICAgPGRpdj5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiZXh0ZXJuYWwudmFsdWUgfHwgY2FuRWRpdFRhcmdldFwiPlxyXG4gICAgICAgIDxtYXQtbGFiZWw+R0lEPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJnaWRcIiAvPlxyXG4gICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICpuZ0lmPVwiJGFueShnaWQpLmVycm9ycz8ucmVxdWlyZWQgJiYgKGdpZC5kaXJ0eSB8fCBnaWQudG91Y2hlZClcIlxyXG4gICAgICAgICAgPkdJRCByZXF1aXJlZDwvbWF0LWVycm9yXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICpuZ0lmPVwiJGFueShnaWQpLmVycm9ycz8ubWF4TGVuZ3RoICYmIChnaWQuZGlydHkgfHwgZ2lkLnRvdWNoZWQpXCJcclxuICAgICAgICAgID5HSUQgdG9vIGxvbmc8L21hdC1lcnJvclxyXG4gICAgICAgID5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPGRpdiAqbmdJZj1cIiFleHRlcm5hbC52YWx1ZSAmJiAhY2FuRWRpdFRhcmdldCAmJiBnaWQudmFsdWVcIiBjbGFzcz1cImluZm9cIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+R0lEPC9zcGFuPiA8c3BhbiBjbGFzcz1cImdpZFwiPnt7IGdpZC52YWx1ZSB9fTwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBCWSBJVEVNIC0tPlxyXG4gIDxkaXYgKm5nSWY9XCIhZXh0ZXJuYWwudmFsdWVcIj5cclxuICAgIDxmaWVsZHNldCAqbmdJZj1cIiFieVR5cGVNb2RlLnZhbHVlXCIgY2xhc3M9XCJmb3JtLXJvd1wiPlxyXG4gICAgICA8bGVnZW5kPnBpbiBmaWx0ZXJzPC9sZWdlbmQ+XHJcbiAgICAgIDwhLS0gaXRlbSBmaWx0ZXIgLS0+XHJcbiAgICAgIDxjYWRtdXMtcmVmLWxvb2t1cFxyXG4gICAgICAgIFtzZXJ2aWNlXT1cIml0ZW1Mb29rdXBTZXJ2aWNlXCJcclxuICAgICAgICBsYWJlbD1cIml0ZW1cIlxyXG4gICAgICAgIChpdGVtQ2hhbmdlKT1cIm9uSXRlbUxvb2t1cENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgPjwvY2FkbXVzLXJlZi1sb29rdXA+XHJcblxyXG4gICAgICA8IS0tIHBhcnQgZmlsdGVyIC0tPlxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJpdGVtUGFydHMubGVuZ3RoXCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbD5wYXJ0PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPG1hdC1zZWxlY3QgW2Zvcm1Db250cm9sXT1cIml0ZW1QYXJ0XCI+XHJcbiAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwibnVsbFwiPihhbnkpPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHAgb2YgaXRlbVBhcnRzXCIgW3ZhbHVlXT1cInBcIj57e1xyXG4gICAgICAgICAgICBwLnR5cGVJZCB8IGZsYXRMb29rdXAgOiBtb2RlbEVudHJpZXMgOiBcImlkXCIgOiBcInZhbHVlXCJcclxuICAgICAgICAgIH19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDwvZmllbGRzZXQ+XHJcblxyXG4gICAgPCEtLSBCWSBUWVBFIC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cImJ5VHlwZU1vZGUudmFsdWVcIj5cclxuICAgICAgPCEtLSBwYXIgdHlwZSBmaWx0ZXIgLS0+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cInBhcnRUeXBlS2V5cz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbD5wYXJ0IHR5cGU8L21hdC1sYWJlbD5cclxuICAgICAgICA8bWF0LXNlbGVjdCBbZm9ybUNvbnRyb2xdPVwicGFydFR5cGVLZXlcIj5cclxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBrIG9mIHBhcnRUeXBlS2V5c1wiIFt2YWx1ZV09XCJrXCI+e3tcclxuICAgICAgICAgICAga1xyXG4gICAgICAgICAgfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBQSU4gLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwicGFydFR5cGVLZXkudmFsdWVcIj5cclxuICAgICAgPCEtLSBwaW4gbG9va3VwIC0tPlxyXG4gICAgICA8Y2FkbXVzLXJlZi1sb29rdXBcclxuICAgICAgICBbc2VydmljZV09XCJwaW5Mb29rdXBTZXJ2aWNlXCJcclxuICAgICAgICBbYmFzZUZpbHRlcl09XCJmaWx0ZXJcIlxyXG4gICAgICAgIFtvcHRpb25zXT1cInBpbkZpbHRlck9wdGlvbnNcIlxyXG4gICAgICAgIGxhYmVsPVwicGluXCJcclxuICAgICAgICAoaXRlbUNoYW5nZSk9XCJvblBpbkxvb2t1cENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgPjwvY2FkbXVzLXJlZi1sb29rdXA+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIGRhdGEgLS0+XHJcbiAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbCBpZD1cImRhdGFcIiAqbmdJZj1cImxvb2t1cERhdGE/LnBpbj8ubmFtZVwiPlxyXG4gICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+cGluIGRhdGE8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICA8IS0tIHRhYmxlIC0tPlxyXG4gICAgICA8dGFibGU+XHJcbiAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgPHRoPjwvdGg+XHJcbiAgICAgICAgICA8dGg+c291cmNlPC90aD5cclxuICAgICAgICAgIDx0aD52YWx1ZTwvdGg+XHJcbiAgICAgICAgPC90aGVhZD5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICA8IS0tIHBpbiAtLT5cclxuICAgICAgICAgIDx0ciAqbmdJZj1cImxvb2t1cERhdGE/LnBpbj8udmFsdWVcIj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgW2Nka0NvcHlUb0NsaXBib2FyZF09XCJsb29rdXBEYXRhIS5waW4hLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgIChjZGtDb3B5VG9DbGlwYm9hcmRDb3BpZWQpPVwib25Db3BpZWQoKVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNvbnRlbnRfY29weTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5waW48L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgbG9va3VwRGF0YSEucGluLnZhbHVlIH19PC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICA8IS0tIGl0ZW0gSUQgLS0+XHJcbiAgICAgICAgICA8dHIgKm5nSWY9XCJsb29rdXBEYXRhPy5waW4/Lml0ZW1JZFwiPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICBbY2RrQ29weVRvQ2xpcGJvYXJkXT1cImxvb2t1cERhdGEhLnBpbiEuaXRlbUlkXCJcclxuICAgICAgICAgICAgICAgIChjZGtDb3B5VG9DbGlwYm9hcmRDb3BpZWQpPVwib25Db3BpZWQoKVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNvbnRlbnRfY29weTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5pdGVtIElEPC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IGxvb2t1cERhdGEhLnBpbi5pdGVtSWQgfX08L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwhLS0gaXRlbSB0aXRsZSAtLT5cclxuICAgICAgICAgIDx0ciAqbmdJZj1cImxvb2t1cERhdGE/Lml0ZW0/LnRpdGxlXCI+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgIFtjZGtDb3B5VG9DbGlwYm9hcmRdPVwibG9va3VwRGF0YSEuaXRlbSEudGl0bGVcIlxyXG4gICAgICAgICAgICAgICAgKGNka0NvcHlUb0NsaXBib2FyZENvcGllZCk9XCJvbkNvcGllZCgpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPml0ZW0gdGl0bGU8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgbG9va3VwRGF0YSEuaXRlbSEudGl0bGUgfX08L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwhLS0gcGFydCBJRCAtLT5cclxuICAgICAgICAgIDx0ciAqbmdJZj1cImxvb2t1cERhdGE/LnBpbj8ucGFydElkXCI+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgIFtjZGtDb3B5VG9DbGlwYm9hcmRdPVwibG9va3VwRGF0YSEucGluIS5wYXJ0SWRcIlxyXG4gICAgICAgICAgICAgICAgKGNka0NvcHlUb0NsaXBib2FyZENvcGllZCk9XCJvbkNvcGllZCgpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPnBhcnQgSUQ8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgbG9va3VwRGF0YSEucGluLnBhcnRJZCB9fTwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgPCEtLSBwYXJ0IHR5cGUgSUQgLS0+XHJcbiAgICAgICAgICA8dHIgKm5nSWY9XCJsb29rdXBEYXRhPy5waW4/LnBhcnRUeXBlSWRcIj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgW2Nka0NvcHlUb0NsaXBib2FyZF09XCJsb29rdXBEYXRhIS5waW4hLnBhcnRUeXBlSWRcIlxyXG4gICAgICAgICAgICAgICAgKGNka0NvcHlUb0NsaXBib2FyZENvcGllZCk9XCJvbkNvcGllZCgpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPnBhcnQgdHlwZSBJRDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyBsb29rdXBEYXRhIS5waW4hLnBhcnRUeXBlSWQgfX08L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwhLS0gcGFydCByb2xlIElEIC0tPlxyXG4gICAgICAgICAgPHRyICpuZ0lmPVwibG9va3VwRGF0YT8ucGluPy5yb2xlSWRcIj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgW2Nka0NvcHlUb0NsaXBib2FyZF09XCJsb29rdXBEYXRhIS5waW4hLnJvbGVJZCFcIlxyXG4gICAgICAgICAgICAgICAgKGNka0NvcHlUb0NsaXBib2FyZENvcGllZCk9XCJvbkNvcGllZCgpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPnBhcnQgcm9sZSBJRDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyBsb29rdXBEYXRhIS5waW4hLnJvbGVJZCB9fTwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG5cclxuICAgICAgICAgIDwhLS0gcGFydCdzIG1ldGFkYXRhIC0tPlxyXG4gICAgICAgICAgPHRyXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cIlxyXG4gICAgICAgICAgICAgIGxldCBtIG9mIGxvb2t1cERhdGE/Lm1ldGFQYXJ0Py5tZXRhZGF0YSB8fCBbXTtcclxuICAgICAgICAgICAgICBsZXQgaSA9IGluZGV4XHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgIFtjZGtDb3B5VG9DbGlwYm9hcmRdPVwibS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAoY2RrQ29weVRvQ2xpcGJvYXJkQ29waWVkKT1cIm9uQ29waWVkKClcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jb250ZW50X2NvcHk8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJtZXRhZGF0YVwiPnt7IG0ubmFtZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIm1ldGFkYXRhXCI+e3sgbS52YWx1ZSB9fTwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gYnV0dG9ucyAtLT5cclxuICA8ZGl2PlxyXG4gICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjbG9zZSgpXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBjb2xvcj1cIndhcm5cIj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBbZGlzYWJsZWRdPVwiZm9ybS5pbnZhbGlkXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBjb2xvcj1cInByaW1hcnlcIj5jaGVja19jaXJjbGU8L21hdC1pY29uPiB0YXJnZXRcclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L2Zvcm0+XHJcbiJdfQ==
453
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGluLXRhcmdldC1sb29rdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vY2FkbXVzLXJlZnMtYXNzZXJ0ZWQtaWRzL3NyYy9saWIvcGluLXRhcmdldC1sb29rdXAvcGluLXRhcmdldC1sb29rdXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vY2FkbXVzLXJlZnMtYXNzZXJ0ZWQtaWRzL3NyYy9saWIvcGluLXRhcmdldC1sb29rdXAvcGluLXRhcmdldC1sb29rdXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUlMLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFFTCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLFFBQVEsRUFDUixJQUFJLEdBQ0wsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QmQsNEJBQTRCO0FBQzVCLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUM7QUFtQzdDOzs7Ozs7R0FNRztBQUNILE1BS2Esd0JBQXdCO0lBTW5DOzs7T0FHRztJQUNILElBQ1csYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFDRCxJQUFXLGFBQWEsQ0FBQyxLQUEwQjtRQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNwQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1NBQ25DO2FBQU07WUFDTCxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLENBQUM7WUFDekMs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QUR2QixLQUFLO2dCQU1DLGdCQUFnQjtzQkFEdEIsS0FBSztnQkFRQyxlQUFlO3NCQURyQixLQUFLO2dCQU9LLE1BQU07c0JBRGhCLEtBQUs7Z0JBZ0JDLGtCQUFrQjtzQkFEeEIsS0FBSztnQkFPQyxXQUFXO3NCQURqQixNQUFNO2dCQU9BLFlBQVk7c0JBRGxCLE1BQU07Z0JBSUEsY0FBYztzQkFEcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgRm9ybUJ1aWxkZXIsXHJcbiAgRm9ybUNvbnRyb2wsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge1xyXG4gIFN1YnNjcmlwdGlvbixcclxuICBkZWJvdW5jZVRpbWUsXHJcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXHJcbiAgZm9ya0pvaW4sXHJcbiAgdGFrZSxcclxufSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xyXG5cclxuaW1wb3J0IHsgSXRlbVNlcnZpY2UsIFRoZXNhdXJ1c1NlcnZpY2UgfSBmcm9tICdAbXlybWlkb24vY2FkbXVzLWFwaSc7XHJcbmltcG9ydCB7XHJcbiAgRGF0YVBpbkluZm8sXHJcbiAgSW5kZXhMb29rdXBEZWZpbml0aW9uLFxyXG4gIEluZGV4TG9va3VwRGVmaW5pdGlvbnMsXHJcbiAgSXRlbSxcclxuICBQYXJ0LFxyXG4gIFRoZXNhdXJ1c0VudHJ5LFxyXG59IGZyb20gJ0BteXJtaWRvbi9jYWRtdXMtY29yZSc7XHJcblxyXG5pbXBvcnQge1xyXG4gIFBpblJlZkxvb2t1cEZpbHRlcixcclxuICBQaW5SZWZMb29rdXBTZXJ2aWNlLFxyXG59IGZyb20gJy4uL3NlcnZpY2VzL3Bpbi1yZWYtbG9va3VwLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJdGVtUmVmTG9va3VwU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2l0ZW0tcmVmLWxvb2t1cC5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBSZWZMb29rdXBDb25maWcsXHJcbiAgUmVmTG9va3VwU2V0RXZlbnQsXHJcbn0gZnJvbSAnQG15cm1pZG9uL2NhZG11cy1yZWZzLWxvb2t1cCc7XHJcblxyXG4vLyBmcm9tIENhZG11cyBnZW5lcmFsIHBhcnRzXHJcbmNvbnN0IE1FVEFEQVRBX1BBUlRfSUQgPSAnaXQudmVkcGgubWV0YWRhdGEnO1xyXG5pbnRlcmZhY2UgTWV0YWRhdGFQYXJ0IGV4dGVuZHMgUGFydCB7XHJcbiAgbWV0YWRhdGE6IHtcclxuICAgIHR5cGU/OiBzdHJpbmc7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICB2YWx1ZTogc3RyaW5nO1xyXG4gIH1bXTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFBpbiBsb29rdXAgZGF0YSB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBvbmVudC5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGluTG9va3VwRGF0YSB7XHJcbiAgcGluOiBEYXRhUGluSW5mbztcclxuICBpdGVtPzogSXRlbTtcclxuICBtZXRhUGFydD86IE1ldGFkYXRhUGFydDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgcGluLWJhc2VkIHRhcmdldC4gVGhpcyBpbmNsdWRlcyBwaW4ncyBuYW1lIGFuZCB2YWx1ZSwgYW5kXHJcbiAqIHRoZSBpdGVtJ3MgSUQgYW5kIG9wdGlvbmFsIHBhcnQgSURzLiBUaGUgbGFiZWwgaXMgYSB1c2VyIGZyaWVuZGx5XHJcbiAqIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGFyZ2V0LCB3aGlsZSB0aGUgZ2lkIGlzIGEgZ2xvYmFsbHlcclxuICogdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB0YXJnZXQuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBpblRhcmdldCB7XHJcbiAgZ2lkOiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBpdGVtSWQ/OiBzdHJpbmc7XHJcbiAgcGFydElkPzogc3RyaW5nO1xyXG4gIHBhcnRUeXBlSWQ/OiBzdHJpbmc7XHJcbiAgcm9sZUlkPzogc3RyaW5nO1xyXG4gIG5hbWU/OiBzdHJpbmc7XHJcbiAgdmFsdWU/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qXHJcbiAqIFNjb3BlZCBwaW4tYmFzZWQgbG9va3VwIGNvbXBvbmVudC4gVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBsaXN0XHJcbiAqIG9mIHBpbi1iYXNlZCBzZWFyY2hlcywgd2l0aCBhIGxvb2t1cCBjb250cm9sLiBXaGVuZXZlciB0aGUgdXNlclxyXG4gKiBwaWNrcyBhIHBpbiB2YWx1ZSwgaGUgZ2V0cyB0aGUgZGV0YWlscyBhYm91dCBpdHMgaXRlbSBhbmQgcGFydCwgYW5kXHJcbiAqIGl0ZW0ncyBtZXRhZGF0YSBwYXJ0LCBpZiBhbnkuIEhlIGNhbiB0aGVuIHVzZSB0aGVzZSBkYXRhIHRvIGJ1aWxkXHJcbiAqIHNvbWUgRUlEIGJ5IHZhcmlvdXNseSBhc3NlbWJsaW5nIHRoZXNlIGNvbXBvbmVudHMuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2NhZG11cy1waW4tdGFyZ2V0LWxvb2t1cCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3Bpbi10YXJnZXQtbG9va3VwLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9waW4tdGFyZ2V0LWxvb2t1cC5jb21wb25lbnQuY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQaW5UYXJnZXRMb29rdXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgcHJpdmF0ZSBfc3ViczogU3Vic2NyaXB0aW9uW107XHJcbiAgcHJpdmF0ZSBfdGFyZ2V0OiBQaW5UYXJnZXQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfbm9UYXJnZXRVcGRhdGU/OiBib29sZWFuO1xyXG4gIHByaXZhdGUgX3N0YXJ0V2l0aEJ5VHlwZU1vZGU/OiBib29sZWFuO1xyXG5cclxuICAvKipcclxuICAgKiBUcnVlIHdoZW4gdGhlIGJ5LXR5cGUgcGluIGxvb2t1cCBtb2RlIGlzIGFjdGl2ZS5cclxuICAgKiBVc2VyIGNhbiBjaGFuZ2UgbW9kZSB1bmxlc3MgbW9kZVN3aXRjaGluZyBpcyBmYWxzZS5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgcGluQnlUeXBlTW9kZSgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLmJ5VHlwZU1vZGU/LnZhbHVlO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHBpbkJ5VHlwZU1vZGUodmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICghdGhpcy5ieVR5cGVNb2RlKSB7XHJcbiAgICAgIHRoaXMuX3N0YXJ0V2l0aEJ5VHlwZU1vZGUgPSB2YWx1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYnlUeXBlTW9kZS5zZXRWYWx1ZSh2YWx1ZSB8fCBmYWxzZSk7XHJcbiAgICAgIHRoaXMuYnlUeXBlTW9kZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcnVlIHdoZW4gdGhlIHVzZXIgY2FuIHN3aXRjaCBiZXR3ZWVuIGJ5LXR5cGUgYW5kIGJ5LWl0ZW0gbW9kZS5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBjYW5Td2l0Y2hNb2RlPzogYm9vbGVhbjtcclxuICAvKipcclxuICAgKiBUcnVlIHdoZW4gdGhlIHVzZXIgY2FuIGVkaXQgdGhlIHRhcmdldCdzIGdpZC9sYWJlbCBmb3IgaW50ZXJuYWxcclxuICAgKiB0YXJnZXRzLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGNhbkVkaXRUYXJnZXQ/OiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIFRoZSBsb29rdXAgZGVmaW5pdGlvbnMgdG8gYmUgdXNlZCBmb3IgdGhlIGJ5LXR5cGUgbG9va3VwLiBJZlxyXG4gICAqIG5vdCBzcGVjaWZpZWQsIHRoZSBsb29rdXAgZGVmaW5pdGlvbnMgd2lsbCBiZSBnb3QgdmlhIGluamVjdGlvblxyXG4gICAqIHdoZW4gYXZhaWxhYmxlOyBpZiB0aGUgaW5qZWN0ZWQgZGVmaW5pdGlvbnMgYXJlIGVtcHR5LCB0aGVcclxuICAgKiBsb29rdXAgZGVmaW5pdGlvbnMgd2lsbCBiZSBidWlsdCBmcm9tIHRoZSBtb2RlbC10eXBlcyB0aGVzYXVydXM7XHJcbiAgICogaWYgdGhpcyBpcyBub3QgYXZhaWxhYmxlIGVpdGhlciwgdGhlIGJ5LXR5cGUgbG9va3VwIHdpbGwgYmVcclxuICAgKiBkaXNhYmxlZC5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBsb29rdXBEZWZpbml0aW9ucz86IEluZGV4TG9va3VwRGVmaW5pdGlvbnM7XHJcbiAgLyoqXHJcbiAgICogVGhlIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb25zIGZvciB1c2luZyBleHRlcm5hbCBsb29rdXAgc2VydmljZXMuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZXh0TG9va3VwQ29uZmlnczogUmVmTG9va3VwQ29uZmlnW107XHJcblxyXG4gIC8qKlxyXG4gICAqIFRydWUgaWYgd2hlbiBhIG5ldyB0YXJnZXQgaXMgc2V0IGl0IHNob3VsZCBiZSBpbnRlcm5hbCByYXRoZXIgdGhhblxyXG4gICAqIGV4dGVybmFsIGJ5IGRlZmF1bHQuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgaW50ZXJuYWxEZWZhdWx0OiBib29sZWFuIHwgdW5kZWZpbmVkO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgdGFyZ2V0IHRvIGJlIGVkaXRlZC5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgdGFyZ2V0KCk6IFBpblRhcmdldCB8IHVuZGVmaW5lZCB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RhcmdldDtcclxuICB9XHJcbiAgcHVibGljIHNldCB0YXJnZXQodmFsdWU6IFBpblRhcmdldCB8IHVuZGVmaW5lZCB8IG51bGwpIHtcclxuICAgIGlmICh0aGlzLl90YXJnZXQgPT09IHZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX3RhcmdldCA9IHZhbHVlIHx8IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudXBkYXRlRm9ybSh0aGlzLl90YXJnZXQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHBhcnQgdHlwZSBrZXkgd2hlbiB0aGUgYnktdHlwZSBtb2RlIGlzIGFjdGl2ZS5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBkZWZhdWx0UGFydFR5cGVLZXk/OiBzdHJpbmcgfCBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0dGVkIHdoZW4gdXNlciBjbG9zZXMgdGhlIGVkaXRvci5cclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgZWRpdG9yQ2xvc2U6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIC8qKlxyXG4gICAqIEVtaXR0ZWQgd2hlbmV2ZXIgdGhlIHRhcmdldCBjaGFuZ2VzLlxyXG4gICAqIFRoZSBldmVudCdzIHZhbHVlIGlzIHRoZSBuZXcgdGFyZ2V0LlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyB0YXJnZXRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxQaW5UYXJnZXQ+O1xyXG5cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgZXh0TW9yZVJlcXVlc3Q6IEV2ZW50RW1pdHRlcjxSZWZMb29rdXBTZXRFdmVudD47XHJcblxyXG4gIC8vIGJ5IHR5cGVcclxuICBwdWJsaWMgbW9kZWxFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdO1xyXG4gIHB1YmxpYyBwYXJ0VHlwZUtleXM6IHN0cmluZ1tdO1xyXG4gIC8vIGJ5IGl0ZW1cclxuICBwdWJsaWMgaXRlbVBhcnRzOiBQYXJ0W107XHJcbiAgLy8gZm9ybSAtIGJ5IGl0ZW1cclxuICBwdWJsaWMgaXRlbTogRm9ybUNvbnRyb2w8SXRlbSB8IG51bGw+O1xyXG4gIHB1YmxpYyBpdGVtUGFydDogRm9ybUNvbnRyb2w8UGFydCB8IG51bGw+O1xyXG4gIC8vIGZvcm0gLSBieSB0eXBlXHJcbiAgcHVibGljIHBhcnRUeXBlS2V5OiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuICAvLyBmb3JtIC0gYm90aFxyXG4gIHB1YmxpYyBnaWQ6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIHB1YmxpYyBsYWJlbDogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgcHVibGljIGJ5VHlwZU1vZGU6IEZvcm1Db250cm9sPGJvb2xlYW4+O1xyXG4gIHB1YmxpYyBleHRlcm5hbDogRm9ybUNvbnRyb2w8Ym9vbGVhbj47XHJcbiAgcHVibGljIGZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgcHVibGljIGZpbHRlcjogUGluUmVmTG9va3VwRmlsdGVyO1xyXG4gIHB1YmxpYyBwaW5GaWx0ZXJPcHRpb25zPzogSW5kZXhMb29rdXBEZWZpbml0aW9uO1xyXG4gIHB1YmxpYyBsb29rdXBEYXRhPzogUGluTG9va3VwRGF0YTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KCdpbmRleExvb2t1cERlZmluaXRpb25zJylcclxuICAgIHByaXZhdGUgX3ByZXNldExvb2t1cERlZnM6IEluZGV4TG9va3VwRGVmaW5pdGlvbnMsXHJcbiAgICBwdWJsaWMgaXRlbUxvb2t1cFNlcnZpY2U6IEl0ZW1SZWZMb29rdXBTZXJ2aWNlLFxyXG4gICAgcHVibGljIHBpbkxvb2t1cFNlcnZpY2U6IFBpblJlZkxvb2t1cFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9pdGVtU2VydmljZTogSXRlbVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90aGVzU2VydmljZTogVGhlc2F1cnVzU2VydmljZSxcclxuICAgIHByaXZhdGUgX3NuYWNrYmFyOiBNYXRTbmFja0JhcixcclxuICAgIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlclxyXG4gICkge1xyXG4gICAgdGhpcy5wYXJ0VHlwZUtleXMgPSBbXTtcclxuICAgIHRoaXMuaXRlbVBhcnRzID0gW107XHJcbiAgICB0aGlzLl9zdWJzID0gW107XHJcbiAgICB0aGlzLm1vZGVsRW50cmllcyA9IFtdO1xyXG4gICAgdGhpcy5leHRMb29rdXBDb25maWdzID0gW107XHJcbiAgICAvLyB0aGlzIGlzIHRoZSBkZWZhdWx0IGZpbHRlciBmb3IgdGhlIHBpbiBsb29rdXAsIHdoaWNoIHdpbGxcclxuICAgIC8vIGJlIG1lcmdlZCB3aXRoIHZhbHVlcyBwcm92aWRlZCBieSB1c2VyIGhlcmVcclxuICAgIHRoaXMuZmlsdGVyID0ge1xyXG4gICAgICB0ZXh0OiAnJyxcclxuICAgICAgbGltaXQ6IDEwLFxyXG4gICAgfTtcclxuICAgIC8vIGZvcm1cclxuICAgIHRoaXMuaXRlbSA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCk7XHJcbiAgICB0aGlzLml0ZW1QYXJ0ID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsKTtcclxuICAgIHRoaXMucGFydFR5cGVLZXkgPSBmb3JtQnVpbGRlci5jb250cm9sKG51bGwpO1xyXG4gICAgdGhpcy5naWQgPSBmb3JtQnVpbGRlci5jb250cm9sKG51bGwsIFtcclxuICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMzAwKSxcclxuICAgIF0pO1xyXG4gICAgdGhpcy5sYWJlbCA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgW1xyXG4gICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICBWYWxpZGF0b3JzLm1heExlbmd0aCgzMDApLFxyXG4gICAgXSk7XHJcbiAgICB0aGlzLmJ5VHlwZU1vZGUgPSBmb3JtQnVpbGRlci5jb250cm9sKGZhbHNlLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xyXG4gICAgdGhpcy5leHRlcm5hbCA9IGZvcm1CdWlsZGVyLmNvbnRyb2woZmFsc2UsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLmZvcm0gPSBmb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIGl0ZW06IHRoaXMuaXRlbSxcclxuICAgICAgaXRlbVBhcnQ6IHRoaXMuaXRlbVBhcnQsXHJcbiAgICAgIHBhcnRUeXBlS2V5OiB0aGlzLnBhcnRUeXBlS2V5LFxyXG4gICAgICBnaWQ6IHRoaXMuZ2lkLFxyXG4gICAgICBsYWJlbDogdGhpcy5sYWJlbCxcclxuICAgICAgYnlUeXBlTW9kZTogdGhpcy5ieVR5cGVNb2RlLFxyXG4gICAgICBleHRlcm5hbDogdGhpcy5leHRlcm5hbCxcclxuICAgIH0pO1xyXG4gICAgLy8gZXZlbnRzXHJcbiAgICB0aGlzLnRhcmdldENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UGluVGFyZ2V0PigpO1xyXG4gICAgdGhpcy5lZGl0b3JDbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgdGhpcy5leHRNb3JlUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8UmVmTG9va3VwU2V0RXZlbnQ+KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvcmNlQnlJdGVtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5waW5CeVR5cGVNb2RlID0gZmFsc2U7XHJcbiAgICB0aGlzLmNhblN3aXRjaE1vZGUgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBLZXlzKCk6IHZvaWQge1xyXG4gICAgLy8gdXNlIERJIHByZXNldHMgaWYgbm8gbG9va3VwIGRlZmluaXRpb25zXHJcbiAgICBpZiAoIXRoaXMubG9va3VwRGVmaW5pdGlvbnMpIHtcclxuICAgICAgdGhpcy5sb29rdXBEZWZpbml0aW9ucyA9IHRoaXMuX3ByZXNldExvb2t1cERlZnM7XHJcbiAgICB9XHJcbiAgICAvLyBrZXlzIGFyZSBhbGwgdGhlIGRlZmluZWQgbG9va3VwIHNlYXJjaGVzXHJcbiAgICB0aGlzLnBhcnRUeXBlS2V5cyA9IE9iamVjdC5rZXlzKHRoaXMubG9va3VwRGVmaW5pdGlvbnMpO1xyXG5cclxuICAgIC8vIGlmIG5vIGtleXMsIGdldCB0aGVtIGZyb20gdGhlc2F1cnVzIG1vZGVsLXR5cGVzO1xyXG4gICAgLy8gaWYgdGhpcyBpcyBub3QgYXZhaWxhYmxlLCBqdXN0IGZvcmNlIGJ5IGl0ZW0gbW9kZS5cclxuICAgIGlmICghdGhpcy5wYXJ0VHlwZUtleXMubGVuZ3RoKSB7XHJcbiAgICAgIGlmICh0aGlzLm1vZGVsRW50cmllcz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgLy8gc2V0IGxvb2t1cERlZmluaXRpb25zIGZyb20gdGhlc2F1cnVzIGVudHJpZXNcclxuICAgICAgICB0aGlzLmxvb2t1cERlZmluaXRpb25zID0ge307XHJcbiAgICAgICAgdGhpcy5tb2RlbEVudHJpZXMuZm9yRWFjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sb29rdXBEZWZpbml0aW9ucyFbZS52YWx1ZV0gPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IGUudmFsdWUsXHJcbiAgICAgICAgICAgIHR5cGVJZDogZS5pZCxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gc2V0IHR5cGUga2V5cyBmcm9tIHRoZXNhdXJ1cyBlbnRyaWVzXHJcbiAgICAgICAgdGhpcy5wYXJ0VHlwZUtleXMgPSB0aGlzLm1vZGVsRW50cmllcy5tYXAoKGUpID0+IGUudmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaWYgc3RpbGwgbm8ga2V5cywgZm9yY2UgYnkgaXRlbSBtb2RlXHJcbiAgICBpZiAoIXRoaXMucGFydFR5cGVLZXlzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmZvcmNlQnlJdGVtKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBzZXQgZGVmYXVsdCBrZXlcclxuICAgICAgdGhpcy5wYXJ0VHlwZUtleS5zZXRWYWx1ZShcclxuICAgICAgICB0aGlzLmRlZmF1bHRQYXJ0VHlwZUtleSB8fCB0aGlzLnBhcnRUeXBlS2V5c1swXVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgLy8gc2V0IHN0YXJ0IG1vZGUgaWYgcmVxdWlyZWRcclxuICAgIGlmICh0aGlzLl9zdGFydFdpdGhCeVR5cGVNb2RlKSB7XHJcbiAgICAgIHRoaXMuYnlUeXBlTW9kZS5zZXRWYWx1ZSh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB3aGVuZXZlciBpdGVtIGNoYW5nZXMsIHVwZGF0ZSBpdGVtJ3MgcGFydHMgYW5kIGZpbHRlclxyXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxyXG4gICAgICB0aGlzLml0ZW0udmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgZGVib3VuY2VUaW1lKDMwMCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pdGVtUGFydC5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgICAgIHRoaXMuaXRlbVBhcnRzID0gaXRlbT8ucGFydHMgfHwgW107XHJcbiAgICAgICAgICB0aGlzLmZpbHRlciA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy5maWx0ZXIsXHJcbiAgICAgICAgICAgIGl0ZW1JZDogaXRlbT8uaWQsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIC8vIHdoZW5ldmVyIGl0ZW1QYXJ0IGNoYW5nZXMsIHVwZGF0ZSB0YXJnZXQgYW5kIGV2ZW50dWFsbHkgZ2lkXHJcbiAgICB0aGlzLl9zdWJzLnB1c2goXHJcbiAgICAgIHRoaXMuaXRlbVBhcnQudmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgZGVib3VuY2VUaW1lKDMwMCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgocGFydCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmdpZC52YWx1ZSB8fCB0aGlzLmdpZC5wcmlzdGluZSkge1xyXG4gICAgICAgICAgICB0aGlzLmdpZC5zZXRWYWx1ZSh0aGlzLmJ1aWxkR2lkKCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5maWx0ZXIgPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZmlsdGVyLFxyXG4gICAgICAgICAgICBwYXJ0SWQ6IHBhcnQ/LmlkLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMudXBkYXRlVGFyZ2V0KCk7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgLy8gd2hlbmV2ZXIgcGFydFR5cGVLZXkgY2hhbmdlcywgdXBkYXRlIGZpbHRlcidzIG9wdGlvbnNcclxuICAgIHRoaXMuX3N1YnMucHVzaChcclxuICAgICAgdGhpcy5wYXJ0VHlwZUtleS52YWx1ZUNoYW5nZXNcclxuICAgICAgICAucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCBkZWJvdW5jZVRpbWUoMzAwKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChrZXkpID0+IHtcclxuICAgICAgICAgIHRoaXMucGluRmlsdGVyT3B0aW9ucyA9IGtleVxyXG4gICAgICAgICAgICA/IHRoaXMubG9va3VwRGVmaW5pdGlvbnMhW2tleV1cclxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgLy8gd2hlbmV2ZXIgZXh0ZXJuYWwgY2hhbmdlcywgc2V0IHJlcXVpcmVkIHZhbGlkYXRvciBpbiBsYWJlbFxyXG4gICAgLy8gKHRydWUgZm9yIGV4dGVybmFsLCBmYWxzZSBmb3IgaW50ZXJuYWwpXHJcbiAgICB0aGlzLl9zdWJzLnB1c2goXHJcbiAgICAgIHRoaXMuZXh0ZXJuYWwudmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgZGVib3VuY2VUaW1lKDMwMCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoZXh0ZXJuYWwpID0+IHtcclxuICAgICAgICAgIGlmIChleHRlcm5hbCkge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsLnNldFZhbGlkYXRvcnMoW1xyXG4gICAgICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgICAgICAgICAgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMzAwKSxcclxuICAgICAgICAgICAgXSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDMwMCldKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubGFiZWwudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIC8vIGxvYWQgbW9kZWwtdHlwZXMgdGhlc2F1cnVzIGVudHJpZXNcclxuICAgIHRoaXMuX3RoZXNTZXJ2aWNlLmdldFRoZXNhdXJ1cygnbW9kZWwtdHlwZXMnLCB0cnVlKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAodCkgPT4ge1xyXG4gICAgICAgIHRoaXMubW9kZWxFbnRyaWVzID0gdC5lbnRyaWVzIHx8IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLm1vZGVsRW50cmllcz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aGlzLnNldHVwS2V5cygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmZvcmNlQnlJdGVtKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZm9yY2VCeUl0ZW0oKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9zdWJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMuX3N1YnNbaV0udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRHaWQoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICAvLyB0aGUgR0lEIGlzIHRoZSBwYXJ0IElEIGlmIGFueSwgb3IgdGhlIGl0ZW0gSUQsIGZvbGxvd2VkIGJ5XHJcbiAgICAvLyB0aGUgcGluJ3MgdmFsdWUgKD1FSUQpXHJcbiAgICBjb25zdCBwaW4gPSB0aGlzLmxvb2t1cERhdGE/LnBpbjtcclxuICAgIGlmICghcGluPy52YWx1ZSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiBwaW4ucGFydElkXHJcbiAgICAgID8gYFAke3Bpbi5wYXJ0SWR9LyR7cGluLnZhbHVlfWBcclxuICAgICAgOiBgSSR7cGluLml0ZW1JZH0vJHtwaW4udmFsdWV9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRMYWJlbCgpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGlmICghdGhpcy5sb29rdXBEYXRhPy5waW4pIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzYjogc3RyaW5nW10gPSBbXTtcclxuICAgIC8vIHBpbiB2YWx1ZVxyXG4gICAgaWYgKHRoaXMubG9va3VwRGF0YS5waW4udmFsdWUpIHtcclxuICAgICAgc2IucHVzaCh0aGlzLmxvb2t1cERhdGEucGluLnZhbHVlKTtcclxuICAgICAgc2IucHVzaCgnIHwgJyk7XHJcbiAgICB9XHJcbiAgICAvLyBpdGVtIHRpdGxlXHJcbiAgICBzYi5wdXNoKHRoaXMubG9va3VwRGF0YS5pdGVtPy50aXRsZSB8fCB0aGlzLmxvb2t1cERhdGEucGluPy5pdGVtSWQpO1xyXG4gICAgLy8gcGFydCB0eXBlIGFuZCByb2xlXHJcbiAgICBpZiAodGhpcy5sb29rdXBEYXRhLnBpbi5wYXJ0VHlwZUlkKSB7XHJcbiAgICAgIGNvbnN0IGUgPSB0aGlzLm1vZGVsRW50cmllcz8uZmluZChcclxuICAgICAgICAoZSkgPT4gZS5pZCA9PT0gdGhpcy5sb29rdXBEYXRhIS5waW4ucGFydFR5cGVJZFxyXG4gICAgICApO1xyXG4gICAgICBzYi5wdXNoKCcgKCcpO1xyXG4gICAgICBzYi5wdXNoKGU/LnZhbHVlIHx8IHRoaXMubG9va3VwRGF0YS5waW4ucGFydFR5cGVJZCk7XHJcbiAgICAgIGlmICh0aGlzLmxvb2t1cERhdGEucGluLnJvbGVJZCkge1xyXG4gICAgICAgIHNiLnB1c2goYCwgJHt0aGlzLmxvb2t1cERhdGEucGluLnJvbGVJZH1gKTtcclxuICAgICAgfVxyXG4gICAgICBzYi5wdXNoKCcpJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2Iuam9pbignJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFRhcmdldCgpOiBQaW5UYXJnZXQge1xyXG4gICAgaWYgKHRoaXMuZXh0ZXJuYWwudmFsdWUpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBnaWQ6IHRoaXMuZ2lkLnZhbHVlIHx8ICcnLFxyXG4gICAgICAgIGxhYmVsOiB0aGlzLmxhYmVsLnZhbHVlIHx8ICcnLFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgcGluID0gdGhpcy5sb29rdXBEYXRhPy5waW47XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgZ2lkOiB0aGlzLmdpZC52YWx1ZSB8fCAnJyxcclxuICAgICAgICBsYWJlbDogdGhpcy5sYWJlbC52YWx1ZSB8fCAnJyxcclxuICAgICAgICBpdGVtSWQ6IHBpbj8uaXRlbUlkIHx8ICcnLFxyXG4gICAgICAgIHBhcnRJZDogcGluPy5wYXJ0SWQgfHwgJycsXHJcbiAgICAgICAgcGFydFR5cGVJZDogcGluPy5wYXJ0VHlwZUlkIHx8ICcnLFxyXG4gICAgICAgIHJvbGVJZDogcGluPy5yb2xlSWQgfHwgJycsXHJcbiAgICAgICAgbmFtZTogcGluPy5uYW1lIHx8ICcnLFxyXG4gICAgICAgIHZhbHVlOiBwaW4/LnZhbHVlIHx8ICcnLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVUYXJnZXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fbm9UYXJnZXRVcGRhdGUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmV4dGVybmFsLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZ2lkLnNldFZhbHVlKHRoaXMuYnVpbGRHaWQoKSk7XHJcbiAgICAgIHRoaXMuZ2lkLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgdGhpcy5naWQubWFya0FzRGlydHkoKTtcclxuICAgICAgdGhpcy5sYWJlbC5zZXRWYWx1ZSh0aGlzLmJ1aWxkTGFiZWwoKSk7XHJcbiAgICAgIHRoaXMubGFiZWwudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICB0aGlzLmxhYmVsLm1hcmtBc0RpcnR5KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl90YXJnZXQgPSB0aGlzLmdldFRhcmdldCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVGb3JtKHRhcmdldD86IFBpblRhcmdldCk6IHZvaWQge1xyXG4gICAgLy8gYnVpbGQgcGluIGluZm8gZnJvbSB0YXJnZXRcclxuICAgIGlmICghdGFyZ2V0KSB7XHJcbiAgICAgIHRoaXMubG9va3VwRGF0YSA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5pdGVtLnJlc2V0KCk7XHJcbiAgICAgIHRoaXMuaXRlbVBhcnQucmVzZXQoKTtcclxuICAgICAgdGhpcy5naWQucmVzZXQoKTtcclxuICAgICAgdGhpcy5sYWJlbC5yZXNldCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9ub1RhcmdldFVwZGF0ZSA9IHRydWU7XHJcbiAgICB0aGlzLmdpZC5zZXRWYWx1ZSh0YXJnZXQuZ2lkIHx8ICcnKTtcclxuICAgIHRoaXMubGFiZWwuc2V0VmFsdWUodGFyZ2V0LmxhYmVsIHx8ICcnKTtcclxuICAgIHRoaXMubG9va3VwRGF0YSA9IHtcclxuICAgICAgcGluOiB7XHJcbiAgICAgICAgaXRlbUlkOiB0YXJnZXQuaXRlbUlkIHx8ICcnLFxyXG4gICAgICAgIHBhcnRJZDogdGFyZ2V0LnBhcnRJZCB8fCAnJyxcclxuICAgICAgICBwYXJ0VHlwZUlkOiB0YXJnZXQucGFydFR5cGVJZCB8fCAnJyxcclxuICAgICAgICByb2xlSWQ6IHRhcmdldC5yb2xlSWQgfHwgJycsXHJcbiAgICAgICAgbmFtZTogdGFyZ2V0Lm5hbWUgfHwgJycsXHJcbiAgICAgICAgdmFsdWU6IHRhcmdldC52YWx1ZSB8fCAnJyxcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgICAvLyBnZXQgaXRlbVxyXG4gICAgaWYgKHRhcmdldC5pdGVtSWQpIHtcclxuICAgICAgdGhpcy5faXRlbVNlcnZpY2UuZ2V0SXRlbSh0YXJnZXQuaXRlbUlkLCB0cnVlLCB0cnVlKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChpdGVtKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLml0ZW0uc2V0VmFsdWUoaXRlbSk7XHJcbiAgICAgICAgICB0aGlzLmZvcm0ubWFya0FzUHJpc3RpbmUoKTtcclxuICAgICAgICAgIHRoaXMuX25vVGFyZ2V0VXBkYXRlID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmV4dGVybmFsLnNldFZhbHVlKCF0YXJnZXQubmFtZSk7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRhcmdldCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoSlNPTi5zdHJpbmdpZnkoZXJyb3IpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZXh0ZXJuYWwuc2V0VmFsdWUoIXRhcmdldC5uYW1lKTtcclxuICAgICAgICAgIHRoaXMuX25vVGFyZ2V0VXBkYXRlID0gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmV4dGVybmFsLnNldFZhbHVlKCF0YXJnZXQubmFtZSAmJiAhdGhpcy5pbnRlcm5hbERlZmF1bHQpO1xyXG4gICAgICB0aGlzLl9ub1RhcmdldFVwZGF0ZSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnVwZGF0ZVRhcmdldCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGl0ZW0gbG9va3VwIGNoYW5nZXMgKGl0ZW0gaXMgbG9va2VkIHVwXHJcbiAgICogYnkgaXRzIHRpdGxlKS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIGdvdCBmcm9tIGxvb2t1cC5cclxuICAgKi9cclxuICBwdWJsaWMgb25JdGVtTG9va3VwQ2hhbmdlKGl0ZW06IEl0ZW0pOiB2b2lkIHtcclxuICAgIC8vIGxvYWQgaXRlbSdzIHBhcnRzXHJcbiAgICB0aGlzLl9pdGVtU2VydmljZS5nZXRJdGVtKGl0ZW0uaWQsIHRydWUsIHRydWUpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChpKSA9PiB7XHJcbiAgICAgICAgLy8gc2V0dGluZyB0aGUgaXRlbSB3aWxsIHRyaWdnZXIgaXRzIHBhcnRzIHVwZGF0ZVxyXG4gICAgICAgIHRoaXMuaXRlbS5zZXRWYWx1ZShpKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVRhcmdldCgpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKEpTT04uc3RyaW5naWZ5KGVycm9yKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXRlbVBhcnQuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgdGhpcy5pdGVtUGFydHMgPSBbXTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVRhcmdldCgpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRJdGVtSW5mbyhwaW46IERhdGFQaW5JbmZvKTogdm9pZCB7XHJcbiAgICBmb3JrSm9pbih7XHJcbiAgICAgIGl0ZW06IHRoaXMuX2l0ZW1TZXJ2aWNlLmdldEl0ZW0ocGluLml0ZW1JZCwgZmFsc2UsIHRydWUpLFxyXG4gICAgICBwYXJ0OiB0aGlzLl9pdGVtU2VydmljZS5nZXRQYXJ0RnJvbVR5cGVBbmRSb2xlKFxyXG4gICAgICAgIHBpbi5pdGVtSWQsXHJcbiAgICAgICAgTUVUQURBVEFfUEFSVF9JRCxcclxuICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAgdHJ1ZVxyXG4gICAgICApLFxyXG4gICAgfSlcclxuICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sb29rdXBEYXRhID0ge1xyXG4gICAgICAgICAgICBwaW46IHBpbixcclxuICAgICAgICAgICAgaXRlbTogcmVzdWx0Lml0ZW0hLFxyXG4gICAgICAgICAgICBtZXRhUGFydDogcmVzdWx0LnBhcnQgYXMgTWV0YWRhdGFQYXJ0LFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMudXBkYXRlVGFyZ2V0KCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxvb2t1cERhdGEgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgICAgICBlcnJvciA/IEpTT04uc3RyaW5naWZ5KGVycm9yKSA6ICdFcnJvciBsb2FkaW5nIGl0ZW0vbWV0YWRhdGEnXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBpbiBsb29rdXAgY2hhbmdlLiBBIHBpbiBpcyBsb29rZWQgdXAgYnkgaXRzXHJcbiAgICogbmFtZSBhbmQgdmFsdWUgKD10aGUgZmlsdGVyJ3MgdGV4dCksIGFuZCBvcHRpb25hbGx5IGJ5OlxyXG4gICAqIC0gaXRzIGluZGV4IGxvb2t1cCBkZWZpbml0aW9uIChzZWxlY3RlZCBieSBwYXJ0VHlwZUtleSkuXHJcbiAgICogLSBpdHMgaXRlbSAoZGVmaW5lZCBieSBpdGVtLCBpbiBmaWx0ZXIpLlxyXG4gICAqIC0gaXRzIHBhcnQgKGRlZmluZWQgYnkgaXRlbVBhcnQsIGluIGZpbHRlcikuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gaW5mbyBUaGUgcGluIGluZm8gZnJvbSBwaW4gbG9va3VwLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBvblBpbkxvb2t1cENoYW5nZShpbmZvOiBEYXRhUGluSW5mbyk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkSXRlbUluZm8oaW5mbyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25FeHRJdGVtQ2hhbmdlKGV2ZW50OiBSZWZMb29rdXBTZXRFdmVudCk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuZ2lkLnNldFZhbHVlKGV2ZW50Lml0ZW1JZCk7XHJcbiAgICAgIHRoaXMuZ2lkLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgdGhpcy5naWQubWFya0FzRGlydHkoKTtcclxuXHJcbiAgICAgIHRoaXMubGFiZWwuc2V0VmFsdWUoZXZlbnQuaXRlbUxhYmVsKTtcclxuICAgICAgdGhpcy5sYWJlbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIHRoaXMubGFiZWwubWFya0FzRGlydHkoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uRXh0TW9yZVJlcXVlc3QoZXZlbnQ6IFJlZkxvb2t1cFNldEV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLmV4dE1vcmVSZXF1ZXN0LmVtaXQoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ29waWVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc25hY2tiYXIub3BlbignQ29waWVkIHRvIGNsaXBib2FyZCcsICdPSycsIHtcclxuICAgICAgZHVyYXRpb246IDE1MDAsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZWRpdG9yQ2xvc2UuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNhdmUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5mb3JtLmludmFsaWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdGFyZ2V0ID0gdGhpcy5nZXRUYXJnZXQoKTtcclxuICAgIHRoaXMudGFyZ2V0Q2hhbmdlLmVtaXQodGhpcy5fdGFyZ2V0KTtcclxuICB9XHJcbn1cclxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgKHN1Ym1pdCk9XCJzYXZlKClcIj5cclxuICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cclxuICAgIDwhLS0gZXh0ZXJuYWwgLS0+XHJcbiAgICA8bWF0LWNoZWNrYm94IFtmb3JtQ29udHJvbF09XCJleHRlcm5hbFwiPmV4dGVybmFsPC9tYXQtY2hlY2tib3g+XHJcbiAgICA8IS0tIG1vZGUgc3dpdGNoZXIgLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiIWV4dGVybmFsLnZhbHVlXCI+XHJcbiAgICAgIDxtYXQtY2hlY2tib3ggW2Zvcm1Db250cm9sXT1cImJ5VHlwZU1vZGVcIiAqbmdJZj1cImNhblN3aXRjaE1vZGVcIj5cclxuICAgICAgICBieSB0eXBlPC9tYXQtY2hlY2tib3hcclxuICAgICAgPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxyXG4gICAgPCEtLSBsYWJlbCAtLT5cclxuICAgIDxkaXY+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImV4dGVybmFsLnZhbHVlIHx8IGNhbkVkaXRUYXJnZXRcIj5cclxuICAgICAgICA8bWF0LWxhYmVsPmxhYmVsPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJsYWJlbFwiIC8+XHJcbiAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgKm5nSWY9XCIkYW55KGxhYmVsKS5lcnJvcnM/LnJlcXVpcmVkICYmIChsYWJlbC5kaXJ0eSB8fCBsYWJlbC50b3VjaGVkKVwiXHJcbiAgICAgICAgICA+bGFiZWwgcmVxdWlyZWQ8L21hdC1lcnJvclxyXG4gICAgICAgID5cclxuICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAkYW55KGxhYmVsKS5lcnJvcnM/Lm1heExlbmd0aCAmJiAobGFiZWwuZGlydHkgfHwgbGFiZWwudG91Y2hlZClcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgICA+bGFiZWwgdG9vIGxvbmc8L21hdC1lcnJvclxyXG4gICAgICAgID5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPGRpdlxyXG4gICAgICAgICpuZ0lmPVwiIWV4dGVybmFsLnZhbHVlICYmICFjYW5FZGl0VGFyZ2V0ICYmIGxhYmVsLnZhbHVlXCJcclxuICAgICAgICBjbGFzcz1cImluZm9cIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPmxhYmVsPC9zcGFuPnt7IGxhYmVsLnZhbHVlIH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBnaWQgLS0+XHJcbiAgICA8ZGl2PlxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJleHRlcm5hbC52YWx1ZSB8fCBjYW5FZGl0VGFyZ2V0XCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbD5HSUQ8L21hdC1sYWJlbD5cclxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cImdpZFwiIC8+XHJcbiAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgKm5nSWY9XCIkYW55KGdpZCkuZXJyb3JzPy5yZXF1aXJlZCAmJiAoZ2lkLmRpcnR5IHx8IGdpZC50b3VjaGVkKVwiXHJcbiAgICAgICAgICA+R0lEIHJlcXVpcmVkPC9tYXQtZXJyb3JcclxuICAgICAgICA+XHJcbiAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgKm5nSWY9XCIkYW55KGdpZCkuZXJyb3JzPy5tYXhMZW5ndGggJiYgKGdpZC5kaXJ0eSB8fCBnaWQudG91Y2hlZClcIlxyXG4gICAgICAgICAgPkdJRCB0b28gbG9uZzwvbWF0LWVycm9yXHJcbiAgICAgICAgPlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiIWV4dGVybmFsLnZhbHVlICYmICFjYW5FZGl0VGFyZ2V0ICYmIGdpZC52YWx1ZVwiIGNsYXNzPVwiaW5mb1wiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5HSUQ8L3NwYW4+IDxzcGFuIGNsYXNzPVwiZ2lkXCI+e3sgZ2lkLnZhbHVlIH19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIGV4dGVybmFsIGxvb2t1cCBzZXQgLS0+XHJcbiAgPGRpdiAqbmdJZj1cImV4dGVybmFsLnZhbHVlICYmIGV4dExvb2t1cENvbmZpZ3M/Lmxlbmd0aFwiPlxyXG4gICAgPGNhZG11cy1yZWYtbG9va3VwLXNldFxyXG4gICAgICBbY29uZmlnc109XCJleHRMb29rdXBDb25maWdzXCJcclxuICAgICAgKGl0ZW1DaGFuZ2UpPVwib25FeHRJdGVtQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAobW9yZVJlcXVlc3QpPVwib25FeHRNb3JlUmVxdWVzdCgkZXZlbnQpXCJcclxuICAgID48L2NhZG11cy1yZWYtbG9va3VwLXNldD5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBCWSBJVEVNIC0tPlxyXG4gIDxkaXYgKm5nSWY9XCIhZXh0ZXJuYWwudmFsdWVcIj5cclxuICAgIDxmaWVsZHNldCAqbmdJZj1cIiFieVR5cGVNb2RlLnZhbHVlXCIgY2xhc3M9XCJmb3JtLXJvd1wiPlxyXG4gICAgICA8bGVnZW5kPnBpbiBmaWx0ZXJzPC9sZWdlbmQ+XHJcbiAgICAgIDwhLS0gaXRlbSBmaWx0ZXIgLS0+XHJcbiAgICAgIDxjYWRtdXMtcmVmLWxvb2t1cFxyXG4gICAgICAgIFtzZXJ2aWNlXT1cIml0ZW1Mb29rdXBTZXJ2aWNlXCJcclxuICAgICAgICBsYWJlbD1cIml0ZW1cIlxyXG4gICAgICAgIChpdGVtQ2hhbmdlKT1cIm9uSXRlbUxvb2t1cENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgPjwvY2FkbXVzLXJlZi1sb29rdXA+XHJcblxyXG4gICAgICA8IS0tIHBhcnQgZmlsdGVyIC0tPlxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJpdGVtUGFydHMubGVuZ3RoXCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbD5wYXJ0PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPG1hdC1zZWxlY3QgW2Zvcm1Db250cm9sXT1cIml0ZW1QYXJ0XCI+XHJcbiAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwibnVsbFwiPihhbnkpPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHAgb2YgaXRlbVBhcnRzXCIgW3ZhbHVlXT1cInBcIj57e1xyXG4gICAgICAgICAgICBwLnR5cGVJZCB8IGZsYXRMb29rdXAgOiBtb2RlbEVudHJpZXMgOiBcImlkXCIgOiBcInZhbHVlXCJcclxuICAgICAgICAgIH19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDwvZmllbGRzZXQ+XHJcblxyXG4gICAgPCEtLSBCWSBUWVBFIC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cImJ5VHlwZU1vZGUudmFsdWVcIj5cclxuICAgICAgPCEtLSBwYXIgdHlwZSBmaWx0ZXIgLS0+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cInBhcnRUeXBlS2V5cz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbD5wYXJ0IHR5cGU8L21hdC1sYWJlbD5cclxuICAgICAgICA8bWF0LXNlbGVjdCBbZm9ybUNvbnRyb2xdPVwicGFydFR5cGVLZXlcIj5cclxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBrIG9mIHBhcnRUeXBlS2V5c1wiIFt2YWx1ZV09XCJrXCI+e3tcclxuICAgICAgICAgICAga1xyXG4gICAgICAgICAgfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBQSU4gLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwicGFydFR5cGVLZXkudmFsdWVcIj5cclxuICAgICAgPCEtLSBwaW4gbG9va3VwIC0tPlxyXG4gICAgICA8Y2FkbXVzLXJlZi1sb29rdXBcclxuICAgICAgICBbc2VydmljZV09XCJwaW5Mb29rdXBTZXJ2aWNlXCJcclxuICAgICAgICBbYmFzZUZpbHRlcl09XCJmaWx0ZXJcIlxyXG4gICAgICAgIFtvcHRpb25zXT1cInBpbkZpbHRlck9wdGlvbnNcIlxyXG4gICAgICAgIGxhYmVsPVwicGluXCJcclxuICAgICAgICAoaXRlbUNoYW5nZSk9XCJvblBpbkxvb2t1cENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgPjwvY2FkbXVzLXJlZi1sb29rdXA+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIGRhdGEgLS0+XHJcbiAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbCBpZD1cImRhdGFcIiAqbmdJZj1cImxvb2t1cERhdGE/LnBpbj8ubmFtZVwiPlxyXG4gICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+cGluIGRhdGE8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICA8IS0tIHRhYmxlIC0tPlxyXG4gICAgICA8dGFibGU+XHJcbiAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgPHRoPjwvdGg+XHJcbiAgICAgICAgICA8dGg+c291cmNlPC90aD5cclxuICAgICAgICAgIDx0aD52YWx1ZTwvdGg+XHJcbiAgICAgICAgPC90aGVhZD5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICA8IS0tIHBpbiAtLT5cclxuICAgICAgICAgIDx0ciAqbmdJZj1cImxvb2t1cERhdGE/LnBpbj8udmFsdWVcIj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgW2Nka0NvcHlUb0NsaXBib2FyZF09XCJsb29rdXBEYXRhIS5waW4hLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgIChjZGtDb3B5VG9DbGlwYm9hcmRDb3BpZWQpPVwib25Db3BpZWQoKVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNvbnRlbnRfY29weTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5waW48L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgbG9va3VwRGF0YSEucGluLnZhbHVlIH19PC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICA8IS0tIGl0ZW0gSUQgLS0+XHJcbiAgICAgICAgICA8dHIgKm5nSWY9XCJsb29rdXBEYXRhPy5waW4/Lml0ZW1JZFwiPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICBbY2RrQ29weVRvQ2xpcGJvYXJkXT1cImxvb2t1cERhdGEhLnBpbiEuaXRlbUlkXCJcclxuICAgICAgICAgICAgICAgIChjZGtDb3B5VG9DbGlwYm9hcmRDb3BpZWQpPVwib25Db3BpZWQoKVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNvbnRlbnRfY29weTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5pdGVtIElEPC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IGxvb2t1cERhdGEhLnBpbi5pdGVtSWQgfX08L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwhLS0gaXRlbSB0aXRsZSAtLT5cclxuICAgICAgICAgIDx0ciAqbmdJZj1cImxvb2t1cERhdGE/Lml0ZW0/LnRpdGxlXCI+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgIFtjZGtDb3B5VG9DbGlwYm9hcmRdPVwibG9va3VwRGF0YSEuaXRlbSEudGl0bGVcIlxyXG4gICAgICAgICAgICAgICAgKGNka0NvcHlUb0NsaXBib2FyZENvcGllZCk9XCJvbkNvcGllZCgpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPml0ZW0gdGl0bGU8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgbG9va3VwRGF0YSEuaXRlbSEudGl0bGUgfX08L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwhLS0gcGFydCBJRCAtLT5cclxuICAgICAgICAgIDx0ciAqbmdJZj1cImxvb2t1cERhdGE/LnBpbj8ucGFydElkXCI+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgIFtjZGtDb3B5VG9DbGlwYm9hcmRdPVwibG9va3VwRGF0YSEucGluIS5wYXJ0SWRcIlxyXG4gICAgICAgICAgICAgICAgKGNka0NvcHlUb0NsaXBib2FyZENvcGllZCk9XCJvbkNvcGllZCgpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPnBhcnQgSUQ8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgbG9va3VwRGF0YSEucGluLnBhcnRJZCB9fTwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgPCEtLSBwYXJ0IHR5cGUgSUQgLS0+XHJcbiAgICAgICAgICA8dHIgKm5nSWY9XCJsb29rdXBEYXRhPy5waW4/LnBhcnRUeXBlSWRcIj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgW2Nka0NvcHlUb0NsaXBib2FyZF09XCJsb29rdXBEYXRhIS5waW4hLnBhcnRUeXBlSWRcIlxyXG4gICAgICAgICAgICAgICAgKGNka0NvcHlUb0NsaXBib2FyZENvcGllZCk9XCJvbkNvcGllZCgpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPnBhcnQgdHlwZSBJRDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyBsb29rdXBEYXRhIS5waW4hLnBhcnRUeXBlSWQgfX08L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwhLS0gcGFydCByb2xlIElEIC0tPlxyXG4gICAgICAgICAgPHRyICpuZ0lmPVwibG9va3VwRGF0YT8ucGluPy5yb2xlSWRcIj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgW2Nka0NvcHlUb0NsaXBib2FyZF09XCJsb29rdXBEYXRhIS5waW4hLnJvbGVJZCFcIlxyXG4gICAgICAgICAgICAgICAgKGNka0NvcHlUb0NsaXBib2FyZENvcGllZCk9XCJvbkNvcGllZCgpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPnBhcnQgcm9sZSBJRDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyBsb29rdXBEYXRhIS5waW4hLnJvbGVJZCB9fTwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG5cclxuICAgICAgICAgIDwhLS0gcGFydCdzIG1ldGFkYXRhIC0tPlxyXG4gICAgICAgICAgPHRyXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cIlxyXG4gICAgICAgICAgICAgIGxldCBtIG9mIGxvb2t1cERhdGE/Lm1ldGFQYXJ0Py5tZXRhZGF0YSB8fCBbXTtcclxuICAgICAgICAgICAgICBsZXQgaSA9IGluZGV4XHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgIFtjZGtDb3B5VG9DbGlwYm9hcmRdPVwibS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAoY2RrQ29weVRvQ2xpcGJvYXJkQ29waWVkKT1cIm9uQ29waWVkKClcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jb250ZW50X2NvcHk8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJtZXRhZGF0YVwiPnt7IG0ubmFtZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIm1ldGFkYXRhXCI+e3sgbS52YWx1ZSB9fTwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gYnV0dG9ucyAtLT5cclxuICA8ZGl2PlxyXG4gICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjbG9zZSgpXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBjb2xvcj1cIndhcm5cIj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBbZGlzYWJsZWRdPVwiZm9ybS5pbnZhbGlkXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBjb2xvcj1cInByaW1hcnlcIj5jaGVja19jaXJjbGU8L21hdC1pY29uPiB0YXJnZXRcclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L2Zvcm0+XHJcbiJdfQ==