@myrmidon/cadmus-part-codicology-decorations 2.0.7 → 2.0.9

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.
@@ -35,8 +35,8 @@ import { CadmusRefsAssertedIdsModule } from '@myrmidon/cadmus-refs-asserted-ids'
35
35
  import * as i0 from "@angular/core";
36
36
  export class CadmusPartCodicologyDecorationsModule {
37
37
  }
38
- CadmusPartCodicologyDecorationsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: CadmusPartCodicologyDecorationsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
39
- CadmusPartCodicologyDecorationsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.0.4", ngImport: i0, type: CadmusPartCodicologyDecorationsModule, declarations: [CodDecorationElementComponent,
38
+ CadmusPartCodicologyDecorationsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: CadmusPartCodicologyDecorationsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
39
+ CadmusPartCodicologyDecorationsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.1.0", ngImport: i0, type: CadmusPartCodicologyDecorationsModule, declarations: [CodDecorationElementComponent,
40
40
  TextOrEntrySelectorComponent,
41
41
  CodDecorationArtistStyleComponent,
42
42
  CodDecorationArtistComponent,
@@ -79,7 +79,7 @@ CadmusPartCodicologyDecorationsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVers
79
79
  CodDecorationComponent,
80
80
  CodDecorationsPartComponent,
81
81
  CodDecorationsPartFeatureComponent] });
82
- CadmusPartCodicologyDecorationsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: CadmusPartCodicologyDecorationsModule, imports: [CommonModule,
82
+ CadmusPartCodicologyDecorationsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: CadmusPartCodicologyDecorationsModule, imports: [CommonModule,
83
83
  FormsModule,
84
84
  ReactiveFormsModule,
85
85
  // material
@@ -110,7 +110,7 @@ CadmusPartCodicologyDecorationsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVers
110
110
  CadmusUiFlagsPickerModule,
111
111
  CadmusCodLocationModule,
112
112
  CadmusCodicologyUiModule] });
