iss-ctrl 0.0.2-beta → 0.0.2-beta-2
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.
- package/README.md +17 -15
- package/components/autocomplete/autocomplete.component.d.ts +3 -3
- package/components/base-ctrl.d.ts +1 -3
- package/components/checkbox/checkbox.component.d.ts +3 -3
- package/components/chips/chips.component.d.ts +11 -3
- package/components/ctrl-array/ctrl-array.component.d.ts +3 -3
- package/components/date-picker/date-picker.component.d.ts +3 -3
- package/components/date-range-picker/date-range-picker.component.d.ts +3 -3
- package/components/datetime-picker/datetime-picker.component.d.ts +3 -3
- package/components/datetime-range-picker/datetime-range-picker.component.d.ts +3 -3
- package/components/file-picker/file-picker.component.d.ts +3 -3
- package/components/input/input.component.d.ts +15 -4
- package/components/mobile/mobile.component.d.ts +3 -3
- package/components/note/note.component.d.ts +3 -3
- package/components/plate/PLATE_LETTERS.d.ts +8 -0
- package/components/{plate-number/plate-number.component.d.ts → plate/plate.component.d.ts} +4 -5
- package/components/radio/radio.component.d.ts +3 -3
- package/components/select/select.component.d.ts +8 -6
- package/components/slide-toggle/slide-toggle.component.d.ts +3 -3
- package/components/textarea/textarea.component.d.ts +3 -3
- package/components/time-picker/time-picker.component.d.ts +3 -3
- package/components/toggle-button/toggle-button.component.d.ts +3 -3
- package/esm2022/components/autocomplete/autocomplete.component.mjs +7 -7
- package/esm2022/components/base-ctrl.mjs +7 -7
- package/esm2022/components/checkbox/checkbox.component.mjs +7 -7
- package/esm2022/components/chips/chips.component.mjs +72 -12
- package/esm2022/components/ctrl-array/ctrl-array.component.mjs +7 -7
- package/esm2022/components/date-picker/date-picker.component.mjs +9 -9
- package/esm2022/components/date-range-picker/date-range-picker.component.mjs +7 -7
- package/esm2022/components/datetime-picker/datetime-picker.component.mjs +12 -12
- package/esm2022/components/datetime-range-picker/datetime-range-picker.component.mjs +7 -7
- package/esm2022/components/file-picker/file-picker.component.mjs +7 -7
- package/esm2022/components/hints/hints.component.mjs +3 -3
- package/esm2022/components/input/input.component.mjs +43 -18
- package/esm2022/components/mobile/mobile.component.mjs +9 -9
- package/esm2022/components/note/note.component.mjs +7 -7
- package/esm2022/components/plate/PLATE_LETTERS.mjs +20 -0
- package/esm2022/components/plate/plate.component.mjs +101 -0
- package/esm2022/components/radio/radio.component.mjs +7 -7
- package/esm2022/components/select/select.component.mjs +63 -32
- package/esm2022/components/slide-toggle/slide-toggle.component.mjs +7 -7
- package/esm2022/components/textarea/textarea.component.mjs +23 -11
- package/esm2022/components/time-picker/time-picker.component.mjs +9 -9
- package/esm2022/components/toggle-button/toggle-button.component.mjs +7 -7
- package/esm2022/interfaces/hint-alignment.type.mjs +2 -0
- package/esm2022/interfaces/hint.interface.mjs +1 -1
- package/esm2022/interfaces/option.interface.mjs +1 -1
- package/esm2022/pipes/arabic-number.pipe.mjs +23 -0
- package/esm2022/pipes/plate-letter.pipe.mjs +22 -0
- package/esm2022/public-api.mjs +2 -2
- package/fesm2022/iss-ctrl.mjs +359 -195
- package/fesm2022/iss-ctrl.mjs.map +1 -1
- package/interfaces/hint-alignment.type.d.ts +1 -0
- package/interfaces/hint.interface.d.ts +2 -0
- package/interfaces/option.interface.d.ts +1 -0
- package/package.json +1 -1
- package/pipes/arabic-number.pipe.d.ts +7 -0
- package/pipes/plate-letter.pipe.d.ts +7 -0
- package/public-api.d.ts +1 -1
- package/esm2022/components/plate-number/plate-number.component.mjs +0 -114
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type HintAlignment = "start" | "end";
|
package/package.json
CHANGED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { PipeTransform } from "@angular/core";
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class ArabicNumberPipe implements PipeTransform {
|
|
4
|
+
transform(n: string, ...args: unknown[]): string;
|
|
5
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ArabicNumberPipe, never>;
|
|
6
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<ArabicNumberPipe, "arabicNumber", true>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { PipeTransform } from "@angular/core";
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class PlateLetterPipe implements PipeTransform {
|
|
4
|
+
transform(value: string, ...args: unknown[]): unknown;
|
|
5
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<PlateLetterPipe, never>;
|
|
6
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<PlateLetterPipe, "plateLetter", true>;
|
|
7
|
+
}
|
package/public-api.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export * from "./components/file-picker/file-picker.component";
|
|
|
9
9
|
export * from "./components/input/input.component";
|
|
10
10
|
export * from "./components/mobile/mobile.component";
|
|
11
11
|
export * from "./components/note/note.component";
|
|
12
|
-
export * from "./components/plate
|
|
12
|
+
export * from "./components/plate/plate.component";
|
|
13
13
|
export * from "./components/radio/radio.component";
|
|
14
14
|
export * from "./components/select/select.component";
|
|
15
15
|
export * from "./components/slide-toggle/slide-toggle.component";
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import { Component, computed, effect } from "@angular/core";
|
|
2
|
-
import { FormArray, FormControl, FormGroup, NG_VALUE_ACCESSOR, ReactiveFormsModule } from "@angular/forms";
|
|
3
|
-
import { BaseCtrl } from "../base-ctrl";
|
|
4
|
-
import { MatFormField } from "@angular/material/form-field";
|
|
5
|
-
import { MatInput } from "@angular/material/input";
|
|
6
|
-
import { MatOption, MatSelect } from "@angular/material/select";
|
|
7
|
-
import { NgTemplateOutlet } from "@angular/common";
|
|
8
|
-
import { toSignal } from "@angular/core/rxjs-interop";
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "@angular/forms";
|
|
11
|
-
export class PlateNumberComponent extends BaseCtrl {
|
|
12
|
-
constructor() {
|
|
13
|
-
super(...arguments);
|
|
14
|
-
this.plate = new FormGroup({
|
|
15
|
-
numbers: new FormArray([
|
|
16
|
-
new FormControl(null),
|
|
17
|
-
new FormControl(null),
|
|
18
|
-
new FormControl(null),
|
|
19
|
-
new FormControl(null),
|
|
20
|
-
]),
|
|
21
|
-
letters: new FormArray([
|
|
22
|
-
new FormControl(null),
|
|
23
|
-
new FormControl(null),
|
|
24
|
-
new FormControl(null),
|
|
25
|
-
]),
|
|
26
|
-
});
|
|
27
|
-
this.options = [
|
|
28
|
-
{ label: "A/أ", value: "A" },
|
|
29
|
-
{ label: "B/ب", value: "B" },
|
|
30
|
-
{ label: "J/ح", value: "J" },
|
|
31
|
-
{ label: "D/د", value: "D" },
|
|
32
|
-
{ label: "R/ر", value: "R" },
|
|
33
|
-
{ label: "S/س", value: "S" },
|
|
34
|
-
{ label: "X/ص", value: "X" },
|
|
35
|
-
{ label: "T/ط", value: "T" },
|
|
36
|
-
{ label: "E/ع", value: "E" },
|
|
37
|
-
{ label: "G/ق", value: "G" },
|
|
38
|
-
{ label: "K/ك", value: "K" },
|
|
39
|
-
{ label: "L/ل", value: "L" },
|
|
40
|
-
{ label: "Z/م", value: "Z" },
|
|
41
|
-
{ label: "N/ن", value: "N" },
|
|
42
|
-
{ label: "H/هـ", value: "H" },
|
|
43
|
-
{ label: "U/و", value: "U" },
|
|
44
|
-
{ label: "V/ي", value: "V" }
|
|
45
|
-
];
|
|
46
|
-
this.#plateChanges = toSignal(this.plate.valueChanges);
|
|
47
|
-
this.#lettersArr = computed(() => this.#plateChanges()["letters"].filter((l) => l));
|
|
48
|
-
this.#letters = computed(() => this.#lettersArr().join(""));
|
|
49
|
-
this.#numbersArr = computed(() => this.#plateChanges()["numbers"].filter((l) => l));
|
|
50
|
-
this.#numbers = computed(() => this.#numbersArr().join(""));
|
|
51
|
-
this.#plateHasValue = computed(() => !!(this.#letters().length && this.#numbers().length));
|
|
52
|
-
this.#effectRef = effect(() => {
|
|
53
|
-
if (this.#plateChanges()) {
|
|
54
|
-
this.propagateValue(this.#getEmissionValue());
|
|
55
|
-
this.emitOnChangeEvent({ letters: this.#lettersArr(), numbers: this.#numbersArr() });
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
#plateChanges;
|
|
60
|
-
#lettersArr;
|
|
61
|
-
#letters;
|
|
62
|
-
#numbersArr;
|
|
63
|
-
#numbers;
|
|
64
|
-
#plateHasValue;
|
|
65
|
-
#effectRef;
|
|
66
|
-
get letterControls() {
|
|
67
|
-
return this.plate.controls["letters"].controls;
|
|
68
|
-
}
|
|
69
|
-
get numberControls() {
|
|
70
|
-
return this.plate.controls["numbers"].controls;
|
|
71
|
-
}
|
|
72
|
-
writeValue(value) {
|
|
73
|
-
let processedValue = this.#splitPlateValues(value);
|
|
74
|
-
if (processedValue) {
|
|
75
|
-
this.plate.patchValue(processedValue);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
ngOnDestroy() {
|
|
79
|
-
this.#effectRef.destroy();
|
|
80
|
-
}
|
|
81
|
-
#getEmissionValue() {
|
|
82
|
-
if (this.#plateHasValue()) {
|
|
83
|
-
return `${this.#letters()}-${this.#numbers()}`;
|
|
84
|
-
}
|
|
85
|
-
return null;
|
|
86
|
-
}
|
|
87
|
-
#splitPlateValues(value) {
|
|
88
|
-
if (value) {
|
|
89
|
-
let lettersAndNumbers = value.split("-");
|
|
90
|
-
let letters = lettersAndNumbers[0].split("");
|
|
91
|
-
let numbers = lettersAndNumbers[1].split("");
|
|
92
|
-
return { letters, numbers };
|
|
93
|
-
}
|
|
94
|
-
return null;
|
|
95
|
-
}
|
|
96
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: PlateNumberComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
97
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: PlateNumberComponent, isStandalone: true, selector: "iss-ctrl-plate-number", providers: [
|
|
98
|
-
{ provide: NG_VALUE_ACCESSOR, useExisting: PlateNumberComponent, multi: true }
|
|
99
|
-
], usesInheritance: true, ngImport: i0, template: "<div [formGroup]=\"plate\">\r\n <div class=\"row mb-4\">\r\n <ng-container formArrayName=\"numbers\">\r\n @for (item of numberControls; track $index) {\r\n <div class=\"col-sm-3\">\r\n <mat-form-field class=\"mat-form-field-number\">\r\n <input\r\n type=\"number\"\r\n matInput\r\n [formControlName]=\"$index\"\r\n maxlength=\"1\"\r\n placeholder=\"\"\r\n oninput=\"if (this.value.length > this.maxLength) this.value = this.value.slice(0, this.maxLength);\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n }\r\n </ng-container>\r\n </div>\r\n <div class=\"row mb-4\">\r\n <ng-container formArrayName=\"letters\">\r\n @for (el of letterControls; track $index) {\r\n <div class=\"col-sm-4\">\r\n <mat-form-field class=\"mat-form-field-number\">\r\n <mat-select disableOptionCentering [formControlName]=\"$index\">\r\n @for (option of options; track option.value) {\r\n <mat-option [value]=\"option.value\">{{ option.label }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n }\r\n </ng-container>\r\n </div>\r\n <!--<div class=\"row mb-4\">\r\n <div class=\"col-12\">\r\n <ng-container *ngTemplateOutlet=\"plateElement\"></ng-container>\r\n </div>\r\n </div>-->\r\n</div>\r\n\r\n\r\n<!--<ng-template #plateElement>\r\n <div class=\"plate d-inline-flex align-items-stretch justify-content-between fs-18\">\r\n <div class=\"d-flex flex-column border-right w-100\">\r\n <div class=\"ARPlate border-bottom d-flex h-50 w-100\">\r\n <div class=\"fc-black border-right w-50 d-flex align-items-center justify-content-center gap-1\">\r\n <span>{{ number1 | arabicNumbers }}</span>\r\n <span>{{ number2 | arabicNumbers }}</span>\r\n <span>{{ number3 | arabicNumbers }}</span>\r\n <span>{{ number4 | arabicNumbers }}</span>\r\n </div>\r\n <span class=\"fw-medium fc-black w-50 d-flex align-items-center justify-content-center\">\r\n <span>{{ letter1Ar }}</span> <span class=\"m-1\">{{ letter2Ar }}</span> <span>{{ letter3Ar }}</span>\r\n </span>\r\n </div>\r\n <div class=\"ENPlate d-flex h-50 w-100\">\r\n <span class=\"fc-black border-right w-50 d-flex align-items-center justify-content-center\">\r\n {{ number1 === null || number1 === undefined ? '' : number1 }}\r\n {{ number2 === null || number2 === undefined ? '' : number2 }}\r\n {{ number3 === null || number3 === undefined ? '' : number3 }}\r\n {{ number4 === null || number4 === undefined ? '' : number4 }}\r\n </span>\r\n <span class=\"fw-medium fc-black w-50 d-flex align-items-center justify-content-center\">\r\n {{ letter1En.toUpperCase() + ' ' + letter2En.toUpperCase() + ' ' + letter3En.toUpperCase() }}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"d-flex flex-column gap-2 justify-content-center px-2 align-items-center\">\r\n <img src=\"assets/images/ksa-symbol.svg\" alt=\"\"/>\r\n\r\n <span class=\"fw-medium fs-12 line-height-1-2\">K<br/>S<br/>A</span>\r\n <svg width=\"9\" height=\"9\" viewBox=\"0 0 9 9\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"4.49162\" cy=\"4.06193\" r=\"3.99162\" fill=\"#1D252D\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n</ng-template>-->\r\n", styles: [""], dependencies: [{ kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }] }); }
|
|
100
|
-
}
|
|
101
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: PlateNumberComponent, decorators: [{
|
|
102
|
-
type: Component,
|
|
103
|
-
args: [{ selector: "iss-ctrl-plate-number", standalone: true, imports: [
|
|
104
|
-
MatFormField,
|
|
105
|
-
ReactiveFormsModule,
|
|
106
|
-
MatInput,
|
|
107
|
-
MatSelect,
|
|
108
|
-
MatOption,
|
|
109
|
-
NgTemplateOutlet
|
|
110
|
-
], providers: [
|
|
111
|
-
{ provide: NG_VALUE_ACCESSOR, useExisting: PlateNumberComponent, multi: true }
|
|
112
|
-
], template: "<div [formGroup]=\"plate\">\r\n <div class=\"row mb-4\">\r\n <ng-container formArrayName=\"numbers\">\r\n @for (item of numberControls; track $index) {\r\n <div class=\"col-sm-3\">\r\n <mat-form-field class=\"mat-form-field-number\">\r\n <input\r\n type=\"number\"\r\n matInput\r\n [formControlName]=\"$index\"\r\n maxlength=\"1\"\r\n placeholder=\"\"\r\n oninput=\"if (this.value.length > this.maxLength) this.value = this.value.slice(0, this.maxLength);\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n }\r\n </ng-container>\r\n </div>\r\n <div class=\"row mb-4\">\r\n <ng-container formArrayName=\"letters\">\r\n @for (el of letterControls; track $index) {\r\n <div class=\"col-sm-4\">\r\n <mat-form-field class=\"mat-form-field-number\">\r\n <mat-select disableOptionCentering [formControlName]=\"$index\">\r\n @for (option of options; track option.value) {\r\n <mat-option [value]=\"option.value\">{{ option.label }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n }\r\n </ng-container>\r\n </div>\r\n <!--<div class=\"row mb-4\">\r\n <div class=\"col-12\">\r\n <ng-container *ngTemplateOutlet=\"plateElement\"></ng-container>\r\n </div>\r\n </div>-->\r\n</div>\r\n\r\n\r\n<!--<ng-template #plateElement>\r\n <div class=\"plate d-inline-flex align-items-stretch justify-content-between fs-18\">\r\n <div class=\"d-flex flex-column border-right w-100\">\r\n <div class=\"ARPlate border-bottom d-flex h-50 w-100\">\r\n <div class=\"fc-black border-right w-50 d-flex align-items-center justify-content-center gap-1\">\r\n <span>{{ number1 | arabicNumbers }}</span>\r\n <span>{{ number2 | arabicNumbers }}</span>\r\n <span>{{ number3 | arabicNumbers }}</span>\r\n <span>{{ number4 | arabicNumbers }}</span>\r\n </div>\r\n <span class=\"fw-medium fc-black w-50 d-flex align-items-center justify-content-center\">\r\n <span>{{ letter1Ar }}</span> <span class=\"m-1\">{{ letter2Ar }}</span> <span>{{ letter3Ar }}</span>\r\n </span>\r\n </div>\r\n <div class=\"ENPlate d-flex h-50 w-100\">\r\n <span class=\"fc-black border-right w-50 d-flex align-items-center justify-content-center\">\r\n {{ number1 === null || number1 === undefined ? '' : number1 }}\r\n {{ number2 === null || number2 === undefined ? '' : number2 }}\r\n {{ number3 === null || number3 === undefined ? '' : number3 }}\r\n {{ number4 === null || number4 === undefined ? '' : number4 }}\r\n </span>\r\n <span class=\"fw-medium fc-black w-50 d-flex align-items-center justify-content-center\">\r\n {{ letter1En.toUpperCase() + ' ' + letter2En.toUpperCase() + ' ' + letter3En.toUpperCase() }}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"d-flex flex-column gap-2 justify-content-center px-2 align-items-center\">\r\n <img src=\"assets/images/ksa-symbol.svg\" alt=\"\"/>\r\n\r\n <span class=\"fw-medium fs-12 line-height-1-2\">K<br/>S<br/>A</span>\r\n <svg width=\"9\" height=\"9\" viewBox=\"0 0 9 9\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"4.49162\" cy=\"4.06193\" r=\"3.99162\" fill=\"#1D252D\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n</ng-template>-->\r\n" }]
|
|
113
|
-
}] });
|
|
114
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGUtbnVtYmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lzcy1jdHJsL3NyYy9jb21wb25lbnRzL3BsYXRlLW51bWJlci9wbGF0ZS1udW1iZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaXNzLWN0cmwvc3JjL2NvbXBvbmVudHMvcGxhdGUtbnVtYmVyL3BsYXRlLW51bWJlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQStCLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pHLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQzFELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQzs7O0FBb0JwRCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsUUFBUTtJQWpCbEQ7O1FBa0JZLFVBQUssR0FBYyxJQUFJLFNBQVMsQ0FBQztZQUN6QyxPQUFPLEVBQUUsSUFBSSxTQUFTLENBQUM7Z0JBQ3JCLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQztnQkFDckIsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUNyQixJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUM7Z0JB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QUFDO1FBQ2pELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxLQUFvQjtRQUNwQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsSUFBSSxpQkFBaUIsR0FBYSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25ELElBQUksT0FBTyxHQUFhLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2RCxJQUFJLE9BQU8sR0FBYSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdkQsT0FBTyxFQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUMsQ0FBQztRQUM1QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDOzhHQWhGVSxvQkFBb0I7a0dBQXBCLG9CQUFvQixvRUFKcEI7WUFDVCxFQUFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQztTQUM3RSxpREN6QkgsMCtHQThFQSwwRERoRUksWUFBWSwyTEFDWixtQkFBbUIsZ3hDQUNuQixRQUFRLGlVQUNSLFNBQVMsd2VBQ1QsU0FBUzs7MkZBU0Esb0JBQW9CO2tCQWpCaEMsU0FBUzsrQkFDRSx1QkFBdUIsY0FDckIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osbUJBQW1CO3dCQUNuQixRQUFRO3dCQUNSLFNBQVM7d0JBQ1QsU0FBUzt3QkFDVCxnQkFBZ0I7cUJBQ2pCLGFBR1U7d0JBQ1QsRUFBQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxzQkFBc0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDO3FCQUM3RSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBFZmZlY3RSZWYsIE9uRGVzdHJveSwgU2lnbmFsfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0Zvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgTkdfVkFMVUVfQUNDRVNTT1IsIFJlYWN0aXZlRm9ybXNNb2R1bGV9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQge0Jhc2VDdHJsfSBmcm9tIFwiLi4vYmFzZS1jdHJsXCI7XHJcbmltcG9ydCB7TWF0Rm9ybUZpZWxkfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZFwiO1xyXG5pbXBvcnQge01hdElucHV0fSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXRcIjtcclxuaW1wb3J0IHtNYXRPcHRpb24sIE1hdFNlbGVjdH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3NlbGVjdFwiO1xyXG5pbXBvcnQge05nVGVtcGxhdGVPdXRsZXR9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHt0b1NpZ25hbH0gZnJvbSBcIkBhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wXCI7XHJcbmltcG9ydCB7T3B0aW9ufSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9vcHRpb24uaW50ZXJmYWNlXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJpc3MtY3RybC1wbGF0ZS1udW1iZXJcIixcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIE1hdEZvcm1GaWVsZCxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBNYXRJbnB1dCxcclxuICAgIE1hdFNlbGVjdCxcclxuICAgIE1hdE9wdGlvbixcclxuICAgIE5nVGVtcGxhdGVPdXRsZXRcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vcGxhdGUtbnVtYmVyLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmw6IFwiLi9wbGF0ZS1udW1iZXIuY29tcG9uZW50LnNjc3NcIixcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwgdXNlRXhpc3Rpbmc6IFBsYXRlTnVtYmVyQ29tcG9uZW50LCBtdWx0aTogdHJ1ZX1cclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQbGF0ZU51bWJlckNvbXBvbmVudCBleHRlbmRzIEJhc2VDdHJsIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuICBwcm90ZWN0ZWQgcGxhdGU6IEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgbnVtYmVyczogbmV3IEZvcm1BcnJheShbXHJcbiAgICAgIG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuICAgICAgbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgIG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuICAgIF0pLFxyXG4gICAgbGV0dGVyczogbmV3IEZvcm1BcnJheShbXHJcbiAgICAgIG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuICAgICAgbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICBdKSxcclxuICB9KTtcclxuICBwcm90ZWN0ZWQgb3B0aW9uczogT3B0aW9uW10gPSBbXHJcbiAgICB7bGFiZWw6IFwiQS/Yo1wiLCB2YWx1ZTogXCJBXCJ9LFxyXG4gICAge2xhYmVsOiBcIkIv2KhcIiwgdmFsdWU6IFwiQlwifSxcclxuICAgIHtsYWJlbDogXCJKL9itXCIsIHZhbHVlOiBcIkpcIn0sXHJcbiAgICB7bGFiZWw6IFwiRC/Yr1wiLCB2YWx1ZTogXCJEXCJ9LFxyXG4gICAge2xhYmVsOiBcIlIv2LFcIiwgdmFsdWU6IFwiUlwifSxcclxuICAgIHtsYWJlbDogXCJTL9izXCIsIHZhbHVlOiBcIlNcIn0sXHJcbiAgICB7bGFiZWw6IFwiWC/YtVwiLCB2YWx1ZTogXCJYXCJ9LFxyXG4gICAge2xhYmVsOiBcIlQv2LdcIiwgdmFsdWU6IFwiVFwifSxcclxuICAgIHtsYWJlbDogXCJFL9i5XCIsIHZhbHVlOiBcIkVcIn0sXHJcbiAgICB7bGFiZWw6IFwiRy/ZglwiLCB2YWx1ZTogXCJHXCJ9LFxyXG4gICAge2xhYmVsOiBcIksv2YNcIiwgdmFsdWU6IFwiS1wifSxcclxuICAgIHtsYWJlbDogXCJML9mEXCIsIHZhbHVlOiBcIkxcIn0sXHJcbiAgICB7bGFiZWw6IFwiWi/ZhVwiLCB2YWx1ZTogXCJaXCJ9LFxyXG4gICAge2xhYmVsOiBcIk4v2YZcIiwgdmFsdWU6IFwiTlwifSxcclxuICAgIHtsYWJlbDogXCJIL9mH2YBcIiwgdmFsdWU6IFwiSFwifSxcclxuICAgIHtsYWJlbDogXCJVL9mIXCIsIHZhbHVlOiBcIlVcIn0sXHJcbiAgICB7bGFiZWw6IFwiVi/ZilwiLCB2YWx1ZTogXCJWXCJ9XHJcbiAgXTtcclxuICAjcGxhdGVDaGFuZ2VzID0gdG9TaWduYWwodGhpcy5wbGF0ZS52YWx1ZUNoYW5nZXMpO1xyXG4gICNsZXR0ZXJzQXJyOiBTaWduYWw8c3RyaW5nW10+ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy4jcGxhdGVDaGFuZ2VzKClbXCJsZXR0ZXJzXCJdLmZpbHRlcigobDogc3RyaW5nKSA9PiBsKSk7XHJcbiAgI2xldHRlcnM6IFNpZ25hbDxzdHJpbmc+ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy4jbGV0dGVyc0FycigpLmpvaW4oXCJcIikpO1xyXG4gICNudW1iZXJzQXJyOiBTaWduYWw8c3RyaW5nW10+ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy4jcGxhdGVDaGFuZ2VzKClbXCJudW1iZXJzXCJdLmZpbHRlcigobDogc3RyaW5nKSA9PiBsKSk7XHJcbiAgI251bWJlcnM6IFNpZ25hbDxzdHJpbmc+ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy4jbnVtYmVyc0FycigpLmpvaW4oXCJcIikpO1xyXG4gICNwbGF0ZUhhc1ZhbHVlOiBTaWduYWw8Ym9vbGVhbj4gPSBjb21wdXRlZCgoKSA9PiAhISh0aGlzLiNsZXR0ZXJzKCkubGVuZ3RoICYmIHRoaXMuI251bWJlcnMoKS5sZW5ndGgpKTtcclxuICAjZWZmZWN0UmVmOiBFZmZlY3RSZWYgPSBlZmZlY3QoKCkgPT4ge1xyXG4gICAgaWYgKHRoaXMuI3BsYXRlQ2hhbmdlcygpKSB7XHJcbiAgICAgIHRoaXMucHJvcGFnYXRlVmFsdWUodGhpcy4jZ2V0RW1pc3Npb25WYWx1ZSgpKTtcclxuICAgICAgdGhpcy5lbWl0T25DaGFuZ2VFdmVudCh7bGV0dGVyczogdGhpcy4jbGV0dGVyc0FycigpLCBudW1iZXJzOiB0aGlzLiNudW1iZXJzQXJyKCl9KTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgZ2V0IGxldHRlckNvbnRyb2xzKCkge1xyXG4gICAgcmV0dXJuICh0aGlzLnBsYXRlLmNvbnRyb2xzW1wibGV0dGVyc1wiXSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG51bWJlckNvbnRyb2xzKCkge1xyXG4gICAgcmV0dXJuICh0aGlzLnBsYXRlLmNvbnRyb2xzW1wibnVtYmVyc1wiXSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xyXG4gICAgbGV0IHByb2Nlc3NlZFZhbHVlID0gdGhpcy4jc3BsaXRQbGF0ZVZhbHVlcyh2YWx1ZSk7XHJcbiAgICBpZiAocHJvY2Vzc2VkVmFsdWUpIHtcclxuICAgICAgdGhpcy5wbGF0ZS5wYXRjaFZhbHVlKHByb2Nlc3NlZFZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy4jZWZmZWN0UmVmLmRlc3Ryb3koKTtcclxuICB9XHJcblxyXG4gICNnZXRFbWlzc2lvblZhbHVlKCkge1xyXG4gICAgaWYgKHRoaXMuI3BsYXRlSGFzVmFsdWUoKSkge1xyXG4gICAgICByZXR1cm4gYCR7dGhpcy4jbGV0dGVycygpfS0ke3RoaXMuI251bWJlcnMoKX1gO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAjc3BsaXRQbGF0ZVZhbHVlcyh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIGxldCBsZXR0ZXJzQW5kTnVtYmVyczogc3RyaW5nW10gPSB2YWx1ZS5zcGxpdChcIi1cIik7XHJcbiAgICAgIGxldCBsZXR0ZXJzOiBzdHJpbmdbXSA9IGxldHRlcnNBbmROdW1iZXJzWzBdLnNwbGl0KFwiXCIpO1xyXG4gICAgICBsZXQgbnVtYmVyczogc3RyaW5nW10gPSBsZXR0ZXJzQW5kTnVtYmVyc1sxXS5zcGxpdChcIlwiKTtcclxuICAgICAgcmV0dXJuIHtsZXR0ZXJzLCBudW1iZXJzfTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IFtmb3JtR3JvdXBdPVwicGxhdGVcIj5cclxuICA8ZGl2IGNsYXNzPVwicm93IG1iLTRcIj5cclxuICAgIDxuZy1jb250YWluZXIgZm9ybUFycmF5TmFtZT1cIm51bWJlcnNcIj5cclxuICAgICAgQGZvciAoaXRlbSBvZiBudW1iZXJDb250cm9sczsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0zXCI+XHJcbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXQtZm9ybS1maWVsZC1udW1iZXJcIj5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIiRpbmRleFwiXHJcbiAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMVwiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJcIlxyXG4gICAgICAgICAgICAgIG9uaW5wdXQ9XCJpZiAodGhpcy52YWx1ZS5sZW5ndGggPiB0aGlzLm1heExlbmd0aCkgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUuc2xpY2UoMCwgdGhpcy5tYXhMZW5ndGgpO1wiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwicm93IG1iLTRcIj5cclxuICAgIDxuZy1jb250YWluZXIgZm9ybUFycmF5TmFtZT1cImxldHRlcnNcIj5cclxuICAgICAgQGZvciAoZWwgb2YgbGV0dGVyQ29udHJvbHM7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNFwiPlxyXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibWF0LWZvcm0tZmllbGQtbnVtYmVyXCI+XHJcbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IGRpc2FibGVPcHRpb25DZW50ZXJpbmcgW2Zvcm1Db250cm9sTmFtZV09XCIkaW5kZXhcIj5cclxuICAgICAgICAgICAgICBAZm9yIChvcHRpb24gb2Ygb3B0aW9uczsgdHJhY2sgb3B0aW9uLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCI+e3sgb3B0aW9uLmxhYmVsIH19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9kaXY+XHJcbiAgPCEtLTxkaXYgY2xhc3M9XCJyb3cgbWItNFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicGxhdGVFbGVtZW50XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj4tLT5cclxuPC9kaXY+XHJcblxyXG5cclxuPCEtLTxuZy10ZW1wbGF0ZSAjcGxhdGVFbGVtZW50PlxyXG4gIDxkaXYgY2xhc3M9XCJwbGF0ZSBkLWlubGluZS1mbGV4IGFsaWduLWl0ZW1zLXN0cmV0Y2gganVzdGlmeS1jb250ZW50LWJldHdlZW4gZnMtMThcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gYm9yZGVyLXJpZ2h0IHctMTAwXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJBUlBsYXRlIGJvcmRlci1ib3R0b20gZC1mbGV4IGgtNTAgdy0xMDBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmMtYmxhY2sgYm9yZGVyLXJpZ2h0IHctNTAgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGdhcC0xXCI+XHJcbiAgICAgICAgICA8c3Bhbj57eyBudW1iZXIxIHwgYXJhYmljTnVtYmVycyB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuPnt7IG51bWJlcjIgfCBhcmFiaWNOdW1iZXJzIH19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4+e3sgbnVtYmVyMyB8IGFyYWJpY051bWJlcnMgfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3Bhbj57eyBudW1iZXI0IHwgYXJhYmljTnVtYmVycyB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LW1lZGl1bSBmYy1ibGFjayB3LTUwIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgPHNwYW4+e3sgbGV0dGVyMUFyIH19PC9zcGFuPiA8c3BhbiBjbGFzcz1cIm0tMVwiPnt7IGxldHRlcjJBciB9fTwvc3Bhbj4gPHNwYW4+e3sgbGV0dGVyM0FyIH19PC9zcGFuPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJFTlBsYXRlIGQtZmxleCBoLTUwIHctMTAwXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJmYy1ibGFjayBib3JkZXItcmlnaHQgdy01MCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgIHt7IG51bWJlcjEgPT09IG51bGwgfHwgbnVtYmVyMSA9PT0gdW5kZWZpbmVkID8gJycgOiBudW1iZXIxIH19XHJcbiAgICAgICAgICB7eyBudW1iZXIyID09PSBudWxsIHx8IG51bWJlcjIgPT09IHVuZGVmaW5lZCA/ICcnIDogbnVtYmVyMiB9fVxyXG4gICAgICAgICAge3sgbnVtYmVyMyA9PT0gbnVsbCB8fCBudW1iZXIzID09PSB1bmRlZmluZWQgPyAnJyA6IG51bWJlcjMgfX1cclxuICAgICAgICAgIHt7IG51bWJlcjQgPT09IG51bGwgfHwgbnVtYmVyNCA9PT0gdW5kZWZpbmVkID8gJycgOiBudW1iZXI0IH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZnctbWVkaXVtIGZjLWJsYWNrIHctNTAgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICB7eyBsZXR0ZXIxRW4udG9VcHBlckNhc2UoKSArICcgJyArIGxldHRlcjJFbi50b1VwcGVyQ2FzZSgpICsgJyAnICsgbGV0dGVyM0VuLnRvVXBwZXJDYXNlKCkgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0yIGp1c3RpZnktY29udGVudC1jZW50ZXIgcHgtMiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgPGltZyBzcmM9XCJhc3NldHMvaW1hZ2VzL2tzYS1zeW1ib2wuc3ZnXCIgYWx0PVwiXCIvPlxyXG5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJmdy1tZWRpdW0gZnMtMTIgbGluZS1oZWlnaHQtMS0yXCI+Szxici8+Uzxici8+QTwvc3Bhbj5cclxuICAgICAgPHN2ZyB3aWR0aD1cIjlcIiBoZWlnaHQ9XCI5XCIgdmlld0JveD1cIjAgMCA5IDlcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICA8Y2lyY2xlIGN4PVwiNC40OTE2MlwiIGN5PVwiNC4wNjE5M1wiIHI9XCIzLjk5MTYyXCIgZmlsbD1cIiMxRDI1MkRcIi8+XHJcbiAgICAgIDwvc3ZnPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+LS0+XHJcbiJdfQ==
|