@seniorsistemas/components-ai 1.3.0-master-a45660a0 → 1.3.0-master-e23db6ad
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/esm2022/lib/components/dynamic-form/dynamic-form.component.mjs +15 -4
- package/esm2022/lib/components/dynamic-form/fields/dynamic-field-image.component.mjs +7 -4
- package/esm2022/lib/components/dynamic-form/models/dynamic-form.models.mjs +1 -1
- package/fesm2022/seniorsistemas-components-ai.mjs +20 -6
- package/fesm2022/seniorsistemas-components-ai.mjs.map +1 -1
- package/lib/components/dynamic-form/dynamic-form.component.d.ts +2 -1
- package/lib/components/dynamic-form/models/dynamic-form.models.d.ts +4 -0
- package/package.json +1 -1
|
@@ -422,6 +422,13 @@ export class DynamicFormComponent {
|
|
|
422
422
|
const dependentFieldValue = this.form.get(field.visibleWhen.field)?.value;
|
|
423
423
|
return dependentFieldValue === field.visibleWhen.value;
|
|
424
424
|
}
|
|
425
|
+
isSectionVisible(section) {
|
|
426
|
+
if (!section.visibleWhen) {
|
|
427
|
+
return true;
|
|
428
|
+
}
|
|
429
|
+
const dependentFieldValue = this.form.get(section.visibleWhen.field)?.value;
|
|
430
|
+
return dependentFieldValue === section.visibleWhen.value;
|
|
431
|
+
}
|
|
425
432
|
isFieldDisabled(field) {
|
|
426
433
|
if (field.disabled) {
|
|
427
434
|
return true;
|
|
@@ -440,7 +447,11 @@ export class DynamicFormComponent {
|
|
|
440
447
|
const visibleWatchedFields = [...new Set(visibleDependentFields.map(field => field.visibleWhen.field))];
|
|
441
448
|
const disabledDependentFields = this.allFields.filter(field => field.disabledWhen);
|
|
442
449
|
const disabledWatchedFields = [...new Set(disabledDependentFields.map(field => field.disabledWhen.field))];
|
|
443
|
-
|
|
450
|
+
// Also watch fields that control section visibility
|
|
451
|
+
const sectionVisibleFields = this.formSections
|
|
452
|
+
.filter(section => section.visibleWhen)
|
|
453
|
+
.map(section => section.visibleWhen.field);
|
|
454
|
+
const allWatchedFields = [...new Set([...visibleWatchedFields, ...disabledWatchedFields, ...sectionVisibleFields])];
|
|
444
455
|
allWatchedFields.forEach(fieldName => {
|
|
445
456
|
const control = this.form.get(fieldName);
|
|
446
457
|
if (control) {
|
|
@@ -695,7 +706,7 @@ export class DynamicFormComponent {
|
|
|
695
706
|
return String(value);
|
|
696
707
|
}
|
|
697
708
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFormComponent, deps: [{ token: i1.FormBuilder }, { token: i2.TranslationService }, { token: i3.MaskService }, { token: i4.LocaleService }], target: i0.ɵɵFactoryTarget.Component });
|
|
698
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DynamicFormComponent, isStandalone: true, selector: "sia-dynamic-form", inputs: { formFields: "formFields", formSections: "formSections", fixedFilters: "fixedFilters", filterSections: "filterSections", entityData: "entityData", mode: "mode", displayMode: "displayMode", visible: "visible", dialogConfig: "dialogConfig", drawerConfig: "drawerConfig", showSubmitButton: "showSubmitButton", showCancelButton: "showCancelButton", submitButtonLabel: "submitButtonLabel", cancelButtonLabel: "cancelButtonLabel", submitButtonIcon: "submitButtonIcon", cancelButtonIcon: "cancelButtonIcon" }, outputs: { formReady: "formReady", formSubmit: "formSubmit", visibleChange: "visibleChange", onCancel: "onCancel", fieldSave: "fieldSave" }, usesOnChanges: true, ngImport: i0, template: "<!-- Modo Inline (padr\u00E3o) -->\n<ng-container *ngIf=\"isInlineMode\">\n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n</ng-container>\n\n<!-- Modo Dialog -->\n<p-dialog\n *ngIf=\"isDialogMode\"\n [(visible)]=\"visible\"\n [header]=\"dialogHeader | translate\"\n [modal]=\"true\"\n [style]=\"{ width: dialogWidth }\"\n [draggable]=\"dialogDraggable\"\n [resizable]=\"dialogResizable\"\n [maximizable]=\"dialogMaximizable\"\n [closeOnEscape]=\"dialogCloseOnEscape\"\n [dismissableMask]=\"dialogDismissableMask\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"dialog-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-dialog>\n\n<!-- Modo Drawer -->\n<p-drawer\n *ngIf=\"isDrawerMode\"\n [(visible)]=\"visible\"\n [header]=\"drawerHeader | translate\"\n [position]=\"drawerPosition\"\n [style]=\"drawerStyle\"\n [showCloseIcon]=\"drawerShowCloseIcon\"\n [closeOnEscape]=\"drawerCloseOnEscape\"\n [modal]=\"drawerDismissable\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"drawer-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-drawer>\n\n<!-- Template do Formul\u00E1rio (reutiliz\u00E1vel) -->\n<ng-template #formContent>\n <form [formGroup]=\"form\" class=\"dynamic-form\">\n \n <!-- Filtros Fixos (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFixedFilters\" class=\"fixed-filters-section\">\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of fixedFilters\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Campos Diretos (sem se\u00E7\u00E3o) -->\n <div *ngIf=\"hasFields\">\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Se\u00E7\u00F5es de Campos (modo form) -->\n <div *ngIf=\"hasSections\" class=\"sections-container\">\n <p-panel \n *ngFor=\"let section of formSections\"\n [toggleable]=\"section.toggleable !== false\"\n [collapsed]=\"section.collapsed || false\"\n [styleClass]=\"'section-panel'\">\n \n <ng-template pTemplate=\"header\">\n <div class=\"section-header\">\n <i *ngIf=\"section.icon\" [class]=\"section.icon + ' section-icon'\"></i>\n <span class=\"section-title\">{{ section.title }}</span>\n </div>\n </ng-template>\n\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Se\u00E7\u00F5es de Filtros (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFilterSections\" class=\"filter-sections-container\">\n <p-panel \n *ngFor=\"let section of filterSections\"\n [header]=\"section.title\"\n [toggleable]=\"true\"\n [collapsed]=\"true\">\n\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Bot\u00F5es inline (apenas para modo inline) -->\n <div *ngIf=\"isInlineMode && (showSubmitButton || showCancelButton)\" class=\"form-actions\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n\n </form>\n</ng-template>\n\n<!-- Template de Campo (reutiliz\u00E1vel) -->\n<ng-template #fieldTemplate let-field=\"field\">\n <!-- Text Field -->\n <sia-dynamic-field-text\n *ngIf=\"field.type === 'text'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-text>\n\n <!-- Textarea Field -->\n <sia-dynamic-field-textarea\n *ngIf=\"field.type === 'textarea'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-textarea>\n\n <!-- Number Field -->\n <sia-dynamic-field-number\n *ngIf=\"field.type === 'number'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-number>\n\n <!-- Date Field -->\n <sia-dynamic-field-date\n *ngIf=\"field.type === 'date'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-date>\n\n <!-- Datetime Field -->\n <sia-dynamic-field-datetime\n *ngIf=\"field.type === 'datetime'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-datetime>\n\n <!-- Dropdown/Enum Field -->\n <sia-dynamic-field-dropdown\n *ngIf=\"field.type === 'dropdown' || field.type === 'enum'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-dropdown>\n\n <!-- Lookup Field -->\n <sia-dynamic-field-lookup\n *ngIf=\"field.type === 'lookup'\"\n [field]=\"field\"\n [form]=\"form\"\n [formGroup]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-lookup>\n\n <!-- Time Field -->\n <sia-dynamic-field-time\n *ngIf=\"field.type === 'time'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-time>\n\n <!-- Checkbox Field -->\n <sia-dynamic-field-checkbox\n *ngIf=\"field.type === 'checkbox'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-checkbox>\n\n <!-- MultiSelect Field -->\n <sia-dynamic-field-multiselect\n *ngIf=\"field.type === 'multiselect'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-multiselect>\n\n <!-- Image Field -->\n <sia-dynamic-field-image\n *ngIf=\"field.type === 'image'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-image>\n</ng-template>\n\n\n<!-- Template de Campo Inline Edit -->\n<ng-template #inlineEditFieldTemplate let-field=\"field\">\n <div class=\"edit-inline-field\">\n <label class=\"field-label\">{{ field.label | translate }}</label>\n \n <!-- Display Mode -->\n <div class=\"field-display\" \n *ngIf=\"!isFieldEditing(field.field)\" \n (click)=\"startEditField(field.field)\"\n [class.disabled]=\"field.disabled\">\n <span class=\"display-value\" \n [attr.data-placeholder]=\"field.placeholder || ('crmx.business.not_informed' | translate)\">\n {{ getFieldDisplayValue(field.field) }}\n </span>\n <i class=\"pi pi-pencil edit-icon\" *ngIf=\"!field.disabled\"></i>\n </div>\n \n <!-- Edit Mode -->\n <div class=\"field-edit\" *ngIf=\"isFieldEditing(field.field)\">\n <div class=\"input-container\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"edit-actions\">\n <p-button \n type=\"button\" \n icon=\"pi pi-check\" \n [rounded]=\"true\"\n severity=\"primary\"\n (onClick)=\"saveInlineField(field.field)\" \n [loading]=\"savingField\"\n [disabled]=\"form.get(field.field)?.invalid\">\n </p-button>\n <p-button \n type=\"button\" \n icon=\"pi pi-times\" \n [rounded]=\"true\"\n severity=\"secondary\"\n (onClick)=\"cancelInlineEdit()\"\n [disabled]=\"savingField\">\n </p-button>\n </div>\n \n <!-- Error Message -->\n <div class=\"field-error\" *ngIf=\"form.get(field.field)?.invalid && form.get(field.field)?.touched\">\n <small class=\"p-error\">\n {{ form.get(field.field)?.errors?.['required'] ? ('crmx.business.required_field' | translate) : '' }}\n </small>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".dynamic-form{width:100%}.dynamic-form .grid{display:grid;grid-template-columns:repeat(12,1fr);gap:1rem}.dynamic-form .grid>div.col-1{grid-column:span 1}.dynamic-form .grid>div.col-2{grid-column:span 2}.dynamic-form .grid>div.col-3{grid-column:span 3}.dynamic-form .grid>div.col-4{grid-column:span 4}.dynamic-form .grid>div.col-5{grid-column:span 5}.dynamic-form .grid>div.col-6{grid-column:span 6}.dynamic-form .grid>div.col-7{grid-column:span 7}.dynamic-form .grid>div.col-8{grid-column:span 8}.dynamic-form .grid>div.col-9{grid-column:span 9}.dynamic-form .grid>div.col-10{grid-column:span 10}.dynamic-form .grid>div.col-11{grid-column:span 11}.dynamic-form .grid>div.col-12{grid-column:span 12}@media (max-width: 575.98px){.dynamic-form .grid>div.col-xs-1{grid-column:span 1}.dynamic-form .grid>div.col-xs-2{grid-column:span 2}.dynamic-form .grid>div.col-xs-3{grid-column:span 3}.dynamic-form .grid>div.col-xs-4{grid-column:span 4}.dynamic-form .grid>div.col-xs-5{grid-column:span 5}.dynamic-form .grid>div.col-xs-6{grid-column:span 6}.dynamic-form .grid>div.col-xs-7{grid-column:span 7}.dynamic-form .grid>div.col-xs-8{grid-column:span 8}.dynamic-form .grid>div.col-xs-9{grid-column:span 9}.dynamic-form .grid>div.col-xs-10{grid-column:span 10}.dynamic-form .grid>div.col-xs-11{grid-column:span 11}.dynamic-form .grid>div.col-xs-12{grid-column:span 12}}@media (min-width: 576px){.dynamic-form .grid>div.col-sm-1{grid-column:span 1}.dynamic-form .grid>div.col-sm-2{grid-column:span 2}.dynamic-form .grid>div.col-sm-3{grid-column:span 3}.dynamic-form .grid>div.col-sm-4{grid-column:span 4}.dynamic-form .grid>div.col-sm-5{grid-column:span 5}.dynamic-form .grid>div.col-sm-6{grid-column:span 6}.dynamic-form .grid>div.col-sm-7{grid-column:span 7}.dynamic-form .grid>div.col-sm-8{grid-column:span 8}.dynamic-form .grid>div.col-sm-9{grid-column:span 9}.dynamic-form .grid>div.col-sm-10{grid-column:span 10}.dynamic-form .grid>div.col-sm-11{grid-column:span 11}.dynamic-form .grid>div.col-sm-12{grid-column:span 12}}@media (min-width: 768px){.dynamic-form .grid>div.col-md-1{grid-column:span 1}.dynamic-form .grid>div.col-md-2{grid-column:span 2}.dynamic-form .grid>div.col-md-3{grid-column:span 3}.dynamic-form .grid>div.col-md-4{grid-column:span 4}.dynamic-form .grid>div.col-md-5{grid-column:span 5}.dynamic-form .grid>div.col-md-6{grid-column:span 6}.dynamic-form .grid>div.col-md-7{grid-column:span 7}.dynamic-form .grid>div.col-md-8{grid-column:span 8}.dynamic-form .grid>div.col-md-9{grid-column:span 9}.dynamic-form .grid>div.col-md-10{grid-column:span 10}.dynamic-form .grid>div.col-md-11{grid-column:span 11}.dynamic-form .grid>div.col-md-12{grid-column:span 12}}@media (min-width: 992px){.dynamic-form .grid>div.col-lg-1{grid-column:span 1}.dynamic-form .grid>div.col-lg-2{grid-column:span 2}.dynamic-form .grid>div.col-lg-3{grid-column:span 3}.dynamic-form .grid>div.col-lg-4{grid-column:span 4}.dynamic-form .grid>div.col-lg-5{grid-column:span 5}.dynamic-form .grid>div.col-lg-6{grid-column:span 6}.dynamic-form .grid>div.col-lg-7{grid-column:span 7}.dynamic-form .grid>div.col-lg-8{grid-column:span 8}.dynamic-form .grid>div.col-lg-9{grid-column:span 9}.dynamic-form .grid>div.col-lg-10{grid-column:span 10}.dynamic-form .grid>div.col-lg-11{grid-column:span 11}.dynamic-form .grid>div.col-lg-12{grid-column:span 12}}@media (min-width: 1200px){.dynamic-form .grid>div.col-xl-1{grid-column:span 1}.dynamic-form .grid>div.col-xl-2{grid-column:span 2}.dynamic-form .grid>div.col-xl-3{grid-column:span 3}.dynamic-form .grid>div.col-xl-4{grid-column:span 4}.dynamic-form .grid>div.col-xl-5{grid-column:span 5}.dynamic-form .grid>div.col-xl-6{grid-column:span 6}.dynamic-form .grid>div.col-xl-7{grid-column:span 7}.dynamic-form .grid>div.col-xl-8{grid-column:span 8}.dynamic-form .grid>div.col-xl-9{grid-column:span 9}.dynamic-form .grid>div.col-xl-10{grid-column:span 10}.dynamic-form .grid>div.col-xl-11{grid-column:span 11}.dynamic-form .grid>div.col-xl-12{grid-column:span 12}}.dynamic-form .sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header{background-color:var(--surface-50);border-color:var(--surface-200)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header{display:flex;align-items:center;gap:.5rem;width:100%}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-icon{font-size:1.1rem;color:var(--primary-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-title{font-weight:600;color:var(--text-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-content{padding:1.5rem}.dynamic-form .fixed-filters-section{margin-bottom:1rem;padding-bottom:1rem;border-bottom:1px solid var(--surface-200)}.dynamic-form .filter-sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .form-actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--surface-200)}.dialog-footer{display:flex;justify-content:flex-end;gap:.5rem}.drawer-footer{display:flex;justify-content:flex-end;gap:.5rem;padding:1rem;border-top:1px solid var(--surface-200)}.inline-edit-fields{display:flex;flex-direction:column;gap:1rem}.inline-edit-fields .inline-edit-field{display:flex;flex-direction:column;gap:.25rem}.inline-edit-fields .inline-edit-field .field-label{font-weight:500;font-size:.875rem;color:var(--text-color-secondary);margin-bottom:.25rem}.inline-edit-fields .inline-edit-field .field-display{display:flex;align-items:center;justify-content:space-between;padding:.75rem;background-color:var(--surface-50);border:1px solid var(--surface-200);border-radius:var(--border-radius);cursor:pointer;transition:all .2s ease;min-height:42px}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled){background-color:var(--surface-100);border-color:var(--primary-color)}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled) .edit-icon{opacity:1}.inline-edit-fields .inline-edit-field .field-display.disabled{cursor:not-allowed;opacity:.6}.inline-edit-fields .inline-edit-field .field-display .display-value{flex:1;color:var(--text-color)}.inline-edit-fields .inline-edit-field .field-display .display-value:empty:before{content:attr(data-placeholder);color:var(--text-color-secondary);font-style:italic}.inline-edit-fields .inline-edit-field .field-display .edit-icon{color:var(--primary-color);font-size:.875rem;opacity:.5;transition:opacity .2s ease}.inline-edit-fields .inline-edit-field .field-edit{display:flex;flex-direction:column;gap:.5rem}.inline-edit-fields .inline-edit-field .field-edit .input-container{flex:1}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field{gap:0}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field label{display:none}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field small.p-error{display:none}.inline-edit-fields .inline-edit-field .field-edit .edit-actions{display:flex;gap:.5rem;justify-content:flex-end}.inline-edit-fields .inline-edit-field .field-edit .field-error small.p-error{color:var(--p-red-500);font-size:.875rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: PanelModule }, { kind: "component", type: i6.Panel, selector: "p-panel", inputs: ["toggleable", "header", "collapsed", "style", "styleClass", "iconPos", "expandIcon", "collapseIcon", "showHeader", "toggler", "transitionOptions", "toggleButtonProps"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "directive", type: i7.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i8.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: DrawerModule }, { kind: "component", type: i9.Drawer, selector: "p-drawer", inputs: ["appendTo", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "closeButtonProps", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen", "header", "maskStyle", "closable"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i10.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: DynamicFieldTextComponent, selector: "sia-dynamic-field-text" }, { kind: "component", type: DynamicFieldNumberComponent, selector: "sia-dynamic-field-number" }, { kind: "component", type: DynamicFieldDateComponent, selector: "sia-dynamic-field-date" }, { kind: "component", type: DynamicFieldDatetimeComponent, selector: "sia-dynamic-field-datetime" }, { kind: "component", type: DynamicFieldDropdownComponent, selector: "sia-dynamic-field-dropdown" }, { kind: "component", type: DynamicFieldLookupComponent, selector: "sia-dynamic-field-lookup", inputs: ["field", "form", "formGroup", "mode"] }, { kind: "component", type: DynamicFieldTextareaComponent, selector: "sia-dynamic-field-textarea" }, { kind: "component", type: DynamicFieldTimeComponent, selector: "sia-dynamic-field-time" }, { kind: "component", type: DynamicFieldCheckboxComponent, selector: "sia-dynamic-field-checkbox" }, { kind: "component", type: DynamicFieldMultiselectComponent, selector: "sia-dynamic-field-multiselect" }, { kind: "component", type: DynamicFieldImageComponent, selector: "sia-dynamic-field-image" }] });
|
|
709
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DynamicFormComponent, isStandalone: true, selector: "sia-dynamic-form", inputs: { formFields: "formFields", formSections: "formSections", fixedFilters: "fixedFilters", filterSections: "filterSections", entityData: "entityData", mode: "mode", displayMode: "displayMode", visible: "visible", dialogConfig: "dialogConfig", drawerConfig: "drawerConfig", showSubmitButton: "showSubmitButton", showCancelButton: "showCancelButton", submitButtonLabel: "submitButtonLabel", cancelButtonLabel: "cancelButtonLabel", submitButtonIcon: "submitButtonIcon", cancelButtonIcon: "cancelButtonIcon" }, outputs: { formReady: "formReady", formSubmit: "formSubmit", visibleChange: "visibleChange", onCancel: "onCancel", fieldSave: "fieldSave" }, usesOnChanges: true, ngImport: i0, template: "<!-- Modo Inline (padr\u00E3o) -->\n<ng-container *ngIf=\"isInlineMode\">\n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n</ng-container>\n\n<!-- Modo Dialog -->\n<p-dialog\n *ngIf=\"isDialogMode\"\n [(visible)]=\"visible\"\n [header]=\"dialogHeader | translate\"\n [modal]=\"true\"\n [style]=\"{ width: dialogWidth }\"\n [draggable]=\"dialogDraggable\"\n [resizable]=\"dialogResizable\"\n [maximizable]=\"dialogMaximizable\"\n [closeOnEscape]=\"dialogCloseOnEscape\"\n [dismissableMask]=\"dialogDismissableMask\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"dialog-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-dialog>\n\n<!-- Modo Drawer -->\n<p-drawer\n *ngIf=\"isDrawerMode\"\n [(visible)]=\"visible\"\n [header]=\"drawerHeader | translate\"\n [position]=\"drawerPosition\"\n [style]=\"drawerStyle\"\n [showCloseIcon]=\"drawerShowCloseIcon\"\n [closeOnEscape]=\"drawerCloseOnEscape\"\n [modal]=\"drawerDismissable\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"drawer-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-drawer>\n\n<!-- Template do Formul\u00E1rio (reutiliz\u00E1vel) -->\n<ng-template #formContent>\n <form [formGroup]=\"form\" class=\"dynamic-form\">\n \n <!-- Filtros Fixos (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFixedFilters\" class=\"fixed-filters-section\">\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of fixedFilters\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Campos Diretos (sem se\u00E7\u00E3o) -->\n <div *ngIf=\"hasFields\">\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Se\u00E7\u00F5es de Campos (modo form) -->\n <div *ngIf=\"hasSections\" class=\"sections-container\">\n <p-panel \n *ngFor=\"let section of formSections\"\n [toggleable]=\"section.toggleable !== false\"\n [collapsed]=\"section.collapsed || false\"\n [styleClass]=\"'section-panel'\"\n [style.display]=\"isSectionVisible(section) ? '' : 'none'\">\n \n <ng-template pTemplate=\"header\">\n <div class=\"section-header\">\n <i *ngIf=\"section.icon\" [class]=\"section.icon + ' section-icon'\"></i>\n <span class=\"section-title\">{{ section.title }}</span>\n </div>\n </ng-template>\n\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Se\u00E7\u00F5es de Filtros (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFilterSections\" class=\"filter-sections-container\">\n <p-panel \n *ngFor=\"let section of filterSections\"\n [header]=\"section.title\"\n [toggleable]=\"true\"\n [collapsed]=\"true\">\n\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Custom content projection -->\n <ng-content></ng-content>\n\n <!-- Bot\u00F5es inline (apenas para modo inline) -->\n <div *ngIf=\"isInlineMode && (showSubmitButton || showCancelButton)\" class=\"form-actions\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n\n </form>\n</ng-template>\n\n<!-- Template de Campo (reutiliz\u00E1vel) -->\n<ng-template #fieldTemplate let-field=\"field\">\n <!-- Text Field -->\n <sia-dynamic-field-text\n *ngIf=\"field.type === 'text'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-text>\n\n <!-- Textarea Field -->\n <sia-dynamic-field-textarea\n *ngIf=\"field.type === 'textarea'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-textarea>\n\n <!-- Number Field -->\n <sia-dynamic-field-number\n *ngIf=\"field.type === 'number'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-number>\n\n <!-- Date Field -->\n <sia-dynamic-field-date\n *ngIf=\"field.type === 'date'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-date>\n\n <!-- Datetime Field -->\n <sia-dynamic-field-datetime\n *ngIf=\"field.type === 'datetime'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-datetime>\n\n <!-- Dropdown/Enum Field -->\n <sia-dynamic-field-dropdown\n *ngIf=\"field.type === 'dropdown' || field.type === 'enum'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-dropdown>\n\n <!-- Lookup Field -->\n <sia-dynamic-field-lookup\n *ngIf=\"field.type === 'lookup'\"\n [field]=\"field\"\n [form]=\"form\"\n [formGroup]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-lookup>\n\n <!-- Time Field -->\n <sia-dynamic-field-time\n *ngIf=\"field.type === 'time'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-time>\n\n <!-- Checkbox Field -->\n <sia-dynamic-field-checkbox\n *ngIf=\"field.type === 'checkbox'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-checkbox>\n\n <!-- MultiSelect Field -->\n <sia-dynamic-field-multiselect\n *ngIf=\"field.type === 'multiselect'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-multiselect>\n\n <!-- Image Field -->\n <sia-dynamic-field-image\n *ngIf=\"field.type === 'image'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-image>\n</ng-template>\n\n\n<!-- Template de Campo Inline Edit -->\n<ng-template #inlineEditFieldTemplate let-field=\"field\">\n <div class=\"edit-inline-field\">\n <label class=\"field-label\">{{ field.label | translate }}</label>\n \n <!-- Display Mode -->\n <div class=\"field-display\" \n *ngIf=\"!isFieldEditing(field.field)\" \n (click)=\"startEditField(field.field)\"\n [class.disabled]=\"field.disabled\">\n <span class=\"display-value\" \n [attr.data-placeholder]=\"field.placeholder || ('crmx.business.not_informed' | translate)\">\n {{ getFieldDisplayValue(field.field) }}\n </span>\n <i class=\"pi pi-pencil edit-icon\" *ngIf=\"!field.disabled\"></i>\n </div>\n \n <!-- Edit Mode -->\n <div class=\"field-edit\" *ngIf=\"isFieldEditing(field.field)\">\n <div class=\"input-container\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"edit-actions\">\n <p-button \n type=\"button\" \n icon=\"pi pi-check\" \n [rounded]=\"true\"\n severity=\"primary\"\n (onClick)=\"saveInlineField(field.field)\" \n [loading]=\"savingField\"\n [disabled]=\"form.get(field.field)?.invalid\">\n </p-button>\n <p-button \n type=\"button\" \n icon=\"pi pi-times\" \n [rounded]=\"true\"\n severity=\"secondary\"\n (onClick)=\"cancelInlineEdit()\"\n [disabled]=\"savingField\">\n </p-button>\n </div>\n \n <!-- Error Message -->\n <div class=\"field-error\" *ngIf=\"form.get(field.field)?.invalid && form.get(field.field)?.touched\">\n <small class=\"p-error\">\n {{ form.get(field.field)?.errors?.['required'] ? ('crmx.business.required_field' | translate) : '' }}\n </small>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".dynamic-form{width:100%}.dynamic-form .grid{display:grid;grid-template-columns:repeat(12,1fr);gap:1rem}.dynamic-form .grid>div.col-1{grid-column:span 1}.dynamic-form .grid>div.col-2{grid-column:span 2}.dynamic-form .grid>div.col-3{grid-column:span 3}.dynamic-form .grid>div.col-4{grid-column:span 4}.dynamic-form .grid>div.col-5{grid-column:span 5}.dynamic-form .grid>div.col-6{grid-column:span 6}.dynamic-form .grid>div.col-7{grid-column:span 7}.dynamic-form .grid>div.col-8{grid-column:span 8}.dynamic-form .grid>div.col-9{grid-column:span 9}.dynamic-form .grid>div.col-10{grid-column:span 10}.dynamic-form .grid>div.col-11{grid-column:span 11}.dynamic-form .grid>div.col-12{grid-column:span 12}@media (max-width: 575.98px){.dynamic-form .grid>div.col-xs-1{grid-column:span 1}.dynamic-form .grid>div.col-xs-2{grid-column:span 2}.dynamic-form .grid>div.col-xs-3{grid-column:span 3}.dynamic-form .grid>div.col-xs-4{grid-column:span 4}.dynamic-form .grid>div.col-xs-5{grid-column:span 5}.dynamic-form .grid>div.col-xs-6{grid-column:span 6}.dynamic-form .grid>div.col-xs-7{grid-column:span 7}.dynamic-form .grid>div.col-xs-8{grid-column:span 8}.dynamic-form .grid>div.col-xs-9{grid-column:span 9}.dynamic-form .grid>div.col-xs-10{grid-column:span 10}.dynamic-form .grid>div.col-xs-11{grid-column:span 11}.dynamic-form .grid>div.col-xs-12{grid-column:span 12}}@media (min-width: 576px){.dynamic-form .grid>div.col-sm-1{grid-column:span 1}.dynamic-form .grid>div.col-sm-2{grid-column:span 2}.dynamic-form .grid>div.col-sm-3{grid-column:span 3}.dynamic-form .grid>div.col-sm-4{grid-column:span 4}.dynamic-form .grid>div.col-sm-5{grid-column:span 5}.dynamic-form .grid>div.col-sm-6{grid-column:span 6}.dynamic-form .grid>div.col-sm-7{grid-column:span 7}.dynamic-form .grid>div.col-sm-8{grid-column:span 8}.dynamic-form .grid>div.col-sm-9{grid-column:span 9}.dynamic-form .grid>div.col-sm-10{grid-column:span 10}.dynamic-form .grid>div.col-sm-11{grid-column:span 11}.dynamic-form .grid>div.col-sm-12{grid-column:span 12}}@media (min-width: 768px){.dynamic-form .grid>div.col-md-1{grid-column:span 1}.dynamic-form .grid>div.col-md-2{grid-column:span 2}.dynamic-form .grid>div.col-md-3{grid-column:span 3}.dynamic-form .grid>div.col-md-4{grid-column:span 4}.dynamic-form .grid>div.col-md-5{grid-column:span 5}.dynamic-form .grid>div.col-md-6{grid-column:span 6}.dynamic-form .grid>div.col-md-7{grid-column:span 7}.dynamic-form .grid>div.col-md-8{grid-column:span 8}.dynamic-form .grid>div.col-md-9{grid-column:span 9}.dynamic-form .grid>div.col-md-10{grid-column:span 10}.dynamic-form .grid>div.col-md-11{grid-column:span 11}.dynamic-form .grid>div.col-md-12{grid-column:span 12}}@media (min-width: 992px){.dynamic-form .grid>div.col-lg-1{grid-column:span 1}.dynamic-form .grid>div.col-lg-2{grid-column:span 2}.dynamic-form .grid>div.col-lg-3{grid-column:span 3}.dynamic-form .grid>div.col-lg-4{grid-column:span 4}.dynamic-form .grid>div.col-lg-5{grid-column:span 5}.dynamic-form .grid>div.col-lg-6{grid-column:span 6}.dynamic-form .grid>div.col-lg-7{grid-column:span 7}.dynamic-form .grid>div.col-lg-8{grid-column:span 8}.dynamic-form .grid>div.col-lg-9{grid-column:span 9}.dynamic-form .grid>div.col-lg-10{grid-column:span 10}.dynamic-form .grid>div.col-lg-11{grid-column:span 11}.dynamic-form .grid>div.col-lg-12{grid-column:span 12}}@media (min-width: 1200px){.dynamic-form .grid>div.col-xl-1{grid-column:span 1}.dynamic-form .grid>div.col-xl-2{grid-column:span 2}.dynamic-form .grid>div.col-xl-3{grid-column:span 3}.dynamic-form .grid>div.col-xl-4{grid-column:span 4}.dynamic-form .grid>div.col-xl-5{grid-column:span 5}.dynamic-form .grid>div.col-xl-6{grid-column:span 6}.dynamic-form .grid>div.col-xl-7{grid-column:span 7}.dynamic-form .grid>div.col-xl-8{grid-column:span 8}.dynamic-form .grid>div.col-xl-9{grid-column:span 9}.dynamic-form .grid>div.col-xl-10{grid-column:span 10}.dynamic-form .grid>div.col-xl-11{grid-column:span 11}.dynamic-form .grid>div.col-xl-12{grid-column:span 12}}.dynamic-form .sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header{background-color:var(--surface-50);border-color:var(--surface-200)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header{display:flex;align-items:center;gap:.5rem;width:100%}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-icon{font-size:1.1rem;color:var(--primary-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-title{font-weight:600;color:var(--text-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-content{padding:1.5rem}.dynamic-form .fixed-filters-section{margin-bottom:1rem;padding-bottom:1rem;border-bottom:1px solid var(--surface-200)}.dynamic-form .filter-sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .form-actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--surface-200)}.dialog-footer{display:flex;justify-content:flex-end;gap:.5rem}.drawer-footer{display:flex;justify-content:flex-end;gap:.5rem;padding:1rem;border-top:1px solid var(--surface-200)}.inline-edit-fields{display:flex;flex-direction:column;gap:1rem}.inline-edit-fields .inline-edit-field{display:flex;flex-direction:column;gap:.25rem}.inline-edit-fields .inline-edit-field .field-label{font-weight:500;font-size:.875rem;color:var(--text-color-secondary);margin-bottom:.25rem}.inline-edit-fields .inline-edit-field .field-display{display:flex;align-items:center;justify-content:space-between;padding:.75rem;background-color:var(--surface-50);border:1px solid var(--surface-200);border-radius:var(--border-radius);cursor:pointer;transition:all .2s ease;min-height:42px}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled){background-color:var(--surface-100);border-color:var(--primary-color)}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled) .edit-icon{opacity:1}.inline-edit-fields .inline-edit-field .field-display.disabled{cursor:not-allowed;opacity:.6}.inline-edit-fields .inline-edit-field .field-display .display-value{flex:1;color:var(--text-color)}.inline-edit-fields .inline-edit-field .field-display .display-value:empty:before{content:attr(data-placeholder);color:var(--text-color-secondary);font-style:italic}.inline-edit-fields .inline-edit-field .field-display .edit-icon{color:var(--primary-color);font-size:.875rem;opacity:.5;transition:opacity .2s ease}.inline-edit-fields .inline-edit-field .field-edit{display:flex;flex-direction:column;gap:.5rem}.inline-edit-fields .inline-edit-field .field-edit .input-container{flex:1}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field{gap:0}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field label{display:none}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field small.p-error{display:none}.inline-edit-fields .inline-edit-field .field-edit .edit-actions{display:flex;gap:.5rem;justify-content:flex-end}.inline-edit-fields .inline-edit-field .field-edit .field-error small.p-error{color:var(--p-red-500);font-size:.875rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: PanelModule }, { kind: "component", type: i6.Panel, selector: "p-panel", inputs: ["toggleable", "header", "collapsed", "style", "styleClass", "iconPos", "expandIcon", "collapseIcon", "showHeader", "toggler", "transitionOptions", "toggleButtonProps"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "directive", type: i7.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i8.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: DrawerModule }, { kind: "component", type: i9.Drawer, selector: "p-drawer", inputs: ["appendTo", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "closeButtonProps", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen", "header", "maskStyle", "closable"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i10.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: DynamicFieldTextComponent, selector: "sia-dynamic-field-text" }, { kind: "component", type: DynamicFieldNumberComponent, selector: "sia-dynamic-field-number" }, { kind: "component", type: DynamicFieldDateComponent, selector: "sia-dynamic-field-date" }, { kind: "component", type: DynamicFieldDatetimeComponent, selector: "sia-dynamic-field-datetime" }, { kind: "component", type: DynamicFieldDropdownComponent, selector: "sia-dynamic-field-dropdown" }, { kind: "component", type: DynamicFieldLookupComponent, selector: "sia-dynamic-field-lookup", inputs: ["field", "form", "formGroup", "mode"] }, { kind: "component", type: DynamicFieldTextareaComponent, selector: "sia-dynamic-field-textarea" }, { kind: "component", type: DynamicFieldTimeComponent, selector: "sia-dynamic-field-time" }, { kind: "component", type: DynamicFieldCheckboxComponent, selector: "sia-dynamic-field-checkbox" }, { kind: "component", type: DynamicFieldMultiselectComponent, selector: "sia-dynamic-field-multiselect" }, { kind: "component", type: DynamicFieldImageComponent, selector: "sia-dynamic-field-image" }] });
|
|
699
710
|
}
|
|
700
711
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFormComponent, decorators: [{
|
|
701
712
|
type: Component,
|
|
@@ -718,7 +729,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
718
729
|
DynamicFieldCheckboxComponent,
|
|
719
730
|
DynamicFieldMultiselectComponent,
|
|
720
731
|
DynamicFieldImageComponent
|
|
721
|
-
], template: "<!-- Modo Inline (padr\u00E3o) -->\n<ng-container *ngIf=\"isInlineMode\">\n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n</ng-container>\n\n<!-- Modo Dialog -->\n<p-dialog\n *ngIf=\"isDialogMode\"\n [(visible)]=\"visible\"\n [header]=\"dialogHeader | translate\"\n [modal]=\"true\"\n [style]=\"{ width: dialogWidth }\"\n [draggable]=\"dialogDraggable\"\n [resizable]=\"dialogResizable\"\n [maximizable]=\"dialogMaximizable\"\n [closeOnEscape]=\"dialogCloseOnEscape\"\n [dismissableMask]=\"dialogDismissableMask\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"dialog-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-dialog>\n\n<!-- Modo Drawer -->\n<p-drawer\n *ngIf=\"isDrawerMode\"\n [(visible)]=\"visible\"\n [header]=\"drawerHeader | translate\"\n [position]=\"drawerPosition\"\n [style]=\"drawerStyle\"\n [showCloseIcon]=\"drawerShowCloseIcon\"\n [closeOnEscape]=\"drawerCloseOnEscape\"\n [modal]=\"drawerDismissable\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"drawer-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-drawer>\n\n<!-- Template do Formul\u00E1rio (reutiliz\u00E1vel) -->\n<ng-template #formContent>\n <form [formGroup]=\"form\" class=\"dynamic-form\">\n \n <!-- Filtros Fixos (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFixedFilters\" class=\"fixed-filters-section\">\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of fixedFilters\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Campos Diretos (sem se\u00E7\u00E3o) -->\n <div *ngIf=\"hasFields\">\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Se\u00E7\u00F5es de Campos (modo form) -->\n <div *ngIf=\"hasSections\" class=\"sections-container\">\n <p-panel \n *ngFor=\"let section of formSections\"\n [toggleable]=\"section.toggleable !== false\"\n [collapsed]=\"section.collapsed || false\"\n [styleClass]=\"'section-panel'\">\n \n <ng-template pTemplate=\"header\">\n <div class=\"section-header\">\n <i *ngIf=\"section.icon\" [class]=\"section.icon + ' section-icon'\"></i>\n <span class=\"section-title\">{{ section.title }}</span>\n </div>\n </ng-template>\n\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Se\u00E7\u00F5es de Filtros (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFilterSections\" class=\"filter-sections-container\">\n <p-panel \n *ngFor=\"let section of filterSections\"\n [header]=\"section.title\"\n [toggleable]=\"true\"\n [collapsed]=\"true\">\n\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Bot\u00F5es inline (apenas para modo inline) -->\n <div *ngIf=\"isInlineMode && (showSubmitButton || showCancelButton)\" class=\"form-actions\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n\n </form>\n</ng-template>\n\n<!-- Template de Campo (reutiliz\u00E1vel) -->\n<ng-template #fieldTemplate let-field=\"field\">\n <!-- Text Field -->\n <sia-dynamic-field-text\n *ngIf=\"field.type === 'text'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-text>\n\n <!-- Textarea Field -->\n <sia-dynamic-field-textarea\n *ngIf=\"field.type === 'textarea'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-textarea>\n\n <!-- Number Field -->\n <sia-dynamic-field-number\n *ngIf=\"field.type === 'number'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-number>\n\n <!-- Date Field -->\n <sia-dynamic-field-date\n *ngIf=\"field.type === 'date'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-date>\n\n <!-- Datetime Field -->\n <sia-dynamic-field-datetime\n *ngIf=\"field.type === 'datetime'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-datetime>\n\n <!-- Dropdown/Enum Field -->\n <sia-dynamic-field-dropdown\n *ngIf=\"field.type === 'dropdown' || field.type === 'enum'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-dropdown>\n\n <!-- Lookup Field -->\n <sia-dynamic-field-lookup\n *ngIf=\"field.type === 'lookup'\"\n [field]=\"field\"\n [form]=\"form\"\n [formGroup]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-lookup>\n\n <!-- Time Field -->\n <sia-dynamic-field-time\n *ngIf=\"field.type === 'time'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-time>\n\n <!-- Checkbox Field -->\n <sia-dynamic-field-checkbox\n *ngIf=\"field.type === 'checkbox'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-checkbox>\n\n <!-- MultiSelect Field -->\n <sia-dynamic-field-multiselect\n *ngIf=\"field.type === 'multiselect'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-multiselect>\n\n <!-- Image Field -->\n <sia-dynamic-field-image\n *ngIf=\"field.type === 'image'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-image>\n</ng-template>\n\n\n<!-- Template de Campo Inline Edit -->\n<ng-template #inlineEditFieldTemplate let-field=\"field\">\n <div class=\"edit-inline-field\">\n <label class=\"field-label\">{{ field.label | translate }}</label>\n \n <!-- Display Mode -->\n <div class=\"field-display\" \n *ngIf=\"!isFieldEditing(field.field)\" \n (click)=\"startEditField(field.field)\"\n [class.disabled]=\"field.disabled\">\n <span class=\"display-value\" \n [attr.data-placeholder]=\"field.placeholder || ('crmx.business.not_informed' | translate)\">\n {{ getFieldDisplayValue(field.field) }}\n </span>\n <i class=\"pi pi-pencil edit-icon\" *ngIf=\"!field.disabled\"></i>\n </div>\n \n <!-- Edit Mode -->\n <div class=\"field-edit\" *ngIf=\"isFieldEditing(field.field)\">\n <div class=\"input-container\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"edit-actions\">\n <p-button \n type=\"button\" \n icon=\"pi pi-check\" \n [rounded]=\"true\"\n severity=\"primary\"\n (onClick)=\"saveInlineField(field.field)\" \n [loading]=\"savingField\"\n [disabled]=\"form.get(field.field)?.invalid\">\n </p-button>\n <p-button \n type=\"button\" \n icon=\"pi pi-times\" \n [rounded]=\"true\"\n severity=\"secondary\"\n (onClick)=\"cancelInlineEdit()\"\n [disabled]=\"savingField\">\n </p-button>\n </div>\n \n <!-- Error Message -->\n <div class=\"field-error\" *ngIf=\"form.get(field.field)?.invalid && form.get(field.field)?.touched\">\n <small class=\"p-error\">\n {{ form.get(field.field)?.errors?.['required'] ? ('crmx.business.required_field' | translate) : '' }}\n </small>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".dynamic-form{width:100%}.dynamic-form .grid{display:grid;grid-template-columns:repeat(12,1fr);gap:1rem}.dynamic-form .grid>div.col-1{grid-column:span 1}.dynamic-form .grid>div.col-2{grid-column:span 2}.dynamic-form .grid>div.col-3{grid-column:span 3}.dynamic-form .grid>div.col-4{grid-column:span 4}.dynamic-form .grid>div.col-5{grid-column:span 5}.dynamic-form .grid>div.col-6{grid-column:span 6}.dynamic-form .grid>div.col-7{grid-column:span 7}.dynamic-form .grid>div.col-8{grid-column:span 8}.dynamic-form .grid>div.col-9{grid-column:span 9}.dynamic-form .grid>div.col-10{grid-column:span 10}.dynamic-form .grid>div.col-11{grid-column:span 11}.dynamic-form .grid>div.col-12{grid-column:span 12}@media (max-width: 575.98px){.dynamic-form .grid>div.col-xs-1{grid-column:span 1}.dynamic-form .grid>div.col-xs-2{grid-column:span 2}.dynamic-form .grid>div.col-xs-3{grid-column:span 3}.dynamic-form .grid>div.col-xs-4{grid-column:span 4}.dynamic-form .grid>div.col-xs-5{grid-column:span 5}.dynamic-form .grid>div.col-xs-6{grid-column:span 6}.dynamic-form .grid>div.col-xs-7{grid-column:span 7}.dynamic-form .grid>div.col-xs-8{grid-column:span 8}.dynamic-form .grid>div.col-xs-9{grid-column:span 9}.dynamic-form .grid>div.col-xs-10{grid-column:span 10}.dynamic-form .grid>div.col-xs-11{grid-column:span 11}.dynamic-form .grid>div.col-xs-12{grid-column:span 12}}@media (min-width: 576px){.dynamic-form .grid>div.col-sm-1{grid-column:span 1}.dynamic-form .grid>div.col-sm-2{grid-column:span 2}.dynamic-form .grid>div.col-sm-3{grid-column:span 3}.dynamic-form .grid>div.col-sm-4{grid-column:span 4}.dynamic-form .grid>div.col-sm-5{grid-column:span 5}.dynamic-form .grid>div.col-sm-6{grid-column:span 6}.dynamic-form .grid>div.col-sm-7{grid-column:span 7}.dynamic-form .grid>div.col-sm-8{grid-column:span 8}.dynamic-form .grid>div.col-sm-9{grid-column:span 9}.dynamic-form .grid>div.col-sm-10{grid-column:span 10}.dynamic-form .grid>div.col-sm-11{grid-column:span 11}.dynamic-form .grid>div.col-sm-12{grid-column:span 12}}@media (min-width: 768px){.dynamic-form .grid>div.col-md-1{grid-column:span 1}.dynamic-form .grid>div.col-md-2{grid-column:span 2}.dynamic-form .grid>div.col-md-3{grid-column:span 3}.dynamic-form .grid>div.col-md-4{grid-column:span 4}.dynamic-form .grid>div.col-md-5{grid-column:span 5}.dynamic-form .grid>div.col-md-6{grid-column:span 6}.dynamic-form .grid>div.col-md-7{grid-column:span 7}.dynamic-form .grid>div.col-md-8{grid-column:span 8}.dynamic-form .grid>div.col-md-9{grid-column:span 9}.dynamic-form .grid>div.col-md-10{grid-column:span 10}.dynamic-form .grid>div.col-md-11{grid-column:span 11}.dynamic-form .grid>div.col-md-12{grid-column:span 12}}@media (min-width: 992px){.dynamic-form .grid>div.col-lg-1{grid-column:span 1}.dynamic-form .grid>div.col-lg-2{grid-column:span 2}.dynamic-form .grid>div.col-lg-3{grid-column:span 3}.dynamic-form .grid>div.col-lg-4{grid-column:span 4}.dynamic-form .grid>div.col-lg-5{grid-column:span 5}.dynamic-form .grid>div.col-lg-6{grid-column:span 6}.dynamic-form .grid>div.col-lg-7{grid-column:span 7}.dynamic-form .grid>div.col-lg-8{grid-column:span 8}.dynamic-form .grid>div.col-lg-9{grid-column:span 9}.dynamic-form .grid>div.col-lg-10{grid-column:span 10}.dynamic-form .grid>div.col-lg-11{grid-column:span 11}.dynamic-form .grid>div.col-lg-12{grid-column:span 12}}@media (min-width: 1200px){.dynamic-form .grid>div.col-xl-1{grid-column:span 1}.dynamic-form .grid>div.col-xl-2{grid-column:span 2}.dynamic-form .grid>div.col-xl-3{grid-column:span 3}.dynamic-form .grid>div.col-xl-4{grid-column:span 4}.dynamic-form .grid>div.col-xl-5{grid-column:span 5}.dynamic-form .grid>div.col-xl-6{grid-column:span 6}.dynamic-form .grid>div.col-xl-7{grid-column:span 7}.dynamic-form .grid>div.col-xl-8{grid-column:span 8}.dynamic-form .grid>div.col-xl-9{grid-column:span 9}.dynamic-form .grid>div.col-xl-10{grid-column:span 10}.dynamic-form .grid>div.col-xl-11{grid-column:span 11}.dynamic-form .grid>div.col-xl-12{grid-column:span 12}}.dynamic-form .sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header{background-color:var(--surface-50);border-color:var(--surface-200)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header{display:flex;align-items:center;gap:.5rem;width:100%}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-icon{font-size:1.1rem;color:var(--primary-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-title{font-weight:600;color:var(--text-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-content{padding:1.5rem}.dynamic-form .fixed-filters-section{margin-bottom:1rem;padding-bottom:1rem;border-bottom:1px solid var(--surface-200)}.dynamic-form .filter-sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .form-actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--surface-200)}.dialog-footer{display:flex;justify-content:flex-end;gap:.5rem}.drawer-footer{display:flex;justify-content:flex-end;gap:.5rem;padding:1rem;border-top:1px solid var(--surface-200)}.inline-edit-fields{display:flex;flex-direction:column;gap:1rem}.inline-edit-fields .inline-edit-field{display:flex;flex-direction:column;gap:.25rem}.inline-edit-fields .inline-edit-field .field-label{font-weight:500;font-size:.875rem;color:var(--text-color-secondary);margin-bottom:.25rem}.inline-edit-fields .inline-edit-field .field-display{display:flex;align-items:center;justify-content:space-between;padding:.75rem;background-color:var(--surface-50);border:1px solid var(--surface-200);border-radius:var(--border-radius);cursor:pointer;transition:all .2s ease;min-height:42px}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled){background-color:var(--surface-100);border-color:var(--primary-color)}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled) .edit-icon{opacity:1}.inline-edit-fields .inline-edit-field .field-display.disabled{cursor:not-allowed;opacity:.6}.inline-edit-fields .inline-edit-field .field-display .display-value{flex:1;color:var(--text-color)}.inline-edit-fields .inline-edit-field .field-display .display-value:empty:before{content:attr(data-placeholder);color:var(--text-color-secondary);font-style:italic}.inline-edit-fields .inline-edit-field .field-display .edit-icon{color:var(--primary-color);font-size:.875rem;opacity:.5;transition:opacity .2s ease}.inline-edit-fields .inline-edit-field .field-edit{display:flex;flex-direction:column;gap:.5rem}.inline-edit-fields .inline-edit-field .field-edit .input-container{flex:1}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field{gap:0}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field label{display:none}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field small.p-error{display:none}.inline-edit-fields .inline-edit-field .field-edit .edit-actions{display:flex;gap:.5rem;justify-content:flex-end}.inline-edit-fields .inline-edit-field .field-edit .field-error small.p-error{color:var(--p-red-500);font-size:.875rem}\n"] }]
|
|
732
|
+
], template: "<!-- Modo Inline (padr\u00E3o) -->\n<ng-container *ngIf=\"isInlineMode\">\n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n</ng-container>\n\n<!-- Modo Dialog -->\n<p-dialog\n *ngIf=\"isDialogMode\"\n [(visible)]=\"visible\"\n [header]=\"dialogHeader | translate\"\n [modal]=\"true\"\n [style]=\"{ width: dialogWidth }\"\n [draggable]=\"dialogDraggable\"\n [resizable]=\"dialogResizable\"\n [maximizable]=\"dialogMaximizable\"\n [closeOnEscape]=\"dialogCloseOnEscape\"\n [dismissableMask]=\"dialogDismissableMask\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"dialog-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-dialog>\n\n<!-- Modo Drawer -->\n<p-drawer\n *ngIf=\"isDrawerMode\"\n [(visible)]=\"visible\"\n [header]=\"drawerHeader | translate\"\n [position]=\"drawerPosition\"\n [style]=\"drawerStyle\"\n [showCloseIcon]=\"drawerShowCloseIcon\"\n [closeOnEscape]=\"drawerCloseOnEscape\"\n [modal]=\"drawerDismissable\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"drawer-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-drawer>\n\n<!-- Template do Formul\u00E1rio (reutiliz\u00E1vel) -->\n<ng-template #formContent>\n <form [formGroup]=\"form\" class=\"dynamic-form\">\n \n <!-- Filtros Fixos (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFixedFilters\" class=\"fixed-filters-section\">\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of fixedFilters\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Campos Diretos (sem se\u00E7\u00E3o) -->\n <div *ngIf=\"hasFields\">\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Se\u00E7\u00F5es de Campos (modo form) -->\n <div *ngIf=\"hasSections\" class=\"sections-container\">\n <p-panel \n *ngFor=\"let section of formSections\"\n [toggleable]=\"section.toggleable !== false\"\n [collapsed]=\"section.collapsed || false\"\n [styleClass]=\"'section-panel'\"\n [style.display]=\"isSectionVisible(section) ? '' : 'none'\">\n \n <ng-template pTemplate=\"header\">\n <div class=\"section-header\">\n <i *ngIf=\"section.icon\" [class]=\"section.icon + ' section-icon'\"></i>\n <span class=\"section-title\">{{ section.title }}</span>\n </div>\n </ng-template>\n\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Se\u00E7\u00F5es de Filtros (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFilterSections\" class=\"filter-sections-container\">\n <p-panel \n *ngFor=\"let section of filterSections\"\n [header]=\"section.title\"\n [toggleable]=\"true\"\n [collapsed]=\"true\">\n\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Custom content projection -->\n <ng-content></ng-content>\n\n <!-- Bot\u00F5es inline (apenas para modo inline) -->\n <div *ngIf=\"isInlineMode && (showSubmitButton || showCancelButton)\" class=\"form-actions\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n\n </form>\n</ng-template>\n\n<!-- Template de Campo (reutiliz\u00E1vel) -->\n<ng-template #fieldTemplate let-field=\"field\">\n <!-- Text Field -->\n <sia-dynamic-field-text\n *ngIf=\"field.type === 'text'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-text>\n\n <!-- Textarea Field -->\n <sia-dynamic-field-textarea\n *ngIf=\"field.type === 'textarea'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-textarea>\n\n <!-- Number Field -->\n <sia-dynamic-field-number\n *ngIf=\"field.type === 'number'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-number>\n\n <!-- Date Field -->\n <sia-dynamic-field-date\n *ngIf=\"field.type === 'date'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-date>\n\n <!-- Datetime Field -->\n <sia-dynamic-field-datetime\n *ngIf=\"field.type === 'datetime'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-datetime>\n\n <!-- Dropdown/Enum Field -->\n <sia-dynamic-field-dropdown\n *ngIf=\"field.type === 'dropdown' || field.type === 'enum'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-dropdown>\n\n <!-- Lookup Field -->\n <sia-dynamic-field-lookup\n *ngIf=\"field.type === 'lookup'\"\n [field]=\"field\"\n [form]=\"form\"\n [formGroup]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-lookup>\n\n <!-- Time Field -->\n <sia-dynamic-field-time\n *ngIf=\"field.type === 'time'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-time>\n\n <!-- Checkbox Field -->\n <sia-dynamic-field-checkbox\n *ngIf=\"field.type === 'checkbox'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-checkbox>\n\n <!-- MultiSelect Field -->\n <sia-dynamic-field-multiselect\n *ngIf=\"field.type === 'multiselect'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-multiselect>\n\n <!-- Image Field -->\n <sia-dynamic-field-image\n *ngIf=\"field.type === 'image'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-image>\n</ng-template>\n\n\n<!-- Template de Campo Inline Edit -->\n<ng-template #inlineEditFieldTemplate let-field=\"field\">\n <div class=\"edit-inline-field\">\n <label class=\"field-label\">{{ field.label | translate }}</label>\n \n <!-- Display Mode -->\n <div class=\"field-display\" \n *ngIf=\"!isFieldEditing(field.field)\" \n (click)=\"startEditField(field.field)\"\n [class.disabled]=\"field.disabled\">\n <span class=\"display-value\" \n [attr.data-placeholder]=\"field.placeholder || ('crmx.business.not_informed' | translate)\">\n {{ getFieldDisplayValue(field.field) }}\n </span>\n <i class=\"pi pi-pencil edit-icon\" *ngIf=\"!field.disabled\"></i>\n </div>\n \n <!-- Edit Mode -->\n <div class=\"field-edit\" *ngIf=\"isFieldEditing(field.field)\">\n <div class=\"input-container\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"edit-actions\">\n <p-button \n type=\"button\" \n icon=\"pi pi-check\" \n [rounded]=\"true\"\n severity=\"primary\"\n (onClick)=\"saveInlineField(field.field)\" \n [loading]=\"savingField\"\n [disabled]=\"form.get(field.field)?.invalid\">\n </p-button>\n <p-button \n type=\"button\" \n icon=\"pi pi-times\" \n [rounded]=\"true\"\n severity=\"secondary\"\n (onClick)=\"cancelInlineEdit()\"\n [disabled]=\"savingField\">\n </p-button>\n </div>\n \n <!-- Error Message -->\n <div class=\"field-error\" *ngIf=\"form.get(field.field)?.invalid && form.get(field.field)?.touched\">\n <small class=\"p-error\">\n {{ form.get(field.field)?.errors?.['required'] ? ('crmx.business.required_field' | translate) : '' }}\n </small>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".dynamic-form{width:100%}.dynamic-form .grid{display:grid;grid-template-columns:repeat(12,1fr);gap:1rem}.dynamic-form .grid>div.col-1{grid-column:span 1}.dynamic-form .grid>div.col-2{grid-column:span 2}.dynamic-form .grid>div.col-3{grid-column:span 3}.dynamic-form .grid>div.col-4{grid-column:span 4}.dynamic-form .grid>div.col-5{grid-column:span 5}.dynamic-form .grid>div.col-6{grid-column:span 6}.dynamic-form .grid>div.col-7{grid-column:span 7}.dynamic-form .grid>div.col-8{grid-column:span 8}.dynamic-form .grid>div.col-9{grid-column:span 9}.dynamic-form .grid>div.col-10{grid-column:span 10}.dynamic-form .grid>div.col-11{grid-column:span 11}.dynamic-form .grid>div.col-12{grid-column:span 12}@media (max-width: 575.98px){.dynamic-form .grid>div.col-xs-1{grid-column:span 1}.dynamic-form .grid>div.col-xs-2{grid-column:span 2}.dynamic-form .grid>div.col-xs-3{grid-column:span 3}.dynamic-form .grid>div.col-xs-4{grid-column:span 4}.dynamic-form .grid>div.col-xs-5{grid-column:span 5}.dynamic-form .grid>div.col-xs-6{grid-column:span 6}.dynamic-form .grid>div.col-xs-7{grid-column:span 7}.dynamic-form .grid>div.col-xs-8{grid-column:span 8}.dynamic-form .grid>div.col-xs-9{grid-column:span 9}.dynamic-form .grid>div.col-xs-10{grid-column:span 10}.dynamic-form .grid>div.col-xs-11{grid-column:span 11}.dynamic-form .grid>div.col-xs-12{grid-column:span 12}}@media (min-width: 576px){.dynamic-form .grid>div.col-sm-1{grid-column:span 1}.dynamic-form .grid>div.col-sm-2{grid-column:span 2}.dynamic-form .grid>div.col-sm-3{grid-column:span 3}.dynamic-form .grid>div.col-sm-4{grid-column:span 4}.dynamic-form .grid>div.col-sm-5{grid-column:span 5}.dynamic-form .grid>div.col-sm-6{grid-column:span 6}.dynamic-form .grid>div.col-sm-7{grid-column:span 7}.dynamic-form .grid>div.col-sm-8{grid-column:span 8}.dynamic-form .grid>div.col-sm-9{grid-column:span 9}.dynamic-form .grid>div.col-sm-10{grid-column:span 10}.dynamic-form .grid>div.col-sm-11{grid-column:span 11}.dynamic-form .grid>div.col-sm-12{grid-column:span 12}}@media (min-width: 768px){.dynamic-form .grid>div.col-md-1{grid-column:span 1}.dynamic-form .grid>div.col-md-2{grid-column:span 2}.dynamic-form .grid>div.col-md-3{grid-column:span 3}.dynamic-form .grid>div.col-md-4{grid-column:span 4}.dynamic-form .grid>div.col-md-5{grid-column:span 5}.dynamic-form .grid>div.col-md-6{grid-column:span 6}.dynamic-form .grid>div.col-md-7{grid-column:span 7}.dynamic-form .grid>div.col-md-8{grid-column:span 8}.dynamic-form .grid>div.col-md-9{grid-column:span 9}.dynamic-form .grid>div.col-md-10{grid-column:span 10}.dynamic-form .grid>div.col-md-11{grid-column:span 11}.dynamic-form .grid>div.col-md-12{grid-column:span 12}}@media (min-width: 992px){.dynamic-form .grid>div.col-lg-1{grid-column:span 1}.dynamic-form .grid>div.col-lg-2{grid-column:span 2}.dynamic-form .grid>div.col-lg-3{grid-column:span 3}.dynamic-form .grid>div.col-lg-4{grid-column:span 4}.dynamic-form .grid>div.col-lg-5{grid-column:span 5}.dynamic-form .grid>div.col-lg-6{grid-column:span 6}.dynamic-form .grid>div.col-lg-7{grid-column:span 7}.dynamic-form .grid>div.col-lg-8{grid-column:span 8}.dynamic-form .grid>div.col-lg-9{grid-column:span 9}.dynamic-form .grid>div.col-lg-10{grid-column:span 10}.dynamic-form .grid>div.col-lg-11{grid-column:span 11}.dynamic-form .grid>div.col-lg-12{grid-column:span 12}}@media (min-width: 1200px){.dynamic-form .grid>div.col-xl-1{grid-column:span 1}.dynamic-form .grid>div.col-xl-2{grid-column:span 2}.dynamic-form .grid>div.col-xl-3{grid-column:span 3}.dynamic-form .grid>div.col-xl-4{grid-column:span 4}.dynamic-form .grid>div.col-xl-5{grid-column:span 5}.dynamic-form .grid>div.col-xl-6{grid-column:span 6}.dynamic-form .grid>div.col-xl-7{grid-column:span 7}.dynamic-form .grid>div.col-xl-8{grid-column:span 8}.dynamic-form .grid>div.col-xl-9{grid-column:span 9}.dynamic-form .grid>div.col-xl-10{grid-column:span 10}.dynamic-form .grid>div.col-xl-11{grid-column:span 11}.dynamic-form .grid>div.col-xl-12{grid-column:span 12}}.dynamic-form .sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header{background-color:var(--surface-50);border-color:var(--surface-200)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header{display:flex;align-items:center;gap:.5rem;width:100%}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-icon{font-size:1.1rem;color:var(--primary-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-title{font-weight:600;color:var(--text-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-content{padding:1.5rem}.dynamic-form .fixed-filters-section{margin-bottom:1rem;padding-bottom:1rem;border-bottom:1px solid var(--surface-200)}.dynamic-form .filter-sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .form-actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--surface-200)}.dialog-footer{display:flex;justify-content:flex-end;gap:.5rem}.drawer-footer{display:flex;justify-content:flex-end;gap:.5rem;padding:1rem;border-top:1px solid var(--surface-200)}.inline-edit-fields{display:flex;flex-direction:column;gap:1rem}.inline-edit-fields .inline-edit-field{display:flex;flex-direction:column;gap:.25rem}.inline-edit-fields .inline-edit-field .field-label{font-weight:500;font-size:.875rem;color:var(--text-color-secondary);margin-bottom:.25rem}.inline-edit-fields .inline-edit-field .field-display{display:flex;align-items:center;justify-content:space-between;padding:.75rem;background-color:var(--surface-50);border:1px solid var(--surface-200);border-radius:var(--border-radius);cursor:pointer;transition:all .2s ease;min-height:42px}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled){background-color:var(--surface-100);border-color:var(--primary-color)}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled) .edit-icon{opacity:1}.inline-edit-fields .inline-edit-field .field-display.disabled{cursor:not-allowed;opacity:.6}.inline-edit-fields .inline-edit-field .field-display .display-value{flex:1;color:var(--text-color)}.inline-edit-fields .inline-edit-field .field-display .display-value:empty:before{content:attr(data-placeholder);color:var(--text-color-secondary);font-style:italic}.inline-edit-fields .inline-edit-field .field-display .edit-icon{color:var(--primary-color);font-size:.875rem;opacity:.5;transition:opacity .2s ease}.inline-edit-fields .inline-edit-field .field-edit{display:flex;flex-direction:column;gap:.5rem}.inline-edit-fields .inline-edit-field .field-edit .input-container{flex:1}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field{gap:0}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field label{display:none}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field small.p-error{display:none}.inline-edit-fields .inline-edit-field .field-edit .edit-actions{display:flex;gap:.5rem;justify-content:flex-end}.inline-edit-fields .inline-edit-field .field-edit .field-error small.p-error{color:var(--p-red-500);font-size:.875rem}\n"] }]
|
|
722
733
|
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.TranslationService }, { type: i3.MaskService }, { type: i4.LocaleService }], propDecorators: { formFields: [{
|
|
723
734
|
type: Input
|
|
724
735
|
}], formSections: [{
|
|
@@ -762,4 +773,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
762
773
|
}], fieldSave: [{
|
|
763
774
|
type: Output
|
|
764
775
|
}] } });
|
|
765
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMtYWkvc3JjL2xpYi9jb21wb25lbnRzL2R5bmFtaWMtZm9ybS9keW5hbWljLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy1haS9zcmMvbGliL2NvbXBvbmVudHMvZHluYW1pYy1mb3JtL2R5bmFtaWMtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUEwQixtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFXOUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzFGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzFG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WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgUGFuZWxNb2R1bGUgfSBmcm9tICdwcmltZW5nL3BhbmVsJztcbmltcG9ydCB7IERpYWxvZ01vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZGlhbG9nJztcbmltcG9ydCB7IERyYXdlck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZHJhd2VyJztcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcbmltcG9ydCB7IFxuICBEeW5hbWljRm9ybUZpZWxkQ29uZmlnLCBcbiAgRHluYW1pY0Zvcm1TZWN0aW9uLFxuICBEeW5hbWljRm9ybURpc3BsYXlNb2RlLFxuICBEeW5hbWljRm9ybURpYWxvZ0NvbmZpZyxcbiAgRHluYW1pY0Zvcm1EcmF3ZXJDb25maWdcbn0gZnJvbSAnLi9tb2RlbHMvZHluYW1pYy1mb3JtLm1vZGVscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90cmFuc2xhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IE1hc2tTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbWFzay5zZXJ2aWNlJztcbmltcG9ydCB7IExvY2FsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sb2NhbGUuc2VydmljZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvdHJhbnNsYXRlLnBpcGUnO1xuaW1wb3J0IHsgRHluYW1pY0ZpZWxkVGV4dENvbXBvbmVudCB9IGZyb20gJy4vZmllbGRzL2R5bmFtaWMtZmllbGQtdGV4dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHluYW1pY0ZpZWxkTnVtYmVyQ29tcG9uZW50IH0gZnJvbSAnLi9maWVsZHMvZHluYW1pYy1maWVsZC1udW1iZXIuY29tcG9uZW50JztcbmltcG9ydCB7IER5bmFtaWNGaWVsZERhdGVDb21wb25lbnQgfSBmcm9tICcuL2ZpZWxkcy9keW5hbWljLWZpZWxkLWRhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IER5bmFtaWNGaWVsZERhdGV0aW1lQ29tcG9uZW50IH0gZnJvbSAnLi9maWVsZHMvZHluYW1pYy1maWVsZC1kYXRldGltZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHluYW1pY0ZpZWxkRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICcuL2ZpZWxkcy9keW5hbWljLWZpZWxkLWRyb3Bkb3duLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEeW5hbWljRmllbGRMb29rdXBDb21wb25lbnQgfSBmcm9tICcuL2ZpZWxkcy9keW5hbWljLWZpZWxkLWxvb2t1cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHluYW1pY0ZpZWxkVGV4dGFyZWFDb21wb25lbnQgfSBmcm9tICcuL2ZpZWxkcy9keW5hbWljLWZpZWxkLXRleHRhcmVhLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEeW5hbWljRmllbGRUaW1lQ29tcG9uZW50IH0gZnJvbSAnLi9maWVsZHMvZHluYW1pYy1maWVsZC10aW1lLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEeW5hbWljRmllbGRDaGVja2JveENvbXBvbmVudCB9IGZyb20gJy4vZmllbGRzL2R5bmFtaWMtZmllbGQtY2hlY2tib3guY29tcG9uZW50JztcbmltcG9ydCB7IER5bmFtaWNGaWVsZE11bHRpc2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi9maWVsZHMvZHluYW1pYy1maWVsZC1tdWx0aXNlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHluYW1pY0ZpZWxkSW1hZ2VDb21wb25lbnQgfSBmcm9tICcuL2ZpZWxkcy9keW5hbWljLWZpZWxkLWltYWdlLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NpYS1keW5hbWljLWZvcm0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgUGFuZWxNb2R1bGUsXG4gICAgRGlhbG9nTW9kdWxlLFxuICAgIERyYXdlck1vZHVsZSxcbiAgICBCdXR0b25Nb2R1bGUsXG4gICAgVHJhbnNsYXRlUGlwZSxcbiAgICBEeW5hbWljRmllbGRUZXh0Q29tcG9uZW50LFxuICAgIER5bmFtaWNGaWVsZE51bWJlckNvbXBvbmVudCxcbiAgICBEeW5hbWljRmllbGREYXRlQ29tcG9uZW50LFxuICAgIER5bmFtaWNGaWVsZERhdGV0aW1lQ29tcG9uZW50LFxuICAgIER5bmFtaWNGaWVsZERyb3Bkb3duQ29tcG9uZW50LFxuICAgIER5bmFtaWNGaWVsZExvb2t1cENvbXBvbmVudCxcbiAgICBEeW5hbWljRmllbGRUZXh0YXJlYUNvbXBvbmVudCxcbiAgICBEeW5hbWljRmllbGRUaW1lQ29tcG9uZW50LFxuICAgIER5bmFtaWNGaWVsZENoZWNrYm94Q29tcG9uZW50LFxuICAgIER5bmFtaWNGaWVsZE11bHRpc2VsZWN0Q29tcG9uZW50LFxuICAgIER5bmFtaWNGaWVsZEltYWdlQ29tcG9uZW50XG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9keW5hbWljLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZHluYW1pYy1mb3JtLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgZm9ybUZpZWxkczogRHluYW1pY0Zvcm1GaWVsZENvbmZpZ1tdID0gW107XG4gIEBJbnB1dCgpIGZvcm1TZWN0aW9uczogRHluYW1pY0Zvcm1TZWN0aW9uW10gPSBbXTtcbiAgQElucHV0KCkgZml4ZWRGaWx0ZXJzOiBEeW5hbWljRm9ybUZpZWxkQ29uZmlnW10gPSBbXTsgLy8gRmlsdHJvcyBmaXhvcyAoc2VtcHJlIHZpc8OtdmVpcyBubyB0b3BvKVxuICBASW5wdXQoKSBmaWx0ZXJTZWN0aW9uczogRHluYW1pY0Zvcm1TZWN0aW9uW10gPSBbXTsgLy8gU2XDp8O1ZXMgZGUgZmlsdHJvcyAoY29sYXBzw6F2ZWlzKVxuICBASW5wdXQoKSBlbnRpdHlEYXRhOiBhbnkgPSBudWxsO1xuICBASW5wdXQoKSBtb2RlOiAnZm9ybScgfCAnZmlsdGVyJyB8ICdpbmxpbmUtZWRpdCcgPSAnZm9ybSc7XG4gIFxuICAvLyBEaXNwbGF5IE1vZGUgQ29uZmlndXJhdGlvblxuICBASW5wdXQoKSBkaXNwbGF5TW9kZTogRHluYW1pY0Zvcm1EaXNwbGF5TW9kZSA9ICdpbmxpbmUnO1xuICBASW5wdXQoKSB2aXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRpYWxvZ0NvbmZpZzogRHluYW1pY0Zvcm1EaWFsb2dDb25maWcgPSB7fTtcbiAgQElucHV0KCkgZHJhd2VyQ29uZmlnOiBEeW5hbWljRm9ybURyYXdlckNvbmZpZyA9IHt9O1xuICBcbiAgLy8gQnV0dG9uIENvbmZpZ3VyYXRpb25cbiAgQElucHV0KCkgc2hvd1N1Ym1pdEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzaG93Q2FuY2VsQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHN1Ym1pdEJ1dHRvbkxhYmVsPzogc3RyaW5nO1xuICBASW5wdXQoKSBjYW5jZWxCdXR0b25MYWJlbD86IHN0cmluZztcbiAgQElucHV0KCkgc3VibWl0QnV0dG9uSWNvbjogc3RyaW5nID0gJ3BpIHBpLWNoZWNrJztcbiAgQElucHV0KCkgY2FuY2VsQnV0dG9uSWNvbjogc3RyaW5nID0gJ3BpIHBpLXRpbWVzJztcbiAgXG4gIEBPdXRwdXQoKSBmb3JtUmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPEZvcm1Hcm91cD4oKTtcbiAgQE91dHB1dCgpIGZvcm1TdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHZpc2libGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBvbkNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGZpZWxkU2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBmaWVsZDogc3RyaW5nLCB2YWx1ZTogYW55IH0+KCk7XG5cbiAgZm9ybSE6IEZvcm1Hcm91cDtcbiAgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgLy8gSW5saW5lIGVkaXQgbW9kZSBzdGF0ZVxuICBlZGl0aW5nRmllbGQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBzYXZpbmdGaWVsZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGdldCBoYXNGaWVsZHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUZpZWxkcy5sZW5ndGggPiAwO1xuICB9XG5cbiAgZ2V0IGhhc1NlY3Rpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZvcm1TZWN0aW9ucy5sZW5ndGggPiAwO1xuICB9XG5cbiAgZ2V0IGhhc0ZpeGVkRmlsdGVycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maXhlZEZpbHRlcnMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGdldCBoYXNGaWx0ZXJTZWN0aW9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJTZWN0aW9ucy5sZW5ndGggPiAwO1xuICB9XG5cbiAgZ2V0IGFsbEZpZWxkcygpOiBEeW5hbWljRm9ybUZpZWxkQ29uZmlnW10ge1xuICAgIC8vIFJldG9ybmEgdG9kb3Mgb3MgY2FtcG9zIChkaXJldG9zICsgZGFzIHNlw6fDtWVzICsgZmlsdHJvcyBmaXhvcyArIHNlw6fDtWVzIGRlIGZpbHRyb3MpXG4gICAgY29uc3Qgc2VjdGlvbkZpZWxkcyA9IHRoaXMuZm9ybVNlY3Rpb25zLmZsYXRNYXAoc2VjdGlvbiA9PiBzZWN0aW9uLmZpZWxkcyk7XG4gICAgY29uc3QgZmlsdGVyU2VjdGlvbkZpZWxkcyA9IHRoaXMuZmlsdGVyU2VjdGlvbnMuZmxhdE1hcChzZWN0aW9uID0+IHNlY3Rpb24uZmllbGRzKTtcbiAgICByZXR1cm4gWy4uLnRoaXMuZm9ybUZpZWxkcywgLi4uc2VjdGlvbkZpZWxkcywgLi4udGhpcy5maXhlZEZpbHRlcnMsIC4uLmZpbHRlclNlY3Rpb25GaWVsZHNdO1xuICB9XG5cbiAgZ2V0IGlzSW5saW5lTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5TW9kZSA9PT0gJ2lubGluZSc7XG4gIH1cblxuICBnZXQgaXNJbmxpbmVFZGl0TW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSAnaW5saW5lLWVkaXQnO1xuICB9XG5cbiAgZ2V0IGZpZWxkTW9kZSgpOiAnZm9ybScgfCAnZmlsdGVyJyB7XG4gICAgcmV0dXJuIHRoaXMuaXNJbmxpbmVFZGl0TW9kZSA/ICdmb3JtJyA6IHRoaXMubW9kZSBhcyAnZm9ybScgfCAnZmlsdGVyJztcbiAgfVxuXG4gIGdldCBpc0RpYWxvZ01vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheU1vZGUgPT09ICdkaWFsb2cnO1xuICB9XG5cbiAgZ2V0IGlzRHJhd2VyTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5TW9kZSA9PT0gJ2RyYXdlcic7XG4gIH1cblxuICAvLyBEaWFsb2cgY29uZmlndXJhdGlvbiB3aXRoIGRlZmF1bHRzXG4gIGdldCBkaWFsb2dIZWFkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kaWFsb2dDb25maWcuaGVhZGVyIHx8IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZSgnZGVzaWduLmNvbXBvbmVudHNfYWkuZm9ybScpO1xuICB9XG5cbiAgZ2V0IGRpYWxvZ1dpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGlhbG9nQ29uZmlnLndpZHRoIHx8ICc2MDBweCc7XG4gIH1cblxuICBnZXQgZGlhbG9nRHJhZ2dhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpYWxvZ0NvbmZpZy5kcmFnZ2FibGUgIT09IHVuZGVmaW5lZCA/IHRoaXMuZGlhbG9nQ29uZmlnLmRyYWdnYWJsZSA6IGZhbHNlO1xuICB9XG5cbiAgZ2V0IGRpYWxvZ1Jlc2l6YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kaWFsb2dDb25maWcucmVzaXphYmxlICE9PSB1bmRlZmluZWQgPyB0aGlzLmRpYWxvZ0NvbmZpZy5yZXNpemFibGUgOiBmYWxzZTtcbiAgfVxuXG4gIGdldCBkaWFsb2dNYXhpbWl6YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kaWFsb2dDb25maWcubWF4aW1pemFibGUgIT09IHVuZGVmaW5lZCA/IHRoaXMuZGlhbG9nQ29uZmlnLm1heGltaXphYmxlIDogZmFsc2U7XG4gIH1cblxuICBnZXQgZGlhbG9nQ2xvc2VPbkVzY2FwZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kaWFsb2dDb25maWcuY2xvc2VPbkVzY2FwZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5kaWFsb2dDb25maWcuY2xvc2VPbkVzY2FwZSA6IHRydWU7XG4gIH1cblxuICBnZXQgZGlhbG9nRGlzbWlzc2FibGVNYXNrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpYWxvZ0NvbmZpZy5kaXNtaXNzYWJsZU1hc2sgIT09IHVuZGVmaW5lZCA/IHRoaXMuZGlhbG9nQ29uZmlnLmRpc21pc3NhYmxlTWFzayA6IGZhbHNlO1xuICB9XG5cbiAgLy8gRHJhd2VyIGNvbmZpZ3VyYXRpb24gd2l0aCBkZWZhdWx0c1xuICBnZXQgZHJhd2VySGVhZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZHJhd2VyQ29uZmlnLmhlYWRlciB8fCB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoJ2Rlc2lnbi5jb21wb25lbnRzX2FpLmZvcm0nKTtcbiAgfVxuXG4gIGdldCBkcmF3ZXJQb3NpdGlvbigpOiAnbGVmdCcgfCAncmlnaHQnIHwgJ3RvcCcgfCAnYm90dG9tJyB7XG4gICAgcmV0dXJuIHRoaXMuZHJhd2VyQ29uZmlnLnBvc2l0aW9uIHx8ICdyaWdodCc7XG4gIH1cblxuICBnZXQgZHJhd2VyU2hvd0Nsb3NlSWNvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kcmF3ZXJDb25maWcuc2hvd0Nsb3NlSWNvbiAhPT0gdW5kZWZpbmVkID8gdGhpcy5kcmF3ZXJDb25maWcuc2hvd0Nsb3NlSWNvbiA6IHRydWU7XG4gIH1cblxuICBnZXQgZHJhd2VyQ2xvc2VPbkVzY2FwZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kcmF3ZXJDb25maWcuY2xvc2VPbkVzY2FwZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5kcmF3ZXJDb25maWcuY2xvc2VPbkVzY2FwZSA6IHRydWU7XG4gIH1cblxuICBnZXQgZHJhd2VyRGlzbWlzc2FibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZHJhd2VyQ29uZmlnLmRpc21pc3NhYmxlICE9PSB1bmRlZmluZWQgPyB0aGlzLmRyYXdlckNvbmZpZy5kaXNtaXNzYWJsZSA6IHRydWU7XG4gIH1cblxuICBnZXQgZHJhd2VyU3R5bGUoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmRyYXdlclBvc2l0aW9uO1xuICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IHBvc2l0aW9uID09PSAnbGVmdCcgfHwgcG9zaXRpb24gPT09ICdyaWdodCc7XG4gICAgXG4gICAgLy8gU2UgdGVtIGN1c3RvbVdpZHRoLCB1c2EgZWxhXG4gICAgaWYgKHRoaXMuZHJhd2VyQ29uZmlnLmN1c3RvbVdpZHRoKSB7XG4gICAgICByZXR1cm4gaXNIb3Jpem9udGFsIFxuICAgICAgICA/IHsgd2lkdGg6IHRoaXMuZHJhd2VyQ29uZmlnLmN1c3RvbVdpZHRoIH1cbiAgICAgICAgOiB7IGhlaWdodDogdGhpcy5kcmF3ZXJDb25maWcuY3VzdG9tV2lkdGggfTtcbiAgICB9XG4gICAgXG4gICAgLy8gVXNhIG8gdGFtYW5obyBwYWRyb25pemFkb1xuICAgIGNvbnN0IHNpemUgPSB0aGlzLmRyYXdlckNvbmZpZy5zaXplIHx8ICdtZWRpdW0nO1xuICAgIGNvbnN0IHNpemVNYXAgPSB7XG4gICAgICAnc21hbGwnOiBpc0hvcml6b250YWwgPyAnMjUlJyA6ICcyNXZoJyxcbiAgICAgICdtZWRpdW0nOiBpc0hvcml6b250YWwgPyAnNDAlJyA6ICc0MHZoJyxcbiAgICAgICdsYXJnZSc6IGlzSG9yaXpvbnRhbCA/ICc2MCUnIDogJzYwdmgnLFxuICAgICAgJ3hsYXJnZSc6IGlzSG9yaXpvbnRhbCA/ICc4MCUnIDogJzgwdmgnLFxuICAgICAgJ2Z1bGwnOiBpc0hvcml6b250YWwgPyAnMTAwJScgOiAnMTAwdmgnXG4gICAgfTtcbiAgICBcbiAgICBjb25zdCBzaXplVmFsdWUgPSBzaXplTWFwW3NpemVdO1xuICAgIHJldHVybiBpc0hvcml6b250YWwgXG4gICAgICA/IHsgd2lkdGg6IHNpemVWYWx1ZSB9XG4gICAgICA6IHsgaGVpZ2h0OiBzaXplVmFsdWUgfTtcbiAgfVxuXG4gIGdldCBzdWJtaXRMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN1Ym1pdEJ1dHRvbkxhYmVsIHx8IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZSgnZGVzaWduLmNvbXBvbmVudHNfYWkuc2F2ZScpO1xuICB9XG5cbiAgZ2V0IGNhbmNlbExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2FuY2VsQnV0dG9uTGFiZWwgfHwgdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKCdkZXNpZ24uY29tcG9uZW50c19haS5jYW5jZWwnKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgdHJhbnNsYXRpb25TZXJ2aWNlOiBUcmFuc2xhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtYXNrU2VydmljZTogTWFza1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBsb2NhbGVTZXJ2aWNlOiBMb2NhbGVTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRGb3JtKCk7XG4gICAgaWYgKHRoaXMuZW50aXR5RGF0YSkge1xuICAgICAgdGhpcy5sb2FkRW50aXR5RGF0YSgpO1xuICAgIH1cbiAgICB0aGlzLnNldHVwQ29uZGl0aW9uYWxGaWVsZHNXYXRjaGVyKCk7XG4gICAgdGhpcy5mb3JtUmVhZHkuZW1pdCh0aGlzLmZvcm0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIC8vIEhhbmRsZSBlbnRpdHlEYXRhIGNoYW5nZXMgZmlyc3RcbiAgICBpZiAoY2hhbmdlc1snZW50aXR5RGF0YSddICYmIHRoaXMuZm9ybSkge1xuICAgICAgaWYgKHRoaXMuZW50aXR5RGF0YSkge1xuICAgICAgICB0aGlzLmxvYWRFbnRpdHlEYXRhKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBXaGVuIGRpYWxvZy9kcmF3ZXIgb3BlbnMsIGVuc3VyZSBmb3JtIGlzIGxvYWRlZCB3aXRoIGVudGl0eURhdGFcbiAgICBpZiAoY2hhbmdlc1sndmlzaWJsZSddICYmIGNoYW5nZXNbJ3Zpc2libGUnXS5jdXJyZW50VmFsdWUgPT09IHRydWUpIHtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgXG4gICAgICAvLyBJZiBvcGVuaW5nIHdpdGggZW50aXR5RGF0YSwgcmVsb2FkIGl0IHRvIGVuc3VyZSBmb3JtIGlzIHBvcHVsYXRlZFxuICAgICAgaWYgKHRoaXMuZW50aXR5RGF0YSAmJiB0aGlzLmZvcm0pIHtcbiAgICAgICAgdGhpcy5sb2FkRW50aXR5RGF0YSgpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5lbnRpdHlEYXRhICYmIHRoaXMuZm9ybSkge1xuICAgICAgICAvLyBJZiBvcGVuaW5nIHdpdGhvdXQgZW50aXR5RGF0YSAobmV3IHJlY29yZCksIHJlc2V0IGZvcm1cbiAgICAgICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpbml0Rm9ybSgpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtQ29udHJvbHM6IGFueSA9IHt9O1xuICAgIFxuICAgIC8vIFByb2Nlc3NhIHRvZG9zIG9zIGNhbXBvcyAoZGlyZXRvcyArIGRhcyBzZcOnw7VlcylcbiAgICB0aGlzLmFsbEZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKGZpZWxkKTtcbiAgICAgIGNvbnN0IHZhbGlkYXRvcnMgPSB0aGlzLm1vZGUgPT09ICdmaWx0ZXInID8gW10gOiAoZmllbGQudmFsaWRhdG9ycyB8fCBbXSk7XG4gICAgICBcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZiLmNvbnRyb2woXG4gICAgICAgIHsgdmFsdWU6IGRlZmF1bHRWYWx1ZSwgZGlzYWJsZWQ6IGZpZWxkLmRpc2FibGVkIHx8IGZhbHNlIH0sXG4gICAgICAgIHZhbGlkYXRvcnNcbiAgICAgICk7XG4gICAgICBcbiAgICAgIGZvcm1Db250cm9sc1tmaWVsZC5maWVsZF0gPSBjb250cm9sO1xuICAgIH0pO1xuICAgIFxuICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoZm9ybUNvbnRyb2xzKTtcbiAgICB0aGlzLmFwcGx5SW5pdGlhbERpc2FibGVkU3RhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdFZhbHVlKGZpZWxkOiBEeW5hbWljRm9ybUZpZWxkQ29uZmlnKTogYW55IHtcbiAgICBpZiAoZmllbGQuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmaWVsZC5kZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICBjYXNlICd0aW1lJzpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICBjYXNlICdjaGVja2JveCc6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNhc2UgJ211bHRpc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgY2FzZSAnZHJvcGRvd24nOlxuICAgICAgY2FzZSAnZW51bSc6XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGUgPT09ICdmaWx0ZXInID8gbnVsbCA6ICcnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlJbml0aWFsRGlzYWJsZWRTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFsbEZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgIGlmIChmaWVsZC5kaXNhYmxlZFdoZW4pIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoZmllbGQuZmllbGQpO1xuICAgICAgICBpZiAoY29udHJvbCAmJiB0aGlzLmlzRmllbGREaXNhYmxlZChmaWVsZCkpIHtcbiAgICAgICAgICBjb250cm9sLmRpc2FibGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbG9hZEVudGl0eURhdGEoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZW50aXR5RGF0YSAmJiB0aGlzLmZvcm0pIHtcbiAgICAgIGNvbnN0IHByb2Nlc3NlZERhdGEgPSB0aGlzLnByb2Nlc3NFbnRpdHlEYXRhKHRoaXMuZW50aXR5RGF0YSk7XG4gICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZShwcm9jZXNzZWREYXRhKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NFbnRpdHlEYXRhKGVudGl0eTogYW55KTogYW55IHtcbiAgICBjb25zdCBwcm9jZXNzZWREYXRhID0geyAuLi5lbnRpdHkgfTtcbiAgICBcbiAgICB0aGlzLmFsbEZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAnZGF0ZScgJiYgcHJvY2Vzc2VkRGF0YVtmaWVsZC5maWVsZF0pIHtcbiAgICAgICAgY29uc3QgZGF0ZVZhbHVlID0gcHJvY2Vzc2VkRGF0YVtmaWVsZC5maWVsZF07XG4gICAgICAgIGlmICh0eXBlb2YgZGF0ZVZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIC8vIENvbnZlcnQgZGF0ZSBzdHJpbmcgKHl5eXktTU0tZGQgb3IgSVNPKSB0byBEYXRlIG9iamVjdCBmb3IgcC1jYWxlbmRhclxuICAgICAgICAgIC8vIFVzZSBkYXRlLW9ubHkgY29uc3RydWN0b3IgdG8gYXZvaWQgdGltZXpvbmUvaG91ciBpc3N1ZXNcbiAgICAgICAgICBjb25zdCBwYXJ0cyA9IGRhdGVWYWx1ZS5zdWJzdHJpbmcoMCwgMTApLnNwbGl0KCctJyk7XG4gICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCtwYXJ0c1swXSwgK3BhcnRzWzFdIC0gMSwgK3BhcnRzWzJdKTtcbiAgICAgICAgICAgIGlmICghaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3NlZERhdGFbZmllbGQuZmllbGRdID0gZGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICd0aW1lJyAmJiBwcm9jZXNzZWREYXRhW2ZpZWxkLmZpZWxkXSkge1xuICAgICAgICBjb25zdCB0aW1lVmFsdWUgPSBwcm9jZXNzZWREYXRhW2ZpZWxkLmZpZWxkXTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aW1lVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc3QgcGFydHMgPSB0aW1lVmFsdWUuc3BsaXQoJzonKTtcbiAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgZGF0ZS5zZXRIb3VycyhwYXJzZUludChwYXJ0c1swXSwgMTApLCBwYXJzZUludChwYXJ0c1sxXSwgMTApLCAwLCAwKTtcbiAgICAgICAgICAgIHByb2Nlc3NlZERhdGFbZmllbGQuZmllbGRdID0gZGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdsb29rdXAnICYmIHByb2Nlc3NlZERhdGFbZmllbGQuZmllbGRdKSB7XG4gICAgICAgIGNvbnN0IGxvb2t1cFZhbHVlID0gcHJvY2Vzc2VkRGF0YVtmaWVsZC5maWVsZF07XG4gICAgICAgIC8vIEtlZXAgdGhlIGZ1bGwgb2JqZWN0IGlmIGl0IGhhcyBkaXNwbGF5IGRhdGEsIG90aGVyd2lzZSBleHRyYWN0IElEXG4gICAgICAgIGlmICh0eXBlb2YgbG9va3VwVmFsdWUgPT09ICdvYmplY3QnICYmIGxvb2t1cFZhbHVlLmlkKSB7XG4gICAgICAgICAgY29uc3QgaGFzRGlzcGxheURhdGEgPSBmaWVsZC5sb29rdXBEaXNwbGF5RmllbGRzIFxuICAgICAgICAgICAgPyBmaWVsZC5sb29rdXBEaXNwbGF5RmllbGRzLnNvbWUoZiA9PiB0aGlzLmdldE5lc3RlZFZhbHVlKGxvb2t1cFZhbHVlLCBmKSlcbiAgICAgICAgICAgIDogbG9va3VwVmFsdWVbZmllbGQubG9va3VwRGlzcGxheUZpZWxkIHx8ICduYW1lJ107XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGhhc0Rpc3BsYXlEYXRhKSB7XG4gICAgICAgICAgICAvLyBLZWVwIHRoZSBmdWxsIG9iamVjdCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBBUEkgY2FsbHNcbiAgICAgICAgICAgIHByb2Nlc3NlZERhdGFbZmllbGQuZmllbGRdID0gbG9va3VwVmFsdWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE9ubHkgaGFzIElELCBleHRyYWN0IGl0XG4gICAgICAgICAgICBwcm9jZXNzZWREYXRhW2ZpZWxkLmZpZWxkXSA9IGxvb2t1cFZhbHVlLmlkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiBwcm9jZXNzZWREYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROZXN0ZWRWYWx1ZShvYmo6IGFueSwgcGF0aDogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gcGF0aC5zcGxpdCgnLicpLnJlZHVjZSgoY3VycmVudCwga2V5KSA9PiBjdXJyZW50Py5ba2V5XSwgb2JqKTtcbiAgfVxuXG4gIHJlc2V0Rm9ybSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mb3JtKSB7XG4gICAgICBjb25zdCByZXNldFZhbHVlczogYW55ID0ge307XG4gICAgICB0aGlzLmFsbEZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgcmVzZXRWYWx1ZXNbZmllbGQuZmllbGRdID0gdGhpcy5nZXREZWZhdWx0VmFsdWUoZmllbGQpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmZvcm0ucmVzZXQocmVzZXRWYWx1ZXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc0ZpbHRlclZhbHVlKGZvcm1WYWx1ZTogYW55KTogYW55IHtcbiAgICBjb25zdCBwcm9jZXNzZWRWYWx1ZSA9IHsgLi4uZm9ybVZhbHVlIH07XG4gICAgXG4gICAgdGhpcy5hbGxGaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICBjb25zdCBmaWVsZFZhbHVlID0gcHJvY2Vzc2VkVmFsdWVbZmllbGQuZmllbGRdO1xuICAgICAgXG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2xvb2t1cCcpIHtcbiAgICAgICAgaWYgKGZpZWxkVmFsdWUgJiYgdHlwZW9mIGZpZWxkVmFsdWUgPT09ICdvYmplY3QnICYmIGZpZWxkVmFsdWUuaWQpIHtcbiAgICAgICAgICBwcm9jZXNzZWRWYWx1ZVtmaWVsZC5maWVsZF0gPSBmaWVsZFZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKGZpZWxkVmFsdWUgJiYgdHlwZW9mIGZpZWxkVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcHJvY2Vzc2VkVmFsdWVbZmllbGQuZmllbGRdID0geyBpZDogZmllbGRWYWx1ZSB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3NlZFZhbHVlW2ZpZWxkLmZpZWxkXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gcHJvY2Vzc2VkVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NGb3JtVmFsdWUoZm9ybVZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHByb2Nlc3NlZFZhbHVlID0geyAuLi5mb3JtVmFsdWUgfTtcbiAgICBcbiAgICBpZiAodGhpcy5lbnRpdHlEYXRhPy5pZCkge1xuICAgICAgcHJvY2Vzc2VkVmFsdWUuaWQgPSB0aGlzLmVudGl0eURhdGEuaWQ7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuYWxsRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IHByb2Nlc3NlZFZhbHVlW2ZpZWxkLmZpZWxkXTtcbiAgICAgIFxuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdsb29rdXAnKSB7XG4gICAgICAgIC8vIEtlZXAgdGhlIGZ1bGwgb2JqZWN0IGZvciBsb29rdXAgZmllbGRzXG4gICAgICAgIGlmIChmaWVsZFZhbHVlICYmIHR5cGVvZiBmaWVsZFZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIC8vIE9iamVjdCBpcyBhbHJlYWR5IGNvbXBsZXRlLCBrZWVwIGl0IGFzIGlzXG4gICAgICAgICAgcHJvY2Vzc2VkVmFsdWVbZmllbGQuZmllbGRdID0gZmllbGRWYWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZFZhbHVlICYmIGZpZWxkVmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgLy8gSWYgaXQncyBqdXN0IGFuIElELCB3cmFwIGl0IGluIGFuIG9iamVjdFxuICAgICAgICAgIHByb2Nlc3NlZFZhbHVlW2ZpZWxkLmZpZWxkXSA9IHsgaWQ6IGZpZWxkVmFsdWUgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9jZXNzZWRWYWx1ZVtmaWVsZC5maWVsZF0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdkYXRlJykge1xuICAgICAgICBpZiAoZmllbGRWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAvLyBTZXJpYWxpemUgYXMgeXl5eS1NTS1kZCB1c2luZyBsb2NhbCBkYXRlIGNvbXBvbmVudHMgKG5vIFVUQyBzaGlmdClcbiAgICAgICAgICBjb25zdCB5ID0gZmllbGRWYWx1ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgIGNvbnN0IG0gPSBTdHJpbmcoZmllbGRWYWx1ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgICAgICBjb25zdCBkID0gU3RyaW5nKGZpZWxkVmFsdWUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICAgIHByb2Nlc3NlZFZhbHVlW2ZpZWxkLmZpZWxkXSA9IGAke3l9LSR7bX0tJHtkfWA7XG4gICAgICAgIH0gZWxzZSBpZiAoIWZpZWxkVmFsdWUpIHtcbiAgICAgICAgICBwcm9jZXNzZWRWYWx1ZVtmaWVsZC5maWVsZF0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFsndGV4dCcsICd0ZXh0YXJlYScsICdudW1iZXInLCAnZW51bScsICdkcm9wZG93biddLmluY2x1ZGVzKGZpZWxkLnR5cGUpKSB7XG4gICAgICAgIGlmIChmaWVsZFZhbHVlID09PSAnJyB8fCBmaWVsZFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwcm9jZXNzZWRWYWx1ZVtmaWVsZC5maWVsZF0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICd0aW1lJykge1xuICAgICAgICBpZiAoZmllbGRWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICBjb25zdCBoID0gU3RyaW5nKGZpZWxkVmFsdWUuZ2V0SG91cnMoKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgICAgICBjb25zdCBtaW4gPSBTdHJpbmcoZmllbGRWYWx1ZS5nZXRNaW51dGVzKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgICAgcHJvY2Vzc2VkVmFsdWVbZmllbGQuZmllbGRdID0gYCR7aH06JHttaW59OjAwYDtcbiAgICAgICAgfSBlbHNlIGlmICghZmllbGRWYWx1ZSkge1xuICAgICAgICAgIHByb2Nlc3NlZFZhbHVlW2ZpZWxkLmZpZWxkXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gcHJvY2Vzc2VkVmFsdWU7XG4gIH1cblxuICBnZXRGaWVsZEdyaWRDbGFzcyhmaWVsZDogRHluYW1pY0Zvcm1GaWVsZENvbmZpZyk6IHN0cmluZyB7XG4gICAgY29uc3QgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICBcbiAgICAvLyBDb2xzcGFuIGJhc2UgKHBhZHLDo286IDYpXG4gICAgbGV0IGJhc2VDb2xzcGFuID0gZmllbGQuY29sc3BhbiB8fCA2O1xuICAgIFxuICAgIC8vIFZlcmlmaWNhIGNvbmRpw6fDtWVzIGRlIGNvbHNwYW4gZGluw6JtaWNvXG4gICAgaWYgKGZpZWxkLmNvbHNwYW5XaGVuICYmIGZpZWxkLmNvbHNwYW5XaGVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGZpZWxkLmNvbHNwYW5XaGVuKSB7XG4gICAgICAgIGNvbnN0IGRlcGVuZGVudEZpZWxkVmFsdWUgPSB0aGlzLmZvcm0uZ2V0KGNvbmRpdGlvbi5maWVsZCk/LnZhbHVlO1xuICAgICAgICBpZiAoZGVwZW5kZW50RmllbGRWYWx1ZSA9PT0gY29uZGl0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgYmFzZUNvbHNwYW4gPSBjb25kaXRpb24uY29sc3BhbjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBBZGljaW9uYSBjbGFzc2UgYmFzZVxuICAgIGNsYXNzZXMucHVzaChgY29sLSR7YmFzZUNvbHNwYW59YCk7XG4gICAgXG4gICAgLy8gU3Vwb3J0YSB0YW50byBvIG9iamV0byBzaXplIHF1YW50byBhcyBwcm9wcmllZGFkZXMgYW50aWdhcyAocGFyYSBjb21wYXRpYmlsaWRhZGUpXG4gICAgY29uc3Qgc2l6ZVhzID0gZmllbGQuc2l6ZT8ueHMgPz8gZmllbGQuY29sc3BhblhzO1xuICAgIGNvbnN0IHNpemVTbSA9IGZpZWxkLnNpemU/LnNtID8/IGZpZWxkLmNvbHNwYW5TbTtcbiAgICBjb25zdCBzaXplTWQgPSBmaWVsZC5zaXplPy5tZCA/PyBmaWVsZC5jb2xzcGFuTWQ7XG4gICAgY29uc3Qgc2l6ZUxnID0gZmllbGQuc2l6ZT8ubGcgPz8gZmllbGQuY29sc3BhbkxnO1xuICAgIGNvbnN0IHNpemVYbCA9IGZpZWxkLnNpemU/LnhsID8/IGZpZWxkLmNvbHNwYW5YbDtcbiAgICBcbiAgICAvLyBBZGljaW9uYSBjbGFzc2VzIHJlc3BvbnNpdmFzIHNlIGRlZmluaWRhc1xuICAgIGlmIChzaXplWHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xhc3Nlcy5wdXNoKGBjb2wteHMtJHtzaXplWHN9YCk7XG4gICAgfVxuICAgIGlmIChzaXplU20gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xhc3Nlcy5wdXNoKGBjb2wtc20tJHtzaXplU219YCk7XG4gICAgfVxuICAgIGlmIChzaXplTWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xhc3Nlcy5wdXNoKGBjb2wtbWQtJHtzaXplTWR9YCk7XG4gICAgfVxuICAgIGlmIChzaXplTGcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xhc3Nlcy5wdXNoKGBjb2wtbGctJHtzaXplTGd9YCk7XG4gICAgfVxuICAgIGlmIChzaXplWGwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xhc3Nlcy5wdXNoKGBjb2wteGwtJHtzaXplWGx9YCk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIGlzRmllbGRWaXNpYmxlKGZpZWxkOiBEeW5hbWljRm9ybUZpZWxkQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgaWYgKCFmaWVsZC52aXNpYmxlV2hlbikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgZGVwZW5kZW50RmllbGRWYWx1ZSA9IHRoaXMuZm9ybS5nZXQoZmllbGQudmlzaWJsZVdoZW4uZmllbGQpPy52YWx1ZTtcbiAgICByZXR1cm4gZGVwZW5kZW50RmllbGRWYWx1ZSA9PT0gZmllbGQudmlzaWJsZVdoZW4udmFsdWU7XG4gIH1cblxuICBpc0ZpZWxkRGlzYWJsZWQoZmllbGQ6IER5bmFtaWNGb3JtRmllbGRDb25maWcpOiBib29sZWFuIHtcbiAgICBpZiAoZmllbGQuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICBpZiAoISgnZGlzYWJsZWRXaGVuJyBpbiBmaWVsZCkgfHwgIWZpZWxkLmRpc2FibGVkV2hlbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGRlcGVuZGVudEZpZWxkVmFsdWUgPSB0aGlzLmZvcm0uZ2V0KGZpZWxkLmRpc2FibGVkV2hlbiEuZmllbGQpPy52YWx1ZTtcbiAgICBcbiAgICBpZiAoZmllbGQuZGlzYWJsZWRXaGVuIS52YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICFkZXBlbmRlbnRGaWVsZFZhbHVlO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZGVwZW5kZW50RmllbGRWYWx1ZSA9PT0gZmllbGQuZGlzYWJsZWRXaGVuIS52YWx1ZTtcbiAgfVxuXG4gIHNldHVwQ29uZGl0aW9uYWxGaWVsZHNXYXRjaGVyKCk6IHZvaWQge1xuICAgIGNvbnN0IHZpc2libGVEZXBlbmRlbnRGaWVsZHMgPSB0aGlzLmFsbEZpZWxkcy5maWx0ZXIoZmllbGQgPT4gZmllbGQudmlzaWJsZVdoZW4pO1xuICAgIGNvbnN0IHZpc2libGVXYXRjaGVkRmllbGRzID0gWy4uLm5ldyBTZXQodmlzaWJsZURlcGVuZGVudEZpZWxkcy5tYXAoZmllbGQgPT4gZmllbGQudmlzaWJsZVdoZW4hLmZpZWxkKSldO1xuXG4gICAgY29uc3QgZGlzYWJsZWREZXBlbmRlbnRGaWVsZHMgPSB0aGlzLmFsbEZpZWxkcy5maWx0ZXIoZmllbGQgPT4gZmllbGQuZGlzYWJsZWRXaGVuKTtcbiAgICBjb25zdCBkaXNhYmxlZFdhdGNoZWRGaWVsZHMgPSBbLi4ubmV3IFNldChkaXNhYmxlZERlcGVuZGVudEZpZWxkcy5tYXAoZmllbGQgPT4gZmllbGQuZGlzYWJsZWRXaGVuIS5maWVsZCkpXTtcblxuICAgIGNvbnN0IGFsbFdhdGNoZWRGaWVsZHMgPSBbLi4ubmV3IFNldChbLi4udmlzaWJsZVdhdGNoZWRGaWVsZHMsIC4uLmRpc2FibGVkV2F0Y2hlZEZpZWxkc10pXTtcblxuICAgIGFsbFdhdGNoZWRGaWVsZHMuZm9yRWFjaChmaWVsZE5hbWUgPT4ge1xuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoZmllbGROYW1lKTtcbiAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgIGNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jbGVhckhpZGRlbkZpZWxkcygpO1xuICAgICAgICAgIHRoaXMudXBkYXRlRGlzYWJsZWRGaWVsZHMoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVEaXNhYmxlZEZpZWxkcygpOiB2b2lkIHtcbiAgICB0aGlzLmFsbEZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgIGlmIChmaWVsZC5kaXNhYmxlZFdoZW4pIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoZmllbGQuZmllbGQpO1xuICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgIGNvbnN0IHNob3VsZEJlRGlzYWJsZWQgPSB0aGlzLmlzRmllbGREaXNhYmxlZChmaWVsZCk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKHNob3VsZEJlRGlzYWJsZWQgJiYgY29udHJvbC5lbmFibGVkKSB7XG4gICAgICAgICAgICBjb250cm9sLnNldFZhbHVlKG51bGwpO1xuICAgICAgICAgICAgY29udHJvbC5kaXNhYmxlKCk7XG4gICAgICAgICAgfSBlbHNlIGlmICghc2hvdWxkQmVEaXNhYmxlZCAmJiBjb250cm9sLmRpc2FibGVkICYmICFmaWVsZC5kaXNhYmxlZCkge1xuICAgICAgICAgICAgY29udHJvbC5lbmFibGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFySGlkZGVuRmllbGRzKCk6IHZvaWQge1xuICAgIHRoaXMuYWxsRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgaWYgKGZpZWxkLnZpc2libGVXaGVuICYmICF0aGlzLmlzRmllbGRWaXNpYmxlKGZpZWxkKSkge1xuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChmaWVsZC5maWVsZCk7XG4gICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgY29uc3QgcmVzZXRWYWx1ZSA9IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKGZpZWxkKTtcbiAgICAgICAgICBjb250cm9sLnNldFZhbHVlKHJlc2V0VmFsdWUpO1xuICAgICAgICAgIGNvbnRyb2wubWFya0FzVW50b3VjaGVkKCk7XG4gICAgICAgICAgY29udHJvbC5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXRGb3JtKCk6IEZvcm1Hcm91cCB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybTtcbiAgfVxuXG4gIGNsZWFyRmlsdGVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZmlsdGVyJykge1xuICAgICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgICB9XG4gIH1cblxuICBnZXRUeXBlUGVyc29uVmFsdWUoKTogJ05BVFVSQUxfUEVSU09OJyB8ICdKVVJJRElDQUxfUEVSU09OJyB7XG4gICAgY29uc3QgdHlwZVBlcnNvblZhbHVlID0gdGhpcy5mb3JtPy5nZXQoJ3R5cGVQZXJzb24nKT8udmFsdWU7XG4gICAgcmV0dXJuIHR5cGVQZXJzb25WYWx1ZSB8fCAnSlVSSURJQ0FMX1BFUlNPTic7XG4gIH1cblxuICAvLyBEaXNwbGF5IE1vZGUgQ29udHJvbCBNZXRob2RzXG4gIG9wZW4oZW50aXR5PzogYW55KTogdm9pZCB7XG4gICAgaWYgKGVudGl0eSkge1xuICAgICAgdGhpcy5lbnRpdHlEYXRhID0gZW50aXR5O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVudGl0eURhdGEgPSBudWxsO1xuICAgICAgdGhpcy5yZXNldEZvcm0oKTsgLy8gUmVzZXQgZm9ybSB3aGVuIG9wZW5pbmcgZm9yIG5ldyBlbnRpdHlcbiAgICB9XG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7IC8vIFJlc2V0IGxvYWRpbmcgc3RhdGVcbiAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgIHRoaXMudmlzaWJsZUNoYW5nZS5lbWl0KHRydWUpO1xuICB9XG5cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7IC8vIFJlc2V0IGxvYWRpbmcgc3RhdGVcbiAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLnZpc2libGVDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgdGhpcy5yZXNldEZvcm0oKTsgLy8gUmVzZXQgZm9ybSB3aGVuIGNsb3NpbmdcbiAgICB0aGlzLm9uQ2FuY2VsLmVtaXQoKTtcbiAgfVxuXG4gIGhhbmRsZUNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlKCk7XG4gIH1cblxuICBoYW5kbGVTdWJtaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2Zvcm0nICYmIHRoaXMuZm9ybS5pbnZhbGlkKSB7XG4gICAgICB0aGlzLmZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBpZiAodGhpcy5tb2RlICE9PSAnZmlsdGVyJykge1xuICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5tb2RlID09PSAnZmlsdGVyJyBcbiAgICAgID8gdGhpcy5wcm9jZXNzRmlsdGVyVmFsdWUodGhpcy5mb3JtLnZhbHVlKVxuICAgICAgOiB0aGlzLnByb2Nlc3NGb3JtVmFsdWUodGhpcy5mb3JtLnZhbHVlKTtcbiAgICBcbiAgICB0aGlzLmZvcm1TdWJtaXQuZW1pdChmb3JtVmFsdWUpO1xuICB9XG5cbiAgLy8gSW5saW5lIEVkaXQgTW9kZSBNZXRob2RzXG4gIHN0YXJ0RWRpdEZpZWxkKGZpZWxkTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNJbmxpbmVFZGl0TW9kZSkge1xuICAgICAgdGhpcy5lZGl0aW5nRmllbGQgPSBmaWVsZE5hbWU7XG4gICAgICBcbiAgICAgIC8vIEVuc3VyZSB0aGUgZmllbGQgaGFzIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gZW50aXR5RGF0YVxuICAgICAgaWYgKHRoaXMuZW50aXR5RGF0YSkge1xuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChmaWVsZE5hbWUpO1xuICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5hbGxGaWVsZHMuZmluZChmID0+IGYuZmllbGQgPT09IGZpZWxkTmFtZSk7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmVudGl0eURhdGFbZmllbGROYW1lXTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBGb3IgbG9va3VwIGZpZWxkcyBpbiBpbmxpbmUtZWRpdCBtb2RlLCBrZWVwIHRoZSBmdWxsIG9iamVjdFxuICAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgdW5uZWNlc3NhcnkgQVBJIGNhbGxzIHNpbmNlIHdlIGFscmVhZHkgaGF2ZSB0aGUgZGF0YVxuICAgICAgICAgIGlmIChmaWVsZD8udHlwZSA9PT0gJ2xvb2t1cCcgJiYgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgLy8gS2VlcCB0aGUgZnVsbCBvYmplY3QgLSB0aGUgbG9va3VwIGNvbXBvbmVudCB3aWxsIHVzZSBpdFxuICAgICAgICAgICAgY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChmaWVsZD8udHlwZSA9PT0gJ2RhdGUnICYmIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIC8vIENvbnZlcnQgZGF0ZSBzdHJpbmcgdG8gRGF0ZSBvYmplY3QgZm9yIHAtY2FsZW5kYXIgKGRhdGUtb25seSwgbm8gdGltZSBjb21wb25lbnQpXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHZhbHVlLnN1YnN0cmluZygwLCAxMCkuc3BsaXQoJy0nKTtcbiAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCtwYXJ0c1swXSwgK3BhcnRzWzFdIC0gMSwgK3BhcnRzWzJdKTtcbiAgICAgICAgICAgICAgY29udHJvbC5zZXRWYWx1ZSghaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gZGF0ZSA6IHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250cm9sLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpc0ZpZWxkRWRpdGluZyhmaWVsZE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVkaXRpbmdGaWVsZCA9PT0gZmllbGROYW1lO1xuICB9XG5cbiAgc2F2ZUlubGluZUZpZWxkKGZpZWxkTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzSW5saW5lRWRpdE1vZGUpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGZpZWxkTmFtZSk7XG4gICAgaWYgKCFjb250cm9sIHx8IGNvbnRyb2wuaW52YWxpZCkge1xuICAgICAgY29udHJvbD8ubWFya0FzVG91Y2hlZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2F2aW5nRmllbGQgPSB0cnVlO1xuICAgIFxuICAgIGxldCBmaWVsZFZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBcbiAgICAvLyBGb3IgbG9va3VwIGZpZWxkcywga2VlcCB0aGUgZnVsbCBvYmplY3QgKGRvbid0IGV4dHJhY3QgSUQpXG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmFsbEZpZWxkcy5maW5kKGYgPT4gZi5maWVsZCA9PT0gZmllbGROYW1lKTtcbiAgICBpZiAoZmllbGQ/LnR5cGUgPT09ICdsb29rdXAnICYmIGZpZWxkVmFsdWUgJiYgdHlwZW9mIGZpZWxkVmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgICAvLyBJZiBpdCdzIGp1c3QgYW4gSUQsIHdyYXAgaXQgaW4gYW4gb2JqZWN0XG4gICAgICBmaWVsZFZhbHVlID0geyBpZDogZmllbGRWYWx1ZSB9O1xuICAgIH1cblxuICAgIC8vIEZvciBkYXRlIGZpZWxkcywgc2VyaWFsaXplIGFzIHl5eXktTU0tZGQgKG5vIHRpbWUgY29tcG9uZW50KVxuICAgIGlmIChmaWVsZD8udHlwZSA9PT0gJ2RhdGUnICYmIGZpZWxkVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBjb25zdCB5ID0gZmllbGRWYWx1ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgY29uc3QgbSA9IFN0cmluZyhmaWVsZFZhbHVlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgY29uc3QgZCA9IFN0cmluZyhmaWVsZFZhbHVlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgIGZpZWxkVmFsdWUgPSBgJHt5fS0ke219LSR7ZH1gO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmZpZWxkU2F2ZS5lbWl0KHsgZmllbGQ6IGZpZWxkTmFtZSwgdmFsdWU6IGZpZWxkVmFsdWUgfSk7XG4gIH1cblxuICBjYW5jZWxJbmxpbmVFZGl0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzSW5saW5lRWRpdE1vZGUgJiYgdGhpcy5lZGl0aW5nRmllbGQpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KHRoaXMuZWRpdGluZ0ZpZWxkKTtcbiAgICAgIGlmIChjb250cm9sICYmIHRoaXMuZW50aXR5RGF0YSkge1xuICAgICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHZhbHVlXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVmFsdWUgPSB0aGlzLmVudGl0eURhdGFbdGhpcy5lZGl0aW5nRmllbGRdO1xuICAgICAgICBjb250cm9sLnNldFZhbHVlKG9yaWdpbmFsVmFsdWUpO1xuICAgICAgICBjb250cm9sLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICAgIGNvbnRyb2wubWFya0FzVW50b3VjaGVkKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmVkaXRpbmdGaWVsZCA9IG51bGw7XG4gICAgICB0aGlzLnNhdmluZ0ZpZWxkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gTWV0aG9kIHRvIGJlIGNhbGxlZCBieSBwYXJlbnQgYWZ0ZXIgc2F2ZSBjb21wbGV0ZXNcbiAgY29tcGxldGVJbmxpbmVFZGl0KCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdGluZ0ZpZWxkID0gbnVsbDtcbiAgICB0aGlzLnNhdmluZ0ZpZWxkID0gZmFsc2U7XG4gIH1cblxuICBnZXRGaWVsZERpc3BsYXlWYWx1ZShmaWVsZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmVudGl0eURhdGEpIHJldHVybiAnJztcblxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5hbGxGaWVsZHMuZmluZChmID0+IGYuZmllbGQgPT09IGZpZWxkTmFtZSk7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmVudGl0eURhdGFbZmllbGROYW1lXTtcblxuICAgIGlmICghdmFsdWUpIHJldHVybiAnJztcblxuICAgIC8vIEZvciBsb29rdXAgZmllbGRzLCByZXR1cm4gdGhlIGRpc3BsYXkgbmFtZVxuICAgIGlmIChmaWVsZD8udHlwZSA9PT0gJ2xvb2t1cCcgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5uYW1lKSB7XG4gICAgICByZXR1cm4gdmFsdWUubmFtZTtcbiAgICB9XG5cbiAgICAvLyBGb3IgbG9va3VwIGZpZWxkcyB3aXRoIG11bHRpcGxlIGRpc3BsYXkgZmllbGRzXG4gICAgaWYgKGZpZWxkPy50eXBlID09PSAnbG9va3VwJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIGZpZWxkLmxvb2t1cERpc3BsYXlGaWVsZHMpIHtcbiAgICAgIHJldHVybiBmaWVsZC5sb29rdXBEaXNwbGF5RmllbGRzXG4gICAgICAgIC5tYXAoZiA9PiB0aGlzLmdldE5lc3RlZFZhbHVlKHZhbHVlLCBmKSlcbiAgICAgICAgLmZpbHRlcih2ID0+IHYpXG4gICAgICAgIC5qb2luKCcgLSAnKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgZHJvcGRvd24vZW51bSBmaWVsZHMsIGZpbmQgdGhlIG1hdGNoaW5nIG9wdGlvbiBsYWJlbFxuICAgIGlmICgoZmllbGQ/LnR5cGUgPT09ICdkcm9wZG93bicgfHwgZmllbGQ/LnR5cGUgPT09ICdlbnVtJykgJiYgZmllbGQpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBmaWVsZC5vcHRpb25zIHx8IGZpZWxkLmVudW1PcHRpb25zIHx8IFtdO1xuICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSBmaWVsZC5vcHRpb25WYWx1ZSB8fCAndmFsdWUnO1xuICAgICAgY29uc3Qgb3B0aW9uTGFiZWwgPSBmaWVsZC5vcHRpb25MYWJlbCB8fCAnbGFiZWwnO1xuICAgICAgY29uc3QgbWF0Y2hpbmdPcHRpb24gPSBvcHRpb25zLmZpbmQoKG9wdDogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdFZhbCA9IHR5cGVvZiBvcHQgPT09ICdvYmplY3QnID8gb3B0W29wdGlvblZhbHVlXSA6IG9wdDtcbiAgICAgICAgcmV0dXJuIG9wdFZhbCA9PT0gdmFsdWU7XG4gICAgICB9KTtcbiAgICAgIGlmIChtYXRjaGluZ09wdGlvbikge1xuICAgICAgICByZXR1cm4gdHlwZW9mIG1hdGNoaW5nT3B0aW9uID09PSAnb2JqZWN0JyA/IG1hdGNoaW5nT3B0aW9uW29wdGlvbkxhYmVsXSA6IG1hdGNoaW5nT3B0aW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZvciBudW1iZXIgZmllbGRzLCBmb3JtYXQgYXBwcm9wcmlhdGVseVxuICAgIGlmIChmaWVsZD8udHlwZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKGZpZWxkLm51bWJlck1vZGUgPT09ICdjdXJyZW5jeScpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdChmaWVsZC5sb2NhbGUgfHwgJ3B0LUJSJywge1xuICAgICAgICAgIHN0eWxlOiAnY3VycmVuY3knLFxuICAgICAgICAgIGN1cnJlbmN5OiBmaWVsZC5jdXJyZW5jeSB8fCAnQlJMJ1xuICAgICAgICB9KS5mb3JtYXQodmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdChmaWVsZC5sb2NhbGUgfHwgJ3B0LUJSJywge1xuICAgICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IGZpZWxkLm1pbkZyYWN0aW9uRGlnaXRzIHx8IDAsXG4gICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogZmllbGQubWF4RnJhY3Rpb25EaWdpdHMgfHwgMlxuICAgICAgfSkuZm9ybWF0KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgZGF0ZSBmaWVsZHMsIGZvcm1hdCBhcyBkYXRlXG4gICAgaWYgKGZpZWxkPy50eXBlID09PSAnZGF0ZScgJiYgdmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvY2FsZVNlcnZpY2UuZm9ybWF0RGF0ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gRm9yIHRpbWUgZmllbGRzLCBkaXNwbGF5IEhIOm1tXG4gICAgaWYgKGZpZWxkPy50eXBlID09PSAndGltZScgJiYgdmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgcmV0dXJuIGAke1N0cmluZyh2YWx1ZS5nZXRIb3VycygpKS5wYWRTdGFydCgyLCAnMCcpfToke1N0cmluZyh2YWx1ZS5nZXRNaW51dGVzKCkpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUuc3Vic3RyaW5nKDAsIDUpIDogU3RyaW5nKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgY2hlY2tib3ggZmllbGRzXG4gICAgaWYgKGZpZWxkPy50eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPyB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoJ2Rlc2lnbi5jb21wb25lbnRzX2FpLmJvb2xlYW5fdHJ1ZScpXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKCdkZXNpZ24uY29tcG9uZW50c19haS5ib29sZWFuX2ZhbHNlJyk7XG4gICAgfVxuXG4gICAgLy8gRm9yIG11bHRpc2VsZWN0IGZpZWxkcywgam9pbiBzZWxlY3RlZCBsYWJlbHNcbiAgICBpZiAoZmllbGQ/LnR5cGUgPT09ICdtdWx0aXNlbGVjdCcgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBmaWVsZC5vcHRpb25zIHx8IGZpZWxkLmVudW1PcHRpb25zIHx8IFtdO1xuICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSBmaWVsZC5vcHRpb25WYWx1ZSB8fCAndmFsdWUnO1xuICAgICAgY29uc3Qgb3B0aW9uTGFiZWwgPSBmaWVsZC5vcHRpb25MYWJlbCB8fCAnbGFiZWwnO1xuICAgICAgcmV0dXJuIHZhbHVlLm1hcCh2ID0+IHtcbiAgICAgICAgY29uc3Qgb3B0ID0gb3B0aW9ucy5maW5kKChvOiBhbnkpID0+ICh0eXBlb2YgbyA9PT0gJ29iamVjdCcgPyBvW29wdGlvblZhbHVlXSA6IG8pID09PSB2KTtcbiAgICAgICAgcmV0dXJuIG9wdCA/ICh0eXBlb2Ygb3B0ID09PSAnb2JqZWN0JyA/IG9wdFtvcHRpb25MYWJlbF0gOiBvcHQpIDogdjtcbiAgICAgIH0pLmpvaW4oJywgJyk7XG4gICAgfVxuXG4gICAgLy8gRm9yIHRleHQgZmllbGRzIHdpdGggZG9jdW1lbnQgbWFzaywgZm9ybWF0IHRoZSB2YWx1ZVxuICAgIGlmIChmaWVsZD8udHlwZSA9PT0gJ3RleHQnICYmIGZpZWxkLm1hc2sgPT09ICdkb2N1bWVudCcgJiYgdmFsdWUpIHtcbiAgICAgIGNvbnN0IGRlcGVuZHNPbiA9IGZpZWxkLm1hc2tEZXBlbmRzT24gfHwgJ3R5cGVQZXJzb24nO1xuICAgICAgY29uc3QgdHlwZVBlcnNvbiA9IHRoaXMuZW50aXR5RGF0YVtkZXBlbmRzT25dIHx8ICdKVVJJRElDQUxfUEVSU09OJztcbiAgICAgIHJldHVybiB0aGlzLm1hc2tTZXJ2aWNlLmFwcGx5RG9jdW1lbnRNYXNrKFN0cmluZyh2YWx1ZSksIHR5cGVQZXJzb24pO1xuICAgIH1cbiAgICBpZiAoZmllbGQ/LnR5cGUgPT09ICd0ZXh0JyAmJiBmaWVsZC5tYXNrID09PSAnY3BmJyAmJiB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMubWFza1NlcnZpY2UuYXBwbHlDcGZNYXNrKFN0cmluZyh2YWx1ZSkpO1xuICAgIH1cbiAgICBpZiAoZmllbGQ/LnR5cGUgPT09ICd0ZXh0JyAmJiBmaWVsZC5tYXNrID09PSAnY25waicgJiYgdmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLm1hc2tTZXJ2aWNlLmFwcGx5Q25wak1hc2soU3RyaW5nKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cbn1cbiIsIjwhLS0gTW9kbyBJbmxpbmUgKHBhZHLDo28pIC0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzSW5saW5lTW9kZVwiPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9ybUNvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tIE1vZG8gRGlhbG9nIC0tPlxuPHAtZGlhbG9nXG4gICpuZ0lmPVwiaXNEaWFsb2dNb2RlXCJcbiAgWyh2aXNpYmxlKV09XCJ2aXNpYmxlXCJcbiAgW2hlYWRlcl09XCJkaWFsb2dIZWFkZXIgfCB0cmFuc2xhdGVcIlxuICBbbW9kYWxdPVwidHJ1ZVwiXG4gIFtzdHlsZV09XCJ7IHdpZHRoOiBkaWFsb2dXaWR0aCB9XCJcbiAgW2RyYWdnYWJsZV09XCJkaWFsb2dEcmFnZ2FibGVcIlxuICBbcmVzaXphYmxlXT1cImRpYWxvZ1Jlc2l6YWJsZVwiXG4gIFttYXhpbWl6YWJsZV09XCJkaWFsb2dNYXhpbWl6YWJsZVwiXG4gIFtjbG9zZU9uRXNjYXBlXT1cImRpYWxvZ0Nsb3NlT25Fc2NhcGVcIlxuICBbZGlzbWlzc2FibGVNYXNrXT1cImRpYWxvZ0Rpc21pc3NhYmxlTWFza1wiXG4gIChvbkhpZGUpPVwiY2xvc2UoKVwiPlxuICBcbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvcm1Db250ZW50XCI+PC9uZy1jb250YWluZXI+XG4gIFxuICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZm9vdGVyXCIgKm5nSWY9XCJzaG93U3VibWl0QnV0dG9uIHx8IHNob3dDYW5jZWxCdXR0b25cIj5cbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWZvb3RlclwiPlxuICAgICAgPHAtYnV0dG9uXG4gICAgICAgICpuZ0lmPVwic2hvd0NhbmNlbEJ1dHRvblwiXG4gICAgICAgIFtsYWJlbF09XCJjYW5jZWxMYWJlbCB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtpY29uXT1cImNhbmNlbEJ1dHRvbkljb25cIlxuICAgICAgICBzZXZlcml0eT1cInNlY29uZGFyeVwiXG4gICAgICAgIChvbkNsaWNrKT1cImhhbmRsZUNhbmNlbCgpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImxvYWRpbmdcIj5cbiAgICAgIDwvcC1idXR0b24+XG4gICAgICA8cC1idXR0b25cbiAgICAgICAgKm5nSWY9XCJzaG93U3VibWl0QnV0dG9uXCJcbiAgICAgICAgW2xhYmVsXT1cInN1Ym1pdExhYmVsIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW2ljb25dPVwic3VibWl0QnV0dG9uSWNvblwiXG4gICAgICAgIChvbkNsaWNrKT1cImhhbmRsZVN1Ym1pdCgpXCJcbiAgICAgICAgW2xvYWRpbmddPVwibG9hZGluZ1wiXG4gICAgICAgIFtkaXNhYmxlZF09XCJmb3JtLmludmFsaWRcIj5cbiAgICAgIDwvcC1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L3AtZGlhbG9nPlxuXG48IS0tIE1vZG8gRHJhd2VyIC0tPlxuPHAtZHJhd2VyXG4gICpuZ0lmPVwiaXNEcmF3ZXJNb2RlXCJcbiAgWyh2aXNpYmxlKV09XCJ2aXNpYmxlXCJcbiAgW2hlYWRlcl09XCJkcmF3ZXJIZWFkZXIgfCB0cmFuc2xhdGVcIlxuICBbcG9zaXRpb25dPVwiZHJhd2VyUG9zaXRpb25cIlxuICBbc3R5bGVdPVwiZHJhd2VyU3R5bGVcIlxuICBbc2hvd0Nsb3NlSWNvbl09XCJkcmF3ZXJTaG93Q2xvc2VJY29uXCJcbiAgW2Nsb3NlT25Fc2NhcGVdPVwiZHJhd2VyQ2xvc2VPbkVzY2FwZVwiXG4gIFttb2RhbF09XCJkcmF3ZXJEaXNtaXNzYWJsZVwiXG4gIChvbkhpZGUpPVwiY2xvc2UoKVwiPlxuICBcbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvcm1Db250ZW50XCI+PC9uZy1jb250YWluZXI+XG4gIFxuICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZm9vdGVyXCIgKm5nSWY9XCJzaG93U3VibWl0QnV0dG9uIHx8IHNob3dDYW5jZWxCdXR0b25cIj5cbiAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLWZvb3RlclwiPlxuICAgICAgPHAtYnV0dG9uXG4gICAgICAgICpuZ0lmPVwic2hvd0NhbmNlbEJ1dHRvblwiXG4gICAgICAgIFtsYWJlbF09XCJjYW5jZWxMYWJlbCB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtpY29uXT1cImNhbmNlbEJ1dHRvbkljb25cIlxuICAgICAgICBzZXZlcml0eT1cInNlY29uZGFyeVwiXG4gICAgICAgIChvbkNsaWNrKT1cImhhbmRsZUNhbmNlbCgpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImxvYWRpbmdcIj5cbiAgICAgIDwvcC1idXR0b24+XG4gICAgICA8cC1idXR0b25cbiAgICAgICAgKm5nSWY9XCJzaG93U3VibWl0QnV0dG9uXCJcbiAgICAgICAgW2xhYmVsXT1cInN1Ym1pdExhYmVsIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW2ljb25dPVwic3VibWl0QnV0dG9uSWNvblwiXG4gICAgICAgIChvbkNsaWNrKT1cImhhbmRsZVN1Ym1pdCgpXCJcbiAgICAgICAgW2xvYWRpbmddPVwibG9hZGluZ1wiXG4gICAgICAgIFtkaXNhYmxlZF09XCJmb3JtLmludmFsaWRcIj5cbiAgICAgIDwvcC1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L3AtZHJhd2VyPlxuXG48IS0tIFRlbXBsYXRlIGRvIEZvcm11bMOhcmlvIChyZXV0aWxpesOhdmVsKSAtLT5cbjxuZy10ZW1wbGF0ZSAjZm9ybUNvbnRlbnQ+XG4gIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwiZHluYW1pYy1mb3JtXCI+XG4gICAgXG4gICAgPCEtLSBGaWx0cm9zIEZpeG9zIChhcGVuYXMgbm8gbW9kbyBmaWx0ZXIpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJtb2RlID09PSAnZmlsdGVyJyAmJiBoYXNGaXhlZEZpbHRlcnNcIiBjbGFzcz1cImZpeGVkLWZpbHRlcnMtc2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cImdyaWRcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZml4ZWRGaWx0ZXJzXCI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImlzRmllbGRWaXNpYmxlKGZpZWxkKVwiIFtuZ0NsYXNzXT1cImdldEZpZWxkR3JpZENsYXNzKGZpZWxkKVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZpZWxkVGVtcGxhdGU7IGNvbnRleHQ6IHsgZmllbGQ6IGZpZWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQ2FtcG9zIERpcmV0b3MgKHNlbSBzZcOnw6NvKSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaGFzRmllbGRzXCI+XG4gICAgICA8IS0tIE1vZG8gSW5saW5lIEVkaXQgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiaXNJbmxpbmVFZGl0TW9kZVwiIGNsYXNzPVwiaW5saW5lLWVkaXQtZmllbGRzXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGZvcm1GaWVsZHNcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNGaWVsZFZpc2libGUoZmllbGQpXCIgY2xhc3M9XCJpbmxpbmUtZWRpdC1maWVsZFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlubGluZUVkaXRGaWVsZFRlbXBsYXRlOyBjb250ZXh0OiB7IGZpZWxkOiBmaWVsZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTW9kbyBGb3JtIE5vcm1hbCAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCIhaXNJbmxpbmVFZGl0TW9kZVwiIGNsYXNzPVwiZ3JpZFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmb3JtRmllbGRzXCI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImlzRmllbGRWaXNpYmxlKGZpZWxkKVwiIFtuZ0NsYXNzXT1cImdldEZpZWxkR3JpZENsYXNzKGZpZWxkKVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZpZWxkVGVtcGxhdGU7IGNvbnRleHQ6IHsgZmllbGQ6IGZpZWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2XDp8O1ZXMgZGUgQ2FtcG9zIChtb2RvIGZvcm0pIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJoYXNTZWN0aW9uc1wiIGNsYXNzPVwic2VjdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICA8cC1wYW5lbCBcbiAgICAgICAgKm5nRm9yPVwibGV0IHNlY3Rpb24gb2YgZm9ybVNlY3Rpb25zXCJcbiAgICAgICAgW3RvZ2dsZWFibGVdPVwic2VjdGlvbi50b2dnbGVhYmxlICE9PSBmYWxzZVwiXG4gICAgICAgIFtjb2xsYXBzZWRdPVwic2VjdGlvbi5jb2xsYXBzZWQgfHwgZmFsc2VcIlxuICAgICAgICBbc3R5bGVDbGFzc109XCInc2VjdGlvbi1wYW5lbCdcIj5cbiAgICAgICAgXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxpICpuZ0lmPVwic2VjdGlvbi5pY29uXCIgW2NsYXNzXT1cInNlY3Rpb24uaWNvbiArICcgc2VjdGlvbi1pY29uJ1wiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VjdGlvbi10aXRsZVwiPnt7IHNlY3Rpb24udGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPCEtLSBNb2RvIElubGluZSBFZGl0IC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNJbmxpbmVFZGl0TW9kZVwiIGNsYXNzPVwiaW5saW5lLWVkaXQtZmllbGRzXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGQgb2Ygc2VjdGlvbi5maWVsZHNcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0ZpZWxkVmlzaWJsZShmaWVsZClcIiBjbGFzcz1cImlubGluZS1lZGl0LWZpZWxkXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbmxpbmVFZGl0RmllbGRUZW1wbGF0ZTsgY29udGV4dDogeyBmaWVsZDogZmllbGQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gTW9kbyBGb3JtIE5vcm1hbCAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0lubGluZUVkaXRNb2RlXCIgY2xhc3M9XCJncmlkXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGQgb2Ygc2VjdGlvbi5maWVsZHNcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0ZpZWxkVmlzaWJsZShmaWVsZClcIiBbbmdDbGFzc109XCJnZXRGaWVsZEdyaWRDbGFzcyhmaWVsZClcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZpZWxkVGVtcGxhdGU7IGNvbnRleHQ6IHsgZmllbGQ6IGZpZWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvcC1wYW5lbD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2XDp8O1ZXMgZGUgRmlsdHJvcyAoYXBlbmFzIG5vIG1vZG8gZmlsdGVyKSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwibW9kZSA9PT0gJ2ZpbHRlcicgJiYgaGFzRmlsdGVyU2VjdGlvbnNcIiBjbGFzcz1cImZpbHRlci1zZWN0aW9ucy1jb250YWluZXJcIj5cbiAgICAgIDxwLXBhbmVsIFxuICAgICAgICAqbmdGb3I9XCJsZXQgc2VjdGlvbiBvZiBmaWx0ZXJTZWN0aW9uc1wiXG4gICAgICAgIFtoZWFkZXJdPVwic2VjdGlvbi50aXRsZVwiXG4gICAgICAgIFt0b2dnbGVhYmxlXT1cInRydWVcIlxuICAgICAgICBbY29sbGFwc2VkXT1cInRydWVcIj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIHNlY3Rpb24uZmllbGRzXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNGaWVsZFZpc2libGUoZmllbGQpXCIgW25nQ2xhc3NdPVwiZ2V0RmllbGRHcmlkQ2xhc3MoZmllbGQpXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmaWVsZFRlbXBsYXRlOyBjb250ZXh0OiB7IGZpZWxkOiBmaWVsZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3AtcGFuZWw+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEJvdMO1ZXMgaW5saW5lIChhcGVuYXMgcGFyYSBtb2RvIGlubGluZSkgLS0+XG4gICAgPGRpdiAqbmdJZj1cImlzSW5saW5lTW9kZSAmJiAoc2hvd1N1Ym1pdEJ1dHRvbiB8fCBzaG93Q2FuY2VsQnV0dG9uKVwiIGNsYXNzPVwiZm9ybS1hY3Rpb25zXCI+XG4gICAgICA8cC1idXR0b25cbiAgICAgICAgKm5nSWY9XCJzaG93Q2FuY2VsQnV0dG9uXCJcbiAgICAgICAgW2xhYmVsXT1cImNhbmNlbExhYmVsIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW2ljb25dPVwiY2FuY2VsQnV0dG9uSWNvblwiXG4gICAgICAgIHNldmVyaXR5PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlQ2FuY2VsKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwibG9hZGluZ1wiPlxuICAgICAgPC9wLWJ1dHRvbj5cbiAgICAgIDxwLWJ1dHRvblxuICAgICAgICAqbmdJZj1cInNob3dTdWJtaXRCdXR0b25cIlxuICAgICAgICBbbGFiZWxdPVwic3VibWl0TGFiZWwgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbaWNvbl09XCJzdWJtaXRCdXR0b25JY29uXCJcbiAgICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlU3VibWl0KClcIlxuICAgICAgICBbbG9hZGluZ109XCJsb2FkaW5nXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZFwiPlxuICAgICAgPC9wLWJ1dHRvbj5cbiAgICA8L2Rpdj5cblxuICA8L2Zvcm0+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIFRlbXBsYXRlIGRlIENhbXBvIChyZXV0aWxpesOhdmVsKSAtLT5cbjxuZy10ZW1wbGF0ZSAjZmllbGRUZW1wbGF0ZSBsZXQtZmllbGQ9XCJmaWVsZFwiPlxuICA8IS0tIFRleHQgRmllbGQgLS0+XG4gIDxzaWEtZHluYW1pYy1maWVsZC10ZXh0XG4gICAgKm5nSWY9XCJmaWVsZC50eXBlID09PSAndGV4dCdcIlxuICAgIFtmaWVsZF09XCJmaWVsZFwiXG4gICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgW21vZGVdPVwiZmllbGRNb2RlXCI+XG4gIDwvc2lhLWR5bmFtaWMtZmllbGQtdGV4dD5cblxuICA8IS0tIFRleHRhcmVhIEZpZWxkIC0tPlxuICA8c2lhLWR5bmFtaWMtZmllbGQtdGV4dGFyZWFcbiAgICAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICd0ZXh0YXJlYSdcIlxuICAgIFtmaWVsZF09XCJmaWVsZFwiXG4gICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgW21vZGVdPVwiZmllbGRNb2RlXCI+XG4gIDwvc2lhLWR5bmFtaWMtZmllbGQtdGV4dGFyZWE+XG5cbiAgPCEtLSBOdW1iZXIgRmllbGQgLS0+XG4gIDxzaWEtZHluYW1pYy1maWVsZC1udW1iZXJcbiAgICAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdudW1iZXInXCJcbiAgICBbZmllbGRdPVwiZmllbGRcIlxuICAgIFtmb3JtXT1cImZvcm1cIlxuICAgIFttb2RlXT1cImZpZWxkTW9kZVwiPlxuICA8L3NpYS1keW5hbWljLWZpZWxkLW51bWJlcj5cblxuICA8IS0tIERhdGUgRmllbGQgLS0+XG4gIDxzaWEtZHluYW1pYy1maWVsZC1kYXRlXG4gICAgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnZGF0ZSdcIlxuICAgIFtmaWVsZF09XCJmaWVsZFwiXG4gICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgW21vZGVdPVwiZmllbGRNb2RlXCI+XG4gIDwvc2lhLWR5bmFtaWMtZmllbGQtZGF0ZT5cblxuICA8IS0tIERhdGV0aW1lIEZpZWxkIC0tPlxuICA8c2lhLWR5bmFtaWMtZmllbGQtZGF0ZXRpbWVcbiAgICAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdkYXRldGltZSdcIlxuICAgIFtmaWVsZF09XCJmaWVsZFwiXG4gICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgW21vZGVdPVwiZmllbGRNb2RlXCI+XG4gIDwvc2lhLWR5bmFtaWMtZmllbGQtZGF0ZXRpbWU+XG5cbiAgPCEtLSBEcm9wZG93bi9FbnVtIEZpZWxkIC0tPlxuICA8c2lhLWR5bmFtaWMtZmllbGQtZHJvcGRvd25cbiAgICAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdkcm9wZG93bicgfHwgZmllbGQudHlwZSA9PT0gJ2VudW0nXCJcbiAgICBbZmllbGRdPVwiZmllbGRcIlxuICAgIFtmb3JtXT1cImZvcm1cIlxuICAgIFttb2RlXT1cImZpZWxkTW9kZVwiPlxuICA8L3NpYS1keW5hbWljLWZpZWxkLWRyb3Bkb3duPlxuXG4gIDwhLS0gTG9va3VwIEZpZWxkIC0tPlxuICA8c2lhLWR5bmFtaWMtZmllbGQtbG9va3VwXG4gICAgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnbG9va3VwJ1wiXG4gICAgW2ZpZWxkXT1cImZpZWxkXCJcbiAgICBbZm9ybV09XCJmb3JtXCJcbiAgICBbZm9ybUdyb3VwXT1cImZvcm1cIlxuICAgIFttb2RlXT1cImZpZWxkTW9kZVwiPlxuICA8L3NpYS1keW5hbWljLWZpZWxkLWxvb2t1cD5cblxuICA8IS0tIFRpbWUgRmllbGQgLS0+XG4gIDxzaWEtZHluYW1pYy1maWVsZC10aW1lXG4gICAgKm5nSWY9XCJmaWVsZC50eXBlID09PSAndGltZSdcIlxuICAgIFtmaWVsZF09XCJmaWVsZFwiXG4gICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgW21vZGVdPVwiZmllbGRNb2RlXCI+XG4gIDwvc2lhLWR5bmFtaWMtZmllbGQtdGltZT5cblxuICA8IS0tIENoZWNrYm94IEZpZWxkIC0tPlxuICA8c2lhLWR5bmFtaWMtZmllbGQtY2hlY2tib3hcbiAgICAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdjaGVja2JveCdcIlxuICAgIFtmaWVsZF09XCJmaWVsZFwiXG4gICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgW21vZGVdPVwiZmllbGRNb2RlXCI+XG4gIDwvc2lhLWR5bmFtaWMtZmllbGQtY2hlY2tib3g+XG5cbiAgPCEtLSBNdWx0aVNlbGVjdCBGaWVsZCAtLT5cbiAgPHNpYS1keW5hbWljLWZpZWxkLW11bHRpc2VsZWN0XG4gICAgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnbXVsdGlzZWxlY3QnXCJcbiAgICBbZmllbGRdPVwiZmllbGRcIlxuICAgIFtmb3JtXT1cImZvcm1cIlxuICAgIFttb2RlXT1cImZpZWxkTW9kZVwiPlxuICA8L3NpYS1keW5hbWljLWZpZWxkLW11bHRpc2VsZWN0PlxuXG4gIDwhLS0gSW1hZ2UgRmllbGQgLS0+XG4gIDxzaWEtZHluYW1pYy1maWVsZC1pbWFnZVxuICAgICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ2ltYWdlJ1wiXG4gICAgW2ZpZWxkXT1cImZpZWxkXCJcbiAgICBbZm9ybV09XCJmb3JtXCJcbiAgICBbbW9kZV09XCJmaWVsZE1vZGVcIj5cbiAgPC9zaWEtZHluYW1pYy1maWVsZC1pbWFnZT5cbjwvbmctdGVtcGxhdGU+XG5cblxuPCEtLSBUZW1wbGF0ZSBkZSBDYW1wbyBJbmxpbmUgRWRpdCAtLT5cbjxuZy10ZW1wbGF0ZSAjaW5saW5lRWRpdEZpZWxkVGVtcGxhdGUgbGV0LWZpZWxkPVwiZmllbGRcIj5cbiAgPGRpdiBjbGFzcz1cImVkaXQtaW5saW5lLWZpZWxkXCI+XG4gICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj57eyBmaWVsZC5sYWJlbCB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgXG4gICAgPCEtLSBEaXNwbGF5IE1vZGUgLS0+XG4gICAgPGRpdiBjbGFzcz1cImZpZWxkLWRpc3BsYXlcIiBcbiAgICAgICAgICpuZ0lmPVwiIWlzRmllbGRFZGl0aW5nKGZpZWxkLmZpZWxkKVwiIFxuICAgICAgICAgKGNsaWNrKT1cInN0YXJ0RWRpdEZpZWxkKGZpZWxkLmZpZWxkKVwiXG4gICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiZmllbGQuZGlzYWJsZWRcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZGlzcGxheS12YWx1ZVwiIFxuICAgICAgICAgICAgW2F0dHIuZGF0YS1wbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAoJ2NybXguYnVzaW5lc3Mubm90X2luZm9ybWVkJyB8IHRyYW5zbGF0ZSlcIj5cbiAgICAgICAge3sgZ2V0RmllbGREaXNwbGF5VmFsdWUoZmllbGQuZmllbGQpIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8aSBjbGFzcz1cInBpIHBpLXBlbmNpbCBlZGl0LWljb25cIiAqbmdJZj1cIiFmaWVsZC5kaXNhYmxlZFwiPjwvaT5cbiAgICA8L2Rpdj5cbiAgICBcbiAgICA8IS0tIEVkaXQgTW9kZSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZmllbGQtZWRpdFwiICpuZ0lmPVwiaXNGaWVsZEVkaXRpbmcoZmllbGQuZmllbGQpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29udGFpbmVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmaWVsZFRlbXBsYXRlOyBjb250ZXh0OiB7IGZpZWxkOiBmaWVsZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJlZGl0LWFjdGlvbnNcIj5cbiAgICAgICAgPHAtYnV0dG9uIFxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICBpY29uPVwicGkgcGktY2hlY2tcIiBcbiAgICAgICAgICBbcm91bmRlZF09XCJ0cnVlXCJcbiAgICAgICAgICBzZXZlcml0eT1cInByaW1hcnlcIlxuICAgICAgICAgIChvbkNsaWNrKT1cInNhdmVJbmxpbmVGaWVsZChmaWVsZC5maWVsZClcIiBcbiAgICAgICAgICBbbG9hZGluZ109XCJzYXZpbmdGaWVsZFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImZvcm0uZ2V0KGZpZWxkLmZpZWxkKT8uaW52YWxpZFwiPlxuICAgICAgICA8L3AtYnV0dG9uPlxuICAgICAgICA8cC1idXR0b24gXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgIGljb249XCJwaSBwaS10aW1lc1wiIFxuICAgICAgICAgIFtyb3VuZGVkXT1cInRydWVcIlxuICAgICAgICAgIHNldmVyaXR5PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAob25DbGljayk9XCJjYW5jZWxJbmxpbmVFZGl0KClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJzYXZpbmdGaWVsZFwiPlxuICAgICAgICA8L3AtYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDwhLS0gRXJyb3IgTWVzc2FnZSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1lcnJvclwiICpuZ0lmPVwiZm9ybS5nZXQoZmllbGQuZmllbGQpPy5pbnZhbGlkICYmIGZvcm0uZ2V0KGZpZWxkLmZpZWxkKT8udG91Y2hlZFwiPlxuICAgICAgICA8c21hbGwgY2xhc3M9XCJwLWVycm9yXCI+XG4gICAgICAgICAge3sgZm9ybS5nZXQoZmllbGQuZmllbGQpPy5lcnJvcnM/LlsncmVxdWlyZWQnXSA/ICgnY3JteC5idXNpbmVzcy5yZXF1aXJlZF9maWVsZCcgfCB0cmFuc2xhdGUpIDogJycgfX1cbiAgICAgICAgPC9zbWFsbD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
776
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMtYWkvc3JjL2xpYi9jb21wb25lbnRzL2R5bmFtaWMtZm9ybS9keW5hbWljLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy1haS9zcmMvbGliL2NvbXBvbmVudHMvZHluYW1pYy1mb3JtL2R5bmFtaWMtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUEwQixtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFXOUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzFGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzFG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QXBCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUksU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFBhbmVsTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9wYW5lbCc7XG5pbXBvcnQgeyBEaWFsb2dNb2R1bGUgfSBmcm9tICdwcmltZW5nL2RpYWxvZyc7XG5pbXBvcnQgeyBEcmF3ZXJNb2R1bGUgfSBmcm9tICdwcmltZW5nL2RyYXdlcic7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQgeyBcbiAgRHluYW1pY0Zvcm1GaWVsZENvbmZpZywgXG4gIER5bmFtaWNGb3JtU2VjdGlvbixcbiAgRHluYW1pY0Zvcm1EaXNwbGF5TW9kZSxcbiAgRHluYW1pY0Zvcm1EaWFsb2dDb25maWcsXG4gIER5bmFtaWNGb3JtRHJhd2VyQ29uZmlnXG59IGZyb20gJy4vbW9kZWxzL2R5bmFtaWMtZm9ybS5tb2RlbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdHJhbnNsYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBNYXNrU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21hc2suc2VydmljZSc7XG5pbXBvcnQgeyBMb2NhbGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbG9jYWxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJhbnNsYXRlUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL3RyYW5zbGF0ZS5waXBlJztcbmltcG9ydCB7IER5bmFtaWNGaWVsZFRleHRDb21wb25lbnQgfSBmcm9tICcuL2ZpZWxkcy9keW5hbWljLWZpZWxkLXRleHQuY29tcG9uZW50JztcbmltcG9ydCB7IER5bmFtaWNGaWVsZE51bWJlckNvbXBvbmVudCB9IGZyb20gJy4vZmllbGRzL2R5bmFtaWMtZmllbGQtbnVtYmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEeW5hbWljRmllbGREYXRlQ29tcG9uZW50IH0gZnJvbSAnLi9maWVsZHMvZHluYW1pYy1maWVsZC1kYXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEeW5hbWljRmllbGREYXRldGltZUNvbXBvbmVudCB9IGZyb20gJy4vZmllbGRzL2R5bmFtaWMtZmllbGQtZGF0ZXRpbWUuY29tcG9uZW50JztcbmltcG9ydCB7IER5bmFtaWNGaWVsZERyb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnLi9maWVsZHMvZHluYW1pYy1maWVsZC1kcm9wZG93bi5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHluYW1pY0ZpZWxkTG9va3VwQ29tcG9uZW50IH0gZnJvbSAnLi9maWVsZHMvZHluYW1pYy1maWVsZC1sb29rdXAuY29tcG9uZW50JztcbmltcG9ydCB7IER5bmFtaWNGaWVsZFRleHRhcmVhQ29tcG9uZW50IH0gZnJvbSAnLi9maWVsZHMvZHluYW1pYy1maWVsZC10ZXh0YXJlYS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHluYW1pY0ZpZWxkVGltZUNvbXBvbmVudCB9IGZyb20gJy4vZmllbGRzL2R5bmFtaWMtZmllbGQtdGltZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHluYW1pY0ZpZWxkQ2hlY2tib3hDb21wb25lbnQgfSBmcm9tICcuL2ZpZWxkcy9keW5hbWljLWZpZWxkLWNoZWNrYm94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEeW5hbWljRmllbGRNdWx0aXNlbGVjdENvbXBvbmVudCB9IGZyb20gJy4vZmllbGRzL2R5bmFtaWMtZmllbGQtbXVsdGlzZWxlY3QuY29tcG9uZW50JztcbmltcG9ydCB7IER5bmFtaWNGaWVsZEltYWdlQ29tcG9uZW50IH0gZnJvbSAnLi9maWVsZHMvZHluYW1pYy1maWVsZC1pbWFnZS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzaWEtZHluYW1pYy1mb3JtJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFBhbmVsTW9kdWxlLFxuICAgIERpYWxvZ01vZHVsZSxcbiAgICBEcmF3ZXJNb2R1bGUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIFRyYW5zbGF0ZVBpcGUsXG4gICAgRHluYW1pY0ZpZWxkVGV4dENvbXBvbmVudCxcbiAgICBEeW5hbWljRmllbGROdW1iZXJDb21wb25lbnQsXG4gICAgRHluYW1pY0ZpZWxkRGF0ZUNvbXBvbmVudCxcbiAgICBEeW5hbWljRmllbGREYXRldGltZUNvbXBvbmVudCxcbiAgICBEeW5hbWljRmllbGREcm9wZG93bkNvbXBvbmVudCxcbiAgICBEeW5hbWljRmllbGRMb29rdXBDb21wb25lbnQsXG4gICAgRHluYW1pY0ZpZWxkVGV4dGFyZWFDb21wb25lbnQsXG4gICAgRHluYW1pY0ZpZWxkVGltZUNvbXBvbmVudCxcbiAgICBEeW5hbWljRmllbGRDaGVja2JveENvbXBvbmVudCxcbiAgICBEeW5hbWljRmllbGRNdWx0aXNlbGVjdENvbXBvbmVudCxcbiAgICBEeW5hbWljRmllbGRJbWFnZUNvbXBvbmVudFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vZHluYW1pYy1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2R5bmFtaWMtZm9ybS5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY0Zvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGZvcm1GaWVsZHM6IER5bmFtaWNGb3JtRmllbGRDb25maWdbXSA9IFtdO1xuICBASW5wdXQoKSBmb3JtU2VjdGlvbnM6IER5bmFtaWNGb3JtU2VjdGlvbltdID0gW107XG4gIEBJbnB1dCgpIGZpeGVkRmlsdGVyczogRHluYW1pY0Zvcm1GaWVsZENvbmZpZ1tdID0gW107IC8vIEZpbHRyb3MgZml4b3MgKHNlbXByZSB2aXPDrXZlaXMgbm8gdG9wbylcbiAgQElucHV0KCkgZmlsdGVyU2VjdGlvbnM6IER5bmFtaWNGb3JtU2VjdGlvbltdID0gW107IC8vIFNlw6fDtWVzIGRlIGZpbHRyb3MgKGNvbGFwc8OhdmVpcylcbiAgQElucHV0KCkgZW50aXR5RGF0YTogYW55ID0gbnVsbDtcbiAgQElucHV0KCkgbW9kZTogJ2Zvcm0nIHwgJ2ZpbHRlcicgfCAnaW5saW5lLWVkaXQnID0gJ2Zvcm0nO1xuICBcbiAgLy8gRGlzcGxheSBNb2RlIENvbmZpZ3VyYXRpb25cbiAgQElucHV0KCkgZGlzcGxheU1vZGU6IER5bmFtaWNGb3JtRGlzcGxheU1vZGUgPSAnaW5saW5lJztcbiAgQElucHV0KCkgdmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBkaWFsb2dDb25maWc6IER5bmFtaWNGb3JtRGlhbG9nQ29uZmlnID0ge307XG4gIEBJbnB1dCgpIGRyYXdlckNvbmZpZzogRHluYW1pY0Zvcm1EcmF3ZXJDb25maWcgPSB7fTtcbiAgXG4gIC8vIEJ1dHRvbiBDb25maWd1cmF0aW9uXG4gIEBJbnB1dCgpIHNob3dTdWJtaXRCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd0NhbmNlbEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzdWJtaXRCdXR0b25MYWJlbD86IHN0cmluZztcbiAgQElucHV0KCkgY2FuY2VsQnV0dG9uTGFiZWw/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHN1Ym1pdEJ1dHRvbkljb246IHN0cmluZyA9ICdwaSBwaS1jaGVjayc7XG4gIEBJbnB1dCgpIGNhbmNlbEJ1dHRvbkljb246IHN0cmluZyA9ICdwaSBwaS10aW1lcyc7XG4gIFxuICBAT3V0cHV0KCkgZm9ybVJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxGb3JtR3JvdXA+KCk7XG4gIEBPdXRwdXQoKSBmb3JtU3VibWl0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSB2aXNpYmxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgb25DYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBmaWVsZFNhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZmllbGQ6IHN0cmluZywgdmFsdWU6IGFueSB9PigpO1xuXG4gIGZvcm0hOiBGb3JtR3JvdXA7XG4gIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIC8vIElubGluZSBlZGl0IG1vZGUgc3RhdGVcbiAgZWRpdGluZ0ZpZWxkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgc2F2aW5nRmllbGQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBnZXQgaGFzRmllbGRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZvcm1GaWVsZHMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGdldCBoYXNTZWN0aW9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtU2VjdGlvbnMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGdldCBoYXNGaXhlZEZpbHRlcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZml4ZWRGaWx0ZXJzLmxlbmd0aCA+IDA7XG4gIH1cblxuICBnZXQgaGFzRmlsdGVyU2VjdGlvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyU2VjdGlvbnMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGdldCBhbGxGaWVsZHMoKTogRHluYW1pY0Zvcm1GaWVsZENvbmZpZ1tdIHtcbiAgICAvLyBSZXRvcm5hIHRvZG9zIG9zIGNhbXBvcyAoZGlyZXRvcyArIGRhcyBzZcOnw7VlcyArIGZpbHRyb3MgZml4b3MgKyBzZcOnw7VlcyBkZSBmaWx0cm9zKVxuICAgIGNvbnN0IHNlY3Rpb25GaWVsZHMgPSB0aGlzLmZvcm1TZWN0aW9ucy5mbGF0TWFwKHNlY3Rpb24gPT4gc2VjdGlvbi5maWVsZHMpO1xuICAgIGNvbnN0IGZpbHRlclNlY3Rpb25GaWVsZHMgPSB0aGlzLmZpbHRlclNlY3Rpb25zLmZsYXRNYXAoc2VjdGlvbiA9PiBzZWN0aW9uLmZpZWxkcyk7XG4gICAgcmV0dXJuIFsuLi50aGlzLmZvcm1GaWVsZHMsIC4uLnNlY3Rpb25GaWVsZHMsIC4uLnRoaXMuZml4ZWRGaWx0ZXJzLCAuLi5maWx0ZXJTZWN0aW9uRmllbGRzXTtcbiAgfVxuXG4gIGdldCBpc0lubGluZU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheU1vZGUgPT09ICdpbmxpbmUnO1xuICB9XG5cbiAgZ2V0IGlzSW5saW5lRWRpdE1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gJ2lubGluZS1lZGl0JztcbiAgfVxuXG4gIGdldCBmaWVsZE1vZGUoKTogJ2Zvcm0nIHwgJ2ZpbHRlcicge1xuICAgIHJldHVybiB0aGlzLmlzSW5saW5lRWRpdE1vZGUgPyAnZm9ybScgOiB0aGlzLm1vZGUgYXMgJ2Zvcm0nIHwgJ2ZpbHRlcic7XG4gIH1cblxuICBnZXQgaXNEaWFsb2dNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpc3BsYXlNb2RlID09PSAnZGlhbG9nJztcbiAgfVxuXG4gIGdldCBpc0RyYXdlck1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheU1vZGUgPT09ICdkcmF3ZXInO1xuICB9XG5cbiAgLy8gRGlhbG9nIGNvbmZpZ3VyYXRpb24gd2l0aCBkZWZhdWx0c1xuICBnZXQgZGlhbG9nSGVhZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGlhbG9nQ29uZmlnLmhlYWRlciB8fCB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoJ2Rlc2lnbi5jb21wb25lbnRzX2FpLmZvcm0nKTtcbiAgfVxuXG4gIGdldCBkaWFsb2dXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRpYWxvZ0NvbmZpZy53aWR0aCB8fCAnNjAwcHgnO1xuICB9XG5cbiAgZ2V0IGRpYWxvZ0RyYWdnYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kaWFsb2dDb25maWcuZHJhZ2dhYmxlICE9PSB1bmRlZmluZWQgPyB0aGlzLmRpYWxvZ0NvbmZpZy5kcmFnZ2FibGUgOiBmYWxzZTtcbiAgfVxuXG4gIGdldCBkaWFsb2dSZXNpemFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlhbG9nQ29uZmlnLnJlc2l6YWJsZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5kaWFsb2dDb25maWcucmVzaXphYmxlIDogZmFsc2U7XG4gIH1cblxuICBnZXQgZGlhbG9nTWF4aW1pemFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlhbG9nQ29uZmlnLm1heGltaXphYmxlICE9PSB1bmRlZmluZWQgPyB0aGlzLmRpYWxvZ0NvbmZpZy5tYXhpbWl6YWJsZSA6IGZhbHNlO1xuICB9XG5cbiAgZ2V0IGRpYWxvZ0Nsb3NlT25Fc2NhcGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlhbG9nQ29uZmlnLmNsb3NlT25Fc2NhcGUgIT09IHVuZGVmaW5lZCA/IHRoaXMuZGlhbG9nQ29uZmlnLmNsb3NlT25Fc2NhcGUgOiB0cnVlO1xuICB9XG5cbiAgZ2V0IGRpYWxvZ0Rpc21pc3NhYmxlTWFzaygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kaWFsb2dDb25maWcuZGlzbWlzc2FibGVNYXNrICE9PSB1bmRlZmluZWQgPyB0aGlzLmRpYWxvZ0NvbmZpZy5kaXNtaXNzYWJsZU1hc2sgOiBmYWxzZTtcbiAgfVxuXG4gIC8vIERyYXdlciBjb25maWd1cmF0aW9uIHdpdGggZGVmYXVsdHNcbiAgZ2V0IGRyYXdlckhlYWRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRyYXdlckNvbmZpZy5oZWFkZXIgfHwgdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKCdkZXNpZ24uY29tcG9uZW50c19haS5mb3JtJyk7XG4gIH1cblxuICBnZXQgZHJhd2VyUG9zaXRpb24oKTogJ2xlZnQnIHwgJ3JpZ2h0JyB8ICd0b3AnIHwgJ2JvdHRvbScge1xuICAgIHJldHVybiB0aGlzLmRyYXdlckNvbmZpZy5wb3NpdGlvbiB8fCAncmlnaHQnO1xuICB9XG5cbiAgZ2V0IGRyYXdlclNob3dDbG9zZUljb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZHJhd2VyQ29uZmlnLnNob3dDbG9zZUljb24gIT09IHVuZGVmaW5lZCA/IHRoaXMuZHJhd2VyQ29uZmlnLnNob3dDbG9zZUljb24gOiB0cnVlO1xuICB9XG5cbiAgZ2V0IGRyYXdlckNsb3NlT25Fc2NhcGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZHJhd2VyQ29uZmlnLmNsb3NlT25Fc2NhcGUgIT09IHVuZGVmaW5lZCA/IHRoaXMuZHJhd2VyQ29uZmlnLmNsb3NlT25Fc2NhcGUgOiB0cnVlO1xuICB9XG5cbiAgZ2V0IGRyYXdlckRpc21pc3NhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRyYXdlckNvbmZpZy5kaXNtaXNzYWJsZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5kcmF3ZXJDb25maWcuZGlzbWlzc2FibGUgOiB0cnVlO1xuICB9XG5cbiAgZ2V0IGRyYXdlclN0eWxlKCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5kcmF3ZXJQb3NpdGlvbjtcbiAgICBjb25zdCBpc0hvcml6b250YWwgPSBwb3NpdGlvbiA9PT0gJ2xlZnQnIHx8IHBvc2l0aW9uID09PSAncmlnaHQnO1xuICAgIFxuICAgIC8vIFNlIHRlbSBjdXN0b21XaWR0aCwgdXNhIGVsYVxuICAgIGlmICh0aGlzLmRyYXdlckNvbmZpZy5jdXN0b21XaWR0aCkge1xuICAgICAgcmV0dXJuIGlzSG9yaXpvbnRhbCBcbiAgICAgICAgPyB7IHdpZHRoOiB0aGlzLmRyYXdlckNvbmZpZy5jdXN0b21XaWR0aCB9XG4gICAgICAgIDogeyBoZWlnaHQ6IHRoaXMuZHJhd2VyQ29uZmlnLmN1c3RvbVdpZHRoIH07XG4gICAgfVxuICAgIFxuICAgIC8vIFVzYSBvIHRhbWFuaG8gcGFkcm9uaXphZG9cbiAgICBjb25zdCBzaXplID0gdGhpcy5kcmF3ZXJDb25maWcuc2l6ZSB8fCAnbWVkaXVtJztcbiAgICBjb25zdCBzaXplTWFwID0ge1xuICAgICAgJ3NtYWxsJzogaXNIb3Jpem9udGFsID8gJzI1JScgOiAnMjV2aCcsXG4gICAgICAnbWVkaXVtJzogaXNIb3Jpem9udGFsID8gJzQwJScgOiAnNDB2aCcsXG4gICAgICAnbGFyZ2UnOiBpc0hvcml6b250YWwgPyAnNjAlJyA6ICc2MHZoJyxcbiAgICAgICd4bGFyZ2UnOiBpc0hvcml6b250YWwgPyAnODAlJyA6ICc4MHZoJyxcbiAgICAgICdmdWxsJzogaXNIb3Jpem9udGFsID8gJzEwMCUnIDogJzEwMHZoJ1xuICAgIH07XG4gICAgXG4gICAgY29uc3Qgc2l6ZVZhbHVlID0gc2l6ZU1hcFtzaXplXTtcbiAgICByZXR1cm4gaXNIb3Jpem9udGFsIFxuICAgICAgPyB7IHdpZHRoOiBzaXplVmFsdWUgfVxuICAgICAgOiB7IGhlaWdodDogc2l6ZVZhbHVlIH07XG4gIH1cblxuICBnZXQgc3VibWl0TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdWJtaXRCdXR0b25MYWJlbCB8fCB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoJ2Rlc2lnbi5jb21wb25lbnRzX2FpLnNhdmUnKTtcbiAgfVxuXG4gIGdldCBjYW5jZWxMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNhbmNlbEJ1dHRvbkxhYmVsIHx8IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZSgnZGVzaWduLmNvbXBvbmVudHNfYWkuY2FuY2VsJyk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHRyYW5zbGF0aW9uU2VydmljZTogVHJhbnNsYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgbWFza1NlcnZpY2U6IE1hc2tTZXJ2aWNlLFxuICAgIHByaXZhdGUgbG9jYWxlU2VydmljZTogTG9jYWxlU2VydmljZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0Rm9ybSgpO1xuICAgIGlmICh0aGlzLmVudGl0eURhdGEpIHtcbiAgICAgIHRoaXMubG9hZEVudGl0eURhdGEoKTtcbiAgICB9XG4gICAgdGhpcy5zZXR1cENvbmRpdGlvbmFsRmllbGRzV2F0Y2hlcigpO1xuICAgIHRoaXMuZm9ybVJlYWR5LmVtaXQodGhpcy5mb3JtKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBIYW5kbGUgZW50aXR5RGF0YSBjaGFuZ2VzIGZpcnN0XG4gICAgaWYgKGNoYW5nZXNbJ2VudGl0eURhdGEnXSAmJiB0aGlzLmZvcm0pIHtcbiAgICAgIGlmICh0aGlzLmVudGl0eURhdGEpIHtcbiAgICAgICAgdGhpcy5sb2FkRW50aXR5RGF0YSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gV2hlbiBkaWFsb2cvZHJhd2VyIG9wZW5zLCBlbnN1cmUgZm9ybSBpcyBsb2FkZWQgd2l0aCBlbnRpdHlEYXRhXG4gICAgaWYgKGNoYW5nZXNbJ3Zpc2libGUnXSAmJiBjaGFuZ2VzWyd2aXNpYmxlJ10uY3VycmVudFZhbHVlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIFxuICAgICAgLy8gSWYgb3BlbmluZyB3aXRoIGVudGl0eURhdGEsIHJlbG9hZCBpdCB0byBlbnN1cmUgZm9ybSBpcyBwb3B1bGF0ZWRcbiAgICAgIGlmICh0aGlzLmVudGl0eURhdGEgJiYgdGhpcy5mb3JtKSB7XG4gICAgICAgIHRoaXMubG9hZEVudGl0eURhdGEoKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZW50aXR5RGF0YSAmJiB0aGlzLmZvcm0pIHtcbiAgICAgICAgLy8gSWYgb3BlbmluZyB3aXRob3V0IGVudGl0eURhdGEgKG5ldyByZWNvcmQpLCByZXNldCBmb3JtXG4gICAgICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaW5pdEZvcm0oKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybUNvbnRyb2xzOiBhbnkgPSB7fTtcbiAgICBcbiAgICAvLyBQcm9jZXNzYSB0b2RvcyBvcyBjYW1wb3MgKGRpcmV0b3MgKyBkYXMgc2XDp8O1ZXMpXG4gICAgdGhpcy5hbGxGaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzLmdldERlZmF1bHRWYWx1ZShmaWVsZCk7XG4gICAgICBjb25zdCB2YWxpZGF0b3JzID0gdGhpcy5tb2RlID09PSAnZmlsdGVyJyA/IFtdIDogKGZpZWxkLnZhbGlkYXRvcnMgfHwgW10pO1xuICAgICAgXG4gICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mYi5jb250cm9sKFxuICAgICAgICB7IHZhbHVlOiBkZWZhdWx0VmFsdWUsIGRpc2FibGVkOiBmaWVsZC5kaXNhYmxlZCB8fCBmYWxzZSB9LFxuICAgICAgICB2YWxpZGF0b3JzXG4gICAgICApO1xuICAgICAgXG4gICAgICBmb3JtQ29udHJvbHNbZmllbGQuZmllbGRdID0gY29udHJvbDtcbiAgICB9KTtcbiAgICBcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKGZvcm1Db250cm9scyk7XG4gICAgdGhpcy5hcHBseUluaXRpYWxEaXNhYmxlZFN0YXRlKCk7XG4gIH1cblxuICBwcml2YXRlIGdldERlZmF1bHRWYWx1ZShmaWVsZDogRHluYW1pY0Zvcm1GaWVsZENvbmZpZyk6IGFueSB7XG4gICAgaWYgKGZpZWxkLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmllbGQuZGVmYXVsdFZhbHVlO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZmllbGQudHlwZSkge1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgY2FzZSAndGltZSc6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgY2FzZSAnY2hlY2tib3gnOlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBjYXNlICdtdWx0aXNlbGVjdCc6XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIGNhc2UgJ2Ryb3Bkb3duJzpcbiAgICAgIGNhc2UgJ2VudW0nOlxuICAgICAgICByZXR1cm4gdGhpcy5tb2RlID09PSAnZmlsdGVyJyA/IG51bGwgOiAnJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5SW5pdGlhbERpc2FibGVkU3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5hbGxGaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICBpZiAoZmllbGQuZGlzYWJsZWRXaGVuKSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGZpZWxkLmZpZWxkKTtcbiAgICAgICAgaWYgKGNvbnRyb2wgJiYgdGhpcy5pc0ZpZWxkRGlzYWJsZWQoZmllbGQpKSB7XG4gICAgICAgICAgY29udHJvbC5kaXNhYmxlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRFbnRpdHlEYXRhKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVudGl0eURhdGEgJiYgdGhpcy5mb3JtKSB7XG4gICAgICBjb25zdCBwcm9jZXNzZWREYXRhID0gdGhpcy5wcm9jZXNzRW50aXR5RGF0YSh0aGlzLmVudGl0eURhdGEpO1xuICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUocHJvY2Vzc2VkRGF0YSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzRW50aXR5RGF0YShlbnRpdHk6IGFueSk6IGFueSB7XG4gICAgY29uc3QgcHJvY2Vzc2VkRGF0YSA9IHsgLi4uZW50aXR5IH07XG4gICAgXG4gICAgdGhpcy5hbGxGaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2RhdGUnICYmIHByb2Nlc3NlZERhdGFbZmllbGQuZmllbGRdKSB7XG4gICAgICAgIGNvbnN0IGRhdGVWYWx1ZSA9IHByb2Nlc3NlZERhdGFbZmllbGQuZmllbGRdO1xuICAgICAgICBpZiAodHlwZW9mIGRhdGVWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAvLyBDb252ZXJ0IGRhdGUgc3RyaW5nICh5eXl5LU1NLWRkIG9yIElTTykgdG8gRGF0ZSBvYmplY3QgZm9yIHAtY2FsZW5kYXJcbiAgICAgICAgICAvLyBVc2UgZGF0ZS1vbmx5IGNvbnN0cnVjdG9yIHRvIGF2b2lkIHRpbWV6b25lL2hvdXIgaXNzdWVzXG4gICAgICAgICAgY29uc3QgcGFydHMgPSBkYXRlVmFsdWUuc3Vic3RyaW5nKDAsIDEwKS5zcGxpdCgnLScpO1xuICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgrcGFydHNbMF0sICtwYXJ0c1sxXSAtIDEsICtwYXJ0c1syXSk7XG4gICAgICAgICAgICBpZiAoIWlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgICAgICAgICBwcm9jZXNzZWREYXRhW2ZpZWxkLmZpZWxkXSA9IGRhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAndGltZScgJiYgcHJvY2Vzc2VkRGF0YVtmaWVsZC5maWVsZF0pIHtcbiAgICAgICAgY29uc3QgdGltZVZhbHVlID0gcHJvY2Vzc2VkRGF0YVtmaWVsZC5maWVsZF07XG4gICAgICAgIGlmICh0eXBlb2YgdGltZVZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGNvbnN0IHBhcnRzID0gdGltZVZhbHVlLnNwbGl0KCc6Jyk7XG4gICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIGRhdGUuc2V0SG91cnMocGFyc2VJbnQocGFydHNbMF0sIDEwKSwgcGFyc2VJbnQocGFydHNbMV0sIDEwKSwgMCwgMCk7XG4gICAgICAgICAgICBwcm9jZXNzZWREYXRhW2ZpZWxkLmZpZWxkXSA9IGRhdGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAnbG9va3VwJyAmJiBwcm9jZXNzZWREYXRhW2ZpZWxkLmZpZWxkXSkge1xuICAgICAgICBjb25zdCBsb29rdXBWYWx1ZSA9IHByb2Nlc3NlZERhdGFbZmllbGQuZmllbGRdO1xuICAgICAgICAvLyBLZWVwIHRoZSBmdWxsIG9iamVjdCBpZiBpdCBoYXMgZGlzcGxheSBkYXRhLCBvdGhlcndpc2UgZXh0cmFjdCBJRFxuICAgICAgICBpZiAodHlwZW9mIGxvb2t1cFZhbHVlID09PSAnb2JqZWN0JyAmJiBsb29rdXBWYWx1ZS5pZCkge1xuICAgICAgICAgIGNvbnN0IGhhc0Rpc3BsYXlEYXRhID0gZmllbGQubG9va3VwRGlzcGxheUZpZWxkcyBcbiAgICAgICAgICAgID8gZmllbGQubG9va3VwRGlzcGxheUZpZWxkcy5zb21lKGYgPT4gdGhpcy5nZXROZXN0ZWRWYWx1ZShsb29rdXBWYWx1ZSwgZikpXG4gICAgICAgICAgICA6IGxvb2t1cFZhbHVlW2ZpZWxkLmxvb2t1cERpc3BsYXlGaWVsZCB8fCAnbmFtZSddO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChoYXNEaXNwbGF5RGF0YSkge1xuICAgICAgICAgICAgLy8gS2VlcCB0aGUgZnVsbCBvYmplY3QgdG8gYXZvaWQgdW5uZWNlc3NhcnkgQVBJIGNhbGxzXG4gICAgICAgICAgICBwcm9jZXNzZWREYXRhW2ZpZWxkLmZpZWxkXSA9IGxvb2t1cFZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBPbmx5IGhhcyBJRCwgZXh0cmFjdCBpdFxuICAgICAgICAgICAgcHJvY2Vzc2VkRGF0YVtmaWVsZC5maWVsZF0gPSBsb29rdXBWYWx1ZS5pZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gcHJvY2Vzc2VkRGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TmVzdGVkVmFsdWUob2JqOiBhbnksIHBhdGg6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHBhdGguc3BsaXQoJy4nKS5yZWR1Y2UoKGN1cnJlbnQsIGtleSkgPT4gY3VycmVudD8uW2tleV0sIG9iaik7XG4gIH1cblxuICByZXNldEZvcm0oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZm9ybSkge1xuICAgICAgY29uc3QgcmVzZXRWYWx1ZXM6IGFueSA9IHt9O1xuICAgICAgdGhpcy5hbGxGaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgIHJlc2V0VmFsdWVzW2ZpZWxkLmZpZWxkXSA9IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKGZpZWxkKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5mb3JtLnJlc2V0KHJlc2V0VmFsdWVzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NGaWx0ZXJWYWx1ZShmb3JtVmFsdWU6IGFueSk6IGFueSB7XG4gICAgY29uc3QgcHJvY2Vzc2VkVmFsdWUgPSB7IC4uLmZvcm1WYWx1ZSB9O1xuICAgIFxuICAgIHRoaXMuYWxsRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IHByb2Nlc3NlZFZhbHVlW2ZpZWxkLmZpZWxkXTtcbiAgICAgIFxuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdsb29rdXAnKSB7XG4gICAgICAgIGlmIChmaWVsZFZhbHVlICYmIHR5cGVvZiBmaWVsZFZhbHVlID09PSAnb2JqZWN0JyAmJiBmaWVsZFZhbHVlLmlkKSB7XG4gICAgICAgICAgcHJvY2Vzc2VkVmFsdWVbZmllbGQuZmllbGRdID0gZmllbGRWYWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZFZhbHVlICYmIHR5cGVvZiBmaWVsZFZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHByb2Nlc3NlZFZhbHVlW2ZpZWxkLmZpZWxkXSA9IHsgaWQ6IGZpZWxkVmFsdWUgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9jZXNzZWRWYWx1ZVtmaWVsZC5maWVsZF0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIHByb2Nlc3NlZFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzRm9ybVZhbHVlKGZvcm1WYWx1ZTogYW55KTogYW55IHtcbiAgICBjb25zdCBwcm9jZXNzZWRWYWx1ZSA9IHsgLi4uZm9ybVZhbHVlIH07XG4gICAgXG4gICAgaWYgKHRoaXMuZW50aXR5RGF0YT8uaWQpIHtcbiAgICAgIHByb2Nlc3NlZFZhbHVlLmlkID0gdGhpcy5lbnRpdHlEYXRhLmlkO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmFsbEZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSBwcm9jZXNzZWRWYWx1ZVtmaWVsZC5maWVsZF07XG4gICAgICBcbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAnbG9va3VwJykge1xuICAgICAgICAvLyBLZWVwIHRoZSBmdWxsIG9iamVjdCBmb3IgbG9va3VwIGZpZWxkc1xuICAgICAgICBpZiAoZmllbGRWYWx1ZSAmJiB0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAvLyBPYmplY3QgaXMgYWxyZWFkeSBjb21wbGV0ZSwga2VlcCBpdCBhcyBpc1xuICAgICAgICAgIHByb2Nlc3NlZFZhbHVlW2ZpZWxkLmZpZWxkXSA9IGZpZWxkVmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGRWYWx1ZSAmJiBmaWVsZFZhbHVlICE9PSAnJykge1xuICAgICAgICAgIC8vIElmIGl0J3MganVzdCBhbiBJRCwgd3JhcCBpdCBpbiBhbiBvYmplY3RcbiAgICAgICAgICBwcm9jZXNzZWRWYWx1ZVtmaWVsZC5maWVsZF0gPSB7IGlkOiBmaWVsZFZhbHVlIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvY2Vzc2VkVmFsdWVbZmllbGQuZmllbGRdID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAnZGF0ZScpIHtcbiAgICAgICAgaWYgKGZpZWxkVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgLy8gU2VyaWFsaXplIGFzIHl5eXktTU0tZGQgdXNpbmcgbG9jYWwgZGF0ZSBjb21wb25lbnRzIChubyBVVEMgc2hpZnQpXG4gICAgICAgICAgY29uc3QgeSA9IGZpZWxkVmFsdWUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICBjb25zdCBtID0gU3RyaW5nKGZpZWxkVmFsdWUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgICAgY29uc3QgZCA9IFN0cmluZyhmaWVsZFZhbHVlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgICAgICBwcm9jZXNzZWRWYWx1ZVtmaWVsZC5maWVsZF0gPSBgJHt5fS0ke219LSR7ZH1gO1xuICAgICAgICB9IGVsc2UgaWYgKCFmaWVsZFZhbHVlKSB7XG4gICAgICAgICAgcHJvY2Vzc2VkVmFsdWVbZmllbGQuZmllbGRdID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChbJ3RleHQnLCAndGV4dGFyZWEnLCAnbnVtYmVyJywgJ2VudW0nLCAnZHJvcGRvd24nXS5pbmNsdWRlcyhmaWVsZC50eXBlKSkge1xuICAgICAgICBpZiAoZmllbGRWYWx1ZSA9PT0gJycgfHwgZmllbGRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcHJvY2Vzc2VkVmFsdWVbZmllbGQuZmllbGRdID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAndGltZScpIHtcbiAgICAgICAgaWYgKGZpZWxkVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgY29uc3QgaCA9IFN0cmluZyhmaWVsZFZhbHVlLmdldEhvdXJzKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgICAgY29uc3QgbWluID0gU3RyaW5nKGZpZWxkVmFsdWUuZ2V0TWludXRlcygpKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICAgIHByb2Nlc3NlZFZhbHVlW2ZpZWxkLmZpZWxkXSA9IGAke2h9OiR7bWlufTowMGA7XG4gICAgICAgIH0gZWxzZSBpZiAoIWZpZWxkVmFsdWUpIHtcbiAgICAgICAgICBwcm9jZXNzZWRWYWx1ZVtmaWVsZC5maWVsZF0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIHByb2Nlc3NlZFZhbHVlO1xuICB9XG5cbiAgZ2V0RmllbGRHcmlkQ2xhc3MoZmllbGQ6IER5bmFtaWNGb3JtRmllbGRDb25maWcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNsYXNzZXM6IHN0cmluZ1tdID0gW107XG4gICAgXG4gICAgLy8gQ29sc3BhbiBiYXNlIChwYWRyw6NvOiA2KVxuICAgIGxldCBiYXNlQ29sc3BhbiA9IGZpZWxkLmNvbHNwYW4gfHwgNjtcbiAgICBcbiAgICAvLyBWZXJpZmljYSBjb25kacOnw7VlcyBkZSBjb2xzcGFuIGRpbsOibWljb1xuICAgIGlmIChmaWVsZC5jb2xzcGFuV2hlbiAmJiBmaWVsZC5jb2xzcGFuV2hlbi5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBmaWVsZC5jb2xzcGFuV2hlbikge1xuICAgICAgICBjb25zdCBkZXBlbmRlbnRGaWVsZFZhbHVlID0gdGhpcy5mb3JtLmdldChjb25kaXRpb24uZmllbGQpPy52YWx1ZTtcbiAgICAgICAgaWYgKGRlcGVuZGVudEZpZWxkVmFsdWUgPT09IGNvbmRpdGlvbi52YWx1ZSkge1xuICAgICAgICAgIGJhc2VDb2xzcGFuID0gY29uZGl0aW9uLmNvbHNwYW47XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQWRpY2lvbmEgY2xhc3NlIGJhc2VcbiAgICBjbGFzc2VzLnB1c2goYGNvbC0ke2Jhc2VDb2xzcGFufWApO1xuICAgIFxuICAgIC8vIFN1cG9ydGEgdGFudG8gbyBvYmpldG8gc2l6ZSBxdWFudG8gYXMgcHJvcHJpZWRhZGVzIGFudGlnYXMgKHBhcmEgY29tcGF0aWJpbGlkYWRlKVxuICAgIGNvbnN0IHNpemVYcyA9IGZpZWxkLnNpemU/LnhzID8/IGZpZWxkLmNvbHNwYW5YcztcbiAgICBjb25zdCBzaXplU20gPSBmaWVsZC5zaXplPy5zbSA/PyBmaWVsZC5jb2xzcGFuU207XG4gICAgY29uc3Qgc2l6ZU1kID0gZmllbGQuc2l6ZT8ubWQgPz8gZmllbGQuY29sc3Bhbk1kO1xuICAgIGNvbnN0IHNpemVMZyA9IGZpZWxkLnNpemU/LmxnID8/IGZpZWxkLmNvbHNwYW5MZztcbiAgICBjb25zdCBzaXplWGwgPSBmaWVsZC5zaXplPy54bCA/PyBmaWVsZC5jb2xzcGFuWGw7XG4gICAgXG4gICAgLy8gQWRpY2lvbmEgY2xhc3NlcyByZXNwb25zaXZhcyBzZSBkZWZpbmlkYXNcbiAgICBpZiAoc2l6ZVhzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsYXNzZXMucHVzaChgY29sLXhzLSR7c2l6ZVhzfWApO1xuICAgIH1cbiAgICBpZiAoc2l6ZVNtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsYXNzZXMucHVzaChgY29sLXNtLSR7c2l6ZVNtfWApO1xuICAgIH1cbiAgICBpZiAoc2l6ZU1kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsYXNzZXMucHVzaChgY29sLW1kLSR7c2l6ZU1kfWApO1xuICAgIH1cbiAgICBpZiAoc2l6ZUxnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsYXNzZXMucHVzaChgY29sLWxnLSR7c2l6ZUxnfWApO1xuICAgIH1cbiAgICBpZiAoc2l6ZVhsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsYXNzZXMucHVzaChgY29sLXhsLSR7c2l6ZVhsfWApO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG4gIH1cblxuICBpc0ZpZWxkVmlzaWJsZShmaWVsZDogRHluYW1pY0Zvcm1GaWVsZENvbmZpZyk6IGJvb2xlYW4ge1xuICAgIGlmICghZmllbGQudmlzaWJsZVdoZW4pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGRlcGVuZGVudEZpZWxkVmFsdWUgPSB0aGlzLmZvcm0uZ2V0KGZpZWxkLnZpc2libGVXaGVuLmZpZWxkKT8udmFsdWU7XG4gICAgcmV0dXJuIGRlcGVuZGVudEZpZWxkVmFsdWUgPT09IGZpZWxkLnZpc2libGVXaGVuLnZhbHVlO1xuICB9XG5cbiAgaXNTZWN0aW9uVmlzaWJsZShzZWN0aW9uOiBEeW5hbWljRm9ybVNlY3Rpb24pOiBib29sZWFuIHtcbiAgICBpZiAoIXNlY3Rpb24udmlzaWJsZVdoZW4pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGRlcGVuZGVudEZpZWxkVmFsdWUgPSB0aGlzLmZvcm0uZ2V0KHNlY3Rpb24udmlzaWJsZVdoZW4uZmllbGQpPy52YWx1ZTtcbiAgICByZXR1cm4gZGVwZW5kZW50RmllbGRWYWx1ZSA9PT0gc2VjdGlvbi52aXNpYmxlV2hlbi52YWx1ZTtcbiAgfVxuXG4gIGlzRmllbGREaXNhYmxlZChmaWVsZDogRHluYW1pY0Zvcm1GaWVsZENvbmZpZyk6IGJvb2xlYW4ge1xuICAgIGlmIChmaWVsZC5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIGlmICghKCdkaXNhYmxlZFdoZW4nIGluIGZpZWxkKSB8fCAhZmllbGQuZGlzYWJsZWRXaGVuKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZGVwZW5kZW50RmllbGRWYWx1ZSA9IHRoaXMuZm9ybS5nZXQoZmllbGQuZGlzYWJsZWRXaGVuIS5maWVsZCk/LnZhbHVlO1xuICAgIFxuICAgIGlmIChmaWVsZC5kaXNhYmxlZFdoZW4hLnZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gIWRlcGVuZGVudEZpZWxkVmFsdWU7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBkZXBlbmRlbnRGaWVsZFZhbHVlID09PSBmaWVsZC5kaXNhYmxlZFdoZW4hLnZhbHVlO1xuICB9XG5cbiAgc2V0dXBDb25kaXRpb25hbEZpZWxkc1dhdGNoZXIoKTogdm9pZCB7XG4gICAgY29uc3QgdmlzaWJsZURlcGVuZGVudEZpZWxkcyA9IHRoaXMuYWxsRmllbGRzLmZpbHRlcihmaWVsZCA9PiBmaWVsZC52aXNpYmxlV2hlbik7XG4gICAgY29uc3QgdmlzaWJsZVdhdGNoZWRGaWVsZHMgPSBbLi4ubmV3IFNldCh2aXNpYmxlRGVwZW5kZW50RmllbGRzLm1hcChmaWVsZCA9PiBmaWVsZC52aXNpYmxlV2hlbiEuZmllbGQpKV07XG5cbiAgICBjb25zdCBkaXNhYmxlZERlcGVuZGVudEZpZWxkcyA9IHRoaXMuYWxsRmllbGRzLmZpbHRlcihmaWVsZCA9PiBmaWVsZC5kaXNhYmxlZFdoZW4pO1xuICAgIGNvbnN0IGRpc2FibGVkV2F0Y2hlZEZpZWxkcyA9IFsuLi5uZXcgU2V0KGRpc2FibGVkRGVwZW5kZW50RmllbGRzLm1hcChmaWVsZCA9PiBmaWVsZC5kaXNhYmxlZFdoZW4hLmZpZWxkKSldO1xuXG4gICAgLy8gQWxzbyB3YXRjaCBmaWVsZHMgdGhhdCBjb250cm9sIHNlY3Rpb24gdmlzaWJpbGl0eVxuICAgIGNvbnN0IHNlY3Rpb25WaXNpYmxlRmllbGRzID0gdGhpcy5mb3JtU2VjdGlvbnNcbiAgICAgIC5maWx0ZXIoc2VjdGlvbiA9PiBzZWN0aW9uLnZpc2libGVXaGVuKVxuICAgICAgLm1hcChzZWN0aW9uID0+IHNlY3Rpb24udmlzaWJsZVdoZW4hLmZpZWxkKTtcblxuICAgIGNvbnN0IGFsbFdhdGNoZWRGaWVsZHMgPSBbLi4ubmV3IFNldChbLi4udmlzaWJsZVdhdGNoZWRGaWVsZHMsIC4uLmRpc2FibGVkV2F0Y2hlZEZpZWxkcywgLi4uc2VjdGlvblZpc2libGVGaWVsZHNdKV07XG5cbiAgICBhbGxXYXRjaGVkRmllbGRzLmZvckVhY2goZmllbGROYW1lID0+IHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGZpZWxkTmFtZSk7XG4gICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICBjb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY2xlYXJIaWRkZW5GaWVsZHMoKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZURpc2FibGVkRmllbGRzKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlRGlzYWJsZWRGaWVsZHMoKTogdm9pZCB7XG4gICAgdGhpcy5hbGxGaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICBpZiAoZmllbGQuZGlzYWJsZWRXaGVuKSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGZpZWxkLmZpZWxkKTtcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICBjb25zdCBzaG91bGRCZURpc2FibGVkID0gdGhpcy5pc0ZpZWxkRGlzYWJsZWQoZmllbGQpO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChzaG91bGRCZURpc2FibGVkICYmIGNvbnRyb2wuZW5hYmxlZCkge1xuICAgICAgICAgICAgY29udHJvbC5zZXRWYWx1ZShudWxsKTtcbiAgICAgICAgICAgIGNvbnRyb2wuZGlzYWJsZSgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXNob3VsZEJlRGlzYWJsZWQgJiYgY29udHJvbC5kaXNhYmxlZCAmJiAhZmllbGQuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuZW5hYmxlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjbGVhckhpZGRlbkZpZWxkcygpOiB2b2lkIHtcbiAgICB0aGlzLmFsbEZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgIGlmIChmaWVsZC52aXNpYmxlV2hlbiAmJiAhdGhpcy5pc0ZpZWxkVmlzaWJsZShmaWVsZCkpIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoZmllbGQuZmllbGQpO1xuICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgIGNvbnN0IHJlc2V0VmFsdWUgPSB0aGlzLmdldERlZmF1bHRWYWx1ZShmaWVsZCk7XG4gICAgICAgICAgY29udHJvbC5zZXRWYWx1ZShyZXNldFZhbHVlKTtcbiAgICAgICAgICBjb250cm9sLm1hcmtBc1VudG91Y2hlZCgpO1xuICAgICAgICAgIGNvbnRyb2wubWFya0FzUHJpc3RpbmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0Rm9ybSgpOiBGb3JtR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmZvcm07XG4gIH1cblxuICBjbGVhckZpbHRlcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2ZpbHRlcicpIHtcbiAgICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0VHlwZVBlcnNvblZhbHVlKCk6ICdOQVRVUkFMX1BFUlNPTicgfCAnSlVSSURJQ0FMX1BFUlNPTicge1xuICAgIGNvbnN0IHR5cGVQZXJzb25WYWx1ZSA9IHRoaXMuZm9ybT8uZ2V0KCd0eXBlUGVyc29uJyk/LnZhbHVlO1xuICAgIHJldHVybiB0eXBlUGVyc29uVmFsdWUgfHwgJ0pVUklESUNBTF9QRVJTT04nO1xuICB9XG5cbiAgLy8gRGlzcGxheSBNb2RlIENvbnRyb2wgTWV0aG9kc1xuICBvcGVuKGVudGl0eT86IGFueSk6IHZvaWQge1xuICAgIGlmIChlbnRpdHkpIHtcbiAgICAgIHRoaXMuZW50aXR5RGF0YSA9IGVudGl0eTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbnRpdHlEYXRhID0gbnVsbDtcbiAgICAgIHRoaXMucmVzZXRGb3JtKCk7IC8vIFJlc2V0IGZvcm0gd2hlbiBvcGVuaW5nIGZvciBuZXcgZW50aXR5XG4gICAgfVxuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOyAvLyBSZXNldCBsb2FkaW5nIHN0YXRlXG4gICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICB0aGlzLnZpc2libGVDaGFuZ2UuZW1pdCh0cnVlKTtcbiAgfVxuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOyAvLyBSZXNldCBsb2FkaW5nIHN0YXRlXG4gICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy52aXNpYmxlQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIHRoaXMucmVzZXRGb3JtKCk7IC8vIFJlc2V0IGZvcm0gd2hlbiBjbG9zaW5nXG4gICAgdGhpcy5vbkNhbmNlbC5lbWl0KCk7XG4gIH1cblxuICBoYW5kbGVDYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG5cbiAgaGFuZGxlU3VibWl0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICdmb3JtJyAmJiB0aGlzLmZvcm0uaW52YWxpZCkge1xuICAgICAgdGhpcy5mb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMubW9kZSAhPT0gJ2ZpbHRlcicpIHtcbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMubW9kZSA9PT0gJ2ZpbHRlcicgXG4gICAgICA/IHRoaXMucHJvY2Vzc0ZpbHRlclZhbHVlKHRoaXMuZm9ybS52YWx1ZSlcbiAgICAgIDogdGhpcy5wcm9jZXNzRm9ybVZhbHVlKHRoaXMuZm9ybS52YWx1ZSk7XG4gICAgXG4gICAgdGhpcy5mb3JtU3VibWl0LmVtaXQoZm9ybVZhbHVlKTtcbiAgfVxuXG4gIC8vIElubGluZSBFZGl0IE1vZGUgTWV0aG9kc1xuICBzdGFydEVkaXRGaWVsZChmaWVsZE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzSW5saW5lRWRpdE1vZGUpIHtcbiAgICAgIHRoaXMuZWRpdGluZ0ZpZWxkID0gZmllbGROYW1lO1xuICAgICAgXG4gICAgICAvLyBFbnN1cmUgdGhlIGZpZWxkIGhhcyB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIGVudGl0eURhdGFcbiAgICAgIGlmICh0aGlzLmVudGl0eURhdGEpIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoZmllbGROYW1lKTtcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuYWxsRmllbGRzLmZpbmQoZiA9PiBmLmZpZWxkID09PSBmaWVsZE5hbWUpO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5lbnRpdHlEYXRhW2ZpZWxkTmFtZV07XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRm9yIGxvb2t1cCBmaWVsZHMgaW4gaW5saW5lLWVkaXQgbW9kZSwga2VlcCB0aGUgZnVsbCBvYmplY3RcbiAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHVubmVjZXNzYXJ5IEFQSSBjYWxscyBzaW5jZSB3ZSBhbHJlYWR5IGhhdmUgdGhlIGRhdGFcbiAgICAgICAgICBpZiAoZmllbGQ/LnR5cGUgPT09ICdsb29rdXAnICYmIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIC8vIEtlZXAgdGhlIGZ1bGwgb2JqZWN0IC0gdGhlIGxvb2t1cCBjb21wb25lbnQgd2lsbCB1c2UgaXRcbiAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQ/LnR5cGUgPT09ICdkYXRlJyAmJiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAvLyBDb252ZXJ0IGRhdGUgc3RyaW5nIHRvIERhdGUgb2JqZWN0IGZvciBwLWNhbGVuZGFyIChkYXRlLW9ubHksIG5vIHRpbWUgY29tcG9uZW50KVxuICAgICAgICAgICAgY29uc3QgcGFydHMgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgMTApLnNwbGl0KCctJyk7XG4gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgrcGFydHNbMF0sICtwYXJ0c1sxXSAtIDEsICtwYXJ0c1syXSk7XG4gICAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUoIWlzTmFOKGRhdGUuZ2V0VGltZSgpKSA/IGRhdGUgOiB2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb250cm9sLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaXNGaWVsZEVkaXRpbmcoZmllbGROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0aW5nRmllbGQgPT09IGZpZWxkTmFtZTtcbiAgfVxuXG4gIHNhdmVJbmxpbmVGaWVsZChmaWVsZE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0lubGluZUVkaXRNb2RlKSByZXR1cm47XG5cbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChmaWVsZE5hbWUpO1xuICAgIGlmICghY29udHJvbCB8fCBjb250cm9sLmludmFsaWQpIHtcbiAgICAgIGNvbnRyb2w/Lm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNhdmluZ0ZpZWxkID0gdHJ1ZTtcbiAgICBcbiAgICBsZXQgZmllbGRWYWx1ZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgXG4gICAgLy8gRm9yIGxvb2t1cCBmaWVsZHMsIGtlZXAgdGhlIGZ1bGwgb2JqZWN0IChkb24ndCBleHRyYWN0IElEKVxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5hbGxGaWVsZHMuZmluZChmID0+IGYuZmllbGQgPT09IGZpZWxkTmFtZSk7XG4gICAgaWYgKGZpZWxkPy50eXBlID09PSAnbG9va3VwJyAmJiBmaWVsZFZhbHVlICYmIHR5cGVvZiBmaWVsZFZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgICAgLy8gSWYgaXQncyBqdXN0IGFuIElELCB3cmFwIGl0IGluIGFuIG9iamVjdFxuICAgICAgZmllbGRWYWx1ZSA9IHsgaWQ6IGZpZWxkVmFsdWUgfTtcbiAgICB9XG5cbiAgICAvLyBGb3IgZGF0ZSBmaWVsZHMsIHNlcmlhbGl6ZSBhcyB5eXl5LU1NLWRkIChubyB0aW1lIGNvbXBvbmVudClcbiAgICBpZiAoZmllbGQ/LnR5cGUgPT09ICdkYXRlJyAmJiBmaWVsZFZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgY29uc3QgeSA9IGZpZWxkVmFsdWUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIGNvbnN0IG0gPSBTdHJpbmcoZmllbGRWYWx1ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgIGNvbnN0IGQgPSBTdHJpbmcoZmllbGRWYWx1ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICBmaWVsZFZhbHVlID0gYCR7eX0tJHttfS0ke2R9YDtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5maWVsZFNhdmUuZW1pdCh7IGZpZWxkOiBmaWVsZE5hbWUsIHZhbHVlOiBmaWVsZFZhbHVlIH0pO1xuICB9XG5cbiAgY2FuY2VsSW5saW5lRWRpdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0lubGluZUVkaXRNb2RlICYmIHRoaXMuZWRpdGluZ0ZpZWxkKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldCh0aGlzLmVkaXRpbmdGaWVsZCk7XG4gICAgICBpZiAoY29udHJvbCAmJiB0aGlzLmVudGl0eURhdGEpIHtcbiAgICAgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCB2YWx1ZVxuICAgICAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gdGhpcy5lbnRpdHlEYXRhW3RoaXMuZWRpdGluZ0ZpZWxkXTtcbiAgICAgICAgY29udHJvbC5zZXRWYWx1ZShvcmlnaW5hbFZhbHVlKTtcbiAgICAgICAgY29udHJvbC5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgICBjb250cm9sLm1hcmtBc1VudG91Y2hlZCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5lZGl0aW5nRmllbGQgPSBudWxsO1xuICAgICAgdGhpcy5zYXZpbmdGaWVsZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIE1ldGhvZCB0byBiZSBjYWxsZWQgYnkgcGFyZW50IGFmdGVyIHNhdmUgY29tcGxldGVzXG4gIGNvbXBsZXRlSW5saW5lRWRpdCgpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRpbmdGaWVsZCA9IG51bGw7XG4gICAgdGhpcy5zYXZpbmdGaWVsZCA9IGZhbHNlO1xuICB9XG5cbiAgZ2V0RmllbGREaXNwbGF5VmFsdWUoZmllbGROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5lbnRpdHlEYXRhKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuYWxsRmllbGRzLmZpbmQoZiA9PiBmLmZpZWxkID09PSBmaWVsZE5hbWUpO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5lbnRpdHlEYXRhW2ZpZWxkTmFtZV07XG5cbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gJyc7XG5cbiAgICAvLyBGb3IgbG9va3VwIGZpZWxkcywgcmV0dXJuIHRoZSBkaXNwbGF5IG5hbWVcbiAgICBpZiAoZmllbGQ/LnR5cGUgPT09ICdsb29rdXAnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUubmFtZSkge1xuICAgICAgcmV0dXJuIHZhbHVlLm5hbWU7XG4gICAgfVxuXG4gICAgLy8gRm9yIGxvb2t1cCBmaWVsZHMgd2l0aCBtdWx0aXBsZSBkaXNwbGF5IGZpZWxkc1xuICAgIGlmIChmaWVsZD8udHlwZSA9PT0gJ2xvb2t1cCcgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBmaWVsZC5sb29rdXBEaXNwbGF5RmllbGRzKSB7XG4gICAgICByZXR1cm4gZmllbGQubG9va3VwRGlzcGxheUZpZWxkc1xuICAgICAgICAubWFwKGYgPT4gdGhpcy5nZXROZXN0ZWRWYWx1ZSh2YWx1ZSwgZikpXG4gICAgICAgIC5maWx0ZXIodiA9PiB2KVxuICAgICAgICAuam9pbignIC0gJyk7XG4gICAgfVxuXG4gICAgLy8gRm9yIGRyb3Bkb3duL2VudW0gZmllbGRzLCBmaW5kIHRoZSBtYXRjaGluZyBvcHRpb24gbGFiZWxcbiAgICBpZiAoKGZpZWxkPy50eXBlID09PSAnZHJvcGRvd24nIHx8IGZpZWxkPy50eXBlID09PSAnZW51bScpICYmIGZpZWxkKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gZmllbGQub3B0aW9ucyB8fCBmaWVsZC5lbnVtT3B0aW9ucyB8fCBbXTtcbiAgICAgIGNvbnN0IG9wdGlvblZhbHVlID0gZmllbGQub3B0aW9uVmFsdWUgfHwgJ3ZhbHVlJztcbiAgICAgIGNvbnN0IG9wdGlvbkxhYmVsID0gZmllbGQub3B0aW9uTGFiZWwgfHwgJ2xhYmVsJztcbiAgICAgIGNvbnN0IG1hdGNoaW5nT3B0aW9uID0gb3B0aW9ucy5maW5kKChvcHQ6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBvcHRWYWwgPSB0eXBlb2Ygb3B0ID09PSAnb2JqZWN0JyA/IG9wdFtvcHRpb25WYWx1ZV0gOiBvcHQ7XG4gICAgICAgIHJldHVybiBvcHRWYWwgPT09IHZhbHVlO1xuICAgICAgfSk7XG4gICAgICBpZiAobWF0Y2hpbmdPcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBtYXRjaGluZ09wdGlvbiA9PT0gJ29iamVjdCcgPyBtYXRjaGluZ09wdGlvbltvcHRpb25MYWJlbF0gOiBtYXRjaGluZ09wdGlvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGb3IgbnVtYmVyIGZpZWxkcywgZm9ybWF0IGFwcHJvcHJpYXRlbHlcbiAgICBpZiAoZmllbGQ/LnR5cGUgPT09ICdudW1iZXInICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmIChmaWVsZC5udW1iZXJNb2RlID09PSAnY3VycmVuY3knKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQoZmllbGQubG9jYWxlIHx8ICdwdC1CUicsIHtcbiAgICAgICAgICBzdHlsZTogJ2N1cnJlbmN5JyxcbiAgICAgICAgICBjdXJyZW5jeTogZmllbGQuY3VycmVuY3kgfHwgJ0JSTCdcbiAgICAgICAgfSkuZm9ybWF0KHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQoZmllbGQubG9jYWxlIHx8ICdwdC1CUicsIHtcbiAgICAgICAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiBmaWVsZC5taW5GcmFjdGlvbkRpZ2l0cyB8fCAwLFxuICAgICAgICBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IGZpZWxkLm1heEZyYWN0aW9uRGlnaXRzIHx8IDJcbiAgICAgIH0pLmZvcm1hdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gRm9yIGRhdGUgZmllbGRzLCBmb3JtYXQgYXMgZGF0ZVxuICAgIGlmIChmaWVsZD8udHlwZSA9PT0gJ2RhdGUnICYmIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2NhbGVTZXJ2aWNlLmZvcm1hdERhdGUodmFsdWUpO1xuICAgIH1cblxuICAgIC8vIEZvciB0aW1lIGZpZWxkcywgZGlzcGxheSBISDptbVxuICAgIGlmIChmaWVsZD8udHlwZSA9PT0gJ3RpbWUnICYmIHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiBgJHtTdHJpbmcodmFsdWUuZ2V0SG91cnMoKSkucGFkU3RhcnQoMiwgJzAnKX06JHtTdHJpbmcodmFsdWUuZ2V0TWludXRlcygpKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlLnN1YnN0cmluZygwLCA1KSA6IFN0cmluZyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gRm9yIGNoZWNrYm94IGZpZWxkc1xuICAgIGlmIChmaWVsZD8udHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgcmV0dXJuIHZhbHVlID8gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKCdkZXNpZ24uY29tcG9uZW50c19haS5ib29sZWFuX3RydWUnKVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZSgnZGVzaWduLmNvbXBvbmVudHNfYWkuYm9vbGVhbl9mYWxzZScpO1xuICAgIH1cblxuICAgIC8vIEZvciBtdWx0aXNlbGVjdCBmaWVsZHMsIGpvaW4gc2VsZWN0ZWQgbGFiZWxzXG4gICAgaWYgKGZpZWxkPy50eXBlID09PSAnbXVsdGlzZWxlY3QnICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gZmllbGQub3B0aW9ucyB8fCBmaWVsZC5lbnVtT3B0aW9ucyB8fCBbXTtcbiAgICAgIGNvbnN0IG9wdGlvblZhbHVlID0gZmllbGQub3B0aW9uVmFsdWUgfHwgJ3ZhbHVlJztcbiAgICAgIGNvbnN0IG9wdGlvbkxhYmVsID0gZmllbGQub3B0aW9uTGFiZWwgfHwgJ2xhYmVsJztcbiAgICAgIHJldHVybiB2YWx1ZS5tYXAodiA9PiB7XG4gICAgICAgIGNvbnN0IG9wdCA9IG9wdGlvbnMuZmluZCgobzogYW55KSA9PiAodHlwZW9mIG8gPT09ICdvYmplY3QnID8gb1tvcHRpb25WYWx1ZV0gOiBvKSA9PT0gdik7XG4gICAgICAgIHJldHVybiBvcHQgPyAodHlwZW9mIG9wdCA9PT0gJ29iamVjdCcgPyBvcHRbb3B0aW9uTGFiZWxdIDogb3B0KSA6IHY7XG4gICAgICB9KS5qb2luKCcsICcpO1xuICAgIH1cblxuICAgIC8vIEZvciB0ZXh0IGZpZWxkcyB3aXRoIGRvY3VtZW50IG1hc2ssIGZvcm1hdCB0aGUgdmFsdWVcbiAgICBpZiAoZmllbGQ/LnR5cGUgPT09ICd0ZXh0JyAmJiBmaWVsZC5tYXNrID09PSAnZG9jdW1lbnQnICYmIHZhbHVlKSB7XG4gICAgICBjb25zdCBkZXBlbmRzT24gPSBmaWVsZC5tYXNrRGVwZW5kc09uIHx8ICd0eXBlUGVyc29uJztcbiAgICAgIGNvbnN0IHR5cGVQZXJzb24gPSB0aGlzLmVudGl0eURhdGFbZGVwZW5kc09uXSB8fCAnSlVSSURJQ0FMX1BFUlNPTic7XG4gICAgICByZXR1cm4gdGhpcy5tYXNrU2VydmljZS5hcHBseURvY3VtZW50TWFzayhTdHJpbmcodmFsdWUpLCB0eXBlUGVyc29uKTtcbiAgICB9XG4gICAgaWYgKGZpZWxkPy50eXBlID09PSAndGV4dCcgJiYgZmllbGQubWFzayA9PT0gJ2NwZicgJiYgdmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLm1hc2tTZXJ2aWNlLmFwcGx5Q3BmTWFzayhTdHJpbmcodmFsdWUpKTtcbiAgICB9XG4gICAgaWYgKGZpZWxkPy50eXBlID09PSAndGV4dCcgJiYgZmllbGQubWFzayA9PT0gJ2NucGonICYmIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXNrU2VydmljZS5hcHBseUNucGpNYXNrKFN0cmluZyh2YWx1ZSkpO1xuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG59XG4iLCI8IS0tIE1vZG8gSW5saW5lIChwYWRyw6NvKSAtLT5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJpc0lubGluZU1vZGVcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvcm1Db250ZW50XCI+PC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cblxuPCEtLSBNb2RvIERpYWxvZyAtLT5cbjxwLWRpYWxvZ1xuICAqbmdJZj1cImlzRGlhbG9nTW9kZVwiXG4gIFsodmlzaWJsZSldPVwidmlzaWJsZVwiXG4gIFtoZWFkZXJdPVwiZGlhbG9nSGVhZGVyIHwgdHJhbnNsYXRlXCJcbiAgW21vZGFsXT1cInRydWVcIlxuICBbc3R5bGVdPVwieyB3aWR0aDogZGlhbG9nV2lkdGggfVwiXG4gIFtkcmFnZ2FibGVdPVwiZGlhbG9nRHJhZ2dhYmxlXCJcbiAgW3Jlc2l6YWJsZV09XCJkaWFsb2dSZXNpemFibGVcIlxuICBbbWF4aW1pemFibGVdPVwiZGlhbG9nTWF4aW1pemFibGVcIlxuICBbY2xvc2VPbkVzY2FwZV09XCJkaWFsb2dDbG9zZU9uRXNjYXBlXCJcbiAgW2Rpc21pc3NhYmxlTWFza109XCJkaWFsb2dEaXNtaXNzYWJsZU1hc2tcIlxuICAob25IaWRlKT1cImNsb3NlKClcIj5cbiAgXG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmb3JtQ29udGVudFwiPjwvbmctY29udGFpbmVyPlxuICBcbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZvb3RlclwiICpuZ0lmPVwic2hvd1N1Ym1pdEJ1dHRvbiB8fCBzaG93Q2FuY2VsQnV0dG9uXCI+XG4gICAgPGRpdiBjbGFzcz1cImRpYWxvZy1mb290ZXJcIj5cbiAgICAgIDxwLWJ1dHRvblxuICAgICAgICAqbmdJZj1cInNob3dDYW5jZWxCdXR0b25cIlxuICAgICAgICBbbGFiZWxdPVwiY2FuY2VsTGFiZWwgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbaWNvbl09XCJjYW5jZWxCdXR0b25JY29uXCJcbiAgICAgICAgc2V2ZXJpdHk9XCJzZWNvbmRhcnlcIlxuICAgICAgICAob25DbGljayk9XCJoYW5kbGVDYW5jZWwoKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nXCI+XG4gICAgICA8L3AtYnV0dG9uPlxuICAgICAgPHAtYnV0dG9uXG4gICAgICAgICpuZ0lmPVwic2hvd1N1Ym1pdEJ1dHRvblwiXG4gICAgICAgIFtsYWJlbF09XCJzdWJtaXRMYWJlbCB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtpY29uXT1cInN1Ym1pdEJ1dHRvbkljb25cIlxuICAgICAgICAob25DbGljayk9XCJoYW5kbGVTdWJtaXQoKVwiXG4gICAgICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZm9ybS5pbnZhbGlkXCI+XG4gICAgICA8L3AtYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9wLWRpYWxvZz5cblxuPCEtLSBNb2RvIERyYXdlciAtLT5cbjxwLWRyYXdlclxuICAqbmdJZj1cImlzRHJhd2VyTW9kZVwiXG4gIFsodmlzaWJsZSldPVwidmlzaWJsZVwiXG4gIFtoZWFkZXJdPVwiZHJhd2VySGVhZGVyIHwgdHJhbnNsYXRlXCJcbiAgW3Bvc2l0aW9uXT1cImRyYXdlclBvc2l0aW9uXCJcbiAgW3N0eWxlXT1cImRyYXdlclN0eWxlXCJcbiAgW3Nob3dDbG9zZUljb25dPVwiZHJhd2VyU2hvd0Nsb3NlSWNvblwiXG4gIFtjbG9zZU9uRXNjYXBlXT1cImRyYXdlckNsb3NlT25Fc2NhcGVcIlxuICBbbW9kYWxdPVwiZHJhd2VyRGlzbWlzc2FibGVcIlxuICAob25IaWRlKT1cImNsb3NlKClcIj5cbiAgXG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmb3JtQ29udGVudFwiPjwvbmctY29udGFpbmVyPlxuICBcbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZvb3RlclwiICpuZ0lmPVwic2hvd1N1Ym1pdEJ1dHRvbiB8fCBzaG93Q2FuY2VsQnV0dG9uXCI+XG4gICAgPGRpdiBjbGFzcz1cImRyYXdlci1mb290ZXJcIj5cbiAgICAgIDxwLWJ1dHRvblxuICAgICAgICAqbmdJZj1cInNob3dDYW5jZWxCdXR0b25cIlxuICAgICAgICBbbGFiZWxdPVwiY2FuY2VsTGFiZWwgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbaWNvbl09XCJjYW5jZWxCdXR0b25JY29uXCJcbiAgICAgICAgc2V2ZXJpdHk9XCJzZWNvbmRhcnlcIlxuICAgICAgICAob25DbGljayk9XCJoYW5kbGVDYW5jZWwoKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nXCI+XG4gICAgICA8L3AtYnV0dG9uPlxuICAgICAgPHAtYnV0dG9uXG4gICAgICAgICpuZ0lmPVwic2hvd1N1Ym1pdEJ1dHRvblwiXG4gICAgICAgIFtsYWJlbF09XCJzdWJtaXRMYWJlbCB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtpY29uXT1cInN1Ym1pdEJ1dHRvbkljb25cIlxuICAgICAgICAob25DbGljayk9XCJoYW5kbGVTdWJtaXQoKVwiXG4gICAgICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZm9ybS5pbnZhbGlkXCI+XG4gICAgICA8L3AtYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9wLWRyYXdlcj5cblxuPCEtLSBUZW1wbGF0ZSBkbyBGb3JtdWzDoXJpbyAocmV1dGlsaXrDoXZlbCkgLS0+XG48bmctdGVtcGxhdGUgI2Zvcm1Db250ZW50PlxuICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiBjbGFzcz1cImR5bmFtaWMtZm9ybVwiPlxuICAgIFxuICAgIDwhLS0gRmlsdHJvcyBGaXhvcyAoYXBlbmFzIG5vIG1vZG8gZmlsdGVyKSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwibW9kZSA9PT0gJ2ZpbHRlcicgJiYgaGFzRml4ZWRGaWx0ZXJzXCIgY2xhc3M9XCJmaXhlZC1maWx0ZXJzLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJncmlkXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGZpeGVkRmlsdGVyc1wiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0ZpZWxkVmlzaWJsZShmaWVsZClcIiBbbmdDbGFzc109XCJnZXRGaWVsZEdyaWRDbGFzcyhmaWVsZClcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmaWVsZFRlbXBsYXRlOyBjb250ZXh0OiB7IGZpZWxkOiBmaWVsZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIENhbXBvcyBEaXJldG9zIChzZW0gc2XDp8OjbykgLS0+XG4gICAgPGRpdiAqbmdJZj1cImhhc0ZpZWxkc1wiPlxuICAgICAgPCEtLSBNb2RvIElubGluZSBFZGl0IC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImlzSW5saW5lRWRpdE1vZGVcIiBjbGFzcz1cImlubGluZS1lZGl0LWZpZWxkc1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmb3JtRmllbGRzXCI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImlzRmllbGRWaXNpYmxlKGZpZWxkKVwiIGNsYXNzPVwiaW5saW5lLWVkaXQtZmllbGRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbmxpbmVFZGl0RmllbGRUZW1wbGF0ZTsgY29udGV4dDogeyBmaWVsZDogZmllbGQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIE1vZG8gRm9ybSBOb3JtYWwgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIWlzSW5saW5lRWRpdE1vZGVcIiBjbGFzcz1cImdyaWRcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZm9ybUZpZWxkc1wiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0ZpZWxkVmlzaWJsZShmaWVsZClcIiBbbmdDbGFzc109XCJnZXRGaWVsZEdyaWRDbGFzcyhmaWVsZClcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmaWVsZFRlbXBsYXRlOyBjb250ZXh0OiB7IGZpZWxkOiBmaWVsZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFNlw6fDtWVzIGRlIENhbXBvcyAobW9kbyBmb3JtKSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaGFzU2VjdGlvbnNcIiBjbGFzcz1cInNlY3Rpb25zLWNvbnRhaW5lclwiPlxuICAgICAgPHAtcGFuZWwgXG4gICAgICAgICpuZ0Zvcj1cImxldCBzZWN0aW9uIG9mIGZvcm1TZWN0aW9uc1wiXG4gICAgICAgIFt0b2dnbGVhYmxlXT1cInNlY3Rpb24udG9nZ2xlYWJsZSAhPT0gZmFsc2VcIlxuICAgICAgICBbY29sbGFwc2VkXT1cInNlY3Rpb24uY29sbGFwc2VkIHx8IGZhbHNlXCJcbiAgICAgICAgW3N0eWxlQ2xhc3NdPVwiJ3NlY3Rpb24tcGFuZWwnXCJcbiAgICAgICAgW3N0eWxlLmRpc3BsYXldPVwiaXNTZWN0aW9uVmlzaWJsZShzZWN0aW9uKSA/ICcnIDogJ25vbmUnXCI+XG4gICAgICAgIFxuICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgICAgICA8aSAqbmdJZj1cInNlY3Rpb24uaWNvblwiIFtjbGFzc109XCJzZWN0aW9uLmljb24gKyAnIHNlY3Rpb24taWNvbidcIj48L2k+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlY3Rpb24tdGl0bGVcIj57eyBzZWN0aW9uLnRpdGxlIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDwhLS0gTW9kbyBJbmxpbmUgRWRpdCAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImlzSW5saW5lRWRpdE1vZGVcIiBjbGFzcz1cImlubGluZS1lZGl0LWZpZWxkc1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIHNlY3Rpb24uZmllbGRzXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNGaWVsZFZpc2libGUoZmllbGQpXCIgY2xhc3M9XCJpbmxpbmUtZWRpdC1maWVsZFwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5saW5lRWRpdEZpZWxkVGVtcGxhdGU7IGNvbnRleHQ6IHsgZmllbGQ6IGZpZWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIE1vZG8gRm9ybSBOb3JtYWwgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhaXNJbmxpbmVFZGl0TW9kZVwiIGNsYXNzPVwiZ3JpZFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIHNlY3Rpb24uZmllbGRzXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNGaWVsZFZpc2libGUoZmllbGQpXCIgW25nQ2xhc3NdPVwiZ2V0RmllbGRHcmlkQ2xhc3MoZmllbGQpXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmaWVsZFRlbXBsYXRlOyBjb250ZXh0OiB7IGZpZWxkOiBmaWVsZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3AtcGFuZWw+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFNlw6fDtWVzIGRlIEZpbHRyb3MgKGFwZW5hcyBubyBtb2RvIGZpbHRlcikgLS0+XG4gICAgPGRpdiAqbmdJZj1cIm1vZGUgPT09ICdmaWx0ZXInICYmIGhhc0ZpbHRlclNlY3Rpb25zXCIgY2xhc3M9XCJmaWx0ZXItc2VjdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICA8cC1wYW5lbCBcbiAgICAgICAgKm5nRm9yPVwibGV0IHNlY3Rpb24gb2YgZmlsdGVyU2VjdGlvbnNcIlxuICAgICAgICBbaGVhZGVyXT1cInNlY3Rpb24udGl0bGVcIlxuICAgICAgICBbdG9nZ2xlYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgW2NvbGxhcHNlZF09XCJ0cnVlXCI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdyaWRcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBzZWN0aW9uLmZpZWxkc1wiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzRmllbGRWaXNpYmxlKGZpZWxkKVwiIFtuZ0NsYXNzXT1cImdldEZpZWxkR3JpZENsYXNzKGZpZWxkKVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZmllbGRUZW1wbGF0ZTsgY29udGV4dDogeyBmaWVsZDogZmllbGQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9wLXBhbmVsPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBDdXN0b20gY29udGVudCBwcm9qZWN0aW9uIC0tPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cblxuICAgIDwhLS0gQm90w7VlcyBpbmxpbmUgKGFwZW5hcyBwYXJhIG1vZG8gaW5saW5lKSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNJbmxpbmVNb2RlICYmIChzaG93U3VibWl0QnV0dG9uIHx8IHNob3dDYW5jZWxCdXR0b24pXCIgY2xhc3M9XCJmb3JtLWFjdGlvbnNcIj5cbiAgICAgIDxwLWJ1dHRvblxuICAgICAgICAqbmdJZj1cInNob3dDYW5jZWxCdXR0b25cIlxuICAgICAgICBbbGFiZWxdPVwiY2FuY2VsTGFiZWwgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbaWNvbl09XCJjYW5jZWxCdXR0b25JY29uXCJcbiAgICAgICAgc2V2ZXJpdHk9XCJzZWNvbmRhcnlcIlxuICAgICAgICAob25DbGljayk9XCJoYW5kbGVDYW5jZWwoKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nXCI+XG4gICAgICA8L3AtYnV0dG9uPlxuICAgICAgPHAtYnV0dG9uXG4gICAgICAgICpuZ0lmPVwic2hvd1N1Ym1pdEJ1dHRvblwiXG4gICAgICAgIFtsYWJlbF09XCJzdWJtaXRMYWJlbCB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtpY29uXT1cInN1Ym1pdEJ1dHRvbkljb25cIlxuICAgICAgICAob25DbGljayk9XCJoYW5kbGVTdWJtaXQoKVwiXG4gICAgICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZm9ybS5pbnZhbGlkXCI+XG4gICAgICA8L3AtYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gIDwvZm9ybT5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gVGVtcGxhdGUgZGUgQ2FtcG8gKHJldXRpbGl6w6F2ZWwpIC0tPlxuPG5nLXRlbXBsYXRlICNmaWVsZFRlbXBsYXRlIGxldC1maWVsZD1cImZpZWxkXCI+XG4gIDwhLS0gVGV4dCBGaWVsZCAtLT5cbiAgPHNpYS1keW5hbWljLWZpZWxkLXRleHRcbiAgICAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICd0ZXh0J1wiXG4gICAgW2ZpZWxkXT1cImZpZWxkXCJcbiAgICBbZm9ybV09XCJmb3JtXCJcbiAgICBbbW9kZV09XCJmaWVsZE1vZGVcIj5cbiAgPC9zaWEtZHluYW1pYy1maWVsZC10ZXh0PlxuXG4gIDwhLS0gVGV4dGFyZWEgRmllbGQgLS0+XG4gIDxzaWEtZHluYW1pYy1maWVsZC10ZXh0YXJlYVxuICAgICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ3RleHRhcmVhJ1wiXG4gICAgW2ZpZWxkXT1cImZpZWxkXCJcbiAgICBbZm9ybV09XCJmb3JtXCJcbiAgICBbbW9kZV09XCJmaWVsZE1vZGVcIj5cbiAgPC9zaWEtZHluYW1pYy1maWVsZC10ZXh0YXJlYT5cblxuICA8IS0tIE51bWJlciBGaWVsZCAtLT5cbiAgPHNpYS1keW5hbWljLWZpZWxkLW51bWJlclxuICAgICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ251bWJlcidcIlxuICAgIFtmaWVsZF09XCJmaWVsZFwiXG4gICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgW21vZGVdPVwiZmllbGRNb2RlXCI+XG4gIDwvc2lhLWR5bmFtaWMtZmllbGQtbnVtYmVyPlxuXG4gIDwhLS0gRGF0ZSBGaWVsZCAtLT5cbiAgPHNpYS1keW5hbWljLWZpZWxkLWRhdGVcbiAgICAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdkYXRlJ1wiXG4gICAgW2ZpZWxkXT1cImZpZWxkXCJcbiAgICBbZm9ybV09XCJmb3JtXCJcbiAgICBbbW9kZV09XCJmaWVsZE1vZGVcIj5cbiAgPC9zaWEtZHluYW1pYy1maWVsZC1kYXRlPlxuXG4gIDwhLS0gRGF0ZXRpbWUgRmllbGQgLS0+XG4gIDxzaWEtZHluYW1pYy1maWVsZC1kYXRldGltZVxuICAgICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ2RhdGV0aW1lJ1wiXG4gICAgW2ZpZWxkXT1cImZpZWxkXCJcbiAgICBbZm9ybV09XCJmb3JtXCJcbiAgICBbbW9kZV09XCJmaWVsZE1vZGVcIj5cbiAgPC9zaWEtZHluYW1pYy1maWVsZC1kYXRldGltZT5cblxuICA8IS0tIERyb3Bkb3duL0VudW0gRmllbGQgLS0+XG4gIDxzaWEtZHluYW1pYy1maWVsZC1kcm9wZG93blxuICAgICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ2Ryb3Bkb3duJyB8fCBmaWVsZC50eXBlID09PSAnZW51bSdcIlxuICAgIFtmaWVsZF09XCJmaWVsZFwiXG4gICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgW21vZGVdPVwiZmllbGRNb2RlXCI+XG4gIDwvc2lhLWR5bmFtaWMtZmllbGQtZHJvcGRvd24+XG5cbiAgPCEtLSBMb29rdXAgRmllbGQgLS0+XG4gIDxzaWEtZHluYW1pYy1maWVsZC1sb29rdXBcbiAgICAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdsb29rdXAnXCJcbiAgICBbZmllbGRdPVwiZmllbGRcIlxuICAgIFtmb3JtXT1cImZvcm1cIlxuICAgIFtmb3JtR3JvdXBdPVwiZm9ybVwiXG4gICAgW21vZGVdPVwiZmllbGRNb2RlXCI+XG4gIDwvc2lhLWR5bmFtaWMtZmllbGQtbG9va3VwPlxuXG4gIDwhLS0gVGltZSBGaWVsZCAtLT5cbiAgPHNpYS1keW5hbWljLWZpZWxkLXRpbWVcbiAgICAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICd0aW1lJ1wiXG4gICAgW2ZpZWxkXT1cImZpZWxkXCJcbiAgICBbZm9ybV09XCJmb3JtXCJcbiAgICBbbW9kZV09XCJmaWVsZE1vZGVcIj5cbiAgPC9zaWEtZHluYW1pYy1maWVsZC10aW1lPlxuXG4gIDwhLS0gQ2hlY2tib3ggRmllbGQgLS0+XG4gIDxzaWEtZHluYW1pYy1maWVsZC1jaGVja2JveFxuICAgICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ2NoZWNrYm94J1wiXG4gICAgW2ZpZWxkXT1cImZpZWxkXCJcbiAgICBbZm9ybV09XCJmb3JtXCJcbiAgICBbbW9kZV09XCJmaWVsZE1vZGVcIj5cbiAgPC9zaWEtZHluYW1pYy1maWVsZC1jaGVja2JveD5cblxuICA8IS0tIE11bHRpU2VsZWN0IEZpZWxkIC0tPlxuICA8c2lhLWR5bmFtaWMtZmllbGQtbXVsdGlzZWxlY3RcbiAgICAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdtdWx0aXNlbGVjdCdcIlxuICAgIFtmaWVsZF09XCJmaWVsZFwiXG4gICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgW21vZGVdPVwiZmllbGRNb2RlXCI+XG4gIDwvc2lhLWR5bmFtaWMtZmllbGQtbXVsdGlzZWxlY3Q+XG5cbiAgPCEtLSBJbWFnZSBGaWVsZCAtLT5cbiAgPHNpYS1keW5hbWljLWZpZWxkLWltYWdlXG4gICAgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnaW1hZ2UnXCJcbiAgICBbZmllbGRdPVwiZmllbGRcIlxuICAgIFtmb3JtXT1cImZvcm1cIlxuICAgIFttb2RlXT1cImZpZWxkTW9kZVwiPlxuICA8L3NpYS1keW5hbWljLWZpZWxkLWltYWdlPlxuPC9uZy10ZW1wbGF0ZT5cblxuXG48IS0tIFRlbXBsYXRlIGRlIENhbXBvIElubGluZSBFZGl0IC0tPlxuPG5nLXRlbXBsYXRlICNpbmxpbmVFZGl0RmllbGRUZW1wbGF0ZSBsZXQtZmllbGQ9XCJmaWVsZFwiPlxuICA8ZGl2IGNsYXNzPVwiZWRpdC1pbmxpbmUtZmllbGRcIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPnt7IGZpZWxkLmxhYmVsIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICBcbiAgICA8IS0tIERpc3BsYXkgTW9kZSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZmllbGQtZGlzcGxheVwiIFxuICAgICAgICAgKm5nSWY9XCIhaXNGaWVsZEVkaXRpbmcoZmllbGQuZmllbGQpXCIgXG4gICAgICAgICAoY2xpY2spPVwic3RhcnRFZGl0RmllbGQoZmllbGQuZmllbGQpXCJcbiAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJmaWVsZC5kaXNhYmxlZFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJkaXNwbGF5LXZhbHVlXCIgXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXBsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyIHx8ICgnY3JteC5idXNpbmVzcy5ub3RfaW5mb3JtZWQnIHwgdHJhbnNsYXRlKVwiPlxuICAgICAgICB7eyBnZXRGaWVsZERpc3BsYXlWYWx1ZShmaWVsZC5maWVsZCkgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxpIGNsYXNzPVwicGkgcGktcGVuY2lsIGVkaXQtaWNvblwiICpuZ0lmPVwiIWZpZWxkLmRpc2FibGVkXCI+PC9pPlxuICAgIDwvZGl2PlxuICAgIFxuICAgIDwhLS0gRWRpdCBNb2RlIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1lZGl0XCIgKm5nSWY9XCJpc0ZpZWxkRWRpdGluZyhmaWVsZC5maWVsZClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1jb250YWluZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZpZWxkVGVtcGxhdGU7IGNvbnRleHQ6IHsgZmllbGQ6IGZpZWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8IS0tIEFjdGlvbiBCdXR0b25zIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImVkaXQtYWN0aW9uc1wiPlxuICAgICAgICA8cC1idXR0b24gXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgIGljb249XCJwaSBwaS1jaGVja1wiIFxuICAgICAgICAgIFtyb3VuZGVkXT1cInRydWVcIlxuICAgICAgICAgIHNldmVyaXR5PVwicHJpbWFyeVwiXG4gICAgICAgICAgKG9uQ2xpY2spPVwic2F2ZUlubGluZUZpZWxkKGZpZWxkLmZpZWxkKVwiIFxuICAgICAgICAgIFtsb2FkaW5nXT1cInNhdmluZ0ZpZWxkXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZm9ybS5nZXQoZmllbGQuZmllbGQpPy5pbnZhbGlkXCI+XG4gICAgICAgIDwvcC1idXR0b24+XG4gICAgICAgIDxwLWJ1dHRvbiBcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgXG4gICAgICAgICAgaWNvbj1cInBpIHBpLXRpbWVzXCIgXG4gICAgICAgICAgW3JvdW5kZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgc2V2ZXJpdHk9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgIChvbkNsaWNrKT1cImNhbmNlbElubGluZUVkaXQoKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cInNhdmluZ0ZpZWxkXCI+XG4gICAgICAgIDwvcC1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPCEtLSBFcnJvciBNZXNzYWdlIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWVycm9yXCIgKm5nSWY9XCJmb3JtLmdldChmaWVsZC5maWVsZCk/LmludmFsaWQgJiYgZm9ybS5nZXQoZmllbGQuZmllbGQpPy50b3VjaGVkXCI+XG4gICAgICAgIDxzbWFsbCBjbGFzcz1cInAtZXJyb3JcIj5cbiAgICAgICAgICB7eyBmb3JtLmdldChmaWVsZC5maWVsZCk/LmVycm9ycz8uWydyZXF1aXJlZCddID8gKCdjcm14LmJ1c2luZXNzLnJlcXVpcmVkX2ZpZWxkJyB8IHRyYW5zbGF0ZSkgOiAnJyB9fVxuICAgICAgICA8L3NtYWxsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|