@provoly/hypervisor 0.0.116 → 0.0.118

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.
Files changed (31) hide show
  1. package/esm2022/src/lib/event/detail/event-detail.component.mjs +65 -10
  2. package/esm2022/src/lib/event/detail/event-details-tooltip.component.mjs +19 -0
  3. package/esm2022/src/lib/event/public-api.mjs +2 -1
  4. package/esm2022/src/lib/event-summary/item/event-summary-item.component.mjs +3 -3
  5. package/esm2022/src/lib/general/display-date.function.mjs +4 -0
  6. package/esm2022/src/lib/general/i18n/fr.translations.mjs +5 -2
  7. package/esm2022/src/lib/general/last-events/last-events.component.mjs +26 -0
  8. package/esm2022/src/lib/general/public-api.mjs +3 -1
  9. package/esm2022/src/lib/hypervisor.module.mjs +12 -4
  10. package/esm2022/src/lib/procedure/model-list/procedure-list.component.mjs +3 -3
  11. package/esm2022/src/lib/store/equipment/equipment.service.mjs +1 -1
  12. package/esm2022/src/lib/store/event/event.actions.mjs +3 -2
  13. package/esm2022/src/lib/store/event/event.service.mjs +9 -1
  14. package/fesm2022/provoly-hypervisor.mjs +188 -78
  15. package/fesm2022/provoly-hypervisor.mjs.map +1 -1
  16. package/package.json +1 -1
  17. package/src/lib/event/detail/event-detail.component.d.ts +14 -4
  18. package/src/lib/event/detail/event-details-tooltip.component.d.ts +15 -0
  19. package/src/lib/event/public-api.d.ts +1 -0
  20. package/src/lib/general/display-date.function.d.ts +1 -0
  21. package/src/lib/general/i18n/fr.translations.d.ts +3 -0
  22. package/src/lib/general/last-events/last-events.component.d.ts +11 -0
  23. package/src/lib/general/public-api.d.ts +2 -0
  24. package/src/lib/hypervisor.module.d.ts +11 -9
  25. package/src/lib/store/equipment/equipment.service.d.ts +2 -1
  26. package/src/lib/store/event/event.actions.d.ts +5 -0
  27. package/src/lib/store/event/event.service.d.ts +1 -0
  28. package/styles/components/_index.scss +1 -0
  29. package/styles/components/_o-hvy-event-detail.scss +26 -0
  30. package/styles/components/_o-hvy-last-events.scss +74 -0
  31. package/styles/components/_o-hvy-procedure-list.scss +4 -3
@@ -1,4 +1,4 @@
1
- import { Component, EventEmitter, Input, Output, TemplateRef, ViewChild } from '@angular/core';
1
+ import { Component, ElementRef, EventEmitter, Input, Output, TemplateRef, ViewChild, ViewChildren } from '@angular/core';
2
2
  import { HypEventCriticality } from '../../model/event/hyp-event-criticality.type';
3
3
  import { PryDialogConfirmComponent, SubscriptionnerDirective } from '@provoly/dashboard';
4
4
  import { DOMAINS } from '../../model/domains.constant';
@@ -12,6 +12,7 @@ import { ProcedureAssociationModalComponent } from '../procedure-association-mod
12
12
  import { ProcedureActions } from '../../store/procedure/procedure.actions';
13
13
  import { HypEventCategory, HypEventSubCategory } from '../../model/event/hyp-event-category.type';
14
14
  import { catchError, map, startWith } from 'rxjs/operators';
15
+ import { HvyEventDetailsTooltipComponent } from './event-details-tooltip.component';
15
16
  import * as i0 from "@angular/core";
16
17
  import * as i1 from "../../store/equipment/equipment.service";
17
18
  import * as i2 from "@ngrx/store";
@@ -33,6 +34,11 @@ export class EventDetailComponent extends SubscriptionnerDirective {
33
34
  this.opened = this._events.length === 1 ? [true] : [];
34
35
  this.canCloseSome = this._events.filter((ev) => ev.status !== 'DONE').length > 0;
35
36
  this.comments$ = this.triggerComment$.pipe(mergeMap(() => combineLatest(this._events.map((event) => this.commentsService.get(event.id, 'events').pipe(map((comments) => ({ [event.id]: comments }))))).pipe(map((all) => all.reduce((p, c) => ({ ...p, ...c }), {})))), startWith({}), shareReplay());
37
+ this._events.forEach((ev, idx) => {
38
+ if (ev.equipment && ev.equipment.id && ev.equipment.id.length > 0) {
39
+ this.selectedEquipmentChange(ev.equipment, idx);
40
+ }
41
+ });
36
42
  }
