fx-form-builder-wrapper 2.0.98 → 2.0.100

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.
@@ -1,7 +1,7 @@
1
1
  import { CommonModule } from '@angular/common';
2
2
  import { Component, inject, ViewChild } from '@angular/core';
3
3
  import { ReactiveFormsModule, FormsModule, FormBuilder } from '@angular/forms';
4
- import { FxBaseComponent, FxComponent, FxStringSetting, FxValidatorService } from '@instantsys-labs/fx';
4
+ import { FxBaseComponent, FxComponent, FxStringSetting } from '@instantsys-labs/fx';
5
5
  import { Subject, takeUntil } from 'rxjs';
6
6
  import * as i0 from "@angular/core";
7
7
  import * as i1 from "@angular/common/http";
@@ -21,7 +21,7 @@ export class SummaryComponent extends FxBaseComponent {
21
21
  summaryForm = this.fb.group({
22
22
  summary: [''],
23
23
  });
24
- dynamicText = 'My name is {name} and I am {age} years old';
24
+ dynamicText = '';
25
25
  constructor(cdr, http, fxBuilderWrapperService) {
26
26
  super(cdr);
27
27
  this.cdr = cdr;
@@ -32,141 +32,60 @@ export class SummaryComponent extends FxBaseComponent {
32
32
  });
33
33
  }
34
34
  ngOnInit() {
35
+ this.dynamicText = this.setting('summaryText') || '';
35
36
  this.fxBuilderWrapperService.variables$
36
37
  .pipe(takeUntil(this.destroy$))
37
38
  .subscribe((variables) => {
38
39
  if (!variables)
39
40
  return;
40
- this.datePickerMap = new Map();
41
- // for (const [key, value] of Object.entries(variables) as [string, any][]) {
42
- // if (key.includes('lib-date-picker')) {
43
- // this.datePickerMap.set(key, value);
44
- // }
45
- // }
46
- for (const [key, value] of Object.entries(variables)) {
47
- if (value &&
48
- typeof value === 'object' &&
49
- 'date' in value) {
50
- this.datePickerMap.set(key, value);
51
- }
52
- }
53
41
  });
54
- // const today = new Date();
55
- // this.minDate = new Date(today);
56
- // this.minDate.setDate(today.getDate() - 30);
57
- // this.maxDate = new Date(today);
58
- // this.maxDate.setDate(today.getDate() + 30);
59
- // this.minDate = this.formatDate(new Date(this.today.setDate(new Date().getDate() - 30)));
60
- // this.maxDate = this.formatDate(new Date(this.today.setDate(new Date().getDate() + 31)));
61
- const today = new Date();
62
- const min = new Date();
63
- min.setDate(today.getDate() - 30);
64
- const max = new Date();
65
- max.setDate(today.getDate());
66
- this.minDate = this.formatDate(min);
67
- this.maxDate = this.formatDate(max);
68
- // this.getRangeValues();
69
42
  }
70
- // get dateControl() {
71
- // return this.datePickerForm.get('date');
72
- // }
73
43
  ngAfterViewInit() {
74
44
  const key = this.fxComponent?.fxData?.name;
75
45
  if (key) {
76
- const datePatch = this.datePickerMap.get(key);
77
- const finalDate = datePatch || this.formatDate(new Date());
78
- if (datePatch) {
79
- this.minDate = datePatch;
80
- }
81
- else {
82
- this.minDate = this.formatDate(new Date(this.today.setDate(new Date().getDate() - 30)));
83
- }
84
- // this.datePickerForm.patchValue({date:finalDate});
85
46
  }
86
47
  this.getContextBaseId();
87
48
  }
88
- getRangeValues() {
89
- this.http.get(this.setting('apiURL')).subscribe(response => {
90
- const today = new Date();
91
- const minOffset = response[this.setting('minDateKey')] || this.setting('minValidation');
92
- const maxOffset = response[this.setting('maxDateKey')] || this.setting('maxValidation');
93
- // this.minDate = new Date(today);
94
- // this.minDate.setDate(today.getDate() + minOffset);
95
- // this.maxDate = new Date(today);
96
- // this.maxDate.setDate(today.getDate() + maxOffset);
97
- this.minDate = this.formatDate(new Date(this.today.setDate(new Date().getDate() + minOffset)));
98
- this.maxDate = this.formatDate(new Date(this.today.setDate(new Date().getDate() + maxOffset)));
99
- });
100
- }
101
49
  formatDate(date) {
102
50
  return date.toISOString().split('T')[0];
103
51
  }
104
52
  settings() {
105
53
  return [
106
- new FxStringSetting({ key: 'minValidation', $title: 'Min Validation', value: '' }),
107
- new FxStringSetting({ key: 'maxValidation', $title: 'Max Validation', value: '' }),
108
- new FxStringSetting({ key: 'apiURL', $title: 'API Url', value: '' }),
109
- new FxStringSetting({ key: 'minDateKey', $title: 'Min Range API Key', value: '' }),
110
- new FxStringSetting({ key: 'maxDateKey', $title: 'Max Range API Key', value: '' }),
111
- new FxStringSetting({ key: 'placeHolder', $title: 'Placeholder', value: 'Select Date' }),
112
- new FxStringSetting({ key: 'label', $title: 'Label', value: '' }),
113
- new FxStringSetting({ key: 'datePickerErrorMessage', $title: 'Error Message', value: 'Please fill out the field' }),
54
+ new FxStringSetting({ key: 'summaryText', $title: 'Summary Text', value: '' }),
55
+ new FxStringSetting({ key: 'summaryLabel', $title: 'Label', value: '' }),
114
56
  ];
115
57
  }
