fx-form-builder-wrapper 2.0.99 → 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
63
  const dynamicText = this.replacePlaceholders(this.dynamicText, formValues);
127
- console.log('Replaced dynamic text:', dynamicText);
128
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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LFdBQVcsQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsV0FBVyxTQUFTLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JFLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUUscUNBQXFDO1lBQ3BFLENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixXQUFXLDZCQUE2QixDQUFDLENBQUM7Z0JBQzdFLE9BQU8sS0FBSyxDQUFDLENBQUUscUNBQXFDO1lBQ3RELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFHQyxrQkFBa0I7UUFDaEIsOERBQThEO1FBQzlELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUUsb0NBQW9DO0lBQ2pFLENBQUM7d0dBbk1VLGdCQUFnQjs0RkFBaEIsZ0JBQWdCLDBNQ2hCN0IsNHFCQWlCZSx5RERMSCxZQUFZLDhCQUFFLG1CQUFtQiw0OEJBQUUsV0FBVywrQkFBRSxXQUFXOzs0RkFJMUQsZ0JBQWdCO2tCQVA1QixTQUFTOytCQUNFLGFBQWEsY0FDWCxJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQztxSkFVM0MsV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3Q2hlY2tlZCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgaW5qZWN0LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBGb3Jtc01vZHVsZSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRnhCYXNlQ29tcG9uZW50LCBGeENvbXBvbmVudCwgRnhTZXR0aW5nLCBGeFN0cmluZ1NldHRpbmcsIEZ4VmFsaWRhdGlvbiwgRnhWYWxpZGF0b3JTZXJ2aWNlIH0gZnJvbSAnQGluc3RhbnRzeXMtbGFicy9meCc7XHJcbmltcG9ydCB7IENhbGVuZGFyTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9jYWxlbmRhcic7XHJcbmltcG9ydCB7IEZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZngtYnVpbGRlci13cmFwcGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXN1bW1hcnknLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgRm9ybXNNb2R1bGUsIEZ4Q29tcG9uZW50XSxcclxuICB0ZW1wbGF0ZVVybDogJy4vc3VtbWFyeS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3N1bW1hcnkuY29tcG9uZW50LmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFN1bW1hcnlDb21wb25lbnQgZXh0ZW5kcyBGeEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0NoZWNrZWR7XHJcbiAgcHJpdmF0ZSBmYiA9IGluamVjdChGb3JtQnVpbGRlcik7XHJcblxyXG5taW5EYXRlITogc3RyaW5nO1xyXG5tYXhEYXRlITogc3RyaW5nO1xyXG4gICB0b2RheSA9IG5ldyBEYXRlKCk7XHJcbiAgIEBWaWV3Q2hpbGQoJ2Z4Q29tcG9uZW50JykgZnhDb21wb25lbnQhOiBGeENvbXBvbmVudDtcclxuICAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PEJvb2xlYW4+KCk7XHJcbiAgICBkYXRlUGlja2VyTWFwID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcclxuICBcclxuICAgXHJcblxyXG5cclxuICAgIHB1YmxpYyBzdW1tYXJ5Rm9ybTogRm9ybUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICBzdW1tYXJ5OiBbJyddLFxyXG4gICAgIH0pXHJcblxyXG4gICAgICBkeW5hbWljVGV4dDogc3RyaW5nID0gJ015IG5hbWUgaXMge25hbWV9IGFuZCBJIGFtIHthZ2V9IHllYXJzIG9sZCc7XHJcbiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQscHJpdmF0ZSBmeEJ1aWxkZXJXcmFwcGVyU2VydmljZTogRnhCdWlsZGVyV3JhcHBlclNlcnZpY2UpIHtcclxuICAgICAgc3VwZXIoY2RyKVxyXG4gICAgICB0aGlzLm9uSW5pdC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuX3JlZ2lzdGVyKHRoaXMuc3VtbWFyeUZvcm0pO1xyXG4gICAgICB9KTtcclxuICAgICBcclxuICAgIH1cclxuXHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG5cclxuICAgdGhpcy5meEJ1aWxkZXJXcmFwcGVyU2VydmljZS52YXJpYWJsZXMkXHJcbiAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gIC5zdWJzY3JpYmUoKHZhcmlhYmxlczogYW55KSA9PiB7XHJcbiAgICBpZiAoIXZhcmlhYmxlcykgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuZGF0ZVBpY2tlck1hcCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XHJcblxyXG4gICAgLy8gZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFyaWFibGVzKSBhcyBbc3RyaW5nLCBhbnldW10pIHtcclxuICAgIC8vICAgaWYgKGtleS5pbmNsdWRlcygnbGliLWRhdGUtcGlja2VyJykpIHtcclxuICAgIC8vICAgICB0aGlzLmRhdGVQaWNrZXJNYXAuc2V0KGtleSwgdmFsdWUpO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFyaWFibGVzKSBhcyBbc3RyaW5nLCBhbnldW10pIHtcclxuICBpZiAoXHJcbiAgICB2YWx1ZSAmJlxyXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxyXG4gICAgJ2RhdGUnIGluIHZhbHVlXHJcbiAgKSB7XHJcbiAgICB0aGlzLmRhdGVQaWNrZXJNYXAuc2V0KGtleSwgdmFsdWUpO1xyXG4gIH1cclxufVxyXG4gIH0pO1xyXG5cclxuXHJcbiAgICAvLyBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XHJcbiAgICAvLyB0aGlzLm1pbkRhdGUgPSBuZXcgRGF0ZSh0b2RheSk7XHJcbiAgICAvLyB0aGlzLm1pbkRhdGUuc2V0RGF0ZSh0b2RheS5nZXREYXRlKCkgLSAzMCk7XHJcblxyXG4gICAgLy8gdGhpcy5tYXhEYXRlID0gbmV3IERhdGUodG9kYXkpO1xyXG4gICAgLy8gdGhpcy5tYXhEYXRlLnNldERhdGUodG9kYXkuZ2V0RGF0ZSgpICsgMzApO1xyXG5cclxuICAvLyB0aGlzLm1pbkRhdGUgPSB0aGlzLmZvcm1hdERhdGUobmV3IERhdGUodGhpcy50b2RheS5zZXREYXRlKG5ldyBEYXRlKCkuZ2V0RGF0ZSgpIC0gMzApKSk7XHJcbiAgLy8gdGhpcy5tYXhEYXRlID0gdGhpcy5mb3JtYXREYXRlKG5ldyBEYXRlKHRoaXMudG9kYXkuc2V0RGF0ZShuZXcgRGF0ZSgpLmdldERhdGUoKSArIDMxKSkpO1xyXG5cclxuICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XHJcblxyXG5jb25zdCBtaW4gPSBuZXcgRGF0ZSgpO1xyXG5taW4uc2V0RGF0ZSh0b2RheS5nZXREYXRlKCkgLSAzMCk7XHJcblxyXG5jb25zdCBtYXggPSBuZXcgRGF0ZSgpO1xyXG5tYXguc2V0RGF0ZSh0b2RheS5nZXREYXRlKCkpO1xyXG5cclxudGhpcy5taW5EYXRlID0gdGhpcy5mb3JtYXREYXRlKG1pbik7XHJcbnRoaXMubWF4RGF0ZSA9IHRoaXMuZm9ybWF0RGF0ZShtYXgpO1xyXG5cclxuICAgIC8vIHRoaXMuZ2V0UmFuZ2VWYWx1ZXMoKTtcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgLy8gZ2V0IGRhdGVDb250cm9sKCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMuZGF0ZVBpY2tlckZvcm0uZ2V0KCdkYXRlJyk7XHJcbiAgLy8gfVxyXG5cclxuICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5meENvbXBvbmVudD8uZnhEYXRhPy5uYW1lO1xyXG4gICAgaWYoa2V5KXtcclxuICAgICAgICBjb25zdCBkYXRlUGF0Y2ggPSB0aGlzLmRhdGVQaWNrZXJNYXAuZ2V0KGtleSlcclxuICAgICAgICBjb25zdCBmaW5hbERhdGUgPSBkYXRlUGF0Y2ggfHwgdGhpcy5mb3JtYXREYXRlKG5ldyBEYXRlKCkpXHJcbiAgICAgICAgaWYoZGF0ZVBhdGNoKXtcclxuICAgICAgICAgICAgdGhpcy5taW5EYXRlID0gZGF0ZVBhdGNoXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgIHRoaXMubWluRGF0ZSA9IHRoaXMuZm9ybWF0RGF0ZShuZXcgRGF0ZSh0aGlzLnRvZGF5LnNldERhdGUobmV3IERhdGUoKS5nZXREYXRlKCkgLSAzMCkpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcblxyXG4gICAgICAvLyB0aGlzLmRhdGVQaWNrZXJGb3JtLnBhdGNoVmFsdWUoe2RhdGU6ZmluYWxEYXRlfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmdldENvbnRleHRCYXNlSWQoKTtcclxuICB9XHJcblxyXG4gIGdldFJhbmdlVmFsdWVzKCkge1xyXG4gICAgdGhpcy5odHRwLmdldDxhbnk+KHRoaXMuc2V0dGluZygnYXBpVVJMJykpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XHJcbiAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcclxuICBcclxuICAgICAgY29uc3QgbWluT2Zmc2V0ID0gcmVzcG9uc2VbdGhpcy5zZXR0aW5nKCdtaW5EYXRlS2V5JyldIHx8IHRoaXMuc2V0dGluZygnbWluVmFsaWRhdGlvbicpO1xyXG4gICAgICBjb25zdCBtYXhPZmZzZXQgPSByZXNwb25zZVt0aGlzLnNldHRpbmcoJ21heERhdGVLZXknKV0gfHwgdGhpcy5zZXR0aW5nKCdtYXhWYWxpZGF0aW9uJyk7XHJcbiAgXHJcbiAgICAgIC8vIHRoaXMubWluRGF0ZSA9IG5ldyBEYXRlKHRvZGF5KTtcclxuICAgICAgLy8gdGhpcy5taW5EYXRlLnNldERhdGUodG9kYXkuZ2V0RGF0ZSgpICsgbWluT2Zmc2V0KTtcclxuICBcclxuICAgICAgLy8gdGhpcy5tYXhEYXRlID0gbmV3IERhdGUodG9kYXkpO1xyXG4gICAgICAvLyB0aGlzLm1heERhdGUuc2V0RGF0ZSh0b2RheS5nZXREYXRlKCkgKyBtYXhPZmZzZXQpO1xyXG5cclxuICAgIHRoaXMubWluRGF0ZSA9IHRoaXMuZm9ybWF0RGF0ZShuZXcgRGF0ZSh0aGlzLnRvZGF5LnNldERhdGUobmV3IERhdGUoKS5nZXREYXRlKCkgKyBtaW5PZmZzZXQpKSk7XHJcbiAgdGhpcy5tYXhEYXRlID0gdGhpcy5mb3JtYXREYXRlKG5ldyBEYXRlKHRoaXMudG9kYXkuc2V0RGF0ZShuZXcgRGF0ZSgpLmdldERhdGUoKSArIG1heE9mZnNldCkpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXREYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xyXG4gIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXTsgXHJcbn1cclxuICBcclxuXHJcblxyXG4gICAgcHJvdGVjdGVkIHNldHRpbmdzKCk6IEZ4U2V0dGluZ1tdIHtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ21pblZhbGlkYXRpb24nLCAkdGl0bGU6ICdNaW4gVmFsaWRhdGlvbicsIHZhbHVlOiAnJyB9KSxcclxuICAgICAgICAgIG5ldyBGeFN0cmluZ1NldHRpbmcoeyBrZXk6ICdtYXhWYWxpZGF0aW9uJywgJHRpdGxlOiAnTWF4IFZhbGlkYXRpb24nLCB2YWx1ZTogJycgfSksXHJcbiAgICAgICAgICBuZXcgRnhTdHJpbmdTZXR0aW5nKHsga2V5OiAnYXBpVVJMJywgJHRpdGxlOiAnQVBJIFVybCcsIHZhbHVlOiAnJyB9KSxcclxuICAgICAgICAgIG5ldyBGeFN0cmluZ1NldHRpbmcoeyBrZXk6ICdtaW5EYXRlS2V5JywgJHRpdGxlOiAnTWluIFJhbmdlIEFQSSBLZXknLCB2YWx1ZTogJycgfSksXHJcbiAgICAgICAgICBuZXcgRnhTdHJpbmdTZXR0aW5nKHsga2V5OiAnbWF4RGF0ZUtleScsICR0aXRsZTogJ01heCBSYW5nZSBBUEkgS2V5JywgdmFsdWU6ICcnIH0pLFxyXG4gICAgICAgICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ3BsYWNlSG9sZGVyJywgJHRpdGxlOiAnUGxhY2Vob2xkZXInLCB2YWx1ZTogJ1NlbGVjdCBEYXRlJyB9KSxcclxuICAgICAgICAgIG5ldyBGeFN0cmluZ1NldHRpbmcoeyBrZXk6ICdsYWJlbCcsICR0aXRsZTogJ0xhYmVsJywgdmFsdWU6ICcnIH0pLFxyXG4gICAgICAgICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ2RhdGVQaWNrZXJFcnJvck1lc3NhZ2UnLCAkdGl0bGU6ICdFcnJvciBNZXNzYWdlJywgdmFsdWU6ICdQbGVhc2UgZmlsbCBvdXQgdGhlIGZpZWxkJyB9KSxcclxuICAgICAgICAgXHJcbiAgICAgICAgXTtcclxuICAgICAgfVxyXG4gICAgXHJcbiAgICAgIHByb3RlY3RlZCB2YWxpZGF0aW9ucygpOiBGeFZhbGlkYXRpb25bXSB7XHJcbiAgICAgICAgcmV0dXJuIFtGeFZhbGlkYXRvclNlcnZpY2UucmVxdWlyZWRdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB1cGRhdGVUZXh0QXJlYSgpOiB2b2lkIHtcclxuICAgIC8vIEdldCBhbGwgdGhlIGZvcm0gY29udHJvbCB2YWx1ZXNcclxuICAgIGNvbnNvbGUubG9nKCdVcGRhdGluZyB0ZXh0IGFyZWEgd2l0aCBkeW5hbWljIHZhbHVlcycsdGhpcy5meENvbXBvbmVudCk7XHJcblxyXG4gICAgY29uc3QgZm9ybVZhbHVlcyA9IHRoaXMuZnhDb21wb25lbnQ/LmZ4RGF0YT8uJGZvcm1Hcm91cD8udmFsdWU7XHJcblxyXG4gICAgLy8gY29uc3QgZm9ybVZhbHVlcyA9IHtuYW1lOiAnSm9obicsIGFnZTogMzB9OyAvLyBFeGFtcGxlIHZhbHVlcywgcmVwbGFjZSB3aXRoIGFjdHVhbCBmb3JtIGNvbnRyb2wgdmFsdWVzXHJcbiAgICBcclxuICAgIC8vIFJlcGxhY2UgcGxhY2Vob2xkZXJzIGluIHRoZSB0ZXh0IHRlbXBsYXRlIHdpdGggY29ycmVzcG9uZGluZyBmb3JtIGNvbnRyb2wgdmFsdWVzXHJcbiAgICBjb25zb2xlLmxvZygnRm9ybSBWYWx1ZXM6JywgZm9ybVZhbHVlcyk7XHJcbiAgICBjb25zdCBkeW5hbWljVGV4dCA9IHRoaXMucmVwbGFjZVBsYWNlaG9sZGVycyh0aGlzLmR5bmFtaWNUZXh0LCBmb3JtVmFsdWVzKTtcclxuICAgIGNvbnNvbGUubG9nKCdSZXBsYWNlZCBkeW5hbWljIHRleHQ6JywgZHluYW1pY1RleHQpO1xyXG4gICAgdGhpcy5zdW1tYXJ5Rm9ybS5wYXRjaFZhbHVlKHsgc3VtbWFyeTogZHluYW1pY1RleHQgfSk7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvLyAvLyBNZXRob2QgdG8gcmVwbGFjZSBwbGFjZWhvbGRlcnMgaW4gdGhlIHN0cmluZyBiYXNlZCBvbiBmb3JtIGNvbnRyb2wgdmFsdWVzXHJcbiAgLy8gcmVwbGFjZVBsYWNlaG9sZGVycyh0ZW1wbGF0ZTogc3RyaW5nLCB2YWx1ZXM6IGFueSk6IHN0cmluZyB7XHJcbiAgLy8gICAvLyBVc2UgYSByZWd1bGFyIGV4cHJlc3Npb24gdG8gZmluZCBwbGFjZWhvbGRlcnMgbGlrZSB7bmFtZX0sIHthZ2V9LCBldGMuXHJcbiAgLy8gICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgveyguKj8pfS9nLCAobWF0Y2gsIHBsYWNlaG9sZGVyKSA9PiB7XHJcbiAgLy8gICAgIC8vIEZvciBlYWNoIHBsYWNlaG9sZGVyLCBsb29rIGl0IHVwIGluIHRoZSBmb3JtIGNvbnRyb2wgdmFsdWVzXHJcbiAgLy8gICAgIHJldHVybiB2YWx1ZXNbcGxhY2Vob2xkZXJdICE9PSB1bmRlZmluZWQgPyB2YWx1ZXNbcGxhY2Vob2xkZXJdIDogbWF0Y2g7XHJcbiAgLy8gICB9KTtcclxuICAvLyB9XHJcblxyXG5cclxuICByZXBsYWNlUGxhY2Vob2xkZXJzKHRlbXBsYXRlOiBzdHJpbmcsIHZhbHVlczogYW55KTogc3RyaW5nIHtcclxuICAvLyBMb2cgdGhlIHZhbHVlcyB0byBkZWJ1Z1xyXG4gIGNvbnNvbGUubG9nKCdWYWx1ZXM6JywgdmFsdWVzKTtcclxuICBcclxuICAvLyBVc2UgYSByZWd1bGFyIGV4cHJlc3Npb24gdG8gZmluZCBwbGFjZWhvbGRlcnMgbGlrZSB7bmFtZX0sIHthZ2V9LCBldGMuXHJcbiAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoL3soLio/KX0vZywgKG1hdGNoLCBwbGFjZWhvbGRlcikgPT4ge1xyXG4gICAgLy8gTG9nIGVhY2ggcGxhY2Vob2xkZXIgYmVpbmcgcHJvY2Vzc2VkXHJcbiAgICBjb25zb2xlLmxvZygnUHJvY2Vzc2luZyBwbGFjZWhvbGRlcjonLCBwbGFjZWhvbGRlcik7XHJcbiAgICBcclxuICAgIC8vIENoZWNrIGlmIHRoZSBwbGFjZWhvbGRlciBleGlzdHMgaW4gdmFsdWVzXHJcbiAgICBpZiAodmFsdWVzW3BsYWNlaG9sZGVyXSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBSZXBsYWNpbmcgeyR7cGxhY2Vob2xkZXJ9fSB3aXRoOmAsIHZhbHVlc1twbGFjZWhvbGRlcl0pO1xyXG4gICAgICByZXR1cm4gdmFsdWVzW3BsYWNlaG9sZGVyXTsgIC8vIFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCBpdHMgdmFsdWVcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBObyB2YWx1ZSBmb3VuZCBmb3IgeyR7cGxhY2Vob2xkZXJ9fSwga2VlcGluZyB0aGUgcGxhY2Vob2xkZXIuYCk7XHJcbiAgICAgIHJldHVybiBtYXRjaDsgIC8vIEtlZXAgcGxhY2Vob2xkZXIgaWYgbm8gdmFsdWUgZm91bmRcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuXHJcbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgLy8gQWZ0ZXIgdGhlIHZpZXcgaGFzIGJlZW4gY2hlY2tlZCwgdXBkYXRlIHRleHQgYXJlYSBpZiBuZWVkZWRcclxuICAgIHRoaXMudXBkYXRlVGV4dEFyZWEoKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTsgIC8vIE1hbnVhbGx5IHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvblxyXG4gIH1cclxufVxyXG4iLCI8ZngtY29tcG9uZW50IFtmeERhdGFdPVwiZnhEYXRhXCIgI2Z4Q29tcG9uZW50PlxyXG4gIDxkaXYgY2xhc3M9XCJjdXN0b20tZGF0ZS1waWNrZXIgcmVsYXRpdmVcIj5cclxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwic3VtbWFyeUZvcm1cIj5cclxuXHJcbiAgICAgICAgPGxhYmVsIGZvcj1cImRhdGVcIiBjbGFzcz1cImlucHV0LWxhYmVsXCI+e3sgc2V0dGluZygnbGFiZWwnKSB9fTxzcGFuIGNsYXNzPVwiZmllbGQtcmVxdWlyZWRcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlXCI+XHJcbiAgICAgICAgPHRleHRhcmVhIGZvcm1Db250cm9sTmFtZT1cInN1bW1hcnlcIj48L3RleHRhcmVhPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPCEtLSA8ZGl2PlxyXG4gICAgICA8c21hbGwgKm5nSWY9XCJkYXRlUGlja2VyRm9ybS5nZXQoJ2RhdGUnKT8udG91Y2hlZCAmJiBkYXRlUGlja2VyRm9ybS5nZXQoJ2RhdGUnKT8uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cIlxyXG4gICAgICAgIGNsYXNzPVwidGV4dC1yZWQtNTAwXCI+XHJcbiAgICAgIHt7IHNldHRpbmcoJ2RhdGVQaWNrZXJFcnJvck1lc3NhZ2UnKSB9fVxyXG4gICAgICA8L3NtYWxsPlxyXG4gICAgPC9kaXY+IC0tPlxyXG4gICAgPC9mb3JtPlxyXG4gIDwvZGl2PlxyXG5cclxuPC9meC1jb21wb25lbnQ+Il19
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VtbWFyeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9meC1idWlsZGVyLXdyYXBwZXIvc3JjL2xpYi9jb21wb25lbnRzL3N1bW1hcnkvc3VtbWFyeS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9meC1idWlsZGVyLXdyYXBwZXIvc3JjL2xpYi9jb21wb25lbnRzL3N1bW1hcnkvc3VtbWFyeS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUF1QyxTQUFTLEVBQUUsTUFBTSxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBeUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RyxPQUFPLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBYSxlQUFlLEVBQW9DLE1BQU0scUJBQXFCLENBQUM7QUFHakksT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7O0FBUzFDLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxlQUFlO0lBa0I5QjtJQUErQjtJQUF5QjtJQWpCckUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVuQyxPQUFPLENBQVU7SUFDakIsT0FBTyxDQUFVO0lBQ2QsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDTyxXQUFXLENBQWU7SUFDNUMsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7SUFDMUMsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFlLENBQUM7SUFLL0IsV0FBVyxHQUFjLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQzNDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FB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LDJIRExILFlBQVksOEJBQUUsbUJBQW1CLDQ4QkFBRSxXQUFXLCtCQUFFLFdBQVc7OzRGQUkxRCxnQkFBZ0I7a0JBUDVCLFNBQVM7K0JBQ0UsYUFBYSxjQUNYLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDO3FKQVUzQyxXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBBZnRlclZpZXdDaGVja2VkLCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBpbmplY3QsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJlYWN0aXZlRm9ybXNNb2R1bGUsIEZvcm1zTW9kdWxlLCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBGeEJhc2VDb21wb25lbnQsIEZ4Q29tcG9uZW50LCBGeFNldHRpbmcsIEZ4U3RyaW5nU2V0dGluZywgRnhWYWxpZGF0aW9uLCBGeFZhbGlkYXRvclNlcnZpY2UgfSBmcm9tICdAaW5zdGFudHN5cy1sYWJzL2Z4JztcclxuaW1wb3J0IHsgQ2FsZW5kYXJNb2R1bGUgfSBmcm9tICdwcmltZW5nL2NhbGVuZGFyJztcclxuaW1wb3J0IHsgRnhCdWlsZGVyV3JhcHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9meC1idWlsZGVyLXdyYXBwZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItc3VtbWFyeScsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBGb3Jtc01vZHVsZSwgRnhDb21wb25lbnRdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zdW1tYXJ5LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vc3VtbWFyeS5jb21wb25lbnQuY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU3VtbWFyeUNvbXBvbmVudCBleHRlbmRzIEZ4QmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZHtcclxuICBwcml2YXRlIGZiID0gaW5qZWN0KEZvcm1CdWlsZGVyKTtcclxuXHJcbm1pbkRhdGUhOiBzdHJpbmc7XHJcbm1heERhdGUhOiBzdHJpbmc7XHJcbiAgIHRvZGF5ID0gbmV3IERhdGUoKTtcclxuICAgQFZpZXdDaGlsZCgnZnhDb21wb25lbnQnKSBmeENvbXBvbmVudCE6IEZ4Q29tcG9uZW50O1xyXG4gICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8Qm9vbGVhbj4oKTtcclxuICAgZGF0ZVBpY2tlck1hcCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XHJcbiAgXHJcbiAgIFxyXG5cclxuXHJcbiAgICBwdWJsaWMgc3VtbWFyeUZvcm06IEZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgc3VtbWFyeTogWycnXSxcclxuICAgICB9KVxyXG5cclxuICAgICAgZHluYW1pY1RleHQ6IHN0cmluZyA9ICcnO1xyXG4gICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYscHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LHByaXZhdGUgZnhCdWlsZGVyV3JhcHBlclNlcnZpY2U6IEZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlKSB7XHJcbiAgICAgIHN1cGVyKGNkcilcclxuICAgICAgdGhpcy5vbkluaXQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLl9yZWdpc3Rlcih0aGlzLnN1bW1hcnlGb3JtKTtcclxuICAgICAgfSk7XHJcbiAgICAgXHJcbiAgICB9XHJcblxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZHluYW1pY1RleHQgPSB0aGlzLnNldHRpbmcoJ3N1bW1hcnlUZXh0JykgfHwgJyc7XHJcbiAgIHRoaXMuZnhCdWlsZGVyV3JhcHBlclNlcnZpY2UudmFyaWFibGVzJFxyXG4gIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAuc3Vic2NyaWJlKCh2YXJpYWJsZXM6IGFueSkgPT4ge1xyXG4gICAgaWYgKCF2YXJpYWJsZXMpIHJldHVybjtcclxuICB9KTtcclxuICB9XHJcblxyXG4gICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBrZXkgPSB0aGlzLmZ4Q29tcG9uZW50Py5meERhdGE/Lm5hbWU7XHJcbiAgICBpZihrZXkpe1xyXG4gICAgfVxyXG4gICAgdGhpcy5nZXRDb250ZXh0QmFzZUlkKCk7XHJcbiAgfVxyXG5cclxuICBcclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXREYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xyXG4gIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXTsgXHJcbn1cclxuICBcclxuXHJcblxyXG4gICAgcHJvdGVjdGVkIHNldHRpbmdzKCk6IEZ4U2V0dGluZ1tdIHtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ3N1bW1hcnlUZXh0JywgJHRpdGxlOiAnU3VtbWFyeSBUZXh0JywgdmFsdWU6ICcnIH0pLFxyXG4gICAgICAgICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ3N1bW1hcnlMYWJlbCcsICR0aXRsZTogJ0xhYmVsJywgdmFsdWU6ICcnIH0pLFxyXG4gICAgICAgIF07XHJcbiAgICAgIH1cclxuICAgIFxyXG4gICAgICBwcm90ZWN0ZWQgdmFsaWRhdGlvbnMoKTogRnhWYWxpZGF0aW9uW10ge1xyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgICAgfVxyXG5cclxuICAgIHVwZGF0ZVRleHRBcmVhKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZm9ybVZhbHVlcyA9IHRoaXMuZnhDb21wb25lbnQ/LmZ4RGF0YT8uJGZvcm1Hcm91cD8udmFsdWU7XHJcbiAgICBjb25zdCBkeW5hbWljVGV4dCA9IHRoaXMucmVwbGFjZVBsYWNlaG9sZGVycyh0aGlzLmR5bmFtaWNUZXh0LCBmb3JtVmFsdWVzKTtcclxuICAgIHRoaXMuc3VtbWFyeUZvcm0ucGF0Y2hWYWx1ZSh7IHN1bW1hcnk6IGR5bmFtaWNUZXh0IH0pO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcmVwbGFjZVBsYWNlaG9sZGVycyh0ZW1wbGF0ZTogc3RyaW5nLCB2YWx1ZXM6IGFueSk6IHN0cmluZyB7XHJcbiAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoL3soLio/KX0vZywgKG1hdGNoLCBwbGFjZWhvbGRlcikgPT4ge1xyXG4gICAgaWYgKHZhbHVlc1twbGFjZWhvbGRlcl0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gdmFsdWVzW3BsYWNlaG9sZGVyXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBtYXRjaDtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuXHJcbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVUZXh0QXJlYSgpO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxufVxyXG4iLCI8ZngtY29tcG9uZW50IFtmeERhdGFdPVwiZnhEYXRhXCIgI2Z4Q29tcG9uZW50PlxyXG4gIDxkaXYgY2xhc3M9XCJjdXN0b20tZGF0ZS1waWNrZXIgcmVsYXRpdmVcIj5cclxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwic3VtbWFyeUZvcm1cIj5cclxuXHJcbiAgICAgICAgPGxhYmVsIGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPnt7IHNldHRpbmcoJ3N1bW1hcnlMYWJlbCcpIH19PC9sYWJlbD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmVcIj5cclxuICAgICAgICA8dGV4dGFyZWEgZm9ybUNvbnRyb2xOYW1lPVwic3VtbWFyeVwiIHJlYWRvbmx5IGNsYXNzPVwidy1mdWxsXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwhLS0gPGRpdj5cclxuICAgICAgPHNtYWxsICpuZ0lmPVwiZGF0ZVBpY2tlckZvcm0uZ2V0KCdkYXRlJyk/LnRvdWNoZWQgJiYgZGF0ZVBpY2tlckZvcm0uZ2V0KCdkYXRlJyk/LmVycm9ycz8uWydyZXF1aXJlZCddXCJcclxuICAgICAgICBjbGFzcz1cInRleHQtcmVkLTUwMFwiPlxyXG4gICAgICB7eyBzZXR0aW5nKCdkYXRlUGlja2VyRXJyb3JNZXNzYWdlJykgfX1cclxuICAgICAgPC9zbWFsbD5cclxuICAgIDwvZGl2PiAtLT5cclxuICAgIDwvZm9ybT5cclxuICA8L2Rpdj5cclxuXHJcbjwvZngtY29tcG9uZW50PiJdfQ==