113
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: CadmusPartCodicologyDecorationsModule, decorators: [{
113
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: CadmusPartCodicologyDecorationsModule, decorators: [{
114
114
  type: NgModule,
115
115
  args: [{
116
116
  declarations: [
@@ -10,15 +10,14 @@ import * as i5 from "@angular/material/expansion";
10
10
  import * as i6 from "@angular/material/icon";
11
11
  import * as i7 from "@angular/material/input";
12
12
  import * as i8 from "@angular/material/form-field";
13
- import * as i9 from "@angular/material/tabs";
14
- import * as i10 from "@angular/material/tooltip";
15
- import * as i11 from "@myrmidon/cadmus-refs-asserted-chronotope";
16
- import * as i12 from "@myrmidon/cadmus-refs-doc-references";
17
- import * as i13 from "@myrmidon/cadmus-ui-flags-picker";
18
- import * as i14 from "../cod-decoration-element/cod-decoration-element.component";
19
- import * as i15 from "../cod-decoration-artist/cod-decoration-artist.component";
20
- import * as i16 from "@myrmidon/ng-tools";
21
- import * as i17 from "@myrmidon/cadmus-cod-location";
13
+ import * as i9 from "@angular/material/tooltip";
14
+ import * as i10 from "@myrmidon/cadmus-refs-asserted-chronotope";
15
+ import * as i11 from "@myrmidon/cadmus-refs-doc-references";
16
+ import * as i12 from "@myrmidon/cadmus-ui-flags-picker";
17
+ import * as i13 from "../cod-decoration-element/cod-decoration-element.component";
18
+ import * as i14 from "../cod-decoration-artist/cod-decoration-artist.component";
19
+ import * as i15 from "@myrmidon/ng-tools";
20
+ import * as i16 from "@myrmidon/cadmus-cod-location";
22
21
  /**
23
22
  * Manuscript's decoration editor.
24
23
  * This component requires the cod-decoration-element-types thesaurus.
@@ -58,7 +57,6 @@ export class CodDecorationComponent {
58
57
  this.editedElementIndex = -1;
59
58
  this.parentKeys = [];
60
59
  this.editedArtistIndex = -1;
61
- this.tabIndex = 0;
62
60
  this.decorationChange = new EventEmitter();
63
61
  this.editorClose = new EventEmitter();
64
62
  this.initialChronotopes = [];
@@ -92,6 +90,9 @@ export class CodDecorationComponent {
92
90
  return this._decoration;
93
91
  }
94
92
  set decoration(value) {
93
+ if (this._decoration === value) {
94
+ return;
95
+ }
95
96
  this._decoration = value;
96
97
  this.updateForm(value);
97
98
  }
@@ -178,15 +179,11 @@ export class CodDecorationComponent {
178
179
  editElement(element, index = -1) {
179
180
  if (!element) {
180
181
  this.editedElementIndex = -1;
181
- this.tabIndex = 0;
182
182
  this.editedElement = undefined;
183
183
  }
184
184
  else {
185
185
  this.editedElementIndex = index;
186
186
  this.editedElement = element;
187
- setTimeout(() => {
188
- this.tabIndex = 1;
189
- });
190
187
  }
191
188
  }
192
189
  updateParentKeys() {
@@ -330,11 +327,11 @@ export class CodDecorationComponent {
330
327
  this.decorationChange.emit(this.getDecoration());
331
328
  }
332
329
  }
333
- CodDecorationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: CodDecorationComponent, deps: [{ token: i1.FormBuilder }, { token: i2.DialogService }], target: i0.ɵɵFactoryTarget.Component });
334
- CodDecorationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: CodDecorationComponent, selector: "cadmus-cod-decoration", inputs: { decoration: "decoration", decElemFlagEntries: "decElemFlagEntries", decFlagEntries: "decFlagEntries", decElemTypeEntries: "decElemTypeEntries", decTypeHiddenEntries: "decTypeHiddenEntries", decElemColorEntries: "decElemColorEntries", decElemGildingEntries: "decElemGildingEntries", decElemTechEntries: "decElemTechEntries", decElemPosEntries: "decElemPosEntries", decElemToolEntries: "decElemToolEntries", decElemTypolEntries: "decElemTypolEntries", imgTypeEntries: "imgTypeEntries", artTypeEntries: "artTypeEntries", artStyleEntries: "artStyleEntries", ctTagEntries: "ctTagEntries", assTagEntries: "assTagEntries", refTypeEntries: "refTypeEntries", refTagEntries: "refTagEntries", idTagEntries: "idTagEntries", idScopeEntries: "idScopeEntries" }, outputs: { decorationChange: "decorationChange", editorClose: "editorClose" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-tab-group [(selectedIndex)]=\"tabIndex\">\r\n <!-- GENERAL -->\r\n <mat-tab label=\"general\">\r\n <div>\r\n <!-- id -->\r\n <mat-form-field>\r\n <mat-label>ID</mat-label>\r\n <input matInput [formControl]=\"eid\" />\r\n <mat-error\r\n *ngIf=\"$any(eid).errors?.required && (eid.dirty || eid.touched)\"\r\n >EID required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(eid).errors?.maxLength && (eid.dirty || eid.touched)\"\r\n >EID too long</mat-error\r\n >\r\n </mat-form-field>\r\n &nbsp;\r\n <!-- name -->\r\n <mat-form-field>\r\n <mat-label>name</mat-label>\r\n <input matInput [formControl]=\"name\" />\r\n <mat-error\r\n *ngIf=\"$any(name).errors?.required && (name.dirty || name.touched)\"\r\n >name required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(name).errors?.maxLength && (name.dirty || name.touched)\"\r\n >name too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- flags -->\r\n <fieldset>\r\n <legend>features</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availFlags\"\r\n [selectedIds]=\"initialFlags\"\r\n (selectedIdsChange)=\"onSelectedIdsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- note -->\r\n <br />\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea rows=\"3\" matInput [formControl]=\"note\"></textarea>\r\n <mat-error\r\n *ngIf=\"$any(note).errors?.maxLength && (note.dirty || note.touched)\"\r\n >note too long</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- chronotopes -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n ><mat-icon style=\"margin-right: 8px; color: #24a524\"\r\n >hourglass_empty</mat-icon\r\n >\r\n chronotopes</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <cadmus-asserted-chronotope-set\r\n [tagEntries]=\"ctTagEntries\"\r\n [assTagEntries]=\"assTagEntries\"\r\n [refTagEntries]=\"refTagEntries\"\r\n [refTypeEntries]=\"refTypeEntries\"\r\n [chronotopes]=\"initialChronotopes\"\r\n (chronotopesChange)=\"onChronotopesChange($event)\"\r\n ></cadmus-asserted-chronotope-set>\r\n </mat-expansion-panel>\r\n\r\n <!-- references -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n ><mat-icon style=\"margin-right: 8px; color: #bb3d6c\"\r\n >library_books</mat-icon\r\n >\r\n references</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <cadmus-refs-doc-references\r\n [tagEntries]=\"refTagEntries\"\r\n [typeEntries]=\"refTypeEntries\"\r\n [references]=\"initialReferences\"\r\n (referencesChange)=\"onReferencesChange($event)\"\r\n ></cadmus-refs-doc-references>\r\n </mat-expansion-panel>\r\n\r\n <!-- artists -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n ><mat-icon style=\"margin-right: 8px; color: #ddcd41\"\r\n >palette</mat-icon\r\n >\r\n artists</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n (click)=\"addArtist()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> artist\r\n </button>\r\n </div>\r\n <table *ngIf=\"artists?.value?.length\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>type</th>\r\n <th>name</th>\r\n <th>EID</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"\r\n let artist of artists?.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 artist\"\r\n (click)=\"editArtist(artist, 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 artist up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveArtistUp(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 artist down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveArtistDown(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 artist\"\r\n (click)=\"removeArtist(i)\"\r\n >\r\n <mat-icon>remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n {{ artist.type | flatLookup: artTypeEntries:\"id\":\"value\" }}\r\n </td>\r\n <td>{{ artist.name }}</td>\r\n <td>{{ artist.eid }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <mat-expansion-panel\r\n [expanded]=\"editedArtist\"\r\n [disabled]=\"!editedArtist\"\r\n >\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>artist {{ editedArtist?.name }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <cadmus-cod-decoration-artist\r\n [ctTagEntries]=\"ctTagEntries\"\r\n [assTagEntries]=\"assTagEntries\"\r\n [refTagEntries]=\"refTagEntries\"\r\n [artTypeEntries]=\"artTypeEntries\"\r\n [refTypeEntries]=\"refTypeEntries\"\r\n [artStyleEntries]=\"artStyleEntries\"\r\n [idTagEntries]=\"idTagEntries\"\r\n [idScopeEntries]=\"idScopeEntries\"\r\n [artist]=\"editedArtist\"\r\n (artistChange)=\"onArtistSave($event)\"\r\n (editorClose)=\"editArtist(null)\"\r\n ></cadmus-cod-decoration-artist>\r\n </mat-expansion-panel>\r\n </mat-expansion-panel>\r\n\r\n <!-- elements -->\r\n <h3>elements</h3>\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n (click)=\"addElement()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> element\r\n </button>\r\n </div>\r\n <table *ngIf=\"elements?.value?.length\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>key</th>\r\n <th>parent</th>\r\n <th>type</th>\r\n <th>subject</th>\r\n <th>extent</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"\r\n let element of elements?.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 element\"\r\n (click)=\"editElement(element, 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 element up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveElementUp(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 element down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveElementDown(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 element\"\r\n (click)=\"removeElement(i)\"\r\n >\r\n <mat-icon>remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ element.key }}</td>\r\n <td>{{ element.parentKey }}</td>\r\n <td>\r\n {{ element.type | flatLookup: decElemTypeEntries:\"id\":\"value\" }}\r\n </td>\r\n <td>{{ element.subject }}</td>\r\n <td>{{ element.ranges | codLocationRange }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </mat-tab>\r\n\r\n <!-- ELEMENT -->\r\n <mat-tab label=\"element\" *ngIf=\"editedElement\">\r\n <cadmus-cod-decoration-element\r\n [imgTypeEntries]=\"imgTypeEntries\"\r\n [decElemPosEntries]=\"decElemPosEntries\"\r\n [decElemFlagEntries]=\"decElemFlagEntries\"\r\n [decElemTechEntries]=\"decElemTechEntries\"\r\n [decElemToolEntries]=\"decElemToolEntries\"\r\n [decElemTypeEntries]=\"decElemTypeEntries\"\r\n [decElemColorEntries]=\"decElemColorEntries\"\r\n [decElemTypolEntries]=\"decElemTypolEntries\"\r\n [decTypeHiddenEntries]=\"decTypeHiddenEntries\"\r\n [decElemGildingEntries]=\"decElemGildingEntries\"\r\n [element]=\"editedElement\"\r\n [parentKeys]=\"parentKeys\"\r\n (elementChange)=\"onElementSave($event)\"\r\n (editorClose)=\"editElement(null)\"\r\n ></cadmus-cod-decoration-element>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- buttons -->\r\n <hr />\r\n <div class=\"toolbar-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard decoration changes\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n mat-flat-button\r\n matTooltip=\"Accept decoration changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon> decoration\r\n </button>\r\n </div>\r\n</form>\r\n", styles: ["th{text-align:left;font-weight:400;color:silver}.long-text{width:90%;max-width:800px}h3{margin-top:12px;background-color:#5db2fd;border-radius:6px;padding:0 6px;color:#fff}fieldset{border:1px solid silver;border-radius:6px;padding:6px 12px}.toolbar-row{display:flex;align-items:center;flex-wrap:wrap}.toolbar-row *{flex:0 0 auto}\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.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["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: "directive", type: i5.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.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: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i9.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i9.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i11.AssertedChronotopeSetComponent, selector: "cadmus-asserted-chronotope-set", inputs: ["chronotopes", "tagEntries", "assTagEntries", "refTypeEntries", "refTagEntries"], outputs: ["chronotopesChange"] }, { kind: "component", type: i12.DocReferencesComponent, selector: "cadmus-refs-doc-references", inputs: ["references", "typeEntries", "tagEntries"], outputs: ["referencesChange"] }, { kind: "component", type: i13.FlagsPickerComponent, selector: "cadmus-ui-flags-picker", inputs: ["selectedIds", "flags", "numbering", "toolbar", "allowUserFlags"], outputs: ["selectedIdsChange", "flagsChange"] }, { kind: "component", type: i14.CodDecorationElementComponent, selector: "cadmus-cod-decoration-element", inputs: ["element", "parentKeys", "decElemTypeEntries", "decTypeHiddenEntries", "decElemFlagEntries", "decElemColorEntries", "decElemGildingEntries", "decElemTechEntries", "decElemPosEntries", "decElemToolEntries", "decElemTypolEntries", "imgTypeEntries"], outputs: ["elementChange", "editorClose"] }, { kind: "component", type: i15.CodDecorationArtistComponent, selector: "cadmus-cod-decoration-artist", inputs: ["artist", "artTypeEntries", "artStyleEntries", "ctTagEntries", "assTagEntries", "refTypeEntries", "refTagEntries", "idTagEntries", "idScopeEntries"], outputs: ["artistChange", "editorClose"] }, { kind: "pipe", type: i16.FlatLookupPipe, name: "flatLookup" }, { kind: "pipe", type: i17.CodLocationRangePipe, name: "codLocationRange" }] });
335
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: CodDecorationComponent, decorators: [{
330
+ CodDecorationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: CodDecorationComponent, deps: [{ token: i1.FormBuilder }, { token: i2.DialogService }], target: i0.ɵɵFactoryTarget.Component });
331
+ CodDecorationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: CodDecorationComponent, selector: "cadmus-cod-decoration", inputs: { decoration: "decoration", decElemFlagEntries: "decElemFlagEntries", decFlagEntries: "decFlagEntries", decElemTypeEntries: "decElemTypeEntries", decTypeHiddenEntries: "decTypeHiddenEntries", decElemColorEntries: "decElemColorEntries", decElemGildingEntries: "decElemGildingEntries", decElemTechEntries: "decElemTechEntries", decElemPosEntries: "decElemPosEntries", decElemToolEntries: "decElemToolEntries", decElemTypolEntries: "decElemTypolEntries", imgTypeEntries: "imgTypeEntries", artTypeEntries: "artTypeEntries", artStyleEntries: "artStyleEntries", ctTagEntries: "ctTagEntries", assTagEntries: "assTagEntries", refTypeEntries: "refTypeEntries", refTagEntries: "refTagEntries", idTagEntries: "idTagEntries", idScopeEntries: "idScopeEntries" }, outputs: { decorationChange: "decorationChange", editorClose: "editorClose" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div>\r\n <!-- id -->\r\n <mat-form-field>\r\n <mat-label>ID</mat-label>\r\n <input matInput [formControl]=\"eid\" />\r\n <mat-error\r\n *ngIf=\"$any(eid).errors?.required && (eid.dirty || eid.touched)\"\r\n >EID required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(eid).errors?.maxLength && (eid.dirty || eid.touched)\"\r\n >EID too long</mat-error\r\n >\r\n </mat-form-field>\r\n &nbsp;\r\n <!-- name -->\r\n <mat-form-field>\r\n <mat-label>name</mat-label>\r\n <input matInput [formControl]=\"name\" />\r\n <mat-error\r\n *ngIf=\"$any(name).errors?.required && (name.dirty || name.touched)\"\r\n >name required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(name).errors?.maxLength && (name.dirty || name.touched)\"\r\n >name too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- flags -->\r\n <fieldset>\r\n <legend>features</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availFlags\"\r\n [selectedIds]=\"initialFlags\"\r\n (selectedIdsChange)=\"onSelectedIdsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- note -->\r\n <br />\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea rows=\"3\" matInput [formControl]=\"note\"></textarea>\r\n <mat-error\r\n *ngIf=\"$any(note).errors?.maxLength && (note.dirty || note.touched)\"\r\n >note too long</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- chronotopes -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n ><mat-icon style=\"margin-right: 8px; color: #24a524\"\r\n >hourglass_empty</mat-icon\r\n >\r\n chronotopes</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <cadmus-asserted-chronotope-set\r\n [tagEntries]=\"ctTagEntries\"\r\n [assTagEntries]=\"assTagEntries\"\r\n [refTagEntries]=\"refTagEntries\"\r\n [refTypeEntries]=\"refTypeEntries\"\r\n [chronotopes]=\"initialChronotopes\"\r\n (chronotopesChange)=\"onChronotopesChange($event)\"\r\n ></cadmus-asserted-chronotope-set>\r\n </mat-expansion-panel>\r\n\r\n <!-- references -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n ><mat-icon style=\"margin-right: 8px; color: #bb3d6c\"\r\n >library_books</mat-icon\r\n >\r\n references</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <cadmus-refs-doc-references\r\n [tagEntries]=\"refTagEntries\"\r\n [typeEntries]=\"refTypeEntries\"\r\n [references]=\"initialReferences\"\r\n (referencesChange)=\"onReferencesChange($event)\"\r\n ></cadmus-refs-doc-references>\r\n </mat-expansion-panel>\r\n\r\n <!-- artists -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n ><mat-icon style=\"margin-right: 8px; color: #ddcd41\">palette</mat-icon>\r\n artists</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n (click)=\"addArtist()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> artist\r\n </button>\r\n </div>\r\n <table *ngIf=\"artists?.value?.length\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>type</th>\r\n <th>name</th>\r\n <th>EID</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"\r\n let artist of artists?.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 artist\"\r\n (click)=\"editArtist(artist, 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 artist up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveArtistUp(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 artist down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveArtistDown(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 artist\"\r\n (click)=\"removeArtist(i)\"\r\n >\r\n <mat-icon>remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n {{ artist.type | flatLookup : artTypeEntries : \"id\" : \"value\" }}\r\n </td>\r\n <td>{{ artist.name }}</td>\r\n <td>{{ artist.eid }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <mat-expansion-panel [expanded]=\"editedArtist\" [disabled]=\"!editedArtist\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>artist {{ editedArtist?.name }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <cadmus-cod-decoration-artist\r\n [ctTagEntries]=\"ctTagEntries\"\r\n [assTagEntries]=\"assTagEntries\"\r\n [refTagEntries]=\"refTagEntries\"\r\n [artTypeEntries]=\"artTypeEntries\"\r\n [refTypeEntries]=\"refTypeEntries\"\r\n [artStyleEntries]=\"artStyleEntries\"\r\n [idTagEntries]=\"idTagEntries\"\r\n [idScopeEntries]=\"idScopeEntries\"\r\n [artist]=\"editedArtist\"\r\n (artistChange)=\"onArtistSave($event)\"\r\n (editorClose)=\"editArtist(null)\"\r\n ></cadmus-cod-decoration-artist>\r\n </mat-expansion-panel>\r\n </mat-expansion-panel>\r\n\r\n <!-- elements -->\r\n <h3>elements</h3>\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n (click)=\"addElement()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> element\r\n </button>\r\n </div>\r\n <table *ngIf=\"elements?.value?.length\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>key</th>\r\n <th>parent</th>\r\n <th>type</th>\r\n <th>subject</th>\r\n <th>extent</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"\r\n let element of elements?.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 element\"\r\n (click)=\"editElement(element, 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 element up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveElementUp(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 element down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveElementDown(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 element\"\r\n (click)=\"removeElement(i)\"\r\n >\r\n <mat-icon>remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ element.key }}</td>\r\n <td>{{ element.parentKey }}</td>\r\n <td>\r\n {{ element.type | flatLookup : decElemTypeEntries : \"id\" : \"value\" }}\r\n </td>\r\n <td>{{ element.subject }}</td>\r\n <td>{{ element.ranges | codLocationRange }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <!-- ELEMENT -->\r\n <mat-expansion-panel [disabled]=\"!editedElement\" [expanded]=\"editedElement\">\r\n <cadmus-cod-decoration-element\r\n [imgTypeEntries]=\"imgTypeEntries\"\r\n [decElemPosEntries]=\"decElemPosEntries\"\r\n [decElemFlagEntries]=\"decElemFlagEntries\"\r\n [decElemTechEntries]=\"decElemTechEntries\"\r\n [decElemToolEntries]=\"decElemToolEntries\"\r\n [decElemTypeEntries]=\"decElemTypeEntries\"\r\n [decElemColorEntries]=\"decElemColorEntries\"\r\n [decElemTypolEntries]=\"decElemTypolEntries\"\r\n [decTypeHiddenEntries]=\"decTypeHiddenEntries\"\r\n [decElemGildingEntries]=\"decElemGildingEntries\"\r\n [element]=\"editedElement\"\r\n [parentKeys]=\"parentKeys\"\r\n (elementChange)=\"onElementSave($event)\"\r\n (editorClose)=\"editElement(null)\"\r\n ></cadmus-cod-decoration-element>\r\n </mat-expansion-panel>\r\n\r\n <!-- buttons -->\r\n <hr />\r\n <div class=\"toolbar-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard decoration changes\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n mat-flat-button\r\n matTooltip=\"Accept decoration changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon> decoration\r\n </button>\r\n </div>\r\n</form>\r\n", styles: ["th{text-align:left;font-weight:400;color:silver}.long-text{width:90%;max-width:800px}h3{margin-top:12px;background-color:#5db2fd;border-radius:6px;padding:0 6px;color:#fff}fieldset{border:1px solid silver;border-radius:6px;padding:6px 12px}.toolbar-row{display:flex;align-items:center;flex-wrap:wrap}.toolbar-row *{flex:0 0 auto}\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.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["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: "directive", type: i5.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.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: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i10.AssertedChronotopeSetComponent, selector: "cadmus-asserted-chronotope-set", inputs: ["chronotopes", "tagEntries", "assTagEntries", "refTypeEntries", "refTagEntries"], outputs: ["chronotopesChange"] }, { kind: "component", type: i11.DocReferencesComponent, selector: "cadmus-refs-doc-references", inputs: ["references", "typeEntries", "tagEntries"], outputs: ["referencesChange"] }, { kind: "component", type: i12.FlagsPickerComponent, selector: "cadmus-ui-flags-picker", inputs: ["selectedIds", "flags", "numbering", "toolbar", "allowUserFlags"], outputs: ["selectedIdsChange", "flagsChange"] }, { kind: "component", type: i13.CodDecorationElementComponent, selector: "cadmus-cod-decoration-element", inputs: ["element", "parentKeys", "decElemTypeEntries", "decTypeHiddenEntries", "decElemFlagEntries", "decElemColorEntries", "decElemGildingEntries", "decElemTechEntries", "decElemPosEntries", "decElemToolEntries", "decElemTypolEntries", "imgTypeEntries"], outputs: ["elementChange", "editorClose"] }, { kind: "component", type: i14.CodDecorationArtistComponent, selector: "cadmus-cod-decoration-artist", inputs: ["artist", "artTypeEntries", "artStyleEntries", "ctTagEntries", "assTagEntries", "refTypeEntries", "refTagEntries", "idTagEntries", "idScopeEntries"], outputs: ["artistChange", "editorClose"] }, { kind: "pipe", type: i15.FlatLookupPipe, name: "flatLookup" }, { kind: "pipe", type: i16.CodLocationRangePipe, name: "codLocationRange" }] });
332
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: CodDecorationComponent, decorators: [{
336
333
  type: Component,
337
- args: [{ selector: 'cadmus-cod-decoration', template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-tab-group [(selectedIndex)]=\"tabIndex\">\r\n <!-- GENERAL -->\r\n <mat-tab label=\"general\">\r\n <div>\r\n <!-- id -->\r\n <mat-form-field>\r\n <mat-label>ID</mat-label>\r\n <input matInput [formControl]=\"eid\" />\r\n <mat-error\r\n *ngIf=\"$any(eid).errors?.required && (eid.dirty || eid.touched)\"\r\n >EID required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(eid).errors?.maxLength && (eid.dirty || eid.touched)\"\r\n >EID too long</mat-error\r\n >\r\n </mat-form-field>\r\n &nbsp;\r\n <!-- name -->\r\n <mat-form-field>\r\n <mat-label>name</mat-label>\r\n <input matInput [formControl]=\"name\" />\r\n <mat-error\r\n *ngIf=\"$any(name).errors?.required && (name.dirty || name.touched)\"\r\n >name required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(name).errors?.maxLength && (name.dirty || name.touched)\"\r\n >name too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- flags -->\r\n <fieldset>\r\n <legend>features</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availFlags\"\r\n [selectedIds]=\"initialFlags\"\r\n (selectedIdsChange)=\"onSelectedIdsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- note -->\r\n <br />\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea rows=\"3\" matInput [formControl]=\"note\"></textarea>\r\n <mat-error\r\n *ngIf=\"$any(note).errors?.maxLength && (note.dirty || note.touched)\"\r\n >note too long</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- chronotopes -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n ><mat-icon style=\"margin-right: 8px; color: #24a524\"\r\n >hourglass_empty</mat-icon\r\n >\r\n chronotopes</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <cadmus-asserted-chronotope-set\r\n [tagEntries]=\"ctTagEntries\"\r\n [assTagEntries]=\"assTagEntries\"\r\n [refTagEntries]=\"refTagEntries\"\r\n [refTypeEntries]=\"refTypeEntries\"\r\n [chronotopes]=\"initialChronotopes\"\r\n (chronotopesChange)=\"onChronotopesChange($event)\"\r\n ></cadmus-asserted-chronotope-set>\r\n </mat-expansion-panel>\r\n\r\n <!-- references -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n ><mat-icon style=\"margin-right: 8px; color: #bb3d6c\"\r\n >library_books</mat-icon\r\n >\r\n references</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <cadmus-refs-doc-references\r\n [tagEntries]=\"refTagEntries\"\r\n [typeEntries]=\"refTypeEntries\"\r\n [references]=\"initialReferences\"\r\n (referencesChange)=\"onReferencesChange($event)\"\r\n ></cadmus-refs-doc-references>\r\n </mat-expansion-panel>\r\n\r\n <!-- artists -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n ><mat-icon style=\"margin-right: 8px; color: #ddcd41\"\r\n >palette</mat-icon\r\n >\r\n artists</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n (click)=\"addArtist()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> artist\r\n </button>\r\n </div>\r\n <table *ngIf=\"artists?.value?.length\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>type</th>\r\n <th>name</th>\r\n <th>EID</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"\r\n let artist of artists?.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 artist\"\r\n (click)=\"editArtist(artist, 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 artist up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveArtistUp(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 artist down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveArtistDown(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 artist\"\r\n (click)=\"removeArtist(i)\"\r\n >\r\n <mat-icon>remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n {{ artist.type | flatLookup: artTypeEntries:\"id\":\"value\" }}\r\n </td>\r\n <td>{{ artist.name }}</td>\r\n <td>{{ artist.eid }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <mat-expansion-panel\r\n [expanded]=\"editedArtist\"\r\n [disabled]=\"!editedArtist\"\r\n >\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>artist {{ editedArtist?.name }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <cadmus-cod-decoration-artist\r\n [ctTagEntries]=\"ctTagEntries\"\r\n [assTagEntries]=\"assTagEntries\"\r\n [refTagEntries]=\"refTagEntries\"\r\n [artTypeEntries]=\"artTypeEntries\"\r\n [refTypeEntries]=\"refTypeEntries\"\r\n [artStyleEntries]=\"artStyleEntries\"\r\n [idTagEntries]=\"idTagEntries\"\r\n [idScopeEntries]=\"idScopeEntries\"\r\n [artist]=\"editedArtist\"\r\n (artistChange)=\"onArtistSave($event)\"\r\n (editorClose)=\"editArtist(null)\"\r\n ></cadmus-cod-decoration-artist>\r\n </mat-expansion-panel>\r\n </mat-expansion-panel>\r\n\r\n <!-- elements -->\r\n <h3>elements</h3>\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n (click)=\"addElement()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> element\r\n </button>\r\n </div>\r\n <table *ngIf=\"elements?.value?.length\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>key</th>\r\n <th>parent</th>\r\n <th>type</th>\r\n <th>subject</th>\r\n <th>extent</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"\r\n let element of elements?.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 element\"\r\n (click)=\"editElement(element, 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 element up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveElementUp(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 element down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveElementDown(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 element\"\r\n (click)=\"removeElement(i)\"\r\n >\r\n <mat-icon>remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ element.key }}</td>\r\n <td>{{ element.parentKey }}</td>\r\n <td>\r\n {{ element.type | flatLookup: decElemTypeEntries:\"id\":\"value\" }}\r\n </td>\r\n <td>{{ element.subject }}</td>\r\n <td>{{ element.ranges | codLocationRange }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </mat-tab>\r\n\r\n <!-- ELEMENT -->\r\n <mat-tab label=\"element\" *ngIf=\"editedElement\">\r\n <cadmus-cod-decoration-element\r\n [imgTypeEntries]=\"imgTypeEntries\"\r\n [decElemPosEntries]=\"decElemPosEntries\"\r\n [decElemFlagEntries]=\"decElemFlagEntries\"\r\n [decElemTechEntries]=\"decElemTechEntries\"\r\n [decElemToolEntries]=\"decElemToolEntries\"\r\n [decElemTypeEntries]=\"decElemTypeEntries\"\r\n [decElemColorEntries]=\"decElemColorEntries\"\r\n [decElemTypolEntries]=\"decElemTypolEntries\"\r\n [decTypeHiddenEntries]=\"decTypeHiddenEntries\"\r\n [decElemGildingEntries]=\"decElemGildingEntries\"\r\n [element]=\"editedElement\"\r\n [parentKeys]=\"parentKeys\"\r\n (elementChange)=\"onElementSave($event)\"\r\n (editorClose)=\"editElement(null)\"\r\n ></cadmus-cod-decoration-element>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- buttons -->\r\n <hr />\r\n <div class=\"toolbar-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard decoration changes\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n mat-flat-button\r\n matTooltip=\"Accept decoration changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon> decoration\r\n </button>\r\n </div>\r\n</form>\r\n", styles: ["th{text-align:left;font-weight:400;color:silver}.long-text{width:90%;max-width:800px}h3{margin-top:12px;background-color:#5db2fd;border-radius:6px;padding:0 6px;color:#fff}fieldset{border:1px solid silver;border-radius:6px;padding:6px 12px}.toolbar-row{display:flex;align-items:center;flex-wrap:wrap}.toolbar-row *{flex:0 0 auto}\n"] }]
334
+ args: [{ selector: 'cadmus-cod-decoration', template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div>\r\n <!-- id -->\r\n <mat-form-field>\r\n <mat-label>ID</mat-label>\r\n <input matInput [formControl]=\"eid\" />\r\n <mat-error\r\n *ngIf=\"$any(eid).errors?.required && (eid.dirty || eid.touched)\"\r\n >EID required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(eid).errors?.maxLength && (eid.dirty || eid.touched)\"\r\n >EID too long</mat-error\r\n >\r\n </mat-form-field>\r\n &nbsp;\r\n <!-- name -->\r\n <mat-form-field>\r\n <mat-label>name</mat-label>\r\n <input matInput [formControl]=\"name\" />\r\n <mat-error\r\n *ngIf=\"$any(name).errors?.required && (name.dirty || name.touched)\"\r\n >name required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(name).errors?.maxLength && (name.dirty || name.touched)\"\r\n >name too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- flags -->\r\n <fieldset>\r\n <legend>features</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availFlags\"\r\n [selectedIds]=\"initialFlags\"\r\n (selectedIdsChange)=\"onSelectedIdsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- note -->\r\n <br />\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea rows=\"3\" matInput [formControl]=\"note\"></textarea>\r\n <mat-error\r\n *ngIf=\"$any(note).errors?.maxLength && (note.dirty || note.touched)\"\r\n >note too long</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- chronotopes -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n ><mat-icon style=\"margin-right: 8px; color: #24a524\"\r\n >hourglass_empty</mat-icon\r\n >\r\n chronotopes</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <cadmus-asserted-chronotope-set\r\n [tagEntries]=\"ctTagEntries\"\r\n [assTagEntries]=\"assTagEntries\"\r\n [refTagEntries]=\"refTagEntries\"\r\n [refTypeEntries]=\"refTypeEntries\"\r\n [chronotopes]=\"initialChronotopes\"\r\n (chronotopesChange)=\"onChronotopesChange($event)\"\r\n ></cadmus-asserted-chronotope-set>\r\n </mat-expansion-panel>\r\n\r\n <!-- references -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n ><mat-icon style=\"margin-right: 8px; color: #bb3d6c\"\r\n >library_books</mat-icon\r\n >\r\n references</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <cadmus-refs-doc-references\r\n [tagEntries]=\"refTagEntries\"\r\n [typeEntries]=\"refTypeEntries\"\r\n [references]=\"initialReferences\"\r\n (referencesChange)=\"onReferencesChange($event)\"\r\n ></cadmus-refs-doc-references>\r\n </mat-expansion-panel>\r\n\r\n <!-- artists -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n ><mat-icon style=\"margin-right: 8px; color: #ddcd41\">palette</mat-icon>\r\n artists</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n (click)=\"addArtist()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> artist\r\n </button>\r\n </div>\r\n <table *ngIf=\"artists?.value?.length\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>type</th>\r\n <th>name</th>\r\n <th>EID</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"\r\n let artist of artists?.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 artist\"\r\n (click)=\"editArtist(artist, 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 artist up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveArtistUp(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 artist down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveArtistDown(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 artist\"\r\n (click)=\"removeArtist(i)\"\r\n >\r\n <mat-icon>remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n {{ artist.type | flatLookup : artTypeEntries : \"id\" : \"value\" }}\r\n </td>\r\n <td>{{ artist.name }}</td>\r\n <td>{{ artist.eid }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <mat-expansion-panel [expanded]=\"editedArtist\" [disabled]=\"!editedArtist\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>artist {{ editedArtist?.name }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <cadmus-cod-decoration-artist\r\n [ctTagEntries]=\"ctTagEntries\"\r\n [assTagEntries]=\"assTagEntries\"\r\n [refTagEntries]=\"refTagEntries\"\r\n [artTypeEntries]=\"artTypeEntries\"\r\n [refTypeEntries]=\"refTypeEntries\"\r\n [artStyleEntries]=\"artStyleEntries\"\r\n [idTagEntries]=\"idTagEntries\"\r\n [idScopeEntries]=\"idScopeEntries\"\r\n [artist]=\"editedArtist\"\r\n (artistChange)=\"onArtistSave($event)\"\r\n (editorClose)=\"editArtist(null)\"\r\n ></cadmus-cod-decoration-artist>\r\n </mat-expansion-panel>\r\n </mat-expansion-panel>\r\n\r\n <!-- elements -->\r\n <h3>elements</h3>\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n (click)=\"addElement()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> element\r\n </button>\r\n </div>\r\n <table *ngIf=\"elements?.value?.length\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>key</th>\r\n <th>parent</th>\r\n <th>type</th>\r\n <th>subject</th>\r\n <th>extent</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"\r\n let element of elements?.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 element\"\r\n (click)=\"editElement(element, 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 element up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveElementUp(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 element down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveElementDown(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 element\"\r\n (click)=\"removeElement(i)\"\r\n >\r\n <mat-icon>remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ element.key }}</td>\r\n <td>{{ element.parentKey }}</td>\r\n <td>\r\n {{ element.type | flatLookup : decElemTypeEntries : \"id\" : \"value\" }}\r\n </td>\r\n <td>{{ element.subject }}</td>\r\n <td>{{ element.ranges | codLocationRange }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <!-- ELEMENT -->\r\n <mat-expansion-panel [disabled]=\"!editedElement\" [expanded]=\"editedElement\">\r\n <cadmus-cod-decoration-element\r\n [imgTypeEntries]=\"imgTypeEntries\"\r\n [decElemPosEntries]=\"decElemPosEntries\"\r\n [decElemFlagEntries]=\"decElemFlagEntries\"\r\n [decElemTechEntries]=\"decElemTechEntries\"\r\n [decElemToolEntries]=\"decElemToolEntries\"\r\n [decElemTypeEntries]=\"decElemTypeEntries\"\r\n [decElemColorEntries]=\"decElemColorEntries\"\r\n [decElemTypolEntries]=\"decElemTypolEntries\"\r\n [decTypeHiddenEntries]=\"decTypeHiddenEntries\"\r\n [decElemGildingEntries]=\"decElemGildingEntries\"\r\n [element]=\"editedElement\"\r\n [parentKeys]=\"parentKeys\"\r\n (elementChange)=\"onElementSave($event)\"\r\n (editorClose)=\"editElement(null)\"\r\n ></cadmus-cod-decoration-element>\r\n </mat-expansion-panel>\r\n\r\n <!-- buttons -->\r\n <hr />\r\n <div class=\"toolbar-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard decoration changes\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n mat-flat-button\r\n matTooltip=\"Accept decoration changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon> decoration\r\n </button>\r\n </div>\r\n</form>\r\n", styles: ["th{text-align:left;font-weight:400;color:silver}.long-text{width:90%;max-width:800px}h3{margin-top:12px;background-color:#5db2fd;border-radius:6px;padding:0 6px;color:#fff}fieldset{border:1px solid silver;border-radius:6px;padding:6px 12px}.toolbar-row{display:flex;align-items:center;flex-wrap:wrap}.toolbar-row *{flex:0 0 auto}\n"] }]
338
335
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.DialogService }]; }, propDecorators: { decoration: [{
339
336
  type: Input
340
337
  }], decElemFlagEntries: [{
@@ -380,4 +377,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImpor
380
377
  }], editorClose: [{
381
378
  type: Output
382
379
  }] } });
383
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kLWRlY29yYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vY2FkbXVzLXBhcnQtY29kaWNvbG9neS1kZWNvcmF0aW9ucy9zcmMvbGliL2NvZC1kZWNvcmF0aW9uL2NvZC1kZWNvcmF0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2NhZG11cy1wYXJ0LWNvZGljb2xvZ3ktZGVjb3JhdGlvbnMvc3JjL2xpYi9jb2QtZGVjb3JhdGlvbi9jb2QtZGVjb3JhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFJTCxVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBYzVCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBTUgsTUFBTSxPQUFPLHNCQUFzQjtJQTJIakMsWUFBWSxXQUF3QixFQUFVLGNBQTZCO1FBQTdCLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBUnBFLGtCQUFhLEdBQUc7WUFDckIsS0FBSyxFQUFFLFVBQVU7WUFDakIsUUFBUSxFQUFFLFVBQVU7WUFDcEIsUUFBUSxFQUFFLElBQUk7WUFDZCwwREFBMEQ7WUFDMUQsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQztRQUdBLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLFFB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QUs7Z0JBSUMsbUJBQW1CO3NCQUR6QixLQUFLO2dCQUlDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBSUMsY0FBYztzQkFEcEIsS0FBSztnQkFJQyxlQUFlO3NCQURyQixLQUFLO2dCQUlDLFlBQVk7c0JBRGxCLEtBQUs7Z0JBSUMsYUFBYTtzQkFEbkIsS0FBSztnQkFJQyxjQUFjO3NCQURwQixLQUFLO2dCQUlDLGFBQWE7c0JBRG5CLEtBQUs7Z0JBSUMsWUFBWTtzQkFEbEIsS0FBSztnQkFJQyxjQUFjO3NCQURwQixLQUFLO2dCQUlDLGdCQUFnQjtzQkFEdEIsTUFBTTtnQkFHQSxXQUFXO3NCQURqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEZvcm1CdWlsZGVyLFxyXG4gIEZvcm1Db250cm9sLFxyXG4gIEZvcm1Hcm91cCxcclxuICBWYWxpZGF0b3JzLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgVGhlc2F1cnVzRW50cnkgfSBmcm9tICdAbXlybWlkb24vY2FkbXVzLWNvcmUnO1xyXG5pbXBvcnQgeyBBc3NlcnRlZENocm9ub3RvcGUgfSBmcm9tICdAbXlybWlkb24vY2FkbXVzLXJlZnMtYXNzZXJ0ZWQtY2hyb25vdG9wZSc7XHJcbmltcG9ydCB7IERvY1JlZmVyZW5jZSB9IGZyb20gJ0BteXJtaWRvbi9jYWRtdXMtcmVmcy1kb2MtcmVmZXJlbmNlcyc7XHJcbmltcG9ydCB7IEZsYWcgfSBmcm9tICdAbXlybWlkb24vY2FkbXVzLXVpLWZsYWdzLXBpY2tlcic7XHJcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICdAbXlybWlkb24vbmctbWF0LXRvb2xzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgQ29kRGVjb3JhdGlvbixcclxuICBDb2REZWNvcmF0aW9uQXJ0aXN0LFxyXG4gIENvZERlY29yYXRpb25FbGVtZW50LFxyXG59IGZyb20gJy4uL2NvZC1kZWNvcmF0aW9ucy1wYXJ0JztcclxuXHJcbi8qKlxyXG4gKiBNYW51c2NyaXB0J3MgZGVjb3JhdGlvbiBlZGl0b3IuXHJcbiAqIFRoaXMgY29tcG9uZW50IHJlcXVpcmVzIHRoZSBjb2QtZGVjb3JhdGlvbi1lbGVtZW50LXR5cGVzIHRoZXNhdXJ1cy5cclxuICogQWNjb3JkaW5nIHRvIHRoZSB0eXBlIHNlbGVjdGVkLCBpdCBjaGFuZ2VzIGl0cyBVSSBieTpcclxuICogLSBmaWx0ZXJpbmcgdGhlIGNvbnRlbnQgb2YgYWxsIHRoZSBvdGhlciB0aGVzYXVyaSAoZXhjZXB0XHJcbiAqIGNvZC1kZWNvcmF0aW9uLXR5cGUtaGlkZGVuLCB3aGljaCBoYXMgYSBzcGVjaWFsIG1lYW5pbmcpLFxyXG4gKiB3aGVuIHRoZXkgaGF2ZSBhIGhpZXJhcmNoeSAoaS5lLiB0aGVpciBJRHMgY29udGFpbiBhIGRvdCkuXHJcbiAqIFN1Y2ggdHlwZS1kZXBlbmRlbnQgdGhlc2F1cmkgaGF2ZSB0aGVpciBlbnRyaWVzIElEcyBwcmVmaXhlZFxyXG4gKiB3aXRoIHRoZSB0eXBlIElEIGZvbGxvd2VkIGJ5IGRvdC4gRm9yIGluc3RhbmNlLCB0eXBlIFwiaWxsXCJcclxuICogaGFzIHNvbWUgY29ycmVzcG9uZGluZyBlbnRyaWVzIGluIGEgdHlwZS1kZXBlbmRlbnQgdGhlc2F1cnVzXHJcbiAqIGxpa2UgY29kLWRlY29yYXRpb24tZWxlbWVudC10eXBlcywgbGlrZSBcImlsbC5taW5pYXR1cmVcIixcclxuICogXCJpbGwuZHJhd2luZ1wiLCBldGMuXHJcbiAqIEFsc28sIGlmIHRoZSBmaWx0ZXJlZCBjb250ZW50IG9mIGEgdGhlc2F1cnVzIGhhcHBlbnMgdG8gaGF2ZVxyXG4gKiBhbiBlbnRyeSBJRCBlcXVhbCB0byBcIi1cIiBvbmNlIHRoZSB0eXBlIHByZWZpeCBoYXMgYmVlbiBzdHJpcHBlZFxyXG4gKiBvdXQsIHRoaXMgbWVhbnMgdGhhdCBpbiB0aGlzIGNhc2UgdGhlIGNvcnJlc3BvbmRpbmcgY29udHJvbFxyXG4gKiBzaG91bGQgYmUgYSBmcmVlIHRleHQgYm94IHJhdGhlciB0aGFuIGEgc2VsZWN0b3IuXHJcbiAqIFRoaXMgYW55d2F5IGRvZXMgbm90IGFwcGx5IHRvIHRob3NlIGNvbnRyb2xzIGFsbG93aW5nIG11bHRpcGxlXHJcbiAqIHNlbGVjdGlvbnMsIGxpa2UgZmxhZ3Mgb3IgY29sb3JzLlxyXG4gKiAtIGhpZGluZyBzb21lIGNvbnRyb2xzLiBXaGVuIGEgdHlwZSBpcyBzZWxlY3RlZCwgdGhlIHRoZXNhdXJ1c1xyXG4gKiBjb2QtZGVjb3JhdGlvbi10eXBlLWhpZGRlbiBpcyBsb29rZWQgdXAgdG8gZmluZCBhbiBlbnRyeVxyXG4gKiB3aXRoIElEIGVxdWFsIHRvIHRoZSBzZWxlY3RlZCB0eXBlIElELiBJZiBmb3VuZCwgaXQgaXMgYXNzdW1lZFxyXG4gKiB0aGF0IGl0cyB2YWx1ZSBpcyBhIHNwYWNlLWRlbGltaXRlZCBsaXN0IG9mIG5hbWVzIG9mIHRob3NlXHJcbiAqIGNvbnRyb2xzIHdoaWNoIHNob3VsZCBiZSBoaWRkZW4uXHJcbiAqIFRoaXMgbG9naWMgaXMgZWZmZWN0aXZlbHkgaW1wbGVtZW50ZWQgYnlcclxuICogQ29kRGVjb3JhdGlvbkVsZW1lbnRDb21wb25lbnQuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2NhZG11cy1jb2QtZGVjb3JhdGlvbicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NvZC1kZWNvcmF0aW9uLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jb2QtZGVjb3JhdGlvbi5jb21wb25lbnQuY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb2REZWNvcmF0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBwcml2YXRlIF9kZWNvcmF0aW9uOiBDb2REZWNvcmF0aW9uIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX2RlY0ZsYWdFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgZGVjb3JhdGlvbigpOiBDb2REZWNvcmF0aW9uIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9kZWNvcmF0aW9uO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGRlY29yYXRpb24odmFsdWU6IENvZERlY29yYXRpb24gfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2RlY29yYXRpb24gPSB2YWx1ZTtcclxuICAgIHRoaXMudXBkYXRlRm9ybSh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvLyBjb2QtZGVjb3JhdGlvbi1lbGVtZW50LWZsYWdzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZGVjRWxlbUZsYWdFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG5cclxuICAvLyBjb2QtZGVjb3JhdGlvbi1mbGFnc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCBkZWNGbGFnRW50cmllcygpOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9kZWNGbGFnRW50cmllcztcclxuICB9XHJcbiAgcHVibGljIHNldCBkZWNGbGFnRW50cmllcyh2YWx1ZTogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fZGVjRmxhZ0VudHJpZXMgPSB2YWx1ZTtcclxuICAgIHRoaXMuYXZhaWxGbGFncyA9IHZhbHVlPy5sZW5ndGhcclxuICAgICAgPyB2YWx1ZS5tYXAoKGUpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGlkOiBlLmlkLFxyXG4gICAgICAgICAgICBsYWJlbDogZS52YWx1ZSxcclxuICAgICAgICAgIH0gYXMgRmxhZztcclxuICAgICAgICB9KVxyXG4gICAgICA6IFtdO1xyXG4gIH1cclxuXHJcbiAgLy8gY29kLWRlY29yYXRpb24tZWxlbWVudC10eXBlcyAocmVxdWlyZWQpXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZGVjRWxlbVR5cGVFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGNvZC1kZWNvcmF0aW9uLXR5cGUtaGlkZGVuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZGVjVHlwZUhpZGRlbkVudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gY29kLWRlY29yYXRpb24tZWxlbWVudC1jb2xvcnNcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBkZWNFbGVtQ29sb3JFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGNvZC1kZWNvcmF0aW9uLWVsZW1lbnQtZ2lsZGluZ3NcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBkZWNFbGVtR2lsZGluZ0VudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gY29kLWRlY29yYXRpb24tZWxlbWVudC10ZWNobmlxdWVzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZGVjRWxlbVRlY2hFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGNvZC1kZWNvcmF0aW9uLWVsZW1lbnQtcG9zaXRpb25zXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZGVjRWxlbVBvc0VudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gY29kLWRlY29yYXRpb24tZWxlbWVudC10b29sc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGRlY0VsZW1Ub29sRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICAvLyBjb2QtZGVjb3JhdGlvbi1lbGVtZW50LXR5cG9sb2dpZXNcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBkZWNFbGVtVHlwb2xFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGNvZC1pbWFnZS10eXBlc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGltZ1R5cGVFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGNvZC1kZWNvcmF0aW9uLWFydGlzdC10eXBlc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGFydFR5cGVFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGNvZC1kZWNvcmF0aW9uLWFydGlzdC1zdHlsZS1uYW1lc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGFydFN0eWxlRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICAvLyBjaHJvbm90b3BlLXRhZ3NcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBjdFRhZ0VudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gYXNzZXJ0aW9uLXRhZ3NcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBhc3NUYWdFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGRvYy1yZWZlcmVuY2UtdHlwZXNcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyByZWZUeXBlRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICAvLyBkb2MtcmVmZXJlbmNlLXRhZ3NcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyByZWZUYWdFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGV4dGVybmFsLWlkLXRhZ3NcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBpZFRhZ0VudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gZXh0ZXJuYWwtaWQtc2NvcGVzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgaWRTY29wZUVudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBkZWNvcmF0aW9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Q29kRGVjb3JhdGlvbj47XHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIGVkaXRvckNsb3NlOiBFdmVudEVtaXR0ZXI8YW55PjtcclxuXHJcbiAgcHVibGljIGVpZDogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgcHVibGljIG5hbWU6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIHB1YmxpYyBmbGFnczogRm9ybUNvbnRyb2w8c3RyaW5nW10+O1xyXG4gIHB1YmxpYyBjaHJvbm90b3BlczogRm9ybUNvbnRyb2w8QXNzZXJ0ZWRDaHJvbm90b3BlW10+O1xyXG4gIHB1YmxpYyBhcnRpc3RzOiBGb3JtQ29udHJvbDxDb2REZWNvcmF0aW9uQXJ0aXN0W10+O1xyXG4gIHB1YmxpYyBub3RlOiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuICBwdWJsaWMgcmVmZXJlbmNlczogRm9ybUNvbnRyb2w8RG9jUmVmZXJlbmNlW10+O1xyXG4gIHB1YmxpYyBlbGVtZW50czogRm9ybUNvbnRyb2w8Q29kRGVjb3JhdGlvbkVsZW1lbnRbXT47XHJcbiAgcHVibGljIGZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgcHVibGljIGluaXRpYWxDaHJvbm90b3BlczogQXNzZXJ0ZWRDaHJvbm90b3BlW107XHJcbiAgcHVibGljIGluaXRpYWxSZWZlcmVuY2VzOiBEb2NSZWZlcmVuY2VbXTtcclxuICBwdWJsaWMgaW5pdGlhbEZsYWdzOiBzdHJpbmdbXTtcclxuICBwdWJsaWMgYXZhaWxGbGFnczogRmxhZ1tdO1xyXG5cclxuICBwdWJsaWMgZWRpdGVkRWxlbWVudEluZGV4OiBudW1iZXI7XHJcbiAgcHVibGljIGVkaXRlZEVsZW1lbnQ6IENvZERlY29yYXRpb25FbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyBwYXJlbnRLZXlzOiBzdHJpbmdbXTtcclxuXHJcbiAgcHVibGljIGVkaXRlZEFydGlzdEluZGV4OiBudW1iZXI7XHJcbiAgcHVibGljIGVkaXRlZEFydGlzdD86IENvZERlY29yYXRpb25BcnRpc3Q7XHJcblxyXG4gIHB1YmxpYyB0YWJJbmRleDogbnVtYmVyO1xyXG5cclxuICBwdWJsaWMgZWRpdG9yT3B0aW9ucyA9IHtcclxuICAgIHRoZW1lOiAndnMtbGlnaHQnLFxyXG4gICAgbGFuZ3VhZ2U6ICdtYXJrZG93bicsXHJcbiAgICB3b3JkV3JhcDogJ29uJyxcclxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hdHVsYXJlbi9uZ3gtbW9uYWNvLWVkaXRvci9pc3N1ZXMvMTlcclxuICAgIGF1dG9tYXRpY0xheW91dDogdHJ1ZSxcclxuICB9O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsIHByaXZhdGUgX2RpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UpIHtcclxuICAgIHRoaXMuZWRpdGVkRWxlbWVudEluZGV4ID0gLTE7XHJcbiAgICB0aGlzLnBhcmVudEtleXMgPSBbXTtcclxuICAgIHRoaXMuZWRpdGVkQXJ0aXN0SW5kZXggPSAtMTtcclxuICAgIHRoaXMudGFiSW5kZXggPSAwO1xyXG4gICAgdGhpcy5kZWNvcmF0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxDb2REZWNvcmF0aW9uPigpO1xyXG4gICAgdGhpcy5lZGl0b3JDbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgdGhpcy5pbml0aWFsQ2hyb25vdG9wZXMgPSBbXTtcclxuICAgIHRoaXMuaW5pdGlhbFJlZmVyZW5jZXMgPSBbXTtcclxuICAgIHRoaXMuaW5pdGlhbEZsYWdzID0gW107XHJcbiAgICB0aGlzLmF2YWlsRmxhZ3MgPSBbXTtcclxuICAgIC8vIGZvcm1cclxuICAgIHRoaXMuZWlkID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLCBWYWxpZGF0b3JzLm1heExlbmd0aCgxMDApKTtcclxuICAgIHRoaXMubmFtZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgW1xyXG4gICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICBWYWxpZGF0b3JzLm1heExlbmd0aCg1MCksXHJcbiAgICBdKTtcclxuICAgIHRoaXMuZmxhZ3MgPSBmb3JtQnVpbGRlci5jb250cm9sKFtdLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xyXG4gICAgdGhpcy5jaHJvbm90b3BlcyA9IGZvcm1CdWlsZGVyLmNvbnRyb2woW10sIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLmFydGlzdHMgPSBmb3JtQnVpbGRlci5jb250cm9sKFtdLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xyXG4gICAgdGhpcy5ub3RlID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLCBWYWxpZGF0b3JzLm1heExlbmd0aCgxMDAwKSk7XHJcbiAgICB0aGlzLnJlZmVyZW5jZXMgPSBmb3JtQnVpbGRlci5jb250cm9sKFtdLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xyXG4gICAgdGhpcy5lbGVtZW50cyA9IGZvcm1CdWlsZGVyLmNvbnRyb2woW10sIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLmZvcm0gPSBmb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIGVpZDogdGhpcy5laWQsXHJcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcclxuICAgICAgZmxhZ3M6IHRoaXMuZmxhZ3MsXHJcbiAgICAgIGNocm9ub3RvcGVzOiB0aGlzLmNocm9ub3RvcGVzLFxyXG4gICAgICBhcnRpc3RzOiB0aGlzLmFydGlzdHMsXHJcbiAgICAgIG5vdGU6IHRoaXMubm90ZSxcclxuICAgICAgcmVmZXJlbmNlczogdGhpcy5yZWZlcmVuY2VzLFxyXG4gICAgICBlbGVtZW50czogdGhpcy5lbGVtZW50cyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fZGVjb3JhdGlvbikge1xyXG4gICAgICB0aGlzLnVwZGF0ZUZvcm0odGhpcy5fZGVjb3JhdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUZvcm0oZGVjb3JhdGlvbjogQ29kRGVjb3JhdGlvbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgaWYgKCFkZWNvcmF0aW9uKSB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbENocm9ub3RvcGVzID0gW107XHJcbiAgICAgIHRoaXMuaW5pdGlhbFJlZmVyZW5jZXMgPSBbXTtcclxuICAgICAgdGhpcy5pbml0aWFsRmxhZ3MgPSBbXTtcclxuICAgICAgdGhpcy5mb3JtLnJlc2V0KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluaXRpYWxDaHJvbm90b3BlcyA9IGRlY29yYXRpb24uY2hyb25vdG9wZXMgfHwgW107XHJcbiAgICB0aGlzLmluaXRpYWxSZWZlcmVuY2VzID0gZGVjb3JhdGlvbi5yZWZlcmVuY2VzIHx8IFtdO1xyXG4gICAgdGhpcy5pbml0aWFsRmxhZ3MgPSBkZWNvcmF0aW9uLmZsYWdzIHx8IFtdO1xyXG5cclxuICAgIHRoaXMuZWlkLnNldFZhbHVlKGRlY29yYXRpb24uZWlkIHx8IG51bGwpO1xyXG4gICAgdGhpcy5uYW1lLnNldFZhbHVlKGRlY29yYXRpb24ubmFtZSk7XHJcbiAgICB0aGlzLm5vdGUuc2V0VmFsdWUoZGVjb3JhdGlvbi5ub3RlIHx8IG51bGwpO1xyXG4gICAgdGhpcy5hcnRpc3RzLnNldFZhbHVlKGRlY29yYXRpb24uYXJ0aXN0cyB8fCBbXSk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnNldFZhbHVlKGRlY29yYXRpb24uZWxlbWVudHMgfHwgW10pO1xyXG4gICAgdGhpcy51cGRhdGVQYXJlbnRLZXlzKCk7XHJcblxyXG4gICAgdGhpcy5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DaHJvbm90b3Blc0NoYW5nZShjaHJvbm90b3BlczogQXNzZXJ0ZWRDaHJvbm90b3BlW10pOiB2b2lkIHtcclxuICAgIHRoaXMuY2hyb25vdG9wZXMuc2V0VmFsdWUoY2hyb25vdG9wZXMpO1xyXG4gICAgdGhpcy5jaHJvbm90b3Blcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB0aGlzLmNocm9ub3RvcGVzLm1hcmtBc0RpcnR5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25SZWZlcmVuY2VzQ2hhbmdlKHJlZmVyZW5jZXM6IERvY1JlZmVyZW5jZVtdKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlZmVyZW5jZXMuc2V0VmFsdWUocmVmZXJlbmNlcyk7XHJcbiAgICB0aGlzLnJlZmVyZW5jZXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5yZWZlcmVuY2VzLm1hcmtBc0RpcnR5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25TZWxlY3RlZElkc0NoYW5nZShpZHM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICB0aGlzLmZsYWdzLnNldFZhbHVlKGlkcyk7XHJcbiAgICB0aGlzLmZsYWdzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuZmxhZ3MubWFya0FzRGlydHkoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RGVjb3JhdGlvbigpOiBDb2REZWNvcmF0aW9uIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGVpZDogdGhpcy5laWQudmFsdWU/LnRyaW0oKSxcclxuICAgICAgbmFtZTogdGhpcy5uYW1lLnZhbHVlPy50cmltKCkgfHwgJycsXHJcbiAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLnZhbHVlPy5sZW5ndGggPyB0aGlzLmZsYWdzLnZhbHVlIDogdW5kZWZpbmVkLFxyXG4gICAgICBjaHJvbm90b3BlczogdGhpcy5jaHJvbm90b3Blcy52YWx1ZT8ubGVuZ3RoXHJcbiAgICAgICAgPyB0aGlzLmNocm9ub3RvcGVzLnZhbHVlXHJcbiAgICAgICAgOiB1bmRlZmluZWQsXHJcbiAgICAgIHJlZmVyZW5jZXM6IHRoaXMucmVmZXJlbmNlcy52YWx1ZT8ubGVuZ3RoXHJcbiAgICAgICAgPyB0aGlzLnJlZmVyZW5jZXMudmFsdWVcclxuICAgICAgICA6IHVuZGVmaW5lZCxcclxuICAgICAgYXJ0aXN0czogdGhpcy5hcnRpc3RzLnZhbHVlPy5sZW5ndGggPyB0aGlzLmFydGlzdHMudmFsdWUgOiB1bmRlZmluZWQsXHJcbiAgICAgIG5vdGU6IHRoaXMubm90ZS52YWx1ZT8udHJpbSgpLFxyXG4gICAgICBlbGVtZW50czogdGhpcy5lbGVtZW50cy52YWx1ZT8ubGVuZ3RoID8gdGhpcy5lbGVtZW50cy52YWx1ZSA6IHVuZGVmaW5lZCxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gZWxlbWVudHNcclxuICBwdWJsaWMgYWRkRWxlbWVudCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZWRpdEVsZW1lbnQoe1xyXG4gICAgICB0eXBlOiB0aGlzLmRlY0VsZW1UeXBlRW50cmllcz8ubGVuZ3RoXHJcbiAgICAgICAgPyB0aGlzLmRlY0VsZW1UeXBlRW50cmllc1swXS5pZFxyXG4gICAgICAgIDogJycsXHJcbiAgICAgIGZsYWdzOiBbXSxcclxuICAgICAgcmFuZ2VzOiBbXSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGVkaXRFbGVtZW50KGVsZW1lbnQ6IENvZERlY29yYXRpb25FbGVtZW50IHwgbnVsbCwgaW5kZXggPSAtMSk6IHZvaWQge1xyXG4gICAgaWYgKCFlbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuZWRpdGVkRWxlbWVudEluZGV4ID0gLTE7XHJcbiAgICAgIHRoaXMudGFiSW5kZXggPSAwO1xyXG4gICAgICB0aGlzLmVkaXRlZEVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVkaXRlZEVsZW1lbnRJbmRleCA9IGluZGV4O1xyXG4gICAgICB0aGlzLmVkaXRlZEVsZW1lbnQgPSBlbGVtZW50O1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnRhYkluZGV4ID0gMTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVBhcmVudEtleXMoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMudmFsdWU/Lmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnBhcmVudEtleXMgPSBbXTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IGtleXM6IHN0cmluZ1tdID0gdGhpcy5lbGVtZW50cy52YWx1ZS5tYXAoXHJcbiAgICAgIChlOiBDb2REZWNvcmF0aW9uRWxlbWVudCkgPT4gZS5rZXkhXHJcbiAgICApO1xyXG4gICAgdGhpcy5wYXJlbnRLZXlzID0gWy4uLm5ldyBTZXQoa2V5cyldLnNvcnQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkVsZW1lbnRTYXZlKGVsZW1lbnQ6IENvZERlY29yYXRpb25FbGVtZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBlbGVtZW50cyA9IFsuLi50aGlzLmVsZW1lbnRzLnZhbHVlXTtcclxuXHJcbiAgICBpZiAodGhpcy5lZGl0ZWRFbGVtZW50SW5kZXggPiAtMSkge1xyXG4gICAgICBlbGVtZW50cy5zcGxpY2UodGhpcy5lZGl0ZWRFbGVtZW50SW5kZXgsIDEsIGVsZW1lbnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZWxlbWVudHMucHVzaChlbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLnNldFZhbHVlKGVsZW1lbnRzKTtcclxuICAgIHRoaXMuZWxlbWVudHMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5lbGVtZW50cy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgdGhpcy5lZGl0RWxlbWVudChudWxsKTtcclxuICAgIHRoaXMudXBkYXRlUGFyZW50S2V5cygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZUVsZW1lbnQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fZGlhbG9nU2VydmljZVxyXG4gICAgICAuY29uZmlybSgnQ29uZmlybWF0aW9uJywgJ0RlbGV0ZSBlbGVtZW50PycpXHJcbiAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHllczogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgIGlmICh5ZXMpIHtcclxuICAgICAgICAgIGNvbnN0IGl0ZW1zID0gWy4uLnRoaXMuZWxlbWVudHMudmFsdWVdO1xyXG4gICAgICAgICAgaXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgIHRoaXMuZWxlbWVudHMuc2V0VmFsdWUoaXRlbXMpO1xyXG4gICAgICAgICAgdGhpcy5lbGVtZW50cy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICB0aGlzLmVsZW1lbnRzLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVBhcmVudEtleXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG1vdmVFbGVtZW50VXAoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKGluZGV4IDwgMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBpdGVtID0gdGhpcy5lbGVtZW50cy52YWx1ZVtpbmRleF07XHJcbiAgICBjb25zdCBpdGVtcyA9IFsuLi50aGlzLmVsZW1lbnRzLnZhbHVlXTtcclxuICAgIGl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICBpdGVtcy5zcGxpY2UoaW5kZXggLSAxLCAwLCBpdGVtKTtcclxuICAgIHRoaXMuZWxlbWVudHMuc2V0VmFsdWUoaXRlbXMpO1xyXG4gICAgdGhpcy5lbGVtZW50cy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLm1hcmtBc0RpcnR5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbW92ZUVsZW1lbnREb3duKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChpbmRleCArIDEgPj0gdGhpcy5lbGVtZW50cy52YWx1ZS5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaXRlbSA9IHRoaXMuZWxlbWVudHMudmFsdWVbaW5kZXhdO1xyXG4gICAgY29uc3QgaXRlbXMgPSBbLi4udGhpcy5lbGVtZW50cy52YWx1ZV07XHJcbiAgICBpdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgaXRlbXMuc3BsaWNlKGluZGV4ICsgMSwgMCwgaXRlbSk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnNldFZhbHVlKGl0ZW1zKTtcclxuICAgIHRoaXMuZWxlbWVudHMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5lbGVtZW50cy5tYXJrQXNEaXJ0eSgpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIGFydGlzdHNcclxuICBwdWJsaWMgYWRkQXJ0aXN0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5lZGl0QXJ0aXN0KHtcclxuICAgICAgdHlwZTogdGhpcy5hcnRUeXBlRW50cmllcz8ubGVuZ3RoID8gdGhpcy5hcnRUeXBlRW50cmllc1swXS5pZCA6ICcnLFxyXG4gICAgICBuYW1lOiAnJyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGVkaXRBcnRpc3QoYXJ0aXN0OiBDb2REZWNvcmF0aW9uQXJ0aXN0IHwgbnVsbCwgaW5kZXggPSAtMSk6IHZvaWQge1xyXG4gICAgaWYgKCFhcnRpc3QpIHtcclxuICAgICAgdGhpcy5lZGl0ZWRBcnRpc3RJbmRleCA9IC0xO1xyXG4gICAgICB0aGlzLmVkaXRlZEFydGlzdCA9IHVuZGVmaW5lZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZWRpdGVkQXJ0aXN0SW5kZXggPSBpbmRleDtcclxuICAgICAgdGhpcy5lZGl0ZWRBcnRpc3QgPSBhcnRpc3Q7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25BcnRpc3RTYXZlKGFydGlzdDogQ29kRGVjb3JhdGlvbkFydGlzdCk6IHZvaWQge1xyXG4gICAgY29uc3QgYXJ0aXN0cyA9IFsuLi50aGlzLmFydGlzdHMudmFsdWVdO1xyXG5cclxuICAgIGlmICh0aGlzLmVkaXRlZEFydGlzdEluZGV4ID4gLTEpIHtcclxuICAgICAgYXJ0aXN0cy5zcGxpY2UodGhpcy5lZGl0ZWRBcnRpc3RJbmRleCwgMSwgYXJ0aXN0KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGFydGlzdHMucHVzaChhcnRpc3QpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXJ0aXN0cy5zZXRWYWx1ZShhcnRpc3RzKTtcclxuICAgIHRoaXMuYXJ0aXN0cy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB0aGlzLmFydGlzdHMubWFya0FzRGlydHkoKTtcclxuICAgIHRoaXMuZWRpdEFydGlzdChudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVBcnRpc3QoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fZGlhbG9nU2VydmljZVxyXG4gICAgICAuY29uZmlybSgnQ29uZmlybWF0aW9uJywgJ0RlbGV0ZSBhcnRpc3Q/JylcclxuICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICAgLnN1YnNjcmliZSgoeWVzKSA9PiB7XHJcbiAgICAgICAgaWYgKHllcykge1xyXG4gICAgICAgICAgY29uc3QgaXRlbXMgPSBbLi4udGhpcy5hcnRpc3RzLnZhbHVlXTtcclxuICAgICAgICAgIGl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICB0aGlzLmFydGlzdHMuc2V0VmFsdWUoaXRlbXMpO1xyXG4gICAgICAgICAgdGhpcy5hcnRpc3RzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgIHRoaXMuYXJ0aXN0cy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbW92ZUFydGlzdFVwKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChpbmRleCA8IDEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaXRlbSA9IHRoaXMuYXJ0aXN0cy52YWx1ZVtpbmRleF07XHJcbiAgICBjb25zdCBpdGVtcyA9IFsuLi50aGlzLmFydGlzdHMudmFsdWVdO1xyXG4gICAgaXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIGl0ZW1zLnNwbGljZShpbmRleCAtIDEsIDAsIGl0ZW0pO1xyXG4gICAgdGhpcy5hcnRpc3RzLnNldFZhbHVlKGl0ZW1zKTtcclxuICAgIHRoaXMuYXJ0aXN0cy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB0aGlzLmFydGlzdHMubWFya0FzRGlydHkoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBtb3ZlQXJ0aXN0RG93bihpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoaW5kZXggKyAxID49IHRoaXMuYXJ0aXN0cy52YWx1ZS5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaXRlbSA9IHRoaXMuYXJ0aXN0cy52YWx1ZVtpbmRleF07XHJcbiAgICBjb25zdCBpdGVtcyA9IFsuLi50aGlzLmFydGlzdHMudmFsdWVdO1xyXG4gICAgaXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIGl0ZW1zLnNwbGljZShpbmRleCArIDEsIDAsIGl0ZW0pO1xyXG4gICAgdGhpcy5hcnRpc3RzLnNldFZhbHVlKGl0ZW1zKTtcclxuICAgIHRoaXMuYXJ0aXN0cy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB0aGlzLmFydGlzdHMubWFya0FzRGlydHkoKTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIHB1YmxpYyBjYW5jZWwoKTogdm9pZCB7XHJcbiAgICB0aGlzLmVkaXRvckNsb3NlLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzYXZlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuZGVjb3JhdGlvbkNoYW5nZS5lbWl0KHRoaXMuZ2V0RGVjb3JhdGlvbigpKTtcclxuICB9XHJcbn1cclxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgKHN1Ym1pdCk9XCJzYXZlKClcIj5cclxuICA8bWF0LXRhYi1ncm91cCBbKHNlbGVjdGVkSW5kZXgpXT1cInRhYkluZGV4XCI+XHJcbiAgICA8IS0tIEdFTkVSQUwgLS0+XHJcbiAgICA8bWF0LXRhYiBsYWJlbD1cImdlbmVyYWxcIj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8IS0tIGlkIC0tPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+SUQ8L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiZWlkXCIgLz5cclxuICAgICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICAgKm5nSWY9XCIkYW55KGVpZCkuZXJyb3JzPy5yZXF1aXJlZCAmJiAoZWlkLmRpcnR5IHx8IGVpZC50b3VjaGVkKVwiXHJcbiAgICAgICAgICAgID5FSUQgcmVxdWlyZWQ8L21hdC1lcnJvclxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICAqbmdJZj1cIiRhbnkoZWlkKS5lcnJvcnM/Lm1heExlbmd0aCAmJiAoZWlkLmRpcnR5IHx8IGVpZC50b3VjaGVkKVwiXHJcbiAgICAgICAgICAgID5FSUQgdG9vIGxvbmc8L21hdC1lcnJvclxyXG4gICAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgJm5ic3A7XHJcbiAgICAgICAgPCEtLSBuYW1lIC0tPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+bmFtZTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJuYW1lXCIgLz5cclxuICAgICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICAgKm5nSWY9XCIkYW55KG5hbWUpLmVycm9ycz8ucmVxdWlyZWQgJiYgKG5hbWUuZGlydHkgfHwgbmFtZS50b3VjaGVkKVwiXHJcbiAgICAgICAgICAgID5uYW1lIHJlcXVpcmVkPC9tYXQtZXJyb3JcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICAgKm5nSWY9XCIkYW55KG5hbWUpLmVycm9ycz8ubWF4TGVuZ3RoICYmIChuYW1lLmRpcnR5IHx8IG5hbWUudG91Y2hlZClcIlxyXG4gICAgICAgICAgICA+bmFtZSB0b28gbG9uZzwvbWF0LWVycm9yXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIGZsYWdzIC0tPlxyXG4gICAgICA8ZmllbGRzZXQ+XHJcbiAgICAgICAgPGxlZ2VuZD5mZWF0dXJlczwvbGVnZW5kPlxyXG4gICAgICAgIDxjYWRtdXMtdWktZmxhZ3MtcGlja2VyXHJcbiAgICAgICAgICBbZmxhZ3NdPVwiYXZhaWxGbGFnc1wiXHJcbiAgICAgICAgICBbc2VsZWN0ZWRJZHNdPVwiaW5pdGlhbEZsYWdzXCJcclxuICAgICAgICAgIChzZWxlY3RlZElkc0NoYW5nZSk9XCJvblNlbGVjdGVkSWRzQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgID48L2NhZG11cy11aS1mbGFncy1waWNrZXI+XHJcbiAgICAgIDwvZmllbGRzZXQ+XHJcblxyXG4gICAgICA8IS0tIG5vdGUgLS0+XHJcbiAgICAgIDxiciAvPlxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJsb25nLXRleHRcIj5cclxuICAgICAgICA8bWF0LWxhYmVsPm5vdGU8L21hdC1sYWJlbD5cclxuICAgICAgICA8dGV4dGFyZWEgcm93cz1cIjNcIiBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwibm90ZVwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgKm5nSWY9XCIkYW55KG5vdGUpLmVycm9ycz8ubWF4TGVuZ3RoICYmIChub3RlLmRpcnR5IHx8IG5vdGUudG91Y2hlZClcIlxyXG4gICAgICAgICAgPm5vdGUgdG9vIGxvbmc8L21hdC1lcnJvclxyXG4gICAgICAgID5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgIDwhLS0gY2hyb25vdG9wZXMgLS0+XHJcbiAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGVcclxuICAgICAgICAgICAgPjxtYXQtaWNvbiBzdHlsZT1cIm1hcmdpbi1yaWdodDogOHB4OyBjb2xvcjogIzI0YTUyNFwiXHJcbiAgICAgICAgICAgICAgPmhvdXJnbGFzc19lbXB0eTwvbWF0LWljb25cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICBjaHJvbm90b3BlczwvbWF0LXBhbmVsLXRpdGxlXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICA8Y2FkbXVzLWFzc2VydGVkLWNocm9ub3RvcGUtc2V0XHJcbiAgICAgICAgICBbdGFnRW50cmllc109XCJjdFRhZ0VudHJpZXNcIlxyXG4gICAgICAgICAgW2Fzc1RhZ0VudHJpZXNdPVwiYXNzVGFnRW50cmllc1wiXHJcbiAgICAgICAgICBbcmVmVGFnRW50cmllc109XCJyZWZUYWdFbnRyaWVzXCJcclxuICAgICAgICAgIFtyZWZUeXBlRW50cmllc109XCJyZWZUeXBlRW50cmllc1wiXHJcbiAgICAgICAgICBbY2hyb25vdG9wZXNdPVwiaW5pdGlhbENocm9ub3RvcGVzXCJcclxuICAgICAgICAgIChjaHJvbm90b3Blc0NoYW5nZSk9XCJvbkNocm9ub3RvcGVzQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgID48L2NhZG11cy1hc3NlcnRlZC1jaHJvbm90b3BlLXNldD5cclxuICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG5cclxuICAgICAgPCEtLSByZWZlcmVuY2VzIC0tPlxyXG4gICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICA8bWF0LXBhbmVsLXRpdGxlXHJcbiAgICAgICAgICAgID48bWF0LWljb24gc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDhweDsgY29sb3I6ICNiYjNkNmNcIlxyXG4gICAgICAgICAgICAgID5saWJyYXJ5X2Jvb2tzPC9tYXQtaWNvblxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHJlZmVyZW5jZXM8L21hdC1wYW5lbC10aXRsZVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgPGNhZG11cy1yZWZzLWRvYy1yZWZlcmVuY2VzXHJcbiAgICAgICAgICBbdGFnRW50cmllc109XCJyZWZUYWdFbnRyaWVzXCJcclxuICAgICAgICAgIFt0eXBlRW50cmllc109XCJyZWZUeXBlRW50cmllc1wiXHJcbiAgICAgICAgICBbcmVmZXJlbmNlc109XCJpbml0aWFsUmVmZXJlbmNlc1wiXHJcbiAgICAgICAgICAocmVmZXJlbmNlc0NoYW5nZSk9XCJvblJlZmVyZW5jZXNDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgPjwvY2FkbXVzLXJlZnMtZG9jLXJlZmVyZW5jZXM+XHJcbiAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuXHJcbiAgICAgIDwhLS0gYXJ0aXN0cyAtLT5cclxuICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWw+XHJcbiAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgPG1hdC1wYW5lbC10aXRsZVxyXG4gICAgICAgICAgICA+PG1hdC1pY29uIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA4cHg7IGNvbG9yOiAjZGRjZDQxXCJcclxuICAgICAgICAgICAgICA+cGFsZXR0ZTwvbWF0LWljb25cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICBhcnRpc3RzPC9tYXQtcGFuZWwtdGl0bGVcclxuICAgICAgICAgID5cclxuICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBtYXQtZmxhdC1idXR0b25cclxuICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZEFydGlzdCgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPG1hdC1pY29uPmFkZF9jaXJjbGU8L21hdC1pY29uPiBhcnRpc3RcclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDx0YWJsZSAqbmdJZj1cImFydGlzdHM/LnZhbHVlPy5sZW5ndGhcIj5cclxuICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgIDx0aD48L3RoPlxyXG4gICAgICAgICAgICAgIDx0aD50eXBlPC90aD5cclxuICAgICAgICAgICAgICA8dGg+bmFtZTwvdGg+XHJcbiAgICAgICAgICAgICAgPHRoPkVJRDwvdGg+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICA8dHJcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJcclxuICAgICAgICAgICAgICAgIGxldCBhcnRpc3Qgb2YgYXJ0aXN0cz8udmFsdWU7XHJcbiAgICAgICAgICAgICAgICBsZXQgaSA9IGluZGV4O1xyXG4gICAgICAgICAgICAgICAgbGV0IGZpcnN0ID0gZmlyc3Q7XHJcbiAgICAgICAgICAgICAgICBsZXQgbGFzdCA9IGxhc3RcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJFZGl0IHRoaXMgYXJ0aXN0XCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRBcnRpc3QoYXJ0aXN0LCBpKVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5lZGl0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJNb3ZlIHRoaXMgYXJ0aXN0IHVwXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpcnN0XCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVBcnRpc3RVcChpKVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5hcnJvd191cHdhcmQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIk1vdmUgdGhpcyBhcnRpc3QgZG93blwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJsYXN0XCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVBcnRpc3REb3duKGkpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmFycm93X2Rvd253YXJkPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgIGNvbG9yPVwid2FyblwiXHJcbiAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJEZWxldGUgdGhpcyBhcnRpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlQXJ0aXN0KGkpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnJlbW92ZV9jaXJjbGU8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICB7eyBhcnRpc3QudHlwZSB8IGZsYXRMb29rdXA6IGFydFR5cGVFbnRyaWVzOlwiaWRcIjpcInZhbHVlXCIgfX1cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZD57eyBhcnRpc3QubmFtZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPnt7IGFydGlzdC5laWQgfX08L3RkPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsXHJcbiAgICAgICAgICBbZXhwYW5kZWRdPVwiZWRpdGVkQXJ0aXN0XCJcclxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdGVkQXJ0aXN0XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGU+YXJ0aXN0IHt7IGVkaXRlZEFydGlzdD8ubmFtZSB9fTwvbWF0LXBhbmVsLXRpdGxlPlxyXG4gICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICAgIDxjYWRtdXMtY29kLWRlY29yYXRpb24tYXJ0aXN0XHJcbiAgICAgICAgICAgIFtjdFRhZ0VudHJpZXNdPVwiY3RUYWdFbnRyaWVzXCJcclxuICAgICAgICAgICAgW2Fzc1RhZ0VudHJpZXNdPVwiYXNzVGFnRW50cmllc1wiXHJcbiAgICAgICAgICAgIFtyZWZUYWdFbnRyaWVzXT1cInJlZlRhZ0VudHJpZXNcIlxyXG4gICAgICAgICAgICBbYXJ0VHlwZUVudHJpZXNdPVwiYXJ0VHlwZUVudHJpZXNcIlxyXG4gICAgICAgICAgICBbcmVmVHlwZUVudHJpZXNdPVwicmVmVHlwZUVudHJpZXNcIlxyXG4gICAgICAgICAgICBbYXJ0U3R5bGVFbnRyaWVzXT1cImFydFN0eWxlRW50cmllc1wiXHJcbiAgICAgICAgICAgIFtpZFRhZ0VudHJpZXNdPVwiaWRUYWdFbnRyaWVzXCJcclxuICAgICAgICAgICAgW2lkU2NvcGVFbnRyaWVzXT1cImlkU2NvcGVFbnRyaWVzXCJcclxuICAgICAgICAgICAgW2FydGlzdF09XCJlZGl0ZWRBcnRpc3RcIlxyXG4gICAgICAgICAgICAoYXJ0aXN0Q2hhbmdlKT1cIm9uQXJ0aXN0U2F2ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGVkaXRvckNsb3NlKT1cImVkaXRBcnRpc3QobnVsbClcIlxyXG4gICAgICAgICAgPjwvY2FkbXVzLWNvZC1kZWNvcmF0aW9uLWFydGlzdD5cclxuICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XHJcbiAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuXHJcbiAgICAgIDwhLS0gZWxlbWVudHMgLS0+XHJcbiAgICAgIDxoMz5lbGVtZW50czwvaDM+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBtYXQtZmxhdC1idXR0b25cclxuICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiYWRkRWxlbWVudCgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWljb24+YWRkX2NpcmNsZTwvbWF0LWljb24+IGVsZW1lbnRcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDx0YWJsZSAqbmdJZj1cImVsZW1lbnRzPy52YWx1ZT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICA8dGg+PC90aD5cclxuICAgICAgICAgICAgPHRoPmtleTwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5wYXJlbnQ8L3RoPlxyXG4gICAgICAgICAgICA8dGg+dHlwZTwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5zdWJqZWN0PC90aD5cclxuICAgICAgICAgICAgPHRoPmV4dGVudDwvdGg+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgPHRyXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cIlxyXG4gICAgICAgICAgICAgIGxldCBlbGVtZW50IG9mIGVsZW1lbnRzPy52YWx1ZTtcclxuICAgICAgICAgICAgICBsZXQgaSA9IGluZGV4O1xyXG4gICAgICAgICAgICAgIGxldCBmaXJzdCA9IGZpcnN0O1xyXG4gICAgICAgICAgICAgIGxldCBsYXN0ID0gbGFzdFxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiRWRpdCB0aGlzIGVsZW1lbnRcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRFbGVtZW50KGVsZW1lbnQsIGkpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+ZWRpdDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJNb3ZlIHRoaXMgZWxlbWVudCB1cFwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmlyc3RcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVFbGVtZW50VXAoaSlcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5hcnJvd191cHdhcmQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiTW92ZSB0aGlzIGVsZW1lbnQgZG93blwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibGFzdFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUVsZW1lbnREb3duKGkpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+YXJyb3dfZG93bndhcmQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cIndhcm5cIlxyXG4gICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkRlbGV0ZSB0aGlzIGVsZW1lbnRcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUVsZW1lbnQoaSlcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5yZW1vdmVfY2lyY2xlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IGVsZW1lbnQua2V5IH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IGVsZW1lbnQucGFyZW50S2V5IH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIHt7IGVsZW1lbnQudHlwZSB8IGZsYXRMb29rdXA6IGRlY0VsZW1UeXBlRW50cmllczpcImlkXCI6XCJ2YWx1ZVwiIH19XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyBlbGVtZW50LnN1YmplY3QgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgZWxlbWVudC5yYW5nZXMgfCBjb2RMb2NhdGlvblJhbmdlIH19PC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90Ym9keT5cclxuICAgICAgPC90YWJsZT5cclxuICAgIDwvbWF0LXRhYj5cclxuXHJcbiAgICA8IS0tIEVMRU1FTlQgLS0+XHJcbiAgICA8bWF0LXRhYiBsYWJlbD1cImVsZW1lbnRcIiAqbmdJZj1cImVkaXRlZEVsZW1lbnRcIj5cclxuICAgICAgPGNhZG11cy1jb2QtZGVjb3JhdGlvbi1lbGVtZW50XHJcbiAgICAgICAgW2ltZ1R5cGVFbnRyaWVzXT1cImltZ1R5cGVFbnRyaWVzXCJcclxuICAgICAgICBbZGVjRWxlbVBvc0VudHJpZXNdPVwiZGVjRWxlbVBvc0VudHJpZXNcIlxyXG4gICAgICAgIFtkZWNFbGVtRmxhZ0VudHJpZXNdPVwiZGVjRWxlbUZsYWdFbnRyaWVzXCJcclxuICAgICAgICBbZGVjRWxlbVRlY2hFbnRyaWVzXT1cImRlY0VsZW1UZWNoRW50cmllc1wiXHJcbiAgICAgICAgW2RlY0VsZW1Ub29sRW50cmllc109XCJkZWNFbGVtVG9vbEVudHJpZXNcIlxyXG4gICAgICAgIFtkZWNFbGVtVHlwZUVudHJpZXNdPVwiZGVjRWxlbVR5cGVFbnRyaWVzXCJcclxuICAgICAgICBbZGVjRWxlbUNvbG9yRW50cmllc109XCJkZWNFbGVtQ29sb3JFbnRyaWVzXCJcclxuICAgICAgICBbZGVjRWxlbVR5cG9sRW50cmllc109XCJkZWNFbGVtVHlwb2xFbnRyaWVzXCJcclxuICAgICAgICBbZGVjVHlwZUhpZGRlbkVudHJpZXNdPVwiZGVjVHlwZUhpZGRlbkVudHJpZXNcIlxyXG4gICAgICAgIFtkZWNFbGVtR2lsZGluZ0VudHJpZXNdPVwiZGVjRWxlbUdpbGRpbmdFbnRyaWVzXCJcclxuICAgICAgICBbZWxlbWVudF09XCJlZGl0ZWRFbGVtZW50XCJcclxuICAgICAgICBbcGFyZW50S2V5c109XCJwYXJlbnRLZXlzXCJcclxuICAgICAgICAoZWxlbWVudENoYW5nZSk9XCJvbkVsZW1lbnRTYXZlKCRldmVudClcIlxyXG4gICAgICAgIChlZGl0b3JDbG9zZSk9XCJlZGl0RWxlbWVudChudWxsKVwiXHJcbiAgICAgID48L2NhZG11cy1jb2QtZGVjb3JhdGlvbi1lbGVtZW50PlxyXG4gICAgPC9tYXQtdGFiPlxyXG4gIDwvbWF0LXRhYi1ncm91cD5cclxuXHJcbiAgPCEtLSBidXR0b25zIC0tPlxyXG4gIDxociAvPlxyXG4gIDxkaXYgY2xhc3M9XCJ0b29sYmFyLXJvd1wiPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgY29sb3I9XCJ3YXJuXCJcclxuICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgIG1hdFRvb2x0aXA9XCJEaXNjYXJkIGRlY29yYXRpb24gY2hhbmdlc1wiXHJcbiAgICAgIChjbGljayk9XCJjYW5jZWwoKVwiXHJcbiAgICA+XHJcbiAgICAgIDxtYXQtaWNvbj5jbGVhcjwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b25cclxuICAgICAgdHlwZT1cInN1Ym1pdFwiXHJcbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgIG1hdC1mbGF0LWJ1dHRvblxyXG4gICAgICBtYXRUb29sdGlwPVwiQWNjZXB0IGRlY29yYXRpb24gY2hhbmdlc1wiXHJcbiAgICAgIFtkaXNhYmxlZF09XCJmb3JtLmludmFsaWQgfHwgZm9ybS5wcmlzdGluZVwiXHJcbiAgICA+XHJcbiAgICAgIDxtYXQtaWNvbj5jaGVja19jaXJjbGU8L21hdC1pY29uPiBkZWNvcmF0aW9uXHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9mb3JtPlxyXG4iXX0=
380
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kLWRlY29yYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vY2FkbXVzLXBhcnQtY29kaWNvbG9neS1kZWNvcmF0aW9ucy9zcmMvbGliL2NvZC1kZWNvcmF0aW9uL2NvZC1kZWNvcmF0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2NhZG11cy1wYXJ0LWNvZGljb2xvZ3ktZGVjb3JhdGlvbnMvc3JjL2xpYi9jb2QtZGVjb3JhdGlvbi9jb2QtZGVjb3JhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFJTCxVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFjNUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Qkc7QUFNSCxNQUFNLE9BQU8sc0JBQXNCO0lBNEhqQyxZQUFZLFdBQXdCLEVBQVUsY0FBNkI7UUFBN0IsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFScEUsa0JBQWEsR0FBRztZQUNyQixLQUFLLEVBQUUsVUFBVTtZQUNqQixRQUFRLEVBQUUsVUFBVTtZQUNwQixRQUFRLEVBQUUsSUFBSTtZQUNkLDBEQUEwRDtZQUMxRCxlQUFlLEVBQUUsSUFBSTtTQUN0QixDQUFDO1FBR0EsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsZ0JB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QUlDLFlBQVk7c0JBRGxCLEtBQUs7Z0JBSUMsYUFBYTtzQkFEbkIsS0FBSztnQkFJQyxjQUFjO3NCQURwQixLQUFLO2dCQUlDLGFBQWE7c0JBRG5CLEtBQUs7Z0JBSUMsWUFBWTtzQkFEbEIsS0FBSztnQkFJQyxjQUFjO3NCQURwQixLQUFLO2dCQUlDLGdCQUFnQjtzQkFEdEIsTUFBTTtnQkFHQSxXQUFXO3NCQURqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEZvcm1CdWlsZGVyLFxyXG4gIEZvcm1Db250cm9sLFxyXG4gIEZvcm1Hcm91cCxcclxuICBWYWxpZGF0b3JzLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgVGhlc2F1cnVzRW50cnkgfSBmcm9tICdAbXlybWlkb24vY2FkbXVzLWNvcmUnO1xyXG5pbXBvcnQgeyBBc3NlcnRlZENocm9ub3RvcGUgfSBmcm9tICdAbXlybWlkb24vY2FkbXVzLXJlZnMtYXNzZXJ0ZWQtY2hyb25vdG9wZSc7XHJcbmltcG9ydCB7IERvY1JlZmVyZW5jZSB9IGZyb20gJ0BteXJtaWRvbi9jYWRtdXMtcmVmcy1kb2MtcmVmZXJlbmNlcyc7XHJcbmltcG9ydCB7IEZsYWcgfSBmcm9tICdAbXlybWlkb24vY2FkbXVzLXVpLWZsYWdzLXBpY2tlcic7XHJcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICdAbXlybWlkb24vbmctbWF0LXRvb2xzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgQ29kRGVjb3JhdGlvbixcclxuICBDb2REZWNvcmF0aW9uQXJ0aXN0LFxyXG4gIENvZERlY29yYXRpb25FbGVtZW50LFxyXG59IGZyb20gJy4uL2NvZC1kZWNvcmF0aW9ucy1wYXJ0JztcclxuXHJcbi8qKlxyXG4gKiBNYW51c2NyaXB0J3MgZGVjb3JhdGlvbiBlZGl0b3IuXHJcbiAqIFRoaXMgY29tcG9uZW50IHJlcXVpcmVzIHRoZSBjb2QtZGVjb3JhdGlvbi1lbGVtZW50LXR5cGVzIHRoZXNhdXJ1cy5cclxuICogQWNjb3JkaW5nIHRvIHRoZSB0eXBlIHNlbGVjdGVkLCBpdCBjaGFuZ2VzIGl0cyBVSSBieTpcclxuICogLSBmaWx0ZXJpbmcgdGhlIGNvbnRlbnQgb2YgYWxsIHRoZSBvdGhlciB0aGVzYXVyaSAoZXhjZXB0XHJcbiAqIGNvZC1kZWNvcmF0aW9uLXR5cGUtaGlkZGVuLCB3aGljaCBoYXMgYSBzcGVjaWFsIG1lYW5pbmcpLFxyXG4gKiB3aGVuIHRoZXkgaGF2ZSBhIGhpZXJhcmNoeSAoaS5lLiB0aGVpciBJRHMgY29udGFpbiBhIGRvdCkuXHJcbiAqIFN1Y2ggdHlwZS1kZXBlbmRlbnQgdGhlc2F1cmkgaGF2ZSB0aGVpciBlbnRyaWVzIElEcyBwcmVmaXhlZFxyXG4gKiB3aXRoIHRoZSB0eXBlIElEIGZvbGxvd2VkIGJ5IGRvdC4gRm9yIGluc3RhbmNlLCB0eXBlIFwiaWxsXCJcclxuICogaGFzIHNvbWUgY29ycmVzcG9uZGluZyBlbnRyaWVzIGluIGEgdHlwZS1kZXBlbmRlbnQgdGhlc2F1cnVzXHJcbiAqIGxpa2UgY29kLWRlY29yYXRpb24tZWxlbWVudC10eXBlcywgbGlrZSBcImlsbC5taW5pYXR1cmVcIixcclxuICogXCJpbGwuZHJhd2luZ1wiLCBldGMuXHJcbiAqIEFsc28sIGlmIHRoZSBmaWx0ZXJlZCBjb250ZW50IG9mIGEgdGhlc2F1cnVzIGhhcHBlbnMgdG8gaGF2ZVxyXG4gKiBhbiBlbnRyeSBJRCBlcXVhbCB0byBcIi1cIiBvbmNlIHRoZSB0eXBlIHByZWZpeCBoYXMgYmVlbiBzdHJpcHBlZFxyXG4gKiBvdXQsIHRoaXMgbWVhbnMgdGhhdCBpbiB0aGlzIGNhc2UgdGhlIGNvcnJlc3BvbmRpbmcgY29udHJvbFxyXG4gKiBzaG91bGQgYmUgYSBmcmVlIHRleHQgYm94IHJhdGhlciB0aGFuIGEgc2VsZWN0b3IuXHJcbiAqIFRoaXMgYW55d2F5IGRvZXMgbm90IGFwcGx5IHRvIHRob3NlIGNvbnRyb2xzIGFsbG93aW5nIG11bHRpcGxlXHJcbiAqIHNlbGVjdGlvbnMsIGxpa2UgZmxhZ3Mgb3IgY29sb3JzLlxyXG4gKiAtIGhpZGluZyBzb21lIGNvbnRyb2xzLiBXaGVuIGEgdHlwZSBpcyBzZWxlY3RlZCwgdGhlIHRoZXNhdXJ1c1xyXG4gKiBjb2QtZGVjb3JhdGlvbi10eXBlLWhpZGRlbiBpcyBsb29rZWQgdXAgdG8gZmluZCBhbiBlbnRyeVxyXG4gKiB3aXRoIElEIGVxdWFsIHRvIHRoZSBzZWxlY3RlZCB0eXBlIElELiBJZiBmb3VuZCwgaXQgaXMgYXNzdW1lZFxyXG4gKiB0aGF0IGl0cyB2YWx1ZSBpcyBhIHNwYWNlLWRlbGltaXRlZCBsaXN0IG9mIG5hbWVzIG9mIHRob3NlXHJcbiAqIGNvbnRyb2xzIHdoaWNoIHNob3VsZCBiZSBoaWRkZW4uXHJcbiAqIFRoaXMgbG9naWMgaXMgZWZmZWN0aXZlbHkgaW1wbGVtZW50ZWQgYnlcclxuICogQ29kRGVjb3JhdGlvbkVsZW1lbnRDb21wb25lbnQuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2NhZG11cy1jb2QtZGVjb3JhdGlvbicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NvZC1kZWNvcmF0aW9uLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jb2QtZGVjb3JhdGlvbi5jb21wb25lbnQuY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb2REZWNvcmF0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBwcml2YXRlIF9kZWNvcmF0aW9uOiBDb2REZWNvcmF0aW9uIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX2RlY0ZsYWdFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgZGVjb3JhdGlvbigpOiBDb2REZWNvcmF0aW9uIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9kZWNvcmF0aW9uO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGRlY29yYXRpb24odmFsdWU6IENvZERlY29yYXRpb24gfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICh0aGlzLl9kZWNvcmF0aW9uID09PSB2YWx1ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9kZWNvcmF0aW9uID0gdmFsdWU7XHJcbiAgICB0aGlzLnVwZGF0ZUZvcm0odmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLy8gY29kLWRlY29yYXRpb24tZWxlbWVudC1mbGFnc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGRlY0VsZW1GbGFnRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLy8gY29kLWRlY29yYXRpb24tZmxhZ3NcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgZGVjRmxhZ0VudHJpZXMoKTogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGVjRmxhZ0VudHJpZXM7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgZGVjRmxhZ0VudHJpZXModmFsdWU6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2RlY0ZsYWdFbnRyaWVzID0gdmFsdWU7XHJcbiAgICB0aGlzLmF2YWlsRmxhZ3MgPSB2YWx1ZT8ubGVuZ3RoXHJcbiAgICAgID8gdmFsdWUubWFwKChlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBpZDogZS5pZCxcclxuICAgICAgICAgICAgbGFiZWw6IGUudmFsdWUsXHJcbiAgICAgICAgICB9IGFzIEZsYWc7XHJcbiAgICAgICAgfSlcclxuICAgICAgOiBbXTtcclxuICB9XHJcblxyXG4gIC8vIGNvZC1kZWNvcmF0aW9uLWVsZW1lbnQtdHlwZXMgKHJlcXVpcmVkKVxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGRlY0VsZW1UeXBlRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICAvLyBjb2QtZGVjb3JhdGlvbi10eXBlLWhpZGRlblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGRlY1R5cGVIaWRkZW5FbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGNvZC1kZWNvcmF0aW9uLWVsZW1lbnQtY29sb3JzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZGVjRWxlbUNvbG9yRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICAvLyBjb2QtZGVjb3JhdGlvbi1lbGVtZW50LWdpbGRpbmdzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZGVjRWxlbUdpbGRpbmdFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGNvZC1kZWNvcmF0aW9uLWVsZW1lbnQtdGVjaG5pcXVlc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGRlY0VsZW1UZWNoRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICAvLyBjb2QtZGVjb3JhdGlvbi1lbGVtZW50LXBvc2l0aW9uc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGRlY0VsZW1Qb3NFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGNvZC1kZWNvcmF0aW9uLWVsZW1lbnQtdG9vbHNcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBkZWNFbGVtVG9vbEVudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gY29kLWRlY29yYXRpb24tZWxlbWVudC10eXBvbG9naWVzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZGVjRWxlbVR5cG9sRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICAvLyBjb2QtaW1hZ2UtdHlwZXNcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBpbWdUeXBlRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICAvLyBjb2QtZGVjb3JhdGlvbi1hcnRpc3QtdHlwZXNcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBhcnRUeXBlRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICAvLyBjb2QtZGVjb3JhdGlvbi1hcnRpc3Qtc3R5bGUtbmFtZXNcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBhcnRTdHlsZUVudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gY2hyb25vdG9wZS10YWdzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgY3RUYWdFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGFzc2VydGlvbi10YWdzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgYXNzVGFnRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICAvLyBkb2MtcmVmZXJlbmNlLXR5cGVzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgcmVmVHlwZUVudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gZG9jLXJlZmVyZW5jZS10YWdzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgcmVmVGFnRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICAvLyBleHRlcm5hbC1pZC10YWdzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgaWRUYWdFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGV4dGVybmFsLWlkLXNjb3Blc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGlkU2NvcGVFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgZGVjb3JhdGlvbkNoYW5nZTogRXZlbnRFbWl0dGVyPENvZERlY29yYXRpb24+O1xyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBlZGl0b3JDbG9zZTogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gIHB1YmxpYyBlaWQ6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIHB1YmxpYyBuYW1lOiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuICBwdWJsaWMgZmxhZ3M6IEZvcm1Db250cm9sPHN0cmluZ1tdPjtcclxuICBwdWJsaWMgY2hyb25vdG9wZXM6IEZvcm1Db250cm9sPEFzc2VydGVkQ2hyb25vdG9wZVtdPjtcclxuICBwdWJsaWMgYXJ0aXN0czogRm9ybUNvbnRyb2w8Q29kRGVjb3JhdGlvbkFydGlzdFtdPjtcclxuICBwdWJsaWMgbm90ZTogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgcHVibGljIHJlZmVyZW5jZXM6IEZvcm1Db250cm9sPERvY1JlZmVyZW5jZVtdPjtcclxuICBwdWJsaWMgZWxlbWVudHM6IEZvcm1Db250cm9sPENvZERlY29yYXRpb25FbGVtZW50W10+O1xyXG4gIHB1YmxpYyBmb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gIHB1YmxpYyBpbml0aWFsQ2hyb25vdG9wZXM6IEFzc2VydGVkQ2hyb25vdG9wZVtdO1xyXG4gIHB1YmxpYyBpbml0aWFsUmVmZXJlbmNlczogRG9jUmVmZXJlbmNlW107XHJcbiAgcHVibGljIGluaXRpYWxGbGFnczogc3RyaW5nW107XHJcbiAgcHVibGljIGF2YWlsRmxhZ3M6IEZsYWdbXTtcclxuXHJcbiAgcHVibGljIGVkaXRlZEVsZW1lbnRJbmRleDogbnVtYmVyO1xyXG4gIHB1YmxpYyBlZGl0ZWRFbGVtZW50OiBDb2REZWNvcmF0aW9uRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgcGFyZW50S2V5czogc3RyaW5nW107XHJcblxyXG4gIHB1YmxpYyBlZGl0ZWRBcnRpc3RJbmRleDogbnVtYmVyO1xyXG4gIHB1YmxpYyBlZGl0ZWRBcnRpc3Q/OiBDb2REZWNvcmF0aW9uQXJ0aXN0O1xyXG5cclxuICBwdWJsaWMgZWRpdG9yT3B0aW9ucyA9IHtcclxuICAgIHRoZW1lOiAndnMtbGlnaHQnLFxyXG4gICAgbGFuZ3VhZ2U6ICdtYXJrZG93bicsXHJcbiAgICB3b3JkV3JhcDogJ29uJyxcclxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hdHVsYXJlbi9uZ3gtbW9uYWNvLWVkaXRvci9pc3N1ZXMvMTlcclxuICAgIGF1dG9tYXRpY0xheW91dDogdHJ1ZSxcclxuICB9O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsIHByaXZhdGUgX2RpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UpIHtcclxuICAgIHRoaXMuZWRpdGVkRWxlbWVudEluZGV4ID0gLTE7XHJcbiAgICB0aGlzLnBhcmVudEtleXMgPSBbXTtcclxuICAgIHRoaXMuZWRpdGVkQXJ0aXN0SW5kZXggPSAtMTtcclxuICAgIHRoaXMuZGVjb3JhdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q29kRGVjb3JhdGlvbj4oKTtcclxuICAgIHRoaXMuZWRpdG9yQ2xvc2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIHRoaXMuaW5pdGlhbENocm9ub3RvcGVzID0gW107XHJcbiAgICB0aGlzLmluaXRpYWxSZWZlcmVuY2VzID0gW107XHJcbiAgICB0aGlzLmluaXRpYWxGbGFncyA9IFtdO1xyXG4gICAgdGhpcy5hdmFpbEZsYWdzID0gW107XHJcbiAgICAvLyBmb3JtXHJcbiAgICB0aGlzLmVpZCA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTAwKSk7XHJcbiAgICB0aGlzLm5hbWUgPSBmb3JtQnVpbGRlci5jb250cm9sKG51bGwsIFtcclxuICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNTApLFxyXG4gICAgXSk7XHJcbiAgICB0aGlzLmZsYWdzID0gZm9ybUJ1aWxkZXIuY29udHJvbChbXSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuY2hyb25vdG9wZXMgPSBmb3JtQnVpbGRlci5jb250cm9sKFtdLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xyXG4gICAgdGhpcy5hcnRpc3RzID0gZm9ybUJ1aWxkZXIuY29udHJvbChbXSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMubm90ZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTAwMCkpO1xyXG4gICAgdGhpcy5yZWZlcmVuY2VzID0gZm9ybUJ1aWxkZXIuY29udHJvbChbXSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuZWxlbWVudHMgPSBmb3JtQnVpbGRlci5jb250cm9sKFtdLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xyXG4gICAgdGhpcy5mb3JtID0gZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICBlaWQ6IHRoaXMuZWlkLFxyXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLFxyXG4gICAgICBjaHJvbm90b3BlczogdGhpcy5jaHJvbm90b3BlcyxcclxuICAgICAgYXJ0aXN0czogdGhpcy5hcnRpc3RzLFxyXG4gICAgICBub3RlOiB0aGlzLm5vdGUsXHJcbiAgICAgIHJlZmVyZW5jZXM6IHRoaXMucmVmZXJlbmNlcyxcclxuICAgICAgZWxlbWVudHM6IHRoaXMuZWxlbWVudHMsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2RlY29yYXRpb24pIHtcclxuICAgICAgdGhpcy51cGRhdGVGb3JtKHRoaXMuX2RlY29yYXRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVGb3JtKGRlY29yYXRpb246IENvZERlY29yYXRpb24gfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgIGlmICghZGVjb3JhdGlvbikge1xyXG4gICAgICB0aGlzLmluaXRpYWxDaHJvbm90b3BlcyA9IFtdO1xyXG4gICAgICB0aGlzLmluaXRpYWxSZWZlcmVuY2VzID0gW107XHJcbiAgICAgIHRoaXMuaW5pdGlhbEZsYWdzID0gW107XHJcbiAgICAgIHRoaXMuZm9ybS5yZXNldCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbml0aWFsQ2hyb25vdG9wZXMgPSBkZWNvcmF0aW9uLmNocm9ub3RvcGVzIHx8IFtdO1xyXG4gICAgdGhpcy5pbml0aWFsUmVmZXJlbmNlcyA9IGRlY29yYXRpb24ucmVmZXJlbmNlcyB8fCBbXTtcclxuICAgIHRoaXMuaW5pdGlhbEZsYWdzID0gZGVjb3JhdGlvbi5mbGFncyB8fCBbXTtcclxuXHJcbiAgICB0aGlzLmVpZC5zZXRWYWx1ZShkZWNvcmF0aW9uLmVpZCB8fCBudWxsKTtcclxuICAgIHRoaXMubmFtZS5zZXRWYWx1ZShkZWNvcmF0aW9uLm5hbWUpO1xyXG4gICAgdGhpcy5ub3RlLnNldFZhbHVlKGRlY29yYXRpb24ubm90ZSB8fCBudWxsKTtcclxuICAgIHRoaXMuYXJ0aXN0cy5zZXRWYWx1ZShkZWNvcmF0aW9uLmFydGlzdHMgfHwgW10pO1xyXG4gICAgdGhpcy5lbGVtZW50cy5zZXRWYWx1ZShkZWNvcmF0aW9uLmVsZW1lbnRzIHx8IFtdKTtcclxuICAgIHRoaXMudXBkYXRlUGFyZW50S2V5cygpO1xyXG5cclxuICAgIHRoaXMuZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2hyb25vdG9wZXNDaGFuZ2UoY2hyb25vdG9wZXM6IEFzc2VydGVkQ2hyb25vdG9wZVtdKTogdm9pZCB7XHJcbiAgICB0aGlzLmNocm9ub3RvcGVzLnNldFZhbHVlKGNocm9ub3RvcGVzKTtcclxuICAgIHRoaXMuY2hyb25vdG9wZXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5jaHJvbm90b3Blcy5tYXJrQXNEaXJ0eSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uUmVmZXJlbmNlc0NoYW5nZShyZWZlcmVuY2VzOiBEb2NSZWZlcmVuY2VbXSk6IHZvaWQge1xyXG4gICAgdGhpcy5yZWZlcmVuY2VzLnNldFZhbHVlKHJlZmVyZW5jZXMpO1xyXG4gICAgdGhpcy5yZWZlcmVuY2VzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMucmVmZXJlbmNlcy5tYXJrQXNEaXJ0eSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uU2VsZWN0ZWRJZHNDaGFuZ2UoaWRzOiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgdGhpcy5mbGFncy5zZXRWYWx1ZShpZHMpO1xyXG4gICAgdGhpcy5mbGFncy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB0aGlzLmZsYWdzLm1hcmtBc0RpcnR5KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldERlY29yYXRpb24oKTogQ29kRGVjb3JhdGlvbiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBlaWQ6IHRoaXMuZWlkLnZhbHVlPy50cmltKCksXHJcbiAgICAgIG5hbWU6IHRoaXMubmFtZS52YWx1ZT8udHJpbSgpIHx8ICcnLFxyXG4gICAgICBmbGFnczogdGhpcy5mbGFncy52YWx1ZT8ubGVuZ3RoID8gdGhpcy5mbGFncy52YWx1ZSA6IHVuZGVmaW5lZCxcclxuICAgICAgY2hyb25vdG9wZXM6IHRoaXMuY2hyb25vdG9wZXMudmFsdWU/Lmxlbmd0aFxyXG4gICAgICAgID8gdGhpcy5jaHJvbm90b3Blcy52YWx1ZVxyXG4gICAgICAgIDogdW5kZWZpbmVkLFxyXG4gICAgICByZWZlcmVuY2VzOiB0aGlzLnJlZmVyZW5jZXMudmFsdWU/Lmxlbmd0aFxyXG4gICAgICAgID8gdGhpcy5yZWZlcmVuY2VzLnZhbHVlXHJcbiAgICAgICAgOiB1bmRlZmluZWQsXHJcbiAgICAgIGFydGlzdHM6IHRoaXMuYXJ0aXN0cy52YWx1ZT8ubGVuZ3RoID8gdGhpcy5hcnRpc3RzLnZhbHVlIDogdW5kZWZpbmVkLFxyXG4gICAgICBub3RlOiB0aGlzLm5vdGUudmFsdWU/LnRyaW0oKSxcclxuICAgICAgZWxlbWVudHM6IHRoaXMuZWxlbWVudHMudmFsdWU/Lmxlbmd0aCA/IHRoaXMuZWxlbWVudHMudmFsdWUgOiB1bmRlZmluZWQsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIGVsZW1lbnRzXHJcbiAgcHVibGljIGFkZEVsZW1lbnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmVkaXRFbGVtZW50KHtcclxuICAgICAgdHlwZTogdGhpcy5kZWNFbGVtVHlwZUVudHJpZXM/Lmxlbmd0aFxyXG4gICAgICAgID8gdGhpcy5kZWNFbGVtVHlwZUVudHJpZXNbMF0uaWRcclxuICAgICAgICA6ICcnLFxyXG4gICAgICBmbGFnczogW10sXHJcbiAgICAgIHJhbmdlczogW10sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlZGl0RWxlbWVudChlbGVtZW50OiBDb2REZWNvcmF0aW9uRWxlbWVudCB8IG51bGwsIGluZGV4ID0gLTEpOiB2b2lkIHtcclxuICAgIGlmICghZWxlbWVudCkge1xyXG4gICAgICB0aGlzLmVkaXRlZEVsZW1lbnRJbmRleCA9IC0xO1xyXG4gICAgICB0aGlzLmVkaXRlZEVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVkaXRlZEVsZW1lbnRJbmRleCA9IGluZGV4O1xyXG4gICAgICB0aGlzLmVkaXRlZEVsZW1lbnQgPSBlbGVtZW50O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVQYXJlbnRLZXlzKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLnZhbHVlPy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5wYXJlbnRLZXlzID0gW107XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCBrZXlzOiBzdHJpbmdbXSA9IHRoaXMuZWxlbWVudHMudmFsdWUubWFwKFxyXG4gICAgICAoZTogQ29kRGVjb3JhdGlvbkVsZW1lbnQpID0+IGUua2V5IVxyXG4gICAgKTtcclxuICAgIHRoaXMucGFyZW50S2V5cyA9IFsuLi5uZXcgU2V0KGtleXMpXS5zb3J0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25FbGVtZW50U2F2ZShlbGVtZW50OiBDb2REZWNvcmF0aW9uRWxlbWVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWxlbWVudHMgPSBbLi4udGhpcy5lbGVtZW50cy52YWx1ZV07XHJcblxyXG4gICAgaWYgKHRoaXMuZWRpdGVkRWxlbWVudEluZGV4ID4gLTEpIHtcclxuICAgICAgZWxlbWVudHMuc3BsaWNlKHRoaXMuZWRpdGVkRWxlbWVudEluZGV4LCAxLCBlbGVtZW50KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGVsZW1lbnRzLnB1c2goZWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy5zZXRWYWx1ZShlbGVtZW50cyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuZWxlbWVudHMubWFya0FzRGlydHkoKTtcclxuICAgIHRoaXMuZWRpdEVsZW1lbnQobnVsbCk7XHJcbiAgICB0aGlzLnVwZGF0ZVBhcmVudEtleXMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVFbGVtZW50KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2RpYWxvZ1NlcnZpY2VcclxuICAgICAgLmNvbmZpcm0oJ0NvbmZpcm1hdGlvbicsICdEZWxldGUgZWxlbWVudD8nKVxyXG4gICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAuc3Vic2NyaWJlKCh5ZXM6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICBpZiAoeWVzKSB7XHJcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IFsuLi50aGlzLmVsZW1lbnRzLnZhbHVlXTtcclxuICAgICAgICAgIGl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICB0aGlzLmVsZW1lbnRzLnNldFZhbHVlKGl0ZW1zKTtcclxuICAgICAgICAgIHRoaXMuZWxlbWVudHMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgdGhpcy5lbGVtZW50cy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVQYXJlbnRLZXlzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBtb3ZlRWxlbWVudFVwKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChpbmRleCA8IDEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaXRlbSA9IHRoaXMuZWxlbWVudHMudmFsdWVbaW5kZXhdO1xyXG4gICAgY29uc3QgaXRlbXMgPSBbLi4udGhpcy5lbGVtZW50cy52YWx1ZV07XHJcbiAgICBpdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgaXRlbXMuc3BsaWNlKGluZGV4IC0gMSwgMCwgaXRlbSk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnNldFZhbHVlKGl0ZW1zKTtcclxuICAgIHRoaXMuZWxlbWVudHMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5lbGVtZW50cy5tYXJrQXNEaXJ0eSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG1vdmVFbGVtZW50RG93bihpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoaW5kZXggKyAxID49IHRoaXMuZWxlbWVudHMudmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmVsZW1lbnRzLnZhbHVlW2luZGV4XTtcclxuICAgIGNvbnN0IGl0ZW1zID0gWy4uLnRoaXMuZWxlbWVudHMudmFsdWVdO1xyXG4gICAgaXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIGl0ZW1zLnNwbGljZShpbmRleCArIDEsIDAsIGl0ZW0pO1xyXG4gICAgdGhpcy5lbGVtZW50cy5zZXRWYWx1ZShpdGVtcyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuZWxlbWVudHMubWFya0FzRGlydHkoKTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBhcnRpc3RzXHJcbiAgcHVibGljIGFkZEFydGlzdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZWRpdEFydGlzdCh7XHJcbiAgICAgIHR5cGU6IHRoaXMuYXJ0VHlwZUVudHJpZXM/Lmxlbmd0aCA/IHRoaXMuYXJ0VHlwZUVudHJpZXNbMF0uaWQgOiAnJyxcclxuICAgICAgbmFtZTogJycsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlZGl0QXJ0aXN0KGFydGlzdDogQ29kRGVjb3JhdGlvbkFydGlzdCB8IG51bGwsIGluZGV4ID0gLTEpOiB2b2lkIHtcclxuICAgIGlmICghYXJ0aXN0KSB7XHJcbiAgICAgIHRoaXMuZWRpdGVkQXJ0aXN0SW5kZXggPSAtMTtcclxuICAgICAgdGhpcy5lZGl0ZWRBcnRpc3QgPSB1bmRlZmluZWQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVkaXRlZEFydGlzdEluZGV4ID0gaW5kZXg7XHJcbiAgICAgIHRoaXMuZWRpdGVkQXJ0aXN0ID0gYXJ0aXN0O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQXJ0aXN0U2F2ZShhcnRpc3Q6IENvZERlY29yYXRpb25BcnRpc3QpOiB2b2lkIHtcclxuICAgIGNvbnN0IGFydGlzdHMgPSBbLi4udGhpcy5hcnRpc3RzLnZhbHVlXTtcclxuXHJcbiAgICBpZiAodGhpcy5lZGl0ZWRBcnRpc3RJbmRleCA+IC0xKSB7XHJcbiAgICAgIGFydGlzdHMuc3BsaWNlKHRoaXMuZWRpdGVkQXJ0aXN0SW5kZXgsIDEsIGFydGlzdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhcnRpc3RzLnB1c2goYXJ0aXN0KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFydGlzdHMuc2V0VmFsdWUoYXJ0aXN0cyk7XHJcbiAgICB0aGlzLmFydGlzdHMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5hcnRpc3RzLm1hcmtBc0RpcnR5KCk7XHJcbiAgICB0aGlzLmVkaXRBcnRpc3QobnVsbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlQXJ0aXN0KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2RpYWxvZ1NlcnZpY2VcclxuICAgICAgLmNvbmZpcm0oJ0NvbmZpcm1hdGlvbicsICdEZWxldGUgYXJ0aXN0PycpXHJcbiAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHllcykgPT4ge1xyXG4gICAgICAgIGlmICh5ZXMpIHtcclxuICAgICAgICAgIGNvbnN0IGl0ZW1zID0gWy4uLnRoaXMuYXJ0aXN0cy52YWx1ZV07XHJcbiAgICAgICAgICBpdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgdGhpcy5hcnRpc3RzLnNldFZhbHVlKGl0ZW1zKTtcclxuICAgICAgICAgIHRoaXMuYXJ0aXN0cy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICB0aGlzLmFydGlzdHMubWFya0FzRGlydHkoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG1vdmVBcnRpc3RVcChpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoaW5kZXggPCAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmFydGlzdHMudmFsdWVbaW5kZXhdO1xyXG4gICAgY29uc3QgaXRlbXMgPSBbLi4udGhpcy5hcnRpc3RzLnZhbHVlXTtcclxuICAgIGl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICBpdGVtcy5zcGxpY2UoaW5kZXggLSAxLCAwLCBpdGVtKTtcclxuICAgIHRoaXMuYXJ0aXN0cy5zZXRWYWx1ZShpdGVtcyk7XHJcbiAgICB0aGlzLmFydGlzdHMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5hcnRpc3RzLm1hcmtBc0RpcnR5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbW92ZUFydGlzdERvd24oaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKGluZGV4ICsgMSA+PSB0aGlzLmFydGlzdHMudmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmFydGlzdHMudmFsdWVbaW5kZXhdO1xyXG4gICAgY29uc3QgaXRlbXMgPSBbLi4udGhpcy5hcnRpc3RzLnZhbHVlXTtcclxuICAgIGl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICBpdGVtcy5zcGxpY2UoaW5kZXggKyAxLCAwLCBpdGVtKTtcclxuICAgIHRoaXMuYXJ0aXN0cy5zZXRWYWx1ZShpdGVtcyk7XHJcbiAgICB0aGlzLmFydGlzdHMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5hcnRpc3RzLm1hcmtBc0RpcnR5KCk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBwdWJsaWMgY2FuY2VsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5lZGl0b3JDbG9zZS5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2F2ZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmZvcm0uaW52YWxpZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmRlY29yYXRpb25DaGFuZ2UuZW1pdCh0aGlzLmdldERlY29yYXRpb24oKSk7XHJcbiAgfVxyXG59XHJcbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIChzdWJtaXQpPVwic2F2ZSgpXCI+XHJcbiAgPGRpdj5cclxuICAgIDwhLS0gaWQgLS0+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtbGFiZWw+SUQ8L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJlaWRcIiAvPlxyXG4gICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgKm5nSWY9XCIkYW55KGVpZCkuZXJyb3JzPy5yZXF1aXJlZCAmJiAoZWlkLmRpcnR5IHx8IGVpZC50b3VjaGVkKVwiXHJcbiAgICAgICAgPkVJRCByZXF1aXJlZDwvbWF0LWVycm9yXHJcbiAgICAgID5cclxuICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICpuZ0lmPVwiJGFueShlaWQpLmVycm9ycz8ubWF4TGVuZ3RoICYmIChlaWQuZGlydHkgfHwgZWlkLnRvdWNoZWQpXCJcclxuICAgICAgICA+RUlEIHRvbyBsb25nPC9tYXQtZXJyb3JcclxuICAgICAgPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICZuYnNwO1xyXG4gICAgPCEtLSBuYW1lIC0tPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWxhYmVsPm5hbWU8L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJuYW1lXCIgLz5cclxuICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICpuZ0lmPVwiJGFueShuYW1lKS5lcnJvcnM/LnJlcXVpcmVkICYmIChuYW1lLmRpcnR5IHx8IG5hbWUudG91Y2hlZClcIlxyXG4gICAgICAgID5uYW1lIHJlcXVpcmVkPC9tYXQtZXJyb3JcclxuICAgICAgPlxyXG4gICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgKm5nSWY9XCIkYW55KG5hbWUpLmVycm9ycz8ubWF4TGVuZ3RoICYmIChuYW1lLmRpcnR5IHx8IG5hbWUudG91Y2hlZClcIlxyXG4gICAgICAgID5uYW1lIHRvbyBsb25nPC9tYXQtZXJyb3JcclxuICAgICAgPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBmbGFncyAtLT5cclxuICA8ZmllbGRzZXQ+XHJcbiAgICA8bGVnZW5kPmZlYXR1cmVzPC9sZWdlbmQ+XHJcbiAgICA8Y2FkbXVzLXVpLWZsYWdzLXBpY2tlclxyXG4gICAgICBbZmxhZ3NdPVwiYXZhaWxGbGFnc1wiXHJcbiAgICAgIFtzZWxlY3RlZElkc109XCJpbml0aWFsRmxhZ3NcIlxyXG4gICAgICAoc2VsZWN0ZWRJZHNDaGFuZ2UpPVwib25TZWxlY3RlZElkc0NoYW5nZSgkZXZlbnQpXCJcclxuICAgID48L2NhZG11cy11aS1mbGFncy1waWNrZXI+XHJcbiAgPC9maWVsZHNldD5cclxuXHJcbiAgPCEtLSBub3RlIC0tPlxyXG4gIDxiciAvPlxyXG4gIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImxvbmctdGV4dFwiPlxyXG4gICAgPG1hdC1sYWJlbD5ub3RlPC9tYXQtbGFiZWw+XHJcbiAgICA8dGV4dGFyZWEgcm93cz1cIjNcIiBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwibm90ZVwiPjwvdGV4dGFyZWE+XHJcbiAgICA8bWF0LWVycm9yXHJcbiAgICAgICpuZ0lmPVwiJGFueShub3RlKS5lcnJvcnM/Lm1heExlbmd0aCAmJiAobm90ZS5kaXJ0eSB8fCBub3RlLnRvdWNoZWQpXCJcclxuICAgICAgPm5vdGUgdG9vIGxvbmc8L21hdC1lcnJvclxyXG4gICAgPlxyXG4gIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gIDwhLS0gY2hyb25vdG9wZXMgLS0+XHJcbiAgPG1hdC1leHBhbnNpb24tcGFuZWw+XHJcbiAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgIDxtYXQtcGFuZWwtdGl0bGVcclxuICAgICAgICA+PG1hdC1pY29uIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA4cHg7IGNvbG9yOiAjMjRhNTI0XCJcclxuICAgICAgICAgID5ob3VyZ2xhc3NfZW1wdHk8L21hdC1pY29uXHJcbiAgICAgICAgPlxyXG4gICAgICAgIGNocm9ub3RvcGVzPC9tYXQtcGFuZWwtdGl0bGVcclxuICAgICAgPlxyXG4gICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgIDxjYWRtdXMtYXNzZXJ0ZWQtY2hyb25vdG9wZS1zZXRcclxuICAgICAgW3RhZ0VudHJpZXNdPVwiY3RUYWdFbnRyaWVzXCJcclxuICAgICAgW2Fzc1RhZ0VudHJpZXNdPVwiYXNzVGFnRW50cmllc1wiXHJcbiAgICAgIFtyZWZUYWdFbnRyaWVzXT1cInJlZlRhZ0VudHJpZXNcIlxyXG4gICAgICBbcmVmVHlwZUVudHJpZXNdPVwicmVmVHlwZUVudHJpZXNcIlxyXG4gICAgICBbY2hyb25vdG9wZXNdPVwiaW5pdGlhbENocm9ub3RvcGVzXCJcclxuICAgICAgKGNocm9ub3RvcGVzQ2hhbmdlKT1cIm9uQ2hyb25vdG9wZXNDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICA+PC9jYWRtdXMtYXNzZXJ0ZWQtY2hyb25vdG9wZS1zZXQ+XHJcbiAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG5cclxuICA8IS0tIHJlZmVyZW5jZXMgLS0+XHJcbiAgPG1hdC1leHBhbnNpb24tcGFuZWw+XHJcbiAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgIDxtYXQtcGFuZWwtdGl0bGVcclxuICAgICAgICA+PG1hdC1pY29uIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA4cHg7IGNvbG9yOiAjYmIzZDZjXCJcclxuICAgICAgICAgID5saWJyYXJ5X2Jvb2tzPC9tYXQtaWNvblxyXG4gICAgICAgID5cclxuICAgICAgICByZWZlcmVuY2VzPC9tYXQtcGFuZWwtdGl0bGVcclxuICAgICAgPlxyXG4gICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgIDxjYWRtdXMtcmVmcy1kb2MtcmVmZXJlbmNlc1xyXG4gICAgICBbdGFnRW50cmllc109XCJyZWZUYWdFbnRyaWVzXCJcclxuICAgICAgW3R5cGVFbnRyaWVzXT1cInJlZlR5cGVFbnRyaWVzXCJcclxuICAgICAgW3JlZmVyZW5jZXNdPVwiaW5pdGlhbFJlZmVyZW5jZXNcIlxyXG4gICAgICAocmVmZXJlbmNlc0NoYW5nZSk9XCJvblJlZmVyZW5jZXNDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICA+PC9jYWRtdXMtcmVmcy1kb2MtcmVmZXJlbmNlcz5cclxuICA8L21hdC1leHBhbnNpb24tcGFuZWw+XHJcblxyXG4gIDwhLS0gYXJ0aXN0cyAtLT5cclxuICA8bWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgPG1hdC1wYW5lbC10aXRsZVxyXG4gICAgICAgID48bWF0LWljb24gc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDhweDsgY29sb3I6ICNkZGNkNDFcIj5wYWxldHRlPC9tYXQtaWNvbj5cclxuICAgICAgICBhcnRpc3RzPC9tYXQtcGFuZWwtdGl0bGVcclxuICAgICAgPlxyXG4gICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgIDxkaXY+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICBtYXQtZmxhdC1idXR0b25cclxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgIChjbGljayk9XCJhZGRBcnRpc3QoKVwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LWljb24+YWRkX2NpcmNsZTwvbWF0LWljb24+IGFydGlzdFxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPHRhYmxlICpuZ0lmPVwiYXJ0aXN0cz8udmFsdWU/Lmxlbmd0aFwiPlxyXG4gICAgICA8dGhlYWQ+XHJcbiAgICAgICAgPHRyPlxyXG4gICAgICAgICAgPHRoPjwvdGg+XHJcbiAgICAgICAgICA8dGg+dHlwZTwvdGg+XHJcbiAgICAgICAgICA8dGg+bmFtZTwvdGg+XHJcbiAgICAgICAgICA8dGg+RUlEPC90aD5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICA8L3RoZWFkPlxyXG4gICAgICA8dGJvZHk+XHJcbiAgICAgICAgPHRyXHJcbiAgICAgICAgICAqbmdGb3I9XCJcclxuICAgICAgICAgICAgbGV0IGFydGlzdCBvZiBhcnRpc3RzPy52YWx1ZTtcclxuICAgICAgICAgICAgbGV0IGkgPSBpbmRleDtcclxuICAgICAgICAgICAgbGV0IGZpcnN0ID0gZmlyc3Q7XHJcbiAgICAgICAgICAgIGxldCBsYXN0ID0gbGFzdFxyXG4gICAgICAgICAgXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJFZGl0IHRoaXMgYXJ0aXN0XCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdEFydGlzdChhcnRpc3QsIGkpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5lZGl0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiTW92ZSB0aGlzIGFydGlzdCB1cFwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpcnN0XCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUFydGlzdFVwKGkpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5hcnJvd191cHdhcmQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJNb3ZlIHRoaXMgYXJ0aXN0IGRvd25cIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJsYXN0XCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUFydGlzdERvd24oaSlcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uPmFycm93X2Rvd253YXJkPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICBjb2xvcj1cIndhcm5cIlxyXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJEZWxldGUgdGhpcyBhcnRpc3RcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVBcnRpc3QoaSlcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uPnJlbW92ZV9jaXJjbGU8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgIHt7IGFydGlzdC50eXBlIHwgZmxhdExvb2t1cCA6IGFydFR5cGVFbnRyaWVzIDogXCJpZFwiIDogXCJ2YWx1ZVwiIH19XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPHRkPnt7IGFydGlzdC5uYW1lIH19PC90ZD5cclxuICAgICAgICAgIDx0ZD57eyBhcnRpc3QuZWlkIH19PC90ZD5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICA8L3Rib2R5PlxyXG4gICAgPC90YWJsZT5cclxuICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsIFtleHBhbmRlZF09XCJlZGl0ZWRBcnRpc3RcIiBbZGlzYWJsZWRdPVwiIWVkaXRlZEFydGlzdFwiPlxyXG4gICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgPG1hdC1wYW5lbC10aXRsZT5hcnRpc3Qge3sgZWRpdGVkQXJ0aXN0Py5uYW1lIH19PC9tYXQtcGFuZWwtdGl0bGU+XHJcbiAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgIDxjYWRtdXMtY29kLWRlY29yYXRpb24tYXJ0aXN0XHJcbiAgICAgICAgW2N0VGFnRW50cmllc109XCJjdFRhZ0VudHJpZXNcIlxyXG4gICAgICAgIFthc3NUYWdFbnRyaWVzXT1cImFzc1RhZ0VudHJpZXNcIlxyXG4gICAgICAgIFtyZWZUYWdFbnRyaWVzXT1cInJlZlRhZ0VudHJpZXNcIlxyXG4gICAgICAgIFthcnRUeXBlRW50cmllc109XCJhcnRUeXBlRW50cmllc1wiXHJcbiAgICAgICAgW3JlZlR5cGVFbnRyaWVzXT1cInJlZlR5cGVFbnRyaWVzXCJcclxuICAgICAgICBbYXJ0U3R5bGVFbnRyaWVzXT1cImFydFN0eWxlRW50cmllc1wiXHJcbiAgICAgICAgW2lkVGFnRW50cmllc109XCJpZFRhZ0VudHJpZXNcIlxyXG4gICAgICAgIFtpZFNjb3BlRW50cmllc109XCJpZFNjb3BlRW50cmllc1wiXHJcbiAgICAgICAgW2FydGlzdF09XCJlZGl0ZWRBcnRpc3RcIlxyXG4gICAgICAgIChhcnRpc3RDaGFuZ2UpPVwib25BcnRpc3RTYXZlKCRldmVudClcIlxyXG4gICAgICAgIChlZGl0b3JDbG9zZSk9XCJlZGl0QXJ0aXN0KG51bGwpXCJcclxuICAgICAgPjwvY2FkbXVzLWNvZC1kZWNvcmF0aW9uLWFydGlzdD5cclxuICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuICA8L21hdC1leHBhbnNpb24tcGFuZWw+XHJcblxyXG4gIDwhLS0gZWxlbWVudHMgLS0+XHJcbiAgPGgzPmVsZW1lbnRzPC9oMz5cclxuICA8ZGl2PlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgbWF0LWZsYXQtYnV0dG9uXHJcbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgIChjbGljayk9XCJhZGRFbGVtZW50KClcIlxyXG4gICAgPlxyXG4gICAgICA8bWF0LWljb24+YWRkX2NpcmNsZTwvbWF0LWljb24+IGVsZW1lbnRcclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG4gIDx0YWJsZSAqbmdJZj1cImVsZW1lbnRzPy52YWx1ZT8ubGVuZ3RoXCI+XHJcbiAgICA8dGhlYWQ+XHJcbiAgICAgIDx0cj5cclxuICAgICAgICA8dGg+PC90aD5cclxuICAgICAgICA8dGg+a2V5PC90aD5cclxuICAgICAgICA8dGg+cGFyZW50PC90aD5cclxuICAgICAgICA8dGg+dHlwZTwvdGg+XHJcbiAgICAgICAgPHRoPnN1YmplY3Q8L3RoPlxyXG4gICAgICAgIDx0aD5leHRlbnQ8L3RoPlxyXG4gICAgICA8L3RyPlxyXG4gICAgPC90aGVhZD5cclxuICAgIDx0Ym9keT5cclxuICAgICAgPHRyXHJcbiAgICAgICAgKm5nRm9yPVwiXHJcbiAgICAgICAgICBsZXQgZWxlbWVudCBvZiBlbGVtZW50cz8udmFsdWU7XHJcbiAgICAgICAgICBsZXQgaSA9IGluZGV4O1xyXG4gICAgICAgICAgbGV0IGZpcnN0ID0gZmlyc3Q7XHJcbiAgICAgICAgICBsZXQgbGFzdCA9IGxhc3RcclxuICAgICAgICBcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHRkPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJFZGl0IHRoaXMgZWxlbWVudFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJlZGl0RWxlbWVudChlbGVtZW50LCBpKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5lZGl0PC9tYXQtaWNvbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJNb3ZlIHRoaXMgZWxlbWVudCB1cFwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaXJzdFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJtb3ZlRWxlbWVudFVwKGkpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPG1hdC1pY29uPmFycm93X3Vwd2FyZDwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiTW92ZSB0aGlzIGVsZW1lbnQgZG93blwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJsYXN0XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVFbGVtZW50RG93bihpKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5hcnJvd19kb3dud2FyZDwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICBjb2xvcj1cIndhcm5cIlxyXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiRGVsZXRlIHRoaXMgZWxlbWVudFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGkpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPG1hdC1pY29uPnJlbW92ZV9jaXJjbGU8L21hdC1pY29uPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICA8dGQ+e3sgZWxlbWVudC5rZXkgfX08L3RkPlxyXG4gICAgICAgIDx0ZD57eyBlbGVtZW50LnBhcmVudEtleSB9fTwvdGQ+XHJcbiAgICAgICAgPHRkPlxyXG4gICAgICAgICAge3sgZWxlbWVudC50eXBlIHwgZmxhdExvb2t1cCA6IGRlY0VsZW1UeXBlRW50cmllcyA6IFwiaWRcIiA6IFwidmFsdWVcIiB9fVxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPHRkPnt7IGVsZW1lbnQuc3ViamVjdCB9fTwvdGQ+XHJcbiAgICAgICAgPHRkPnt7IGVsZW1lbnQucmFuZ2VzIHwgY29kTG9jYXRpb25SYW5nZSB9fTwvdGQ+XHJcbiAgICAgIDwvdHI+XHJcbiAgICA8L3Rib2R5PlxyXG4gIDwvdGFibGU+XHJcblxyXG4gIDwhLS0gRUxFTUVOVCAtLT5cclxuICA8bWF0LWV4cGFuc2lvbi1wYW5lbCBbZGlzYWJsZWRdPVwiIWVkaXRlZEVsZW1lbnRcIiBbZXhwYW5kZWRdPVwiZWRpdGVkRWxlbWVudFwiPlxyXG4gICAgPGNhZG11cy1jb2QtZGVjb3JhdGlvbi1lbGVtZW50XHJcbiAgICAgIFtpbWdUeXBlRW50cmllc109XCJpbWdUeXBlRW50cmllc1wiXHJcbiAgICAgIFtkZWNFbGVtUG9zRW50cmllc109XCJkZWNFbGVtUG9zRW50cmllc1wiXHJcbiAgICAgIFtkZWNFbGVtRmxhZ0VudHJpZXNdPVwiZGVjRWxlbUZsYWdFbnRyaWVzXCJcclxuICAgICAgW2RlY0VsZW1UZWNoRW50cmllc109XCJkZWNFbGVtVGVjaEVudHJpZXNcIlxyXG4gICAgICBbZGVjRWxlbVRvb2xFbnRyaWVzXT1cImRlY0VsZW1Ub29sRW50cmllc1wiXHJcbiAgICAgIFtkZWNFbGVtVHlwZUVudHJpZXNdPVwiZGVjRWxlbVR5cGVFbnRyaWVzXCJcclxuICAgICAgW2RlY0VsZW1Db2xvckVudHJpZXNdPVwiZGVjRWxlbUNvbG9yRW50cmllc1wiXHJcbiAgICAgIFtkZWNFbGVtVHlwb2xFbnRyaWVzXT1cImRlY0VsZW1UeXBvbEVudHJpZXNcIlxyXG4gICAgICBbZGVjVHlwZUhpZGRlbkVudHJpZXNdPVwiZGVjVHlwZUhpZGRlbkVudHJpZXNcIlxyXG4gICAgICBbZGVjRWxlbUdpbGRpbmdFbnRyaWVzXT1cImRlY0VsZW1HaWxkaW5nRW50cmllc1wiXHJcbiAgICAgIFtlbGVtZW50XT1cImVkaXRlZEVsZW1lbnRcIlxyXG4gICAgICBbcGFyZW50S2V5c109XCJwYXJlbnRLZXlzXCJcclxuICAgICAgKGVsZW1lbnRDaGFuZ2UpPVwib25FbGVtZW50U2F2ZSgkZXZlbnQpXCJcclxuICAgICAgKGVkaXRvckNsb3NlKT1cImVkaXRFbGVtZW50KG51bGwpXCJcclxuICAgID48L2NhZG11cy1jb2QtZGVjb3JhdGlvbi1lbGVtZW50PlxyXG4gIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuXHJcbiAgPCEtLSBidXR0b25zIC0tPlxyXG4gIDxociAvPlxyXG4gIDxkaXYgY2xhc3M9XCJ0b29sYmFyLXJvd1wiPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgY29sb3I9XCJ3YXJuXCJcclxuICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgIG1hdFRvb2x0aXA9XCJEaXNjYXJkIGRlY29yYXRpb24gY2hhbmdlc1wiXHJcbiAgICAgIChjbGljayk9XCJjYW5jZWwoKVwiXHJcbiAgICA+XHJcbiAgICAgIDxtYXQtaWNvbj5jbGVhcjwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b25cclxuICAgICAgdHlwZT1cInN1Ym1pdFwiXHJcbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgIG1hdC1mbGF0LWJ1dHRvblxyXG4gICAgICBtYXRUb29sdGlwPVwiQWNjZXB0IGRlY29yYXRpb24gY2hhbmdlc1wiXHJcbiAgICAgIFtkaXNhYmxlZF09XCJmb3JtLmludmFsaWQgfHwgZm9ybS5wcmlzdGluZVwiXHJcbiAgICA+XHJcbiAgICAgIDxtYXQtaWNvbj5jaGVja19jaXJjbGU8L21hdC1pY29uPiBkZWNvcmF0aW9uXHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9mb3JtPlxyXG4iXX0=