116
58
  validations() {
117
- return [FxValidatorService.required];
59
+ return [];
118
60
  }
119
61
  updateTextArea() {
120
- // Get all the form control values
121
- console.log('Updating text area with dynamic values', this.fxComponent);
122
62
  const formValues = this.fxComponent?.fxData?.$formGroup?.value;
123
- // const formValues = {name: 'John', age: 30}; // Example values, replace with actual form control values
124
- // Replace placeholders in the text template with corresponding form control values
125
- console.log('Form Values:', formValues);
126
- this.dynamicText = this.replacePlaceholders(this.dynamicText, formValues);
127
- console.log('Replaced dynamic text:', this.dynamicText);
128
- this.summaryForm.patchValue({ summary: this.dynamicText });
63
+ const dynamicText = this.replacePlaceholders(this.dynamicText, formValues);
64
+ this.summaryForm.patchValue({ summary: dynamicText });
129
65
  this.cdr.detectChanges();
130
66
  }
131
- // // Method to replace placeholders in the string based on form control values
132
- // replacePlaceholders(template: string, values: any): string {
133
- // // Use a regular expression to find placeholders like {name}, {age}, etc.
134
- // return template.replace(/{(.*?)}/g, (match, placeholder) => {
135
- // // For each placeholder, look it up in the form control values
136
- // return values[placeholder] !== undefined ? values[placeholder] : match;
137
- // });
138
- // }
139
67
  replacePlaceholders(template, values) {
140
- // Log the values to debug
141
- console.log('Values:', values);
142
- // Use a regular expression to find placeholders like {name}, {age}, etc.
143
68
  return template.replace(/{(.*?)}/g, (match, placeholder) => {
144
- // Log each placeholder being processed
145
- console.log('Processing placeholder:', placeholder);
146
- // Check if the placeholder exists in values
147
69
  if (values[placeholder] !== undefined) {
148
- console.log(`Replacing {${placeholder}} with:`, values[placeholder]);
149
- return values[placeholder]; // Replace placeholder with its value
70
+ return values[placeholder];
150
71
  }
151
72
  else {
152
- console.log(`No value found for {${placeholder}}, keeping the placeholder.`);
153
- return match; // Keep placeholder if no value found
73
+ return match;
154
74
  }
155
75
  });
156
76
  }
157
77
  ngAfterViewChecked() {
158
- // After the view has been checked, update text area if needed
159
78
  this.updateTextArea();
160
- this.cdr.detectChanges(); // Manually trigger change detection
79
+ this.cdr.detectChanges();
161
80
  }