37
43
  set procedure(procedure) {
38
44
  this._procedure = procedure;
@@ -80,11 +86,14 @@ export class EventDetailComponent extends SubscriptionnerDirective {
80
86
  this.comfirmDialogOpened = new EventEmitter();
81
87
  this.triggerComment$ = new BehaviorSubject(undefined);
82
88
  this.onEquipmentSearch$ = new Subject();
89
+ this.equipmentSelectValue = [];
83
90
  this.padId = padId;
84
91
  this.subCategories = [undefined, ...HypEventSubCategory.values['ANOMALY']];
85
- this.equipments$ = this.onEquipmentSearch$.pipe(startWith(), debounceTime(500)).pipe(switchMap(() => {
86
- const search = typeof this.equipmentSelectValue === 'string' && this.equipmentSelectValue.length > 2
87
- ? this.equipmentSelectValue
92
+ this.equipmentsEvents = [];
93
+ this.equipments$ = this.onEquipmentSearch$.pipe(startWith(), debounceTime(500)).pipe(switchMap((index) => {
94
+ const search = typeof this.equipmentSelectValue[index] === 'string' &&
95
+ this.equipmentSelectValue[index].length > 2
96
+ ? this.equipmentSelectValue[index]
88
97
  : undefined;
89
98
  return this.equipmentService.search(search).pipe(map((equipments) => equipments.map((equipment) => {
90
99
  const regex = RegExp(`(${search})` ?? '(/-/-/)', 'gid');
@@ -147,7 +156,7 @@ export class EventDetailComponent extends SubscriptionnerDirective {
147
156
  access(event) {
148
157
  if (this.readonly ||
149
158
  event.status === 'DONE' ||
150
- (['LIMIT', 'OUTOFORDER', 'ANOMALY'].includes(event.category) && event.externalSourceRef)) {
159
+ (['LIMIT', 'OUTOFORDER', 'ANOMALY'].includes(event.category) && event.externalSourceRef !== 'Hyperviseur')) {
151
160
  return {
152
161
  name: true,
153
162
  category: true,
@@ -339,8 +348,8 @@ export class EventDetailComponent extends SubscriptionnerDirective {
339
348
  });
340
349
  }
341
350
  selectedEquipmentChange($event, index) {
342
- this.equipmentSelectValue = $event;
343
- this.onEquipmentSearch$.next();
351
+ this.equipmentSelectValue[index] = $event;
352
+ this.onEquipmentSearch$.next(index);
344
353
  if (typeof $event === 'object') {
345
354
  if (this._events[index].equipment?.name !== $event.name) {
346
355
  if (!this.eventModifications[index]) {
@@ -360,14 +369,57 @@ export class EventDetailComponent extends SubscriptionnerDirective {
360
369
  this._outputModifications();
361
370
  }
362
371
  }
372
+ this.populateEquipment($event, index);
373
+ }
374
+ else {
375
+ this.populateEquipment(undefined, index);
376
+ }
377
+ }
378
+ populateEquipment($event, index) {
379
+ this.equipmentsEvents[index] = {};
380
+ if ($event) {
381
+ this.equipmentService.findByName($event.name).subscribe((equip) => {
382
+ this.equipmentsEvents[index].events = equip.events;
383
+ this.equipmentsEvents[index].services = equip.services;
384
+ });
385
+ }
386
+ }
387
+ toggleDetailsTooltip(idx) {
388
+ if (!this.tooltipRef) {
389
+ let idxOpened = 0;
390
+ for (let i = 0; i < idx; i++) {
391
+ if (this.opened[i]) {
392
+ idxOpened++;
393
+ }
394
+ }
395
+ this.tooltipRef = this.pryDialog.open(HvyEventDetailsTooltipComponent, {
396
+ data: this.equipmentsEvents[idx] ?? { events: [], services: [] },
397
+ overlayConfig: {
398
+ positionStrategy: this.overlay
399
+ .position()
400
+ .flexibleConnectedTo(this.detailHoverIcon.get(idxOpened))
401
+ .withPositions([
402
+ {
403
+ originX: 'end',
404
+ originY: 'bottom',
405
+ overlayX: 'start',
406
+ overlayY: 'top'
407
+ }
408
+ ])
409
+ }
410
+ });
411
+ }
412
+ else {
413
+ this.tooltipRef.close();
414
+ this.tooltipRef = undefined;
363
415
  }
364
416
  }
365
417
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: EventDetailComponent, deps: [{ token: i1.EquipmentService }, { token: i2.Store }, { token: i3.Overlay }, { token: i0.ViewContainerRef }, { token: i4.PryI18nService }, { token: i4.PryDialogService }, { token: i5.HypCommentsService }], target: i0.ɵɵFactoryTarget.Component }); }
366
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.4", type: EventDetailComponent, selector: "hvy-event-detail", inputs: { title: "title", me: "me", readonly: "readonly", readonlyProcedure: "readonlyProcedure", enableEditActions: "enableEditActions", events: "events", procedure: "procedure", cancelModifications: "cancelModifications", equipmentName: "equipmentName" }, outputs: { modifiedEvents: "modifiedEvents", modifiedProcedure: "modifiedProcedure", eventErrors: "eventErrors", comfirmDialogOpened: "comfirmDialogOpened" }, viewQueries: [{ propertyName: "confirmDialog", first: true, predicate: ["confirmDialog"], descendants: true, read: TemplateRef }], usesInheritance: true, ngImport: i0, template: "<div class=\"o-hvy-events-detail\">\n <div class=\"o-hvy-events-detail__header\">\n <div class=\"o-hvy-events-detail__header__split\">\n <h1>{{ title ?? '@hvy.event.detail' | i18n }}</h1>\n @if (events.length > 1) {\n @if (canCloseSome && !readonly) {\n <button class=\"a-btn a-btn--secondary -fix-right\" [disabled]=\"!canCloseSome\" (click)=\"closeAll()\">\n {{ (canCloseSome ? '@hvy.event.log.event.close' : '@hvy.event.log.event.closed') | i18n }}\n </button>\n }\n @if (!canCloseSome && closeComment && closeComment.length > 0) {\n <div class=\"a-tooltip\" [attr.data-tooltip]=\"closeComment\" data-tooltip-position=\"bottom\">\n <pry-icon iconSvg=\"i\" [height]=\"18\" [width]=\"18\">i</pry-icon>\n </div>\n }\n }\n </div>\n <div class=\"o-hvy-events-detail__header__split\">\n @if (procedure && !readonly) {\n <button class=\"a-btn a-btn--secondary\" (click)=\"openDeleteModal()\" [disabled]=\"readonlyProcedure\">\n {{ '@hvy.event.log.procedure.delete' | i18n }}\n </button>\n }\n </div>\n </div>\n <div class=\"o-hvy-events-detail__container\">\n <div class=\"o-hvy-events-detail__container__scrollable\">\n <div class=\"o-hvy-events-detail__events\">\n @for (event of events; track event.id; let idx = $index) {\n <div class=\"o-hvy-events-detail__events__event\">\n <div class=\"o-hvy-events-detail__events__event__header\">\n <pry-icon\n iconSvg=\"arrow_down_rounded\"\n [class.-rotated]=\"opened[idx]\"\n (click)=\"toggle(idx)\"\n [width]=\"10\"\n [height]=\"10\"\n ></pry-icon>\n <hvy-icon-display [event]=\"event\"></hvy-icon-display>\n <h2>{{ event.name }}</h2>\n <div class=\"o-hvy-events-detail__events__event__header__comment\">\n @if (comments$ && comments$ | async; as comments) {\n @if (comments[event.id]?.length ?? 0 > 0) {\n <span>{{\n ((comments[event.id]?.length ?? 0) > 1 ? '@hvy.event.comment.heads' : '@hvy.event.comment.head')\n | i18n: { nb: comments[event.id]?.length }\n }}</span>\n }\n }\n </div>\n <hvy-status-display\n [item]=\"event\"\n [modifiable]=\"event.status !== 'DONE'\"\n [readonly]=\"readonly\"\n (modified)=\"changeStatus($event, event)\"\n ></hvy-status-display>\n </div>\n <div class=\"o-hvy-events-detail__events__event__content\">\n @if (!opened[idx]) {\n <div>{{ '@hvy.event.log.event.description' | i18n }} : {{ event.description }}</div>\n <div>{{ '@hvy.event.log.event.address' | i18n }} : {{ event.address }}</div>\n } @else {\n @if (access(event); as accessValue) {\n <div class=\"o-hvy-events-detail__events__event__content__header\">\n <h3>{{ '@hvy.event.log.event.detail' | i18n }}</h3>\n <span class=\"required\">{{ '@hvy.event.log.event.mandatory' | i18n }}</span>\n </div>\n <table>\n <tbody>\n <tr>\n <td>{{ '@hvy.event.log.event.name' | i18n }}<span class=\"required\">*</span> :</td>\n <td>\n <input\n type=\"text\"\n class=\"a-form-field\"\n [class.-error]=\"hasError('name', idx)\"\n [value]=\"event.name\"\n (change)=\"modifyEvent(idx, 'name', $event)\"\n [readonly]=\"accessValue.name\"\n [maxLength]=\"50\"\n />\n </td>\n </tr>\n @if (event.id > 0) {\n <tr>\n <td>{{ '@hvy.event.log.event.id' | i18n }}<span class=\"required\">*</span> :</td>\n <td>\n <input type=\"text\" class=\"a-form-field\" [value]=\"padId.fn(event.id)\" [readonly]=\"true\" />\n </td>\n </tr>\n }\n <tr>\n <td>{{ '@hvy.event.log.event.category' | i18n }}<span class=\"required\">*</span> :</td>\n <td>\n <pry-select\n [ngModel]=\"event.category\"\n [items]=\"categories(event)\"\n [class.-error]=\"hasError('category', idx)\"\n (ngModelChange)=\"modifyEvent(idx, 'category', $event)\"\n i18nPrefix=\"@hvy.event.category.\"\n [disabled]=\"accessValue.category\"\n ></pry-select>\n </td>\n </tr>\n @if (event.category === 'ANOMALY') {\n <tr>\n <td>{{ '@hvy.event.subCategory.name' | i18n }} :</td>\n <td>\n <pry-select\n [ngModel]=\"event.subCategory\"\n [items]=\"subCategories\"\n [class.-error]=\"hasError('subCategory', idx)\"\n (ngModelChange)=\"modifyEvent(idx, 'subCategory', $event)\"\n i18nPrefix=\"@hvy.event.subCategory.\"\n [disabled]=\"accessValue.subCategory\"\n ></pry-select>\n </td>\n </tr>\n }\n <tr>\n <td>{{ '@hvy.event.criticality.name' | i18n }}<span class=\"required\">*</span> :</td>\n <td>\n <pry-select\n [ngModel]=\"event.criticality\"\n [items]=\"criticalities\"\n [class.-error]=\"hasError('criticality', idx)\"\n i18nPrefix=\"@hvy.event.criticality.\"\n [disabled]=\"accessValue.criticality\"\n (ngModelChange)=\"modifyEvent(idx, 'criticality', $event)\"\n ></pry-select>\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.log.event.description' | i18n }}<span class=\"required\">*</span> :</td>\n <td>\n <textarea\n [ngModel]=\"event.description\"\n class=\"a-form-field\"\n [class.-error]=\"hasError('description', idx)\"\n [readonly]=\"accessValue.description\"\n (ngModelChange)=\"modifyEvent(idx, 'description', $event)\"\n [maxLength]=\"256\"\n ></textarea>\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.log.event.address' | i18n }} :</td>\n <td>\n <textarea\n [ngModel]=\"event.address\"\n class=\"a-form-field\"\n [class.-error]=\"hasError('address', idx)\"\n [readonly]=\"accessValue.address\"\n (ngModelChange)=\"modifyEvent(idx, 'address', $event)\"\n [maxLength]=\"256\"\n ></textarea>\n </td>\n </tr>\n @if (event.category !== 'MANIFESTATION') {\n <tr>\n <td>{{ '@hvy.event.source' | i18n }} :</td>\n <td>\n <input\n type=\"text\"\n class=\"a-form-field\"\n [value]=\"event.externalSourceRef ?? ('@hvy.event.hypervisor' | i18n)\"\n [class.-error]=\"hasError('source', idx)\"\n [readonly]=\"accessValue.source\"\n (change)=\"modifyEvent(idx, 'source', $event)\"\n />\n </td>\n </tr>\n }\n <tr>\n <td>{{ '@hvy.event.equipment' | i18n }} :</td>\n <td>\n <pry-select\n [items]=\"equipments$ | async\"\n bindLabel=\"name\"\n [(ngModel)]=\"equipmentSelectValue\"\n (ngModelChange)=\"selectedEquipmentChange($event, idx)\"\n [autocomplete]=\"true\"\n [externalAutocompleteService]=\"true\"\n [placeholder]=\"'@hvy.event.equipmentPlaceholder' | i18n\"\n id=\"procedure-filter\"\n [template]=\"templateOption\"\n [class.-error]=\"hasError('equipment', idx)\"\n class=\"o-hvy-events-detail__events__event__content__equipment\"\n ></pry-select>\n <ng-template #templateOption let-item=\"item\">\n <div class=\"u-display-flex -column\">\n <span [innerHTML]=\"item.html\"></span>\n </div>\n </ng-template>\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.equipmentEntity' | i18n }} :</td>\n <td>\n <input\n type=\"text\"\n class=\"a-form-field\"\n [class.-error]=\"hasError('equipment', idx)\"\n [value]=\"\n (event.equipment?.entity ? '@hvy.event.entity.' + event.equipment?.entity : '') | i18n\n \"\n readonly\n />\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.domain.name' | i18n }} :</td>\n <td>\n <pry-select\n [items]=\"DOMAINS\"\n [ngModel]=\"event.domain\"\n i18nPrefix=\"@hvy.event.domain.\"\n [class.-error]=\"hasError('domain', idx)\"\n (ngModelChange)=\"modifyEvent(idx, 'domain', $event)\"\n [disabled]=\"accessValue.domain\"\n ></pry-select>\n </td>\n </tr>\n <tr>\n <td>\n {{ '@hvy.event.startDate' | i18n }}\n @if (event.category === 'MANIFESTATION') {\n <span class=\"required\">*</span>\n }\n :\n </td>\n <td>\n <input\n type=\"datetime-local\"\n class=\"a-form-field\"\n [value]=\"event.startDate | forDateTimeLocal\"\n [class.-error]=\"hasError('startDate', idx)\"\n [readonly]=\"accessValue.startDate\"\n (change)=\"modifyEvent(idx, 'startDate', $event)\"\n />\n </td>\n </tr>\n <tr>\n <td>\n {{ '@hvy.event.endDate' | i18n }}\n @if (event.category === 'MANIFESTATION') {\n <span class=\"required\">*</span>\n }\n :\n </td>\n <td>\n <input\n type=\"datetime-local\"\n class=\"a-form-field\"\n [value]=\"event.endDate | forDateTimeLocal\"\n [class.-error]=\"hasError('endDate', idx)\"\n [readonly]=\"accessValue.endDate\"\n (change)=\"modifyEvent(idx, 'endDate', $event)\"\n />\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.creationDate' | i18n }} :</td>\n <td>\n <input\n type=\"datetime-local\"\n class=\"a-form-field\"\n [value]=\"event.creationDate | forDateTimeLocal\"\n readonly\n />\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.lastModificationDate' | i18n }} :</td>\n <td>\n <input\n type=\"datetime-local\"\n class=\"a-form-field\"\n [value]=\"event.lastModificationDate | forDateTimeLocal\"\n readonly\n />\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.closeDate' | i18n }} :</td>\n <td>\n <input\n type=\"datetime-local\"\n class=\"a-form-field\"\n [value]=\"event.closeDate | forDateTimeLocal\"\n readonly\n />\n </td>\n </tr>\n </tbody>\n </table>\n <hvy-comments\n [comments]=\"(comments$ | async) ? (comments$ | async)![event.id] : []\"\n (commented)=\"updateComment(event, $event)\"\n [readonly]=\"readonly\"\n [type]=\"'events'\"\n [me]=\"me\"\n ></hvy-comments>\n }\n }\n </div>\n </div>\n }\n </div>\n <div class=\"o-hvy-events-detail__procedure\">\n <div class=\"o-hvy-events-detail__procedure__header\">\n <h2>\n {{ (events.length === 1 ? '@hvy.event.log.procedure.name1' : '@hvy.event.log.procedure.name') | i18n }}\n </h2>\n </div>\n @if (procedure) {\n <div class=\"o-hvy-events-detail__procedure__description\">\n <p>{{ procedure.description }}</p>\n </div>\n <div class=\"o-hvy-events-detail__procedure__progress\">\n <p>{{ '@hvy.event.log.procedure.progress' | i18n }}</p>\n <hvy-progress-display [progress]=\"calculatedProgress\"></hvy-progress-display>\n </div>\n <hvy-procedure-actions\n [readonly]=\"readonlyProcedure || readonly\"\n [enableEditActions]=\"enableEditActions\"\n [actions]=\"procedure.actions\"\n (modified)=\"modifiedActions($event)\"\n [me]=\"me\"\n ></hvy-procedure-actions>\n } @else {\n @if (!readonly) {\n <button class=\"a-btn a-btn--secondary\" [disabled]=\"!canAssociateProcedure\" (click)=\"openAssociationModal()\">\n {{ '@hvy.action.associate' | i18n }}\n </button>\n } @else {\n <span class=\"o-hvy-events-detail__procedure__empty\">{{ '@hvy.event.log.procedure.none' | i18n }}</span>\n }\n }\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #confirmDialog>\n <div\n class=\"o-hvy-close-confirm__dialog\"\n aria-labelledby=\"confirm\"\n tabindex=\"-1\"\n id=\"choice\"\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <h2>\n {{\n (changeStatusContext.events.length === 1 ? '@hvy.event.close.oneTitle' : '@hvy.event.close.multiTitle') | i18n\n }}\n </h2>\n <p>{{ (changeStatusContext.events.length === 1 ? '@hvy.event.close.one' : '@hvy.event.close.multi') | i18n }}</p>\n <ul>\n @for (event of changeStatusContext.events; track event.id) {\n <li>{{ event.name }}</li>\n }\n </ul>\n <p class=\"o-hvy-close-confirm__dialog__comment-title\">\n {{ '@hvy.event.close.comment' | i18n }}<span class=\"required\">*</span> :\n </p>\n <div class=\"o-hvy-close-confirm__dialog__comment\">\n <textarea [(ngModel)]=\"changeStatusContext.comment\" class=\"a-form-field\" [maxLength]=\"255\"></textarea>\n </div>\n <div class=\"o-hvy-close-confirm__dialog__actions\">\n <button class=\"a-btn a-btn--primary\" (click)=\"confirmedClose()\" [disabled]=\"confirmDisabled()\">\n {{ '@hvy.action.validate' | i18n }}\n </button>\n <button class=\"a-btn a-btn--secondary\" (click)=\"toggleConfirm()\">{{ '@hvy.action.cancel' | i18n }}</button>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i4.PrySelectComponent, selector: "pry-select", inputs: ["items", "clearable", "multiple", "closeOnSelect", "placeholder", "isForm", "required", "name", "autocomplete", "alwaysShowAutosuggestedValues", "externalAutocompleteService", "bindValue", "bindLabel", "iconSize", "bindIcon", "template", "i18nPrefix", "bindClasses", "loading", "elementRef"], outputs: ["searched", "cleared", "clicked"] }, { kind: "component", type: i7.IconDisplayComponent, selector: "hvy-icon-display", inputs: ["event"] }, { kind: "component", type: i8.StatusDisplayComponent, selector: "hvy-status-display", inputs: ["type", "readonly", "item", "modifiable"], outputs: ["modified"] }, { kind: "component", type: i9.ProgressDisplayComponent, selector: "hvy-progress-display", inputs: ["progress"] }, { kind: "component", type: i10.HvyCommentsComponent, selector: "hvy-comments", inputs: ["readonly", "me", "type", "displayEmpty", "comments", "trigger"], outputs: ["commented"] }, { kind: "component", type: i11.ProcedureActionsComponent, selector: "hvy-procedure-actions", inputs: ["mode", "me", "readonly", "enableEditActions", "actions"], outputs: ["modified"] }, { kind: "pipe", type: i12.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.I18nPipe, name: "i18n" }, { kind: "pipe", type: i13.ForDatetimeLocalPipe, name: "forDateTimeLocal" }] }); }
418
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.4", type: EventDetailComponent, selector: "hvy-event-detail", inputs: { title: "title", me: "me", readonly: "readonly", readonlyProcedure: "readonlyProcedure", enableEditActions: "enableEditActions", events: "events", procedure: "procedure", cancelModifications: "cancelModifications", equipmentName: "equipmentName" }, outputs: { modifiedEvents: "modifiedEvents", modifiedProcedure: "modifiedProcedure", eventErrors: "eventErrors", comfirmDialogOpened: "comfirmDialogOpened" }, viewQueries: [{ propertyName: "confirmDialog", first: true, predicate: ["confirmDialog"], descendants: true, read: TemplateRef }, { propertyName: "detailHoverIcon", predicate: ["detailHoverIcon"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "<div class=\"o-hvy-events-detail\">\n <div class=\"o-hvy-events-detail__header\">\n <div class=\"o-hvy-events-detail__header__split\">\n <h1>{{ title ?? '@hvy.event.detail' | i18n }}</h1>\n @if (events.length > 1) {\n @if (canCloseSome && !readonly) {\n <button class=\"a-btn a-btn--secondary -fix-right\" [disabled]=\"!canCloseSome\" (click)=\"closeAll()\">\n {{ (canCloseSome ? '@hvy.event.log.event.close' : '@hvy.event.log.event.closed') | i18n }}\n </button>\n }\n @if (!canCloseSome && closeComment && closeComment.length > 0) {\n <div class=\"a-tooltip\" [attr.data-tooltip]=\"closeComment\" data-tooltip-position=\"bottom\">\n <pry-icon iconSvg=\"i\" [height]=\"18\" [width]=\"18\">i</pry-icon>\n </div>\n }\n }\n </div>\n <div class=\"o-hvy-events-detail__header__split\">\n @if (procedure && !readonly) {\n <button class=\"a-btn a-btn--secondary\" (click)=\"openDeleteModal()\" [disabled]=\"readonlyProcedure\">\n {{ '@hvy.event.log.procedure.delete' | i18n }}\n </button>\n }\n </div>\n </div>\n <div class=\"o-hvy-events-detail__container\">\n <div class=\"o-hvy-events-detail__container__scrollable\">\n <div class=\"o-hvy-events-detail__events\">\n @for (event of events; track event.id; let idx = $index) {\n <div class=\"o-hvy-events-detail__events__event\">\n <div class=\"o-hvy-events-detail__events__event__header\">\n <pry-icon\n iconSvg=\"arrow_down_rounded\"\n [class.-rotated]=\"opened[idx]\"\n (click)=\"toggle(idx)\"\n [width]=\"10\"\n [height]=\"10\"\n ></pry-icon>\n <hvy-icon-display [event]=\"event\"></hvy-icon-display>\n <h2>{{ event.name }}</h2>\n <div class=\"o-hvy-events-detail__events__event__header__comment\">\n @if (comments$ && comments$ | async; as comments) {\n @if (comments[event.id]?.length ?? 0 > 0) {\n <span>{{\n ((comments[event.id]?.length ?? 0) > 1 ? '@hvy.event.comment.heads' : '@hvy.event.comment.head')\n | i18n: { nb: comments[event.id]?.length }\n }}</span>\n }\n }\n </div>\n <hvy-status-display\n [item]=\"event\"\n [modifiable]=\"event.status !== 'DONE'\"\n [readonly]=\"readonly\"\n (modified)=\"changeStatus($event, event)\"\n ></hvy-status-display>\n </div>\n <div class=\"o-hvy-events-detail__events__event__content\">\n @if (!opened[idx]) {\n <div>{{ '@hvy.event.log.event.description' | i18n }} : {{ event.description }}</div>\n <div>{{ '@hvy.event.log.event.address' | i18n }} : {{ event.address }}</div>\n } @else {\n @if (access(event); as accessValue) {\n <div class=\"o-hvy-events-detail__events__event__content__header\">\n <h3>{{ '@hvy.event.log.event.detail' | i18n }}</h3>\n <span class=\"required\">{{ '@hvy.event.log.event.mandatory' | i18n }}</span>\n </div>\n <table>\n <tbody>\n <tr>\n <td>{{ '@hvy.event.log.event.name' | i18n }}<span class=\"required\">*</span> :</td>\n <td>\n <input\n type=\"text\"\n class=\"a-form-field\"\n [class.-error]=\"hasError('name', idx)\"\n [value]=\"event.name\"\n (change)=\"modifyEvent(idx, 'name', $event)\"\n [readonly]=\"accessValue.name\"\n [maxLength]=\"50\"\n />\n </td>\n <td></td>\n </tr>\n @if (event.id > 0) {\n <tr>\n <td>{{ '@hvy.event.log.event.id' | i18n }}<span class=\"required\">*</span> :</td>\n <td>\n <input type=\"text\" class=\"a-form-field\" [value]=\"padId.fn(event.id)\" [readonly]=\"true\" />\n </td>\n <td></td>\n </tr>\n }\n <tr>\n <td>{{ '@hvy.event.log.event.category' | i18n }}<span class=\"required\">*</span> :</td>\n <td>\n <pry-select\n [ngModel]=\"event.category\"\n [items]=\"categories(event)\"\n [class.-error]=\"hasError('category', idx)\"\n (ngModelChange)=\"modifyEvent(idx, 'category', $event)\"\n i18nPrefix=\"@hvy.event.category.\"\n [disabled]=\"accessValue.category\"\n ></pry-select>\n </td>\n <td></td>\n </tr>\n @if (event.category === 'ANOMALY') {\n <tr>\n <td>{{ '@hvy.event.subCategory.name' | i18n }} :</td>\n <td>\n <pry-select\n [ngModel]=\"event.subCategory\"\n [items]=\"subCategories\"\n [class.-error]=\"hasError('subCategory', idx)\"\n (ngModelChange)=\"modifyEvent(idx, 'subCategory', $event)\"\n i18nPrefix=\"@hvy.event.subCategory.\"\n [disabled]=\"accessValue.subCategory\"\n ></pry-select>\n </td>\n <td></td>\n </tr>\n }\n <tr>\n <td>{{ '@hvy.event.criticality.name' | i18n }}<span class=\"required\">*</span> :</td>\n <td>\n <pry-select\n [ngModel]=\"event.criticality\"\n [items]=\"criticalities\"\n [class.-error]=\"hasError('criticality', idx)\"\n i18nPrefix=\"@hvy.event.criticality.\"\n [disabled]=\"accessValue.criticality\"\n (ngModelChange)=\"modifyEvent(idx, 'criticality', $event)\"\n ></pry-select>\n </td>\n <td></td>\n </tr>\n\n <tr>\n <td>{{ '@hvy.event.log.event.description' | i18n }}<span class=\"required\">*</span> :</td>\n <td>\n <textarea\n [ngModel]=\"event.description\"\n class=\"a-form-field\"\n [class.-error]=\"hasError('description', idx)\"\n [readonly]=\"accessValue.description\"\n (ngModelChange)=\"modifyEvent(idx, 'description', $event)\"\n [maxLength]=\"256\"\n ></textarea>\n </td>\n <td></td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.log.event.address' | i18n }} :</td>\n <td>\n <textarea\n [ngModel]=\"event.address\"\n class=\"a-form-field\"\n [class.-error]=\"hasError('address', idx)\"\n [readonly]=\"accessValue.address\"\n (ngModelChange)=\"modifyEvent(idx, 'address', $event)\"\n [maxLength]=\"256\"\n ></textarea>\n </td>\n <td></td>\n </tr>\n @if (event.category !== 'MANIFESTATION') {\n <tr>\n <td>{{ '@hvy.event.source' | i18n }} :</td>\n <td>\n <input\n type=\"text\"\n class=\"a-form-field\"\n [value]=\"event.externalSourceRef ?? ('@hvy.event.hypervisor' | i18n)\"\n [class.-error]=\"hasError('source', idx)\"\n [readonly]=\"accessValue.source\"\n (change)=\"modifyEvent(idx, 'source', $event)\"\n />\n </td>\n <td></td>\n </tr>\n }\n <tr>\n <td>{{ '@hvy.event.equipment' | i18n }} :</td>\n <td>\n <pry-select\n [items]=\"equipments$ | async\"\n bindLabel=\"name\"\n [(ngModel)]=\"equipmentSelectValue[idx]\"\n (ngModelChange)=\"selectedEquipmentChange($event, idx)\"\n [autocomplete]=\"true\"\n [externalAutocompleteService]=\"true\"\n [placeholder]=\"'@hvy.event.equipmentPlaceholder' | i18n\"\n id=\"procedure-filter\"\n [template]=\"templateOption\"\n [class.-error]=\"hasError('equipment', idx)\"\n [disabled]=\"accessValue.eqName\"\n class=\"o-hvy-events-detail__events__event__content__equipment\"\n ></pry-select>\n <ng-template #templateOption let-item=\"item\">\n <div class=\"u-display-flex -column\">\n <span [innerHTML]=\"item.html\"></span>\n </div>\n </ng-template>\n </td>\n <td>\n @if (event.equipment && event.equipment.id.length > 0) {\n <pry-icon\n iconSvg=\"i\"\n #detailHoverIcon\n (mouseenter)=\"toggleDetailsTooltip(idx)\"\n (mouseleave)=\"toggleDetailsTooltip(idx)\"\n ></pry-icon>\n }\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.equipmentEntity' | i18n }} :</td>\n <td>\n <input\n type=\"text\"\n class=\"a-form-field\"\n [class.-error]=\"hasError('equipment', idx)\"\n [value]=\"\n (event.equipment?.entity ? '@hvy.event.entity.' + event.equipment?.entity : '') | i18n\n \"\n readonly\n />\n </td>\n <td></td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.domain.name' | i18n }} :</td>\n <td>\n <pry-select\n [items]=\"DOMAINS\"\n [ngModel]=\"event.domain\"\n i18nPrefix=\"@hvy.event.domain.\"\n [class.-error]=\"hasError('domain', idx)\"\n (ngModelChange)=\"modifyEvent(idx, 'domain', $event)\"\n [disabled]=\"accessValue.domain\"\n ></pry-select>\n </td>\n <td></td>\n </tr>\n <tr>\n <td>\n {{ '@hvy.event.startDate' | i18n }}\n @if (event.category === 'MANIFESTATION') {\n <span class=\"required\">*</span>\n }\n :\n </td>\n <td>\n <input\n type=\"datetime-local\"\n class=\"a-form-field\"\n [value]=\"event.startDate | forDateTimeLocal\"\n [class.-error]=\"hasError('startDate', idx)\"\n [readonly]=\"accessValue.startDate\"\n (change)=\"modifyEvent(idx, 'startDate', $event)\"\n />\n </td>\n <td></td>\n </tr>\n <tr>\n <td>\n {{ '@hvy.event.endDate' | i18n }}\n @if (event.category === 'MANIFESTATION') {\n <span class=\"required\">*</span>\n }\n :\n </td>\n <td>\n <input\n type=\"datetime-local\"\n class=\"a-form-field\"\n [value]=\"event.endDate | forDateTimeLocal\"\n [class.-error]=\"hasError('endDate', idx)\"\n [readonly]=\"accessValue.endDate\"\n (change)=\"modifyEvent(idx, 'endDate', $event)\"\n />\n </td>\n <td></td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.creationDate' | i18n }} :</td>\n <td>\n <input\n type=\"datetime-local\"\n class=\"a-form-field\"\n [value]=\"event.creationDate | forDateTimeLocal\"\n readonly\n />\n </td>\n <td></td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.lastModificationDate' | i18n }} :</td>\n <td>\n <input\n type=\"datetime-local\"\n class=\"a-form-field\"\n [value]=\"event.lastModificationDate | forDateTimeLocal\"\n readonly\n />\n </td>\n <td></td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.closeDate' | i18n }} :</td>\n <td>\n <input\n type=\"datetime-local\"\n class=\"a-form-field\"\n [value]=\"event.closeDate | forDateTimeLocal\"\n readonly\n />\n </td>\n <td></td>\n </tr>\n </tbody>\n </table>\n <hvy-comments\n [comments]=\"(comments$ | async) ? (comments$ | async)![event.id] : []\"\n (commented)=\"updateComment(event, $event)\"\n [readonly]=\"readonly\"\n [type]=\"'events'\"\n [me]=\"me\"\n ></hvy-comments>\n }\n }\n </div>\n </div>\n }\n </div>\n <div class=\"o-hvy-events-detail__procedure\">\n <div class=\"o-hvy-events-detail__procedure__header\">\n <h2>\n {{ (events.length === 1 ? '@hvy.event.log.procedure.name1' : '@hvy.event.log.procedure.name') | i18n }}\n </h2>\n </div>\n @if (procedure) {\n <div class=\"o-hvy-events-detail__procedure__description\">\n <p>{{ procedure.description }}</p>\n </div>\n <div class=\"o-hvy-events-detail__procedure__progress\">\n <p>{{ '@hvy.event.log.procedure.progress' | i18n }}</p>\n <hvy-progress-display [progress]=\"calculatedProgress\"></hvy-progress-display>\n </div>\n <hvy-procedure-actions\n [readonly]=\"readonlyProcedure || readonly\"\n [enableEditActions]=\"enableEditActions\"\n [actions]=\"procedure.actions\"\n (modified)=\"modifiedActions($event)\"\n [me]=\"me\"\n ></hvy-procedure-actions>\n } @else {\n @if (!readonly) {\n <button class=\"a-btn a-btn--secondary\" [disabled]=\"!canAssociateProcedure\" (click)=\"openAssociationModal()\">\n {{ '@hvy.action.associate' | i18n }}\n </button>\n } @else {\n <span class=\"o-hvy-events-detail__procedure__empty\">{{ '@hvy.event.log.procedure.none' | i18n }}</span>\n }\n }\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #confirmDialog>\n <div\n class=\"o-hvy-close-confirm__dialog\"\n aria-labelledby=\"confirm\"\n tabindex=\"-1\"\n id=\"choice\"\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <h2>\n {{\n (changeStatusContext.events.length === 1 ? '@hvy.event.close.oneTitle' : '@hvy.event.close.multiTitle') | i18n\n }}\n </h2>\n <p>{{ (changeStatusContext.events.length === 1 ? '@hvy.event.close.one' : '@hvy.event.close.multi') | i18n }}</p>\n <ul>\n @for (event of changeStatusContext.events; track event.id) {\n <li>{{ event.name }}</li>\n }\n </ul>\n <p class=\"o-hvy-close-confirm__dialog__comment-title\">\n {{ '@hvy.event.close.comment' | i18n }}<span class=\"required\">*</span> :\n </p>\n <div class=\"o-hvy-close-confirm__dialog__comment\">\n <textarea [(ngModel)]=\"changeStatusContext.comment\" class=\"a-form-field\" [maxLength]=\"255\"></textarea>\n </div>\n <div class=\"o-hvy-close-confirm__dialog__actions\">\n <button class=\"a-btn a-btn--primary\" (click)=\"confirmedClose()\" [disabled]=\"confirmDisabled()\">\n {{ '@hvy.action.validate' | i18n }}\n </button>\n <button class=\"a-btn a-btn--secondary\" (click)=\"toggleConfirm()\">{{ '@hvy.action.cancel' | i18n }}</button>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i4.PrySelectComponent, selector: "pry-select", inputs: ["items", "clearable", "multiple", "closeOnSelect", "placeholder", "isForm", "required", "name", "autocomplete", "alwaysShowAutosuggestedValues", "externalAutocompleteService", "bindValue", "bindLabel", "iconSize", "bindIcon", "template", "i18nPrefix", "bindClasses", "loading", "elementRef"], outputs: ["searched", "cleared", "clicked"] }, { kind: "component", type: i7.IconDisplayComponent, selector: "hvy-icon-display", inputs: ["event"] }, { kind: "component", type: i8.StatusDisplayComponent, selector: "hvy-status-display", inputs: ["type", "readonly", "item", "modifiable"], outputs: ["modified"] }, { kind: "component", type: i9.ProgressDisplayComponent, selector: "hvy-progress-display", inputs: ["progress"] }, { kind: "component", type: i10.HvyCommentsComponent, selector: "hvy-comments", inputs: ["readonly", "me", "type", "displayEmpty", "comments", "trigger"], outputs: ["commented"] }, { kind: "component", type: i11.ProcedureActionsComponent, selector: "hvy-procedure-actions", inputs: ["mode", "me", "readonly", "enableEditActions", "actions"], outputs: ["modified"] }, { kind: "pipe", type: i12.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.I18nPipe, name: "i18n" }, { kind: "pipe", type: i13.ForDatetimeLocalPipe, name: "forDateTimeLocal" }] }); }
367
419
  }
368
420
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: EventDetailComponent, decorators: [{
369
421
  type: Component,
370
- args: [{ selector: 'hvy-event-detail', template: "<div class=\"o-hvy-events-detail\">\n <div class=\"o-hvy-events-detail__header\">\n <div class=\"o-hvy-events-detail__header__split\">\n <h1>{{ title ?? '@hvy.event.detail' | i18n }}</h1>\n @if (events.length > 1) {\n @if (canCloseSome && !readonly) {\n <button class=\"a-btn a-btn--secondary -fix-right\" [disabled]=\"!canCloseSome\" (click)=\"closeAll()\">\n {{ (canCloseSome ? '@hvy.event.log.event.close' : '@hvy.event.log.event.closed') | i18n }}\n </button>\n }\n @if (!canCloseSome && closeComment && closeComment.length > 0) {\n <div class=\"a-tooltip\" [attr.data-tooltip]=\"closeComment\" data-tooltip-position=\"bottom\">\n <pry-icon iconSvg=\"i\" [height]=\"18\" [width]=\"18\">i</pry-icon>\n </div>\n }\n }\n </div>\n <div class=\"o-hvy-events-detail__header__split\">\n @if (procedure && !readonly) {\n <button class=\"a-btn a-btn--secondary\" (click)=\"openDeleteModal()\" [disabled]=\"readonlyProcedure\">\n {{ '@hvy.event.log.procedure.delete' | i18n }}\n </button>\n }\n </div>\n </div>\n <div class=\"o-hvy-events-detail__container\">\n <div class=\"o-hvy-events-detail__container__scrollable\">\n <div class=\"o-hvy-events-detail__events\">\n @for (event of events; track event.id; let idx = $index) {\n <div class=\"o-hvy-events-detail__events__event\">\n <div class=\"o-hvy-events-detail__events__event__header\">\n <pry-icon\n iconSvg=\"arrow_down_rounded\"\n [class.-rotated]=\"opened[idx]\"\n (click)=\"toggle(idx)\"\n [width]=\"10\"\n [height]=\"10\"\n ></pry-icon>\n <hvy-icon-display [event]=\"event\"></hvy-icon-display>\n <h2>{{ event.name }}</h2>\n <div class=\"o-hvy-events-detail__events__event__header__comment\">\n @if (comments$ && comments$ | async; as comments) {\n @if (comments[event.id]?.length ?? 0 > 0) {\n <span>{{\n ((comments[event.id]?.length ?? 0) > 1 ? '@hvy.event.comment.heads' : '@hvy.event.comment.head')\n | i18n: { nb: comments[event.id]?.length }\n }}</span>\n }\n }\n </div>\n <hvy-status-display\n [item]=\"event\"\n [modifiable]=\"event.status !== 'DONE'\"\n [readonly]=\"readonly\"\n (modified)=\"changeStatus($event, event)\"\n ></hvy-status-display>\n </div>\n <div class=\"o-hvy-events-detail__events__event__content\">\n @if (!opened[idx]) {\n <div>{{ '@hvy.event.log.event.description' | i18n }} : {{ event.description }}</div>\n <div>{{ '@hvy.event.log.event.address' | i18n }} : {{ event.address }}</div>\n } @else {\n @if (access(event); as accessValue) {\n <div class=\"o-hvy-events-detail__events__event__content__header\">\n <h3>{{ '@hvy.event.log.event.detail' | i18n }}</h3>\n <span class=\"required\">{{ '@hvy.event.log.event.mandatory' | i18n }}</span>\n </div>\n <table>\n <tbody>\n <tr>\n <td>{{ '@hvy.event.log.event.name' | i18n }}<span class=\"required\">*</span> :</td>\n <td>\n <input\n type=\"text\"\n class=\"a-form-field\"\n [class.-error]=\"hasError('name', idx)\"\n [value]=\"event.name\"\n (change)=\"modifyEvent(idx, 'name', $event)\"\n [readonly]=\"accessValue.name\"\n [maxLength]=\"50\"\n />\n </td>\n </tr>\n @if (event.id > 0) {\n <tr>\n <td>{{ '@hvy.event.log.event.id' | i18n }}<span class=\"required\">*</span> :</td>\n <td>\n <input type=\"text\" class=\"a-form-field\" [value]=\"padId.fn(event.id)\" [readonly]=\"true\" />\n </td>\n </tr>\n }\n <tr>\n <td>{{ '@hvy.event.log.event.category' | i18n }}<span class=\"required\">*</span> :</td>\n <td>\n <pry-select\n [ngModel]=\"event.category\"\n [items]=\"categories(event)\"\n [class.-error]=\"hasError('category', idx)\"\n (ngModelChange)=\"modifyEvent(idx, 'category', $event)\"\n i18nPrefix=\"@hvy.event.category.\"\n [disabled]=\"accessValue.category\"\n ></pry-select>\n </td>\n </tr>\n @if (event.category === 'ANOMALY') {\n <tr>\n <td>{{ '@hvy.event.subCategory.name' | i18n }} :</td>\n <td>\n <pry-select\n [ngModel]=\"event.subCategory\"\n [items]=\"subCategories\"\n [class.-error]=\"hasError('subCategory', idx)\"\n (ngModelChange)=\"modifyEvent(idx, 'subCategory', $event)\"\n i18nPrefix=\"@hvy.event.subCategory.\"\n [disabled]=\"accessValue.subCategory\"\n ></pry-select>\n </td>\n </tr>\n }\n <tr>\n <td>{{ '@hvy.event.criticality.name' | i18n }}<span class=\"required\">*</span> :</td>\n <td>\n <pry-select\n [ngModel]=\"event.criticality\"\n [items]=\"criticalities\"\n [class.-error]=\"hasError('criticality', idx)\"\n i18nPrefix=\"@hvy.event.criticality.\"\n [disabled]=\"accessValue.criticality\"\n (ngModelChange)=\"modifyEvent(idx, 'criticality', $event)\"\n ></pry-select>\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.log.event.description' | i18n }}<span class=\"required\">*</span> :</td>\n <td>\n <textarea\n [ngModel]=\"event.description\"\n class=\"a-form-field\"\n [class.-error]=\"hasError('description', idx)\"\n [readonly]=\"accessValue.description\"\n (ngModelChange)=\"modifyEvent(idx, 'description', $event)\"\n [maxLength]=\"256\"\n ></textarea>\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.log.event.address' | i18n }} :</td>\n <td>\n <textarea\n [ngModel]=\"event.address\"\n class=\"a-form-field\"\n [class.-error]=\"hasError('address', idx)\"\n [readonly]=\"accessValue.address\"\n (ngModelChange)=\"modifyEvent(idx, 'address', $event)\"\n [maxLength]=\"256\"\n ></textarea>\n </td>\n </tr>\n @if (event.category !== 'MANIFESTATION') {\n <tr>\n <td>{{ '@hvy.event.source' | i18n }} :</td>\n <td>\n <input\n type=\"text\"\n class=\"a-form-field\"\n [value]=\"event.externalSourceRef ?? ('@hvy.event.hypervisor' | i18n)\"\n [class.-error]=\"hasError('source', idx)\"\n [readonly]=\"accessValue.source\"\n (change)=\"modifyEvent(idx, 'source', $event)\"\n />\n </td>\n </tr>\n }\n <tr>\n <td>{{ '@hvy.event.equipment' | i18n }} :</td>\n <td>\n <pry-select\n [items]=\"equipments$ | async\"\n bindLabel=\"name\"\n [(ngModel)]=\"equipmentSelectValue\"\n (ngModelChange)=\"selectedEquipmentChange($event, idx)\"\n [autocomplete]=\"true\"\n [externalAutocompleteService]=\"true\"\n [placeholder]=\"'@hvy.event.equipmentPlaceholder' | i18n\"\n id=\"procedure-filter\"\n [template]=\"templateOption\"\n [class.-error]=\"hasError('equipment', idx)\"\n class=\"o-hvy-events-detail__events__event__content__equipment\"\n ></pry-select>\n <ng-template #templateOption let-item=\"item\">\n <div class=\"u-display-flex -column\">\n <span [innerHTML]=\"item.html\"></span>\n </div>\n </ng-template>\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.equipmentEntity' | i18n }} :</td>\n <td>\n <input\n type=\"text\"\n class=\"a-form-field\"\n [class.-error]=\"hasError('equipment', idx)\"\n [value]=\"\n (event.equipment?.entity ? '@hvy.event.entity.' + event.equipment?.entity : '') | i18n\n \"\n readonly\n />\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.domain.name' | i18n }} :</td>\n <td>\n <pry-select\n [items]=\"DOMAINS\"\n [ngModel]=\"event.domain\"\n i18nPrefix=\"@hvy.event.domain.\"\n [class.-error]=\"hasError('domain', idx)\"\n (ngModelChange)=\"modifyEvent(idx, 'domain', $event)\"\n [disabled]=\"accessValue.domain\"\n ></pry-select>\n </td>\n </tr>\n <tr>\n <td>\n {{ '@hvy.event.startDate' | i18n }}\n @if (event.category === 'MANIFESTATION') {\n <span class=\"required\">*</span>\n }\n :\n </td>\n <td>\n <input\n type=\"datetime-local\"\n class=\"a-form-field\"\n [value]=\"event.startDate | forDateTimeLocal\"\n [class.-error]=\"hasError('startDate', idx)\"\n [readonly]=\"accessValue.startDate\"\n (change)=\"modifyEvent(idx, 'startDate', $event)\"\n />\n </td>\n </tr>\n <tr>\n <td>\n {{ '@hvy.event.endDate' | i18n }}\n @if (event.category === 'MANIFESTATION') {\n <span class=\"required\">*</span>\n }\n :\n </td>\n <td>\n <input\n type=\"datetime-local\"\n class=\"a-form-field\"\n [value]=\"event.endDate | forDateTimeLocal\"\n [class.-error]=\"hasError('endDate', idx)\"\n [readonly]=\"accessValue.endDate\"\n (change)=\"modifyEvent(idx, 'endDate', $event)\"\n />\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.creationDate' | i18n }} :</td>\n <td>\n <input\n type=\"datetime-local\"\n class=\"a-form-field\"\n [value]=\"event.creationDate | forDateTimeLocal\"\n readonly\n />\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.lastModificationDate' | i18n }} :</td>\n <td>\n <input\n type=\"datetime-local\"\n class=\"a-form-field\"\n [value]=\"event.lastModificationDate | forDateTimeLocal\"\n readonly\n />\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.closeDate' | i18n }} :</td>\n <td>\n <input\n type=\"datetime-local\"\n class=\"a-form-field\"\n [value]=\"event.closeDate | forDateTimeLocal\"\n readonly\n />\n </td>\n </tr>\n </tbody>\n </table>\n <hvy-comments\n [comments]=\"(comments$ | async) ? (comments$ | async)![event.id] : []\"\n (commented)=\"updateComment(event, $event)\"\n [readonly]=\"readonly\"\n [type]=\"'events'\"\n [me]=\"me\"\n ></hvy-comments>\n }\n }\n </div>\n </div>\n }\n </div>\n <div class=\"o-hvy-events-detail__procedure\">\n <div class=\"o-hvy-events-detail__procedure__header\">\n <h2>\n {{ (events.length === 1 ? '@hvy.event.log.procedure.name1' : '@hvy.event.log.procedure.name') | i18n }}\n </h2>\n </div>\n @if (procedure) {\n <div class=\"o-hvy-events-detail__procedure__description\">\n <p>{{ procedure.description }}</p>\n </div>\n <div class=\"o-hvy-events-detail__procedure__progress\">\n <p>{{ '@hvy.event.log.procedure.progress' | i18n }}</p>\n <hvy-progress-display [progress]=\"calculatedProgress\"></hvy-progress-display>\n </div>\n <hvy-procedure-actions\n [readonly]=\"readonlyProcedure || readonly\"\n [enableEditActions]=\"enableEditActions\"\n [actions]=\"procedure.actions\"\n (modified)=\"modifiedActions($event)\"\n [me]=\"me\"\n ></hvy-procedure-actions>\n } @else {\n @if (!readonly) {\n <button class=\"a-btn a-btn--secondary\" [disabled]=\"!canAssociateProcedure\" (click)=\"openAssociationModal()\">\n {{ '@hvy.action.associate' | i18n }}\n </button>\n } @else {\n <span class=\"o-hvy-events-detail__procedure__empty\">{{ '@hvy.event.log.procedure.none' | i18n }}</span>\n }\n }\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #confirmDialog>\n <div\n class=\"o-hvy-close-confirm__dialog\"\n aria-labelledby=\"confirm\"\n tabindex=\"-1\"\n id=\"choice\"\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <h2>\n {{\n (changeStatusContext.events.length === 1 ? '@hvy.event.close.oneTitle' : '@hvy.event.close.multiTitle') | i18n\n }}\n </h2>\n <p>{{ (changeStatusContext.events.length === 1 ? '@hvy.event.close.one' : '@hvy.event.close.multi') | i18n }}</p>\n <ul>\n @for (event of changeStatusContext.events; track event.id) {\n <li>{{ event.name }}</li>\n }\n </ul>\n <p class=\"o-hvy-close-confirm__dialog__comment-title\">\n {{ '@hvy.event.close.comment' | i18n }}<span class=\"required\">*</span> :\n </p>\n <div class=\"o-hvy-close-confirm__dialog__comment\">\n <textarea [(ngModel)]=\"changeStatusContext.comment\" class=\"a-form-field\" [maxLength]=\"255\"></textarea>\n </div>\n <div class=\"o-hvy-close-confirm__dialog__actions\">\n <button class=\"a-btn a-btn--primary\" (click)=\"confirmedClose()\" [disabled]=\"confirmDisabled()\">\n {{ '@hvy.action.validate' | i18n }}\n </button>\n <button class=\"a-btn a-btn--secondary\" (click)=\"toggleConfirm()\">{{ '@hvy.action.cancel' | i18n }}</button>\n </div>\n </div>\n</ng-template>\n" }]
422
+ args: [{ selector: 'hvy-event-detail', template: "<div class=\"o-hvy-events-detail\">\n <div class=\"o-hvy-events-detail__header\">\n <div class=\"o-hvy-events-detail__header__split\">\n <h1>{{ title ?? '@hvy.event.detail' | i18n }}</h1>\n @if (events.length > 1) {\n @if (canCloseSome && !readonly) {\n <button class=\"a-btn a-btn--secondary -fix-right\" [disabled]=\"!canCloseSome\" (click)=\"closeAll()\">\n {{ (canCloseSome ? '@hvy.event.log.event.close' : '@hvy.event.log.event.closed') | i18n }}\n </button>\n }\n @if (!canCloseSome && closeComment && closeComment.length > 0) {\n <div class=\"a-tooltip\" [attr.data-tooltip]=\"closeComment\" data-tooltip-position=\"bottom\">\n <pry-icon iconSvg=\"i\" [height]=\"18\" [width]=\"18\">i</pry-icon>\n </div>\n }\n }\n </div>\n <div class=\"o-hvy-events-detail__header__split\">\n @if (procedure && !readonly) {\n <button class=\"a-btn a-btn--secondary\" (click)=\"openDeleteModal()\" [disabled]=\"readonlyProcedure\">\n {{ '@hvy.event.log.procedure.delete' | i18n }}\n </button>\n }\n </div>\n </div>\n <div class=\"o-hvy-events-detail__container\">\n <div class=\"o-hvy-events-detail__container__scrollable\">\n <div class=\"o-hvy-events-detail__events\">\n @for (event of events; track event.id; let idx = $index) {\n <div class=\"o-hvy-events-detail__events__event\">\n <div class=\"o-hvy-events-detail__events__event__header\">\n <pry-icon\n iconSvg=\"arrow_down_rounded\"\n [class.-rotated]=\"opened[idx]\"\n (click)=\"toggle(idx)\"\n [width]=\"10\"\n [height]=\"10\"\n ></pry-icon>\n <hvy-icon-display [event]=\"event\"></hvy-icon-display>\n <h2>{{ event.name }}</h2>\n <div class=\"o-hvy-events-detail__events__event__header__comment\">\n @if (comments$ && comments$ | async; as comments) {\n @if (comments[event.id]?.length ?? 0 > 0) {\n <span>{{\n ((comments[event.id]?.length ?? 0) > 1 ? '@hvy.event.comment.heads' : '@hvy.event.comment.head')\n | i18n: { nb: comments[event.id]?.length }\n }}</span>\n }\n }\n </div>\n <hvy-status-display\n [item]=\"event\"\n [modifiable]=\"event.status !== 'DONE'\"\n [readonly]=\"readonly\"\n (modified)=\"changeStatus($event, event)\"\n ></hvy-status-display>\n </div>\n <div class=\"o-hvy-events-detail__events__event__content\">\n @if (!opened[idx]) {\n <div>{{ '@hvy.event.log.event.description' | i18n }} : {{ event.description }}</div>\n <div>{{ '@hvy.event.log.event.address' | i18n }} : {{ event.address }}</div>\n } @else {\n @if (access(event); as accessValue) {\n <div class=\"o-hvy-events-detail__events__event__content__header\">\n <h3>{{ '@hvy.event.log.event.detail' | i18n }}</h3>\n <span class=\"required\">{{ '@hvy.event.log.event.mandatory' | i18n }}</span>\n </div>\n <table>\n <tbody>\n <tr>\n <td>{{ '@hvy.event.log.event.name' | i18n }}<span class=\"required\">*</span> :</td>\n <td>\n <input\n type=\"text\"\n class=\"a-form-field\"\n [class.-error]=\"hasError('name', idx)\"\n [value]=\"event.name\"\n (change)=\"modifyEvent(idx, 'name', $event)\"\n [readonly]=\"accessValue.name\"\n [maxLength]=\"50\"\n />\n </td>\n <td></td>\n </tr>\n @if (event.id > 0) {\n <tr>\n <td>{{ '@hvy.event.log.event.id' | i18n }}<span class=\"required\">*</span> :</td>\n <td>\n <input type=\"text\" class=\"a-form-field\" [value]=\"padId.fn(event.id)\" [readonly]=\"true\" />\n </td>\n <td></td>\n </tr>\n }\n <tr>\n <td>{{ '@hvy.event.log.event.category' | i18n }}<span class=\"required\">*</span> :</td>\n <td>\n <pry-select\n [ngModel]=\"event.category\"\n [items]=\"categories(event)\"\n [class.-error]=\"hasError('category', idx)\"\n (ngModelChange)=\"modifyEvent(idx, 'category', $event)\"\n i18nPrefix=\"@hvy.event.category.\"\n [disabled]=\"accessValue.category\"\n ></pry-select>\n </td>\n <td></td>\n </tr>\n @if (event.category === 'ANOMALY') {\n <tr>\n <td>{{ '@hvy.event.subCategory.name' | i18n }} :</td>\n <td>\n <pry-select\n [ngModel]=\"event.subCategory\"\n [items]=\"subCategories\"\n [class.-error]=\"hasError('subCategory', idx)\"\n (ngModelChange)=\"modifyEvent(idx, 'subCategory', $event)\"\n i18nPrefix=\"@hvy.event.subCategory.\"\n [disabled]=\"accessValue.subCategory\"\n ></pry-select>\n </td>\n <td></td>\n </tr>\n }\n <tr>\n <td>{{ '@hvy.event.criticality.name' | i18n }}<span class=\"required\">*</span> :</td>\n <td>\n <pry-select\n [ngModel]=\"event.criticality\"\n [items]=\"criticalities\"\n [class.-error]=\"hasError('criticality', idx)\"\n i18nPrefix=\"@hvy.event.criticality.\"\n [disabled]=\"accessValue.criticality\"\n (ngModelChange)=\"modifyEvent(idx, 'criticality', $event)\"\n ></pry-select>\n </td>\n <td></td>\n </tr>\n\n <tr>\n <td>{{ '@hvy.event.log.event.description' | i18n }}<span class=\"required\">*</span> :</td>\n <td>\n <textarea\n [ngModel]=\"event.description\"\n class=\"a-form-field\"\n [class.-error]=\"hasError('description', idx)\"\n [readonly]=\"accessValue.description\"\n (ngModelChange)=\"modifyEvent(idx, 'description', $event)\"\n [maxLength]=\"256\"\n ></textarea>\n </td>\n <td></td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.log.event.address' | i18n }} :</td>\n <td>\n <textarea\n [ngModel]=\"event.address\"\n class=\"a-form-field\"\n [class.-error]=\"hasError('address', idx)\"\n [readonly]=\"accessValue.address\"\n (ngModelChange)=\"modifyEvent(idx, 'address', $event)\"\n [maxLength]=\"256\"\n ></textarea>\n </td>\n <td></td>\n </tr>\n @if (event.category !== 'MANIFESTATION') {\n <tr>\n <td>{{ '@hvy.event.source' | i18n }} :</td>\n <td>\n <input\n type=\"text\"\n class=\"a-form-field\"\n [value]=\"event.externalSourceRef ?? ('@hvy.event.hypervisor' | i18n)\"\n [class.-error]=\"hasError('source', idx)\"\n [readonly]=\"accessValue.source\"\n (change)=\"modifyEvent(idx, 'source', $event)\"\n />\n </td>\n <td></td>\n </tr>\n }\n <tr>\n <td>{{ '@hvy.event.equipment' | i18n }} :</td>\n <td>\n <pry-select\n [items]=\"equipments$ | async\"\n bindLabel=\"name\"\n [(ngModel)]=\"equipmentSelectValue[idx]\"\n (ngModelChange)=\"selectedEquipmentChange($event, idx)\"\n [autocomplete]=\"true\"\n [externalAutocompleteService]=\"true\"\n [placeholder]=\"'@hvy.event.equipmentPlaceholder' | i18n\"\n id=\"procedure-filter\"\n [template]=\"templateOption\"\n [class.-error]=\"hasError('equipment', idx)\"\n [disabled]=\"accessValue.eqName\"\n class=\"o-hvy-events-detail__events__event__content__equipment\"\n ></pry-select>\n <ng-template #templateOption let-item=\"item\">\n <div class=\"u-display-flex -column\">\n <span [innerHTML]=\"item.html\"></span>\n </div>\n </ng-template>\n </td>\n <td>\n @if (event.equipment && event.equipment.id.length > 0) {\n <pry-icon\n iconSvg=\"i\"\n #detailHoverIcon\n (mouseenter)=\"toggleDetailsTooltip(idx)\"\n (mouseleave)=\"toggleDetailsTooltip(idx)\"\n ></pry-icon>\n }\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.equipmentEntity' | i18n }} :</td>\n <td>\n <input\n type=\"text\"\n class=\"a-form-field\"\n [class.-error]=\"hasError('equipment', idx)\"\n [value]=\"\n (event.equipment?.entity ? '@hvy.event.entity.' + event.equipment?.entity : '') | i18n\n \"\n readonly\n />\n </td>\n <td></td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.domain.name' | i18n }} :</td>\n <td>\n <pry-select\n [items]=\"DOMAINS\"\n [ngModel]=\"event.domain\"\n i18nPrefix=\"@hvy.event.domain.\"\n [class.-error]=\"hasError('domain', idx)\"\n (ngModelChange)=\"modifyEvent(idx, 'domain', $event)\"\n [disabled]=\"accessValue.domain\"\n ></pry-select>\n </td>\n <td></td>\n </tr>\n <tr>\n <td>\n {{ '@hvy.event.startDate' | i18n }}\n @if (event.category === 'MANIFESTATION') {\n <span class=\"required\">*</span>\n }\n :\n </td>\n <td>\n <input\n type=\"datetime-local\"\n class=\"a-form-field\"\n [value]=\"event.startDate | forDateTimeLocal\"\n [class.-error]=\"hasError('startDate', idx)\"\n [readonly]=\"accessValue.startDate\"\n (change)=\"modifyEvent(idx, 'startDate', $event)\"\n />\n </td>\n <td></td>\n </tr>\n <tr>\n <td>\n {{ '@hvy.event.endDate' | i18n }}\n @if (event.category === 'MANIFESTATION') {\n <span class=\"required\">*</span>\n }\n :\n </td>\n <td>\n <input\n type=\"datetime-local\"\n class=\"a-form-field\"\n [value]=\"event.endDate | forDateTimeLocal\"\n [class.-error]=\"hasError('endDate', idx)\"\n [readonly]=\"accessValue.endDate\"\n (change)=\"modifyEvent(idx, 'endDate', $event)\"\n />\n </td>\n <td></td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.creationDate' | i18n }} :</td>\n <td>\n <input\n type=\"datetime-local\"\n class=\"a-form-field\"\n [value]=\"event.creationDate | forDateTimeLocal\"\n readonly\n />\n </td>\n <td></td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.lastModificationDate' | i18n }} :</td>\n <td>\n <input\n type=\"datetime-local\"\n class=\"a-form-field\"\n [value]=\"event.lastModificationDate | forDateTimeLocal\"\n readonly\n />\n </td>\n <td></td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.closeDate' | i18n }} :</td>\n <td>\n <input\n type=\"datetime-local\"\n class=\"a-form-field\"\n [value]=\"event.closeDate | forDateTimeLocal\"\n readonly\n />\n </td>\n <td></td>\n </tr>\n </tbody>\n </table>\n <hvy-comments\n [comments]=\"(comments$ | async) ? (comments$ | async)![event.id] : []\"\n (commented)=\"updateComment(event, $event)\"\n [readonly]=\"readonly\"\n [type]=\"'events'\"\n [me]=\"me\"\n ></hvy-comments>\n }\n }\n </div>\n </div>\n }\n </div>\n <div class=\"o-hvy-events-detail__procedure\">\n <div class=\"o-hvy-events-detail__procedure__header\">\n <h2>\n {{ (events.length === 1 ? '@hvy.event.log.procedure.name1' : '@hvy.event.log.procedure.name') | i18n }}\n </h2>\n </div>\n @if (procedure) {\n <div class=\"o-hvy-events-detail__procedure__description\">\n <p>{{ procedure.description }}</p>\n </div>\n <div class=\"o-hvy-events-detail__procedure__progress\">\n <p>{{ '@hvy.event.log.procedure.progress' | i18n }}</p>\n <hvy-progress-display [progress]=\"calculatedProgress\"></hvy-progress-display>\n </div>\n <hvy-procedure-actions\n [readonly]=\"readonlyProcedure || readonly\"\n [enableEditActions]=\"enableEditActions\"\n [actions]=\"procedure.actions\"\n (modified)=\"modifiedActions($event)\"\n [me]=\"me\"\n ></hvy-procedure-actions>\n } @else {\n @if (!readonly) {\n <button class=\"a-btn a-btn--secondary\" [disabled]=\"!canAssociateProcedure\" (click)=\"openAssociationModal()\">\n {{ '@hvy.action.associate' | i18n }}\n </button>\n } @else {\n <span class=\"o-hvy-events-detail__procedure__empty\">{{ '@hvy.event.log.procedure.none' | i18n }}</span>\n }\n }\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #confirmDialog>\n <div\n class=\"o-hvy-close-confirm__dialog\"\n aria-labelledby=\"confirm\"\n tabindex=\"-1\"\n id=\"choice\"\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <h2>\n {{\n (changeStatusContext.events.length === 1 ? '@hvy.event.close.oneTitle' : '@hvy.event.close.multiTitle') | i18n\n }}\n </h2>\n <p>{{ (changeStatusContext.events.length === 1 ? '@hvy.event.close.one' : '@hvy.event.close.multi') | i18n }}</p>\n <ul>\n @for (event of changeStatusContext.events; track event.id) {\n <li>{{ event.name }}</li>\n }\n </ul>\n <p class=\"o-hvy-close-confirm__dialog__comment-title\">\n {{ '@hvy.event.close.comment' | i18n }}<span class=\"required\">*</span> :\n </p>\n <div class=\"o-hvy-close-confirm__dialog__comment\">\n <textarea [(ngModel)]=\"changeStatusContext.comment\" class=\"a-form-field\" [maxLength]=\"255\"></textarea>\n </div>\n <div class=\"o-hvy-close-confirm__dialog__actions\">\n <button class=\"a-btn a-btn--primary\" (click)=\"confirmedClose()\" [disabled]=\"confirmDisabled()\">\n {{ '@hvy.action.validate' | i18n }}\n </button>\n <button class=\"a-btn a-btn--secondary\" (click)=\"toggleConfirm()\">{{ '@hvy.action.cancel' | i18n }}</button>\n </div>\n </div>\n</ng-template>\n" }]
371
423
  }], ctorParameters: () => [{ type: i1.EquipmentService }, { type: i2.Store }, { type: i3.Overlay }, { type: i0.ViewContainerRef }, { type: i4.PryI18nService }, { type: i4.PryDialogService }, { type: i5.HypCommentsService }], propDecorators: { modifiedEvents: [{
372
424
  type: Output
373
425
  }], modifiedProcedure: [{
@@ -389,6 +441,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImpor
389
441
  args: ['confirmDialog', { read: TemplateRef }]
390
442
  }], comfirmDialogOpened: [{
391
443
  type: Output
444
+ }], detailHoverIcon: [{
445
+ type: ViewChildren,
446
+ args: ['detailHoverIcon', { read: ElementRef }]
392
447
  }], events: [{
393
448
  type: Input
394
449
  }], procedure: [{
@@ -398,4 +453,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImpor
398
453
  }], equipmentName: [{
399
454
  type: Input
400
455
  }] } });
401
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtZGV0YWlsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Byb3ZvbHkvaHlwZXJ2aXNvci9zcmMvbGliL2V2ZW50L2RldGFpbC9ldmVudC1kZXRhaWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9oeXBlcnZpc29yL3NyYy9saWIvZXZlbnQvZGV0YWlsL2V2ZW50LWRldGFpbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQW9CLE1BQU0sZUFBZSxDQUFDO0FBR2pILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ25GLE9BQU8sRUFDTCx5QkFBeUIsRUFJekIsd0JBQXdCLEVBQ3pCLE1BQU0sb0JBQW9CLENBQUM7QUFHNUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUUvRCxPQUFPLEVBQVcsYUFBYSxFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFDMUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFDTCxlQUFlLEVBQ2YsYUFBYSxFQUNiLFlBQVksRUFDWixRQUFRLEVBRVIsV0FBVyxFQUNYLE9BQU8sRUFDUCxTQUFTLEVBQ1YsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdEQsT0FBTyxLQUFLLE1BQU0scUJBQXFCLENBQUM7QUFDeEMsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sc0VBQXNFLENBQUM7QUFDMUgsT0FB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b0I7a0dBQXBCLG9CQUFvQixvakJBeUJLLFdBQVcsb0RDN0VqRCxpdGpCQTBYQTs7MkZEdFVhLG9CQUFvQjtrQkFKaEMsU0FBUzsrQkFDRSxrQkFBa0I7MlBBUWxCLGNBQWM7c0JBQXZCLE1BQU07Z0JBR0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUVHLFdBQVc7c0JBQXBCLE1BQU07Z0JBU0UsS0FBSztzQkFBYixLQUFLO2dCQUNHLEVBQUU7c0JBQVYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBRTZDLGFBQWE7c0JBQS9ELFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFDdkMsbUJBQW1CO3NCQUE1QixNQUFNO2dCQU9NLE1BQU07c0JBQWxCLEtBQUs7Z0JBa0JPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBS08sbUJBQW1CO3NCQUEvQixLQUFLO2dCQU1PLGFBQWE7c0JBQXpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHlwUHJvY2VkdXJlIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHJvY2VkdXJlL2h5cC1wcm9jZWR1cmUuaW50ZXJmYWNlJztcbmltcG9ydCB7IEh5cEV2ZW50RGV0YWlscyB9IGZyb20gJy4uLy4uL21vZGVsL2V2ZW50L2h5cC1ldmVudC1kZXRhaWwuaW50ZXJmYWNlJztcbmltcG9ydCB7IEh5cEV2ZW50Q3JpdGljYWxpdHkgfSBmcm9tICcuLi8uLi9tb2RlbC9ldmVudC9oeXAtZXZlbnQtY3JpdGljYWxpdHkudHlwZSc7XG5pbXBvcnQge1xuICBQcnlEaWFsb2dDb25maXJtQ29tcG9uZW50LFxuICBQcnlEaWFsb2dDb25maXJtRGF0YSxcbiAgUHJ5RGlhbG9nU2VydmljZSxcbiAgUHJ5STE4blNlcnZpY2UsXG4gIFN1YnNjcmlwdGlvbm5lckRpcmVjdGl2ZVxufSBmcm9tICdAcHJvdm9seS9kYXNoYm9hcmQnO1xuaW1wb3J0IHsgSHlwRXF1aXBtZW50IH0gZnJvbSAnLi4vLi4vbW9kZWwvaHlwLWVxdWlwbWVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRXF1aXBtZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3N0b3JlL2VxdWlwbWVudC9lcXVpcG1lbnQuc2VydmljZSc7XG5pbXBvcnQgeyBET01BSU5TIH0gZnJvbSAnLi4vLi4vbW9kZWwvZG9tYWlucy5jb25zdGFudCc7XG5pbXBvcnQgeyBFdmVudEFjdGlvbnMgfSBmcm9tICcuLi8uLi9zdG9yZS9ldmVudC9ldmVudC5hY3Rpb25zJztcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZywgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRlYm91bmNlVGltZSxcbiAgbWVyZ2VNYXAsXG4gIE9ic2VydmFibGUsXG4gIHNoYXJlUmVwbGF5LFxuICBTdWJqZWN0LFxuICBzd2l0Y2hNYXBcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBwYWRJZCB9IGZyb20gJy4uLy4uL2dlbmVyYWwvcGFkLWlkLmZ1bmN0aW9uJztcbmltcG9ydCBlcXVhbCBmcm9tICdmYXN0LWRlZXAtZXF1YWwvZXM2JztcbmltcG9ydCB7IFByb2NlZHVyZUFzc29jaWF0aW9uTW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi9wcm9jZWR1cmUtYXNzb2NpYXRpb24tbW9kYWwvcHJvY2VkdXJlLWFzc29jaWF0aW9uLW1vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9jZWR1cmVBY3Rpb25zIH0gZnJvbSAnLi4vLi4vc3RvcmUvcHJvY2VkdXJlL3Byb2NlZHVyZS5hY3Rpb25zJztcbmltcG9ydCB7IEh5cEV2ZW50Q2F0ZWdvcnksIEh5cEV2ZW50U3ViQ2F0ZWdvcnkgfSBmcm9tICcuLi8uLi9tb2RlbC9ldmVudC9oeXAtZXZlbnQtY2F0ZWdvcnkudHlwZSc7XG5pbXBvcnQgeyBIeXBDb21tZW50c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zdG9yZS9jb21tZW50cy9jb21tZW50cy5zZXJ2aWNlJztcbmltcG9ydCB7IEh5cENvbW1lbnQgfSBmcm9tICcuLi8uLi9tb2RlbC9jb21tZW50LmludGVyZmFjZSc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAsIHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuZXhwb3J0IHR5cGUgQ2hhbmdlU3RhdHVzQ29udGV4dCA9IHtcbiAgY29tbWVudDogc3RyaW5nO1xuICBldmVudHM6IEh5cEV2ZW50RGV0YWlsc1tdO1xuICBzdGF0dXM6IHN0cmluZztcbiAgYWxsOiBib29sZWFuO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBIeXBFcXVpcG1lbnRXaXRoTWF0Y2hpbmcgZXh0ZW5kcyBIeXBFcXVpcG1lbnQge1xuICBodG1sOiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2h2eS1ldmVudC1kZXRhaWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vZXZlbnQtZGV0YWlsLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBFdmVudERldGFpbENvbXBvbmVudCBleHRlbmRzIFN1YnNjcmlwdGlvbm5lckRpcmVjdGl2ZSB7XG4gIG9wZW5lZDogYm9vbGVhbltdID0gW107XG4gIGNyaXRpY2FsaXRpZXMgPSBIeXBFdmVudENyaXRpY2FsaXR5LnZhbHVlcztcbiAgX2V2ZW50czogSHlwRXZlbnREZXRhaWxzW10gPSBbXTtcbiAgZXZlbnRNb2RpZmljYXRpb25zOiBQYXJ0aWFsPEh5cEV2ZW50RGV0YWlscz5bXSA9IFtdO1xuICBAT3V0cHV0KCkgbW9kaWZpZWRFdmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPFtQYXJ0aWFsPEh5cEV2ZW50RGV0YWlscz4sIEh5cEV2ZW50RGV0YWlsc11bXT4oKTtcbiAgX3Byb2NlZHVyZT86IEh5cFByb2NlZHVyZTtcbiAgcHJvY2VkdXJlTW9kaWZpY2F0aW9uczogUGFydGlhbDxIeXBQcm9jZWR1cmU+ID0ge307XG4gIEBPdXRwdXQoKSBtb2RpZmllZFByb2NlZHVyZSA9IG5ldyBFdmVudEVtaXR0ZXI8W1BhcnRpYWw8SHlwUHJvY2VkdXJlPiwgSHlwUHJvY2VkdXJlXSB8IHVuZGVmaW5lZD4oKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IERPTUFJTlMgPSBET01BSU5TLnZhbHVlcztcbiAgQE91dHB1dCgpIGV2ZW50RXJyb3JzID0gbmV3IEV2ZW50RW1pdHRlcjx7IGZpZWxkOiBzdHJpbmc7IGNvZGU6IHN0cmluZyB9W11bXT4oKTtcbiAgZXJyb3JzOiB7IGZpZWxkOiBzdHJpbmc7IGNvZGU6IHN0cmluZyB9W11bXSA9IFtdO1xuICBjYW5DbG9zZVNvbWUgPSBmYWxzZTtcbiAgY2hhbmdlU3RhdHVzQ29udGV4dDogQ2hhbmdlU3RhdHVzQ29udGV4dCA9IHtcbiAgICBjb21tZW50OiAnJyxcbiAgICBldmVudHM6IFtdLFxuICAgIHN0YXR1czogJ0RPTkUnLFxuICAgIGFsbDogZmFsc2VcbiAgfTtcbiAgQElucHV0KCkgdGl0bGU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG1lPzogc3RyaW5nIHwgbnVsbDtcbiAgQElucHV0KCkgcmVhZG9ubHk6IGJvb2xlYW4gfCBudWxsID0gZmFsc2U7XG4gIEBJbnB1dCgpIHJlYWRvbmx5UHJvY2VkdXJlOiBib29sZWFuIHwgbnVsbCA9IGZhbHNlO1xuICBASW5wdXQoKSBlbmFibGVFZGl0QWN0aW9uczogYm9vbGVhbiB8IG51bGwgPSBmYWxzZTtcbiAgb3ZlcmxheVJlZj86IE92ZXJsYXlSZWY7XG4gIEBWaWV3Q2hpbGQoJ2NvbmZpcm1EaWFsb2cnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pIGNvbmZpcm1EaWFsb2chOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAT3V0cHV0KCkgY29tZmlybURpYWxvZ09wZW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhbmdlU3RhdHVzQ29udGV4dD4oKTtcbiAgdHJpZ2dlckNvbW1lbnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx2b2lkPih1bmRlZmluZWQpO1xuICBjb21tZW50cyQ/OiBPYnNlcnZhYmxlPHsgW3A6IG51bWJlcl06IEh5cENvbW1lbnRbXSB9PjtcbiAgb25FcXVpcG1lbnRTZWFyY2gkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgZXF1aXBtZW50U2VsZWN0VmFsdWU/OiBzdHJpbmcgfCBIeXBFcXVpcG1lbnQ7XG4gIGVxdWlwbWVudHMkOiBPYnNlcnZhYmxlPEh5cEVxdWlwbWVudFdpdGhNYXRjaGluZ1tdPjtcblxuICBASW5wdXQoKSBzZXQgZXZlbnRzKGV2ZW50czogSHlwRXZlbnREZXRhaWxzW10pIHtcbiAgICB0aGlzLl9ldmVudHMgPSBldmVudHMuZmlsdGVyKChldikgPT4gISFldik7XG4gICAgdGhpcy5ldmVudE1vZGlmaWNhdGlvbnMgPSBuZXcgQXJyYXkodGhpcy5fZXZlbnRzLmxlbmd0aCk7XG4gICAgdGhpcy5vcGVuZWQgPSB0aGlzLl9ldmVudHMubGVuZ3RoID09PSAxID8gW3RydWVdIDogW107XG4gICAgdGhpcy5jYW5DbG9zZVNvbWUgPSB0aGlzLl9ldmVudHMuZmlsdGVyKChldikgPT4gZXYuc3RhdHVzICE9PSAnRE9ORScpLmxlbmd0aCA+IDA7XG4gICAgdGhpcy5jb21tZW50cyQgPSB0aGlzLnRyaWdnZXJDb21tZW50JC5waXBlKFxuICAgICAgbWVyZ2VNYXAoKCkgPT5cbiAgICAgICAgY29tYmluZUxhdGVzdChcbiAgICAgICAgICB0aGlzLl9ldmVudHMubWFwKChldmVudCkgPT5cbiAgICAgICAgICAgIHRoaXMuY29tbWVudHNTZXJ2aWNlLmdldChldmVudC5pZCwgJ2V2ZW50cycpLnBpcGUobWFwKChjb21tZW50cykgPT4gKHsgW2V2ZW50LmlkXTogY29tbWVudHMgfSkpKVxuICAgICAgICAgIClcbiAgICAgICAgKS5waXBlKG1hcCgoYWxsKSA9PiBhbGwucmVkdWNlKChwLCBjKSA9PiAoeyAuLi5wLCAuLi5jIH0pLCB7fSkpKVxuICAgICAgKSxcbiAgICAgIHN0YXJ0V2l0aCh7fSksXG4gICAgICBzaGFyZVJlcGxheSgpXG4gICAgKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBwcm9jZWR1cmUocHJvY2VkdXJlOiBIeXBQcm9jZWR1cmUpIHtcbiAgICB0aGlzLl9wcm9jZWR1cmUgPSBwcm9jZWR1cmU7XG4gICAgdGhpcy5wcm9jZWR1cmVNb2RpZmljYXRpb25zID0ge307XG4gIH1cblxuICBASW5wdXQoKSBzZXQgY2FuY2VsTW9kaWZpY2F0aW9ucyhldnQ6IGFueSkge1xuICAgIHRoaXMuZXZlbnRNb2RpZmljYXRpb25zID0gbmV3IEFycmF5KHRoaXMuX2V2ZW50cy5sZW5ndGgpO1xuICAgIHRoaXMucHJvY2VkdXJlTW9kaWZpY2F0aW9ucyA9IHt9O1xuICAgIHRoaXMuX291dHB1dE1vZGlmaWNhdGlvbnMoKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBlcXVpcG1lbnROYW1lKHJlcXVlc3Q6IHsgaW5kZXg6IG51bWJlcjsgZXF1aXBtZW50TmFtZT86IHN0cmluZyB9KSB7XG4gICAgaWYgKHJlcXVlc3QuZXF1aXBtZW50TmFtZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZEVxdWlwbWVudENoYW5nZShyZXF1ZXN0LmVxdWlwbWVudE5hbWUsIHJlcXVlc3QuaW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZXF1aXBtZW50U2VydmljZTogRXF1aXBtZW50U2VydmljZSxcbiAgICBwcml2YXRlIHN0b3JlOiBTdG9yZSxcbiAgICBwcml2YXRlIG92ZXJsYXk6IE92ZXJsYXksXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgaTE4blNlcnZpY2U6IFByeUkxOG5TZXJ2aWNlLFxuICAgIHByaXZhdGUgcHJ5RGlhbG9nOiBQcnlEaWFsb2dTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29tbWVudHNTZXJ2aWNlOiBIeXBDb21tZW50c1NlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuZXF1aXBtZW50cyQgPSB0aGlzLm9uRXF1aXBtZW50U2VhcmNoJC5waXBlKHN0YXJ0V2l0aCgpLCBkZWJvdW5jZVRpbWUoNTAwKSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlYXJjaCA9XG4gICAgICAgICAgdHlwZW9mIHRoaXMuZXF1aXBtZW50U2VsZWN0VmFsdWUgPT09ICdzdHJpbmcnICYmIHRoaXMuZXF1aXBtZW50U2VsZWN0VmFsdWUubGVuZ3RoID4gMlxuICAgICAgICAgICAgPyB0aGlzLmVxdWlwbWVudFNlbGVjdFZhbHVlXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXF1aXBtZW50U2VydmljZS5zZWFyY2goc2VhcmNoKS5waXBlKFxuICAgICAgICAgIG1hcCgoZXF1aXBtZW50cykgPT5cbiAgICAgICAgICAgIGVxdWlwbWVudHMubWFwKChlcXVpcG1lbnQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVnZXggPSBSZWdFeHAoYCgke3NlYXJjaH0pYCA/PyAnKC8tLy0vKScsICdnaWQnKTtcbiAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGAke2VxdWlwbWVudC5uYW1lfSAtICR7dGhpcy5pMThuU2VydmljZS5pbnN0YW50KCdAaHZ5LmV2ZW50LmZhbWlseS4nICsgZXF1aXBtZW50LmZhbWlseSl9YDtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5lcXVpcG1lbnQsXG4gICAgICAgICAgICAgICAgaHRtbDogaHRtbC5yZXBsYWNlQWxsKHJlZ2V4LCAobWF0Y2hlZDogc3RyaW5nLCBjYXB0dXJlMTogc3RyaW5nKSA9PiBgPGI+JHtjYXB0dXJlMX08L2I+YClcbiAgICAgICAgICAgICAgfSBhcyBIeXBFcXVpcG1lbnRXaXRoTWF0Y2hpbmc7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcigoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU2VhcmNoIEVxdWlwbWVudCBwcm9ibGVtJyk7XG4gICAgICB9KSxcbiAgICAgIHNoYXJlUmVwbGF5KClcbiAgICApO1xuICB9XG5cbiAgZ2V0IGV2ZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fZXZlbnRzLm1hcCgoZXZ0LCBpZHgpID0+ICh7IC4uLmV2dCwgLi4uKHRoaXMuZXZlbnRNb2RpZmljYXRpb25zW2lkeF0gPz8ge30pIH0pKTtcbiAgfVxuXG4gIGdldCBjYW5Bc3NvY2lhdGVQcm9jZWR1cmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50cy5ldmVyeSgoZXZ0KSA9PiBldnQuc3RhdHVzID09PSAnTkVXJyk7XG4gIH1cblxuICBnZXQgcHJvY2VkdXJlKCk6IEh5cFByb2NlZHVyZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb2NlZHVyZVxuICAgICAgPyB7XG4gICAgICAgICAgLi4udGhpcy5fcHJvY2VkdXJlLFxuICAgICAgICAgIC4uLih0aGlzLnByb2NlZHVyZU1vZGlmaWNhdGlvbnMgPz8ge30pLFxuICAgICAgICAgIGV2ZW50czogdGhpcy5ldmVudHNcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXQgY2xvc2VDb21tZW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvY2VkdXJlPy5jbG9zZUNvbW1lbnQgPz8gJyc7XG4gIH1cblxuICB0b2dnbGUoaTogbnVtYmVyKSB7XG4gICAgdGhpcy5vcGVuZWRbaV0gPSAhdGhpcy5vcGVuZWRbaV07XG4gIH1cblxuICBtb2RpZnlFdmVudChpbmRleDogbnVtYmVyLCBwcm9wOiBzdHJpbmcsICRldmVudDogRXZlbnQgfCBzdHJpbmcpIHtcbiAgICBjb25zdCBpc0RhdGUgPSBwcm9wLmluZGV4T2YoJ0RhdGUnKSA+IC0xO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBuZXdWYWx1ZSA9ICRldmVudCBpbnN0YW5jZW9mIEV2ZW50ID8gJGV2ZW50LnRhcmdldD8udmFsdWUgOiAkZXZlbnQ7XG5cbiAgICBjb25zdCBjb3JyZWN0ZWRWYWx1ZSA9ICFpc0RhdGUgPyBuZXdWYWx1ZSA6IHRoaXMuY29udmVydERhdGUobmV3VmFsdWUpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodGhpcy5fZXZlbnRzW2luZGV4XVtwcm9wXSAhPT0gY29ycmVjdGVkVmFsdWUpIHtcbiAgICAgIGlmICghdGhpcy5ldmVudE1vZGlmaWNhdGlvbnNbaW5kZXhdKSB7XG4gICAgICAgIHRoaXMuZXZlbnRNb2RpZmljYXRpb25zW2luZGV4XSA9IHt9O1xuICAgICAgfVxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5ldmVudE1vZGlmaWNhdGlvbnNbaW5kZXhdW3Byb3BdID0gY29ycmVjdGVkVmFsdWU7XG5cbiAgICAgIHRoaXMuX291dHB1dE1vZGlmaWNhdGlvbnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEhdGhpcy5ldmVudE1vZGlmaWNhdGlvbnNbaW5kZXhdKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZGVsZXRlIHRoaXMuZXZlbnRNb2RpZmljYXRpb25zW2luZGV4XVtwcm9wXTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuZXZlbnRNb2RpZmljYXRpb25zW2luZGV4XSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuZXZlbnRNb2RpZmljYXRpb25zW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vdXRwdXRNb2RpZmljYXRpb25zKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWNjZXNzKGV2ZW50OiBIeXBFdmVudERldGFpbHMpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnJlYWRvbmx5IHx8XG4gICAgICBldmVudC5zdGF0dXMgPT09ICdET05FJyB8fFxuICAgICAgKFsnTElNSVQnLCAnT1VUT0ZPUkRFUicsICdBTk9NQUxZJ10uaW5jbHVkZXMoZXZlbnQuY2F0ZWdvcnkpICYmIGV2ZW50LmV4dGVybmFsU291cmNlUmVmKVxuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogdHJ1ZSxcbiAgICAgICAgY2F0ZWdvcnk6IHRydWUsXG4gICAgICAgIHN1YkNhdGVnb3J5OiB0cnVlLFxuICAgICAgICBjcml0aWNhbGl0eTogdHJ1ZSxcbiAgICAgICAgZGVzY3JpcHRpb246IHRydWUsXG4gICAgICAgIGFkZHJlc3M6IHRydWUsXG4gICAgICAgIHNvdXJjZTogdHJ1ZSxcbiAgICAgICAgZG9tYWluOiB0cnVlLFxuICAgICAgICBlcU5hbWU6IHRydWUsXG4gICAgICAgIGVxRW50aXR5OiB0cnVlLFxuICAgICAgICBzdGFydERhdGU6IHRydWUsXG4gICAgICAgIGVuZERhdGU6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBmYWxzZSxcbiAgICAgIGNhdGVnb3J5OiBmYWxzZSxcbiAgICAgIHN1YkNhdGVnb3J5OiBmYWxzZSxcbiAgICAgIGNyaXRpY2FsaXR5OiBmYWxzZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBmYWxzZSxcbiAgICAgIGFkZHJlc3M6IGZhbHNlLFxuICAgICAgc291cmNlOiB0cnVlLFxuICAgICAgZG9tYWluOiBmYWxzZSxcbiAgICAgIGVxTmFtZTogZmFsc2UsXG4gICAgICBlcUVudGl0eTogZmFsc2UsXG4gICAgICBzdGFydERhdGU6IGZhbHNlLFxuICAgICAgZW5kRGF0ZTogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgX291dHB1dE1vZGlmaWNhdGlvbnMoKSB7XG4gICAgdGhpcy52YWxpZGF0ZUV2ZW50cyh0aGlzLmV2ZW50cyk7XG4gICAgdGhpcy5tb2RpZmllZEV2ZW50cy5uZXh0KHRoaXMuZXZlbnRzLm1hcCgoZXYsIGlkeCkgPT4gW3RoaXMuZXZlbnRNb2RpZmljYXRpb25zW2lkeF0sIGV2XSkpO1xuICAgIHRoaXMubW9kaWZpZWRQcm9jZWR1cmUubmV4dCh0aGlzLnByb2NlZHVyZSA/IFt0aGlzLnByb2NlZHVyZU1vZGlmaWNhdGlvbnMsIHRoaXMucHJvY2VkdXJlIV0gOiB1bmRlZmluZWQpO1xuICB9XG5cbiAgdmFsaWRhdGVFdmVudHMoZXZlbnRzOiBIeXBFdmVudERldGFpbHNbXSkge1xuICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgZXZlbnRzLmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBldmVudEVycm9ycyA9IFtdO1xuICAgICAgaWYgKCFldmVudC5uYW1lIHx8IGV2ZW50Lm5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGV2ZW50RXJyb3JzLnB1c2goeyBmaWVsZDogJ25hbWUnLCBjb2RlOiAncmVxdWlyZWQnIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCFldmVudC5jYXRlZ29yeSB8fCBldmVudC5jYXRlZ29yeS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZXZlbnRFcnJvcnMucHVzaCh7IGZpZWxkOiAnY2F0ZWdvcnknLCBjb2RlOiAncmVxdWlyZWQnIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCFldmVudC5jcml0aWNhbGl0eSB8fCBldmVudC5jcml0aWNhbGl0eS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZXZlbnRFcnJvcnMucHVzaCh7IGZpZWxkOiAnY3JpdGljYWxpdHknLCBjb2RlOiAncmVxdWlyZWQnIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCFldmVudC5kZXNjcmlwdGlvbiB8fCBldmVudC5kZXNjcmlwdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZXZlbnRFcnJvcnMucHVzaCh7IGZpZWxkOiAnZGVzY3JpcHRpb24nLCBjb2RlOiAncmVxdWlyZWQnIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCEhZXZlbnQuZXF1aXBtZW50ICYmIGV2ZW50LmVxdWlwbWVudC5pZCA9PT0gJ25vdC1mb3VuZCcpIHtcbiAgICAgICAgZXZlbnRFcnJvcnMucHVzaCh7IGZpZWxkOiAnZXF1aXBtZW50JywgY29kZTogJ25vdC1mb3VuZCcgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQuY2F0ZWdvcnkgPT09ICdNQU5JRkVTVEFUSU9OJykge1xuICAgICAgICBpZiAoIWV2ZW50LnN0YXJ0RGF0ZSB8fCBldmVudC5zdGFydERhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZXZlbnRFcnJvcnMucHVzaCh7IGZpZWxkOiAnc3RhcnREYXRlJywgY29kZTogJ3JlcXVpcmVkJyB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWV2ZW50LmVuZERhdGUgfHwgZXZlbnQuZW5kRGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBldmVudEVycm9ycy5wdXNoKHsgZmllbGQ6ICdlbmREYXRlJywgY29kZTogJ3JlcXVpcmVkJyB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGV2ZW50LnN0YXJ0RGF0ZT8ubG9jYWxlQ29tcGFyZShldmVudC5lbmREYXRlID8/ICcnKSA/PyAwKSA+IDApIHtcbiAgICAgICAgICBldmVudEVycm9ycy5wdXNoKHsgZmllbGQ6ICdzdGFydERhdGUnLCBjb2RlOiAnYmVmb3JlJyB9KTtcbiAgICAgICAgICBldmVudEVycm9ycy5wdXNoKHsgZmllbGQ6ICdlbmREYXRlJywgY29kZTogJ2FmdGVyJyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5lcnJvcnMucHVzaChldmVudEVycm9ycyk7XG4gICAgfSk7XG4gICAgdGhpcy5ldmVudEVycm9ycy5uZXh0KHRoaXMuZXJyb3JzKTtcbiAgfVxuXG4gIGhhc0Vycm9yKHByb3A6IHN0cmluZywgaWR4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5lcnJvcnNbaWR4XT8uZmluZCgoZXJyKSA9PiBlcnIuZmllbGQgPT09IHByb3ApID8/IGZhbHNlO1xuICB9XG5cbiAgY2F0ZWdvcmllcyhldmVudDogSHlwRXZlbnREZXRhaWxzKSB7XG4gICAgcmV0dXJuIEh5cEV2ZW50Q2F0ZWdvcnkudmFsdWVzO1xuICB9XG5cbiAgY2hhbmdlU3RhdHVzKCRldmVudDogc3RyaW5nLCBldmVudDogSHlwRXZlbnREZXRhaWxzKSB7XG4gICAgdGhpcy5jaGFuZ2VTdGF0dXNDb250ZXh0LmV2ZW50cyA9IFtldmVudF07XG4gICAgdGhpcy5jaGFuZ2VTdGF0dXNDb250ZXh0LnN0YXR1cyA9ICRldmVudDtcbiAgICB0aGlzLmNoYW5nZVN0YXR1c0NvbnRleHQuYWxsID0gZmFsc2U7XG4gICAgdGhpcy50b2dnbGVDb25maXJtKCk7XG4gIH1cblxuICBjbG9zZUFsbCgpIHtcbiAgICB0aGlzLmNoYW5nZVN0YXR1c0NvbnRleHQuYWxsID0gdHJ1ZTtcbiAgICB0aGlzLmNoYW5nZVN0YXR1c0NvbnRleHQuZXZlbnRzID0gdGhpcy5ldmVudHM7XG4gICAgdGhpcy5jaGFuZ2VTdGF0dXNDb250ZXh0LnN0YXR1cyA9ICdET05FJztcbiAgICB0aGlzLnRvZ2dsZUNvbmZpcm0oKTtcbiAgfVxuXG4gIGNvbmZpcm1lZENsb3NlKCkge1xuICAgIGlmICh0aGlzLmNoYW5nZVN0YXR1c0NvbnRleHQuYWxsKSB7XG4gICAgICBpZiAoIXRoaXMucHJvY2VkdXJlKSB7XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goXG4gICAgICAgICAgRXZlbnRBY3Rpb25zLnN0YXR1cyh7XG4gICAgICAgICAgICB0YXJnZXRTdGF0dXM6IHRoaXMuY2hhbmdlU3RhdHVzQ29udGV4dC5zdGF0dXMsXG4gICAgICAgICAgICBldmVudDogdGhpcy5jaGFuZ2VTdGF0dXNDb250ZXh0LmV2ZW50c1swXSxcbiAgICAgICAgICAgIHByb2NlZHVyZTogdGhpcy5wcm9jZWR1cmUsXG4gICAgICAgICAgICBjb21tZW50OiB0aGlzLmNoYW5nZVN0YXR1c0NvbnRleHQuY29tbWVudFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgICAgIEV2ZW50QWN0aW9ucy5zdGF0dXMoe1xuICAgICAgICAgICAgdGFyZ2V0U3RhdHVzOiB0aGlzLmNoYW5nZVN0YXR1c0NvbnRleHQuc3RhdHVzLFxuICAgICAgICAgICAgcHJvY2VkdXJlOiB0aGlzLnByb2NlZHVyZSxcbiAgICAgICAgICAgIGNvbW1lbnQ6IHRoaXMuY2hhbmdlU3RhdHVzQ29udGV4dC5jb21tZW50XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgICAgRXZlbnRBY3Rpb25zLnN0YXR1cyh7XG4gICAgICAgICAgdGFyZ2V0U3RhdHVzOiB0aGlzLmNoYW5nZVN0YXR1c0NvbnRleHQuc3RhdHVzLFxuICAgICAgICAgIGV2ZW50OiB0aGlzLmNoYW5nZVN0YXR1c0NvbnRleHQuZXZlbnRzWzBdLFxuICAgICAgICAgIHByb2NlZHVyZTogdGhpcy5wcm9jZWR1cmUsXG4gICAgICAgICAgY29tbWVudDogdGhpcy5jaGFuZ2VTdGF0dXNDb250ZXh0LmNvbW1lbnRcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudG9nZ2xlQ29uZmlybSgpO1xuICB9XG5cbiAgdG9nZ2xlQ29uZmlybSgpIHtcbiAgICBpZiAoIXRoaXMub3ZlcmxheVJlZikge1xuICAgICAgdGhpcy5jb21maXJtRGlhbG9nT3BlbmVkLm5leHQodGhpcy5jaGFuZ2VTdGF0dXNDb250ZXh0KTtcbiAgICAgIHRoaXMub3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoXG4gICAgICAgIG5ldyBPdmVybGF5Q29uZmlnKHtcbiAgICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcbiAgICAgICAgICBiYWNrZHJvcENsYXNzOiAnYmFja2Ryb3AtZGFyaycsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydvLWh2eS1jbG9zZS1jb25maXJtJ11cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnRvZ2dsZUNvbmZpcm0oKSk7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLmNvbmZpcm1EaWFsb2csIHRoaXMudmlld0NvbnRhaW5lclJlZikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICAgICAgdGhpcy5vdmVybGF5UmVmID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLmNoYW5nZVN0YXR1c0NvbnRleHQuY29tbWVudCA9ICcnO1xuICB9XG5cbiAgY29uZmlybURpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmNoYW5nZVN0YXR1c0NvbnRleHQuY29tbWVudC5sZW5ndGggPT09IDA7XG4gIH1cblxuICBnZXQgY2FsY3VsYXRlZFByb2dyZXNzKCkge1xuICAgIGlmICh0aGlzLnByb2NlZHVyZSEuYWN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5yb3VuZChcbiAgICAgICh0aGlzLnByb2NlZHVyZSEuYWN0aW9ucy5maWx0ZXIoKGFjdGlvbikgPT4gYWN0aW9uLnN0YXR1cyA9PT0gJ0RPTkUnKS5sZW5ndGggLyB0aGlzLnByb2NlZHVyZSEuYWN0aW9ucy5sZW5ndGgpICpcbiAgICAgICAgMTAwXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSBwYWRJZCA9IHBhZElkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3ViQ2F0ZWdvcmllcyA9IFt1bmRlZmluZWQsIC4uLkh5cEV2ZW50U3ViQ2F0ZWdvcnkudmFsdWVzWydBTk9NQUxZJ11dO1xuXG4gIG1vZGlmaWVkQWN0aW9ucygkZXZlbnQ6IGFueSkge1xuICAgIGlmIChlcXVhbCgkZXZlbnQsIHRoaXMuX3Byb2NlZHVyZSEuYWN0aW9ucykpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnByb2NlZHVyZU1vZGlmaWNhdGlvbnMuYWN0aW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9jZWR1cmVNb2RpZmljYXRpb25zLmFjdGlvbnMgPSAkZXZlbnQ7XG4gICAgfVxuICAgIHRoaXMuX291dHB1dE1vZGlmaWNhdGlvbnMoKTtcbiAgfVxuXG4gIG9wZW5Bc3NvY2lhdGlvbk1vZGFsKCkge1xuICAgIGNvbnN0IHJlZiA9IHRoaXMucHJ5RGlhbG9nLm9wZW4oUHJvY2VkdXJlQXNzb2NpYXRpb25Nb2RhbENvbXBvbmVudCwge1xuICAgICAgYmFja2Ryb3BDbGFzczogJ28taHZ5LWFzc29jaWF0aW9uLW1vZGFsX19iYWNrZHJvcCdcbiAgICB9KTtcbiAgICBpZiAoISFyZWYgJiYgISFyZWYuY29tcG9uZW50KSB7XG4gICAgICByZWYuY29tcG9uZW50LmV2ZW50cyA9IHRoaXMuZXZlbnRzO1xuICAgIH1cbiAgfVxuXG4gIG9wZW5EZWxldGVNb2RhbCgpIHtcbiAgICBjb25zdCBkYXRhOiBQcnlEaWFsb2dDb25maXJtRGF0YSA9IHtcbiAgICAgIHRpdGxlOiAnQGNoaC5ldmVudC5kZWxldGVUJyxcbiAgICAgIG1lc3NhZ2U6IHRoaXMuaTE4blNlcnZpY2UuaW5zdGFudCh0aGlzLmV2ZW50cy5sZW5ndGggPiAxID8gJ0BjaGguZXZlbnQuZGVsZXRlTSsnIDogJ0BjaGguZXZlbnQuZGVsZXRlTTEnLCB7XG4gICAgICAgIG5iRXZlbnRzOiB0aGlzLmV2ZW50cy5sZW5ndGhcbiAgICAgIH0pLFxuICAgICAgYWN0aW9uczogW1xuICAgICAgICB7IGlkOiAwLCBsYWJlbDogJ0BjaGguYWN0aW9uLmNhbmNlbCcsIGNvbG9yOiAnc2Vjb25kYXJ5JyB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IDEsXG4gICAgICAgICAgbGFiZWw6ICdAY2hoLmFjdGlvbi5jb25maXJtJyxcbiAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICBQcm9jZWR1cmVBY3Rpb25zLmRlbGV0ZUluc3RhbmNlKHtcbiAgICAgICAgICAgICAgaWQ6IHRoaXMucHJvY2VkdXJlIS5pZCxcbiAgICAgICAgICAgICAgcmV0dXJuVG9FdmVudDogdGhpcy5ldmVudHMubGVuZ3RoID09PSAxID8gdGhpcy5ldmVudHNbMF0uaWQgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfTtcbiAgICB0aGlzLnByeURpYWxvZy5vcGVuKFByeURpYWxvZ0NvbmZpcm1Db21wb25lbnQsIHsgZGF0YSwgYmFja2Ryb3BDbGFzczogJ2JhY2tkcm9wLWRhcmsnIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RGF0ZShuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKG5ld1ZhbHVlKS50b0lTT1N0cmluZygpO1xuICB9XG5cbiAgdXBkYXRlQ29tbWVudChldmVudDogSHlwRXZlbnREZXRhaWxzLCBjb21tZW50OiB7IGlkOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZyB9KSB7XG4gICAgdGhpcy5jb21tZW50c1NlcnZpY2Uuc2F2ZShldmVudC5pZCwgJ2V2ZW50cycsIGNvbW1lbnQpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnRyaWdnZXJDb21tZW50JC5uZXh0KCk7XG4gICAgfSk7XG4gIH1cblxuICBzZWxlY3RlZEVxdWlwbWVudENoYW5nZSgkZXZlbnQ6IHN0cmluZyB8IEh5cEVxdWlwbWVudCwgaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuZXF1aXBtZW50U2VsZWN0VmFsdWUgPSAkZXZlbnQ7XG4gICAgdGhpcy5vbkVxdWlwbWVudFNlYXJjaCQubmV4dCgpO1xuICAgIGlmICh0eXBlb2YgJGV2ZW50ID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHRoaXMuX2V2ZW50c1tpbmRleF0uZXF1aXBtZW50Py5uYW1lICE9PSAkZXZlbnQubmFtZSkge1xuICAgICAgICBpZiAoIXRoaXMuZXZlbnRNb2RpZmljYXRpb25zW2luZGV4XSkge1xuICAgICAgICAgIHRoaXMuZXZlbnRNb2RpZmljYXRpb25zW2luZGV4XSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5ldmVudE1vZGlmaWNhdGlvbnNbaW5kZXhdLmVxdWlwbWVudCA9ICRldmVudDtcbiAgICAgICAgdGhpcy5fb3V0cHV0TW9kaWZpY2F0aW9ucygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCEhdGhpcy5ldmVudE1vZGlmaWNhdGlvbnNbaW5kZXhdKSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGRlbGV0ZSB0aGlzLmV2ZW50TW9kaWZpY2F0aW9uc1tpbmRleF0uZXF1aXBtZW50O1xuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmV2ZW50TW9kaWZpY2F0aW9uc1tpbmRleF0pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuZXZlbnRNb2RpZmljYXRpb25zW2luZGV4XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fb3V0cHV0TW9kaWZpY2F0aW9ucygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiby1odnktZXZlbnRzLWRldGFpbFwiPlxuICA8ZGl2IGNsYXNzPVwiby1odnktZXZlbnRzLWRldGFpbF9faGVhZGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cIm8taHZ5LWV2ZW50cy1kZXRhaWxfX2hlYWRlcl9fc3BsaXRcIj5cbiAgICAgIDxoMT57eyB0aXRsZSA/PyAnQGh2eS5ldmVudC5kZXRhaWwnIHwgaTE4biB9fTwvaDE+XG4gICAgICBAaWYgKGV2ZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIEBpZiAoY2FuQ2xvc2VTb21lICYmICFyZWFkb25seSkge1xuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhLWJ0biBhLWJ0bi0tc2Vjb25kYXJ5IC1maXgtcmlnaHRcIiBbZGlzYWJsZWRdPVwiIWNhbkNsb3NlU29tZVwiIChjbGljayk9XCJjbG9zZUFsbCgpXCI+XG4gICAgICAgICAgICB7eyAoY2FuQ2xvc2VTb21lID8gJ0BodnkuZXZlbnQubG9nLmV2ZW50LmNsb3NlJyA6ICdAaHZ5LmV2ZW50LmxvZy5ldmVudC5jbG9zZWQnKSB8IGkxOG4gfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKCFjYW5DbG9zZVNvbWUgJiYgY2xvc2VDb21tZW50ICYmIGNsb3NlQ29tbWVudC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImEtdG9vbHRpcFwiIFthdHRyLmRhdGEtdG9vbHRpcF09XCJjbG9zZUNvbW1lbnRcIiBkYXRhLXRvb2x0aXAtcG9zaXRpb249XCJib3R0b21cIj5cbiAgICAgICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwiaVwiIFtoZWlnaHRdPVwiMThcIiBbd2lkdGhdPVwiMThcIj5pPC9wcnktaWNvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19oZWFkZXJfX3NwbGl0XCI+XG4gICAgICBAaWYgKHByb2NlZHVyZSAmJiAhcmVhZG9ubHkpIHtcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImEtYnRuIGEtYnRuLS1zZWNvbmRhcnlcIiAoY2xpY2spPVwib3BlbkRlbGV0ZU1vZGFsKClcIiBbZGlzYWJsZWRdPVwicmVhZG9ubHlQcm9jZWR1cmVcIj5cbiAgICAgICAgICB7eyAnQGh2eS5ldmVudC5sb2cucHJvY2VkdXJlLmRlbGV0ZScgfCBpMThuIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm8taHZ5LWV2ZW50cy1kZXRhaWxfX2NvbnRhaW5lclwiPlxuICAgIDxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19jb250YWluZXJfX3Njcm9sbGFibGVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19ldmVudHNcIj5cbiAgICAgICAgQGZvciAoZXZlbnQgb2YgZXZlbnRzOyB0cmFjayBldmVudC5pZDsgbGV0IGlkeCA9ICRpbmRleCkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19ldmVudHNfX2V2ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiby1odnktZXZlbnRzLWRldGFpbF9fZXZlbnRzX19ldmVudF9faGVhZGVyXCI+XG4gICAgICAgICAgICAgIDxwcnktaWNvblxuICAgICAgICAgICAgICAgIGljb25Tdmc9XCJhcnJvd19kb3duX3JvdW5kZWRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy4tcm90YXRlZF09XCJvcGVuZWRbaWR4XVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZShpZHgpXCJcbiAgICAgICAgICAgICAgICBbd2lkdGhdPVwiMTBcIlxuICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiMTBcIlxuICAgICAgICAgICAgICA+PC9wcnktaWNvbj5cbiAgICAgICAgICAgICAgPGh2eS1pY29uLWRpc3BsYXkgW2V2ZW50XT1cImV2ZW50XCI+PC9odnktaWNvbi1kaXNwbGF5PlxuICAgICAgICAgICAgICA8aDI+e3sgZXZlbnQubmFtZSB9fTwvaDI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19ldmVudHNfX2V2ZW50X19oZWFkZXJfX2NvbW1lbnRcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGNvbW1lbnRzJCAmJiBjb21tZW50cyQgfCBhc3luYzsgYXMgY29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgIEBpZiAoY29tbWVudHNbZXZlbnQuaWRdPy5sZW5ndGggPz8gMCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tcbiAgICAgICAgICAgICAgICAgICAgICAoKGNvbW1lbnRzW2V2ZW50LmlkXT8ubGVuZ3RoID8/IDApID4gMSA/ICdAaHZ5LmV2ZW50LmNvbW1lbnQuaGVhZHMnIDogJ0BodnkuZXZlbnQuY29tbWVudC5oZWFkJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgaTE4bjogeyBuYjogY29tbWVudHNbZXZlbnQuaWRdPy5sZW5ndGggfVxuICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8aHZ5LXN0YXR1cy1kaXNwbGF5XG4gICAgICAgICAgICAgICAgW2l0ZW1dPVwiZXZlbnRcIlxuICAgICAgICAgICAgICAgIFttb2RpZmlhYmxlXT1cImV2ZW50LnN0YXR1cyAhPT0gJ0RPTkUnXCJcbiAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgIChtb2RpZmllZCk9XCJjaGFuZ2VTdGF0dXMoJGV2ZW50LCBldmVudClcIlxuICAgICAgICAgICAgICA+PC9odnktc3RhdHVzLWRpc3BsYXk+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19ldmVudHNfX2V2ZW50X19jb250ZW50XCI+XG4gICAgICAgICAgICAgIEBpZiAoIW9wZW5lZFtpZHhdKSB7XG4gICAgICAgICAgICAgICAgPGRpdj57eyAnQGh2eS5ldmVudC5sb2cuZXZlbnQuZGVzY3JpcHRpb24nIHwgaTE4biB9fSA6IHt7IGV2ZW50LmRlc2NyaXB0aW9uIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj57eyAnQGh2eS5ldmVudC5sb2cuZXZlbnQuYWRkcmVzcycgfCBpMThuIH19IDoge3sgZXZlbnQuYWRkcmVzcyB9fTwvZGl2PlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICBAaWYgKGFjY2VzcyhldmVudCk7IGFzIGFjY2Vzc1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiby1odnktZXZlbnRzLWRldGFpbF9fZXZlbnRzX19ldmVudF9fY29udGVudF9faGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoMz57eyAnQGh2eS5ldmVudC5sb2cuZXZlbnQuZGV0YWlsJyB8IGkxOG4gfX08L2gzPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+e3sgJ0BodnkuZXZlbnQubG9nLmV2ZW50Lm1hbmRhdG9yeScgfCBpMThuIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8dGFibGU+XG4gICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgJ0BodnkuZXZlbnQubG9nLmV2ZW50Lm5hbWUnIHwgaTE4biB9fTxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPiA6PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuLWVycm9yXT1cImhhc0Vycm9yKCduYW1lJywgaWR4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImV2ZW50Lm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwibW9kaWZ5RXZlbnQoaWR4LCAnbmFtZScsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJhY2Nlc3NWYWx1ZS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4TGVuZ3RoXT1cIjUwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGV2ZW50LmlkID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgJ0BodnkuZXZlbnQubG9nLmV2ZW50LmlkJyB8IGkxOG4gfX08c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj4gOjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImEtZm9ybS1maWVsZFwiIFt2YWx1ZV09XCJwYWRJZC5mbihldmVudC5pZClcIiBbcmVhZG9ubHldPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgJ0BodnkuZXZlbnQubG9nLmV2ZW50LmNhdGVnb3J5JyB8IGkxOG4gfX08c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj4gOjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZXZlbnQuY2F0ZWdvcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJjYXRlZ29yaWVzKGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLi1lcnJvcl09XCJoYXNFcnJvcignY2F0ZWdvcnknLCBpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJtb2RpZnlFdmVudChpZHgsICdjYXRlZ29yeScsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5QcmVmaXg9XCJAaHZ5LmV2ZW50LmNhdGVnb3J5LlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFjY2Vzc1ZhbHVlLmNhdGVnb3J5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGV2ZW50LmNhdGVnb3J5ID09PSAnQU5PTUFMWScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ICdAaHZ5LmV2ZW50LnN1YkNhdGVnb3J5Lm5hbWUnIHwgaTE4biB9fSA6PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJldmVudC5zdWJDYXRlZ29yeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwic3ViQ2F0ZWdvcmllc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuLWVycm9yXT1cImhhc0Vycm9yKCdzdWJDYXRlZ29yeScsIGlkeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwibW9kaWZ5RXZlbnQoaWR4LCAnc3ViQ2F0ZWdvcnknLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5QcmVmaXg9XCJAaHZ5LmV2ZW50LnN1YkNhdGVnb3J5LlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYWNjZXNzVmFsdWUuc3ViQ2F0ZWdvcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgJ0BodnkuZXZlbnQuY3JpdGljYWxpdHkubmFtZScgfCBpMThuIH19PHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+IDo8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImV2ZW50LmNyaXRpY2FsaXR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwiY3JpdGljYWxpdGllc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLi1lcnJvcl09XCJoYXNFcnJvcignY3JpdGljYWxpdHknLCBpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMThuUHJlZml4PVwiQGh2eS5ldmVudC5jcml0aWNhbGl0eS5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhY2Nlc3NWYWx1ZS5jcml0aWNhbGl0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwibW9kaWZ5RXZlbnQoaWR4LCAnY3JpdGljYWxpdHknLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgJ0BodnkuZXZlbnQubG9nLmV2ZW50LmRlc2NyaXB0aW9uJyB8IGkxOG4gfX08c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj4gOjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImV2ZW50LmRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLi1lcnJvcl09XCJoYXNFcnJvcignZGVzY3JpcHRpb24nLCBpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiYWNjZXNzVmFsdWUuZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm1vZGlmeUV2ZW50KGlkeCwgJ2Rlc2NyaXB0aW9uJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heExlbmd0aF09XCIyNTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgJ0BodnkuZXZlbnQubG9nLmV2ZW50LmFkZHJlc3MnIHwgaTE4biB9fSA6PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZXZlbnQuYWRkcmVzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy4tZXJyb3JdPVwiaGFzRXJyb3IoJ2FkZHJlc3MnLCBpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiYWNjZXNzVmFsdWUuYWRkcmVzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwibW9kaWZ5RXZlbnQoaWR4LCAnYWRkcmVzcycsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhMZW5ndGhdPVwiMjU2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChldmVudC5jYXRlZ29yeSAhPT0gJ01BTklGRVNUQVRJT04nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyAnQGh2eS5ldmVudC5zb3VyY2UnIHwgaTE4biB9fSA6PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImV2ZW50LmV4dGVybmFsU291cmNlUmVmID8/ICgnQGh2eS5ldmVudC5oeXBlcnZpc29yJyB8IGkxOG4pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy4tZXJyb3JdPVwiaGFzRXJyb3IoJ3NvdXJjZScsIGlkeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImFjY2Vzc1ZhbHVlLnNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm1vZGlmeUV2ZW50KGlkeCwgJ3NvdXJjZScsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgJ0BodnkuZXZlbnQuZXF1aXBtZW50JyB8IGkxOG4gfX0gOjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImVxdWlwbWVudHMkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRMYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZXF1aXBtZW50U2VsZWN0VmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNlbGVjdGVkRXF1aXBtZW50Q2hhbmdlKCRldmVudCwgaWR4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9jb21wbGV0ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZXh0ZXJuYWxBdXRvY29tcGxldGVTZXJ2aWNlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInQGh2eS5ldmVudC5lcXVpcG1lbnRQbGFjZWhvbGRlcicgfCBpMThuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cInByb2NlZHVyZS1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJ0ZW1wbGF0ZU9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLi1lcnJvcl09XCJoYXNFcnJvcignZXF1aXBtZW50JywgaWR4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19ldmVudHNfX2V2ZW50X19jb250ZW50X19lcXVpcG1lbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RlbXBsYXRlT3B0aW9uIGxldC1pdGVtPVwiaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1LWRpc3BsYXktZmxleCAtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cIml0ZW0uaHRtbFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgJ0BodnkuZXZlbnQuZXF1aXBtZW50RW50aXR5JyB8IGkxOG4gfX0gOjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLi1lcnJvcl09XCJoYXNFcnJvcignZXF1aXBtZW50JywgaWR4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV2ZW50LmVxdWlwbWVudD8uZW50aXR5ID8gJ0BodnkuZXZlbnQuZW50aXR5LicgKyBldmVudC5lcXVpcG1lbnQ/LmVudGl0eSA6ICcnKSB8IGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ICdAaHZ5LmV2ZW50LmRvbWFpbi5uYW1lJyB8IGkxOG4gfX0gOjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cIkRPTUFJTlNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImV2ZW50LmRvbWFpblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4blByZWZpeD1cIkBodnkuZXZlbnQuZG9tYWluLlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLi1lcnJvcl09XCJoYXNFcnJvcignZG9tYWluJywgaWR4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwibW9kaWZ5RXZlbnQoaWR4LCAnZG9tYWluJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFjY2Vzc1ZhbHVlLmRvbWFpblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAnQGh2eS5ldmVudC5zdGFydERhdGUnIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGV2ZW50LmNhdGVnb3J5ID09PSAnTUFOSUZFU1RBVElPTicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZXZlbnQuc3RhcnREYXRlIHwgZm9yRGF0ZVRpbWVMb2NhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLi1lcnJvcl09XCJoYXNFcnJvcignc3RhcnREYXRlJywgaWR4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImFjY2Vzc1ZhbHVlLnN0YXJ0RGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJtb2RpZnlFdmVudChpZHgsICdzdGFydERhdGUnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdAaHZ5LmV2ZW50LmVuZERhdGUnIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGV2ZW50LmNhdGVnb3J5ID09PSAnTUFOSUZFU1RBVElPTicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZXZlbnQuZW5kRGF0ZSB8IGZvckRhdGVUaW1lTG9jYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy4tZXJyb3JdPVwiaGFzRXJyb3IoJ2VuZERhdGUnLCBpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiYWNjZXNzVmFsdWUuZW5kRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJtb2RpZnlFdmVudChpZHgsICdlbmREYXRlJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ICdAaHZ5LmV2ZW50LmNyZWF0aW9uRGF0ZScgfCBpMThuIH19IDo8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZXZlbnQuY3JlYXRpb25EYXRlIHwgZm9yRGF0ZVRpbWVMb2NhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgJ0BodnkuZXZlbnQubGFzdE1vZGlmaWNhdGlvbkRhdGUnIHwgaTE4biB9fSA6PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImV2ZW50Lmxhc3RNb2RpZmljYXRpb25EYXRlIHwgZm9yRGF0ZVRpbWVMb2NhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgJ0BodnkuZXZlbnQuY2xvc2VEYXRlJyB8IGkxOG4gfX0gOjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJldmVudC5jbG9zZURhdGUgfCBmb3JEYXRlVGltZUxvY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICAgIDxodnktY29tbWVudHNcbiAgICAgICAgICAgICAgICAgICAgW2NvbW1lbnRzXT1cIihjb21tZW50cyQgfCBhc3luYykgPyAoY29tbWVudHMkIHwgYXN5bmMpIVtldmVudC5pZF0gOiBbXVwiXG4gICAgICAgICAgICAgICAgICAgIChjb21tZW50ZWQpPVwidXBkYXRlQ29tbWVudChldmVudCwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cIidldmVudHMnXCJcbiAgICAgICAgICAgICAgICAgICAgW21lXT1cIm1lXCJcbiAgICAgICAgICAgICAgICAgID48L2h2eS1jb21tZW50cz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19wcm9jZWR1cmVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm8taHZ5LWV2ZW50cy1kZXRhaWxfX3Byb2NlZHVyZV9faGVhZGVyXCI+XG4gICAgICAgICAgPGgyPlxuICAgICAgICAgICAge3sgKGV2ZW50cy5sZW5ndGggPT09IDEgPyAnQGh2eS5ldmVudC5sb2cucHJvY2VkdXJlLm5hbWUxJyA6ICdAaHZ5LmV2ZW50LmxvZy5wcm9jZWR1cmUubmFtZScpIHwgaTE4biB9fVxuICAgICAgICAgIDwvaDI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYgKHByb2NlZHVyZSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19wcm9jZWR1cmVfX2Rlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICA8cD57eyBwcm9jZWR1cmUuZGVzY3JpcHRpb24gfX08L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm8taHZ5LWV2ZW50cy1kZXRhaWxfX3Byb2NlZHVyZV9fcHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgIDxwPnt7ICdAaHZ5LmV2ZW50LmxvZy5wcm9jZWR1cmUucHJvZ3Jlc3MnIHwgaTE4biB9fTwvcD5cbiAgICAgICAgICAgIDxodnktcHJvZ3Jlc3MtZGlzcGxheSBbcHJvZ3Jlc3NdPVwiY2FsY3VsYXRlZFByb2dyZXNzXCI+PC9odnktcHJvZ3Jlc3MtZGlzcGxheT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8aHZ5LXByb2NlZHVyZS1hY3Rpb25zXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlQcm9jZWR1cmUgfHwgcmVhZG9ubHlcIlxuICAgICAgICAgICAgW2VuYWJsZUVkaXRBY3Rpb25zXT1cImVuYWJsZUVkaXRBY3Rpb25zXCJcbiAgICAgICAgICAgIFthY3Rpb25zXT1cInByb2NlZHVyZS5hY3Rpb25zXCJcbiAgICAgICAgICAgIChtb2RpZmllZCk9XCJtb2RpZmllZEFjdGlvbnMoJGV2ZW50KVwiXG4gICAgICAgICAgICBbbWVdPVwibWVcIlxuICAgICAgICAgID48L2h2eS1wcm9jZWR1cmUtYWN0aW9ucz5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgQGlmICghcmVhZG9ubHkpIHtcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhLWJ0biBhLWJ0bi0tc2Vjb25kYXJ5XCIgW2Rpc2FibGVkXT1cIiFjYW5Bc3NvY2lhdGVQcm9jZWR1cmVcIiAoY2xpY2spPVwib3BlbkFzc29jaWF0aW9uTW9kYWwoKVwiPlxuICAgICAgICAgICAgICB7eyAnQGh2eS5hY3Rpb24uYXNzb2NpYXRlJyB8IGkxOG4gfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19wcm9jZWR1cmVfX2VtcHR5XCI+e3sgJ0BodnkuZXZlbnQubG9nLnByb2NlZHVyZS5ub25lJyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNjb25maXJtRGlhbG9nPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJvLWh2eS1jbG9zZS1jb25maXJtX19kaWFsb2dcIlxuICAgIGFyaWEtbGFiZWxsZWRieT1cImNvbmZpcm1cIlxuICAgIHRhYmluZGV4PVwiLTFcIlxuICAgIGlkPVwiY2hvaWNlXCJcbiAgICByb2xlPVwiZGlhbG9nXCJcbiAgICBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gID5cbiAgICA8aDI+XG4gICAgICB7e1xuICAgICAgICAoY2hhbmdlU3RhdHVzQ29udGV4dC5ldmVudHMubGVuZ3RoID09PSAxID8gJ0BodnkuZXZlbnQuY2xvc2Uub25lVGl0bGUnIDogJ0BodnkuZXZlbnQuY2xvc2UubXVsdGlUaXRsZScpIHwgaTE4blxuICAgICAgfX1cbiAgICA8L2gyPlxuICAgIDxwPnt7IChjaGFuZ2VTdGF0dXNDb250ZXh0LmV2ZW50cy5sZW5ndGggPT09IDEgPyAnQGh2eS5ldmVudC5jbG9zZS5vbmUnIDogJ0BodnkuZXZlbnQuY2xvc2UubXVsdGknKSB8IGkxOG4gfX08L3A+XG4gICAgPHVsPlxuICAgICAgQGZvciAoZXZlbnQgb2YgY2hhbmdlU3RhdHVzQ29udGV4dC5ldmVudHM7IHRyYWNrIGV2ZW50LmlkKSB7XG4gICAgICAgIDxsaT57eyBldmVudC5uYW1lIH19PC9saT5cbiAgICAgIH1cbiAgICA8L3VsPlxuICAgIDxwIGNsYXNzPVwiby1odnktY2xvc2UtY29uZmlybV9fZGlhbG9nX19jb21tZW50LXRpdGxlXCI+XG4gICAgICB7eyAnQGh2eS5ldmVudC5jbG9zZS5jb21tZW50JyB8IGkxOG4gfX08c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj4gOlxuICAgIDwvcD5cbiAgICA8ZGl2IGNsYXNzPVwiby1odnktY2xvc2UtY29uZmlybV9fZGlhbG9nX19jb21tZW50XCI+XG4gICAgICA8dGV4dGFyZWEgWyhuZ01vZGVsKV09XCJjaGFuZ2VTdGF0dXNDb250ZXh0LmNvbW1lbnRcIiBjbGFzcz1cImEtZm9ybS1maWVsZFwiIFttYXhMZW5ndGhdPVwiMjU1XCI+PC90ZXh0YXJlYT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiby1odnktY2xvc2UtY29uZmlybV9fZGlhbG9nX19hY3Rpb25zXCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYS1idG4gYS1idG4tLXByaW1hcnlcIiAoY2xpY2spPVwiY29uZmlybWVkQ2xvc2UoKVwiIFtkaXNhYmxlZF09XCJjb25maXJtRGlzYWJsZWQoKVwiPlxuICAgICAgICB7eyAnQGh2eS5hY3Rpb24udmFsaWRhdGUnIHwgaTE4biB9fVxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYS1idG4gYS1idG4tLXNlY29uZGFyeVwiIChjbGljayk9XCJ0b2dnbGVDb25maXJtKClcIj57eyAnQGh2eS5hY3Rpb24uY2FuY2VsJyB8IGkxOG4gfX08L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
456
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtZGV0YWlsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Byb3ZvbHkvaHlwZXJ2aXNvci9zcmMvbGliL2V2ZW50L2RldGFpbC9ldmVudC1kZXRhaWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9oeXBlcnZpc29yL3NyYy9saWIvZXZlbnQvZGV0YWlsL2V2ZW50LWRldGFpbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFFTixXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFFYixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNuRixPQUFPLEVBQ0wseUJBQXlCLEVBTXpCLHdCQUF3QixFQUN6QixNQUFNLG9CQUFvQixDQUFDO0FBRzVCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFL0QsT0FBTyxFQUFXLGFBQWEsRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixZQUFZLEVBQ1osUUFBUSxFQUVSLFdBQVcsRUFDWCxPQUFPLEVBQ1AsU0FBUyxFQUNWLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3RELE9BQU8sS0FBSyxNQUFNLHFCQUFxQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHNF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LENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7OEdBeGNVLG9CQUFvQjtrR0FBcEIsb0JBQW9CLG9qQkF5QkssV0FBVyxnR0FPTixVQUFVLG9EQ25HckQsMHhsQkFxWkE7OzJGRGxWYSxvQkFBb0I7a0JBSmhDLFNBQVM7K0JBQ0Usa0JBQWtCOzJQQVFsQixjQUFjO3NCQUF2QixNQUFNO2dCQUdHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFFRyxXQUFXO3NCQUFwQixNQUFNO2dCQVNFLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUU2QyxhQUFhO3NCQUEvRCxTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBQ3ZDLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFNZ0QsZUFBZTtzQkFBckUsWUFBWTt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBRXhDLE1BQU07c0JBQWxCLEtBQUs7Z0JBdUJPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBS08sbUJBQW1CO3NCQUEvQixLQUFLO2dCQU1PLGFBQWE7c0JBQXpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG4gIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIeXBQcm9jZWR1cmUgfSBmcm9tICcuLi8uLi9tb2RlbC9wcm9jZWR1cmUvaHlwLXByb2NlZHVyZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSHlwRXZlbnREZXRhaWxzIH0gZnJvbSAnLi4vLi4vbW9kZWwvZXZlbnQvaHlwLWV2ZW50LWRldGFpbC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSHlwRXZlbnRDcml0aWNhbGl0eSB9IGZyb20gJy4uLy4uL21vZGVsL2V2ZW50L2h5cC1ldmVudC1jcml0aWNhbGl0eS50eXBlJztcbmltcG9ydCB7XG4gIFByeURpYWxvZ0NvbmZpcm1Db21wb25lbnQsXG4gIFByeURpYWxvZ0NvbmZpcm1EYXRhLFxuICBQcnlEaWFsb2dSZWYsXG4gIFByeURpYWxvZ1NlcnZpY2UsXG4gIFByeUkxOG5TZXJ2aWNlLFxuICBQcnlJY29uQ29tcG9uZW50LFxuICBTdWJzY3JpcHRpb25uZXJEaXJlY3RpdmVcbn0gZnJvbSAnQHByb3ZvbHkvZGFzaGJvYXJkJztcbmltcG9ydCB7IEh5cEVxdWlwbWVudCB9IGZyb20gJy4uLy4uL21vZGVsL2h5cC1lcXVpcG1lbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IEVxdWlwbWVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zdG9yZS9lcXVpcG1lbnQvZXF1aXBtZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgRE9NQUlOUyB9IGZyb20gJy4uLy4uL21vZGVsL2RvbWFpbnMuY29uc3RhbnQnO1xuaW1wb3J0IHsgRXZlbnRBY3Rpb25zIH0gZnJvbSAnLi4vLi4vc3RvcmUvZXZlbnQvZXZlbnQuYWN0aW9ucyc7XG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7IE92ZXJsYXksIE92ZXJsYXlDb25maWcsIE92ZXJsYXlSZWYgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBUZW1wbGF0ZVBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBkZWJvdW5jZVRpbWUsXG4gIG1lcmdlTWFwLFxuICBPYnNlcnZhYmxlLFxuICBzaGFyZVJlcGxheSxcbiAgU3ViamVjdCxcbiAgc3dpdGNoTWFwXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgcGFkSWQgfSBmcm9tICcuLi8uLi9nZW5lcmFsL3BhZC1pZC5mdW5jdGlvbic7XG5pbXBvcnQgZXF1YWwgZnJvbSAnZmFzdC1kZWVwLWVxdWFsL2VzNic7XG5pbXBvcnQgeyBQcm9jZWR1cmVBc3NvY2lhdGlvbk1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vcHJvY2VkdXJlLWFzc29jaWF0aW9uLW1vZGFsL3Byb2NlZHVyZS1hc3NvY2lhdGlvbi1tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUHJvY2VkdXJlQWN0aW9ucyB9IGZyb20gJy4uLy4uL3N0b3JlL3Byb2NlZHVyZS9wcm9jZWR1cmUuYWN0aW9ucyc7XG5pbXBvcnQgeyBIeXBFdmVudENhdGVnb3J5LCBIeXBFdmVudFN1YkNhdGVnb3J5IH0gZnJvbSAnLi4vLi4vbW9kZWwvZXZlbnQvaHlwLWV2ZW50LWNhdGVnb3J5LnR5cGUnO1xuaW1wb3J0IHsgSHlwQ29tbWVudHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc3RvcmUvY29tbWVudHMvY29tbWVudHMuc2VydmljZSc7XG5pbXBvcnQgeyBIeXBDb21tZW50IH0gZnJvbSAnLi4vLi4vbW9kZWwvY29tbWVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBIeXBTZXJ2aWNlVG9vbHRpcCB9IGZyb20gJy4uLy4uL21vZGVsL2V2ZW50L2h5cC1ldmVudC10b29sdGlwLmludGVyZmFjZSc7XG5pbXBvcnQgeyBIdnlFdmVudERldGFpbHNUb29sdGlwQ29tcG9uZW50IH0gZnJvbSAnLi9ldmVudC1kZXRhaWxzLXRvb2x0aXAuY29tcG9uZW50JztcblxuZXhwb3J0IHR5cGUgQ2hhbmdlU3RhdHVzQ29udGV4dCA9IHtcbiAgY29tbWVudDogc3RyaW5nO1xuICBldmVudHM6IEh5cEV2ZW50RGV0YWlsc1tdO1xuICBzdGF0dXM6IHN0cmluZztcbiAgYWxsOiBib29sZWFuO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBIeXBFcXVpcG1lbnRXaXRoTWF0Y2hpbmcgZXh0ZW5kcyBIeXBFcXVpcG1lbnQge1xuICBodG1sOiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2h2eS1ldmVudC1kZXRhaWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vZXZlbnQtZGV0YWlsLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBFdmVudERldGFpbENvbXBvbmVudCBleHRlbmRzIFN1YnNjcmlwdGlvbm5lckRpcmVjdGl2ZSB7XG4gIG9wZW5lZDogYm9vbGVhbltdID0gW107XG4gIGNyaXRpY2FsaXRpZXMgPSBIeXBFdmVudENyaXRpY2FsaXR5LnZhbHVlcztcbiAgX2V2ZW50czogSHlwRXZlbnREZXRhaWxzW10gPSBbXTtcbiAgZXZlbnRNb2RpZmljYXRpb25zOiBQYXJ0aWFsPEh5cEV2ZW50RGV0YWlscz5bXSA9IFtdO1xuICBAT3V0cHV0KCkgbW9kaWZpZWRFdmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPFtQYXJ0aWFsPEh5cEV2ZW50RGV0YWlscz4sIEh5cEV2ZW50RGV0YWlsc11bXT4oKTtcbiAgX3Byb2NlZHVyZT86IEh5cFByb2NlZHVyZTtcbiAgcHJvY2VkdXJlTW9kaWZpY2F0aW9uczogUGFydGlhbDxIeXBQcm9jZWR1cmU+ID0ge307XG4gIEBPdXRwdXQoKSBtb2RpZmllZFByb2NlZHVyZSA9IG5ldyBFdmVudEVtaXR0ZXI8W1BhcnRpYWw8SHlwUHJvY2VkdXJlPiwgSHlwUHJvY2VkdXJlXSB8IHVuZGVmaW5lZD4oKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IERPTUFJTlMgPSBET01BSU5TLnZhbHVlcztcbiAgQE91dHB1dCgpIGV2ZW50RXJyb3JzID0gbmV3IEV2ZW50RW1pdHRlcjx7IGZpZWxkOiBzdHJpbmc7IGNvZGU6IHN0cmluZyB9W11bXT4oKTtcbiAgZXJyb3JzOiB7IGZpZWxkOiBzdHJpbmc7IGNvZGU6IHN0cmluZyB9W11bXSA9IFtdO1xuICBjYW5DbG9zZVNvbWUgPSBmYWxzZTtcbiAgY2hhbmdlU3RhdHVzQ29udGV4dDogQ2hhbmdlU3RhdHVzQ29udGV4dCA9IHtcbiAgICBjb21tZW50OiAnJyxcbiAgICBldmVudHM6IFtdLFxuICAgIHN0YXR1czogJ0RPTkUnLFxuICAgIGFsbDogZmFsc2VcbiAgfTtcbiAgQElucHV0KCkgdGl0bGU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG1lPzogc3RyaW5nIHwgbnVsbDtcbiAgQElucHV0KCkgcmVhZG9ubHk6IGJvb2xlYW4gfCBudWxsID0gZmFsc2U7XG4gIEBJbnB1dCgpIHJlYWRvbmx5UHJvY2VkdXJlOiBib29sZWFuIHwgbnVsbCA9IGZhbHNlO1xuICBASW5wdXQoKSBlbmFibGVFZGl0QWN0aW9uczogYm9vbGVhbiB8IG51bGwgPSBmYWxzZTtcbiAgb3ZlcmxheVJlZj86IE92ZXJsYXlSZWY7XG4gIEBWaWV3Q2hpbGQoJ2NvbmZpcm1EaWFsb2cnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pIGNvbmZpcm1EaWFsb2chOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAT3V0cHV0KCkgY29tZmlybURpYWxvZ09wZW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhbmdlU3RhdHVzQ29udGV4dD4oKTtcbiAgdHJpZ2dlckNvbW1lbnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx2b2lkPih1bmRlZmluZWQpO1xuICBjb21tZW50cyQ/OiBPYnNlcnZhYmxlPHsgW3A6IG51bWJlcl06IEh5cENvbW1lbnRbXSB9PjtcbiAgb25FcXVpcG1lbnRTZWFyY2gkID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xuICBlcXVpcG1lbnRTZWxlY3RWYWx1ZTogKHN0cmluZyB8IEh5cEVxdWlwbWVudCB8IHVuZGVmaW5lZClbXSA9IFtdO1xuICBlcXVpcG1lbnRzJDogT2JzZXJ2YWJsZTxIeXBFcXVpcG1lbnRXaXRoTWF0Y2hpbmdbXT47XG4gIEBWaWV3Q2hpbGRyZW4oJ2RldGFpbEhvdmVySWNvbicsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBkZXRhaWxIb3Zlckljb24hOiBRdWVyeUxpc3Q8RWxlbWVudFJlZjxQcnlJY29uQ29tcG9uZW50Pj47XG5cbiAgQElucHV0KCkgc2V0IGV2ZW50cyhldmVudHM6IEh5cEV2ZW50RGV0YWlsc1tdKSB7XG4gICAgdGhpcy5fZXZlbnRzID0gZXZlbnRzLmZpbHRlcigoZXYpID0+ICEhZXYpO1xuICAgIHRoaXMuZXZlbnRNb2RpZmljYXRpb25zID0gbmV3IEFycmF5KHRoaXMuX2V2ZW50cy5sZW5ndGgpO1xuICAgIHRoaXMub3BlbmVkID0gdGhpcy5fZXZlbnRzLmxlbmd0aCA9PT0gMSA/IFt0cnVlXSA6IFtdO1xuICAgIHRoaXMuY2FuQ2xvc2VTb21lID0gdGhpcy5fZXZlbnRzLmZpbHRlcigoZXYpID0+IGV2LnN0YXR1cyAhPT0gJ0RPTkUnKS5sZW5ndGggPiAwO1xuICAgIHRoaXMuY29tbWVudHMkID0gdGhpcy50cmlnZ2VyQ29tbWVudCQucGlwZShcbiAgICAgIG1lcmdlTWFwKCgpID0+XG4gICAgICAgIGNvbWJpbmVMYXRlc3QoXG4gICAgICAgICAgdGhpcy5fZXZlbnRzLm1hcCgoZXZlbnQpID0+XG4gICAgICAgICAgICB0aGlzLmNvbW1lbnRzU2VydmljZS5nZXQoZXZlbnQuaWQsICdldmVudHMnKS5waXBlKG1hcCgoY29tbWVudHMpID0+ICh7IFtldmVudC5pZF06IGNvbW1lbnRzIH0pKSlcbiAgICAgICAgICApXG4gICAgICAgICkucGlwZShtYXAoKGFsbCkgPT4gYWxsLnJlZHVjZSgocCwgYykgPT4gKHsgLi4ucCwgLi4uYyB9KSwge30pKSlcbiAgICAgICksXG4gICAgICBzdGFydFdpdGgoe30pLFxuICAgICAgc2hhcmVSZXBsYXkoKVxuICAgICk7XG4gICAgdGhpcy5fZXZlbnRzLmZvckVhY2goKGV2LCBpZHgpID0+IHtcbiAgICAgIGlmIChldi5lcXVpcG1lbnQgJiYgZXYuZXF1aXBtZW50LmlkICYmIGV2LmVxdWlwbWVudC5pZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRFcXVpcG1lbnRDaGFuZ2UoZXYuZXF1aXBtZW50IGFzIHVua25vd24gYXMgSHlwRXF1aXBtZW50LCBpZHgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHByb2NlZHVyZShwcm9jZWR1cmU6IEh5cFByb2NlZHVyZSkge1xuICAgIHRoaXMuX3Byb2NlZHVyZSA9IHByb2NlZHVyZTtcbiAgICB0aGlzLnByb2NlZHVyZU1vZGlmaWNhdGlvbnMgPSB7fTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBjYW5jZWxNb2RpZmljYXRpb25zKGV2dDogYW55KSB7XG4gICAgdGhpcy5ldmVudE1vZGlmaWNhdGlvbnMgPSBuZXcgQXJyYXkodGhpcy5fZXZlbnRzLmxlbmd0aCk7XG4gICAgdGhpcy5wcm9jZWR1cmVNb2RpZmljYXRpb25zID0ge307XG4gICAgdGhpcy5fb3V0cHV0TW9kaWZpY2F0aW9ucygpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGVxdWlwbWVudE5hbWUocmVxdWVzdDogeyBpbmRleDogbnVtYmVyOyBlcXVpcG1lbnROYW1lPzogc3RyaW5nIH0pIHtcbiAgICBpZiAocmVxdWVzdC5lcXVpcG1lbnROYW1lKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRXF1aXBtZW50Q2hhbmdlKHJlcXVlc3QuZXF1aXBtZW50TmFtZSwgcmVxdWVzdC5pbmRleCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlcXVpcG1lbnRTZXJ2aWNlOiBFcXVpcG1lbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3RvcmU6IFN0b3JlLFxuICAgIHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheSxcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBpMThuU2VydmljZTogUHJ5STE4blNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwcnlEaWFsb2c6IFByeURpYWxvZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb21tZW50c1NlcnZpY2U6IEh5cENvbW1lbnRzU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5lcXVpcG1lbnRzJCA9IHRoaXMub25FcXVpcG1lbnRTZWFyY2gkLnBpcGUoc3RhcnRXaXRoKCksIGRlYm91bmNlVGltZSg1MDApKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlYXJjaCA9XG4gICAgICAgICAgdHlwZW9mIHRoaXMuZXF1aXBtZW50U2VsZWN0VmFsdWVbaW5kZXhdID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICh0aGlzLmVxdWlwbWVudFNlbGVjdFZhbHVlW2luZGV4XSBhcyBzdHJpbmcpLmxlbmd0aCA+IDJcbiAgICAgICAgICAgID8gKHRoaXMuZXF1aXBtZW50U2VsZWN0VmFsdWVbaW5kZXhdIGFzIHN0cmluZylcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdGhpcy5lcXVpcG1lbnRTZXJ2aWNlLnNlYXJjaChzZWFyY2gpLnBpcGUoXG4gICAgICAgICAgbWFwKChlcXVpcG1lbnRzKSA9PlxuICAgICAgICAgICAgZXF1aXBtZW50cy5tYXAoKGVxdWlwbWVudCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCByZWdleCA9IFJlZ0V4cChgKCR7c2VhcmNofSlgID8/ICcoLy0vLS8pJywgJ2dpZCcpO1xuICAgICAgICAgICAgICBjb25zdCBodG1sID0gYCR7ZXF1aXBtZW50Lm5hbWV9IC0gJHt0aGlzLmkxOG5TZXJ2aWNlLmluc3RhbnQoJ0BodnkuZXZlbnQuZmFtaWx5LicgKyBlcXVpcG1lbnQuZmFtaWx5KX1gO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmVxdWlwbWVudCxcbiAgICAgICAgICAgICAgICBodG1sOiBodG1sLnJlcGxhY2VBbGwocmVnZXgsIChtYXRjaGVkOiBzdHJpbmcsIGNhcHR1cmUxOiBzdHJpbmcpID0+IGA8Yj4ke2NhcHR1cmUxfTwvYj5gKVxuICAgICAgICAgICAgICB9IGFzIEh5cEVxdWlwbWVudFdpdGhNYXRjaGluZztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKCgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZWFyY2ggRXF1aXBtZW50IHByb2JsZW0nKTtcbiAgICAgIH0pLFxuICAgICAgc2hhcmVSZXBsYXkoKVxuICAgICk7XG4gIH1cblxuICBnZXQgZXZlbnRzKCkge1xuICAgIHJldHVybiB0aGlzLl9ldmVudHMubWFwKChldnQsIGlkeCkgPT4gKHsgLi4uZXZ0LCAuLi4odGhpcy5ldmVudE1vZGlmaWNhdGlvbnNbaWR4XSA/PyB7fSkgfSkpO1xuICB9XG5cbiAgZ2V0IGNhbkFzc29jaWF0ZVByb2NlZHVyZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZXZlbnRzLmV2ZXJ5KChldnQpID0+IGV2dC5zdGF0dXMgPT09ICdORVcnKTtcbiAgfVxuXG4gIGdldCBwcm9jZWR1cmUoKTogSHlwUHJvY2VkdXJlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcHJvY2VkdXJlXG4gICAgICA/IHtcbiAgICAgICAgICAuLi50aGlzLl9wcm9jZWR1cmUsXG4gICAgICAgICAgLi4uKHRoaXMucHJvY2VkdXJlTW9kaWZpY2F0aW9ucyA/PyB7fSksXG4gICAgICAgICAgZXZlbnRzOiB0aGlzLmV2ZW50c1xuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldCBjbG9zZUNvbW1lbnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZWR1cmU/LmNsb3NlQ29tbWVudCA/PyAnJztcbiAgfVxuXG4gIHRvZ2dsZShpOiBudW1iZXIpIHtcbiAgICB0aGlzLm9wZW5lZFtpXSA9ICF0aGlzLm9wZW5lZFtpXTtcbiAgfVxuXG4gIG1vZGlmeUV2ZW50KGluZGV4OiBudW1iZXIsIHByb3A6IHN0cmluZywgJGV2ZW50OiBFdmVudCB8IHN0cmluZykge1xuICAgIGNvbnN0IGlzRGF0ZSA9IHByb3AuaW5kZXhPZignRGF0ZScpID4gLTE7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IG5ld1ZhbHVlID0gJGV2ZW50IGluc3RhbmNlb2YgRXZlbnQgPyAkZXZlbnQudGFyZ2V0Py52YWx1ZSA6ICRldmVudDtcblxuICAgIGNvbnN0IGNvcnJlY3RlZFZhbHVlID0gIWlzRGF0ZSA/IG5ld1ZhbHVlIDogdGhpcy5jb252ZXJ0RGF0ZShuZXdWYWx1ZSk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh0aGlzLl9ldmVudHNbaW5kZXhdW3Byb3BdICE9PSBjb3JyZWN0ZWRWYWx1ZSkge1xuICAgICAgaWYgKCF0aGlzLmV2ZW50TW9kaWZpY2F0aW9uc1tpbmRleF0pIHtcbiAgICAgICAgdGhpcy5ldmVudE1vZGlmaWNhdGlvbnNbaW5kZXhdID0ge307XG4gICAgICB9XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLmV2ZW50TW9kaWZpY2F0aW9uc1tpbmRleF1bcHJvcF0gPSBjb3JyZWN0ZWRWYWx1ZTtcblxuICAgICAgdGhpcy5fb3V0cHV0TW9kaWZpY2F0aW9ucygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoISF0aGlzLmV2ZW50TW9kaWZpY2F0aW9uc1tpbmRleF0pIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBkZWxldGUgdGhpcy5ldmVudE1vZGlmaWNhdGlvbnNbaW5kZXhdW3Byb3BdO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5ldmVudE1vZGlmaWNhdGlvbnNbaW5kZXhdKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5ldmVudE1vZGlmaWNhdGlvbnNbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX291dHB1dE1vZGlmaWNhdGlvbnMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhY2Nlc3MoZXZlbnQ6IEh5cEV2ZW50RGV0YWlscykge1xuICAgIGlmIChcbiAgICAgIHRoaXMucmVhZG9ubHkgfHxcbiAgICAgIGV2ZW50LnN0YXR1cyA9PT0gJ0RPTkUnIHx8XG4gICAgICAoWydMSU1JVCcsICdPVVRPRk9SREVSJywgJ0FOT01BTFknXS5pbmNsdWRlcyhldmVudC5jYXRlZ29yeSkgJiYgZXZlbnQuZXh0ZXJuYWxTb3VyY2VSZWYgIT09ICdIeXBlcnZpc2V1cicpXG4gICAgKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiB0cnVlLFxuICAgICAgICBjYXRlZ29yeTogdHJ1ZSxcbiAgICAgICAgc3ViQ2F0ZWdvcnk6IHRydWUsXG4gICAgICAgIGNyaXRpY2FsaXR5OiB0cnVlLFxuICAgICAgICBkZXNjcmlwdGlvbjogdHJ1ZSxcbiAgICAgICAgYWRkcmVzczogdHJ1ZSxcbiAgICAgICAgc291cmNlOiB0cnVlLFxuICAgICAgICBkb21haW46IHRydWUsXG4gICAgICAgIGVxTmFtZTogdHJ1ZSxcbiAgICAgICAgZXFFbnRpdHk6IHRydWUsXG4gICAgICAgIHN0YXJ0RGF0ZTogdHJ1ZSxcbiAgICAgICAgZW5kRGF0ZTogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGZhbHNlLFxuICAgICAgY2F0ZWdvcnk6IGZhbHNlLFxuICAgICAgc3ViQ2F0ZWdvcnk6IGZhbHNlLFxuICAgICAgY3JpdGljYWxpdHk6IGZhbHNlLFxuICAgICAgZGVzY3JpcHRpb246IGZhbHNlLFxuICAgICAgYWRkcmVzczogZmFsc2UsXG4gICAgICBzb3VyY2U6IHRydWUsXG4gICAgICBkb21haW46IGZhbHNlLFxuICAgICAgZXFOYW1lOiBmYWxzZSxcbiAgICAgIGVxRW50aXR5OiBmYWxzZSxcbiAgICAgIHN0YXJ0RGF0ZTogZmFsc2UsXG4gICAgICBlbmREYXRlOiBmYWxzZVxuICAgIH07XG4gIH1cblxuICBfb3V0cHV0TW9kaWZpY2F0aW9ucygpIHtcbiAgICB0aGlzLnZhbGlkYXRlRXZlbnRzKHRoaXMuZXZlbnRzKTtcbiAgICB0aGlzLm1vZGlmaWVkRXZlbnRzLm5leHQodGhpcy5ldmVudHMubWFwKChldiwgaWR4KSA9PiBbdGhpcy5ldmVudE1vZGlmaWNhdGlvbnNbaWR4XSwgZXZdKSk7XG4gICAgdGhpcy5tb2RpZmllZFByb2NlZHVyZS5uZXh0KHRoaXMucHJvY2VkdXJlID8gW3RoaXMucHJvY2VkdXJlTW9kaWZpY2F0aW9ucywgdGhpcy5wcm9jZWR1cmUhXSA6IHVuZGVmaW5lZCk7XG4gIH1cblxuICB2YWxpZGF0ZUV2ZW50cyhldmVudHM6IEh5cEV2ZW50RGV0YWlsc1tdKSB7XG4gICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICBldmVudHMuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50RXJyb3JzID0gW107XG4gICAgICBpZiAoIWV2ZW50Lm5hbWUgfHwgZXZlbnQubmFtZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZXZlbnRFcnJvcnMucHVzaCh7IGZpZWxkOiAnbmFtZScsIGNvZGU6ICdyZXF1aXJlZCcgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIWV2ZW50LmNhdGVnb3J5IHx8IGV2ZW50LmNhdGVnb3J5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBldmVudEVycm9ycy5wdXNoKHsgZmllbGQ6ICdjYXRlZ29yeScsIGNvZGU6ICdyZXF1aXJlZCcgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIWV2ZW50LmNyaXRpY2FsaXR5IHx8IGV2ZW50LmNyaXRpY2FsaXR5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBldmVudEVycm9ycy5wdXNoKHsgZmllbGQ6ICdjcml0aWNhbGl0eScsIGNvZGU6ICdyZXF1aXJlZCcgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIWV2ZW50LmRlc2NyaXB0aW9uIHx8IGV2ZW50LmRlc2NyaXB0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBldmVudEVycm9ycy5wdXNoKHsgZmllbGQ6ICdkZXNjcmlwdGlvbicsIGNvZGU6ICdyZXF1aXJlZCcgfSk7XG4gICAgICB9XG4gICAgICBpZiAoISFldmVudC5lcXVpcG1lbnQgJiYgZXZlbnQuZXF1aXBtZW50LmlkID09PSAnbm90LWZvdW5kJykge1xuICAgICAgICBldmVudEVycm9ycy5wdXNoKHsgZmllbGQ6ICdlcXVpcG1lbnQnLCBjb2RlOiAnbm90LWZvdW5kJyB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudC5jYXRlZ29yeSA9PT0gJ01BTklGRVNUQVRJT04nKSB7XG4gICAgICAgIGlmICghZXZlbnQuc3RhcnREYXRlIHx8IGV2ZW50LnN0YXJ0RGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBldmVudEVycm9ycy5wdXNoKHsgZmllbGQ6ICdzdGFydERhdGUnLCBjb2RlOiAncmVxdWlyZWQnIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZXZlbnQuZW5kRGF0ZSB8fCBldmVudC5lbmREYXRlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGV2ZW50RXJyb3JzLnB1c2goeyBmaWVsZDogJ2VuZERhdGUnLCBjb2RlOiAncmVxdWlyZWQnIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoZXZlbnQuc3RhcnREYXRlPy5sb2NhbGVDb21wYXJlKGV2ZW50LmVuZERhdGUgPz8gJycpID8/IDApID4gMCkge1xuICAgICAgICAgIGV2ZW50RXJyb3JzLnB1c2goeyBmaWVsZDogJ3N0YXJ0RGF0ZScsIGNvZGU6ICdiZWZvcmUnIH0pO1xuICAgICAgICAgIGV2ZW50RXJyb3JzLnB1c2goeyBmaWVsZDogJ2VuZERhdGUnLCBjb2RlOiAnYWZ0ZXInIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmVycm9ycy5wdXNoKGV2ZW50RXJyb3JzKTtcbiAgICB9KTtcbiAgICB0aGlzLmV2ZW50RXJyb3JzLm5leHQodGhpcy5lcnJvcnMpO1xuICB9XG5cbiAgaGFzRXJyb3IocHJvcDogc3RyaW5nLCBpZHg6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmVycm9yc1tpZHhdPy5maW5kKChlcnIpID0+IGVyci5maWVsZCA9PT0gcHJvcCkgPz8gZmFsc2U7XG4gIH1cblxuICBjYXRlZ29yaWVzKGV2ZW50OiBIeXBFdmVudERldGFpbHMpIHtcbiAgICByZXR1cm4gSHlwRXZlbnRDYXRlZ29yeS52YWx1ZXM7XG4gIH1cblxuICBjaGFuZ2VTdGF0dXMoJGV2ZW50OiBzdHJpbmcsIGV2ZW50OiBIeXBFdmVudERldGFpbHMpIHtcbiAgICB0aGlzLmNoYW5nZVN0YXR1c0NvbnRleHQuZXZlbnRzID0gW2V2ZW50XTtcbiAgICB0aGlzLmNoYW5nZVN0YXR1c0NvbnRleHQuc3RhdHVzID0gJGV2ZW50O1xuICAgIHRoaXMuY2hhbmdlU3RhdHVzQ29udGV4dC5hbGwgPSBmYWxzZTtcbiAgICB0aGlzLnRvZ2dsZUNvbmZpcm0oKTtcbiAgfVxuXG4gIGNsb3NlQWxsKCkge1xuICAgIHRoaXMuY2hhbmdlU3RhdHVzQ29udGV4dC5hbGwgPSB0cnVlO1xuICAgIHRoaXMuY2hhbmdlU3RhdHVzQ29udGV4dC5ldmVudHMgPSB0aGlzLmV2ZW50cztcbiAgICB0aGlzLmNoYW5nZVN0YXR1c0NvbnRleHQuc3RhdHVzID0gJ0RPTkUnO1xuICAgIHRoaXMudG9nZ2xlQ29uZmlybSgpO1xuICB9XG5cbiAgY29uZmlybWVkQ2xvc2UoKSB7XG4gICAgaWYgKHRoaXMuY2hhbmdlU3RhdHVzQ29udGV4dC5hbGwpIHtcbiAgICAgIGlmICghdGhpcy5wcm9jZWR1cmUpIHtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgICAgICBFdmVudEFjdGlvbnMuc3RhdHVzKHtcbiAgICAgICAgICAgIHRhcmdldFN0YXR1czogdGhpcy5jaGFuZ2VTdGF0dXNDb250ZXh0LnN0YXR1cyxcbiAgICAgICAgICAgIGV2ZW50OiB0aGlzLmNoYW5nZVN0YXR1c0NvbnRleHQuZXZlbnRzWzBdLFxuICAgICAgICAgICAgcHJvY2VkdXJlOiB0aGlzLnByb2NlZHVyZSxcbiAgICAgICAgICAgIGNvbW1lbnQ6IHRoaXMuY2hhbmdlU3RhdHVzQ29udGV4dC5jb21tZW50XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goXG4gICAgICAgICAgRXZlbnRBY3Rpb25zLnN0YXR1cyh7XG4gICAgICAgICAgICB0YXJnZXRTdGF0dXM6IHRoaXMuY2hhbmdlU3RhdHVzQ29udGV4dC5zdGF0dXMsXG4gICAgICAgICAgICBwcm9jZWR1cmU6IHRoaXMucHJvY2VkdXJlLFxuICAgICAgICAgICAgY29tbWVudDogdGhpcy5jaGFuZ2VTdGF0dXNDb250ZXh0LmNvbW1lbnRcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgICBFdmVudEFjdGlvbnMuc3RhdHVzKHtcbiAgICAgICAgICB0YXJnZXRTdGF0dXM6IHRoaXMuY2hhbmdlU3RhdHVzQ29udGV4dC5zdGF0dXMsXG4gICAgICAgICAgZXZlbnQ6IHRoaXMuY2hhbmdlU3RhdHVzQ29udGV4dC5ldmVudHNbMF0sXG4gICAgICAgICAgcHJvY2VkdXJlOiB0aGlzLnByb2NlZHVyZSxcbiAgICAgICAgICBjb21tZW50OiB0aGlzLmNoYW5nZVN0YXR1c0NvbnRleHQuY29tbWVudFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy50b2dnbGVDb25maXJtKCk7XG4gIH1cblxuICB0b2dnbGVDb25maXJtKCkge1xuICAgIGlmICghdGhpcy5vdmVybGF5UmVmKSB7XG4gICAgICB0aGlzLmNvbWZpcm1EaWFsb2dPcGVuZWQubmV4dCh0aGlzLmNoYW5nZVN0YXR1c0NvbnRleHQpO1xuICAgICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShcbiAgICAgICAgbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6ICdiYWNrZHJvcC1kYXJrJyxcbiAgICAgICAgICBwYW5lbENsYXNzOiBbJ28taHZ5LWNsb3NlLWNvbmZpcm0nXVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMub3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMudG9nZ2xlQ29uZmlybSgpKTtcbiAgICAgIHRoaXMub3ZlcmxheVJlZi5hdHRhY2gobmV3IFRlbXBsYXRlUG9ydGFsKHRoaXMuY29uZmlybURpYWxvZywgdGhpcy52aWV3Q29udGFpbmVyUmVmKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3ZlcmxheVJlZi5kaXNwb3NlKCk7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlU3RhdHVzQ29udGV4dC5jb21tZW50ID0gJyc7XG4gIH1cblxuICBjb25maXJtRGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlU3RhdHVzQ29udGV4dC5jb21tZW50Lmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIGdldCBjYWxjdWxhdGVkUHJvZ3Jlc3MoKSB7XG4gICAgaWYgKHRoaXMucHJvY2VkdXJlIS5hY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLnJvdW5kKFxuICAgICAgKHRoaXMucHJvY2VkdXJlIS5hY3Rpb25zLmZpbHRlcigoYWN0aW9uKSA9PiBhY3Rpb24uc3RhdHVzID09PSAnRE9ORScpLmxlbmd0aCAvIHRoaXMucHJvY2VkdXJlIS5hY3Rpb25zLmxlbmd0aCkgKlxuICAgICAgICAxMDBcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBhZElkID0gcGFkSWQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBzdWJDYXRlZ29yaWVzID0gW3VuZGVmaW5lZCwgLi4uSHlwRXZlbnRTdWJDYXRlZ29yeS52YWx1ZXNbJ0FOT01BTFknXV07XG5cbiAgbW9kaWZpZWRBY3Rpb25zKCRldmVudDogYW55KSB7XG4gICAgaWYgKGVxdWFsKCRldmVudCwgdGhpcy5fcHJvY2VkdXJlIS5hY3Rpb25zKSkge1xuICAgICAgZGVsZXRlIHRoaXMucHJvY2VkdXJlTW9kaWZpY2F0aW9ucy5hY3Rpb25zO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb2NlZHVyZU1vZGlmaWNhdGlvbnMuYWN0aW9ucyA9ICRldmVudDtcbiAgICB9XG4gICAgdGhpcy5fb3V0cHV0TW9kaWZpY2F0aW9ucygpO1xuICB9XG5cbiAgb3BlbkFzc29jaWF0aW9uTW9kYWwoKSB7XG4gICAgY29uc3QgcmVmID0gdGhpcy5wcnlEaWFsb2cub3BlbihQcm9jZWR1cmVBc3NvY2lhdGlvbk1vZGFsQ29tcG9uZW50LCB7XG4gICAgICBiYWNrZHJvcENsYXNzOiAnby1odnktYXNzb2NpYXRpb24tbW9kYWxfX2JhY2tkcm9wJ1xuICAgIH0pO1xuICAgIGlmICghIXJlZiAmJiAhIXJlZi5jb21wb25lbnQpIHtcbiAgICAgIHJlZi5jb21wb25lbnQuZXZlbnRzID0gdGhpcy5ldmVudHM7XG4gICAgfVxuICB9XG5cbiAgb3BlbkRlbGV0ZU1vZGFsKCkge1xuICAgIGNvbnN0IGRhdGE6IFByeURpYWxvZ0NvbmZpcm1EYXRhID0ge1xuICAgICAgdGl0bGU6ICdAY2hoLmV2ZW50LmRlbGV0ZVQnLFxuICAgICAgbWVzc2FnZTogdGhpcy5pMThuU2VydmljZS5pbnN0YW50KHRoaXMuZXZlbnRzLmxlbmd0aCA+IDEgPyAnQGNoaC5ldmVudC5kZWxldGVNKycgOiAnQGNoaC5ldmVudC5kZWxldGVNMScsIHtcbiAgICAgICAgbmJFdmVudHM6IHRoaXMuZXZlbnRzLmxlbmd0aFxuICAgICAgfSksXG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgIHsgaWQ6IDAsIGxhYmVsOiAnQGNoaC5hY3Rpb24uY2FuY2VsJywgY29sb3I6ICdzZWNvbmRhcnknIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgICBsYWJlbDogJ0BjaGguYWN0aW9uLmNvbmZpcm0nLFxuICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgIFByb2NlZHVyZUFjdGlvbnMuZGVsZXRlSW5zdGFuY2Uoe1xuICAgICAgICAgICAgICBpZDogdGhpcy5wcm9jZWR1cmUhLmlkLFxuICAgICAgICAgICAgICByZXR1cm5Ub0V2ZW50OiB0aGlzLmV2ZW50cy5sZW5ndGggPT09IDEgPyB0aGlzLmV2ZW50c1swXS5pZCA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9O1xuICAgIHRoaXMucHJ5RGlhbG9nLm9wZW4oUHJ5RGlhbG9nQ29uZmlybUNvbXBvbmVudCwgeyBkYXRhLCBiYWNrZHJvcENsYXNzOiAnYmFja2Ryb3AtZGFyaycgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnREYXRlKG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IERhdGUobmV3VmFsdWUpLnRvSVNPU3RyaW5nKCk7XG4gIH1cblxuICB1cGRhdGVDb21tZW50KGV2ZW50OiBIeXBFdmVudERldGFpbHMsIGNvbW1lbnQ6IHsgaWQ6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH0pIHtcbiAgICB0aGlzLmNvbW1lbnRzU2VydmljZS5zYXZlKGV2ZW50LmlkLCAnZXZlbnRzJywgY29tbWVudCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudHJpZ2dlckNvbW1lbnQkLm5leHQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHNlbGVjdGVkRXF1aXBtZW50Q2hhbmdlKCRldmVudDogc3RyaW5nIHwgSHlwRXF1aXBtZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5lcXVpcG1lbnRTZWxlY3RWYWx1ZVtpbmRleF0gPSAkZXZlbnQ7XG4gICAgdGhpcy5vbkVxdWlwbWVudFNlYXJjaCQubmV4dChpbmRleCk7XG4gICAgaWYgKHR5cGVvZiAkZXZlbnQgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAodGhpcy5fZXZlbnRzW2luZGV4XS5lcXVpcG1lbnQ/Lm5hbWUgIT09ICRldmVudC5uYW1lKSB7XG4gICAgICAgIGlmICghdGhpcy5ldmVudE1vZGlmaWNhdGlvbnNbaW5kZXhdKSB7XG4gICAgICAgICAgdGhpcy5ldmVudE1vZGlmaWNhdGlvbnNbaW5kZXhdID0ge307XG4gICAgICAgIH1cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLmV2ZW50TW9kaWZpY2F0aW9uc1tpbmRleF0uZXF1aXBtZW50ID0gJGV2ZW50O1xuICAgICAgICB0aGlzLl9vdXRwdXRNb2RpZmljYXRpb25zKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoISF0aGlzLmV2ZW50TW9kaWZpY2F0aW9uc1tpbmRleF0pIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgZGVsZXRlIHRoaXMuZXZlbnRNb2RpZmljYXRpb25zW2luZGV4XS5lcXVpcG1lbnQ7XG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuZXZlbnRNb2RpZmljYXRpb25zW2luZGV4XSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5ldmVudE1vZGlmaWNhdGlvbnNbaW5kZXhdO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9vdXRwdXRNb2RpZmljYXRpb25zKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMucG9wdWxhdGVFcXVpcG1lbnQoJGV2ZW50LCBpbmRleCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucG9wdWxhdGVFcXVpcG1lbnQodW5kZWZpbmVkLCBpbmRleCk7XG4gICAgfVxuICB9XG5cbiAgZXF1aXBtZW50c0V2ZW50czogeyBldmVudHM/OiBIeXBFdmVudERldGFpbHNbXTsgc2VydmljZXM/OiBIeXBTZXJ2aWNlVG9vbHRpcFtdIH1bXSA9IFtdO1xuXG4gIHByaXZhdGUgcG9wdWxhdGVFcXVpcG1lbnQoJGV2ZW50OiBIeXBFcXVpcG1lbnQgfCB1bmRlZmluZWQsIGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmVxdWlwbWVudHNFdmVudHNbaW5kZXhdID0ge307XG4gICAgaWYgKCRldmVudCkge1xuICAgICAgdGhpcy5lcXVpcG1lbnRTZXJ2aWNlLmZpbmRCeU5hbWUoJGV2ZW50Lm5hbWUpLnN1YnNjcmliZSgoZXF1aXApID0+IHtcbiAgICAgICAgdGhpcy5lcXVpcG1lbnRzRXZlbnRzW2luZGV4XS5ldmVudHMgPSBlcXVpcC5ldmVudHM7XG4gICAgICAgIHRoaXMuZXF1aXBtZW50c0V2ZW50c1tpbmRleF0uc2VydmljZXMgPSBlcXVpcC5zZXJ2aWNlcztcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRvb2x0aXBSZWY/OiBQcnlEaWFsb2dSZWY8SHZ5RXZlbnREZXRhaWxzVG9vbHRpcENvbXBvbmVudD47XG5cbiAgdG9nZ2xlRGV0YWlsc1Rvb2x0aXAoaWR4OiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMudG9vbHRpcFJlZikge1xuICAgICAgbGV0IGlkeE9wZW5lZCA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkeDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLm9wZW5lZFtpXSkge1xuICAgICAgICAgIGlkeE9wZW5lZCsrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMudG9vbHRpcFJlZiA9IHRoaXMucHJ5RGlhbG9nLm9wZW4oSHZ5RXZlbnREZXRhaWxzVG9vbHRpcENvbXBvbmVudCwge1xuICAgICAgICBkYXRhOiB0aGlzLmVxdWlwbWVudHNFdmVudHNbaWR4XSA/PyB7IGV2ZW50czogW10sIHNlcnZpY2VzOiBbXSB9LFxuICAgICAgICBvdmVybGF5Q29uZmlnOiB7XG4gICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5vdmVybGF5XG4gICAgICAgICAgICAucG9zaXRpb24oKVxuICAgICAgICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy5kZXRhaWxIb3Zlckljb24uZ2V0KGlkeE9wZW5lZCkhKVxuICAgICAgICAgICAgLndpdGhQb3NpdGlvbnMoW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb3JpZ2luWDogJ2VuZCcsXG4gICAgICAgICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgICAgICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgICAgICAgICAgb3ZlcmxheVk6ICd0b3AnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0pXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRvb2x0aXBSZWYuY2xvc2UoKTtcbiAgICAgIHRoaXMudG9vbHRpcFJlZiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsXCI+XG4gIDxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19oZWFkZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiby1odnktZXZlbnRzLWRldGFpbF9faGVhZGVyX19zcGxpdFwiPlxuICAgICAgPGgxPnt7IHRpdGxlID8/ICdAaHZ5LmV2ZW50LmRldGFpbCcgfCBpMThuIH19PC9oMT5cbiAgICAgIEBpZiAoZXZlbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgQGlmIChjYW5DbG9zZVNvbWUgJiYgIXJlYWRvbmx5KSB7XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImEtYnRuIGEtYnRuLS1zZWNvbmRhcnkgLWZpeC1yaWdodFwiIFtkaXNhYmxlZF09XCIhY2FuQ2xvc2VTb21lXCIgKGNsaWNrKT1cImNsb3NlQWxsKClcIj5cbiAgICAgICAgICAgIHt7IChjYW5DbG9zZVNvbWUgPyAnQGh2eS5ldmVudC5sb2cuZXZlbnQuY2xvc2UnIDogJ0BodnkuZXZlbnQubG9nLmV2ZW50LmNsb3NlZCcpIHwgaTE4biB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoIWNhbkNsb3NlU29tZSAmJiBjbG9zZUNvbW1lbnQgJiYgY2xvc2VDb21tZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYS10b29sdGlwXCIgW2F0dHIuZGF0YS10b29sdGlwXT1cImNsb3NlQ29tbWVudFwiIGRhdGEtdG9vbHRpcC1wb3NpdGlvbj1cImJvdHRvbVwiPlxuICAgICAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJpXCIgW2hlaWdodF09XCIxOFwiIFt3aWR0aF09XCIxOFwiPmk8L3ByeS1pY29uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm8taHZ5LWV2ZW50cy1kZXRhaWxfX2hlYWRlcl9fc3BsaXRcIj5cbiAgICAgIEBpZiAocHJvY2VkdXJlICYmICFyZWFkb25seSkge1xuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYS1idG4gYS1idG4tLXNlY29uZGFyeVwiIChjbGljayk9XCJvcGVuRGVsZXRlTW9kYWwoKVwiIFtkaXNhYmxlZF09XCJyZWFkb25seVByb2NlZHVyZVwiPlxuICAgICAgICAgIHt7ICdAaHZ5LmV2ZW50LmxvZy5wcm9jZWR1cmUuZGVsZXRlJyB8IGkxOG4gfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiby1odnktZXZlbnRzLWRldGFpbF9fY29udGFpbmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cIm8taHZ5LWV2ZW50cy1kZXRhaWxfX2NvbnRhaW5lcl9fc2Nyb2xsYWJsZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm8taHZ5LWV2ZW50cy1kZXRhaWxfX2V2ZW50c1wiPlxuICAgICAgICBAZm9yIChldmVudCBvZiBldmVudHM7IHRyYWNrIGV2ZW50LmlkOyBsZXQgaWR4ID0gJGluZGV4KSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm8taHZ5LWV2ZW50cy1kZXRhaWxfX2V2ZW50c19fZXZlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19ldmVudHNfX2V2ZW50X19oZWFkZXJcIj5cbiAgICAgICAgICAgICAgPHByeS1pY29uXG4gICAgICAgICAgICAgICAgaWNvblN2Zz1cImFycm93X2Rvd25fcm91bmRlZFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLi1yb3RhdGVkXT1cIm9wZW5lZFtpZHhdXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlKGlkeClcIlxuICAgICAgICAgICAgICAgIFt3aWR0aF09XCIxMFwiXG4gICAgICAgICAgICAgICAgW2hlaWdodF09XCIxMFwiXG4gICAgICAgICAgICAgID48L3ByeS1pY29uPlxuICAgICAgICAgICAgICA8aHZ5LWljb24tZGlzcGxheSBbZXZlbnRdPVwiZXZlbnRcIj48L2h2eS1pY29uLWRpc3BsYXk+XG4gICAgICAgICAgICAgIDxoMj57eyBldmVudC5uYW1lIH19PC9oMj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm8taHZ5LWV2ZW50cy1kZXRhaWxfX2V2ZW50c19fZXZlbnRfX2hlYWRlcl9fY29tbWVudFwiPlxuICAgICAgICAgICAgICAgIEBpZiAoY29tbWVudHMkICYmIGNvbW1lbnRzJCB8IGFzeW5jOyBhcyBjb21tZW50cykge1xuICAgICAgICAgICAgICAgICAgQGlmIChjb21tZW50c1tldmVudC5pZF0/Lmxlbmd0aCA/PyAwID4gMCkge1xuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e1xuICAgICAgICAgICAgICAgICAgICAgICgoY29tbWVudHNbZXZlbnQuaWRdPy5sZW5ndGggPz8gMCkgPiAxID8gJ0BodnkuZXZlbnQuY29tbWVudC5oZWFkcycgOiAnQGh2eS5ldmVudC5jb21tZW50LmhlYWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgfCBpMThuOiB7IG5iOiBjb21tZW50c1tldmVudC5pZF0/Lmxlbmd0aCB9XG4gICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxodnktc3RhdHVzLWRpc3BsYXlcbiAgICAgICAgICAgICAgICBbaXRlbV09XCJldmVudFwiXG4gICAgICAgICAgICAgICAgW21vZGlmaWFibGVdPVwiZXZlbnQuc3RhdHVzICE9PSAnRE9ORSdcIlxuICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICAgICAgICAgICAgKG1vZGlmaWVkKT1cImNoYW5nZVN0YXR1cygkZXZlbnQsIGV2ZW50KVwiXG4gICAgICAgICAgICAgID48L2h2eS1zdGF0dXMtZGlzcGxheT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm8taHZ5LWV2ZW50cy1kZXRhaWxfX2V2ZW50c19fZXZlbnRfX2NvbnRlbnRcIj5cbiAgICAgICAgICAgICAgQGlmICghb3BlbmVkW2lkeF0pIHtcbiAgICAgICAgICAgICAgICA8ZGl2Pnt7ICdAaHZ5LmV2ZW50LmxvZy5ldmVudC5kZXNjcmlwdGlvbicgfCBpMThuIH19IDoge3sgZXZlbnQuZGVzY3JpcHRpb24gfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2Pnt7ICdAaHZ5LmV2ZW50LmxvZy5ldmVudC5hZGRyZXNzJyB8IGkxOG4gfX0gOiB7eyBldmVudC5hZGRyZXNzIH19PC9kaXY+XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIEBpZiAoYWNjZXNzKGV2ZW50KTsgYXMgYWNjZXNzVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19ldmVudHNfX2V2ZW50X19jb250ZW50X19oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGgzPnt7ICdAaHZ5LmV2ZW50LmxvZy5ldmVudC5kZXRhaWwnIHwgaTE4biB9fTwvaDM+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj57eyAnQGh2eS5ldmVudC5sb2cuZXZlbnQubWFuZGF0b3J5JyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDx0YWJsZT5cbiAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyAnQGh2eS5ldmVudC5sb2cuZXZlbnQubmFtZScgfCBpMThuIH19PHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+IDo8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy4tZXJyb3JdPVwiaGFzRXJyb3IoJ25hbWUnLCBpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZXZlbnQubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJtb2RpZnlFdmVudChpZHgsICduYW1lJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImFjY2Vzc1ZhbHVlLm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhMZW5ndGhdPVwiNTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChldmVudC5pZCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ICdAaHZ5LmV2ZW50LmxvZy5ldmVudC5pZCcgfCBpMThuIH19PHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+IDo8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJhLWZvcm0tZmllbGRcIiBbdmFsdWVdPVwicGFkSWQuZm4oZXZlbnQuaWQpXCIgW3JlYWRvbmx5XT1cInRydWVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyAnQGh2eS5ldmVudC5sb2cuZXZlbnQuY2F0ZWdvcnknIHwgaTE4biB9fTxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPiA6PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJldmVudC5jYXRlZ29yeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImNhdGVnb3JpZXMoZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuLWVycm9yXT1cImhhc0Vycm9yKCdjYXRlZ29yeScsIGlkeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm1vZGlmeUV2ZW50KGlkeCwgJ2NhdGVnb3J5JywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4blByZWZpeD1cIkBodnkuZXZlbnQuY2F0ZWdvcnkuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYWNjZXNzVmFsdWUuY2F0ZWdvcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChldmVudC5jYXRlZ29yeSA9PT0gJ0FOT01BTFknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyAnQGh2eS5ldmVudC5zdWJDYXRlZ29yeS5uYW1lJyB8IGkxOG4gfX0gOjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZXZlbnQuc3ViQ2F0ZWdvcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cInN1YkNhdGVnb3JpZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLi1lcnJvcl09XCJoYXNFcnJvcignc3ViQ2F0ZWdvcnknLCBpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm1vZGlmeUV2ZW50KGlkeCwgJ3N1YkNhdGVnb3J5JywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMThuUHJlZml4PVwiQGh2eS5ldmVudC5zdWJDYXRlZ29yeS5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFjY2Vzc1ZhbHVlLnN1YkNhdGVnb3J5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyAnQGh2eS5ldmVudC5jcml0aWNhbGl0eS5uYW1lJyB8IGkxOG4gfX08c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj4gOjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZXZlbnQuY3JpdGljYWxpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJjcml0aWNhbGl0aWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuLWVycm9yXT1cImhhc0Vycm9yKCdjcml0aWNhbGl0eScsIGlkeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5QcmVmaXg9XCJAaHZ5LmV2ZW50LmNyaXRpY2FsaXR5LlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFjY2Vzc1ZhbHVlLmNyaXRpY2FsaXR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJtb2RpZnlFdmVudChpZHgsICdjcml0aWNhbGl0eScsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgJ0BodnkuZXZlbnQubG9nLmV2ZW50LmRlc2NyaXB0aW9uJyB8IGkxOG4gfX08c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj4gOjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImV2ZW50LmRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLi1lcnJvcl09XCJoYXNFcnJvcignZGVzY3JpcHRpb24nLCBpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiYWNjZXNzVmFsdWUuZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm1vZGlmeUV2ZW50KGlkeCwgJ2Rlc2NyaXB0aW9uJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heExlbmd0aF09XCIyNTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyAnQGh2eS5ldmVudC5sb2cuZXZlbnQuYWRkcmVzcycgfCBpMThuIH19IDo8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJldmVudC5hZGRyZXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLi1lcnJvcl09XCJoYXNFcnJvcignYWRkcmVzcycsIGlkeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJhY2Nlc3NWYWx1ZS5hZGRyZXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJtb2RpZnlFdmVudChpZHgsICdhZGRyZXNzJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heExlbmd0aF09XCIyNTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoZXZlbnQuY2F0ZWdvcnkgIT09ICdNQU5JRkVTVEFUSU9OJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgJ0BodnkuZXZlbnQuc291cmNlJyB8IGkxOG4gfX0gOjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJldmVudC5leHRlcm5hbFNvdXJjZVJlZiA/PyAoJ0BodnkuZXZlbnQuaHlwZXJ2aXNvcicgfCBpMThuKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuLWVycm9yXT1cImhhc0Vycm9yKCdzb3VyY2UnLCBpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJhY2Nlc3NWYWx1ZS5zb3VyY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJtb2RpZnlFdmVudChpZHgsICdzb3VyY2UnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyAnQGh2eS5ldmVudC5lcXVpcG1lbnQnIHwgaTE4biB9fSA6PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwiZXF1aXBtZW50cyQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZExhYmVsPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJlcXVpcG1lbnRTZWxlY3RWYWx1ZVtpZHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZWxlY3RlZEVxdWlwbWVudENoYW5nZSgkZXZlbnQsIGlkeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvY29tcGxldGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2V4dGVybmFsQXV0b2NvbXBsZXRlU2VydmljZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0BodnkuZXZlbnQuZXF1aXBtZW50UGxhY2Vob2xkZXInIHwgaTE4blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJwcm9jZWR1cmUtZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVdPVwidGVtcGxhdGVPcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy4tZXJyb3JdPVwiaGFzRXJyb3IoJ2VxdWlwbWVudCcsIGlkeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhY2Nlc3NWYWx1ZS5lcU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiby1odnktZXZlbnRzLWRldGFpbF9fZXZlbnRzX19ldmVudF9fY29udGVudF9fZXF1aXBtZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZU9wdGlvbiBsZXQtaXRlbT1cIml0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidS1kaXNwbGF5LWZsZXggLWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJpdGVtLmh0bWxcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGV2ZW50LmVxdWlwbWVudCAmJiBldmVudC5lcXVpcG1lbnQuaWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblN2Zz1cImlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2RldGFpbEhvdmVySWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwidG9nZ2xlRGV0YWlsc1Rvb2x0aXAoaWR4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJ0b2dnbGVEZXRhaWxzVG9vbHRpcChpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9wcnktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyAnQGh2eS5ldmVudC5lcXVpcG1lbnRFbnRpdHknIHwgaTE4biB9fSA6PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuLWVycm9yXT1cImhhc0Vycm9yKCdlcXVpcG1lbnQnLCBpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnQuZXF1aXBtZW50Py5lbnRpdHkgPyAnQGh2eS5ldmVudC5lbnRpdHkuJyArIGV2ZW50LmVxdWlwbWVudD8uZW50aXR5IDogJycpIHwgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyAnQGh2eS5ldmVudC5kb21haW4ubmFtZScgfCBpMThuIH19IDo8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJET01BSU5TXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJldmVudC5kb21haW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5QcmVmaXg9XCJAaHZ5LmV2ZW50LmRvbWFpbi5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy4tZXJyb3JdPVwiaGFzRXJyb3IoJ2RvbWFpbicsIGlkeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm1vZGlmeUV2ZW50KGlkeCwgJ2RvbWFpbicsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhY2Nlc3NWYWx1ZS5kb21haW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAnQGh2eS5ldmVudC5zdGFydERhdGUnIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGV2ZW50LmNhdGVnb3J5ID09PSAnTUFOSUZFU1RBVElPTicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZXZlbnQuc3RhcnREYXRlIHwgZm9yRGF0ZVRpbWVMb2NhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLi1lcnJvcl09XCJoYXNFcnJvcignc3RhcnREYXRlJywgaWR4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImFjY2Vzc1ZhbHVlLnN0YXJ0RGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJtb2RpZnlFdmVudChpZHgsICdzdGFydERhdGUnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0BodnkuZXZlbnQuZW5kRGF0ZScgfCBpMThuIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoZXZlbnQuY2F0ZWdvcnkgPT09ICdNQU5JRkVTVEFUSU9OJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJldmVudC5lbmREYXRlIHwgZm9yRGF0ZVRpbWVMb2NhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLi1lcnJvcl09XCJoYXNFcnJvcignZW5kRGF0ZScsIGlkeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJhY2Nlc3NWYWx1ZS5lbmREYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm1vZGlmeUV2ZW50KGlkeCwgJ2VuZERhdGUnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyAnQGh2eS5ldmVudC5jcmVhdGlvbkRhdGUnIHwgaTE4biB9fSA6PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImV2ZW50LmNyZWF0aW9uRGF0ZSB8IGZvckRhdGVUaW1lTG9jYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgJ0BodnkuZXZlbnQubGFzdE1vZGlmaWNhdGlvbkRhdGUnIHwgaTE4biB9fSA6PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImV2ZW50Lmxhc3RNb2RpZmljYXRpb25EYXRlIHwgZm9yRGF0ZVRpbWVMb2NhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyAnQGh2eS5ldmVudC5jbG9zZURhdGUnIHwgaTE4biB9fSA6PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImV2ZW50LmNsb3NlRGF0ZSB8IGZvckRhdGVUaW1lTG9jYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICAgICAgICA8aHZ5LWNvbW1lbnRzXG4gICAgICAgICAgICAgICAgICAgIFtjb21tZW50c109XCIoY29tbWVudHMkIHwgYXN5bmMpID8gKGNvbW1lbnRzJCB8IGFzeW5jKSFbZXZlbnQuaWRdIDogW11cIlxuICAgICAgICAgICAgICAgICAgICAoY29tbWVudGVkKT1cInVwZGF0ZUNvbW1lbnQoZXZlbnQsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCInZXZlbnRzJ1wiXG4gICAgICAgICAgICAgICAgICAgIFttZV09XCJtZVwiXG4gICAgICAgICAgICAgICAgICA+PC9odnktY29tbWVudHM+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiby1odnktZXZlbnRzLWRldGFpbF9fcHJvY2VkdXJlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19wcm9jZWR1cmVfX2hlYWRlclwiPlxuICAgICAgICAgIDxoMj5cbiAgICAgICAgICAgIHt7IChldmVudHMubGVuZ3RoID09PSAxID8gJ0BodnkuZXZlbnQubG9nLnByb2NlZHVyZS5uYW1lMScgOiAnQGh2eS5ldmVudC5sb2cucHJvY2VkdXJlLm5hbWUnKSB8IGkxOG4gfX1cbiAgICAgICAgICA8L2gyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmIChwcm9jZWR1cmUpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiby1odnktZXZlbnRzLWRldGFpbF9fcHJvY2VkdXJlX19kZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgPHA+e3sgcHJvY2VkdXJlLmRlc2NyaXB0aW9uIH19PC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19wcm9jZWR1cmVfX3Byb2dyZXNzXCI+XG4gICAgICAgICAgICA8cD57eyAnQGh2eS5ldmVudC5sb2cucHJvY2VkdXJlLnByb2dyZXNzJyB8IGkxOG4gfX08L3A+XG4gICAgICAgICAgICA8aHZ5LXByb2dyZXNzLWRpc3BsYXkgW3Byb2dyZXNzXT1cImNhbGN1bGF0ZWRQcm9ncmVzc1wiPjwvaHZ5LXByb2dyZXNzLWRpc3BsYXk+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGh2eS1wcm9jZWR1cmUtYWN0aW9uc1xuICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5UHJvY2VkdXJlIHx8IHJlYWRvbmx5XCJcbiAgICAgICAgICAgIFtlbmFibGVFZGl0QWN0aW9uc109XCJlbmFibGVFZGl0QWN0aW9uc1wiXG4gICAgICAgICAgICBbYWN0aW9uc109XCJwcm9jZWR1cmUuYWN0aW9uc1wiXG4gICAgICAgICAgICAobW9kaWZpZWQpPVwibW9kaWZpZWRBY3Rpb25zKCRldmVudClcIlxuICAgICAgICAgICAgW21lXT1cIm1lXCJcbiAgICAgICAgICA+PC9odnktcHJvY2VkdXJlLWFjdGlvbnM+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIEBpZiAoIXJlYWRvbmx5KSB7XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYS1idG4gYS1idG4tLXNlY29uZGFyeVwiIFtkaXNhYmxlZF09XCIhY2FuQXNzb2NpYXRlUHJvY2VkdXJlXCIgKGNsaWNrKT1cIm9wZW5Bc3NvY2lhdGlvbk1vZGFsKClcIj5cbiAgICAgICAgICAgICAge3sgJ0BodnkuYWN0aW9uLmFzc29jaWF0ZScgfCBpMThuIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiby1odnktZXZlbnRzLWRldGFpbF9fcHJvY2VkdXJlX19lbXB0eVwiPnt7ICdAaHZ5LmV2ZW50LmxvZy5wcm9jZWR1cmUubm9uZScgfCBpMThuIH19PC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjY29uZmlybURpYWxvZz5cbiAgPGRpdlxuICAgIGNsYXNzPVwiby1odnktY2xvc2UtY29uZmlybV9fZGlhbG9nXCJcbiAgICBhcmlhLWxhYmVsbGVkYnk9XCJjb25maXJtXCJcbiAgICB0YWJpbmRleD1cIi0xXCJcbiAgICBpZD1cImNob2ljZVwiXG4gICAgcm9sZT1cImRpYWxvZ1wiXG4gICAgYXJpYS1tb2RhbD1cInRydWVcIlxuICA+XG4gICAgPGgyPlxuICAgICAge3tcbiAgICAgICAgKGNoYW5nZVN0YXR1c0NvbnRleHQuZXZlbnRzLmxlbmd0aCA9PT0gMSA/ICdAaHZ5LmV2ZW50LmNsb3NlLm9uZVRpdGxlJyA6ICdAaHZ5LmV2ZW50LmNsb3NlLm11bHRpVGl0bGUnKSB8IGkxOG5cbiAgICAgIH19XG4gICAgPC9oMj5cbiAgICA8cD57eyAoY2hhbmdlU3RhdHVzQ29udGV4dC5ldmVudHMubGVuZ3RoID09PSAxID8gJ0BodnkuZXZlbnQuY2xvc2Uub25lJyA6ICdAaHZ5LmV2ZW50LmNsb3NlLm11bHRpJykgfCBpMThuIH19PC9wPlxuICAgIDx1bD5cbiAgICAgIEBmb3IgKGV2ZW50IG9mIGNoYW5nZVN0YXR1c0NvbnRleHQuZXZlbnRzOyB0cmFjayBldmVudC5pZCkge1xuICAgICAgICA8bGk+e3sgZXZlbnQubmFtZSB9fTwvbGk+XG4gICAgICB9XG4gICAgPC91bD5cbiAgICA8cCBjbGFzcz1cIm8taHZ5LWNsb3NlLWNvbmZpcm1fX2RpYWxvZ19fY29tbWVudC10aXRsZVwiPlxuICAgICAge3sgJ0BodnkuZXZlbnQuY2xvc2UuY29tbWVudCcgfCBpMThuIH19PHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+IDpcbiAgICA8L3A+XG4gICAgPGRpdiBjbGFzcz1cIm8taHZ5LWNsb3NlLWNvbmZpcm1fX2RpYWxvZ19fY29tbWVudFwiPlxuICAgICAgPHRleHRhcmVhIFsobmdNb2RlbCldPVwiY2hhbmdlU3RhdHVzQ29udGV4dC5jb21tZW50XCIgY2xhc3M9XCJhLWZvcm0tZmllbGRcIiBbbWF4TGVuZ3RoXT1cIjI1NVwiPjwvdGV4dGFyZWE+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm8taHZ5LWNsb3NlLWNvbmZpcm1fX2RpYWxvZ19fYWN0aW9uc1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImEtYnRuIGEtYnRuLS1wcmltYXJ5XCIgKGNsaWNrKT1cImNvbmZpcm1lZENsb3NlKClcIiBbZGlzYWJsZWRdPVwiY29uZmlybURpc2FibGVkKClcIj5cbiAgICAgICAge3sgJ0BodnkuYWN0aW9uLnZhbGlkYXRlJyB8IGkxOG4gfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImEtYnRuIGEtYnRuLS1zZWNvbmRhcnlcIiAoY2xpY2spPVwidG9nZ2xlQ29uZmlybSgpXCI+e3sgJ0BodnkuYWN0aW9uLmNhbmNlbCcgfCBpMThuIH19PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==