@ng-flexy/form-bootstrap
Version:
Flexy components and tools to build Angular 8+ applications
323 lines • 37.9 kB
JavaScript
import { Component, Input } from '@angular/core';
import { moveItemInArray } from '@angular/cdk/drag-drop';
import { isRequired as checkIfRequired } from '@ng-flexy/form';
import * as i0 from "@angular/core";
import * as i1 from "@ng-flexy/form";
import * as i2 from "@ng-flexy/toasts";
import * as i3 from "@ngx-translate/core";
import * as i4 from "@ng-flexy/core";
import * as i5 from "@angular/common";
import * as i6 from "ngx-bootstrap/tooltip";
import * as i7 from "@angular/cdk/drag-drop";
import * as i8 from "./field-info.component";
function FlexyFormArrayComponent_h4_1_span_1_span_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span", 4);
i0.ɵɵpipe(1, "translate");
i0.ɵɵtext(2, "(");
i0.ɵɵelementStart(3, "b");
i0.ɵɵtext(4, "*");
i0.ɵɵelementEnd();
i0.ɵɵtext(5, ")");
i0.ɵɵelementEnd();
} if (rf & 2) {
i0.ɵɵproperty("tooltip", i0.ɵɵpipeBind1(1, 1, "FLEXY_FORM_FIELD_IS_REQUIRED"));
} }
function FlexyFormArrayComponent_h4_1_span_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span");
i0.ɵɵtext(1);
i0.ɵɵtemplate(2, FlexyFormArrayComponent_h4_1_span_1_span_2_Template, 6, 3, "span", 3);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r2 = i0.ɵɵnextContext(2);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate1(" ", ctx_r2.legend, " ");
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r2.isRequired);
} }
function FlexyFormArrayComponent_h4_1_div_2_Template(rf, ctx) { if (rf & 1) {
const _r6 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "div", 5);
i0.ɵɵelementStart(1, "button", 6);
i0.ɵɵlistener("click", function FlexyFormArrayComponent_h4_1_div_2_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r6); const ctx_r5 = i0.ɵɵnextContext(2); ctx_r5.addNew(); return ctx_r5.focusOnAdded(); });
i0.ɵɵelement(2, "i", 7);
i0.ɵɵtext(3);
i0.ɵɵpipe(4, "translate");
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r3 = i0.ɵɵnextContext(2);
i0.ɵɵadvance(1);
i0.ɵɵproperty("disabled", !ctx_r3.showAddButton);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(4, 2, "FLEXY_FORM_ARRAY_ADD"), " ");
} }
function FlexyFormArrayComponent_h4_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "h4");
i0.ɵɵtemplate(1, FlexyFormArrayComponent_h4_1_span_1_Template, 3, 2, "span", 1);
i0.ɵɵtemplate(2, FlexyFormArrayComponent_h4_1_div_2_Template, 5, 4, "div", 2);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r0 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r0.legend);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r0.addable && !ctx_r0.readonly && (ctx_r0.layoutSchema == null ? null : ctx_r0.layoutSchema.items == null ? null : ctx_r0.layoutSchema.items.length) > 10);
} }
function FlexyFormArrayComponent_ng_container_2_div_2_flexy_form_container_2_button_1_Template(rf, ctx) { if (rf & 1) {
const _r18 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "button", 18);
i0.ɵɵlistener("click", function FlexyFormArrayComponent_ng_container_2_div_2_flexy_form_container_2_button_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r18); const index_r12 = i0.ɵɵnextContext(2).index; const ctx_r16 = i0.ɵɵnextContext(2); return ctx_r16.removeItem(index_r12); });
i0.ɵɵpipe(1, "translate");
i0.ɵɵelement(2, "i", 19);
i0.ɵɵelementEnd();
} if (rf & 2) {
i0.ɵɵpropertyInterpolate("tooltip", i0.ɵɵpipeBind1(1, 1, "FLEXY_FORM_ARRAY_REMOVE_ITEM"));
} }
const _c0 = function (a0) { return [a0]; };
const _c1 = function (a0) { return { "flexy-removable-list": a0 }; };
function FlexyFormArrayComponent_ng_container_2_div_2_flexy_form_container_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "flexy-form-container", 16);
i0.ɵɵtemplate(1, FlexyFormArrayComponent_ng_container_2_div_2_flexy_form_container_2_button_1_Template, 3, 3, "button", 17);
i0.ɵɵelementEnd();
} if (rf & 2) {
const componentSchema_r11 = i0.ɵɵnextContext().$implicit;
const ctx_r13 = i0.ɵɵnextContext(2);
i0.ɵɵproperty("form", ctx_r13.form)("schema", i0.ɵɵpureFunction1(4, _c0, componentSchema_r11))("ngClass", i0.ɵɵpureFunction1(6, _c1, !ctx_r13.readonly && ctx_r13.removable && ctx_r13.removeAny));
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", !ctx_r13.readonly && ctx_r13.removable && ctx_r13.removeAny);
} }
function FlexyFormArrayComponent_ng_container_2_div_2_div_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 20);
i0.ɵɵelementStart(1, "button", 21);
i0.ɵɵpipe(2, "translate");
i0.ɵɵelement(3, "i", 22);
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
} if (rf & 2) {
i0.ɵɵadvance(1);
i0.ɵɵpropertyInterpolate("tooltip", i0.ɵɵpipeBind1(2, 1, "FLEXY_FORM_ARRAY_REORDER"));
} }
function FlexyFormArrayComponent_ng_container_2_div_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 12);
i0.ɵɵelementStart(1, "div", 13);
i0.ɵɵtemplate(2, FlexyFormArrayComponent_ng_container_2_div_2_flexy_form_container_2_Template, 2, 8, "flexy-form-container", 14);
i0.ɵɵelementEnd();
i0.ɵɵtemplate(3, FlexyFormArrayComponent_ng_container_2_div_2_div_3_Template, 4, 3, "div", 15);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r7 = i0.ɵɵnextContext(2);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", ctx_r7.form);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r7.isDraggable());
} }
function FlexyFormArrayComponent_ng_container_2_span_3_button_1_Template(rf, ctx) { if (rf & 1) {
const _r23 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "button", 25);
i0.ɵɵlistener("click", function FlexyFormArrayComponent_ng_container_2_span_3_button_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r23); const ctx_r22 = i0.ɵɵnextContext(3); return ctx_r22.addNew(); });
i0.ɵɵelement(1, "i", 7);
i0.ɵɵtext(2);
i0.ɵɵpipe(3, "translate");
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r20 = i0.ɵɵnextContext(3);
i0.ɵɵproperty("disabled", !ctx_r20.showAddButton);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(3, 2, "FLEXY_FORM_ARRAY_ADD"), " ");
} }
function FlexyFormArrayComponent_ng_container_2_span_3_button_2_Template(rf, ctx) { if (rf & 1) {
const _r25 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "button", 26);
i0.ɵɵlistener("click", function FlexyFormArrayComponent_ng_container_2_span_3_button_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r25); const ctx_r24 = i0.ɵɵnextContext(3); return ctx_r24.removeLast(); });
i0.ɵɵtext(1);
i0.ɵɵpipe(2, "translate");
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r21 = i0.ɵɵnextContext(3);
i0.ɵɵproperty("disabled", !ctx_r21.showRemoveButton);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 2, "FLEXY_FORM_ARRAY_REMOVE_LAST"), " ");
} }
function FlexyFormArrayComponent_ng_container_2_span_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span", 5);
i0.ɵɵtemplate(1, FlexyFormArrayComponent_ng_container_2_span_3_button_1_Template, 4, 4, "button", 23);
i0.ɵɵtemplate(2, FlexyFormArrayComponent_ng_container_2_span_3_button_2_Template, 3, 4, "button", 24);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r8 = i0.ɵɵnextContext(2);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r8.addable);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r8.removable && !ctx_r8.removeAny && (ctx_r8.layoutSchema.items == null ? null : ctx_r8.layoutSchema.items.length));
} }
function FlexyFormArrayComponent_ng_container_2_flexy_form_field_info_4_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "flexy-form-field-info", 27);
} if (rf & 2) {
const ctx_r9 = i0.ɵɵnextContext(2);
i0.ɵɵproperty("control", ctx_r9.layoutSchema.formControl);
} }
function FlexyFormArrayComponent_ng_container_2_p_5_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "p", 28);
i0.ɵɵtext(1);
i0.ɵɵpipe(2, "translate");
i0.ɵɵelementEnd();
} if (rf & 2) {
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 1, "FLEXY_FORM_ARRAY_NO_DATA"), " ");
} }
function FlexyFormArrayComponent_ng_container_2_Template(rf, ctx) { if (rf & 1) {
const _r27 = i0.ɵɵgetCurrentView();
i0.ɵɵelementContainerStart(0);
i0.ɵɵelementStart(1, "div", 8);
i0.ɵɵlistener("cdkDropListDropped", function FlexyFormArrayComponent_ng_container_2_Template_div_cdkDropListDropped_1_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r26 = i0.ɵɵnextContext(); return ctx_r26.drop($event); });
i0.ɵɵtemplate(2, FlexyFormArrayComponent_ng_container_2_div_2_Template, 4, 2, "div", 9);
i0.ɵɵelementEnd();
i0.ɵɵtemplate(3, FlexyFormArrayComponent_ng_container_2_span_3_Template, 3, 2, "span", 2);
i0.ɵɵtemplate(4, FlexyFormArrayComponent_ng_container_2_flexy_form_field_info_4_Template, 1, 1, "flexy-form-field-info", 10);
i0.ɵɵtemplate(5, FlexyFormArrayComponent_ng_container_2_p_5_Template, 3, 3, "p", 11);
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵproperty("cdkDropListDisabled", !ctx_r1.isDraggable());
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngForOf", ctx_r1.layoutSchema.items);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", !ctx_r1.readonly);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r1.layoutSchema.formControl == null ? null : ctx_r1.layoutSchema.formControl.validator);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", !ctx_r1.layoutSchema.items.length);
} }
const _c2 = function (a0) { return { "fieldset-invalid": a0 }; };
export class FlexyFormArrayComponent {
constructor(jsonMapperService, toasts, changeDetectorRef, translate, logger, elementRef) {
this.jsonMapperService = jsonMapperService;
this.toasts = toasts;
this.changeDetectorRef = changeDetectorRef;
this.translate = translate;
this.logger = logger;
this.elementRef = elementRef;
this.addable = true;
this.draggable = false;
this.removable = true;
this.removeAny = false;
this.showAddButton = false;
this.showRemoveButton = false;
}
ngOnInit() {
this.enableButtons();
if (this.layoutSchema.formControl) {
this.isRequired = checkIfRequired(this.layoutSchema.formControl);
}
if (this.jsonSchema &&
this.jsonSchema.validators &&
this.jsonSchema.validators.minItems &&
(!this.layoutSchema.items || this.layoutSchema.items.length < this.jsonSchema.validators.minItems)) {
if (!this.readonly) {
const minLength = this.jsonSchema.validators.minItems - (this.layoutSchema.items ? this.layoutSchema.items.length : 0);
for (let i = 0; i < minLength; i++) {
this.addNew();
}
}
}
}
addNew() {
if (this.maxItemsExceeded()) {
this.toasts.error(this.translate.instant('FLEXY_FORM_ARRAY_MAX_VALIDATOR_ERROR', { max: this.jsonSchema.validators.maxItems }));
}
else {
const newValue = this.jsonSchema.items.children ? {} : null;
const control = this.jsonMapperService.createItemControl(this.jsonSchema.items, this.readonly, newValue);
this.layoutSchema.formControl.push(control);
this.layoutSchema.items.push(this.jsonMapperService.createArrayItemSchema(control, this.jsonSchema.items, this.jsonSchema.indexDef, null, this.readonly, {}, newValue, this.layoutSchema.items.length, this.layoutSchema.formControl));
this.enableButtons();
}
}
removeItem(index) {
this.toasts.confirm(this.translate.instant('FLEXY_FORM_DELETE_ITEM_CONFIRM'), '', () => {
this.layoutSchema.items.splice(index, 1);
this.layoutSchema.formControl.removeAt(index);
this.layoutSchema.formControl.markAsDirty();
});
}
removeLast() {
this.toasts.confirm(this.translate.instant('FLEXY_FORM_DELETE_LAST_ITEM_CONFIRM'), '', () => {
this.removeLastItem();
});
}
removeLastItem() {
if (this.layoutSchema.items.length > 0) {
const inx = this.layoutSchema.items.length - 1;
this.layoutSchema.items.splice(inx, 1);
this.layoutSchema.formControl.removeAt(inx);
this.layoutSchema.formControl.markAsDirty();
this.enableButtons();
}
}
maxItemsExceeded() {
return this.jsonSchema && this.jsonSchema.validators && this.layoutSchema.items.length >= this.jsonSchema.validators.maxItems;
}
minItemsExceeded() {
return (this.jsonSchema &&
this.jsonSchema.validators &&
(!this.layoutSchema.items.length || this.layoutSchema.items.length <= this.jsonSchema.validators.minItems));
}
focusOnAdded() {
this.changeDetectorRef.detectChanges();
const added = this.elementRef.nativeElement.querySelector('.bottom-button');
if (added) {
added.focus();
}
}
drop(event) {
moveItemInArray(this.layoutSchema.items, event.previousIndex, event.currentIndex);
this.layoutSchema.formControl.markAsDirty();
}
isDraggable() {
return !this.readonly && this.draggable && this.layoutSchema.items && this.layoutSchema.items.length > 1;
}
enableButtons() {
this.showAddButton = !this.readonly && !this.maxItemsExceeded();
this.showRemoveButton = !this.readonly && !this.minItemsExceeded();
}
}
FlexyFormArrayComponent.ɵfac = function FlexyFormArrayComponent_Factory(t) { return new (t || FlexyFormArrayComponent)(i0.ɵɵdirectiveInject(i1.FlexyFormJsonMapperService), i0.ɵɵdirectiveInject(i2.FlexyToastsService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i3.TranslateService), i0.ɵɵdirectiveInject(i4.FlexyLoggerService), i0.ɵɵdirectiveInject(i0.ElementRef)); };
FlexyFormArrayComponent.ɵcmp = i0.ɵɵdefineComponent({ type: FlexyFormArrayComponent, selectors: [["flexy-form-array"]], inputs: { layoutSchema: "layoutSchema", form: "form", legend: "legend", jsonSchema: "jsonSchema", readonly: "readonly", addable: "addable", draggable: "draggable", removable: "removable", removeAny: "removeAny" }, decls: 3, vars: 5, consts: [[3, "ngClass"], [4, "ngIf"], ["class", "actions", 4, "ngIf"], ["class", "isRequired", 3, "tooltip", 4, "ngIf"], [1, "isRequired", 3, "tooltip"], [1, "actions"], ["type", "button", 1, "btn", "btn-info", "btn-outline", "btn-sm", "t2e-array-top-add-btn", 3, "disabled", "click"], [1, "flexy-icon-plus"], ["cdkDropList", "", 1, "drag-container", "schema-items", 3, "cdkDropListDisabled", "cdkDropListDropped"], ["cdkDrag", "", "cdkDragLockAxis", "y", "class", "flexy-form-array-draggable-item schema-item", "cdkDragBoundary", ".drag-container", 4, "ngFor", "ngForOf"], [3, "control", 4, "ngIf"], ["class", "no-data", 4, "ngIf"], ["cdkDrag", "", "cdkDragLockAxis", "y", "cdkDragBoundary", ".drag-container", 1, "flexy-form-array-draggable-item", "schema-item"], [1, "schema-item-body"], [3, "form", "schema", "ngClass", 4, "ngIf"], ["class", "drag-handle", "cdkDragHandle", "", 4, "ngIf"], [3, "form", "schema", "ngClass"], ["type", "button", "class", "btn btn-outline delete-item e2e-btn-delete-array-item", 3, "tooltip", "click", 4, "ngIf"], ["type", "button", 1, "btn", "btn-outline", "delete-item", "e2e-btn-delete-array-item", 3, "tooltip", "click"], [1, "flexy-icon-remove"], ["cdkDragHandle", "", 1, "drag-handle"], ["type", "button", 1, "btn", "btn-link", 3, "tooltip"], [1, "flexy-icon-move"], ["type", "button", "class", "btn btn-info btn-outline btn-sm bottom-button add-item t2e-array-add-btn", 3, "disabled", "click", 4, "ngIf"], ["type", "button", "class", "btn btn-danger btn-outline btn-sm remove-item t2e-array-remove-last-btn", 3, "disabled", "click", 4, "ngIf"], ["type", "button", 1, "btn", "btn-info", "btn-outline", "btn-sm", "bottom-button", "add-item", "t2e-array-add-btn", 3, "disabled", "click"], ["type", "button", 1, "btn", "btn-danger", "btn-outline", "btn-sm", "remove-item", "t2e-array-remove-last-btn", 3, "disabled", "click"], [3, "control"], [1, "no-data"]], template: function FlexyFormArrayComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "fieldset", 0);
i0.ɵɵtemplate(1, FlexyFormArrayComponent_h4_1_Template, 3, 2, "h4", 1);
i0.ɵɵtemplate(2, FlexyFormArrayComponent_ng_container_2_Template, 6, 5, "ng-container", 1);
i0.ɵɵelementEnd();
} if (rf & 2) {
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(3, _c2, ctx.layoutSchema.formControl && !ctx.layoutSchema.formControl.valid));
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.legend || !ctx.readonly && (ctx.layoutSchema == null ? null : ctx.layoutSchema.items == null ? null : ctx.layoutSchema.items.length) > 10);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.layoutSchema && ctx.layoutSchema.items);
} }, directives: [i5.NgClass, i5.NgIf, i6.TooltipDirective, i7.CdkDropList, i5.NgForOf, i7.CdkDrag, i1.FlexyFormContainerComponent, i7.CdkDragHandle, i8.FlexyFieldControlInfoComponent], pipes: [i3.TranslatePipe], encapsulation: 2 });
/*@__PURE__*/ (function () { i0.ɵsetClassMetadata(FlexyFormArrayComponent, [{
type: Component,
args: [{
selector: 'flexy-form-array',
templateUrl: './array.component.html'
}]
}], function () { return [{ type: i1.FlexyFormJsonMapperService }, { type: i2.FlexyToastsService }, { type: i0.ChangeDetectorRef }, { type: i3.TranslateService }, { type: i4.FlexyLoggerService }, { type: i0.ElementRef }]; }, { layoutSchema: [{
type: Input
}], form: [{
type: Input
}], legend: [{
type: Input
}], jsonSchema: [{
type: Input
}], readonly: [{
type: Input
}], addable: [{
type: Input
}], draggable: [{
type: Input
}], removable: [{
type: Input
}], removeAny: [{
type: Input
}] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybS1ib290c3RyYXAvc3JjL2xpYi9jb21wb25lbnRzL2FycmF5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0tYm9vdHN0cmFwL3NyYy9saWIvY29tcG9uZW50cy9hcnJheS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBYyxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFPeEYsT0FBTyxFQUFlLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLElBQUksZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7O0lDSnpELCtCQUFtRzs7SUFBQSxpQkFBQztJQUFBLHlCQUFHO0lBQUEsaUJBQUM7SUFBQSxpQkFBSTtJQUFBLGlCQUFDO0lBQUEsaUJBQU87O0lBQXhFLDhFQUFzRDs7O0lBRnBHLDRCQUNFO0lBQUEsWUFDQTtJQUFBLHNGQUFtRztJQUNyRyxpQkFBTzs7O0lBRkwsZUFDQTtJQURBLDhDQUNBO0lBQU0sZUFBa0I7SUFBbEIsd0NBQWtCOzs7O0lBRzFCLDhCQUNFO0lBQUEsaUNBTUU7SUFGQSxvTkFBa0M7SUFFbEMsdUJBQStCO0lBQUMsWUFDbEM7O0lBQUEsaUJBQVM7SUFDWCxpQkFBTTs7O0lBTEYsZUFBMkI7SUFBM0IsZ0RBQTJCO0lBR0ssZUFDbEM7SUFEa0MsNkVBQ2xDOzs7SUFkSiwwQkFDRTtJQUFBLCtFQUNFO0lBSUYsNkVBQ0U7SUFTSixpQkFBSzs7O0lBZkcsZUFBYztJQUFkLG9DQUFjO0lBS0MsZUFBZ0U7SUFBaEUsb0xBQWdFOzs7O0lBNEI3RSxrQ0FPRTtJQUZBLG9TQUEyQjs7SUFFM0Isd0JBQWlDO0lBQ25DLGlCQUFTOztJQUpQLHlGQUEwRDs7Ozs7SUFW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QUFXLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDM0csQ0FBQztJQUVPLGFBQWE7UUFDbkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNoRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDckUsQ0FBQzs7OEZBdElVLHVCQUF1Qjs0REFBdkIsdUJBQXVCO1FDZHBDLG1DQUNFO1FBQUEsc0VBQ0U7UUFpQkYsMEZBQ0U7UUE0REosaUJBQVc7O1FBaEZELHlIQUErRjtRQUNuRyxlQUFpRTtRQUFqRSxvS0FBaUU7UUFrQnZELGVBQTBDO1FBQTFDLGlFQUEwQzs7a0RETDdDLHVCQUF1QjtjQUpuQyxTQUFTO2VBQUM7Z0JBQ1QsUUFBUSxFQUFFLGtCQUFrQjtnQkFDNUIsV0FBVyxFQUFFLHdCQUF3QjthQUN0Qzt1T0FFVSxZQUFZO2tCQUFwQixLQUFLO1lBQ0csSUFBSTtrQkFBWixLQUFLO1lBQ0csTUFBTTtrQkFBZCxLQUFLO1lBRUcsVUFBVTtrQkFBbEIsS0FBSztZQUVHLFFBQVE7a0JBQWhCLEtBQUs7WUFFRyxPQUFPO2tCQUFmLEtBQUs7WUFDRyxTQUFTO2tCQUFqQixLQUFLO1lBQ0csU0FBUztrQkFBakIsS0FBSztZQUNHLFNBQVM7a0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQXJyYXkgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBGbGV4eUZvcm0sIEZsZXh5Rm9ybUNvbXBsZXhGaWVsZExheW91dEpzb25TY2hlbWEsIEZsZXh5Rm9ybUZpZWxkTGF5b3V0U2NoZW1hIH0gZnJvbSAnQG5nLWZsZXh5L2Zvcm0nO1xuaW1wb3J0IHsgRmxleHlGb3JtSnNvbk1hcHBlclNlcnZpY2UgfSBmcm9tICdAbmctZmxleHkvZm9ybSc7XG5pbXBvcnQgeyBGbGV4eVRvYXN0c1NlcnZpY2UgfSBmcm9tICdAbmctZmxleHkvdG9hc3RzJztcbmltcG9ydCB7IEZsZXh5TG9nZ2VyU2VydmljZSB9IGZyb20gJ0BuZy1mbGV4eS9jb3JlJztcbmltcG9ydCB7IENka0RyYWdEcm9wLCBtb3ZlSXRlbUluQXJyYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IGlzUmVxdWlyZWQgYXMgY2hlY2tJZlJlcXVpcmVkIH0gZnJvbSAnQG5nLWZsZXh5L2Zvcm0nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmbGV4eS1mb3JtLWFycmF5JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FycmF5LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBGbGV4eUZvcm1BcnJheUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGxheW91dFNjaGVtYTogRmxleHlGb3JtRmllbGRMYXlvdXRTY2hlbWE7XG4gIEBJbnB1dCgpIGZvcm06IEZsZXh5Rm9ybTtcbiAgQElucHV0KCkgbGVnZW5kOiBzdHJpbmc7XG5cbiAgQElucHV0KCkganNvblNjaGVtYTogRmxleHlGb3JtQ29tcGxleEZpZWxkTGF5b3V0SnNvblNjaGVtYTtcblxuICBASW5wdXQoKSByZWFkb25seTogYm9vbGVhbjtcblxuICBASW5wdXQoKSBhZGRhYmxlID0gdHJ1ZTtcbiAgQElucHV0KCkgZHJhZ2dhYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIHJlbW92YWJsZSA9IHRydWU7XG4gIEBJbnB1dCgpIHJlbW92ZUFueSA9IGZhbHNlO1xuXG4gIGlzUmVxdWlyZWQ6IGJvb2xlYW47XG5cbiAgc2hvd0FkZEJ1dHRvbiA9IGZhbHNlO1xuICBzaG93UmVtb3ZlQnV0dG9uID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBqc29uTWFwcGVyU2VydmljZTogRmxleHlGb3JtSnNvbk1hcHBlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2FzdHM6IEZsZXh5VG9hc3RzU2VydmljZSxcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGxvZ2dlcjogRmxleHlMb2dnZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZlxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5lbmFibGVCdXR0b25zKCk7XG5cbiAgICBpZiAodGhpcy5sYXlvdXRTY2hlbWEuZm9ybUNvbnRyb2wpIHtcbiAgICAgIHRoaXMuaXNSZXF1aXJlZCA9IGNoZWNrSWZSZXF1aXJlZCh0aGlzLmxheW91dFNjaGVtYS5mb3JtQ29udHJvbCk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuanNvblNjaGVtYSAmJlxuICAgICAgdGhpcy5qc29uU2NoZW1hLnZhbGlkYXRvcnMgJiZcbiAgICAgIHRoaXMuanNvblNjaGVtYS52YWxpZGF0b3JzLm1pbkl0ZW1zICYmXG4gICAgICAoIXRoaXMubGF5b3V0U2NoZW1hLml0ZW1zIHx8IHRoaXMubGF5b3V0U2NoZW1hLml0ZW1zLmxlbmd0aCA8IHRoaXMuanNvblNjaGVtYS52YWxpZGF0b3JzLm1pbkl0ZW1zKVxuICAgICkge1xuICAgICAgaWYgKCF0aGlzLnJlYWRvbmx5KSB7XG4gICAgICAgIGNvbnN0IG1pbkxlbmd0aCA9IHRoaXMuanNvblNjaGVtYS52YWxpZGF0b3JzLm1pbkl0ZW1zIC0gKHRoaXMubGF5b3V0U2NoZW1hLml0ZW1zID8gdGhpcy5sYXlvdXRTY2hlbWEuaXRlbXMubGVuZ3RoIDogMCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtaW5MZW5ndGg7IGkrKykge1xuICAgICAgICAgIHRoaXMuYWRkTmV3KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGROZXcoKSB7XG4gICAgaWYgKHRoaXMubWF4SXRlbXNFeGNlZWRlZCgpKSB7XG4gICAgICB0aGlzLnRvYXN0cy5lcnJvcih0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdGTEVYWV9GT1JNX0FSUkFZX01BWF9WQUxJREFUT1JfRVJST1InLCB7IG1heDogdGhpcy5qc29uU2NoZW1hLnZhbGlkYXRvcnMubWF4SXRlbXMgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMuanNvblNjaGVtYS5pdGVtcy5jaGlsZHJlbiA/IHt9IDogbnVsbDtcblxuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuanNvbk1hcHBlclNlcnZpY2UuY3JlYXRlSXRlbUNvbnRyb2wodGhpcy5qc29uU2NoZW1hLml0ZW1zLCB0aGlzLnJlYWRvbmx5LCBuZXdWYWx1ZSk7XG5cbiAgICAgICh0aGlzLmxheW91dFNjaGVtYS5mb3JtQ29udHJvbCBhcyBGb3JtQXJyYXkpLnB1c2goY29udHJvbCk7XG5cbiAgICAgIHRoaXMubGF5b3V0U2NoZW1hLml0ZW1zLnB1c2goXG4gICAgICAgIHRoaXMuanNvbk1hcHBlclNlcnZpY2UuY3JlYXRlQXJyYXlJdGVtU2NoZW1hKFxuICAgICAgICAgIGNvbnRyb2wsXG4gICAgICAgICAgdGhpcy5qc29uU2NoZW1hLml0ZW1zLFxuICAgICAgICAgIHRoaXMuanNvblNjaGVtYS5pbmRleERlZixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHRoaXMucmVhZG9ubHksXG4gICAgICAgICAge30sXG4gICAgICAgICAgbmV3VmFsdWUsXG4gICAgICAgICAgdGhpcy5sYXlvdXRTY2hlbWEuaXRlbXMubGVuZ3RoLFxuICAgICAgICAgIHRoaXMubGF5b3V0U2NoZW1hLmZvcm1Db250cm9sXG4gICAgICAgIClcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuZW5hYmxlQnV0dG9ucygpO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUl0ZW0oaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMudG9hc3RzLmNvbmZpcm0odGhpcy50cmFuc2xhdGUuaW5zdGFudCgnRkxFWFlfRk9STV9ERUxFVEVfSVRFTV9DT05GSVJNJyksICcnLCAoKSA9PiB7XG4gICAgICB0aGlzLmxheW91dFNjaGVtYS5pdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgKHRoaXMubGF5b3V0U2NoZW1hLmZvcm1Db250cm9sIGFzIEZvcm1BcnJheSkucmVtb3ZlQXQoaW5kZXgpO1xuICAgICAgdGhpcy5sYXlvdXRTY2hlbWEuZm9ybUNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlbW92ZUxhc3QoKSB7XG4gICAgdGhpcy50b2FzdHMuY29uZmlybSh0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdGTEVYWV9GT1JNX0RFTEVURV9MQVNUX0lURU1fQ09ORklSTScpLCAnJywgKCkgPT4ge1xuICAgICAgdGhpcy5yZW1vdmVMYXN0SXRlbSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlTGFzdEl0ZW0oKSB7XG4gICAgaWYgKHRoaXMubGF5b3V0U2NoZW1hLml0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGlueCA9IHRoaXMubGF5b3V0U2NoZW1hLml0ZW1zLmxlbmd0aCAtIDE7XG4gICAgICB0aGlzLmxheW91dFNjaGVtYS5pdGVtcy5zcGxpY2UoaW54LCAxKTtcbiAgICAgICh0aGlzLmxheW91dFNjaGVtYS5mb3JtQ29udHJvbCBhcyBGb3JtQXJyYXkpLnJlbW92ZUF0KGlueCk7XG4gICAgICAodGhpcy5sYXlvdXRTY2hlbWEuZm9ybUNvbnRyb2wgYXMgRm9ybUFycmF5KS5tYXJrQXNEaXJ0eSgpO1xuICAgICAgdGhpcy5lbmFibGVCdXR0b25zKCk7XG4gICAgfVxuICB9XG5cbiAgbWF4SXRlbXNFeGNlZWRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5qc29uU2NoZW1hICYmIHRoaXMuanNvblNjaGVtYS52YWxpZGF0b3JzICYmIHRoaXMubGF5b3V0U2NoZW1hLml0ZW1zLmxlbmd0aCA+PSB0aGlzLmpzb25TY2hlbWEudmFsaWRhdG9ycy5tYXhJdGVtcztcbiAgfVxuXG4gIG1pbkl0ZW1zRXhjZWVkZWQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuanNvblNjaGVtYSAmJlxuICAgICAgdGhpcy5qc29uU2NoZW1hLnZhbGlkYXRvcnMgJiZcbiAgICAgICghdGhpcy5sYXlvdXRTY2hlbWEuaXRlbXMubGVuZ3RoIHx8IHRoaXMubGF5b3V0U2NoZW1hLml0ZW1zLmxlbmd0aCA8PSB0aGlzLmpzb25TY2hlbWEudmFsaWRhdG9ycy5taW5JdGVtcylcbiAgICApO1xuICB9XG5cbiAgZm9jdXNPbkFkZGVkKCkge1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIGNvbnN0IGFkZGVkID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmJvdHRvbS1idXR0b24nKTtcbiAgICBpZiAoYWRkZWQpIHtcbiAgICAgIGFkZGVkLmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8YW55Pikge1xuICAgIG1vdmVJdGVtSW5BcnJheSh0aGlzLmxheW91dFNjaGVtYS5pdGVtcywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcbiAgICB0aGlzLmxheW91dFNjaGVtYS5mb3JtQ29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICB9XG5cbiAgaXNEcmFnZ2FibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnJlYWRvbmx5ICYmIHRoaXMuZHJhZ2dhYmxlICYmIHRoaXMubGF5b3V0U2NoZW1hLml0ZW1zICYmIHRoaXMubGF5b3V0U2NoZW1hLml0ZW1zLmxlbmd0aCA+IDE7XG4gIH1cblxuICBwcml2YXRlIGVuYWJsZUJ1dHRvbnMoKSB7XG4gICAgdGhpcy5zaG93QWRkQnV0dG9uID0gIXRoaXMucmVhZG9ubHkgJiYgIXRoaXMubWF4SXRlbXNFeGNlZWRlZCgpO1xuICAgIHRoaXMuc2hvd1JlbW92ZUJ1dHRvbiA9ICF0aGlzLnJlYWRvbmx5ICYmICF0aGlzLm1pbkl0ZW1zRXhjZWVkZWQoKTtcbiAgfVxufVxuIiwiPGZpZWxkc2V0IFtuZ0NsYXNzXT1cInsgJ2ZpZWxkc2V0LWludmFsaWQnOiBsYXlvdXRTY2hlbWEuZm9ybUNvbnRyb2wgJiYgIWxheW91dFNjaGVtYS5mb3JtQ29udHJvbC52YWxpZCB9XCI+XG4gIDxoNCAqbmdJZj1cImxlZ2VuZCB8fCAoIXJlYWRvbmx5ICYmIGxheW91dFNjaGVtYT8uaXRlbXM/Lmxlbmd0aCA+IDEwKVwiPlxuICAgIDxzcGFuICpuZ0lmPVwibGVnZW5kXCI+XG4gICAgICB7eyBsZWdlbmQgfX1cbiAgICAgIDxzcGFuICpuZ0lmPVwiaXNSZXF1aXJlZFwiIGNsYXNzPVwiaXNSZXF1aXJlZFwiIFt0b29sdGlwXT1cIidGTEVYWV9GT1JNX0ZJRUxEX0lTX1JFUVVJUkVEJyB8IHRyYW5zbGF0ZVwiPig8Yj4qPC9iPik8L3NwYW4+XG4gICAgPC9zcGFuPlxuXG4gICAgPGRpdiBjbGFzcz1cImFjdGlvbnNcIiAqbmdJZj1cImFkZGFibGUgJiYgIXJlYWRvbmx5ICYmIGxheW91dFNjaGVtYT8uaXRlbXM/Lmxlbmd0aCA+IDEwXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImJ0biBidG4taW5mbyBidG4tb3V0bGluZSBidG4tc20gdDJlLWFycmF5LXRvcC1hZGQtYnRuXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFzaG93QWRkQnV0dG9uXCJcbiAgICAgICAgKGNsaWNrKT1cImFkZE5ldygpOyBmb2N1c09uQWRkZWQoKVwiXG4gICAgICA+XG4gICAgICAgIDxpIGNsYXNzPVwiZmxleHktaWNvbi1wbHVzXCI+PC9pPiB7eyAnRkxFWFlfRk9STV9BUlJBWV9BREQnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9oND5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwibGF5b3V0U2NoZW1hICYmIGxheW91dFNjaGVtYS5pdGVtc1wiPlxuICAgIDxkaXYgY2RrRHJvcExpc3QgY2xhc3M9XCJkcmFnLWNvbnRhaW5lciBzY2hlbWEtaXRlbXNcIiBbY2RrRHJvcExpc3REaXNhYmxlZF09XCIhaXNEcmFnZ2FibGUoKVwiIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCI+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0Zvcj1cImxldCBjb21wb25lbnRTY2hlbWEgb2YgbGF5b3V0U2NoZW1hLml0ZW1zOyBsZXQgaW5kZXggPSBpbmRleFwiXG4gICAgICAgIGNka0RyYWdcbiAgICAgICAgY2RrRHJhZ0xvY2tBeGlzPVwieVwiXG4gICAgICAgIGNsYXNzPVwiZmxleHktZm9ybS1hcnJheS1kcmFnZ2FibGUtaXRlbSBzY2hlbWEtaXRlbVwiXG4gICAgICAgIGNka0RyYWdCb3VuZGFyeT1cIi5kcmFnLWNvbnRhaW5lclwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzY2hlbWEtaXRlbS1ib2R5XCI+XG4gICAgICAgICAgPGZsZXh5LWZvcm0tY29udGFpbmVyXG4gICAgICAgICAgICAqbmdJZj1cImZvcm1cIlxuICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgICAgICAgICBbc2NoZW1hXT1cIltjb21wb25lbnRTY2hlbWFdXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2ZsZXh5LXJlbW92YWJsZS1saXN0JzogIXJlYWRvbmx5ICYmIHJlbW92YWJsZSAmJiByZW1vdmVBbnkgfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cIiFyZWFkb25seSAmJiByZW1vdmFibGUgJiYgcmVtb3ZlQW55XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIGRlbGV0ZS1pdGVtIGUyZS1idG4tZGVsZXRlLWFycmF5LWl0ZW1cIlxuICAgICAgICAgICAgICB0b29sdGlwPVwie3sgJ0ZMRVhZX0ZPUk1fQVJSQVlfUkVNT1ZFX0lURU0nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUl0ZW0oaW5kZXgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmbGV4eS1pY29uLXJlbW92ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZmxleHktZm9ybS1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNEcmFnZ2FibGUoKVwiIGNsYXNzPVwiZHJhZy1oYW5kbGVcIiBjZGtEcmFnSGFuZGxlPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCIgdG9vbHRpcD1cInt7ICdGTEVYWV9GT1JNX0FSUkFZX1JFT1JERVInIHwgdHJhbnNsYXRlIH19XCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZsZXh5LWljb24tbW92ZVwiPjwvaT5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxzcGFuIGNsYXNzPVwiYWN0aW9uc1wiICpuZ0lmPVwiIXJlYWRvbmx5XCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwiYWRkYWJsZVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImJ0biBidG4taW5mbyBidG4tb3V0bGluZSBidG4tc20gYm90dG9tLWJ1dHRvbiBhZGQtaXRlbSB0MmUtYXJyYXktYWRkLWJ0blwiXG4gICAgICAgIFtkaXNhYmxlZF09XCIhc2hvd0FkZEJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJhZGROZXcoKVwiXG4gICAgICA+XG4gICAgICAgIDxpIGNsYXNzPVwiZmxleHktaWNvbi1wbHVzXCI+PC9pPiB7eyAnRkxFWFlfRk9STV9BUlJBWV9BREQnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCJyZW1vdmFibGUgJiYgIXJlbW92ZUFueSAmJiBsYXlvdXRTY2hlbWEuaXRlbXM/Lmxlbmd0aFwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImJ0biBidG4tZGFuZ2VyIGJ0bi1vdXRsaW5lIGJ0bi1zbSByZW1vdmUtaXRlbSB0MmUtYXJyYXktcmVtb3ZlLWxhc3QtYnRuXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFzaG93UmVtb3ZlQnV0dG9uXCJcbiAgICAgICAgKGNsaWNrKT1cInJlbW92ZUxhc3QoKVwiXG4gICAgICA+XG4gICAgICAgIHt7ICdGTEVYWV9GT1JNX0FSUkFZX1JFTU9WRV9MQVNUJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9zcGFuPlxuXG4gICAgPGZsZXh5LWZvcm0tZmllbGQtaW5mbyAqbmdJZj1cImxheW91dFNjaGVtYS5mb3JtQ29udHJvbD8udmFsaWRhdG9yXCIgW2NvbnRyb2xdPVwibGF5b3V0U2NoZW1hLmZvcm1Db250cm9sXCI+PC9mbGV4eS1mb3JtLWZpZWxkLWluZm8+XG4gICAgPHAgY2xhc3M9XCJuby1kYXRhXCIgKm5nSWY9XCIhbGF5b3V0U2NoZW1hLml0ZW1zLmxlbmd0aFwiPlxuICAgICAge3sgJ0ZMRVhZX0ZPUk1fQVJSQVlfTk9fREFUQScgfCB0cmFuc2xhdGUgfX1cbiAgICA8L3A+XG4gIDwvbmctY29udGFpbmVyPlxuPC9maWVsZHNldD5cbiJdfQ==