162
81
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SummaryComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.HttpClient }, { token: i2.FxBuilderWrapperService }], target: i0.ɵɵFactoryTarget.Component });
163
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SummaryComponent, isStandalone: true, selector: "lib-summary", viewQueries: [{ propertyName: "fxComponent", first: true, predicate: ["fxComponent"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<fx-component [fxData]=\"fxData\" #fxComponent>\r\n <div class=\"custom-date-picker relative\">\r\n <form [formGroup]=\"summaryForm\">\r\n\r\n <label for=\"date\" class=\"input-label\">{{ setting('label') }}<span class=\"field-required\">*</span></label>\r\n <div class=\"relative\">\r\n <textarea formControlName=\"summary\"></textarea>\r\n </div>\r\n <!-- <div>\r\n <small *ngIf=\"datePickerForm.get('date')?.touched && datePickerForm.get('date')?.errors?.['required']\"\r\n class=\"text-red-500\">\r\n {{ setting('datePickerErrorMessage') }}\r\n </small>\r\n </div> -->\r\n </form>\r\n </div>\r\n\r\n</fx-component>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: FxComponent, selector: "fx-component", inputs: ["fxData"] }] });
82
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SummaryComponent, isStandalone: true, selector: "lib-summary", viewQueries: [{ propertyName: "fxComponent", first: true, predicate: ["fxComponent"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<fx-component [fxData]=\"fxData\" #fxComponent>\r\n <div class=\"custom-date-picker relative\">\r\n <form [formGroup]=\"summaryForm\">\r\n\r\n <label class=\"summary-label\">{{ setting('summaryLabel') }}</label>\r\n <div class=\"relative\">\r\n <textarea formControlName=\"summary\" readonly class=\"w-full\"></textarea>\r\n </div>\r\n <!-- <div>\r\n <small *ngIf=\"datePickerForm.get('date')?.touched && datePickerForm.get('date')?.errors?.['required']\"\r\n class=\"text-red-500\">\r\n {{ setting('datePickerErrorMessage') }}\r\n </small>\r\n </div> -->\r\n </form>\r\n </div>\r\n\r\n</fx-component>", styles: [".summary-label{color:#4682b4;font-weight:600;margin-bottom:10px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: FxComponent, selector: "fx-component", inputs: ["fxData"] }] });
164
83
  }
165
84
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SummaryComponent, decorators: [{
166
85
  type: Component,
167
- args: [{ selector: 'lib-summary', standalone: true, imports: [CommonModule, ReactiveFormsModule, FormsModule, FxComponent], template: "<fx-component [fxData]=\"fxData\" #fxComponent>\r\n <div class=\"custom-date-picker relative\">\r\n <form [formGroup]=\"summaryForm\">\r\n\r\n <label for=\"date\" class=\"input-label\">{{ setting('label') }}<span class=\"field-required\">*</span></label>\r\n <div class=\"relative\">\r\n <textarea formControlName=\"summary\"></textarea>\r\n </div>\r\n <!-- <div>\r\n <small *ngIf=\"datePickerForm.get('date')?.touched && datePickerForm.get('date')?.errors?.['required']\"\r\n class=\"text-red-500\">\r\n {{ setting('datePickerErrorMessage') }}\r\n </small>\r\n </div> -->\r\n </form>\r\n </div>\r\n\r\n</fx-component>" }]
86
+ args: [{ selector: 'lib-summary', standalone: true, imports: [CommonModule, ReactiveFormsModule, FormsModule, FxComponent], template: "<fx-component [fxData]=\"fxData\" #fxComponent>\r\n <div class=\"custom-date-picker relative\">\r\n <form [formGroup]=\"summaryForm\">\r\n\r\n <label class=\"summary-label\">{{ setting('summaryLabel') }}</label>\r\n <div class=\"relative\">\r\n <textarea formControlName=\"summary\" readonly class=\"w-full\"></textarea>\r\n </div>\r\n <!-- <div>\r\n <small *ngIf=\"datePickerForm.get('date')?.touched && datePickerForm.get('date')?.errors?.['required']\"\r\n class=\"text-red-500\">\r\n {{ setting('datePickerErrorMessage') }}\r\n </small>\r\n </div> -->\r\n </form>\r\n </div>\r\n\r\n</fx-component>", styles: [".summary-label{color:#4682b4;font-weight:600;margin-bottom:10px}\n"] }]
168
87
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.HttpClient }, { type: i2.FxBuilderWrapperService }], propDecorators: { fxComponent: [{
169
88
  type: ViewChild,
170
89
  args: ['fxComponent']
171
90
  }] } });
172
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VtbWFyeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9meC1idWlsZGVyLXdyYXBwZXIvc3JjL2xpYi9jb21wb25lbnRzL3N1bW1hcnkvc3VtbWFyeS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9meC1idWlsZGVyLXdyYXBwZXIvc3JjL2xpYi9jb21wb25lbnRzL3N1bW1hcnkvc3VtbWFyeS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUF1QyxTQUFTLEVBQUUsTUFBTSxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBeUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RyxPQUFPLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBYSxlQUFlLEVBQWdCLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHakksT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7O0FBUzFDLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxlQUFlO0lBa0I5QjtJQUErQjtJQUF5QjtJQWpCckUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVuQyxPQUFPLENBQVU7SUFDakIsT0FBTyxDQUFVO0lBQ2QsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDTyxXQUFXLENBQWU7SUFDNUMsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7SUFDekMsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFlLENBQUM7SUFLaEMsV0FBVyxHQUFjLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQzNDLE9BQU8sRUFBRSxD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QUE0QztZQUM1QyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLFdBQVcsU0FBUyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUNyRSxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFFLHFDQUFxQztZQUNwRSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsV0FBVyw2QkFBNkIsQ0FBQyxDQUFDO2dCQUM3RSxPQUFPLEtBQUssQ0FBQyxDQUFFLHFDQUFxQztZQUN0RCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBR0Msa0JBQWtCO1FBQ2hCLDhEQUE4RDtRQUM5RCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFFLG9DQUFvQztJQUNqRSxDQUFDO3dHQW5NVSxnQkFBZ0I7NEZBQWhCLGdCQUFnQiwwTUNoQjdCLDRxQkFpQmUseURETEgsWUFBWSw4QkFBRSxtQkFBbUIsNDhCQUFFLFdBQVcsK0JBQUUsV0FBVzs7NEZBSTFELGdCQUFnQjtrQkFQNUIsU0FBUzsrQkFDRSxhQUFhLGNBQ1gsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUM7cUpBVTNDLFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEFmdGVyVmlld0NoZWNrZWQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIGluamVjdCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSwgRm9ybXNNb2R1bGUsIEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEZ4QmFzZUNvbXBvbmVudCwgRnhDb21wb25lbnQsIEZ4U2V0dGluZywgRnhTdHJpbmdTZXR0aW5nLCBGeFZhbGlkYXRpb24sIEZ4VmFsaWRhdG9yU2VydmljZSB9IGZyb20gJ0BpbnN0YW50c3lzLWxhYnMvZngnO1xyXG5pbXBvcnQgeyBDYWxlbmRhck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvY2FsZW5kYXInO1xyXG5pbXBvcnQgeyBGeEJ1aWxkZXJXcmFwcGVyU2VydmljZSB9IGZyb20gJy4uLy4uL2Z4LWJ1aWxkZXItd3JhcHBlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1zdW1tYXJ5JyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIEZvcm1zTW9kdWxlLCBGeENvbXBvbmVudF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3N1bW1hcnkuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9zdW1tYXJ5LmNvbXBvbmVudC5jc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTdW1tYXJ5Q29tcG9uZW50IGV4dGVuZHMgRnhCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdDaGVja2Vke1xyXG4gIHByaXZhdGUgZmIgPSBpbmplY3QoRm9ybUJ1aWxkZXIpO1xyXG5cclxubWluRGF0ZSE6IHN0cmluZztcclxubWF4RGF0ZSE6IHN0cmluZztcclxuICAgdG9kYXkgPSBuZXcgRGF0ZSgpO1xyXG4gICBAVmlld0NoaWxkKCdmeENvbXBvbmVudCcpIGZ4Q29tcG9uZW50ITogRnhDb21wb25lbnQ7XHJcbiAgIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDxCb29sZWFuPigpO1xyXG4gICAgZGF0ZVBpY2tlck1hcCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XHJcbiAgXHJcbiAgIFxyXG5cclxuXHJcbiAgICBwdWJsaWMgc3VtbWFyeUZvcm06IEZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgc3VtbWFyeTogWycnXSxcclxuICAgICB9KVxyXG5cclxuICAgICAgZHluYW1pY1RleHQ6IHN0cmluZyA9ICdNeSBuYW1lIGlzIHtuYW1lfSBhbmQgSSBhbSB7YWdlfSB5ZWFycyBvbGQnO1xyXG4gICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYscHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LHByaXZhdGUgZnhCdWlsZGVyV3JhcHBlclNlcnZpY2U6IEZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlKSB7XHJcbiAgICAgIHN1cGVyKGNkcilcclxuICAgICAgdGhpcy5vbkluaXQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLl9yZWdpc3Rlcih0aGlzLnN1bW1hcnlGb3JtKTtcclxuICAgICAgfSk7XHJcbiAgICAgXHJcbiAgICB9XHJcblxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuXHJcbiAgIHRoaXMuZnhCdWlsZGVyV3JhcHBlclNlcnZpY2UudmFyaWFibGVzJFxyXG4gIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAuc3Vic2NyaWJlKCh2YXJpYWJsZXM6IGFueSkgPT4ge1xyXG4gICAgaWYgKCF2YXJpYWJsZXMpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmRhdGVQaWNrZXJNYXAgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xyXG5cclxuICAgIC8vIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhcmlhYmxlcykgYXMgW3N0cmluZywgYW55XVtdKSB7XHJcbiAgICAvLyAgIGlmIChrZXkuaW5jbHVkZXMoJ2xpYi1kYXRlLXBpY2tlcicpKSB7XHJcbiAgICAvLyAgICAgdGhpcy5kYXRlUGlja2VyTWFwLnNldChrZXksIHZhbHVlKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhcmlhYmxlcykgYXMgW3N0cmluZywgYW55XVtdKSB7XHJcbiAgaWYgKFxyXG4gICAgdmFsdWUgJiZcclxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcclxuICAgICdkYXRlJyBpbiB2YWx1ZVxyXG4gICkge1xyXG4gICAgdGhpcy5kYXRlUGlja2VyTWFwLnNldChrZXksIHZhbHVlKTtcclxuICB9XHJcbn1cclxuICB9KTtcclxuXHJcblxyXG4gICAgLy8gY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xyXG4gICAgLy8gdGhpcy5taW5EYXRlID0gbmV3IERhdGUodG9kYXkpO1xyXG4gICAgLy8gdGhpcy5taW5EYXRlLnNldERhdGUodG9kYXkuZ2V0RGF0ZSgpIC0gMzApO1xyXG5cclxuICAgIC8vIHRoaXMubWF4RGF0ZSA9IG5ldyBEYXRlKHRvZGF5KTtcclxuICAgIC8vIHRoaXMubWF4RGF0ZS5zZXREYXRlKHRvZGF5LmdldERhdGUoKSArIDMwKTtcclxuXHJcbiAgLy8gdGhpcy5taW5EYXRlID0gdGhpcy5mb3JtYXREYXRlKG5ldyBEYXRlKHRoaXMudG9kYXkuc2V0RGF0ZShuZXcgRGF0ZSgpLmdldERhdGUoKSAtIDMwKSkpO1xyXG4gIC8vIHRoaXMubWF4RGF0ZSA9IHRoaXMuZm9ybWF0RGF0ZShuZXcgRGF0ZSh0aGlzLnRvZGF5LnNldERhdGUobmV3IERhdGUoKS5nZXREYXRlKCkgKyAzMSkpKTtcclxuXHJcbiAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xyXG5cclxuY29uc3QgbWluID0gbmV3IERhdGUoKTtcclxubWluLnNldERhdGUodG9kYXkuZ2V0RGF0ZSgpIC0gMzApO1xyXG5cclxuY29uc3QgbWF4ID0gbmV3IERhdGUoKTtcclxubWF4LnNldERhdGUodG9kYXkuZ2V0RGF0ZSgpKTtcclxuXHJcbnRoaXMubWluRGF0ZSA9IHRoaXMuZm9ybWF0RGF0ZShtaW4pO1xyXG50aGlzLm1heERhdGUgPSB0aGlzLmZvcm1hdERhdGUobWF4KTtcclxuXHJcbiAgICAvLyB0aGlzLmdldFJhbmdlVmFsdWVzKCk7XHJcblxyXG5cclxuICB9XHJcblxyXG4gIC8vIGdldCBkYXRlQ29udHJvbCgpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLmRhdGVQaWNrZXJGb3JtLmdldCgnZGF0ZScpO1xyXG4gIC8vIH1cclxuXHJcbiAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGtleSA9IHRoaXMuZnhDb21wb25lbnQ/LmZ4RGF0YT8ubmFtZTtcclxuICAgIGlmKGtleSl7XHJcbiAgICAgICAgY29uc3QgZGF0ZVBhdGNoID0gdGhpcy5kYXRlUGlja2VyTWFwLmdldChrZXkpXHJcbiAgICAgICAgY29uc3QgZmluYWxEYXRlID0gZGF0ZVBhdGNoIHx8IHRoaXMuZm9ybWF0RGF0ZShuZXcgRGF0ZSgpKVxyXG4gICAgICAgIGlmKGRhdGVQYXRjaCl7XHJcbiAgICAgICAgICAgIHRoaXMubWluRGF0ZSA9IGRhdGVQYXRjaFxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICB0aGlzLm1pbkRhdGUgPSB0aGlzLmZvcm1hdERhdGUobmV3IERhdGUodGhpcy50b2RheS5zZXREYXRlKG5ldyBEYXRlKCkuZ2V0RGF0ZSgpIC0gMzApKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG5cclxuICAgICAgLy8gdGhpcy5kYXRlUGlja2VyRm9ybS5wYXRjaFZhbHVlKHtkYXRlOmZpbmFsRGF0ZX0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5nZXRDb250ZXh0QmFzZUlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXRSYW5nZVZhbHVlcygpIHtcclxuICAgIHRoaXMuaHR0cC5nZXQ8YW55Pih0aGlzLnNldHRpbmcoJ2FwaVVSTCcpKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xyXG4gICAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XHJcbiAgXHJcbiAgICAgIGNvbnN0IG1pbk9mZnNldCA9IHJlc3BvbnNlW3RoaXMuc2V0dGluZygnbWluRGF0ZUtleScpXSB8fCB0aGlzLnNldHRpbmcoJ21pblZhbGlkYXRpb24nKTtcclxuICAgICAgY29uc3QgbWF4T2Zmc2V0ID0gcmVzcG9uc2VbdGhpcy5zZXR0aW5nKCdtYXhEYXRlS2V5JyldIHx8IHRoaXMuc2V0dGluZygnbWF4VmFsaWRhdGlvbicpO1xyXG4gIFxyXG4gICAgICAvLyB0aGlzLm1pbkRhdGUgPSBuZXcgRGF0ZSh0b2RheSk7XHJcbiAgICAgIC8vIHRoaXMubWluRGF0ZS5zZXREYXRlKHRvZGF5LmdldERhdGUoKSArIG1pbk9mZnNldCk7XHJcbiAgXHJcbiAgICAgIC8vIHRoaXMubWF4RGF0ZSA9IG5ldyBEYXRlKHRvZGF5KTtcclxuICAgICAgLy8gdGhpcy5tYXhEYXRlLnNldERhdGUodG9kYXkuZ2V0RGF0ZSgpICsgbWF4T2Zmc2V0KTtcclxuXHJcbiAgICB0aGlzLm1pbkRhdGUgPSB0aGlzLmZvcm1hdERhdGUobmV3IERhdGUodGhpcy50b2RheS5zZXREYXRlKG5ldyBEYXRlKCkuZ2V0RGF0ZSgpICsgbWluT2Zmc2V0KSkpO1xyXG4gIHRoaXMubWF4RGF0ZSA9IHRoaXMuZm9ybWF0RGF0ZShuZXcgRGF0ZSh0aGlzLnRvZGF5LnNldERhdGUobmV3IERhdGUoKS5nZXREYXRlKCkgKyBtYXhPZmZzZXQpKSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZm9ybWF0RGF0ZShkYXRlOiBEYXRlKTogc3RyaW5nIHtcclxuICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF07IFxyXG59XHJcbiAgXHJcblxyXG5cclxuICAgIHByb3RlY3RlZCBzZXR0aW5ncygpOiBGeFNldHRpbmdbXSB7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgIG5ldyBGeFN0cmluZ1NldHRpbmcoeyBrZXk6ICdtaW5WYWxpZGF0aW9uJywgJHRpdGxlOiAnTWluIFZhbGlkYXRpb24nLCB2YWx1ZTogJycgfSksXHJcbiAgICAgICAgICBuZXcgRnhTdHJpbmdTZXR0aW5nKHsga2V5OiAnbWF4VmFsaWRhdGlvbicsICR0aXRsZTogJ01heCBWYWxpZGF0aW9uJywgdmFsdWU6ICcnIH0pLFxyXG4gICAgICAgICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ2FwaVVSTCcsICR0aXRsZTogJ0FQSSBVcmwnLCB2YWx1ZTogJycgfSksXHJcbiAgICAgICAgICBuZXcgRnhTdHJpbmdTZXR0aW5nKHsga2V5OiAnbWluRGF0ZUtleScsICR0aXRsZTogJ01pbiBSYW5nZSBBUEkgS2V5JywgdmFsdWU6ICcnIH0pLFxyXG4gICAgICAgICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ21heERhdGVLZXknLCAkdGl0bGU6ICdNYXggUmFuZ2UgQVBJIEtleScsIHZhbHVlOiAnJyB9KSxcclxuICAgICAgICAgIG5ldyBGeFN0cmluZ1NldHRpbmcoeyBrZXk6ICdwbGFjZUhvbGRlcicsICR0aXRsZTogJ1BsYWNlaG9sZGVyJywgdmFsdWU6ICdTZWxlY3QgRGF0ZScgfSksXHJcbiAgICAgICAgICBuZXcgRnhTdHJpbmdTZXR0aW5nKHsga2V5OiAnbGFiZWwnLCAkdGl0bGU6ICdMYWJlbCcsIHZhbHVlOiAnJyB9KSxcclxuICAgICAgICAgIG5ldyBGeFN0cmluZ1NldHRpbmcoeyBrZXk6ICdkYXRlUGlja2VyRXJyb3JNZXNzYWdlJywgJHRpdGxlOiAnRXJyb3IgTWVzc2FnZScsIHZhbHVlOiAnUGxlYXNlIGZpbGwgb3V0IHRoZSBmaWVsZCcgfSksXHJcbiAgICAgICAgIFxyXG4gICAgICAgIF07XHJcbiAgICAgIH1cclxuICAgIFxyXG4gICAgICBwcm90ZWN0ZWQgdmFsaWRhdGlvbnMoKTogRnhWYWxpZGF0aW9uW10ge1xyXG4gICAgICAgIHJldHVybiBbRnhWYWxpZGF0b3JTZXJ2aWNlLnJlcXVpcmVkXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdXBkYXRlVGV4dEFyZWEoKTogdm9pZCB7XHJcbiAgICAvLyBHZXQgYWxsIHRoZSBmb3JtIGNvbnRyb2wgdmFsdWVzXHJcbiAgICBjb25zb2xlLmxvZygnVXBkYXRpbmcgdGV4dCBhcmVhIHdpdGggZHluYW1pYyB2YWx1ZXMnLHRoaXMuZnhDb21wb25lbnQpO1xyXG5cclxuICAgIGNvbnN0IGZvcm1WYWx1ZXMgPSB0aGlzLmZ4Q29tcG9uZW50Py5meERhdGE/LiRmb3JtR3JvdXA/LnZhbHVlO1xyXG5cclxuICAgIC8vIGNvbnN0IGZvcm1WYWx1ZXMgPSB7bmFtZTogJ0pvaG4nLCBhZ2U6IDMwfTsgLy8gRXhhbXBsZSB2YWx1ZXMsIHJlcGxhY2Ugd2l0aCBhY3R1YWwgZm9ybSBjb250cm9sIHZhbHVlc1xyXG4gICAgXHJcbiAgICAvLyBSZXBsYWNlIHBsYWNlaG9sZGVycyBpbiB0aGUgdGV4dCB0ZW1wbGF0ZSB3aXRoIGNvcnJlc3BvbmRpbmcgZm9ybSBjb250cm9sIHZhbHVlc1xyXG4gICAgY29uc29sZS5sb2coJ0Zvcm0gVmFsdWVzOicsIGZvcm1WYWx1ZXMpO1xyXG4gICAgdGhpcy5keW5hbWljVGV4dCA9IHRoaXMucmVwbGFjZVBsYWNlaG9sZGVycyh0aGlzLmR5bmFtaWNUZXh0LCBmb3JtVmFsdWVzKTtcclxuICAgIGNvbnNvbGUubG9nKCdSZXBsYWNlZCBkeW5hbWljIHRleHQ6JywgdGhpcy5keW5hbWljVGV4dCk7XHJcbiAgICB0aGlzLnN1bW1hcnlGb3JtLnBhdGNoVmFsdWUoeyBzdW1tYXJ5OiB0aGlzLmR5bmFtaWNUZXh0IH0pO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgLy8gLy8gTWV0aG9kIHRvIHJlcGxhY2UgcGxhY2Vob2xkZXJzIGluIHRoZSBzdHJpbmcgYmFzZWQgb24gZm9ybSBjb250cm9sIHZhbHVlc1xyXG4gIC8vIHJlcGxhY2VQbGFjZWhvbGRlcnModGVtcGxhdGU6IHN0cmluZywgdmFsdWVzOiBhbnkpOiBzdHJpbmcge1xyXG4gIC8vICAgLy8gVXNlIGEgcmVndWxhciBleHByZXNzaW9uIHRvIGZpbmQgcGxhY2Vob2xkZXJzIGxpa2Uge25hbWV9LCB7YWdlfSwgZXRjLlxyXG4gIC8vICAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoL3soLio/KX0vZywgKG1hdGNoLCBwbGFjZWhvbGRlcikgPT4ge1xyXG4gIC8vICAgICAvLyBGb3IgZWFjaCBwbGFjZWhvbGRlciwgbG9vayBpdCB1cCBpbiB0aGUgZm9ybSBjb250cm9sIHZhbHVlc1xyXG4gIC8vICAgICByZXR1cm4gdmFsdWVzW3BsYWNlaG9sZGVyXSAhPT0gdW5kZWZpbmVkID8gdmFsdWVzW3BsYWNlaG9sZGVyXSA6IG1hdGNoO1xyXG4gIC8vICAgfSk7XHJcbiAgLy8gfVxyXG5cclxuXHJcbiAgcmVwbGFjZVBsYWNlaG9sZGVycyh0ZW1wbGF0ZTogc3RyaW5nLCB2YWx1ZXM6IGFueSk6IHN0cmluZyB7XHJcbiAgLy8gTG9nIHRoZSB2YWx1ZXMgdG8gZGVidWdcclxuICBjb25zb2xlLmxvZygnVmFsdWVzOicsIHZhbHVlcyk7XHJcbiAgXHJcbiAgLy8gVXNlIGEgcmVndWxhciBleHByZXNzaW9uIHRvIGZpbmQgcGxhY2Vob2xkZXJzIGxpa2Uge25hbWV9LCB7YWdlfSwgZXRjLlxyXG4gIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKC97KC4qPyl9L2csIChtYXRjaCwgcGxhY2Vob2xkZXIpID0+IHtcclxuICAgIC8vIExvZyBlYWNoIHBsYWNlaG9sZGVyIGJlaW5nIHByb2Nlc3NlZFxyXG4gICAgY29uc29sZS5sb2coJ1Byb2Nlc3NpbmcgcGxhY2Vob2xkZXI6JywgcGxhY2Vob2xkZXIpO1xyXG4gICAgXHJcbiAgICAvLyBDaGVjayBpZiB0aGUgcGxhY2Vob2xkZXIgZXhpc3RzIGluIHZhbHVlc1xyXG4gICAgaWYgKHZhbHVlc1twbGFjZWhvbGRlcl0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBjb25zb2xlLmxvZyhgUmVwbGFjaW5nIHske3BsYWNlaG9sZGVyfX0gd2l0aDpgLCB2YWx1ZXNbcGxhY2Vob2xkZXJdKTtcclxuICAgICAgcmV0dXJuIHZhbHVlc1twbGFjZWhvbGRlcl07ICAvLyBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggaXRzIHZhbHVlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmxvZyhgTm8gdmFsdWUgZm91bmQgZm9yIHske3BsYWNlaG9sZGVyfX0sIGtlZXBpbmcgdGhlIHBsYWNlaG9sZGVyLmApO1xyXG4gICAgICByZXR1cm4gbWF0Y2g7ICAvLyBLZWVwIHBsYWNlaG9sZGVyIGlmIG5vIHZhbHVlIGZvdW5kXHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcblxyXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcclxuICAgIC8vIEFmdGVyIHRoZSB2aWV3IGhhcyBiZWVuIGNoZWNrZWQsIHVwZGF0ZSB0ZXh0IGFyZWEgaWYgbmVlZGVkXHJcbiAgICB0aGlzLnVwZGF0ZVRleHRBcmVhKCk7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7ICAvLyBNYW51YWxseSB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb25cclxuICB9XHJcbn1cclxuIiwiPGZ4LWNvbXBvbmVudCBbZnhEYXRhXT1cImZ4RGF0YVwiICNmeENvbXBvbmVudD5cclxuICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWRhdGUtcGlja2VyIHJlbGF0aXZlXCI+XHJcbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cInN1bW1hcnlGb3JtXCI+XHJcblxyXG4gICAgICAgIDxsYWJlbCBmb3I9XCJkYXRlXCIgY2xhc3M9XCJpbnB1dC1sYWJlbFwiPnt7IHNldHRpbmcoJ2xhYmVsJykgfX08c3BhbiBjbGFzcz1cImZpZWxkLXJlcXVpcmVkXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZVwiPlxyXG4gICAgICAgIDx0ZXh0YXJlYSBmb3JtQ29udHJvbE5hbWU9XCJzdW1tYXJ5XCI+PC90ZXh0YXJlYT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwhLS0gPGRpdj5cclxuICAgICAgPHNtYWxsICpuZ0lmPVwiZGF0ZVBpY2tlckZvcm0uZ2V0KCdkYXRlJyk/LnRvdWNoZWQgJiYgZGF0ZVBpY2tlckZvcm0uZ2V0KCdkYXRlJyk/LmVycm9ycz8uWydyZXF1aXJlZCddXCJcclxuICAgICAgICBjbGFzcz1cInRleHQtcmVkLTUwMFwiPlxyXG4gICAgICB7eyBzZXR0aW5nKCdkYXRlUGlja2VyRXJyb3JNZXNzYWdlJykgfX1cclxuICAgICAgPC9zbWFsbD5cclxuICAgIDwvZGl2PiAtLT5cclxuICAgIDwvZm9ybT5cclxuICA8L2Rpdj5cclxuXHJcbjwvZngtY29tcG9uZW50PiJdfQ==
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VtbWFyeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9meC1idWlsZGVyLXdyYXBwZXIvc3JjL2xpYi9jb21wb25lbnRzL3N1bW1hcnkvc3VtbWFyeS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9meC1idWlsZGVyLXdyYXBwZXIvc3JjL2xpYi9jb21wb25lbnRzL3N1bW1hcnkvc3VtbWFyeS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUF1QyxTQUFTLEVBQUUsTUFBTSxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBeUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RyxPQUFPLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBYSxlQUFlLEVBQW9DLE1BQU0scUJBQXFCLENBQUM7QUFHakksT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7O0FBUzFDLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxlQUFlO0lBa0I5QjtJQUErQjtJQUF5QjtJQWpCckUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVuQyxPQUFPLENBQVU7SUFDakIsT0FBTyxDQUFVO0lBQ2QsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDTyxXQUFXLENBQWU7SUFDNUMsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7SUFDMUMsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFlLENBQUM7SUFLL0IsV0FBVyxHQUFjLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQzNDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FB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LDJIRExILFlBQVksOEJBQUUsbUJBQW1CLDQ4QkFBRSxXQUFXLCtCQUFFLFdBQVc7OzRGQUkxRCxnQkFBZ0I7a0JBUDVCLFNBQVM7K0JBQ0UsYUFBYSxjQUNYLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDO3FKQVUzQyxXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBBZnRlclZpZXdDaGVja2VkLCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBpbmplY3QsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJlYWN0aXZlRm9ybXNNb2R1bGUsIEZvcm1zTW9kdWxlLCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBGeEJhc2VDb21wb25lbnQsIEZ4Q29tcG9uZW50LCBGeFNldHRpbmcsIEZ4U3RyaW5nU2V0dGluZywgRnhWYWxpZGF0aW9uLCBGeFZhbGlkYXRvclNlcnZpY2UgfSBmcm9tICdAaW5zdGFudHN5cy1sYWJzL2Z4JztcclxuaW1wb3J0IHsgQ2FsZW5kYXJNb2R1bGUgfSBmcm9tICdwcmltZW5nL2NhbGVuZGFyJztcclxuaW1wb3J0IHsgRnhCdWlsZGVyV3JhcHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9meC1idWlsZGVyLXdyYXBwZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItc3VtbWFyeScsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBGb3Jtc01vZHVsZSwgRnhDb21wb25lbnRdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zdW1tYXJ5LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vc3VtbWFyeS5jb21wb25lbnQuY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU3VtbWFyeUNvbXBvbmVudCBleHRlbmRzIEZ4QmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZHtcclxuICBwcml2YXRlIGZiID0gaW5qZWN0KEZvcm1CdWlsZGVyKTtcclxuXHJcbm1pbkRhdGUhOiBzdHJpbmc7XHJcbm1heERhdGUhOiBzdHJpbmc7XHJcbiAgIHRvZGF5ID0gbmV3IERhdGUoKTtcclxuICAgQFZpZXdDaGlsZCgnZnhDb21wb25lbnQnKSBmeENvbXBvbmVudCE6IEZ4Q29tcG9uZW50O1xyXG4gICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8Qm9vbGVhbj4oKTtcclxuICAgZGF0ZVBpY2tlck1hcCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XHJcbiAgXHJcbiAgIFxyXG5cclxuXHJcbiAgICBwdWJsaWMgc3VtbWFyeUZvcm06IEZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgc3VtbWFyeTogWycnXSxcclxuICAgICB9KVxyXG5cclxuICAgICAgZHluYW1pY1RleHQ6IHN0cmluZyA9ICcnO1xyXG4gICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYscHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LHByaXZhdGUgZnhCdWlsZGVyV3JhcHBlclNlcnZpY2U6IEZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlKSB7XHJcbiAgICAgIHN1cGVyKGNkcilcclxuICAgICAgdGhpcy5vbkluaXQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLl9yZWdpc3Rlcih0aGlzLnN1bW1hcnlGb3JtKTtcclxuICAgICAgfSk7XHJcbiAgICAgXHJcbiAgICB9XHJcblxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZHluYW1pY1RleHQgPSB0aGlzLnNldHRpbmcoJ3N1bW1hcnlUZXh0JykgfHwgJyc7XHJcbiAgIHRoaXMuZnhCdWlsZGVyV3JhcHBlclNlcnZpY2UudmFyaWFibGVzJFxyXG4gIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAuc3Vic2NyaWJlKCh2YXJpYWJsZXM6IGFueSkgPT4ge1xyXG4gICAgaWYgKCF2YXJpYWJsZXMpIHJldHVybjtcclxuICB9KTtcclxuICB9XHJcblxyXG4gICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBrZXkgPSB0aGlzLmZ4Q29tcG9uZW50Py5meERhdGE/Lm5hbWU7XHJcbiAgICBpZihrZXkpe1xyXG4gICAgfVxyXG4gICAgdGhpcy5nZXRDb250ZXh0QmFzZUlkKCk7XHJcbiAgfVxyXG5cclxuICBcclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXREYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xyXG4gIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXTsgXHJcbn1cclxuICBcclxuXHJcblxyXG4gICAgcHJvdGVjdGVkIHNldHRpbmdzKCk6IEZ4U2V0dGluZ1tdIHtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ3N1bW1hcnlUZXh0JywgJHRpdGxlOiAnU3VtbWFyeSBUZXh0JywgdmFsdWU6ICcnIH0pLFxyXG4gICAgICAgICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ3N1bW1hcnlMYWJlbCcsICR0aXRsZTogJ0xhYmVsJywgdmFsdWU6ICcnIH0pLFxyXG4gICAgICAgIF07XHJcbiAgICAgIH1cclxuICAgIFxyXG4gICAgICBwcm90ZWN0ZWQgdmFsaWRhdGlvbnMoKTogRnhWYWxpZGF0aW9uW10ge1xyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgICAgfVxyXG5cclxuICAgIHVwZGF0ZVRleHRBcmVhKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZm9ybVZhbHVlcyA9IHRoaXMuZnhDb21wb25lbnQ/LmZ4RGF0YT8uJGZvcm1Hcm91cD8udmFsdWU7XHJcbiAgICBjb25zdCBkeW5hbWljVGV4dCA9IHRoaXMucmVwbGFjZVBsYWNlaG9sZGVycyh0aGlzLmR5bmFtaWNUZXh0LCBmb3JtVmFsdWVzKTtcclxuICAgIHRoaXMuc3VtbWFyeUZvcm0ucGF0Y2hWYWx1ZSh7IHN1bW1hcnk6IGR5bmFtaWNUZXh0IH0pO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcmVwbGFjZVBsYWNlaG9sZGVycyh0ZW1wbGF0ZTogc3RyaW5nLCB2YWx1ZXM6IGFueSk6IHN0cmluZyB7XHJcbiAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoL3soLio/KX0vZywgKG1hdGNoLCBwbGFjZWhvbGRlcikgPT4ge1xyXG4gICAgaWYgKHZhbHVlc1twbGFjZWhvbGRlcl0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gdmFsdWVzW3BsYWNlaG9sZGVyXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBtYXRjaDtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuXHJcbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVUZXh0QXJlYSgpO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxufVxyXG4iLCI8ZngtY29tcG9uZW50IFtmeERhdGFdPVwiZnhEYXRhXCIgI2Z4Q29tcG9uZW50PlxyXG4gIDxkaXYgY2xhc3M9XCJjdXN0b20tZGF0ZS1waWNrZXIgcmVsYXRpdmVcIj5cclxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwic3VtbWFyeUZvcm1cIj5cclxuXHJcbiAgICAgICAgPGxhYmVsIGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPnt7IHNldHRpbmcoJ3N1bW1hcnlMYWJlbCcpIH19PC9sYWJlbD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmVcIj5cclxuICAgICAgICA8dGV4dGFyZWEgZm9ybUNvbnRyb2xOYW1lPVwic3VtbWFyeVwiIHJlYWRvbmx5IGNsYXNzPVwidy1mdWxsXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwhLS0gPGRpdj5cclxuICAgICAgPHNtYWxsICpuZ0lmPVwiZGF0ZVBpY2tlckZvcm0uZ2V0KCdkYXRlJyk/LnRvdWNoZWQgJiYgZGF0ZVBpY2tlckZvcm0uZ2V0KCdkYXRlJyk/LmVycm9ycz8uWydyZXF1aXJlZCddXCJcclxuICAgICAgICBjbGFzcz1cInRleHQtcmVkLTUwMFwiPlxyXG4gICAgICB7eyBzZXR0aW5nKCdkYXRlUGlja2VyRXJyb3JNZXNzYWdlJykgfX1cclxuICAgICAgPC9zbWFsbD5cclxuICAgIDwvZGl2PiAtLT5cclxuICAgIDwvZm9ybT5cclxuICA8L2Rpdj5cclxuXHJcbjwvZngtY29tcG9uZW50PiJdfQ==