@cqa-lib/cqa-ui 1.1.247 → 1.1.248

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.
@@ -156,6 +156,20 @@ export class DynamicSelectFieldComponent {
156
156
  }
157
157
  return !!value;
158
158
  }
159
+ /**
160
+ * Get the value for an option based on the valueBy property.
161
+ * If valueBy is provided, use that property from the option.
162
+ * Otherwise, fall back to id ?? value (default behavior).
163
+ * Must be public for template access.
164
+ */
165
+ getOptionValue(opt) {
166
+ if (this.config?.valueBy) {
167
+ // Use the property specified by valueBy
168
+ return opt[this.config.valueBy];
169
+ }
170
+ // Default behavior: use id ?? value
171
+ return opt.id ?? opt.value;
172
+ }
159
173
  /**
160
174
  * Sync the form control's disabled state from config.
161
175
  * Use the FormControl API instead of [disabled] in the template to avoid Angular's
@@ -247,17 +261,17 @@ export class DynamicSelectFieldComponent {
247
261
  if (!control)
248
262
  return false;
249
263
  const controlValue = control.value;
250
- const optionId = opt.id ?? opt.value;
264
+ const optionValue = this.getOptionValue(opt);
251
265
  if (this.isMultiple) {
252
266
  if (!Array.isArray(controlValue))
253
267
  return false;
254
- return controlValue.includes(optionId);
268
+ return controlValue.includes(optionValue);
255
269
  }
256
- return controlValue === optionId;
270
+ return controlValue === optionValue;
257
271
  }
258
272
  getAllOptionIds() {
259
273
  const options = this.config?.options || [];
260
- return options.map(o => (o.id ?? o.value)).filter(v => v !== undefined);
274
+ return options.map(o => this.getOptionValue(o)).filter(v => v !== undefined);
261
275
  }
262
276
  onToggleSelectAll(select) {
263
277
  const key = this.config?.key;
@@ -407,26 +421,26 @@ export class DynamicSelectFieldComponent {
407
421
  if (!selectedIds.length) {
408
422
  return baseFiltered;
409
423
  }
410
- const idOf = (o) => (o.id ?? o.value);
411
- const selectedOptions = allOptions.filter(o => selectedIds.includes(idOf(o)));
424
+ const valueOf = (o) => this.getOptionValue(o);
425
+ const selectedOptions = allOptions.filter(o => selectedIds.includes(valueOf(o)));
412
426
  // Merge selected options (keeping their original order) with filtered ones, de-duplicated
413
427
  const seen = new Set();
414
428
  const merged = [];
415
429
  for (const o of selectedOptions) {
416
- const id = idOf(o);
417
- if (id === undefined)
430
+ const val = valueOf(o);
431
+ if (val === undefined)
418
432
  continue;
419
- if (!seen.has(id)) {
420
- seen.add(id);
433
+ if (!seen.has(val)) {
434
+ seen.add(val);
421
435
  merged.push(o);
422
436
  }
423
437
  }
424
438
  for (const o of baseFiltered) {
425
- const id = idOf(o);
426
- if (id === undefined)
439
+ const val = valueOf(o);
440
+ if (val === undefined)
427
441
  continue;
428
- if (!seen.has(id)) {
429
- seen.add(id);
442
+ if (!seen.has(val)) {
443
+ seen.add(val);
430
444
  merged.push(o);
431
445
  }
432
446
  }
@@ -645,10 +659,10 @@ export class DynamicSelectFieldComponent {
645
659
  }
646
660
  }
647
661
  DynamicSelectFieldComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DynamicSelectFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
648
- DynamicSelectFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: { form: "form", config: "config" }, outputs: { selectionChange: "selectionChange", selectClick: "selectClick", searchChange: "searchChange", loadMore: "loadMore", addCustomValue: "addCustomValue" }, host: { listeners: { "document:click": "handleDocumentClick($event)" } }, viewQueries: [{ propertyName: "selectRef", first: true, predicate: ["selectRef"], descendants: true }, { propertyName: "hostEl", first: true, predicate: ["host"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\">\n <ng-container [formGroup]=\"form\">\n <label *ngIf=\"config.label\"\n class=\"form-label cqa-text-[#374151] cqa-text-[14px] cqa-font-medium cqa-block cqa-leading-[1.4] cqa-mb-2\">{{\n config.label }}</label>\n <mat-form-field #host class=\"mat-select-custom cqa-w-full\" appearance=\"fill\">\n <mat-select #selectRef=\"matSelect\" [placeholder]=\"displayPlaceholder\" [multiple]=\"isMultiple\"\n disableOptionCentering [panelClass]=\"panelClass\" [formControlName]=\"config.key\"\n (openedChange)=\"onSelectOpenedChange($event, selectRef)\" (selectionChange)=\"onSelectionChange($event, selectRef)\">\n\n <mat-option *ngIf=\"config.searchable\" class=\"ts-select-search\" disabled>\n <input class=\"ts-select-search-input cqa-text-black-100\" type=\"text\" [value]=\"searchTextByKey[config.key] || ''\"\n (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\" (input)=\"onSearch(config.key, $any($event.target).value)\"\n placeholder=\"Search...\" />\n </mat-option>\n \n <mat-option [ngClass]=\"{'checkmark': config.optionStyle === 'checkmark','checkbox': config.optionStyle !== 'checkmark','mat-selected': allSelected}\" [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngIf=\"isMultiple && config.showSelectAll\" [value]=\"SELECT_ALL_VALUE\">\n <ng-container *ngIf=\"useCheckboxStyle; else selectAllDefaultTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"allSelected ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"allSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\">{{ config.selectAllLabel || 'All' }}</span>\n </span>\n </ng-container>\n <ng-template #selectAllDefaultTpl>\n {{ config.selectAllLabel || 'All' }}\n </ng-template>\n </mat-option>\n\n <mat-option *ngIf=\"showAddCustomOption\" [value]=\"addCustomSentinelValue\" class=\"cqa-text-primary\">\n New\n </mat-option>\n\n <mat-option [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngFor=\"let opt of filteredOptions(config)\" [value]=\"opt.id ?? opt.value\">\n <ng-container *ngIf=\"config.isCompareRuns\"> \n <ng-container *ngIf=\"useCheckboxStyle; else compareRunsDefaultOptionTpl\">\n <span class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-compare-runs-item\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"hasHighlighting\"\n [style.color]=\"opt.statusColor || null\"\n [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <ng-container *ngIf=\"!hasHighlighting\">\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"opt.runNumberLabel && opt.runDateLabel; else checkboxDefaultLabel\">\n <span [style.color]=\"opt.statusColor || null\">{{ opt.runNumberLabel }}</span>\n <span class=\"cqa-text-[#6B7280]\"> {{ opt.runDateLabel }}&nbsp;</span>\n </span>\n <ng-template #checkboxDefaultLabel>\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n [style.color]=\"opt.statusColor || null\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </ng-template>\n </ng-container>\n </span>\n <span\n *ngIf=\"opt.durationFormatted\"\n class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-1 cqa-text-[12px] cqa-text-[#6B7280] cqa-flex-shrink-0 cqa-whitespace-nowrap cqa-max-w-[80px]\" \n [ngClass]=\"{\n 'cqa-min-w-[82px]': opt?.hasHourRun,\n 'cqa-min-w-[66px]': !opt?.hasHourRun && opt?.hasMinuteRun,\n 'cqa-min-w-[40px]': !opt?.hasHourRun && !opt?.hasMinuteRun\n }\">\n <svg class=\"cqa-min-w-[12px] cqa-max-w-[12px]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"#9CA3AF\" stroke-width=\"1\"/>\n <path d=\"M6 3.5V6L7.5 7\" stroke=\"#4B5563\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>{{ opt.durationFormatted }}</span>\n </span>\n </span>\n </ng-container>\n <ng-template #compareRunsDefaultOptionTpl>\n <span class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-compare-runs-item\">\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"hasHighlighting\"\n [style.color]=\"opt.statusColor || null\"\n [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <ng-container *ngIf=\"!hasHighlighting\">\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"opt.runNumberLabel && opt.runDateLabel; else defaultLabel\">\n <span [style.color]=\"opt.statusColor || null\">{{ opt.runNumberLabel }}</span>\n <span class=\"cqa-text-[#6B7280]\"> {{ opt.runDateLabel }}&nbsp;</span>\n </span>\n <ng-template #defaultLabel>\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n [style.color]=\"opt.statusColor || null\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </ng-template>\n </ng-container>\n <span\n *ngIf=\"opt.durationFormatted\"\n class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-1 cqa-text-[12px] cqa-text-[#6B7280] cqa-flex-shrink-0 cqa-whitespace-nowrap cqa-max-w-[80px]\" \n [ngClass]=\"{\n 'cqa-min-w-[82px]': opt?.hasHourRun,\n 'cqa-min-w-[66px]': !opt?.hasHourRun && opt?.hasMinuteRun,\n 'cqa-min-w-[40px]': !opt?.hasHourRun && !opt?.hasMinuteRun\n }\">\n <svg class=\"cqa-min-w-[12px] cqa-max-w-[12px]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"#9CA3AF\" stroke-width=\"1\"/>\n <path d=\"M6 3.5V6L7.5 7\" stroke=\"#4B5563\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>{{ opt.durationFormatted }}</span>\n </span>\n </span>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"!config.isCompareRuns\">\n <ng-container *ngIf=\"useCheckboxStyle; else defaultOptionTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <!-- When displayLabelAsInnerHtml is true, render label as raw HTML -->\n <span class=\"cqa-min-w-0\"\n *ngIf=\"config?.displayLabelAsInnerHtml\"\n [innerHTML]=\"opt.label ?? opt.name ?? opt.value\">\n </span>\n <!-- Otherwise use normal/highlighted text rendering -->\n <span class=\"cqa-min-w-0\"\n *ngIf=\"!config?.displayLabelAsInnerHtml && hasHighlighting\"\n [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\">\n </span>\n <span class=\"cqa-min-w-0\"\n *ngIf=\"!config?.displayLabelAsInnerHtml && !hasHighlighting\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </span>\n </ng-container>\n <ng-template #defaultOptionTpl>\n <!-- When displayLabelAsInnerHtml is true, render label as raw HTML -->\n <span *ngIf=\"config?.displayLabelAsInnerHtml\"\n [innerHTML]=\"opt.label ?? opt.name ?? opt.value\">\n </span>\n <!-- Otherwise use normal/highlighted text rendering -->\n <span *ngIf=\"!config?.displayLabelAsInnerHtml && hasHighlighting\"\n [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\">\n </span>\n <span *ngIf=\"!config?.displayLabelAsInnerHtml && !hasHighlighting\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </ng-template>\n </ng-container>\n </mat-option>\n \n <!-- No results state (only when not loading and no options) -->\n <mat-option disabled *ngIf=\"!(config?.options?.length || 0) && !(config?.isLoading || loadingMore)\">\n No results\n </mat-option>\n <!-- Infinite scroll sentinel (serverSearch or explicit hasMore) -->\n <mat-option disabled class=\"load-more-sentinel\" *ngIf=\"config?.hasMore\">\n <span *ngIf=\"loadingMore || config?.isLoading\">Loading...</span>\n <span *ngIf=\"!loadingMore && !config?.isLoading\">Scroll to load more\u2026</span>\n </mat-option>\n </mat-select>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Inline spinner shown when loading more (infinite scroll) or when config.isLoading is true -->\n <svg *ngIf=\"loadingMore || config?.isLoading\" width=\"16\" height=\"16\" viewBox=\"0 0 50 50\" aria-label=\"loading\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"25\" cy=\"25\" r=\"20\" stroke=\"#E5E7EB\" stroke-width=\"6\" fill=\"none\"/>\n <path d=\"M45 25a20 20 0 0 0-20-20\" stroke=\"#4F46E5\" stroke-width=\"6\" fill=\"none\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 25 25\" to=\"360 25 25\"\n dur=\"0.8s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </mat-form-field>\n </ng-container>\n</div>", components: [{ type: i1.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i2.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }], directives: [{ type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
662
+ DynamicSelectFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: { form: "form", config: "config" }, outputs: { selectionChange: "selectionChange", selectClick: "selectClick", searchChange: "searchChange", loadMore: "loadMore", addCustomValue: "addCustomValue" }, host: { listeners: { "document:click": "handleDocumentClick($event)" } }, viewQueries: [{ propertyName: "selectRef", first: true, predicate: ["selectRef"], descendants: true }, { propertyName: "hostEl", first: true, predicate: ["host"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\">\n <ng-container [formGroup]=\"form\">\n <label *ngIf=\"config.label\"\n class=\"form-label cqa-text-[#374151] cqa-text-[14px] cqa-font-medium cqa-block cqa-leading-[1.4] cqa-mb-2\">{{\n config.label }}</label>\n <mat-form-field #host class=\"mat-select-custom cqa-w-full\" appearance=\"fill\">\n <mat-select #selectRef=\"matSelect\" [placeholder]=\"displayPlaceholder\" [multiple]=\"isMultiple\"\n disableOptionCentering [panelClass]=\"panelClass\" [formControlName]=\"config.key\"\n (openedChange)=\"onSelectOpenedChange($event, selectRef)\" (selectionChange)=\"onSelectionChange($event, selectRef)\">\n\n <mat-option *ngIf=\"config.searchable\" class=\"ts-select-search\" disabled>\n <input class=\"ts-select-search-input cqa-text-black-100\" type=\"text\" [value]=\"searchTextByKey[config.key] || ''\"\n (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\" (input)=\"onSearch(config.key, $any($event.target).value)\"\n placeholder=\"Search...\" />\n </mat-option>\n \n <mat-option [ngClass]=\"{'checkmark': config.optionStyle === 'checkmark','checkbox': config.optionStyle !== 'checkmark','mat-selected': allSelected}\" [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngIf=\"isMultiple && config.showSelectAll\" [value]=\"SELECT_ALL_VALUE\">\n <ng-container *ngIf=\"useCheckboxStyle; else selectAllDefaultTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"allSelected ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"allSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\">{{ config.selectAllLabel || 'All' }}</span>\n </span>\n </ng-container>\n <ng-template #selectAllDefaultTpl>\n {{ config.selectAllLabel || 'All' }}\n </ng-template>\n </mat-option>\n\n <mat-option *ngIf=\"showAddCustomOption\" [value]=\"addCustomSentinelValue\" class=\"cqa-text-primary\">\n New\n </mat-option>\n\n <mat-option [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngFor=\"let opt of filteredOptions(config)\" [value]=\"getOptionValue(opt)\">\n <ng-container *ngIf=\"config.isCompareRuns\"> \n <ng-container *ngIf=\"useCheckboxStyle; else compareRunsDefaultOptionTpl\">\n <span class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-compare-runs-item\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"hasHighlighting\"\n [style.color]=\"opt.statusColor || null\"\n [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <ng-container *ngIf=\"!hasHighlighting\">\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"opt.runNumberLabel && opt.runDateLabel; else checkboxDefaultLabel\">\n <span [style.color]=\"opt.statusColor || null\">{{ opt.runNumberLabel }}</span>\n <span class=\"cqa-text-[#6B7280]\"> {{ opt.runDateLabel }}&nbsp;</span>\n </span>\n <ng-template #checkboxDefaultLabel>\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n [style.color]=\"opt.statusColor || null\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </ng-template>\n </ng-container>\n </span>\n <span\n *ngIf=\"opt.durationFormatted\"\n class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-1 cqa-text-[12px] cqa-text-[#6B7280] cqa-flex-shrink-0 cqa-whitespace-nowrap cqa-max-w-[80px]\" \n [ngClass]=\"{\n 'cqa-min-w-[82px]': opt?.hasHourRun,\n 'cqa-min-w-[66px]': !opt?.hasHourRun && opt?.hasMinuteRun,\n 'cqa-min-w-[40px]': !opt?.hasHourRun && !opt?.hasMinuteRun\n }\">\n <svg class=\"cqa-min-w-[12px] cqa-max-w-[12px]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"#9CA3AF\" stroke-width=\"1\"/>\n <path d=\"M6 3.5V6L7.5 7\" stroke=\"#4B5563\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>{{ opt.durationFormatted }}</span>\n </span>\n </span>\n </ng-container>\n <ng-template #compareRunsDefaultOptionTpl>\n <span class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-compare-runs-item\">\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"hasHighlighting\"\n [style.color]=\"opt.statusColor || null\"\n [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <ng-container *ngIf=\"!hasHighlighting\">\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"opt.runNumberLabel && opt.runDateLabel; else defaultLabel\">\n <span [style.color]=\"opt.statusColor || null\">{{ opt.runNumberLabel }}</span>\n <span class=\"cqa-text-[#6B7280]\"> {{ opt.runDateLabel }}&nbsp;</span>\n </span>\n <ng-template #defaultLabel>\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n [style.color]=\"opt.statusColor || null\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </ng-template>\n </ng-container>\n <span\n *ngIf=\"opt.durationFormatted\"\n class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-1 cqa-text-[12px] cqa-text-[#6B7280] cqa-flex-shrink-0 cqa-whitespace-nowrap cqa-max-w-[80px]\" \n [ngClass]=\"{\n 'cqa-min-w-[82px]': opt?.hasHourRun,\n 'cqa-min-w-[66px]': !opt?.hasHourRun && opt?.hasMinuteRun,\n 'cqa-min-w-[40px]': !opt?.hasHourRun && !opt?.hasMinuteRun\n }\">\n <svg class=\"cqa-min-w-[12px] cqa-max-w-[12px]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"#9CA3AF\" stroke-width=\"1\"/>\n <path d=\"M6 3.5V6L7.5 7\" stroke=\"#4B5563\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>{{ opt.durationFormatted }}</span>\n </span>\n </span>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"!config.isCompareRuns\">\n <ng-container *ngIf=\"useCheckboxStyle; else defaultOptionTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <!-- When displayLabelAsInnerHtml is true, render label as raw HTML -->\n <span class=\"cqa-min-w-0\"\n *ngIf=\"config?.displayLabelAsInnerHtml\"\n [innerHTML]=\"opt.label ?? opt.name ?? opt.value\">\n </span>\n <!-- Otherwise use normal/highlighted text rendering -->\n <span class=\"cqa-min-w-0\"\n *ngIf=\"!config?.displayLabelAsInnerHtml && hasHighlighting\"\n [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\">\n </span>\n <span class=\"cqa-min-w-0\"\n *ngIf=\"!config?.displayLabelAsInnerHtml && !hasHighlighting\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </span>\n </ng-container>\n <ng-template #defaultOptionTpl>\n <!-- When displayLabelAsInnerHtml is true, render label as raw HTML -->\n <span *ngIf=\"config?.displayLabelAsInnerHtml\"\n [innerHTML]=\"opt.label ?? opt.name ?? opt.value\">\n </span>\n <!-- Otherwise use normal/highlighted text rendering -->\n <span *ngIf=\"!config?.displayLabelAsInnerHtml && hasHighlighting\"\n [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\">\n </span>\n <span *ngIf=\"!config?.displayLabelAsInnerHtml && !hasHighlighting\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </ng-template>\n </ng-container>\n </mat-option>\n \n <!-- No results state (only when not loading and no options) -->\n <mat-option disabled *ngIf=\"!(config?.options?.length || 0) && !(config?.isLoading || loadingMore)\">\n No results\n </mat-option>\n <!-- Infinite scroll sentinel (serverSearch or explicit hasMore) -->\n <mat-option disabled class=\"load-more-sentinel\" *ngIf=\"config?.hasMore\">\n <span *ngIf=\"loadingMore || config?.isLoading\">Loading...</span>\n <span *ngIf=\"!loadingMore && !config?.isLoading\">Scroll to load more\u2026</span>\n </mat-option>\n </mat-select>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Inline spinner shown when loading more (infinite scroll) or when config.isLoading is true -->\n <svg *ngIf=\"loadingMore || config?.isLoading\" width=\"16\" height=\"16\" viewBox=\"0 0 50 50\" aria-label=\"loading\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"25\" cy=\"25\" r=\"20\" stroke=\"#E5E7EB\" stroke-width=\"6\" fill=\"none\"/>\n <path d=\"M45 25a20 20 0 0 0-20-20\" stroke=\"#4F46E5\" stroke-width=\"6\" fill=\"none\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 25 25\" to=\"360 25 25\"\n dur=\"0.8s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </mat-form-field>\n </ng-container>\n</div>", components: [{ type: i1.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i2.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }], directives: [{ type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
649
663
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DynamicSelectFieldComponent, decorators: [{
650
664
  type: Component,
651
- args: [{ selector: 'cqa-dynamic-select', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-ui-root\">\n <ng-container [formGroup]=\"form\">\n <label *ngIf=\"config.label\"\n class=\"form-label cqa-text-[#374151] cqa-text-[14px] cqa-font-medium cqa-block cqa-leading-[1.4] cqa-mb-2\">{{\n config.label }}</label>\n <mat-form-field #host class=\"mat-select-custom cqa-w-full\" appearance=\"fill\">\n <mat-select #selectRef=\"matSelect\" [placeholder]=\"displayPlaceholder\" [multiple]=\"isMultiple\"\n disableOptionCentering [panelClass]=\"panelClass\" [formControlName]=\"config.key\"\n (openedChange)=\"onSelectOpenedChange($event, selectRef)\" (selectionChange)=\"onSelectionChange($event, selectRef)\">\n\n <mat-option *ngIf=\"config.searchable\" class=\"ts-select-search\" disabled>\n <input class=\"ts-select-search-input cqa-text-black-100\" type=\"text\" [value]=\"searchTextByKey[config.key] || ''\"\n (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\" (input)=\"onSearch(config.key, $any($event.target).value)\"\n placeholder=\"Search...\" />\n </mat-option>\n \n <mat-option [ngClass]=\"{'checkmark': config.optionStyle === 'checkmark','checkbox': config.optionStyle !== 'checkmark','mat-selected': allSelected}\" [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngIf=\"isMultiple && config.showSelectAll\" [value]=\"SELECT_ALL_VALUE\">\n <ng-container *ngIf=\"useCheckboxStyle; else selectAllDefaultTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"allSelected ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"allSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\">{{ config.selectAllLabel || 'All' }}</span>\n </span>\n </ng-container>\n <ng-template #selectAllDefaultTpl>\n {{ config.selectAllLabel || 'All' }}\n </ng-template>\n </mat-option>\n\n <mat-option *ngIf=\"showAddCustomOption\" [value]=\"addCustomSentinelValue\" class=\"cqa-text-primary\">\n New\n </mat-option>\n\n <mat-option [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngFor=\"let opt of filteredOptions(config)\" [value]=\"opt.id ?? opt.value\">\n <ng-container *ngIf=\"config.isCompareRuns\"> \n <ng-container *ngIf=\"useCheckboxStyle; else compareRunsDefaultOptionTpl\">\n <span class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-compare-runs-item\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"hasHighlighting\"\n [style.color]=\"opt.statusColor || null\"\n [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <ng-container *ngIf=\"!hasHighlighting\">\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"opt.runNumberLabel && opt.runDateLabel; else checkboxDefaultLabel\">\n <span [style.color]=\"opt.statusColor || null\">{{ opt.runNumberLabel }}</span>\n <span class=\"cqa-text-[#6B7280]\"> {{ opt.runDateLabel }}&nbsp;</span>\n </span>\n <ng-template #checkboxDefaultLabel>\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n [style.color]=\"opt.statusColor || null\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </ng-template>\n </ng-container>\n </span>\n <span\n *ngIf=\"opt.durationFormatted\"\n class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-1 cqa-text-[12px] cqa-text-[#6B7280] cqa-flex-shrink-0 cqa-whitespace-nowrap cqa-max-w-[80px]\" \n [ngClass]=\"{\n 'cqa-min-w-[82px]': opt?.hasHourRun,\n 'cqa-min-w-[66px]': !opt?.hasHourRun && opt?.hasMinuteRun,\n 'cqa-min-w-[40px]': !opt?.hasHourRun && !opt?.hasMinuteRun\n }\">\n <svg class=\"cqa-min-w-[12px] cqa-max-w-[12px]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"#9CA3AF\" stroke-width=\"1\"/>\n <path d=\"M6 3.5V6L7.5 7\" stroke=\"#4B5563\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>{{ opt.durationFormatted }}</span>\n </span>\n </span>\n </ng-container>\n <ng-template #compareRunsDefaultOptionTpl>\n <span class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-compare-runs-item\">\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"hasHighlighting\"\n [style.color]=\"opt.statusColor || null\"\n [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <ng-container *ngIf=\"!hasHighlighting\">\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"opt.runNumberLabel && opt.runDateLabel; else defaultLabel\">\n <span [style.color]=\"opt.statusColor || null\">{{ opt.runNumberLabel }}</span>\n <span class=\"cqa-text-[#6B7280]\"> {{ opt.runDateLabel }}&nbsp;</span>\n </span>\n <ng-template #defaultLabel>\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n [style.color]=\"opt.statusColor || null\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </ng-template>\n </ng-container>\n <span\n *ngIf=\"opt.durationFormatted\"\n class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-1 cqa-text-[12px] cqa-text-[#6B7280] cqa-flex-shrink-0 cqa-whitespace-nowrap cqa-max-w-[80px]\" \n [ngClass]=\"{\n 'cqa-min-w-[82px]': opt?.hasHourRun,\n 'cqa-min-w-[66px]': !opt?.hasHourRun && opt?.hasMinuteRun,\n 'cqa-min-w-[40px]': !opt?.hasHourRun && !opt?.hasMinuteRun\n }\">\n <svg class=\"cqa-min-w-[12px] cqa-max-w-[12px]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"#9CA3AF\" stroke-width=\"1\"/>\n <path d=\"M6 3.5V6L7.5 7\" stroke=\"#4B5563\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>{{ opt.durationFormatted }}</span>\n </span>\n </span>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"!config.isCompareRuns\">\n <ng-container *ngIf=\"useCheckboxStyle; else defaultOptionTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <!-- When displayLabelAsInnerHtml is true, render label as raw HTML -->\n <span class=\"cqa-min-w-0\"\n *ngIf=\"config?.displayLabelAsInnerHtml\"\n [innerHTML]=\"opt.label ?? opt.name ?? opt.value\">\n </span>\n <!-- Otherwise use normal/highlighted text rendering -->\n <span class=\"cqa-min-w-0\"\n *ngIf=\"!config?.displayLabelAsInnerHtml && hasHighlighting\"\n [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\">\n </span>\n <span class=\"cqa-min-w-0\"\n *ngIf=\"!config?.displayLabelAsInnerHtml && !hasHighlighting\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </span>\n </ng-container>\n <ng-template #defaultOptionTpl>\n <!-- When displayLabelAsInnerHtml is true, render label as raw HTML -->\n <span *ngIf=\"config?.displayLabelAsInnerHtml\"\n [innerHTML]=\"opt.label ?? opt.name ?? opt.value\">\n </span>\n <!-- Otherwise use normal/highlighted text rendering -->\n <span *ngIf=\"!config?.displayLabelAsInnerHtml && hasHighlighting\"\n [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\">\n </span>\n <span *ngIf=\"!config?.displayLabelAsInnerHtml && !hasHighlighting\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </ng-template>\n </ng-container>\n </mat-option>\n \n <!-- No results state (only when not loading and no options) -->\n <mat-option disabled *ngIf=\"!(config?.options?.length || 0) && !(config?.isLoading || loadingMore)\">\n No results\n </mat-option>\n <!-- Infinite scroll sentinel (serverSearch or explicit hasMore) -->\n <mat-option disabled class=\"load-more-sentinel\" *ngIf=\"config?.hasMore\">\n <span *ngIf=\"loadingMore || config?.isLoading\">Loading...</span>\n <span *ngIf=\"!loadingMore && !config?.isLoading\">Scroll to load more\u2026</span>\n </mat-option>\n </mat-select>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Inline spinner shown when loading more (infinite scroll) or when config.isLoading is true -->\n <svg *ngIf=\"loadingMore || config?.isLoading\" width=\"16\" height=\"16\" viewBox=\"0 0 50 50\" aria-label=\"loading\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"25\" cy=\"25\" r=\"20\" stroke=\"#E5E7EB\" stroke-width=\"6\" fill=\"none\"/>\n <path d=\"M45 25a20 20 0 0 0-20-20\" stroke=\"#4F46E5\" stroke-width=\"6\" fill=\"none\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 25 25\" to=\"360 25 25\"\n dur=\"0.8s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </mat-form-field>\n </ng-container>\n</div>" }]
665
+ args: [{ selector: 'cqa-dynamic-select', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-ui-root\">\n <ng-container [formGroup]=\"form\">\n <label *ngIf=\"config.label\"\n class=\"form-label cqa-text-[#374151] cqa-text-[14px] cqa-font-medium cqa-block cqa-leading-[1.4] cqa-mb-2\">{{\n config.label }}</label>\n <mat-form-field #host class=\"mat-select-custom cqa-w-full\" appearance=\"fill\">\n <mat-select #selectRef=\"matSelect\" [placeholder]=\"displayPlaceholder\" [multiple]=\"isMultiple\"\n disableOptionCentering [panelClass]=\"panelClass\" [formControlName]=\"config.key\"\n (openedChange)=\"onSelectOpenedChange($event, selectRef)\" (selectionChange)=\"onSelectionChange($event, selectRef)\">\n\n <mat-option *ngIf=\"config.searchable\" class=\"ts-select-search\" disabled>\n <input class=\"ts-select-search-input cqa-text-black-100\" type=\"text\" [value]=\"searchTextByKey[config.key] || ''\"\n (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\" (input)=\"onSearch(config.key, $any($event.target).value)\"\n placeholder=\"Search...\" />\n </mat-option>\n \n <mat-option [ngClass]=\"{'checkmark': config.optionStyle === 'checkmark','checkbox': config.optionStyle !== 'checkmark','mat-selected': allSelected}\" [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngIf=\"isMultiple && config.showSelectAll\" [value]=\"SELECT_ALL_VALUE\">\n <ng-container *ngIf=\"useCheckboxStyle; else selectAllDefaultTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"allSelected ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"allSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\">{{ config.selectAllLabel || 'All' }}</span>\n </span>\n </ng-container>\n <ng-template #selectAllDefaultTpl>\n {{ config.selectAllLabel || 'All' }}\n </ng-template>\n </mat-option>\n\n <mat-option *ngIf=\"showAddCustomOption\" [value]=\"addCustomSentinelValue\" class=\"cqa-text-primary\">\n New\n </mat-option>\n\n <mat-option [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngFor=\"let opt of filteredOptions(config)\" [value]=\"getOptionValue(opt)\">\n <ng-container *ngIf=\"config.isCompareRuns\"> \n <ng-container *ngIf=\"useCheckboxStyle; else compareRunsDefaultOptionTpl\">\n <span class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-compare-runs-item\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"hasHighlighting\"\n [style.color]=\"opt.statusColor || null\"\n [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <ng-container *ngIf=\"!hasHighlighting\">\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"opt.runNumberLabel && opt.runDateLabel; else checkboxDefaultLabel\">\n <span [style.color]=\"opt.statusColor || null\">{{ opt.runNumberLabel }}</span>\n <span class=\"cqa-text-[#6B7280]\"> {{ opt.runDateLabel }}&nbsp;</span>\n </span>\n <ng-template #checkboxDefaultLabel>\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n [style.color]=\"opt.statusColor || null\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </ng-template>\n </ng-container>\n </span>\n <span\n *ngIf=\"opt.durationFormatted\"\n class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-1 cqa-text-[12px] cqa-text-[#6B7280] cqa-flex-shrink-0 cqa-whitespace-nowrap cqa-max-w-[80px]\" \n [ngClass]=\"{\n 'cqa-min-w-[82px]': opt?.hasHourRun,\n 'cqa-min-w-[66px]': !opt?.hasHourRun && opt?.hasMinuteRun,\n 'cqa-min-w-[40px]': !opt?.hasHourRun && !opt?.hasMinuteRun\n }\">\n <svg class=\"cqa-min-w-[12px] cqa-max-w-[12px]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"#9CA3AF\" stroke-width=\"1\"/>\n <path d=\"M6 3.5V6L7.5 7\" stroke=\"#4B5563\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>{{ opt.durationFormatted }}</span>\n </span>\n </span>\n </ng-container>\n <ng-template #compareRunsDefaultOptionTpl>\n <span class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-compare-runs-item\">\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"hasHighlighting\"\n [style.color]=\"opt.statusColor || null\"\n [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <ng-container *ngIf=\"!hasHighlighting\">\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"opt.runNumberLabel && opt.runDateLabel; else defaultLabel\">\n <span [style.color]=\"opt.statusColor || null\">{{ opt.runNumberLabel }}</span>\n <span class=\"cqa-text-[#6B7280]\"> {{ opt.runDateLabel }}&nbsp;</span>\n </span>\n <ng-template #defaultLabel>\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n [style.color]=\"opt.statusColor || null\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </ng-template>\n </ng-container>\n <span\n *ngIf=\"opt.durationFormatted\"\n class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-1 cqa-text-[12px] cqa-text-[#6B7280] cqa-flex-shrink-0 cqa-whitespace-nowrap cqa-max-w-[80px]\" \n [ngClass]=\"{\n 'cqa-min-w-[82px]': opt?.hasHourRun,\n 'cqa-min-w-[66px]': !opt?.hasHourRun && opt?.hasMinuteRun,\n 'cqa-min-w-[40px]': !opt?.hasHourRun && !opt?.hasMinuteRun\n }\">\n <svg class=\"cqa-min-w-[12px] cqa-max-w-[12px]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"#9CA3AF\" stroke-width=\"1\"/>\n <path d=\"M6 3.5V6L7.5 7\" stroke=\"#4B5563\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>{{ opt.durationFormatted }}</span>\n </span>\n </span>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"!config.isCompareRuns\">\n <ng-container *ngIf=\"useCheckboxStyle; else defaultOptionTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <!-- When displayLabelAsInnerHtml is true, render label as raw HTML -->\n <span class=\"cqa-min-w-0\"\n *ngIf=\"config?.displayLabelAsInnerHtml\"\n [innerHTML]=\"opt.label ?? opt.name ?? opt.value\">\n </span>\n <!-- Otherwise use normal/highlighted text rendering -->\n <span class=\"cqa-min-w-0\"\n *ngIf=\"!config?.displayLabelAsInnerHtml && hasHighlighting\"\n [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\">\n </span>\n <span class=\"cqa-min-w-0\"\n *ngIf=\"!config?.displayLabelAsInnerHtml && !hasHighlighting\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </span>\n </ng-container>\n <ng-template #defaultOptionTpl>\n <!-- When displayLabelAsInnerHtml is true, render label as raw HTML -->\n <span *ngIf=\"config?.displayLabelAsInnerHtml\"\n [innerHTML]=\"opt.label ?? opt.name ?? opt.value\">\n </span>\n <!-- Otherwise use normal/highlighted text rendering -->\n <span *ngIf=\"!config?.displayLabelAsInnerHtml && hasHighlighting\"\n [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\">\n </span>\n <span *ngIf=\"!config?.displayLabelAsInnerHtml && !hasHighlighting\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </ng-template>\n </ng-container>\n </mat-option>\n \n <!-- No results state (only when not loading and no options) -->\n <mat-option disabled *ngIf=\"!(config?.options?.length || 0) && !(config?.isLoading || loadingMore)\">\n No results\n </mat-option>\n <!-- Infinite scroll sentinel (serverSearch or explicit hasMore) -->\n <mat-option disabled class=\"load-more-sentinel\" *ngIf=\"config?.hasMore\">\n <span *ngIf=\"loadingMore || config?.isLoading\">Loading...</span>\n <span *ngIf=\"!loadingMore && !config?.isLoading\">Scroll to load more\u2026</span>\n </mat-option>\n </mat-select>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Inline spinner shown when loading more (infinite scroll) or when config.isLoading is true -->\n <svg *ngIf=\"loadingMore || config?.isLoading\" width=\"16\" height=\"16\" viewBox=\"0 0 50 50\" aria-label=\"loading\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"25\" cy=\"25\" r=\"20\" stroke=\"#E5E7EB\" stroke-width=\"6\" fill=\"none\"/>\n <path d=\"M45 25a20 20 0 0 0-20-20\" stroke=\"#4F46E5\" stroke-width=\"6\" fill=\"none\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 25 25\" to=\"360 25 25\"\n dur=\"0.8s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </mat-form-field>\n </ng-container>\n</div>" }]
652
666
  }], propDecorators: { form: [{
653
667
  type: Input
654
668
  }], config: [{
@@ -673,4 +687,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
673
687
  type: HostListener,
674
688
  args: ['document:click', ['$event']]
675
689
  }] } });
676
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFvQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBa0V2SyxNQUFNLE9BQU8sMkJBQTJCO0lBTHhDO1FBTVcscUJBQWdCLEdBQVcsZ0JBQWdCLENBQUM7UUFDNUMsNEJBQXVCLEdBQVcsaUJBQWlCLENBQUM7UUFHbkQsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBdUQsQ0FBQztRQUMxRixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDakQscUVBQXFFO1FBQzNELGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWtDLENBQUM7UUFDNUUsd0VBQXdFO1FBQzlELGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBa0MsQ0FBQztRQUN4RSxzSkFBc0o7UUFDNUksbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBa0MsQ0FBQztRQUs5RSxnRkFBZ0Y7UUFDaEYsb0JBQWUsR0FBMkIsRUFBRSxDQUFDO1FBR3JDLHNCQUFpQixHQUFHLENBQUMsQ0FBQztRQUM5QixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUVwQjs7O1dBR0c7UUFDSyx5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFDN0Isa0JBQWEsR0FBRyxHQUFHLEVBQUU7WUFDM0IsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztZQUNqQyxJ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QUFPLENBQUMsUUFBUSxDQUFDLENBQUM7U0FBRTtRQUFDLE1BQU0sR0FBRTtJQUMzRCxDQUFDOzt3SEFsbUJVLDJCQUEyQjs0R0FBM0IsMkJBQTJCLHVmQWVJLFVBQVUsa0RDakZ0RCw4K1lBaU1NOzJGRC9ITywyQkFBMkI7a0JBTHZDLFNBQVM7K0JBQ0Usb0JBQW9CLG1CQUViLHVCQUF1QixDQUFDLE1BQU07OEJBS3RDLElBQUk7c0JBQVosS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0ksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLFlBQVk7c0JBQXJCLE1BQU07Z0JBRUcsUUFBUTtzQkFBakIsTUFBTTtnQkFFRyxjQUFjO3NCQUF2QixNQUFNO2dCQUVvQyxTQUFTO3NCQUFuRCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ2UsTUFBTTtzQkFBN0QsU0FBUzt1QkFBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBOGV0RCxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0U2VsZWN0LCBNYXRTZWxlY3RDaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuXG4vLyBMb2NhbCBvcHRpb24gbW9kZWwgKHByZXZpb3VzbHkgaW1wb3J0ZWQgZnJvbSByZW1vdmVkIGNxYS1zZWxlY3QgY29tcG9uZW50KVxuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RPcHRpb24ge1xuICBpZD86IGFueTtcbiAgdmFsdWU/OiBhbnk7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nO1xuICBzdGF0dXNDb2xvcj86IHN0cmluZztcbiAgZHVyYXRpb25Gb3JtYXR0ZWQ/OiBzdHJpbmc7XG4gIHJ1bk51bWJlckxhYmVsPzogc3RyaW5nO1xuICBoYXNIb3VyUnVuPzogYm9vbGVhbjtcbiAgaGFzTWludXRlUnVuPzogYm9vbGVhbjtcbiAgcnVuRGF0ZUxhYmVsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gIGtleTogc3RyaW5nO1xuICBsYWJlbD86IHN0cmluZztcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIGRpc3BsYXlMYWJlbEFzSW5uZXJIdG1sPzogYm9vbGVhbjtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBtdWx0aXBsZT86IGJvb2xlYW47XG4gIHNlYXJjaGFibGU/OiBib29sZWFuO1xuICAvKiogQ29udHJvbHMgaG93IHNlbGVjdGlvbiBpbmRpY2F0b3IgaXMgc2hvd24gZm9yIG11bHRpLXNlbGVjdCBvcHRpb25zLiAqL1xuICBvcHRpb25TdHlsZT86ICdjaGVja21hcmsnIHwgJ2NoZWNrYm94JztcbiAgLyoqIFNob3cgYSAnU2VsZWN0IEFsbCcgb3B0aW9uIGF0IHRoZSB0b3AgKG11bHRpLXNlbGVjdCBvbmx5KS4gKi9cbiAgc2hvd1NlbGVjdEFsbD86IGJvb2xlYW47XG4gIC8qKiBDdXN0b20gbGFiZWwgZm9yIHRoZSAnU2VsZWN0IEFsbCcgb3B0aW9uLiBEZWZhdWx0cyB0byAnQWxsJy4gKi9cbiAgc2VsZWN0QWxsTGFiZWw/OiBzdHJpbmc7XG4gIC8qKiBJZiB0cnVlLCBjbG9zZSB0aGUgcGFuZWwgd2hlbiBhbiBvcHRpb24gaXMgc2VsZWN0ZWQgKHVzZWZ1bCBmb3IgbXVsdGktc2VsZWN0IGluIGhlYWRlcnMpLiAqL1xuICBjbG9zZU9uU2VsZWN0PzogYm9vbGVhbjtcbiAgLyoqIFByb3ZpZGUgYSBkZWZhdWx0IHNlbGVjdGVkIHZhbHVlIChvciBhcnJheSBmb3IgbXVsdGktc2VsZWN0KSBpZiB0aGUgY29udHJvbCBoYXMgbm8gdmFsdWUgeWV0LiAqL1xuICBzZWxlY3RlZFZhbHVlPzogYW55IHwgYW55W107XG4gIC8qKiBPcHRpb25hbCBjYWxsYmFjayBpbnZva2VkIHdoZW5ldmVyIHRoZSBzZWxlY3Rpb24gY2hhbmdlcy4gKi9cbiAgb25DaGFuZ2U/OiAodmFsdWU6IGFueSwgZXZlbnQ/OiBNYXRTZWxlY3RDaGFuZ2UpID0+IHZvaWQ7XG4gIC8qKiBFbmFibGUgc2VydmVyLXNpZGUgc2VhcmNoIG1vZGU7IGNvbXBvbmVudCB3aWxsIGVtaXQgc2VhcmNoIGluc3RlYWQgb2YgbG9jYWwgZmlsdGVyaW5nLiAqL1xuICBzZXJ2ZXJTZWFyY2g/OiBib29sZWFuO1xuICAvKipcbiAgICogV2hlbiB0cnVlLCB0cmlnZ2VycyBhbiBpbml0aWFsIHNlYXJjaCBlbWl0IG9uIHBhbmVsIG9wZW4gKHNlcnZlclNlYXJjaCBtb2RlIG9ubHkpLlxuICAgKiBEZWZhdWx0cyB0byBmYWxzZSBzbyBvcGVuaW5nIHRoZSBkcm9wZG93biBkb2VzIE5PVCBjYWxsIHRoZSBBUEkuXG4gICAqL1xuICBpbml0aWFsRmV0Y2hPbk9wZW4/OiBib29sZWFuO1xuICAvKiogSW5kaWNhdGVzIG1vcmUgcmVzdWx0cyBhcmUgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwuICovXG4gIGhhc01vcmU/OiBib29sZWFuO1xuICAvKiogT3B0aW9uYWwgbG9hZGluZyBmbGFnIGNvbnRyb2xsZWQgYnkgY29uc3VtZXIgdG8gc2hvdyBsb2FkaW5nIHN0YXRlLiAqL1xuICBpc0xvYWRpbmc/OiBib29sZWFuO1xuICAvKiogT3B0aW9uYWwgY2FsbGJhY2sgZm9yIHNlcnZlci1zaWRlIHNlYXJjaCB3aGVuIHF1ZXJ5IGNoYW5nZXMuICovXG4gIG9uU2VhcmNoPzogKHF1ZXJ5OiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKiBPcHRpb25hbCBjYWxsYmFjayB3aGVuIG1vcmUgZGF0YSBpcyByZXF1ZXN0ZWQgKGluZmluaXRlIHNjcm9sbCkuICovXG4gIG9uTG9hZE1vcmU/OiAocXVlcnk/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKiBPcHRpb25hbCByZWdleCBwYXR0ZXJuIG9yIGZ1bmN0aW9uIHRvIGhpZ2hsaWdodCBwYXJ0cyBvZiBvcHRpb24gdGV4dC4gKi9cbiAgaGlnaGxpZ2h0UGF0dGVybj86IFJlZ0V4cCB8IHN0cmluZyB8ICgodGV4dDogc3RyaW5nKSA9PiBzdHJpbmcpO1xuICAvKiogV2hlbiB0cnVlIChhbmQgc2VhcmNoYWJsZSksIGFsbG93cyBhZGRpbmcgdGhlIGN1cnJlbnQgc2VhcmNoIHRleHQgYXMgYSBuZXcgb3B0aW9uIHZpYSBhbiBcIkFkZCAnPHZhbHVlPidcIiBjaG9pY2UuICovXG4gIGFsbG93Q3VzdG9tVmFsdWU/OiBib29sZWFuO1xuICBvcHRpb25zOiBTZWxlY3RPcHRpb25bXTtcbiAgaXNDb21wYXJlUnVucz86IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1keW5hbWljLXNlbGVjdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNTZWxlY3RGaWVsZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgcmVhZG9ubHkgU0VMRUNUX0FMTF9WQUxVRTogc3RyaW5nID0gJ19fc2VsZWN0X2FsbF9fJztcbiAgcmVhZG9ubHkgQUREX0NVU1RPTV9WQUxVRV9QUkVGSVg6IHN0cmluZyA9ICdfX2FkZF9jdXN0b21fXzonO1xuICBASW5wdXQoKSBmb3JtITogRm9ybUdyb3VwO1xuICBASW5wdXQoKSBjb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHZhbHVlOiBhbnk7IGV2ZW50OiBNYXRTZWxlY3RDaGFuZ2UgfT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogRW1pdHMgd2hlbiB1c2VyIHR5cGVzIGluIHNlYXJjaCBib3ggKHVzZWZ1bCBmb3Igc2VydmVyIHNlYXJjaCkgKi9cbiAgQE91dHB1dCgpIHNlYXJjaENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9PigpO1xuICAvKiogRW1pdHMgd2hlbiB0aGUgY29tcG9uZW50IHJlcXVlc3RzIG1vcmUgZGF0YSBmb3IgdGhlIGN1cnJlbnQgcXVlcnkgKi9cbiAgQE91dHB1dCgpIGxvYWRNb3JlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0+KCk7XG4gIC8qKiBFbWl0cyB3aGVuIHRoZSB1c2VyIGNob29zZXMgdG8gYWRkIGEgY3VzdG9tIHZhbHVlIChhbGxvd0N1c3RvbVZhbHVlOiB0cnVlKS4gQ29uc3VtZXIgc2hvdWxkIGFkZCB0aGUgdmFsdWUgdG8gb3B0aW9ucyBhbmQgc2V0IHRoZSBjb250cm9sIHZhbHVlLiAqL1xuICBAT3V0cHV0KCkgYWRkQ3VzdG9tVmFsdWUgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT4oKTtcblxuICBAVmlld0NoaWxkKCdzZWxlY3RSZWYnLCB7IHN0YXRpYzogZmFsc2UgfSkgc2VsZWN0UmVmPzogTWF0U2VsZWN0O1xuICBAVmlld0NoaWxkKCdob3N0JywgeyBzdGF0aWM6IGZhbHNlLCByZWFkOiBFbGVtZW50UmVmIH0pIGhvc3RFbD86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIC8vIE11c3QgYmUgcHVibGljIGZvciB0ZW1wbGF0ZSBhY2Nlc3MgaW4gQW5ndWxhcidzIHN0cmljdCB0ZW1wbGF0ZSBjaGVja2luZyBtb2RlXG4gIHNlYXJjaFRleHRCeUtleTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBwcml2YXRlIG91dHNpZGVDbGVhbnVwPzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBsb2FkTW9yZU9ic2VydmVyPzogSW50ZXJzZWN0aW9uT2JzZXJ2ZXI7XG4gIHByaXZhdGUgbGFzdE9wdGlvbnNMZW5ndGggPSAwO1xuICBsb2FkaW5nTW9yZSA9IGZhbHNlO1xuICBwcml2YXRlIHBhbmVsU2Nyb2xsRWw/OiBIVE1MRWxlbWVudDtcbiAgLyoqXG4gICAqIEd1YXJkIHRvIGVuc3VyZSBsb2FkLW1vcmUgaXMgb25seSB0cmlnZ2VyZWQgYWZ0ZXIgdGhlIHVzZXIgaGFzIHNjcm9sbGVkXG4gICAqIGF0IGxlYXN0IG9uY2Ugc2luY2Ugb3BlbmluZyB0aGUgcGFuZWwuIFByZXZlbnRzIGF1dG8tbG9hZCBvbiBvcGVuLlxuICAgKi9cbiAgcHJpdmF0ZSBoYXNTY3JvbGxlZFNpbmNlT3BlbiA9IGZhbHNlO1xuICBwcml2YXRlIG9uUGFuZWxTY3JvbGwgPSAoKSA9PiB7XG4gICAgdGhpcy5oYXNTY3JvbGxlZFNpbmNlT3BlbiA9IHRydWU7XG4gICAgaWYgKCF0aGlzLmNvbmZpZz8uaGFzTW9yZSB8fCB0aGlzLmxvYWRpbmdNb3JlKSByZXR1cm47XG4gICAgY29uc3QgZWwgPSB0aGlzLnBhbmVsU2Nyb2xsRWw7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IG5lYXJCb3R0b20gPSBlbC5zY3JvbGxUb3AgKyBlbC5jbGllbnRIZWlnaHQgPj0gZWwuc2Nyb2xsSGVpZ2h0IC0gNDg7IC8vIH4zIG9wdGlvbiByb3dzXG4gICAgaWYgKG5lYXJCb3R0b20pIHtcbiAgICAgIHRoaXMubG9hZGluZ01vcmUgPSB0cnVlO1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWc/LmtleSB8fCAnJztcbiAgICAgIGNvbnN0IHEgPSB0aGlzLnNlYXJjaFRleHRCeUtleVtrZXldIHx8ICcnO1xuICAgICAgdGhpcy5sb2FkTW9yZS5lbWl0KHsga2V5LCBxdWVyeTogcSB9KTtcbiAgICAgIHRyeSB7IHRoaXMuY29uZmlnLm9uTG9hZE1vcmU/LihxKTsgfSBjYXRjaCB7fVxuICAgIH1cbiAgfTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnIHx8ICF0aGlzLmNvbmZpZy5rZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3FhLWR5bmFtaWMtc2VsZWN0OiBpbnB1dCBcImNvbmZpZy5rZXlcIiBpcyByZXF1aXJlZC4nKTtcbiAgICB9XG4gICAgdGhpcy5hcHBseVNlbGVjdGVkVmFsdWVJZk5lZWRlZCgpO1xuICAgIHRoaXMuc3luY0Rpc2FibGVkU3RhdGUoKTtcbiAgICB0aGlzLmxhc3RPcHRpb25zTGVuZ3RoID0gKHRoaXMuY29uZmlnPy5vcHRpb25zIHx8IFtdKS5sZW5ndGg7XG4gIH1cblxuICBnZXQgZGlzcGxheVBsYWNlaG9sZGVyKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWc/LmtleTtcbiAgICBpZiAoIWtleSB8fCAhdGhpcy5mb3JtKSByZXR1cm4gdGhpcy5jb25maWc/LnBsYWNlaG9sZGVyO1xuICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHRoaXMuZm9ybS5nZXQoa2V5KT8udmFsdWU7XG4gICAgcmV0dXJuIHRoaXMuaGFzRXhpc3RpbmdWYWx1ZShjb250cm9sVmFsdWUpID8gdW5kZWZpbmVkIDogdGhpcy5jb25maWc/LnBsYWNlaG9sZGVyO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmICgnY29uZmlnJyBpbiBjaGFuZ2VzIHx8ICdmb3JtJyBpbiBjaGFuZ2VzKSB7XG4gICAgICB0aGlzLnN5bmNEaXNhYmxlZFN0YXRlKCk7XG4gICAgfVxuICAgIGlmICgnY29uZmlnJyBpbiBjaGFuZ2VzKSB7XG4gICAgICAvLyBXaGVuIGNvbmZpZyBjaGFuZ2VzIChpbmNsdWRpbmcgdG9nZ2xpbmcgbXVsdGlwbGUpLCBlbnN1cmUgY29udHJvbCB2YWx1ZSBzaGFwZSBtYXRjaGVzXG4gICAgICB0aGlzLnN5bmNDb250cm9sVmFsdWVGb3JNdWx0aXBsZU1vZGUoKTtcbiAgICAgIHRoaXMuYXBwbHlTZWxlY3RlZFZhbHVlSWZOZWVkZWQoKTtcbiAgICAgIC8vIFN5bmMgbG9hZGluZ01vcmUgd2l0aCBjb25maWcuaXNMb2FkaW5nIHdoZW4gcHJvdmlkZWQgYnkgcGFyZW50XG4gICAgICAvLyBUaGlzIGFsbG93cyBwYXJlbnQgdG8gY29udHJvbCBsb2FkaW5nIHN0YXRlIChlLmcuLCBkdXJpbmcgbG9hZCBtb3JlIG9wZXJhdGlvbnMpXG4gICAgICBpZiAodGhpcy5jb25maWc/LmlzTG9hZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9hZGluZ01vcmUgPSB0aGlzLmNvbmZpZy5pc0xvYWRpbmc7XG4gICAgICB9XG4gICAgICAvLyBSZXNldCBsb2FkaW5nTW9yZSB3aGVuIG5ldyBvcHRpb25zIGFycml2ZSAob3B0aW9ucyBsZW5ndGggaW5jcmVhc2VkKVxuICAgICAgY29uc3QgbGVuID0gKHRoaXMuY29uZmlnPy5vcHRpb25zIHx8IFtdKS5sZW5ndGg7XG4gICAgICBpZiAobGVuID4gdGhpcy5sYXN0T3B0aW9uc0xlbmd0aCkge1xuICAgICAgICAvLyBSZXNldCBsb2FkaW5nIHN0YXRlIHdoZW4gbmV3IGRhdGEgYXJyaXZlcywgdW5sZXNzIHBhcmVudCBleHBsaWNpdGx5IHNheXMgc3RpbGwgbG9hZGluZ1xuICAgICAgICBpZiAodGhpcy5jb25maWc/LmlzTG9hZGluZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdNb3JlID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWc/LmlzTG9hZGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gT25seSBhdXRvLXJlc2V0IGlmIHBhcmVudCBkb2Vzbid0IGNvbnRyb2wgbG9hZGluZyBzdGF0ZVxuICAgICAgICAgIHRoaXMubG9hZGluZ01vcmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5sYXN0T3B0aW9uc0xlbmd0aCA9IGxlbjtcbiAgICAgIC8vIElmIGNvbnN1bWVyIGluZGljYXRlcyBubyBtb3JlIHJlc3VsdHMsIGNsZWFyIGxvYWRpbmcgc3RhdGUgYW5kIGFueSBvYnNlcnZlcnNcbiAgICAgIGlmICghdGhpcy5jb25maWc/Lmhhc01vcmUpIHtcbiAgICAgICAgLy8gQ2xlYXIgbG9hZGluZyBzdGF0ZSB3aGVuIG5vIG1vcmUgcmVzdWx0cywgdW5sZXNzIHBhcmVudCBleHBsaWNpdGx5IHNheXMgc3RpbGwgbG9hZGluZ1xuICAgICAgICBpZiAodGhpcy5jb25maWc/LmlzTG9hZGluZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdNb3JlID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWc/LmlzTG9hZGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nTW9yZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIpIHtcbiAgICAgICAgICB0cnkgeyB0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIuZGlzY29ubmVjdCgpOyB9IGNhdGNoIHt9XG4gICAgICAgICAgdGhpcy5sb2FkTW9yZU9ic2VydmVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBJZiBwYW5lbCBpcyBvcGVuIGFuZCBoYXNNb3JlIGlzIHRydWUsIGVuc3VyZSB0aGUgc2VudGluZWwgaXMgYmVpbmcgb2JzZXJ2ZWQuXG4gICAgICBpZiAodGhpcy5zZWxlY3RSZWY/LnBhbmVsT3BlbiAmJiB0aGlzLmNvbmZpZz8uaGFzTW9yZSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2V0dXBMb2FkTW9yZU9ic2VydmVyKCksIDApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoJ2Zvcm0nIGluIGNoYW5nZXMgJiYgIWNoYW5nZXNbJ2Zvcm0nXS5maXJzdENoYW5nZSkge1xuICAgICAgdGhpcy5hcHBseVNlbGVjdGVkVmFsdWVJZk5lZWRlZCgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBwYW5lbENsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBjdGMtc2VsZWN0LXBhbmVsICR7dGhpcy5pc011bHRpcGxlID8gJ211bHRpcGxlJyA6ICcnfSAke3RoaXMuY29uZmlnPy5pc0NvbXBhcmVSdW5zID8gJ2NvbXBhcmUtcnVucy1zZWxlY3QtcGFuZWwnIDogJyd9YC50cmltKCk7XG4gIH1cblxuICBnZXQgaXNNdWx0aXBsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50b0Jvb2xlYW4odGhpcy5jb25maWc/Lm11bHRpcGxlKTtcbiAgfVxuXG4gIGdldCBpc0Rpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRvQm9vbGVhbih0aGlzLmNvbmZpZz8uZGlzYWJsZWQpO1xuICB9XG4gIFxuICBnZXQgdXNlQ2hlY2tib3hTdHlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc011bHRpcGxlICYmICh0aGlzLmNvbmZpZz8ub3B0aW9uU3R5bGUgPT09ICdjaGVja2JveCcpO1xuICB9XG4gIFxuICBnZXQgYWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmlzTXVsdGlwbGUpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5O1xuICAgIGlmICgha2V5IHx8ICF0aGlzLmZvcm0pIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChrZXkpO1xuICAgIGlmICghY29udHJvbCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gY29udHJvbC52YWx1ZSBhcyBhbnlbXTtcbiAgICBjb25zdCBhbGxJZHMgPSB0aGlzLmdldEFsbE9wdGlvbklkcygpO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzZWxlY3RlZCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWFsbElkcy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gYWxsSWRzLmV2ZXJ5KGlkID0+IHNlbGVjdGVkLmluY2x1ZGVzKGlkKSk7XG4gIH1cblxuICBwcml2YXRlIHRvQm9vbGVhbih2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCB2ID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAodiA9PT0gJ3RydWUnIHx8IHYgPT09ICcxJykgcmV0dXJuIHRydWU7XG4gICAgICBpZiAodiA9PT0gJ2ZhbHNlJyB8fCB2ID09PSAnMCcgfHwgdiA9PT0gJycpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlOyAvLyBhbnkgb3RoZXIgbm9uLWVtcHR5IHN0cmluZyB0cmVhdGVkIGFzIHRydXRoeVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHZhbHVlICE9PSAwO1xuICAgIH1cbiAgICByZXR1cm4gISF2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jIHRoZSBmb3JtIGNvbnRyb2wncyBkaXNhYmxlZCBzdGF0ZSBmcm9tIGNvbmZpZy5cbiAgICogVXNlIHRoZSBGb3JtQ29udHJvbCBBUEkgaW5zdGVhZCBvZiBbZGlzYWJsZWRdIGluIHRoZSB0ZW1wbGF0ZSB0byBhdm9pZCBBbmd1bGFyJ3NcbiAgICogXCJjaGFuZ2VkIGFmdGVyIGNoZWNrZWRcIiAvIHJlYWN0aXZlIGZvcm1zIGRpc2FibGVkLWF0dHJpYnV0ZSB3YXJuaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBzeW5jRGlzYWJsZWRTdGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5O1xuICAgIGlmICgha2V5IHx8ICF0aGlzLmZvcm0pIHJldHVybjtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChrZXkpO1xuICAgIGlmICghY29udHJvbCkgcmV0dXJuO1xuICAgIGNvbnN0IHNob3VsZERpc2FibGUgPSB0aGlzLnRvQm9vbGVhbih0aGlzLmNvbmZpZz8uZGlzYWJsZWQpO1xuICAgIGlmIChzaG91bGREaXNhYmxlKSB7XG4gICAgICBjb250cm9sLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250cm9sLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jQ29udHJvbFZhbHVlRm9yTXVsdGlwbGVNb2RlKCk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnPy5rZXk7XG4gICAgaWYgKCFrZXkgfHwgIXRoaXMuZm9ybSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XG4gICAgaWYgKCFjb250cm9sKSByZXR1cm47XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBpZiAodGhpcy5pc011bHRpcGxlKSB7XG4gICAgICBpZiAoY3VycmVudFZhbHVlID09IG51bGwpIHJldHVybjtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnRWYWx1ZSkpIHJldHVybjtcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUoW2N1cnJlbnRWYWx1ZV0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGN1cnJlbnRWYWx1ZSkpIHJldHVybjtcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUoY3VycmVudFZhbHVlLmxlbmd0aCA/IGN1cnJlbnRWYWx1ZVswXSA6IG51bGwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5U2VsZWN0ZWRWYWx1ZUlmTmVlZGVkKCk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnPy5rZXk7XG4gICAgaWYgKCFrZXkgfHwgIXRoaXMuZm9ybSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XG4gICAgaWYgKCFjb250cm9sKSByZXR1cm47XG4gICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZSA9IHRoaXMuY29uZmlnPy5zZWxlY3RlZFZhbHVlO1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgaWYgKHRoaXMuaGFzRXhpc3RpbmdWYWx1ZShjdXJyZW50VmFsdWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzZWxlY3RlZFZhbHVlID09PSB1bmRlZmluZWQgfHwgc2VsZWN0ZWRWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzTXVsdGlwbGUpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSAoQXJyYXkuaXNBcnJheShzZWxlY3RlZFZhbHVlKSA/IHNlbGVjdGVkVmFsdWUgOiBbc2VsZWN0ZWRWYWx1ZV0pLmZpbHRlcihcbiAgICAgICAgKHZhbCkgPT4gdmFsICE9PSB1bmRlZmluZWQsXG4gICAgICApO1xuICAgICAgaWYgKCFub3JtYWxpemVkLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgY29udHJvbC5zZXRWYWx1ZShub3JtYWxpemVkLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBBcnJheS5pc0FycmF5KHNlbGVjdGVkVmFsdWUpXG4gICAgICAgID8gKHNlbGVjdGVkVmFsdWUubGVuZ3RoID8gc2VsZWN0ZWRWYWx1ZVswXSA6IHVuZGVmaW5lZClcbiAgICAgICAgOiBzZWxlY3RlZFZhbHVlO1xuICAgICAgaWYgKG5vcm1hbGl6ZWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgY29udHJvbC5zZXRWYWx1ZShub3JtYWxpemVkLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYXNFeGlzdGluZ1ZhbHVlKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5zb21lKCh2YWwpID0+IHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09ICcnKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpc09wdGlvblNlbGVjdGVkKG9wdDogU2VsZWN0T3B0aW9uKTogYm9vbGVhbiB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWc/LmtleTtcbiAgICBpZiAoIWtleSB8fCAhdGhpcy5mb3JtKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoa2V5KTtcbiAgICBpZiAoIWNvbnRyb2wpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBjb250cm9sVmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgIGNvbnN0IG9wdGlvbklkID0gb3B0LmlkID8/IG9wdC52YWx1ZTtcbiAgICBpZiAodGhpcy5pc011bHRpcGxlKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29udHJvbFZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIGNvbnRyb2xWYWx1ZS5pbmNsdWRlcyhvcHRpb25JZCk7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sVmFsdWUgPT09IG9wdGlvbklkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBbGxPcHRpb25JZHMoKTogYW55W10ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmNvbmZpZz8ub3B0aW9ucyB8fCBbXTtcbiAgICByZXR1cm4gb3B0aW9ucy5tYXAobyA9PiAoby5pZCA/PyBvLnZhbHVlKSkuZmlsdGVyKHYgPT4gdiAhPT0gdW5kZWZpbmVkKTtcbiAgfVxuXG4gIG9uVG9nZ2xlU2VsZWN0QWxsKHNlbGVjdDogTWF0U2VsZWN0KTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWc/LmtleTtcbiAgICBpZiAoIWtleSB8fCAhdGhpcy5mb3JtKSByZXR1cm47XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoa2V5KTtcbiAgICBpZiAoIWNvbnRyb2wpIHJldHVybjtcbiAgICBjb25zdCBhbGxJZHMgPSB0aGlzLmdldEFsbE9wdGlvbklkcygpO1xuICAgIGlmICghYWxsSWRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmFsbFNlbGVjdGVkKSB7XG4gICAgICBjb250cm9sLnNldFZhbHVlKFtdLCB7IGVtaXRFdmVudDogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udHJvbC5zZXRWYWx1ZShhbGxJZHMsIHsgZW1pdEV2ZW50OiB0cnVlIH0pO1xuICAgIH1cbiAgICAvLyBLZWVwIHBhbmVsIG9wZW4gZm9yIGNvbnRpbnVlZCBzZWxlY3Rpb25zIGluIG11bHRpLXNlbGVjdFxuICAgIHRyeSB7IHNlbGVjdC5vcGVuKCk7IH0gY2F0Y2gge31cbiAgfVxuXG4gIG9uU2VsZWN0T3BlbmVkQ2hhbmdlKG9wZW5lZDogYm9vbGVhbiwgX3NlbGVjdDogTWF0U2VsZWN0KTogdm9pZCB7XG4gICAgaWYgKG9wZW5lZCkge1xuICAgICAgLy8gRW1pdCBjbGljayBldmVudCB3aGVuIHNlbGVjdCBpcyBvcGVuZWQgKGNsaWNrZWQpXG4gICAgICB0aGlzLnNlbGVjdENsaWNrLmVtaXQoKTtcbiAgICAgIC8vIFJlc2V0IGxvYWRpbmdNb3JlIHdoZW4gb3BlbmluZyBpZiBvcHRpb25zIGFscmVhZHkgZXhpc3QgKGRvbid0IHNob3cgbG9hZGVyIG9uIGluaXRpYWwgb3BlbilcbiAgICAgIGlmICgodGhpcy5jb25maWc/Lm9wdGlvbnMgfHwgW10pLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9yZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gRW5zdXJlIHdlIG9ubHkgdHJpZ2dlciBsb2FkLW1vcmUgYWZ0ZXIgYSByZWFsIHVzZXIgc2Nyb2xsXG4gICAgICB0aGlzLmhhc1Njcm9sbGVkU2luY2VPcGVuID0gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIGlmICghb3BlbmVkKSB7XG4gICAgICAvLyBSZXNldCBzZWFyY2ggdGV4dCBvbiBjbG9zZSBzbyB0aGUgbmV4dCBvcGVuIHNob3dzIGZ1bGwgbGlzdFxuICAgICAgaWYgKHRoaXMuY29uZmlnPy5rZXkpIHtcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0QnlLZXlbdGhpcy5jb25maWcua2V5XSA9ICcnO1xuICAgICAgfVxuICAgICAgLy8gRW5zdXJlIGFueSBwcmV2aW91cyBjdXN0b20gbGlzdGVuZXJzIGFyZSBjbGVhcmVkIChsZWdhY3kgY29tcGF0aWJpbGl0eSlcbiAgICAgIGlmICh0aGlzLm91dHNpZGVDbGVhbnVwKSB7XG4gICAgICAgIHRoaXMub3V0c2lkZUNsZWFudXAoKTtcbiAgICAgICAgdGhpcy5vdXRzaWRlQ2xlYW51cCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIC8vIERpc2Nvbm5lY3QgbG9hZC1tb3JlIG9ic2VydmVyIGlmIGFueVxuICAgICAgaWYgKHRoaXMubG9hZE1vcmVPYnNlcnZlcikge1xuICAgICAgICB0cnkgeyB0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIuZGlzY29ubmVjdCgpOyB9IGNhdGNoIHt9XG4gICAgICAgIHRoaXMubG9hZE1vcmVPYnNlcnZlciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIC8vIFJlbW92ZSBzY3JvbGwgbGlzdGVuZXIgaWYgYXR0YWNoZWRcbiAgICAgIGlmICh0aGlzLnBhbmVsU2Nyb2xsRWwpIHtcbiAgICAgICAgdHJ5IHsgdGhpcy5wYW5lbFNjcm9sbEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMub25QYW5lbFNjcm9sbCk7IH0gY2F0Y2gge31cbiAgICAgICAgdGhpcy5wYW5lbFNjcm9sbEVsID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgLy8gUmVzZXQgbG9hZGluZ01vcmUgd2hlbiBjbG9zaW5nXG4gICAgICB0aGlzLmxvYWRpbmdNb3JlID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRm9jdXMgdGhlIHNlYXJjaCBib3ggaWYgZW5hYmxlZFxuICAgIGlmICh0aGlzLmNvbmZpZz8uc2VhcmNoYWJsZSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PignLnRzLXNlbGVjdC1zZWFyY2gtaW5wdXQnKTtcbiAgICAgICAgaW5wdXQ/LmZvY3VzKCk7XG4gICAgICB9LCAwKTtcbiAgICB9XG5cbiAgICAvLyBPcHRpb25hbDogb25seSB0cmlnZ2VyIGluaXRpYWwgZmV0Y2ggb24gb3BlbiB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkLlxuICAgIGlmICh0aGlzLmNvbmZpZz8uc2VydmVyU2VhcmNoICYmIHRoaXMudG9Cb29sZWFuKHRoaXMuY29uZmlnPy5pbml0aWFsRmV0Y2hPbk9wZW4pKSB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZy5rZXk7XG4gICAgICBjb25zdCBxID0gdGhpcy5zZWFyY2hUZXh0QnlLZXlba2V5XSB8fCAnJztcbiAgICAgIHRyeSB7IHRoaXMuY29uZmlnLm9uU2VhcmNoPy4ocSk7IH0gY2F0Y2gge31cbiAgICAgIHRoaXMuc2VhcmNoQ2hhbmdlLmVtaXQoeyBrZXksIHF1ZXJ5OiBxIH0pO1xuICAgIH1cblxuICAgIC8vIFNldHVwIGluZmluaXRlIHNjcm9sbCBvYnNlcnZlciBvbiBzZW50aW5lbFxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZXR1cExvYWRNb3JlT2JzZXJ2ZXIoKSwgMCk7XG4gICAgLy8gQWxzbyBhdHRhY2ggYSBzY3JvbGwgbGlzdGVuZXIgZmFsbGJhY2sgZm9yIHJlbGlhYmxlIGxvYWQtbW9yZSB0cmlnZ2Vyc1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFuZWxzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubWF0LXNlbGVjdC1wYW5lbCcpKSBhcyBIVE1MRWxlbWVudFtdO1xuICAgICAgICB0aGlzLnBhbmVsU2Nyb2xsRWwgPSBwYW5lbHMubGVuZ3RoID8gcGFuZWxzW3BhbmVscy5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRoaXMucGFuZWxTY3JvbGxFbCkge1xuICAgICAgICAgIHRoaXMucGFuZWxTY3JvbGxFbC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLm9uUGFuZWxTY3JvbGwsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7fVxuICAgIH0sIDApO1xuICB9XG5cbiAgb25TZWFyY2goa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFRleHRCeUtleVtrZXldID0gdmFsdWUgPz8gJyc7XG4gICAgaWYgKHRoaXMuY29uZmlnPy5zZXJ2ZXJTZWFyY2gpIHtcbiAgICAgIC8vIEZvciBzZXJ2ZXItc2lkZSBzZWFyY2gsIGVtaXQgaW5zdGVhZCBvZiBsb2NhbCBmaWx0ZXJpbmdcbiAgICAgIHRyeSB7IHRoaXMuY29uZmlnLm9uU2VhcmNoPy4odmFsdWUgPz8gJycpOyB9IGNhdGNoIHt9XG4gICAgICB0aGlzLnNlYXJjaENoYW5nZS5lbWl0KHsga2V5LCBxdWVyeTogdmFsdWUgPz8gJycgfSk7XG4gICAgICAvLyBSZXNldCBpbnRlcm5hbCBwYWdpbmcgc3RhdGVcbiAgICAgIHRoaXMubG9hZGluZ01vcmUgPSBmYWxzZTtcbiAgICAgIHRoaXMubGFzdE9wdGlvbnNMZW5ndGggPSAodGhpcy5jb25maWc/Lm9wdGlvbnMgfHwgW10pLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9wdGlvbiBpZHMgZm9yIHRoZSBjb25maWd1cmVkIGNvbnRyb2wuXG4gICAqL1xuICBwcml2YXRlIGdldFNlbGVjdGVkSWRzRm9yS2V5KGtleTogc3RyaW5nKTogYW55W10ge1xuICAgIGlmICgha2V5IHx8ICF0aGlzLmZvcm0pIHJldHVybiBbXTtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChrZXkpO1xuICAgIGlmICghY29udHJvbCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBpZiAodGhpcy5pc011bHRpcGxlKSB7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCA/IFt2YWx1ZV0gOiBbXTtcbiAgfVxuXG4gIC8qKiBQcm9ncmFtbWF0aWNhbGx5IGNsb3NlIHRoZSBzZWxlY3QgcGFuZWwgaWYgb3BlbiAqL1xuICBwdWJsaWMgY2xvc2VQYW5lbCgpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5zZWxlY3RSZWY/LmNsb3NlKCk7XG4gICAgfSBjYXRjaCB7fVxuICB9XG5cbiAgZmlsdGVyZWRPcHRpb25zKGM6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyk6IFNlbGVjdE9wdGlvbltdIHtcbiAgICBjb25zdCB0ID0gKHRoaXMuc2VhcmNoVGV4dEJ5S2V5W2Mua2V5XSB8fCAnJykudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgLy8gSW4gc2VydmVyLXNpZGUgbW9kZSwgcmV0dXJuIG9wdGlvbnMgYXMtaXMgKHBhcmVudCBwcm92aWRlcyBsaXN0KVxuICAgIGlmIChjLnNlcnZlclNlYXJjaCkgcmV0dXJuIGMub3B0aW9ucyB8fCBbXTtcbiAgICAvLyBXaGVuIG5vdCBzZWFyY2hpbmcsIHJldHVybiBmdWxsIGxpc3QgdG8gcHJlc2VydmUgb3JpZ2luYWwgb3JkZXJpbmdcbiAgICBpZiAoIXQpIHJldHVybiBjLm9wdGlvbnMgfHwgW107XG5cbiAgICBjb25zdCBhbGxPcHRpb25zID0gYy5vcHRpb25zIHx8IFtdO1xuICAgIGNvbnN0IGJhc2VGaWx0ZXJlZCA9IGFsbE9wdGlvbnMuZmlsdGVyKChvcHQpID0+IHtcbiAgICAgIGNvbnN0IHRleHQgPSBTdHJpbmcob3B0Lm5hbWUgPz8gb3B0LmxhYmVsID8/IG9wdC52YWx1ZSA/PyAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiB0ZXh0LmluY2x1ZGVzKHQpO1xuICAgIH0pO1xuXG4gICAgLy8gRW5zdXJlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24ocykgYXJlIGFsd2F5cyB2aXNpYmxlIHdoaWxlIHNlYXJjaGluZ1xuICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gdGhpcy5nZXRTZWxlY3RlZElkc0ZvcktleShjLmtleSk7XG4gICAgaWYgKCFzZWxlY3RlZElkcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBiYXNlRmlsdGVyZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgaWRPZiA9IChvOiBTZWxlY3RPcHRpb24pID0+IChvLmlkID8/IG8udmFsdWUpO1xuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9ucyA9IGFsbE9wdGlvbnMuZmlsdGVyKG8gPT4gc2VsZWN0ZWRJZHMuaW5jbHVkZXMoaWRPZihvKSkpO1xuXG4gICAgLy8gTWVyZ2Ugc2VsZWN0ZWQgb3B0aW9ucyAoa2VlcGluZyB0aGVpciBvcmlnaW5hbCBvcmRlcikgd2l0aCBmaWx0ZXJlZCBvbmVzLCBkZS1kdXBsaWNhdGVkXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8YW55PigpO1xuICAgIGNvbnN0IG1lcmdlZDogU2VsZWN0T3B0aW9uW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IG8gb2Ygc2VsZWN0ZWRPcHRpb25zKSB7XG4gICAgICBjb25zdCBpZCA9IGlkT2Yobyk7XG4gICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICBpZiAoIXNlZW4uaGFzKGlkKSkge1xuICAgICAgICBzZWVuLmFkZChpZCk7XG4gICAgICAgIG1lcmdlZC5wdXNoKG8pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IG8gb2YgYmFzZUZpbHRlcmVkKSB7XG4gICAgICBjb25zdCBpZCA9IGlkT2Yobyk7XG4gICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICBpZiAoIXNlZW4uaGFzKGlkKSkge1xuICAgICAgICBzZWVuLmFkZChpZCk7XG4gICAgICAgIG1lcmdlZC5wdXNoKG8pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9XG5cbiAgLyoqIFdoZW4gYWxsb3dDdXN0b21WYWx1ZSBpcyB0cnVlIGFuZCB0aGUgdXNlciBoYXMgdHlwZWQgYSB2YWx1ZSB0aGF0IGlzIG5vdCBpbiBvcHRpb25zLCByZXR1cm5zIHRoYXQgdmFsdWUgZm9yIHRoZSBcIkFkZFwiIG9wdGlvbi4gKi9cbiAgZ2V0IGN1c3RvbVZhbHVlVG9BZGQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgYyA9IHRoaXMuY29uZmlnO1xuICAgIGlmICghYz8ua2V5IHx8ICF0aGlzLnRvQm9vbGVhbihjLnNlYXJjaGFibGUpIHx8ICF0aGlzLnRvQm9vbGVhbihjLmFsbG93Q3VzdG9tVmFsdWUpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB0ID0gKHRoaXMuc2VhcmNoVGV4dEJ5S2V5W2Mua2V5XSB8fCAnJykudHJpbSgpO1xuICAgIGlmICghdCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgb3B0cyA9IGMub3B0aW9ucyB8fCBbXTtcbiAgICBjb25zdCBsb3dlciA9IHQudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBhbHJlYWR5RXhpc3RzID0gb3B0cy5zb21lKChvKSA9PiB7XG4gICAgICBjb25zdCB2ID0gU3RyaW5nKG8ubmFtZSA/PyBvLmxhYmVsID8/IG8udmFsdWUgPz8gby5pZCA/PyAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiB2ID09PSBsb3dlcjtcbiAgICB9KTtcbiAgICByZXR1cm4gYWxyZWFkeUV4aXN0cyA/IG51bGwgOiB0O1xuICB9XG5cbiAgZ2V0IHNob3dBZGRDdXN0b21PcHRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tVmFsdWVUb0FkZCAhPT0gbnVsbDtcbiAgfVxuXG4gIGdldCBhZGRDdXN0b21TZW50aW5lbFZhbHVlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgdiA9IHRoaXMuY3VzdG9tVmFsdWVUb0FkZDtcbiAgICByZXR1cm4gdiAhPSBudWxsID8gYCR7dGhpcy5BRERfQ1VTVE9NX1ZBTFVFX1BSRUZJWH0ke3Z9YCA6ICcnO1xuICB9XG5cbiAgLy8gQ2xvc2Ugd2hlbiBhbiBvcHRpb24gaXMgc2VsZWN0ZWQgaWYgcmVxdWVzdGVkLiBBbHdheXMgY2xvc2UgZm9yIHNpbmdsZS1zZWxlY3QuXG4gIG9uU2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiBNYXRTZWxlY3RDaGFuZ2UsIHNlbGVjdDogTWF0U2VsZWN0KTogdm9pZCB7XG4gICAgLy8gSGFuZGxlIGFkZC1jdXN0b20tdmFsdWUgc2VudGluZWwgKGFsbG93Q3VzdG9tVmFsdWUpXG4gICAgY29uc3QgcmF3ID0gZXZlbnQudmFsdWU7XG4gICAgY29uc3Qgc2VudGluZWxJbkFycmF5ID0gQXJyYXkuaXNBcnJheShyYXcpXG4gICAgICA/IHJhdy5maW5kKCh2OiBhbnkpID0+IHR5cGVvZiB2ID09PSAnc3RyaW5nJyAmJiB2LnN0YXJ0c1dpdGgodGhpcy5BRERfQ1VTVE9NX1ZBTFVFX1BSRUZJWCkpXG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgaXNBZGRDdXN0b20gPVxuICAgICAgKHR5cGVvZiByYXcgPT09ICdzdHJpbmcnICYmIHJhdy5zdGFydHNXaXRoKHRoaXMuQUREX0NVU1RPTV9WQUxVRV9QUkVGSVgpKSB8fCBzZW50aW5lbEluQXJyYXkgIT0gbnVsbDtcblxuICAgIGlmIChpc0FkZEN1c3RvbSkge1xuICAgICAgY29uc3Qgc2VudGluZWxTdHIgPSB0eXBlb2YgcmF3ID09PSAnc3RyaW5nJyA/IHJhdyA6IHNlbnRpbmVsSW5BcnJheTtcbiAgICAgIGNvbnN0IHZhbHVlID0gU3RyaW5nKHNlbnRpbmVsU3RyKS5zbGljZSh0aGlzLkFERF9DVVNUT01fVkFMVUVfUFJFRklYLmxlbmd0aCk7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5O1xuICAgICAgaWYgKGtleSAmJiB0aGlzLmZvcm0pIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICBpZiAodGhpcy5pc011bHRpcGxlICYmIEFycmF5LmlzQXJyYXkoY29udHJvbC52YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkID0gKGNvbnRyb2wudmFsdWUgYXMgYW55W10pLmZpbHRlcihcbiAgICAgICAgICAgICAgKHY6IGFueSkgPT4gdHlwZW9mIHYgIT09ICdzdHJpbmcnIHx8ICF2LnN0YXJ0c1dpdGgodGhpcy5BRERfQ1VTVE9NX1ZBTFVFX1BSRUZJWClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb250cm9sLnNldFZhbHVlKGZpbHRlcmVkLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUobnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5hZGRDdXN0b21WYWx1ZS5lbWl0KHsga2V5OiBrZXkgPz8gJycsIHZhbHVlIH0pO1xuICAgICAgaWYgKHRoaXMuY29uZmlnPy5zZWFyY2hhYmxlICYmIHRoaXMuY29uZmlnPy5rZXkpIHtcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0QnlLZXlbdGhpcy5jb25maWcua2V5XSA9ICcnO1xuICAgICAgfVxuICAgICAgdHJ5IHsgc2VsZWN0LmNsb3NlKCk7IH0gY2F0Y2gge31cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gSGFuZGxlIHNlbGVjdC1hbGwgc2VudGluZWwgaW4gbXVsdGktc2VsZWN0XG4gICAgaWYgKHRoaXMuaXNNdWx0aXBsZSAmJiBBcnJheS5pc0FycmF5KGV2ZW50LnZhbHVlKSAmJiBldmVudC52YWx1ZS5pbmNsdWRlcyh0aGlzLlNFTEVDVF9BTExfVkFMVUUpKSB7XG4gICAgICAvLyBSZW1vdmUgc2VudGluZWwgYW5kIHRvZ2dsZSBhbGxcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnPy5rZXk7XG4gICAgICBpZiAoa2V5ICYmIHRoaXMuZm9ybSkge1xuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChrZXkpO1xuICAgICAgICAvLyBUb2dnbGUgYmFzZWQgb24gY3VycmVudCBzdGF0ZVxuICAgICAgICB0aGlzLm9uVG9nZ2xlU2VsZWN0QWxsKHNlbGVjdCk7XG4gICAgICAgIC8vIEVuc3VyZSBzZW50aW5lbCBpcyBub3QgcHJlc2VudFxuICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgIGNvbnN0IGZpbHRlcmVkID0gKGNvbnRyb2wudmFsdWUgYXMgYW55W10pLmZpbHRlcih2ID0+IHYgIT09IHRoaXMuU0VMRUNUX0FMTF9WQUxVRSk7XG4gICAgICAgICAgY29udHJvbC5zZXRWYWx1ZShmaWx0ZXJlZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBEbyBub3QgcHJvY2VlZCB3aXRoIG5vcm1hbCBjbG9zZSBsb2dpYyBmb3Igc2VsZWN0LWFsbFxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBMZXQgQW5ndWxhciBNYXRlcmlhbCBhdXRvLWNsb3NlIGZvciBzaW5nbGUtc2VsZWN0LlxuICAgIC8vIEZvciBtdWx0aS1zZWxlY3QsIGNsb3NlIG9ubHkgaWYgZXhwbGljaXRseSByZXF1ZXN0ZWQuXG4gICAgY29uc3Qgc2hvdWxkQ2xvc2UgPSB0aGlzLmlzTXVsdGlwbGUgPyAhIXRoaXMuY29uZmlnPy5jbG9zZU9uU2VsZWN0IDogZmFsc2U7XG4gICAgaWYgKHNob3VsZENsb3NlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZWxlY3QuY2xvc2UoKTtcbiAgICAgIH0gY2F0Y2gge31cbiAgICB9XG4gICAgLy8gSWYgc2VhcmNoYWJsZSwgY2xlYXIgdGhlIHNlYXJjaCBhZnRlciBzZWxlY3Rpb24gc28gcmVvcGVuaW5nIHdvcmtzIHByZWRpY3RhYmx5XG4gICAgaWYgKHRoaXMuY29uZmlnPy5zZWFyY2hhYmxlICYmIHRoaXMuY29uZmlnPy5rZXkpIHtcbiAgICAgIHRoaXMuc2VhcmNoVGV4dEJ5S2V5W3RoaXMuY29uZmlnLmtleV0gPSAnJztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRoaXMuY29uZmlnPy5vbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5jb25maWcub25DaGFuZ2UoZXZlbnQudmFsdWUsIGV2ZW50KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2NxYS1keW5hbWljLXNlbGVjdCBvbkNoYW5nZSBoYW5kbGVyIGVycm9yOicsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHtcbiAgICAgIGtleTogdGhpcy5jb25maWc/LmtleSxcbiAgICAgIHZhbHVlOiBldmVudC52YWx1ZSxcbiAgICAgIGV2ZW50LFxuICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBoYW5kbGVEb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gQ2xvc2Ugd2hlbiBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSB0cmlnZ2VyIGFuZCBvdXRzaWRlIG9mIHRoZSBvcGVuIHBhbmVsXG4gICAgaWYgKCF0aGlzLnNlbGVjdFJlZj8ucGFuZWxPcGVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKCF0YXJnZXQpIHJldHVybjtcbiAgICAvLyBJZiBjbGljayBpcyBpbnNpZGUgdGhlIGNvbXBvbmVudCBob3N0LCBpZ25vcmVcbiAgICBpZiAodGhpcy5ob3N0RWw/Lm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5ob3N0RWwubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIElmIGNsaWNrIGlzIGluc2lkZSBhbnkgb3BlbiBtYXQtc2VsZWN0IHBhbmVsLCBpZ25vcmVcbiAgICBjb25zdCBwYW5lbEVscyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm1hdC1zZWxlY3QtcGFuZWwnKSkgYXMgSFRNTEVsZW1lbnRbXTtcbiAgICBjb25zdCBjbGlja0luc2lkZVBhbmVsID0gcGFuZWxFbHMuc29tZSgoZWwpID0+IGVsLmNvbnRhaW5zKHRhcmdldCkpO1xuICAgIGlmIChjbGlja0luc2lkZVBhbmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLnNlbGVjdFJlZi5jbG9zZSgpO1xuICAgIH0gY2F0Y2gge31cbiAgfVxuXG4gIC8qKlxuICAgKiBIaWdobGlnaHRzIHRleHQgYmFzZWQgb24gdGhlIGNvbmZpZ3VyZWQgaGlnaGxpZ2h0UGF0dGVybi5cbiAgICogUmV0dXJucyBIVE1MIHN0cmluZyB3aXRoIGhpZ2hsaWdodGVkIHBvcnRpb25zIHdyYXBwZWQgaW4gPHNwYW4gY2xhc3M9XCJoaWdobGlnaHRcIj4uXG4gICAqL1xuICBoaWdobGlnaHRUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0ZXh0IHx8ICF0aGlzLmNvbmZpZz8uaGlnaGxpZ2h0UGF0dGVybikge1xuICAgICAgcmV0dXJuIHRoaXMuZXNjYXBlSHRtbCh0ZXh0KTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5jb25maWcuaGlnaGxpZ2h0UGF0dGVybjtcblxuICAgIC8vIElmIGl0J3MgYSBmdW5jdGlvbiwgdXNlIGl0IGRpcmVjdGx5XG4gICAgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcGF0dGVybih0ZXh0KTtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHN0cmluZyBwYXR0ZXJuIHRvIFJlZ0V4cCBpZiBuZWVkZWRcbiAgICBsZXQgcmVnZXg6IFJlZ0V4cDtcbiAgICBpZiAodHlwZW9mIHBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybiwgJ2dpJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCBoaWdobGlnaHQgcGF0dGVybjonLCBwYXR0ZXJuKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXNjYXBlSHRtbCh0ZXh0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVnZXggPSBwYXR0ZXJuO1xuICAgIH1cblxuICAgIC8vIEVzY2FwZSBIVE1MIGZpcnN0LCB0aGVuIGFwcGx5IGhpZ2hsaWdodGluZ1xuICAgIGNvbnN0IGVzY2FwZWQgPSB0aGlzLmVzY2FwZUh0bWwodGV4dCk7XG4gICAgcmV0dXJuIGVzY2FwZWQucmVwbGFjZShyZWdleCwgKG1hdGNoKSA9PiBgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1wcmltYXJ5XCI+JHttYXRjaH08L3NwYW4+YCk7XG4gIH1cblxuICAvKipcbiAgICogRXNjYXBlcyBIVE1MIHNwZWNpYWwgY2hhcmFjdGVycyB0byBwcmV2ZW50IFhTUy5cbiAgICovXG4gIHByaXZhdGUgZXNjYXBlSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGV4dCkgcmV0dXJuICcnO1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGhpZ2hsaWdodGluZyBpcyBlbmFibGVkIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIGdldCBoYXNIaWdobGlnaHRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jb25maWc/LmhpZ2hsaWdodFBhdHRlcm47XG4gIH1cblxuICBwcml2YXRlIHNldHVwTG9hZE1vcmVPYnNlcnZlcigpOiB2b2lkIHtcbiAgICAvLyBPbmx5IGlmIGNvbnN1bWVyIGluZGljYXRlcyBtb3JlIGRhdGEgaXMgYXZhaWxhYmxlXG4gICAgaWYgKCF0aGlzLmNvbmZpZz8uaGFzTW9yZSkgcmV0dXJuO1xuICAgIC8vIEZpbmQgc2VudGluZWwgb3B0aW9uIHJlbmRlcmVkIGluIHRoZSBvcGVuIHBhbmVsXG4gICAgY29uc3Qgc2VudGluZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWF0LXNlbGVjdC1wYW5lbCAubWF0LW9wdGlvbi5sb2FkLW1vcmUtc2VudGluZWwnKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKCFzZW50aW5lbCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIpIHtcbiAgICAgIHRyeSB7IHRoaXMubG9hZE1vcmVPYnNlcnZlci5kaXNjb25uZWN0KCk7IH0gY2F0Y2gge31cbiAgICAgIHRoaXMubG9hZE1vcmVPYnNlcnZlciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gVXNlIHRoZSBzZW50aW5lbCdzIGNsb3Nlc3QgcGFuZWwgYXMgdGhlIHJvb3QgdG8gYXZvaWQgcGlja2luZyBhIHdyb25nIHBhbmVsXG4gICAgY29uc3QgcGFuZWxSb290ID0gc2VudGluZWwuY2xvc2VzdCgnLm1hdC1zZWxlY3QtcGFuZWwnKSBhcyBFbGVtZW50IHwgbnVsbDtcbiAgICB0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgICAvLyBSZXF1ZXN0IG1vcmUgb25seSBpZiBub3QgY3VycmVudGx5IGxvYWRpbmcgYW5kIGhhc01vcmUgc3RpbGwgdHJ1ZVxuICAgICAgICAgIGlmICh0aGlzLmhhc1Njcm9sbGVkU2luY2VPcGVuICYmICF0aGlzLmxvYWRpbmdNb3JlICYmIHRoaXMuY29uZmlnPy5oYXNNb3JlKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnPy5rZXkgfHwgJyc7XG4gICAgICAgICAgICBjb25zdCBxID0gdGhpcy5zZWFyY2hUZXh0QnlLZXlba2V5XSB8fCAnJztcbiAgICAgICAgICAgIC8vIEVtaXQgb3V0cHV0cyBhbmQgaW52b2tlIG9wdGlvbmFsIGNhbGxiYWNrc1xuICAgICAgICAgICAgdGhpcy5sb2FkTW9yZS5lbWl0KHsga2V5LCBxdWVyeTogcSB9KTtcbiAgICAgICAgICAgIHRyeSB7IHRoaXMuY29uZmlnLm9uTG9hZE1vcmU/LihxKTsgfSBjYXRjaCB7fVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHsgcm9vdDogcGFuZWxSb290LCB0aHJlc2hvbGQ6IDAuMSB9KTtcbiAgICB0cnkgeyB0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIub2JzZXJ2ZShzZW50aW5lbCk7IH0gY2F0Y2gge31cbiAgfVxufVxuXG5cbiIsIjxkaXYgY2xhc3M9XCJjcWEtdWktcm9vdFwiPlxuICA8bmctY29udGFpbmVyIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICAgIDxsYWJlbCAqbmdJZj1cImNvbmZpZy5sYWJlbFwiXG4gICAgICBjbGFzcz1cImZvcm0tbGFiZWwgY3FhLXRleHQtWyMzNzQxNTFdIGNxYS10ZXh0LVsxNHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWJsb2NrIGNxYS1sZWFkaW5nLVsxLjRdIGNxYS1tYi0yXCI+e3tcbiAgICAgIGNvbmZpZy5sYWJlbCB9fTwvbGFiZWw+XG4gICAgPG1hdC1mb3JtLWZpZWxkICNob3N0IGNsYXNzPVwibWF0LXNlbGVjdC1jdXN0b20gY3FhLXctZnVsbFwiIGFwcGVhcmFuY2U9XCJmaWxsXCI+XG4gICAgICA8bWF0LXNlbGVjdCAjc2VsZWN0UmVmPVwibWF0U2VsZWN0XCIgW3BsYWNlaG9sZGVyXT1cImRpc3BsYXlQbGFjZWhvbGRlclwiIFttdWx0aXBsZV09XCJpc011bHRpcGxlXCJcbiAgICAgICAgZGlzYWJsZU9wdGlvbkNlbnRlcmluZyBbcGFuZWxDbGFzc109XCJwYW5lbENsYXNzXCIgW2Zvcm1Db250cm9sTmFtZV09XCJjb25maWcua2V5XCJcbiAgICAgICAgKG9wZW5lZENoYW5nZSk9XCJvblNlbGVjdE9wZW5lZENoYW5nZSgkZXZlbnQsIHNlbGVjdFJlZilcIiAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudCwgc2VsZWN0UmVmKVwiPlxuXG4gICAgICAgIDxtYXQtb3B0aW9uICpuZ0lmPVwiY29uZmlnLnNlYXJjaGFibGVcIiBjbGFzcz1cInRzLXNlbGVjdC1zZWFyY2hcIiBkaXNhYmxlZD5cbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJ0cy1zZWxlY3Qtc2VhcmNoLWlucHV0IGNxYS10ZXh0LWJsYWNrLTEwMFwiIHR5cGU9XCJ0ZXh0XCIgW3ZhbHVlXT1cInNlYXJjaFRleHRCeUtleVtjb25maWcua2V5XSB8fCAnJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgKGlucHV0KT1cIm9uU2VhcmNoKGNvbmZpZy5rZXksICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoLi4uXCIgLz5cbiAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICBcbiAgICAgICAgPG1hdC1vcHRpb24gW25nQ2xhc3NdPVwieydjaGVja21hcmsnOiBjb25maWcub3B0aW9uU3R5bGUgPT09ICdjaGVja21hcmsnLCdjaGVja2JveCc6IGNvbmZpZy5vcHRpb25TdHlsZSAhPT0gJ2NoZWNrbWFyaycsJ21hdC1zZWxlY3RlZCc6IGFsbFNlbGVjdGVkfVwiIFtjbGFzc109XCJjb25maWcub3B0aW9uU3R5bGUgPT0gJ2NoZWNrbWFyaycgPyAnY2hlY2ttYXJrJyA6ICdjaGVja2JveCdcIiAqbmdJZj1cImlzTXVsdGlwbGUgJiYgY29uZmlnLnNob3dTZWxlY3RBbGxcIiBbdmFsdWVdPVwiU0VMRUNUX0FMTF9WQUxVRVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1c2VDaGVja2JveFN0eWxlOyBlbHNlIHNlbGVjdEFsbERlZmF1bHRUcGxcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS13LTQgY3FhLWgtNCBjcWEtZmxleC1zaHJpbmstMCBjcWEtcm91bmRlZC1bNHB4XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNEMUQ1REJdIGNxYS1tci0yIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1ib3JkZXItc29saWRcIlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImFsbFNlbGVjdGVkID8geydiYWNrZ3JvdW5kLWNvbG9yJzonIzRGNDZFNScsJ2JvcmRlci1jb2xvcic6JyM0RjQ2RTUnfSA6IHt9XCI+XG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImFsbFNlbGVjdGVkXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMCAzTDQuNSA4LjVMMiA2XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtbWluLXctMFwiPnt7IGNvbmZpZy5zZWxlY3RBbGxMYWJlbCB8fCAnQWxsJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3NlbGVjdEFsbERlZmF1bHRUcGw+XG4gICAgICAgICAgICB7eyBjb25maWcuc2VsZWN0QWxsTGFiZWwgfHwgJ0FsbCcgfX1cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L21hdC1vcHRpb24+XG5cbiAgICAgICAgPG1hdC1vcHRpb24gKm5nSWY9XCJzaG93QWRkQ3VzdG9tT3B0aW9uXCIgW3ZhbHVlXT1cImFkZEN1c3RvbVNlbnRpbmVsVmFsdWVcIiBjbGFzcz1cImNxYS10ZXh0LXByaW1hcnlcIj5cbiAgICAgICAgICBOZXdcbiAgICAgICAgPC9tYXQtb3B0aW9uPlxuXG4gICAgICAgIDxtYXQtb3B0aW9uIFtjbGFzc109XCJjb25maWcub3B0aW9uU3R5bGUgPT0gJ2NoZWNrbWFyaycgPyAnY2hlY2ttYXJrJyA6ICdjaGVja2JveCdcIiAqbmdGb3I9XCJsZXQgb3B0IG9mIGZpbHRlcmVkT3B0aW9ucyhjb25maWcpXCIgW3ZhbHVlXT1cIm9wdC5pZCA/PyBvcHQudmFsdWVcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29uZmlnLmlzQ29tcGFyZVJ1bnNcIj4gICBcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1c2VDaGVja2JveFN0eWxlOyBlbHNlIGNvbXBhcmVSdW5zRGVmYXVsdE9wdGlvblRwbFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtdy1mdWxsIGNxYS1jb21wYXJlLXJ1bnMtaXRlbVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdy00IGNxYS1oLTQgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXJvdW5kZWQtWzRweF0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRDFENURCXSBjcWEtbXItMiBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtYm9yZGVyLXNvbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiaXNPcHRpb25TZWxlY3RlZChvcHQpID8geydiYWNrZ3JvdW5kLWNvbG9yJzonIzRGNDZFNScsJ2JvcmRlci1jb2xvcic6JyM0RjQ2RTUnfSA6IHt9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpc09wdGlvblNlbGVjdGVkKG9wdClcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMCAzTDQuNSA4LjVMMiA2XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtbWluLXctMCBjcWEtY29tcGFyZS1ydW5zXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJoYXNIaWdobGlnaHRpbmdcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwib3B0LnN0YXR1c0NvbG9yIHx8IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImhpZ2hsaWdodFRleHQob3B0Lm5hbWUgPz8gb3B0LmxhYmVsID8/IG9wdC52YWx1ZSlcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWhhc0hpZ2hsaWdodGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLW1pbi13LTAgY3FhLWNvbXBhcmUtcnVuc1wiXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJvcHQucnVuTnVtYmVyTGFiZWwgJiYgb3B0LnJ1bkRhdGVMYWJlbDsgZWxzZSBjaGVja2JveERlZmF1bHRMYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtzdHlsZS5jb2xvcl09XCJvcHQuc3RhdHVzQ29sb3IgfHwgbnVsbFwiPnt7IG9wdC5ydW5OdW1iZXJMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXVwiPiB7eyBvcHQucnVuRGF0ZUxhYmVsIH19Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2hlY2tib3hEZWZhdWx0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLW1pbi13LTAgY3FhLWNvbXBhcmUtcnVuc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwib3B0LnN0YXR1c0NvbG9yIHx8IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdC5uYW1lID8/IG9wdC5sYWJlbCA/PyBvcHQudmFsdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwib3B0LmR1cmF0aW9uRm9ybWF0dGVkXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1zdGFydCBjcWEtZ2FwLTEgY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtZmxleC1zaHJpbmstMCBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLW1heC13LVs4MHB4XVwiIFxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAnY3FhLW1pbi13LVs4MnB4XSc6IG9wdD8uaGFzSG91clJ1bixcbiAgICAgICAgICAgICAgICAgICAgJ2NxYS1taW4tdy1bNjZweF0nOiAhb3B0Py5oYXNIb3VyUnVuICYmIG9wdD8uaGFzTWludXRlUnVuLFxuICAgICAgICAgICAgICAgICAgICAnY3FhLW1pbi13LVs0MHB4XSc6ICFvcHQ/Lmhhc0hvdXJSdW4gJiYgIW9wdD8uaGFzTWludXRlUnVuXG4gICAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLW1pbi13LVsxMnB4XSBjcWEtbWF4LXctWzEycHhdXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiNlwiIGN5PVwiNlwiIHI9XCI0LjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMVwiLz5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk02IDMuNVY2TDcuNSA3XCIgc3Ryb2tlPVwiIzRCNTU2M1wiIHN0cm9rZS13aWR0aD1cIjFcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IG9wdC5kdXJhdGlvbkZvcm1hdHRlZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjb21wYXJlUnVuc0RlZmF1bHRPcHRpb25UcGw+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS13LWZ1bGwgY3FhLWNvbXBhcmUtcnVucy1pdGVtXCI+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLW1pbi13LTAgY3FhLWNvbXBhcmUtcnVuc1wiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImhhc0hpZ2hsaWdodGluZ1wiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwib3B0LnN0YXR1c0NvbG9yIHx8IG51bGxcIlxuICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJoaWdobGlnaHRUZXh0KG9wdC5uYW1lID8/IG9wdC5sYWJlbCA/PyBvcHQudmFsdWUpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaGFzSGlnaGxpZ2h0aW5nXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1taW4tdy0wIGNxYS1jb21wYXJlLXJ1bnNcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm9wdC5ydW5OdW1iZXJMYWJlbCAmJiBvcHQucnVuRGF0ZUxhYmVsOyBlbHNlIGRlZmF1bHRMYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbc3R5bGUuY29sb3JdPVwib3B0LnN0YXR1c0NvbG9yIHx8IG51bGxcIj57eyBvcHQucnVuTnVtYmVyTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdXCI+IHt7IG9wdC5ydW5EYXRlTGFiZWwgfX0mbmJzcDs8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1taW4tdy0wIGNxYS1jb21wYXJlLXJ1bnNcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJvcHQuc3RhdHVzQ29sb3IgfHwgbnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdC5uYW1lID8/IG9wdC5sYWJlbCA/PyBvcHQudmFsdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJvcHQuZHVyYXRpb25Gb3JtYXR0ZWRcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LXN0YXJ0IGNxYS1nYXAtMSBjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtWyM2QjcyODBdIGNxYS1mbGV4LXNocmluay0wIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCBjcWEtbWF4LXctWzgwcHhdXCIgXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICdjcWEtbWluLXctWzgycHhdJzogb3B0Py5oYXNIb3VyUnVuLFxuICAgICAgICAgICAgICAgICAgICAnY3FhLW1pbi13LVs2NnB4XSc6ICFvcHQ/Lmhhc0hvdXJSdW4gJiYgb3B0Py5oYXNNaW51dGVSdW4sXG4gICAgICAgICAgICAgICAgICAgICdjcWEtbWluLXctWzQwcHhdJzogIW9wdD8uaGFzSG91clJ1biAmJiAhb3B0Py5oYXNNaW51dGVSdW5cbiAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtbWluLXctWzEycHhdIGNxYS1tYXgtdy1bMTJweF1cIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI2XCIgY3k9XCI2XCIgcj1cIjQuNVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIxXCIvPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYgMy41VjZMNy41IDdcIiBzdHJva2U9XCIjNEI1NTYzXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgb3B0LmR1cmF0aW9uRm9ybWF0dGVkIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbmZpZy5pc0NvbXBhcmVSdW5zXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlQ2hlY2tib3hTdHlsZTsgZWxzZSBkZWZhdWx0T3B0aW9uVHBsXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXctNCBjcWEtaC00IGNxYS1mbGV4LXNocmluay0wIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0QxRDVEQl0gY3FhLW1yLTIgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWJvcmRlci1zb2xpZFwiXG4gICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJpc09wdGlvblNlbGVjdGVkKG9wdCkgPyB7J2JhY2tncm91bmQtY29sb3InOicjNEY0NkU1JywnYm9yZGVyLWNvbG9yJzonIzRGNDZFNSd9IDoge31cIj5cbiAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpc09wdGlvblNlbGVjdGVkKG9wdClcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAgM0w0LjUgOC41TDIgNlwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwhLS0gV2hlbiBkaXNwbGF5TGFiZWxBc0lubmVySHRtbCBpcyB0cnVlLCByZW5kZXIgbGFiZWwgYXMgcmF3IEhUTUwgLS0+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtbWluLXctMFwiXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb25maWc/LmRpc3BsYXlMYWJlbEFzSW5uZXJIdG1sXCJcbiAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIm9wdC5sYWJlbCA/PyBvcHQubmFtZSA/PyBvcHQudmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPCEtLSBPdGhlcndpc2UgdXNlIG5vcm1hbC9oaWdobGlnaHRlZCB0ZXh0IHJlbmRlcmluZyAtLT5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1taW4tdy0wXCJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFjb25maWc/LmRpc3BsYXlMYWJlbEFzSW5uZXJIdG1sICYmIGhhc0hpZ2hsaWdodGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJoaWdobGlnaHRUZXh0KG9wdC5uYW1lID8/IG9wdC5sYWJlbCA/PyBvcHQudmFsdWUpXCI+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW1pbi13LTBcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWNvbmZpZz8uZGlzcGxheUxhYmVsQXNJbm5lckh0bWwgJiYgIWhhc0hpZ2hsaWdodGluZ1wiPlxuICAgICAgICAgICAgICAgICAge3sgb3B0Lm5hbWUgPz8gb3B0LmxhYmVsID8/IG9wdC52YWx1ZSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRPcHRpb25UcGw+XG4gICAgICAgICAgICAgIDwhLS0gV2hlbiBkaXNwbGF5TGFiZWxBc0lubmVySHRtbCBpcyB0cnVlLCByZW5kZXIgbGFiZWwgYXMgcmF3IEhUTUwgLS0+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29uZmlnPy5kaXNwbGF5TGFiZWxBc0lubmVySHRtbFwiXG4gICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwib3B0LmxhYmVsID8/IG9wdC5uYW1lID8/IG9wdC52YWx1ZVwiPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwhLS0gT3RoZXJ3aXNlIHVzZSBub3JtYWwvaGlnaGxpZ2h0ZWQgdGV4dCByZW5kZXJpbmcgLS0+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWNvbmZpZz8uZGlzcGxheUxhYmVsQXNJbm5lckh0bWwgJiYgaGFzSGlnaGxpZ2h0aW5nXCJcbiAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJoaWdobGlnaHRUZXh0KG9wdC5uYW1lID8/IG9wdC5sYWJlbCA/PyBvcHQudmFsdWUpXCI+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhY29uZmlnPy5kaXNwbGF5TGFiZWxBc0lubmVySHRtbCAmJiAhaGFzSGlnaGxpZ2h0aW5nXCI+XG4gICAgICAgICAgICAgICAge3sgb3B0Lm5hbWUgPz8gb3B0LmxhYmVsID8/IG9wdC52YWx1ZSB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgIFxuICAgICAgICA8IS0tIE5vIHJlc3VsdHMgc3RhdGUgKG9ubHkgd2hlbiBub3QgbG9hZGluZyBhbmQgbm8gb3B0aW9ucykgLS0+XG4gICAgICAgIDxtYXQtb3B0aW9uIGRpc2FibGVkICpuZ0lmPVwiIShjb25maWc/Lm9wdGlvbnM/Lmxlbmd0aCB8fCAwKSAmJiAhKGNvbmZpZz8uaXNMb2FkaW5nIHx8IGxvYWRpbmdNb3JlKVwiPlxuICAgICAgICAgIE5vIHJlc3VsdHNcbiAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICA8IS0tIEluZmluaXRlIHNjcm9sbCBzZW50aW5lbCAoc2VydmVyU2VhcmNoIG9yIGV4cGxpY2l0IGhhc01vcmUpIC0tPlxuICAgICAgICA8bWF0LW9wdGlvbiBkaXNhYmxlZCBjbGFzcz1cImxvYWQtbW9yZS1zZW50aW5lbFwiICpuZ0lmPVwiY29uZmlnPy5oYXNNb3JlXCI+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJsb2FkaW5nTW9yZSB8fCBjb25maWc/LmlzTG9hZGluZ1wiPkxvYWRpbmcuLi48L3NwYW4+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCIhbG9hZGluZ01vcmUgJiYgIWNvbmZpZz8uaXNMb2FkaW5nXCI+U2Nyb2xsIHRvIGxvYWQgbW9yZeKApjwvc3Bhbj5cbiAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgIDwhLS0gSW5saW5lIHNwaW5uZXIgc2hvd24gd2hlbiBsb2FkaW5nIG1vcmUgKGluZmluaXRlIHNjcm9sbCkgb3Igd2hlbiBjb25maWcuaXNMb2FkaW5nIGlzIHRydWUgLS0+XG4gICAgICAgIDxzdmcgKm5nSWY9XCJsb2FkaW5nTW9yZSB8fCBjb25maWc/LmlzTG9hZGluZ1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgNTAgNTBcIiBhcmlhLWxhYmVsPVwibG9hZGluZ1wiXG4gICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxjaXJjbGUgY3g9XCIyNVwiIGN5PVwiMjVcIiByPVwiMjBcIiBzdHJva2U9XCIjRTVFN0VCXCIgc3Ryb2tlLXdpZHRoPVwiNlwiIGZpbGw9XCJub25lXCIvPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNDUgMjVhMjAgMjAgMCAwIDAtMjAtMjBcIiBzdHJva2U9XCIjNEY0NkU1XCIgc3Ryb2tlLXdpZHRoPVwiNlwiIGZpbGw9XCJub25lXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPlxuICAgICAgICAgICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT1cInRyYW5zZm9ybVwiIHR5cGU9XCJyb3RhdGVcIiBmcm9tPVwiMCAyNSAyNVwiIHRvPVwiMzYwIDI1IDI1XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cj1cIjAuOHNcIiByZXBlYXRDb3VudD1cImluZGVmaW5pdGVcIi8+XG4gICAgICAgICAgPC9wYXRoPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzBBMEEwQVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2Rpdj5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PiJdfQ==
690
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFvQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBbUV2SyxNQUFNLE9BQU8sMkJBQTJCO0lBTHhDO1FBTVcscUJBQWdCLEdBQVcsZ0JBQWdCLENBQUM7UUFDNUMsNEJBQXVCLEdBQVcsaUJBQWlCLENBQUM7UUFHbkQsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBdUQsQ0FBQztRQUMxRixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDakQscUVBQXFFO1FBQzNELGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWtDLENBQUM7UUFDNUUsd0VBQXdFO1FBQzlELGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBa0MsQ0FBQztRQUN4RSxzSkFBc0o7UUFDNUksbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBa0MsQ0FBQztRQUs5RSxnRkFBZ0Y7UUFDaEYsb0JBQWUsR0FBMkIsRUFBRSxDQUFDO1FBR3JDLHNCQUFpQixHQUFHLENBQUMsQ0FBQztRQUM5QixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUVwQjs7O1dBR0c7UUFDSyx5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFDN0Isa0JBQWEsR0FBRyxHQUFHLEVBQUU7WUFDM0IsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztZQUNqQyxJ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LE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFBRTt3QkFBQyxNQUFNLEdBQUU7cUJBQzlDO2lCQUNGO2FBQ0Y7UUFDSCxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLElBQUk7WUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQUU7UUFBQyxNQUFNLEdBQUU7SUFDM0QsQ0FBQzs7d0hBam5CVSwyQkFBMkI7NEdBQTNCLDJCQUEyQix1ZkFlSSxVQUFVLGtEQ2xGdEQsOCtZQWlNTTsyRkQ5SE8sMkJBQTJCO2tCQUx2QyxTQUFTOytCQUNFLG9CQUFvQixtQkFFYix1QkFBdUIsQ0FBQyxNQUFNOzhCQUt0QyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFFRyxZQUFZO3NCQUFyQixNQUFNO2dCQUVHLFFBQVE7c0JBQWpCLE1BQU07Z0JBRUcsY0FBYztzQkFBdkIsTUFBTTtnQkFFb0MsU0FBUztzQkFBbkQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNlLE1BQU07c0JBQTdELFNBQVM7dUJBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQTZmdEQsbUJBQW1CO3NCQURsQixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdFNlbGVjdCwgTWF0U2VsZWN0Q2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcblxuLy8gTG9jYWwgb3B0aW9uIG1vZGVsIChwcmV2aW91c2x5IGltcG9ydGVkIGZyb20gcmVtb3ZlZCBjcWEtc2VsZWN0IGNvbXBvbmVudClcbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0T3B0aW9uIHtcbiAgaWQ/OiBhbnk7XG4gIHZhbHVlPzogYW55O1xuICBuYW1lPzogc3RyaW5nO1xuICBsYWJlbD86IHN0cmluZztcbiAgc3RhdHVzQ29sb3I/OiBzdHJpbmc7XG4gIGR1cmF0aW9uRm9ybWF0dGVkPzogc3RyaW5nO1xuICBydW5OdW1iZXJMYWJlbD86IHN0cmluZztcbiAgaGFzSG91clJ1bj86IGJvb2xlYW47XG4gIGhhc01pbnV0ZVJ1bj86IGJvb2xlYW47XG4gIHJ1bkRhdGVMYWJlbD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICBrZXk6IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICBkaXNwbGF5TGFiZWxBc0lubmVySHRtbD86IGJvb2xlYW47XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgbXVsdGlwbGU/OiBib29sZWFuO1xuICBzZWFyY2hhYmxlPzogYm9vbGVhbjtcbiAgLyoqIENvbnRyb2xzIGhvdyBzZWxlY3Rpb24gaW5kaWNhdG9yIGlzIHNob3duIGZvciBtdWx0aS1zZWxlY3Qgb3B0aW9ucy4gKi9cbiAgb3B0aW9uU3R5bGU/OiAnY2hlY2ttYXJrJyB8ICdjaGVja2JveCc7XG4gIC8qKiBTaG93IGEgJ1NlbGVjdCBBbGwnIG9wdGlvbiBhdCB0aGUgdG9wIChtdWx0aS1zZWxlY3Qgb25seSkuICovXG4gIHNob3dTZWxlY3RBbGw/OiBib29sZWFuO1xuICAvKiogQ3VzdG9tIGxhYmVsIGZvciB0aGUgJ1NlbGVjdCBBbGwnIG9wdGlvbi4gRGVmYXVsdHMgdG8gJ0FsbCcuICovXG4gIHNlbGVjdEFsbExhYmVsPzogc3RyaW5nO1xuICAvKiogSWYgdHJ1ZSwgY2xvc2UgdGhlIHBhbmVsIHdoZW4gYW4gb3B0aW9uIGlzIHNlbGVjdGVkICh1c2VmdWwgZm9yIG11bHRpLXNlbGVjdCBpbiBoZWFkZXJzKS4gKi9cbiAgY2xvc2VPblNlbGVjdD86IGJvb2xlYW47XG4gIC8qKiBQcm92aWRlIGEgZGVmYXVsdCBzZWxlY3RlZCB2YWx1ZSAob3IgYXJyYXkgZm9yIG11bHRpLXNlbGVjdCkgaWYgdGhlIGNvbnRyb2wgaGFzIG5vIHZhbHVlIHlldC4gKi9cbiAgc2VsZWN0ZWRWYWx1ZT86IGFueSB8IGFueVtdO1xuICAvKiogT3B0aW9uYWwgY2FsbGJhY2sgaW52b2tlZCB3aGVuZXZlciB0aGUgc2VsZWN0aW9uIGNoYW5nZXMuICovXG4gIG9uQ2hhbmdlPzogKHZhbHVlOiBhbnksIGV2ZW50PzogTWF0U2VsZWN0Q2hhbmdlKSA9PiB2b2lkO1xuICAvKiogRW5hYmxlIHNlcnZlci1zaWRlIHNlYXJjaCBtb2RlOyBjb21wb25lbnQgd2lsbCBlbWl0IHNlYXJjaCBpbnN0ZWFkIG9mIGxvY2FsIGZpbHRlcmluZy4gKi9cbiAgc2VydmVyU2VhcmNoPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgdHJpZ2dlcnMgYW4gaW5pdGlhbCBzZWFyY2ggZW1pdCBvbiBwYW5lbCBvcGVuIChzZXJ2ZXJTZWFyY2ggbW9kZSBvbmx5KS5cbiAgICogRGVmYXVsdHMgdG8gZmFsc2Ugc28gb3BlbmluZyB0aGUgZHJvcGRvd24gZG9lcyBOT1QgY2FsbCB0aGUgQVBJLlxuICAgKi9cbiAgaW5pdGlhbEZldGNoT25PcGVuPzogYm9vbGVhbjtcbiAgLyoqIEluZGljYXRlcyBtb3JlIHJlc3VsdHMgYXJlIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsLiAqL1xuICBoYXNNb3JlPzogYm9vbGVhbjtcbiAgLyoqIE9wdGlvbmFsIGxvYWRpbmcgZmxhZyBjb250cm9sbGVkIGJ5IGNvbnN1bWVyIHRvIHNob3cgbG9hZGluZyBzdGF0ZS4gKi9cbiAgaXNMb2FkaW5nPzogYm9vbGVhbjtcbiAgLyoqIE9wdGlvbmFsIGNhbGxiYWNrIGZvciBzZXJ2ZXItc2lkZSBzZWFyY2ggd2hlbiBxdWVyeSBjaGFuZ2VzLiAqL1xuICBvblNlYXJjaD86IChxdWVyeTogc3RyaW5nKSA9PiB2b2lkO1xuICAvKiogT3B0aW9uYWwgY2FsbGJhY2sgd2hlbiBtb3JlIGRhdGEgaXMgcmVxdWVzdGVkIChpbmZpbml0ZSBzY3JvbGwpLiAqL1xuICBvbkxvYWRNb3JlPzogKHF1ZXJ5Pzogc3RyaW5nKSA9PiB2b2lkO1xuICAvKiogT3B0aW9uYWwgcmVnZXggcGF0dGVybiBvciBmdW5jdGlvbiB0byBoaWdobGlnaHQgcGFydHMgb2Ygb3B0aW9uIHRleHQuICovXG4gIGhpZ2hsaWdodFBhdHRlcm4/OiBSZWdFeHAgfCBzdHJpbmcgfCAoKHRleHQ6IHN0cmluZykgPT4gc3RyaW5nKTtcbiAgLyoqIFdoZW4gdHJ1ZSAoYW5kIHNlYXJjaGFibGUpLCBhbGxvd3MgYWRkaW5nIHRoZSBjdXJyZW50IHNlYXJjaCB0ZXh0IGFzIGEgbmV3IG9wdGlvbiB2aWEgYW4gXCJBZGQgJzx2YWx1ZT4nXCIgY2hvaWNlLiAqL1xuICBhbGxvd0N1c3RvbVZhbHVlPzogYm9vbGVhbjtcbiAgb3B0aW9uczogU2VsZWN0T3B0aW9uW107XG4gIGlzQ29tcGFyZVJ1bnM/OiBib29sZWFuO1xuICB2YWx1ZUJ5Pzogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtZHluYW1pYy1zZWxlY3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljU2VsZWN0RmllbGRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIHJlYWRvbmx5IFNFTEVDVF9BTExfVkFMVUU6IHN0cmluZyA9ICdfX3NlbGVjdF9hbGxfXyc7XG4gIHJlYWRvbmx5IEFERF9DVVNUT01fVkFMVUVfUFJFRklYOiBzdHJpbmcgPSAnX19hZGRfY3VzdG9tX186JztcbiAgQElucHV0KCkgZm9ybSE6IEZvcm1Hcm91cDtcbiAgQElucHV0KCkgY29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyB2YWx1ZTogYW55OyBldmVudDogTWF0U2VsZWN0Q2hhbmdlIH0+KCk7XG4gIEBPdXRwdXQoKSBzZWxlY3RDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXRzIHdoZW4gdXNlciB0eXBlcyBpbiBzZWFyY2ggYm94ICh1c2VmdWwgZm9yIHNlcnZlciBzZWFyY2gpICovXG4gIEBPdXRwdXQoKSBzZWFyY2hDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfT4oKTtcbiAgLyoqIEVtaXRzIHdoZW4gdGhlIGNvbXBvbmVudCByZXF1ZXN0cyBtb3JlIGRhdGEgZm9yIHRoZSBjdXJyZW50IHF1ZXJ5ICovXG4gIEBPdXRwdXQoKSBsb2FkTW9yZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9PigpO1xuICAvKiogRW1pdHMgd2hlbiB0aGUgdXNlciBjaG9vc2VzIHRvIGFkZCBhIGN1c3RvbSB2YWx1ZSAoYWxsb3dDdXN0b21WYWx1ZTogdHJ1ZSkuIENvbnN1bWVyIHNob3VsZCBhZGQgdGhlIHZhbHVlIHRvIG9wdGlvbnMgYW5kIHNldCB0aGUgY29udHJvbCB2YWx1ZS4gKi9cbiAgQE91dHB1dCgpIGFkZEN1c3RvbVZhbHVlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0+KCk7XG5cbiAgQFZpZXdDaGlsZCgnc2VsZWN0UmVmJywgeyBzdGF0aWM6IGZhbHNlIH0pIHNlbGVjdFJlZj86IE1hdFNlbGVjdDtcbiAgQFZpZXdDaGlsZCgnaG9zdCcsIHsgc3RhdGljOiBmYWxzZSwgcmVhZDogRWxlbWVudFJlZiB9KSBob3N0RWw/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAvLyBNdXN0IGJlIHB1YmxpYyBmb3IgdGVtcGxhdGUgYWNjZXNzIGluIEFuZ3VsYXIncyBzdHJpY3QgdGVtcGxhdGUgY2hlY2tpbmcgbW9kZVxuICBzZWFyY2hUZXh0QnlLZXk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgcHJpdmF0ZSBvdXRzaWRlQ2xlYW51cD86ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgbG9hZE1vcmVPYnNlcnZlcj86IEludGVyc2VjdGlvbk9ic2VydmVyO1xuICBwcml2YXRlIGxhc3RPcHRpb25zTGVuZ3RoID0gMDtcbiAgbG9hZGluZ01vcmUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBwYW5lbFNjcm9sbEVsPzogSFRNTEVsZW1lbnQ7XG4gIC8qKlxuICAgKiBHdWFyZCB0byBlbnN1cmUgbG9hZC1tb3JlIGlzIG9ubHkgdHJpZ2dlcmVkIGFmdGVyIHRoZSB1c2VyIGhhcyBzY3JvbGxlZFxuICAgKiBhdCBsZWFzdCBvbmNlIHNpbmNlIG9wZW5pbmcgdGhlIHBhbmVsLiBQcmV2ZW50cyBhdXRvLWxvYWQgb24gb3Blbi5cbiAgICovXG4gIHByaXZhdGUgaGFzU2Nyb2xsZWRTaW5jZU9wZW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBvblBhbmVsU2Nyb2xsID0gKCkgPT4ge1xuICAgIHRoaXMuaGFzU2Nyb2xsZWRTaW5jZU9wZW4gPSB0cnVlO1xuICAgIGlmICghdGhpcy5jb25maWc/Lmhhc01vcmUgfHwgdGhpcy5sb2FkaW5nTW9yZSkgcmV0dXJuO1xuICAgIGNvbnN0IGVsID0gdGhpcy5wYW5lbFNjcm9sbEVsO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBjb25zdCBuZWFyQm90dG9tID0gZWwuc2Nyb2xsVG9wICsgZWwuY2xpZW50SGVpZ2h0ID49IGVsLnNjcm9sbEhlaWdodCAtIDQ4OyAvLyB+MyBvcHRpb24gcm93c1xuICAgIGlmIChuZWFyQm90dG9tKSB7XG4gICAgICB0aGlzLmxvYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnPy5rZXkgfHwgJyc7XG4gICAgICBjb25zdCBxID0gdGhpcy5zZWFyY2hUZXh0QnlLZXlba2V5XSB8fCAnJztcbiAgICAgIHRoaXMubG9hZE1vcmUuZW1pdCh7IGtleSwgcXVlcnk6IHEgfSk7XG4gICAgICB0cnkgeyB0aGlzLmNvbmZpZy5vbkxvYWRNb3JlPy4ocSk7IH0gY2F0Y2gge31cbiAgICB9XG4gIH07XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZyB8fCAhdGhpcy5jb25maWcua2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NxYS1keW5hbWljLXNlbGVjdDogaW5wdXQgXCJjb25maWcua2V5XCIgaXMgcmVxdWlyZWQuJyk7XG4gICAgfVxuICAgIHRoaXMuYXBwbHlTZWxlY3RlZFZhbHVlSWZOZWVkZWQoKTtcbiAgICB0aGlzLnN5bmNEaXNhYmxlZFN0YXRlKCk7XG4gICAgdGhpcy5sYXN0T3B0aW9uc0xlbmd0aCA9ICh0aGlzLmNvbmZpZz8ub3B0aW9ucyB8fCBbXSkubGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGRpc3BsYXlQbGFjZWhvbGRlcigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnPy5rZXk7XG4gICAgaWYgKCFrZXkgfHwgIXRoaXMuZm9ybSkgcmV0dXJuIHRoaXMuY29uZmlnPy5wbGFjZWhvbGRlcjtcbiAgICBjb25zdCBjb250cm9sVmFsdWUgPSB0aGlzLmZvcm0uZ2V0KGtleSk/LnZhbHVlO1xuICAgIHJldHVybiB0aGlzLmhhc0V4aXN0aW5nVmFsdWUoY29udHJvbFZhbHVlKSA/IHVuZGVmaW5lZCA6IHRoaXMuY29uZmlnPy5wbGFjZWhvbGRlcjtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoJ2NvbmZpZycgaW4gY2hhbmdlcyB8fCAnZm9ybScgaW4gY2hhbmdlcykge1xuICAgICAgdGhpcy5zeW5jRGlzYWJsZWRTdGF0ZSgpO1xuICAgIH1cbiAgICBpZiAoJ2NvbmZpZycgaW4gY2hhbmdlcykge1xuICAgICAgLy8gV2hlbiBjb25maWcgY2hhbmdlcyAoaW5jbHVkaW5nIHRvZ2dsaW5nIG11bHRpcGxlKSwgZW5zdXJlIGNvbnRyb2wgdmFsdWUgc2hhcGUgbWF0Y2hlc1xuICAgICAgdGhpcy5zeW5jQ29udHJvbFZhbHVlRm9yTXVsdGlwbGVNb2RlKCk7XG4gICAgICB0aGlzLmFwcGx5U2VsZWN0ZWRWYWx1ZUlmTmVlZGVkKCk7XG4gICAgICAvLyBTeW5jIGxvYWRpbmdNb3JlIHdpdGggY29uZmlnLmlzTG9hZGluZyB3aGVuIHByb3ZpZGVkIGJ5IHBhcmVudFxuICAgICAgLy8gVGhpcyBhbGxvd3MgcGFyZW50IHRvIGNvbnRyb2wgbG9hZGluZyBzdGF0ZSAoZS5nLiwgZHVyaW5nIGxvYWQgbW9yZSBvcGVyYXRpb25zKVxuICAgICAgaWYgKHRoaXMuY29uZmlnPy5pc0xvYWRpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvYWRpbmdNb3JlID0gdGhpcy5jb25maWcuaXNMb2FkaW5nO1xuICAgICAgfVxuICAgICAgLy8gUmVzZXQgbG9hZGluZ01vcmUgd2hlbiBuZXcgb3B0aW9ucyBhcnJpdmUgKG9wdGlvbnMgbGVuZ3RoIGluY3JlYXNlZClcbiAgICAgIGNvbnN0IGxlbiA9ICh0aGlzLmNvbmZpZz8ub3B0aW9ucyB8fCBbXSkubGVuZ3RoO1xuICAgICAgaWYgKGxlbiA+IHRoaXMubGFzdE9wdGlvbnNMZW5ndGgpIHtcbiAgICAgICAgLy8gUmVzZXQgbG9hZGluZyBzdGF0ZSB3aGVuIG5ldyBkYXRhIGFycml2ZXMsIHVubGVzcyBwYXJlbnQgZXhwbGljaXRseSBzYXlzIHN0aWxsIGxvYWRpbmdcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnPy5pc0xvYWRpbmcgPT09IGZhbHNlKSB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nTW9yZSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnPy5pc0xvYWRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIE9ubHkgYXV0by1yZXNldCBpZiBwYXJlbnQgZG9lc24ndCBjb250cm9sIGxvYWRpbmcgc3RhdGVcbiAgICAgICAgICB0aGlzLmxvYWRpbmdNb3JlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdE9wdGlvbnNMZW5ndGggPSBsZW47XG4gICAgICAvLyBJZiBjb25zdW1lciBpbmRpY2F0ZXMgbm8gbW9yZSByZXN1bHRzLCBjbGVhciBsb2FkaW5nIHN0YXRlIGFuZCBhbnkgb2JzZXJ2ZXJzXG4gICAgICBpZiAoIXRoaXMuY29uZmlnPy5oYXNNb3JlKSB7XG4gICAgICAgIC8vIENsZWFyIGxvYWRpbmcgc3RhdGUgd2hlbiBubyBtb3JlIHJlc3VsdHMsIHVubGVzcyBwYXJlbnQgZXhwbGljaXRseSBzYXlzIHN0aWxsIGxvYWRpbmdcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnPy5pc0xvYWRpbmcgPT09IGZhbHNlKSB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nTW9yZSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnPy5pc0xvYWRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9hZGluZ01vcmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5sb2FkTW9yZU9ic2VydmVyKSB7XG4gICAgICAgICAgdHJ5IHsgdGhpcy5sb2FkTW9yZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTsgfSBjYXRjaCB7fVxuICAgICAgICAgIHRoaXMubG9hZE1vcmVPYnNlcnZlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gSWYgcGFuZWwgaXMgb3BlbiBhbmQgaGFzTW9yZSBpcyB0cnVlLCBlbnN1cmUgdGhlIHNlbnRpbmVsIGlzIGJlaW5nIG9ic2VydmVkLlxuICAgICAgaWYgKHRoaXMuc2VsZWN0UmVmPy5wYW5lbE9wZW4gJiYgdGhpcy5jb25maWc/Lmhhc01vcmUpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNldHVwTG9hZE1vcmVPYnNlcnZlcigpLCAwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCdmb3JtJyBpbiBjaGFuZ2VzICYmICFjaGFuZ2VzWydmb3JtJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMuYXBwbHlTZWxlY3RlZFZhbHVlSWZOZWVkZWQoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgcGFuZWxDbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgY3RjLXNlbGVjdC1wYW5lbCAke3RoaXMuaXNNdWx0aXBsZSA/ICdtdWx0aXBsZScgOiAnJ30gJHt0aGlzLmNvbmZpZz8uaXNDb21wYXJlUnVucyA/ICdjb21wYXJlLXJ1bnMtc2VsZWN0LXBhbmVsJyA6ICcnfWAudHJpbSgpO1xuICB9XG5cbiAgZ2V0IGlzTXVsdGlwbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudG9Cb29sZWFuKHRoaXMuY29uZmlnPy5tdWx0aXBsZSk7XG4gIH1cblxuICBnZXQgaXNEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50b0Jvb2xlYW4odGhpcy5jb25maWc/LmRpc2FibGVkKTtcbiAgfVxuICBcbiAgZ2V0IHVzZUNoZWNrYm94U3R5bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNNdWx0aXBsZSAmJiAodGhpcy5jb25maWc/Lm9wdGlvblN0eWxlID09PSAnY2hlY2tib3gnKTtcbiAgfVxuICBcbiAgZ2V0IGFsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5pc011bHRpcGxlKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWc/LmtleTtcbiAgICBpZiAoIWtleSB8fCAhdGhpcy5mb3JtKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoa2V5KTtcbiAgICBpZiAoIWNvbnRyb2wpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBzZWxlY3RlZCA9IGNvbnRyb2wudmFsdWUgYXMgYW55W107XG4gICAgY29uc3QgYWxsSWRzID0gdGhpcy5nZXRBbGxPcHRpb25JZHMoKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2VsZWN0ZWQpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFhbGxJZHMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGFsbElkcy5ldmVyeShpZCA9PiBzZWxlY3RlZC5pbmNsdWRlcyhpZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSB0b0Jvb2xlYW4odmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgdiA9IHZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHYgPT09ICd0cnVlJyB8fCB2ID09PSAnMScpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHYgPT09ICdmYWxzZScgfHwgdiA9PT0gJzAnIHx8IHYgPT09ICcnKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gYW55IG90aGVyIG5vbi1lbXB0eSBzdHJpbmcgdHJlYXRlZCBhcyB0cnV0aHlcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB2YWx1ZSAhPT0gMDtcbiAgICB9XG4gICAgcmV0dXJuICEhdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB2YWx1ZSBmb3IgYW4gb3B0aW9uIGJhc2VkIG9uIHRoZSB2YWx1ZUJ5IHByb3BlcnR5LlxuICAgKiBJZiB2YWx1ZUJ5IGlzIHByb3ZpZGVkLCB1c2UgdGhhdCBwcm9wZXJ0eSBmcm9tIHRoZSBvcHRpb24uXG4gICAqIE90aGVyd2lzZSwgZmFsbCBiYWNrIHRvIGlkID8/IHZhbHVlIChkZWZhdWx0IGJlaGF2aW9yKS5cbiAgICogTXVzdCBiZSBwdWJsaWMgZm9yIHRlbXBsYXRlIGFjY2Vzcy5cbiAgICovXG4gIGdldE9wdGlvblZhbHVlKG9wdDogU2VsZWN0T3B0aW9uKTogYW55IHtcbiAgICBpZiAodGhpcy5jb25maWc/LnZhbHVlQnkpIHtcbiAgICAgIC8vIFVzZSB0aGUgcHJvcGVydHkgc3BlY2lmaWVkIGJ5IHZhbHVlQnlcbiAgICAgIHJldHVybiAob3B0IGFzIGFueSlbdGhpcy5jb25maWcudmFsdWVCeV07XG4gICAgfVxuICAgIC8vIERlZmF1bHQgYmVoYXZpb3I6IHVzZSBpZCA/PyB2YWx1ZVxuICAgIHJldHVybiBvcHQuaWQgPz8gb3B0LnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bmMgdGhlIGZvcm0gY29udHJvbCdzIGRpc2FibGVkIHN0YXRlIGZyb20gY29uZmlnLlxuICAgKiBVc2UgdGhlIEZvcm1Db250cm9sIEFQSSBpbnN0ZWFkIG9mIFtkaXNhYmxlZF0gaW4gdGhlIHRlbXBsYXRlIHRvIGF2b2lkIEFuZ3VsYXInc1xuICAgKiBcImNoYW5nZWQgYWZ0ZXIgY2hlY2tlZFwiIC8gcmVhY3RpdmUgZm9ybXMgZGlzYWJsZWQtYXR0cmlidXRlIHdhcm5pbmcuXG4gICAqL1xuICBwcml2YXRlIHN5bmNEaXNhYmxlZFN0YXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnPy5rZXk7XG4gICAgaWYgKCFrZXkgfHwgIXRoaXMuZm9ybSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XG4gICAgaWYgKCFjb250cm9sKSByZXR1cm47XG4gICAgY29uc3Qgc2hvdWxkRGlzYWJsZSA9IHRoaXMudG9Cb29sZWFuKHRoaXMuY29uZmlnPy5kaXNhYmxlZCk7XG4gICAgaWYgKHNob3VsZERpc2FibGUpIHtcbiAgICAgIGNvbnRyb2wuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRyb2wuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN5bmNDb250cm9sVmFsdWVGb3JNdWx0aXBsZU1vZGUoKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWc/LmtleTtcbiAgICBpZiAoIWtleSB8fCAhdGhpcy5mb3JtKSByZXR1cm47XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoa2V5KTtcbiAgICBpZiAoIWNvbnRyb2wpIHJldHVybjtcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgIGlmICh0aGlzLmlzTXVsdGlwbGUpIHtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudFZhbHVlKSkgcmV0dXJuO1xuICAgICAgY29udHJvbC5zZXRWYWx1ZShbY3VycmVudFZhbHVlXSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY3VycmVudFZhbHVlKSkgcmV0dXJuO1xuICAgICAgY29udHJvbC5zZXRWYWx1ZShjdXJyZW50VmFsdWUubGVuZ3RoID8gY3VycmVudFZhbHVlWzBdIDogbnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlTZWxlY3RlZFZhbHVlSWZOZWVkZWQoKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWc/LmtleTtcbiAgICBpZiAoIWtleSB8fCAhdGhpcy5mb3JtKSByZXR1cm47XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoa2V5KTtcbiAgICBpZiAoIWNvbnRyb2wpIHJldHVybjtcbiAgICBjb25zdCBzZWxlY3RlZFZhbHVlID0gdGhpcy5jb25maWc/LnNlbGVjdGVkVmFsdWU7XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBpZiAodGhpcy5oYXNFeGlzdGluZ1ZhbHVlKGN1cnJlbnRWYWx1ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNlbGVjdGVkVmFsdWUgPT09IHVuZGVmaW5lZCB8fCBzZWxlY3RlZFZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNNdWx0aXBsZSkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IChBcnJheS5pc0FycmF5KHNlbGVjdGVkVmFsdWUpID8gc2VsZWN0ZWRWYWx1ZSA6IFtzZWxlY3RlZFZhbHVlXSkuZmlsdGVyKFxuICAgICAgICAodmFsKSA9PiB2YWwgIT09IHVuZGVmaW5lZCxcbiAgICAgICk7XG4gICAgICBpZiAoIW5vcm1hbGl6ZWQubGVuZ3RoKSByZXR1cm47XG4gICAgICBjb250cm9sLnNldFZhbHVlKG5vcm1hbGl6ZWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IEFycmF5LmlzQXJyYXkoc2VsZWN0ZWRWYWx1ZSlcbiAgICAgICAgPyAoc2VsZWN0ZWRWYWx1ZS5sZW5ndGggPyBzZWxlY3RlZFZhbHVlWzBdIDogdW5kZWZpbmVkKVxuICAgICAgICA6IHNlbGVjdGVkVmFsdWU7XG4gICAgICBpZiAobm9ybWFsaXplZCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICBjb250cm9sLnNldFZhbHVlKG5vcm1hbGl6ZWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhc0V4aXN0aW5nVmFsdWUodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLnNvbWUoKHZhbCkgPT4gdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbCAhPT0gJycpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlzT3B0aW9uU2VsZWN0ZWQob3B0OiBTZWxlY3RPcHRpb24pOiBib29sZWFuIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5O1xuICAgIGlmICgha2V5IHx8ICF0aGlzLmZvcm0pIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChrZXkpO1xuICAgIGlmICghY29udHJvbCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgY29uc3Qgb3B0aW9uVmFsdWUgPSB0aGlzLmdldE9wdGlvblZhbHVlKG9wdCk7XG4gICAgaWYgKHRoaXMuaXNNdWx0aXBsZSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRyb2xWYWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBjb250cm9sVmFsdWUuaW5jbHVkZXMob3B0aW9uVmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbFZhbHVlID09PSBvcHRpb25WYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWxsT3B0aW9uSWRzKCk6IGFueVtdIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5jb25maWc/Lm9wdGlvbnMgfHwgW107XG4gICAgcmV0dXJuIG9wdGlvbnMubWFwKG8gPT4gdGhpcy5nZXRPcHRpb25WYWx1ZShvKSkuZmlsdGVyKHYgPT4gdiAhPT0gdW5kZWZpbmVkKTtcbiAgfVxuXG4gIG9uVG9nZ2xlU2VsZWN0QWxsKHNlbGVjdDogTWF0U2VsZWN0KTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWc/LmtleTtcbiAgICBpZiAoIWtleSB8fCAhdGhpcy5mb3JtKSByZXR1cm47XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoa2V5KTtcbiAgICBpZiAoIWNvbnRyb2wpIHJldHVybjtcbiAgICBjb25zdCBhbGxJZHMgPSB0aGlzLmdldEFsbE9wdGlvbklkcygpO1xuICAgIGlmICghYWxsSWRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmFsbFNlbGVjdGVkKSB7XG4gICAgICBjb250cm9sLnNldFZhbHVlKFtdLCB7IGVtaXRFdmVudDogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udHJvbC5zZXRWYWx1ZShhbGxJZHMsIHsgZW1pdEV2ZW50OiB0cnVlIH0pO1xuICAgIH1cbiAgICAvLyBLZWVwIHBhbmVsIG9wZW4gZm9yIGNvbnRpbnVlZCBzZWxlY3Rpb25zIGluIG11bHRpLXNlbGVjdFxuICAgIHRyeSB7IHNlbGVjdC5vcGVuKCk7IH0gY2F0Y2gge31cbiAgfVxuXG4gIG9uU2VsZWN0T3BlbmVkQ2hhbmdlKG9wZW5lZDogYm9vbGVhbiwgX3NlbGVjdDogTWF0U2VsZWN0KTogdm9pZCB7XG4gICAgaWYgKG9wZW5lZCkge1xuICAgICAgLy8gRW1pdCBjbGljayBldmVudCB3aGVuIHNlbGVjdCBpcyBvcGVuZWQgKGNsaWNrZWQpXG4gICAgICB0aGlzLnNlbGVjdENsaWNrLmVtaXQoKTtcbiAgICAgIC8vIFJlc2V0IGxvYWRpbmdNb3JlIHdoZW4gb3BlbmluZyBpZiBvcHRpb25zIGFscmVhZHkgZXhpc3QgKGRvbid0IHNob3cgbG9hZGVyIG9uIGluaXRpYWwgb3BlbilcbiAgICAgIGlmICgodGhpcy5jb25maWc/Lm9wdGlvbnMgfHwgW10pLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9yZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gRW5zdXJlIHdlIG9ubHkgdHJpZ2dlciBsb2FkLW1vcmUgYWZ0ZXIgYSByZWFsIHVzZXIgc2Nyb2xsXG4gICAgICB0aGlzLmhhc1Njcm9sbGVkU2luY2VPcGVuID0gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIGlmICghb3BlbmVkKSB7XG4gICAgICAvLyBSZXNldCBzZWFyY2ggdGV4dCBvbiBjbG9zZSBzbyB0aGUgbmV4dCBvcGVuIHNob3dzIGZ1bGwgbGlzdFxuICAgICAgaWYgKHRoaXMuY29uZmlnPy5rZXkpIHtcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0QnlLZXlbdGhpcy5jb25maWcua2V5XSA9ICcnO1xuICAgICAgfVxuICAgICAgLy8gRW5zdXJlIGFueSBwcmV2aW91cyBjdXN0b20gbGlzdGVuZXJzIGFyZSBjbGVhcmVkIChsZWdhY3kgY29tcGF0aWJpbGl0eSlcbiAgICAgIGlmICh0aGlzLm91dHNpZGVDbGVhbnVwKSB7XG4gICAgICAgIHRoaXMub3V0c2lkZUNsZWFudXAoKTtcbiAgICAgICAgdGhpcy5vdXRzaWRlQ2xlYW51cCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIC8vIERpc2Nvbm5lY3QgbG9hZC1tb3JlIG9ic2VydmVyIGlmIGFueVxuICAgICAgaWYgKHRoaXMubG9hZE1vcmVPYnNlcnZlcikge1xuICAgICAgICB0cnkgeyB0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIuZGlzY29ubmVjdCgpOyB9IGNhdGNoIHt9XG4gICAgICAgIHRoaXMubG9hZE1vcmVPYnNlcnZlciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIC8vIFJlbW92ZSBzY3JvbGwgbGlzdGVuZXIgaWYgYXR0YWNoZWRcbiAgICAgIGlmICh0aGlzLnBhbmVsU2Nyb2xsRWwpIHtcbiAgICAgICAgdHJ5IHsgdGhpcy5wYW5lbFNjcm9sbEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMub25QYW5lbFNjcm9sbCk7IH0gY2F0Y2gge31cbiAgICAgICAgdGhpcy5wYW5lbFNjcm9sbEVsID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgLy8gUmVzZXQgbG9hZGluZ01vcmUgd2hlbiBjbG9zaW5nXG4gICAgICB0aGlzLmxvYWRpbmdNb3JlID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRm9jdXMgdGhlIHNlYXJjaCBib3ggaWYgZW5hYmxlZFxuICAgIGlmICh0aGlzLmNvbmZpZz8uc2VhcmNoYWJsZSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PignLnRzLXNlbGVjdC1zZWFyY2gtaW5wdXQnKTtcbiAgICAgICAgaW5wdXQ/LmZvY3VzKCk7XG4gICAgICB9LCAwKTtcbiAgICB9XG5cbiAgICAvLyBPcHRpb25hbDogb25seSB0cmlnZ2VyIGluaXRpYWwgZmV0Y2ggb24gb3BlbiB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkLlxuICAgIGlmICh0aGlzLmNvbmZpZz8uc2VydmVyU2VhcmNoICYmIHRoaXMudG9Cb29sZWFuKHRoaXMuY29uZmlnPy5pbml0aWFsRmV0Y2hPbk9wZW4pKSB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZy5rZXk7XG4gICAgICBjb25zdCBxID0gdGhpcy5zZWFyY2hUZXh0QnlLZXlba2V5XSB8fCAnJztcbiAgICAgIHRyeSB7IHRoaXMuY29uZmlnLm9uU2VhcmNoPy4ocSk7IH0gY2F0Y2gge31cbiAgICAgIHRoaXMuc2VhcmNoQ2hhbmdlLmVtaXQoeyBrZXksIHF1ZXJ5OiBxIH0pO1xuICAgIH1cblxuICAgIC8vIFNldHVwIGluZmluaXRlIHNjcm9sbCBvYnNlcnZlciBvbiBzZW50aW5lbFxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZXR1cExvYWRNb3JlT2JzZXJ2ZXIoKSwgMCk7XG4gICAgLy8gQWxzbyBhdHRhY2ggYSBzY3JvbGwgbGlzdGVuZXIgZmFsbGJhY2sgZm9yIHJlbGlhYmxlIGxvYWQtbW9yZSB0cmlnZ2Vyc1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFuZWxzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubWF0LXNlbGVjdC1wYW5lbCcpKSBhcyBIVE1MRWxlbWVudFtdO1xuICAgICAgICB0aGlzLnBhbmVsU2Nyb2xsRWwgPSBwYW5lbHMubGVuZ3RoID8gcGFuZWxzW3BhbmVscy5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRoaXMucGFuZWxTY3JvbGxFbCkge1xuICAgICAgICAgIHRoaXMucGFuZWxTY3JvbGxFbC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLm9uUGFuZWxTY3JvbGwsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7fVxuICAgIH0sIDApO1xuICB9XG5cbiAgb25TZWFyY2goa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFRleHRCeUtleVtrZXldID0gdmFsdWUgPz8gJyc7XG4gICAgaWYgKHRoaXMuY29uZmlnPy5zZXJ2ZXJTZWFyY2gpIHtcbiAgICAgIC8vIEZvciBzZXJ2ZXItc2lkZSBzZWFyY2gsIGVtaXQgaW5zdGVhZCBvZiBsb2NhbCBmaWx0ZXJpbmdcbiAgICAgIHRyeSB7IHRoaXMuY29uZmlnLm9uU2VhcmNoPy4odmFsdWUgPz8gJycpOyB9IGNhdGNoIHt9XG4gICAgICB0aGlzLnNlYXJjaENoYW5nZS5lbWl0KHsga2V5LCBxdWVyeTogdmFsdWUgPz8gJycgfSk7XG4gICAgICAvLyBSZXNldCBpbnRlcm5hbCBwYWdpbmcgc3RhdGVcbiAgICAgIHRoaXMubG9hZGluZ01vcmUgPSBmYWxzZTtcbiAgICAgIHRoaXMubGFzdE9wdGlvbnNMZW5ndGggPSAodGhpcy5jb25maWc/Lm9wdGlvbnMgfHwgW10pLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9wdGlvbiBpZHMgZm9yIHRoZSBjb25maWd1cmVkIGNvbnRyb2wuXG4gICAqL1xuICBwcml2YXRlIGdldFNlbGVjdGVkSWRzRm9yS2V5KGtleTogc3RyaW5nKTogYW55W10ge1xuICAgIGlmICgha2V5IHx8ICF0aGlzLmZvcm0pIHJldHVybiBbXTtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChrZXkpO1xuICAgIGlmICghY29udHJvbCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBpZiAodGhpcy5pc011bHRpcGxlKSB7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCA/IFt2YWx1ZV0gOiBbXTtcbiAgfVxuXG4gIC8qKiBQcm9ncmFtbWF0aWNhbGx5IGNsb3NlIHRoZSBzZWxlY3QgcGFuZWwgaWYgb3BlbiAqL1xuICBwdWJsaWMgY2xvc2VQYW5lbCgpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5zZWxlY3RSZWY/LmNsb3NlKCk7XG4gICAgfSBjYXRjaCB7fVxuICB9XG5cbiAgZmlsdGVyZWRPcHRpb25zKGM6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyk6IFNlbGVjdE9wdGlvbltdIHtcbiAgICBjb25zdCB0ID0gKHRoaXMuc2VhcmNoVGV4dEJ5S2V5W2Mua2V5XSB8fCAnJykudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgLy8gSW4gc2VydmVyLXNpZGUgbW9kZSwgcmV0dXJuIG9wdGlvbnMgYXMtaXMgKHBhcmVudCBwcm92aWRlcyBsaXN0KVxuICAgIGlmIChjLnNlcnZlclNlYXJjaCkgcmV0dXJuIGMub3B0aW9ucyB8fCBbXTtcbiAgICAvLyBXaGVuIG5vdCBzZWFyY2hpbmcsIHJldHVybiBmdWxsIGxpc3QgdG8gcHJlc2VydmUgb3JpZ2luYWwgb3JkZXJpbmdcbiAgICBpZiAoIXQpIHJldHVybiBjLm9wdGlvbnMgfHwgW107XG5cbiAgICBjb25zdCBhbGxPcHRpb25zID0gYy5vcHRpb25zIHx8IFtdO1xuICAgIGNvbnN0IGJhc2VGaWx0ZXJlZCA9IGFsbE9wdGlvbnMuZmlsdGVyKChvcHQpID0+IHtcbiAgICAgIGNvbnN0IHRleHQgPSBTdHJpbmcob3B0Lm5hbWUgPz8gb3B0LmxhYmVsID8/IG9wdC52YWx1ZSA/PyAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiB0ZXh0LmluY2x1ZGVzKHQpO1xuICAgIH0pO1xuXG4gICAgLy8gRW5zdXJlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24ocykgYXJlIGFsd2F5cyB2aXNpYmxlIHdoaWxlIHNlYXJjaGluZ1xuICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gdGhpcy5nZXRTZWxlY3RlZElkc0ZvcktleShjLmtleSk7XG4gICAgaWYgKCFzZWxlY3RlZElkcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBiYXNlRmlsdGVyZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWVPZiA9IChvOiBTZWxlY3RPcHRpb24pID0+IHRoaXMuZ2V0T3B0aW9uVmFsdWUobyk7XG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25zID0gYWxsT3B0aW9ucy5maWx0ZXIobyA9PiBzZWxlY3RlZElkcy5pbmNsdWRlcyh2YWx1ZU9mKG8pKSk7XG5cbiAgICAvLyBNZXJnZSBzZWxlY3RlZCBvcHRpb25zIChrZWVwaW5nIHRoZWlyIG9yaWdpbmFsIG9yZGVyKSB3aXRoIGZpbHRlcmVkIG9uZXMsIGRlLWR1cGxpY2F0ZWRcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxhbnk+KCk7XG4gICAgY29uc3QgbWVyZ2VkOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbyBvZiBzZWxlY3RlZE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHZhbCA9IHZhbHVlT2Yobyk7XG4gICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFzZWVuLmhhcyh2YWwpKSB7XG4gICAgICAgIHNlZW4uYWRkKHZhbCk7XG4gICAgICAgIG1lcmdlZC5wdXNoKG8pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IG8gb2YgYmFzZUZpbHRlcmVkKSB7XG4gICAgICBjb25zdCB2YWwgPSB2YWx1ZU9mKG8pO1xuICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGlmICghc2Vlbi5oYXModmFsKSkge1xuICAgICAgICBzZWVuLmFkZCh2YWwpO1xuICAgICAgICBtZXJnZWQucHVzaChvKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfVxuXG4gIC8qKiBXaGVuIGFsbG93Q3VzdG9tVmFsdWUgaXMgdHJ1ZSBhbmQgdGhlIHVzZXIgaGFzIHR5cGVkIGEgdmFsdWUgdGhhdCBpcyBub3QgaW4gb3B0aW9ucywgcmV0dXJucyB0aGF0IHZhbHVlIGZvciB0aGUgXCJBZGRcIiBvcHRpb24uICovXG4gIGdldCBjdXN0b21WYWx1ZVRvQWRkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGMgPSB0aGlzLmNvbmZpZztcbiAgICBpZiAoIWM/LmtleSB8fCAhdGhpcy50b0Jvb2xlYW4oYy5zZWFyY2hhYmxlKSB8fCAhdGhpcy50b0Jvb2xlYW4oYy5hbGxvd0N1c3RvbVZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgdCA9ICh0aGlzLnNlYXJjaFRleHRCeUtleVtjLmtleV0gfHwgJycpLnRyaW0oKTtcbiAgICBpZiAoIXQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG9wdHMgPSBjLm9wdGlvbnMgfHwgW107XG4gICAgY29uc3QgbG93ZXIgPSB0LnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IG9wdHMuc29tZSgobykgPT4ge1xuICAgICAgY29uc3QgdiA9IFN0cmluZyhvLm5hbWUgPz8gby5sYWJlbCA/PyBvLnZhbHVlID8/IG8uaWQgPz8gJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gdiA9PT0gbG93ZXI7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFscmVhZHlFeGlzdHMgPyBudWxsIDogdDtcbiAgfVxuXG4gIGdldCBzaG93QWRkQ3VzdG9tT3B0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmN1c3RvbVZhbHVlVG9BZGQgIT09IG51bGw7XG4gIH1cblxuICBnZXQgYWRkQ3VzdG9tU2VudGluZWxWYWx1ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHYgPSB0aGlzLmN1c3RvbVZhbHVlVG9BZGQ7XG4gICAgcmV0dXJuIHYgIT0gbnVsbCA/IGAke3RoaXMuQUREX0NVU1RPTV9WQUxVRV9QUkVGSVh9JHt2fWAgOiAnJztcbiAgfVxuXG4gIC8vIENsb3NlIHdoZW4gYW4gb3B0aW9uIGlzIHNlbGVjdGVkIGlmIHJlcXVlc3RlZC4gQWx3YXlzIGNsb3NlIGZvciBzaW5nbGUtc2VsZWN0LlxuICBvblNlbGVjdGlvbkNoYW5nZShldmVudDogTWF0U2VsZWN0Q2hhbmdlLCBzZWxlY3Q6IE1hdFNlbGVjdCk6IHZvaWQge1xuICAgIC8vIEhhbmRsZSBhZGQtY3VzdG9tLXZhbHVlIHNlbnRpbmVsIChhbGxvd0N1c3RvbVZhbHVlKVxuICAgIGNvbnN0IHJhdyA9IGV2ZW50LnZhbHVlO1xuICAgIGNvbnN0IHNlbnRpbmVsSW5BcnJheSA9IEFycmF5LmlzQXJyYXkocmF3KVxuICAgICAgPyByYXcuZmluZCgodjogYW55KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgJiYgdi5zdGFydHNXaXRoKHRoaXMuQUREX0NVU1RPTV9WQUxVRV9QUkVGSVgpKVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGlzQWRkQ3VzdG9tID1cbiAgICAgICh0eXBlb2YgcmF3ID09PSAnc3RyaW5nJyAmJiByYXcuc3RhcnRzV2l0aCh0aGlzLkFERF9DVVNUT01fVkFMVUVfUFJFRklYKSkgfHwgc2VudGluZWxJbkFycmF5ICE9IG51bGw7XG5cbiAgICBpZiAoaXNBZGRDdXN0b20pIHtcbiAgICAgIGNvbnN0IHNlbnRpbmVsU3RyID0gdHlwZW9mIHJhdyA9PT0gJ3N0cmluZycgPyByYXcgOiBzZW50aW5lbEluQXJyYXk7XG4gICAgICBjb25zdCB2YWx1ZSA9IFN0cmluZyhzZW50aW5lbFN0cikuc2xpY2UodGhpcy5BRERfQ1VTVE9NX1ZBTFVFX1BSRUZJWC5sZW5ndGgpO1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWc/LmtleTtcbiAgICAgIGlmIChrZXkgJiYgdGhpcy5mb3JtKSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XG4gICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNNdWx0aXBsZSAmJiBBcnJheS5pc0FycmF5KGNvbnRyb2wudmFsdWUpKSB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IChjb250cm9sLnZhbHVlIGFzIGFueVtdKS5maWx0ZXIoXG4gICAgICAgICAgICAgICh2OiBhbnkpID0+IHR5cGVvZiB2ICE9PSAnc3RyaW5nJyB8fCAhdi5zdGFydHNXaXRoKHRoaXMuQUREX0NVU1RPTV9WQUxVRV9QUkVGSVgpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29udHJvbC5zZXRWYWx1ZShmaWx0ZXJlZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250cm9sLnNldFZhbHVlKG51bGwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuYWRkQ3VzdG9tVmFsdWUuZW1pdCh7IGtleToga2V5ID8/ICcnLCB2YWx1ZSB9KTtcbiAgICAgIGlmICh0aGlzLmNvbmZpZz8uc2VhcmNoYWJsZSAmJiB0aGlzLmNvbmZpZz8ua2V5KSB7XG4gICAgICAgIHRoaXMuc2VhcmNoVGV4dEJ5S2V5W3RoaXMuY29uZmlnLmtleV0gPSAnJztcbiAgICAgIH1cbiAgICAgIHRyeSB7IHNlbGVjdC5jbG9zZSgpOyB9IGNhdGNoIHt9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEhhbmRsZSBzZWxlY3QtYWxsIHNlbnRpbmVsIGluIG11bHRpLXNlbGVjdFxuICAgIGlmICh0aGlzLmlzTXVsdGlwbGUgJiYgQXJyYXkuaXNBcnJheShldmVudC52YWx1ZSkgJiYgZXZlbnQudmFsdWUuaW5jbHVkZXModGhpcy5TRUxFQ1RfQUxMX1ZBTFVFKSkge1xuICAgICAgLy8gUmVtb3ZlIHNlbnRpbmVsIGFuZCB0b2dnbGUgYWxsXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5O1xuICAgICAgaWYgKGtleSAmJiB0aGlzLmZvcm0pIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoa2V5KTtcbiAgICAgICAgLy8gVG9nZ2xlIGJhc2VkIG9uIGN1cnJlbnQgc3RhdGVcbiAgICAgICAgdGhpcy5vblRvZ2dsZVNlbGVjdEFsbChzZWxlY3QpO1xuICAgICAgICAvLyBFbnN1cmUgc2VudGluZWwgaXMgbm90IHByZXNlbnRcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IChjb250cm9sLnZhbHVlIGFzIGFueVtdKS5maWx0ZXIodiA9PiB2ICE9PSB0aGlzLlNFTEVDVF9BTExfVkFMVUUpO1xuICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUoZmlsdGVyZWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gRG8gbm90IHByb2NlZWQgd2l0aCBub3JtYWwgY2xvc2UgbG9naWMgZm9yIHNlbGVjdC1hbGxcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gTGV0IEFuZ3VsYXIgTWF0ZXJpYWwgYXV0by1jbG9zZSBmb3Igc2luZ2xlLXNlbGVjdC5cbiAgICAvLyBGb3IgbXVsdGktc2VsZWN0LCBjbG9zZSBvbmx5IGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkLlxuICAgIGNvbnN0IHNob3VsZENsb3NlID0gdGhpcy5pc011bHRpcGxlID8gISF0aGlzLmNvbmZpZz8uY2xvc2VPblNlbGVjdCA6IGZhbHNlO1xuICAgIGlmIChzaG91bGRDbG9zZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2VsZWN0LmNsb3NlKCk7XG4gICAgICB9IGNhdGNoIHt9XG4gICAgfVxuICAgIC8vIElmIHNlYXJjaGFibGUsIGNsZWFyIHRoZSBzZWFyY2ggYWZ0ZXIgc2VsZWN0aW9uIHNvIHJlb3BlbmluZyB3b3JrcyBwcmVkaWN0YWJseVxuICAgIGlmICh0aGlzLmNvbmZpZz8uc2VhcmNoYWJsZSAmJiB0aGlzLmNvbmZpZz8ua2V5KSB7XG4gICAgICB0aGlzLnNlYXJjaFRleHRCeUtleVt0aGlzLmNvbmZpZy5rZXldID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZz8ub25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuY29uZmlnLm9uQ2hhbmdlKGV2ZW50LnZhbHVlLCBldmVudCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdjcWEtZHluYW1pYy1zZWxlY3Qgb25DaGFuZ2UgaGFuZGxlciBlcnJvcjonLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh7XG4gICAgICBrZXk6IHRoaXMuY29uZmlnPy5rZXksXG4gICAgICB2YWx1ZTogZXZlbnQudmFsdWUsXG4gICAgICBldmVudCxcbiAgICB9KTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIC8vIENsb3NlIHdoZW4gY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgdHJpZ2dlciBhbmQgb3V0c2lkZSBvZiB0aGUgb3BlbiBwYW5lbFxuICAgIGlmICghdGhpcy5zZWxlY3RSZWY/LnBhbmVsT3Blbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG4gICAgLy8gSWYgY2xpY2sgaXMgaW5zaWRlIHRoZSBjb21wb25lbnQgaG9zdCwgaWdub3JlXG4gICAgaWYgKHRoaXMuaG9zdEVsPy5uYXRpdmVFbGVtZW50ICYmIHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBJZiBjbGljayBpcyBpbnNpZGUgYW55IG9wZW4gbWF0LXNlbGVjdCBwYW5lbCwgaWdub3JlXG4gICAgY29uc3QgcGFuZWxFbHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tYXQtc2VsZWN0LXBhbmVsJykpIGFzIEhUTUxFbGVtZW50W107XG4gICAgY29uc3QgY2xpY2tJbnNpZGVQYW5lbCA9IHBhbmVsRWxzLnNvbWUoKGVsKSA9PiBlbC5jb250YWlucyh0YXJnZXQpKTtcbiAgICBpZiAoY2xpY2tJbnNpZGVQYW5lbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5zZWxlY3RSZWYuY2xvc2UoKTtcbiAgICB9IGNhdGNoIHt9XG4gIH1cblxuICAvKipcbiAgICogSGlnaGxpZ2h0cyB0ZXh0IGJhc2VkIG9uIHRoZSBjb25maWd1cmVkIGhpZ2hsaWdodFBhdHRlcm4uXG4gICAqIFJldHVybnMgSFRNTCBzdHJpbmcgd2l0aCBoaWdobGlnaHRlZCBwb3J0aW9ucyB3cmFwcGVkIGluIDxzcGFuIGNsYXNzPVwiaGlnaGxpZ2h0XCI+LlxuICAgKi9cbiAgaGlnaGxpZ2h0VGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGV4dCB8fCAhdGhpcy5jb25maWc/LmhpZ2hsaWdodFBhdHRlcm4pIHtcbiAgICAgIHJldHVybiB0aGlzLmVzY2FwZUh0bWwodGV4dCk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0dGVybiA9IHRoaXMuY29uZmlnLmhpZ2hsaWdodFBhdHRlcm47XG5cbiAgICAvLyBJZiBpdCdzIGEgZnVuY3Rpb24sIHVzZSBpdCBkaXJlY3RseVxuICAgIGlmICh0eXBlb2YgcGF0dGVybiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHBhdHRlcm4odGV4dCk7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBzdHJpbmcgcGF0dGVybiB0byBSZWdFeHAgaWYgbmVlZGVkXG4gICAgbGV0IHJlZ2V4OiBSZWdFeHA7XG4gICAgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVnZXggPSBuZXcgUmVnRXhwKHBhdHRlcm4sICdnaScpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgaGlnaGxpZ2h0IHBhdHRlcm46JywgcGF0dGVybik7XG4gICAgICAgIHJldHVybiB0aGlzLmVzY2FwZUh0bWwodGV4dCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZ2V4ID0gcGF0dGVybjtcbiAgICB9XG5cbiAgICAvLyBFc2NhcGUgSFRNTCBmaXJzdCwgdGhlbiBhcHBseSBoaWdobGlnaHRpbmdcbiAgICBjb25zdCBlc2NhcGVkID0gdGhpcy5lc2NhcGVIdG1sKHRleHQpO1xuICAgIHJldHVybiBlc2NhcGVkLnJlcGxhY2UocmVnZXgsIChtYXRjaCkgPT4gYDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtcHJpbWFyeVwiPiR7bWF0Y2h9PC9zcGFuPmApO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzY2FwZXMgSFRNTCBzcGVjaWFsIGNoYXJhY3RlcnMgdG8gcHJldmVudCBYU1MuXG4gICAqL1xuICBwcml2YXRlIGVzY2FwZUh0bWwodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRleHQpIHJldHVybiAnJztcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIHJldHVybiBkaXYuaW5uZXJIVE1MO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBoaWdobGlnaHRpbmcgaXMgZW5hYmxlZCBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAqL1xuICBnZXQgaGFzSGlnaGxpZ2h0aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuY29uZmlnPy5oaWdobGlnaHRQYXR0ZXJuO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cExvYWRNb3JlT2JzZXJ2ZXIoKTogdm9pZCB7XG4gICAgLy8gT25seSBpZiBjb25zdW1lciBpbmRpY2F0ZXMgbW9yZSBkYXRhIGlzIGF2YWlsYWJsZVxuICAgIGlmICghdGhpcy5jb25maWc/Lmhhc01vcmUpIHJldHVybjtcbiAgICAvLyBGaW5kIHNlbnRpbmVsIG9wdGlvbiByZW5kZXJlZCBpbiB0aGUgb3BlbiBwYW5lbFxuICAgIGNvbnN0IHNlbnRpbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1hdC1zZWxlY3QtcGFuZWwgLm1hdC1vcHRpb24ubG9hZC1tb3JlLXNlbnRpbmVsJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghc2VudGluZWwpIHJldHVybjtcbiAgICBpZiAodGhpcy5sb2FkTW9yZU9ic2VydmVyKSB7XG4gICAgICB0cnkgeyB0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIuZGlzY29ubmVjdCgpOyB9IGNhdGNoIHt9XG4gICAgICB0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIFVzZSB0aGUgc2VudGluZWwncyBjbG9zZXN0IHBhbmVsIGFzIHRoZSByb290IHRvIGF2b2lkIHBpY2tpbmcgYSB3cm9uZyBwYW5lbFxuICAgIGNvbnN0IHBhbmVsUm9vdCA9IHNlbnRpbmVsLmNsb3Nlc3QoJy5tYXQtc2VsZWN0LXBhbmVsJykgYXMgRWxlbWVudCB8IG51bGw7XG4gICAgdGhpcy5sb2FkTW9yZU9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgLy8gUmVxdWVzdCBtb3JlIG9ubHkgaWYgbm90IGN1cnJlbnRseSBsb2FkaW5nIGFuZCBoYXNNb3JlIHN0aWxsIHRydWVcbiAgICAgICAgICBpZiAodGhpcy5oYXNTY3JvbGxlZFNpbmNlT3BlbiAmJiAhdGhpcy5sb2FkaW5nTW9yZSAmJiB0aGlzLmNvbmZpZz8uaGFzTW9yZSkge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nTW9yZSA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5IHx8ICcnO1xuICAgICAgICAgICAgY29uc3QgcSA9IHRoaXMuc2VhcmNoVGV4dEJ5S2V5W2tleV0gfHwgJyc7XG4gICAgICAgICAgICAvLyBFbWl0IG91dHB1dHMgYW5kIGludm9rZSBvcHRpb25hbCBjYWxsYmFja3NcbiAgICAgICAgICAgIHRoaXMubG9hZE1vcmUuZW1pdCh7IGtleSwgcXVlcnk6IHEgfSk7XG4gICAgICAgICAgICB0cnkgeyB0aGlzLmNvbmZpZy5vbkxvYWRNb3JlPy4ocSk7IH0gY2F0Y2gge31cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB7IHJvb3Q6IHBhbmVsUm9vdCwgdGhyZXNob2xkOiAwLjEgfSk7XG4gICAgdHJ5IHsgdGhpcy5sb2FkTW9yZU9ic2VydmVyLm9ic2VydmUoc2VudGluZWwpOyB9IGNhdGNoIHt9XG4gIH1cbn1cblxuXG4iLCI8ZGl2IGNsYXNzPVwiY3FhLXVpLXJvb3RcIj5cbiAgPG5nLWNvbnRhaW5lciBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgICA8bGFiZWwgKm5nSWY9XCJjb25maWcubGFiZWxcIlxuICAgICAgY2xhc3M9XCJmb3JtLWxhYmVsIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1ibG9jayBjcWEtbGVhZGluZy1bMS40XSBjcWEtbWItMlwiPnt7XG4gICAgICBjb25maWcubGFiZWwgfX08L2xhYmVsPlxuICAgIDxtYXQtZm9ybS1maWVsZCAjaG9zdCBjbGFzcz1cIm1hdC1zZWxlY3QtY3VzdG9tIGNxYS13LWZ1bGxcIiBhcHBlYXJhbmNlPVwiZmlsbFwiPlxuICAgICAgPG1hdC1zZWxlY3QgI3NlbGVjdFJlZj1cIm1hdFNlbGVjdFwiIFtwbGFjZWhvbGRlcl09XCJkaXNwbGF5UGxhY2Vob2xkZXJcIiBbbXVsdGlwbGVdPVwiaXNNdWx0aXBsZVwiXG4gICAgICAgIGRpc2FibGVPcHRpb25DZW50ZXJpbmcgW3BhbmVsQ2xhc3NdPVwicGFuZWxDbGFzc1wiIFtmb3JtQ29udHJvbE5hbWVdPVwiY29uZmlnLmtleVwiXG4gICAgICAgIChvcGVuZWRDaGFuZ2UpPVwib25TZWxlY3RPcGVuZWRDaGFuZ2UoJGV2ZW50LCBzZWxlY3RSZWYpXCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQsIHNlbGVjdFJlZilcIj5cblxuICAgICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cImNvbmZpZy5zZWFyY2hhYmxlXCIgY2xhc3M9XCJ0cy1zZWxlY3Qtc2VhcmNoXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgPGlucHV0IGNsYXNzPVwidHMtc2VsZWN0LXNlYXJjaC1pbnB1dCBjcWEtdGV4dC1ibGFjay0xMDBcIiB0eXBlPVwidGV4dFwiIFt2YWx1ZV09XCJzZWFyY2hUZXh0QnlLZXlbY29uZmlnLmtleV0gfHwgJydcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChpbnB1dCk9XCJvblNlYXJjaChjb25maWcua2V5LCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiIC8+XG4gICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgXG4gICAgICAgIDxtYXQtb3B0aW9uIFtuZ0NsYXNzXT1cInsnY2hlY2ttYXJrJzogY29uZmlnLm9wdGlvblN0eWxlID09PSAnY2hlY2ttYXJrJywnY2hlY2tib3gnOiBjb25maWcub3B0aW9uU3R5bGUgIT09ICdjaGVja21hcmsnLCdtYXQtc2VsZWN0ZWQnOiBhbGxTZWxlY3RlZH1cIiBbY2xhc3NdPVwiY29uZmlnLm9wdGlvblN0eWxlID09ICdjaGVja21hcmsnID8gJ2NoZWNrbWFyaycgOiAnY2hlY2tib3gnXCIgKm5nSWY9XCJpc011bHRpcGxlICYmIGNvbmZpZy5zaG93U2VsZWN0QWxsXCIgW3ZhbHVlXT1cIlNFTEVDVF9BTExfVkFMVUVcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlQ2hlY2tib3hTdHlsZTsgZWxzZSBzZWxlY3RBbGxEZWZhdWx0VHBsXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdy00IGNxYS1oLTQgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXJvdW5kZWQtWzRweF0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRDFENURCXSBjcWEtbXItMiBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtYm9yZGVyLXNvbGlkXCJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJhbGxTZWxlY3RlZCA/IHsnYmFja2dyb3VuZC1jb2xvcic6JyM0RjQ2RTUnLCdib3JkZXItY29sb3InOicjNEY0NkU1J30gOiB7fVwiPlxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJhbGxTZWxlY3RlZFwiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAgM0w0LjUgOC41TDIgNlwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW1pbi13LTBcIj57eyBjb25maWcuc2VsZWN0QWxsTGFiZWwgfHwgJ0FsbCcgfX08L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNzZWxlY3RBbGxEZWZhdWx0VHBsPlxuICAgICAgICAgICAge3sgY29uZmlnLnNlbGVjdEFsbExhYmVsIHx8ICdBbGwnIH19XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9tYXQtb3B0aW9uPlxuXG4gICAgICAgIDxtYXQtb3B0aW9uICpuZ0lmPVwic2hvd0FkZEN1c3RvbU9wdGlvblwiIFt2YWx1ZV09XCJhZGRDdXN0b21TZW50aW5lbFZhbHVlXCIgY2xhc3M9XCJjcWEtdGV4dC1wcmltYXJ5XCI+XG4gICAgICAgICAgTmV3XG4gICAgICAgIDwvbWF0LW9wdGlvbj5cblxuICAgICAgICA8bWF0LW9wdGlvbiBbY2xhc3NdPVwiY29uZmlnLm9wdGlvblN0eWxlID09ICdjaGVja21hcmsnID8gJ2NoZWNrbWFyaycgOiAnY2hlY2tib3gnXCIgKm5nRm9yPVwibGV0IG9wdCBvZiBmaWx0ZXJlZE9wdGlvbnMoY29uZmlnKVwiIFt2YWx1ZV09XCJnZXRPcHRpb25WYWx1ZShvcHQpXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbmZpZy5pc0NvbXBhcmVSdW5zXCI+ICAgXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlQ2hlY2tib3hTdHlsZTsgZWxzZSBjb21wYXJlUnVuc0RlZmF1bHRPcHRpb25UcGxcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXctZnVsbCBjcWEtY29tcGFyZS1ydW5zLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXctNCBjcWEtaC00IGNxYS1mbGV4LXNocmluay0wIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0QxRDVEQl0gY3FhLW1yLTIgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWJvcmRlci1zb2xpZFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImlzT3B0aW9uU2VsZWN0ZWQob3B0KSA/IHsnYmFja2dyb3VuZC1jb2xvcic6JyM0RjQ2RTUnLCdib3JkZXItY29sb3InOicjNEY0NkU1J30gOiB7fVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNPcHRpb25TZWxlY3RlZChvcHQpXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAgM0w0LjUgOC41TDIgNlwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLW1pbi13LTAgY3FhLWNvbXBhcmUtcnVuc1wiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaGFzSGlnaGxpZ2h0aW5nXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cIm9wdC5zdGF0dXNDb2xvciB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJoaWdobGlnaHRUZXh0KG9wdC5uYW1lID8/IG9wdC5sYWJlbCA/PyBvcHQudmFsdWUpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoYXNIaWdobGlnaHRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1taW4tdy0wIGNxYS1jb21wYXJlLXJ1bnNcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwib3B0LnJ1bk51bWJlckxhYmVsICYmIG9wdC5ydW5EYXRlTGFiZWw7IGVsc2UgY2hlY2tib3hEZWZhdWx0TGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbc3R5bGUuY29sb3JdPVwib3B0LnN0YXR1c0NvbG9yIHx8IG51bGxcIj57eyBvcHQucnVuTnVtYmVyTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF1cIj4ge3sgb3B0LnJ1bkRhdGVMYWJlbCB9fSZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NoZWNrYm94RGVmYXVsdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1taW4tdy0wIGNxYS1jb21wYXJlLXJ1bnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cIm9wdC5zdGF0dXNDb2xvciB8fCBudWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBvcHQubmFtZSA/PyBvcHQubGFiZWwgPz8gb3B0LnZhbHVlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIm9wdC5kdXJhdGlvbkZvcm1hdHRlZFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktc3RhcnQgY3FhLWdhcC0xIGNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS1tYXgtdy1bODBweF1cIiBcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgJ2NxYS1taW4tdy1bODJweF0nOiBvcHQ/Lmhhc0hvdXJSdW4sXG4gICAgICAgICAgICAgICAgICAgICdjcWEtbWluLXctWzY2cHhdJzogIW9wdD8uaGFzSG91clJ1biAmJiBvcHQ/Lmhhc01pbnV0ZVJ1bixcbiAgICAgICAgICAgICAgICAgICAgJ2NxYS1taW4tdy1bNDBweF0nOiAhb3B0Py5oYXNIb3VyUnVuICYmICFvcHQ/Lmhhc01pbnV0ZVJ1blxuICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1taW4tdy1bMTJweF0gY3FhLW1heC13LVsxMnB4XVwiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjZcIiBjeT1cIjZcIiByPVwiNC41XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjFcIi8+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNiAzLjVWNkw3LjUgN1wiIHN0cm9rZT1cIiM0QjU1NjNcIiBzdHJva2Utd2lkdGg9XCIxXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyBvcHQuZHVyYXRpb25Gb3JtYXR0ZWQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY29tcGFyZVJ1bnNEZWZhdWx0T3B0aW9uVHBsPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtdy1mdWxsIGNxYS1jb21wYXJlLXJ1bnMtaXRlbVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1taW4tdy0wIGNxYS1jb21wYXJlLXJ1bnNcIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJoYXNIaWdobGlnaHRpbmdcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cIm9wdC5zdGF0dXNDb2xvciB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiaGlnaGxpZ2h0VGV4dChvcHQubmFtZSA/PyBvcHQubGFiZWwgPz8gb3B0LnZhbHVlKVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWhhc0hpZ2hsaWdodGluZ1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtbWluLXctMCBjcWEtY29tcGFyZS1ydW5zXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJvcHQucnVuTnVtYmVyTGFiZWwgJiYgb3B0LnJ1bkRhdGVMYWJlbDsgZWxzZSBkZWZhdWx0TGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3N0eWxlLmNvbG9yXT1cIm9wdC5zdGF0dXNDb2xvciB8fCBudWxsXCI+e3sgb3B0LnJ1bk51bWJlckxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXVwiPiB7eyBvcHQucnVuRGF0ZUxhYmVsIH19Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtbWluLXctMCBjcWEtY29tcGFyZS1ydW5zXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwib3B0LnN0YXR1c0NvbG9yIHx8IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBvcHQubmFtZSA/PyBvcHQubGFiZWwgPz8gb3B0LnZhbHVlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwib3B0LmR1cmF0aW9uRm9ybWF0dGVkXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1zdGFydCBjcWEtZ2FwLTEgY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtZmxleC1zaHJpbmstMCBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLW1heC13LVs4MHB4XVwiIFxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAnY3FhLW1pbi13LVs4MnB4XSc6IG9wdD8uaGFzSG91clJ1bixcbiAgICAgICAgICAgICAgICAgICAgJ2NxYS1taW4tdy1bNjZweF0nOiAhb3B0Py5oYXNIb3VyUnVuICYmIG9wdD8uaGFzTWludXRlUnVuLFxuICAgICAgICAgICAgICAgICAgICAnY3FhLW1pbi13LVs0MHB4XSc6ICFvcHQ/Lmhhc0hvdXJSdW4gJiYgIW9wdD8uaGFzTWludXRlUnVuXG4gICAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLW1pbi13LVsxMnB4XSBjcWEtbWF4LXctWzEycHhdXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiNlwiIGN5PVwiNlwiIHI9XCI0LjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMVwiLz5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk02IDMuNVY2TDcuNSA3XCIgc3Ryb2tlPVwiIzRCNTU2M1wiIHN0cm9rZS13aWR0aD1cIjFcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IG9wdC5kdXJhdGlvbkZvcm1hdHRlZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb25maWcuaXNDb21wYXJlUnVuc1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVzZUNoZWNrYm94U3R5bGU7IGVsc2UgZGVmYXVsdE9wdGlvblRwbFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS13LTQgY3FhLWgtNCBjcWEtZmxleC1zaHJpbmstMCBjcWEtcm91bmRlZC1bNHB4XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNEMUQ1REJdIGNxYS1tci0yIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1ib3JkZXItc29saWRcIlxuICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiaXNPcHRpb25TZWxlY3RlZChvcHQpID8geydiYWNrZ3JvdW5kLWNvbG9yJzonIzRGNDZFNScsJ2JvcmRlci1jb2xvcic6JyM0RjQ2RTUnfSA6IHt9XCI+XG4gICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNPcHRpb25TZWxlY3RlZChvcHQpXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwIDNMNC41IDguNUwyIDZcIiBzdHJva2U9XCJ3aGl0ZVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8IS0tIFdoZW4gZGlzcGxheUxhYmVsQXNJbm5lckh0bWwgaXMgdHJ1ZSwgcmVuZGVyIGxhYmVsIGFzIHJhdyBIVE1MIC0tPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW1pbi13LTBcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29uZmlnPy5kaXNwbGF5TGFiZWxBc0lubmVySHRtbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJvcHQubGFiZWwgPz8gb3B0Lm5hbWUgPz8gb3B0LnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwhLS0gT3RoZXJ3aXNlIHVzZSBub3JtYWwvaGlnaGxpZ2h0ZWQgdGV4dCByZW5kZXJpbmcgLS0+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtbWluLXctMFwiXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhY29uZmlnPy5kaXNwbGF5TGFiZWxBc0lubmVySHRtbCAmJiBoYXNIaWdobGlnaHRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiaGlnaGxpZ2h0VGV4dChvcHQubmFtZSA/PyBvcHQubGFiZWwgPz8gb3B0LnZhbHVlKVwiPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1taW4tdy0wXCJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFjb25maWc/LmRpc3BsYXlMYWJlbEFzSW5uZXJIdG1sICYmICFoYXNIaWdobGlnaHRpbmdcIj5cbiAgICAgICAgICAgICAgICAgIHt7IG9wdC5uYW1lID8/IG9wdC5sYWJlbCA/PyBvcHQudmFsdWUgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0T3B0aW9uVHBsPlxuICAgICAgICAgICAgICA8IS0tIFdoZW4gZGlzcGxheUxhYmVsQXNJbm5lckh0bWwgaXMgdHJ1ZSwgcmVuZGVyIGxhYmVsIGFzIHJhdyBIVE1MIC0tPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbmZpZz8uZGlzcGxheUxhYmVsQXNJbm5lckh0bWxcIlxuICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIm9wdC5sYWJlbCA/PyBvcHQubmFtZSA/PyBvcHQudmFsdWVcIj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8IS0tIE90aGVyd2lzZSB1c2Ugbm9ybWFsL2hpZ2hsaWdodGVkIHRleHQgcmVuZGVyaW5nIC0tPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFjb25maWc/LmRpc3BsYXlMYWJlbEFzSW5uZXJIdG1sICYmIGhhc0hpZ2hsaWdodGluZ1wiXG4gICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiaGlnaGxpZ2h0VGV4dChvcHQubmFtZSA/PyBvcHQubGFiZWwgPz8gb3B0LnZhbHVlKVwiPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWNvbmZpZz8uZGlzcGxheUxhYmVsQXNJbm5lckh0bWwgJiYgIWhhc0hpZ2hsaWdodGluZ1wiPlxuICAgICAgICAgICAgICAgIHt7IG9wdC5uYW1lID8/IG9wdC5sYWJlbCA/PyBvcHQudmFsdWUgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICBcbiAgICAgICAgPCEtLSBObyByZXN1bHRzIHN0YXRlIChvbmx5IHdoZW4gbm90IGxvYWRpbmcgYW5kIG5vIG9wdGlvbnMpIC0tPlxuICAgICAgICA8bWF0LW9wdGlvbiBkaXNhYmxlZCAqbmdJZj1cIiEoY29uZmlnPy5vcHRpb25zPy5sZW5ndGggfHwgMCkgJiYgIShjb25maWc/LmlzTG9hZGluZyB8fCBsb2FkaW5nTW9yZSlcIj5cbiAgICAgICAgICBObyByZXN1bHRzXG4gICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPCEtLSBJbmZpbml0ZSBzY3JvbGwgc2VudGluZWwgKHNlcnZlclNlYXJjaCBvciBleHBsaWNpdCBoYXNNb3JlKSAtLT5cbiAgICAgICAgPG1hdC1vcHRpb24gZGlzYWJsZWQgY2xhc3M9XCJsb2FkLW1vcmUtc2VudGluZWxcIiAqbmdJZj1cImNvbmZpZz8uaGFzTW9yZVwiPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwibG9hZGluZ01vcmUgfHwgY29uZmlnPy5pc0xvYWRpbmdcIj5Mb2FkaW5nLi4uPC9zcGFuPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWxvYWRpbmdNb3JlICYmICFjb25maWc/LmlzTG9hZGluZ1wiPlNjcm9sbCB0byBsb2FkIG1vcmXigKY8L3NwYW4+XG4gICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICA8IS0tIElubGluZSBzcGlubmVyIHNob3duIHdoZW4gbG9hZGluZyBtb3JlIChpbmZpbml0ZSBzY3JvbGwpIG9yIHdoZW4gY29uZmlnLmlzTG9hZGluZyBpcyB0cnVlIC0tPlxuICAgICAgICA8c3ZnICpuZ0lmPVwibG9hZGluZ01vcmUgfHwgY29uZmlnPy5pc0xvYWRpbmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDUwIDUwXCIgYXJpYS1sYWJlbD1cImxvYWRpbmdcIlxuICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8Y2lyY2xlIGN4PVwiMjVcIiBjeT1cIjI1XCIgcj1cIjIwXCIgc3Ryb2tlPVwiI0U1RTdFQlwiIHN0cm9rZS13aWR0aD1cIjZcIiBmaWxsPVwibm9uZVwiLz5cbiAgICAgICAgICA8cGF0aCBkPVwiTTQ1IDI1YTIwIDIwIDAgMCAwLTIwLTIwXCIgc3Ryb2tlPVwiIzRGNDZFNVwiIHN0cm9rZS13aWR0aD1cIjZcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj5cbiAgICAgICAgICAgIDxhbmltYXRlVHJhbnNmb3JtIGF0dHJpYnV0ZU5hbWU9XCJ0cmFuc2Zvcm1cIiB0eXBlPVwicm90YXRlXCIgZnJvbT1cIjAgMjUgMjVcIiB0bz1cIjM2MCAyNSAyNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXI9XCIwLjhzXCIgcmVwZWF0Q291bnQ9XCJpbmRlZmluaXRlXCIvPlxuICAgICAgICAgIDwvcGF0aD5cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiMwQTBBMEFcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj4iXX0=