@tangential/configurable-input-widgets
Version:
Input Widgets with persistable, dynamic configuration.
89 lines • 20.1 kB
JavaScript
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { Hacks } from '@tangential/core';
import { InputConfig } from '../../input-config';
//noinspection ES6PreferShortImport
import { ChooseInputWidgetDialog } from '../choose-input-widget-dialog/choose-input-widget-dialog';
import { InputRegistry } from '../input-types-registry';
import { InputViewModes } from '../input-view-mode';
import * as i0 from "@angular/core";
import * as i1 from "../input-types-registry";
import * as i2 from "@angular/material/dialog";
import * as i3 from "@angular/common";
import * as i4 from "@angular/material/button";
import * as i5 from "@tangential/components";
import * as i6 from "../template-components/input-template-component/input-template-container.component";
export class EditConfigurableWidgetComponent {
constructor(inputRegistry, changeDetectorRef, dialog) {
this.inputRegistry = inputRegistry;
this.changeDetectorRef = changeDetectorRef;
this.dialog = dialog;
this.inputConfigChange = new EventEmitter(false);
this.inputNames = [];
}
ngOnInit() {
this.inputNames = this.inputRegistry.inputNames;
if (this.inputConfig) {
this.updateInputConfig(this.inputConfig);
}
}
ngOnChanges(changes) {
if (changes.inputConfig) {
this.updateInputConfig(this.inputConfig);
}
}
inputWidgetChange(newConfig) {
const inputName = newConfig._inputName;
if (!this.inputConfig || inputName !== this.inputConfig._inputName) {
const inputEntrySet = this.inputRegistry.getInputSet(inputName);
const base = newConfig.toJson(true);
if (this.inputConfig) {
/** @todo: ggranum: Figure out why this is using label on a BaseMediaType model, that doesn't have a label field. */
base.label = this.inputConfig.label !== this.inputConfig.getModel().label
? this.inputConfig.label
: null;
base.orderIndex = this.inputConfig.orderIndex;
}
const newInputConfig = inputEntrySet.createInputConfig(base);
newInputConfig._inputName = inputName;
this.updateInputConfig(newInputConfig);
this.inputConfigChange.emit(this.inputConfig);
}
}
updateInputConfig(inputConfig) {
this.inputConfig = inputConfig;
const inputValue = inputConfig.typeConfig.createValue();
this.inputTemplate = this.inputRegistry.createTemplateForType(inputConfig, InputViewModes.CONFIGURE, inputValue);
Hacks.materialDesignPlaceholderText(this.changeDetectorRef);
}
canChangeWidget() {
return !this.inputConfig.$isSystem;
}
showChooseInputDialog() {
const dialogRef = this.dialog.open(ChooseInputWidgetDialog, {
height: '80%',
width: '100%',
});
dialogRef.afterClosed().subscribe((result) => {
if (result && result.config) {
this.inputWidgetChange(result.config);
}
});
}
onTemplateChanged(template) {
if (template.ival && template.ival.value !== template.config.typeConfig.defaultValue) {
template.ival = template.config.typeConfig.createValue();
}
}
}
EditConfigurableWidgetComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: EditConfigurableWidgetComponent, deps: [{ token: i1.InputRegistry }, { token: i0.ChangeDetectorRef }, { token: i2.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
EditConfigurableWidgetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.10", type: EditConfigurableWidgetComponent, selector: "tanj-edit-configurable-widget", inputs: { inputConfig: "inputConfig" }, outputs: { inputConfigChange: "inputConfigChange" }, usesOnChanges: true, ngImport: i0, template: "<div flex\n *ngIf=\"inputConfig\"\n layout=\"column\"\n layout-align=\"space-between\">\n <fieldset class=\"tanj-input-preview\" layout=\"row\" layout-align=\"start\">\n <legend>Preview</legend>\n <tanj-input-template-container [inputConfig]=\"inputTemplate.config\"\n [inputIval]=\"inputTemplate.ival\"\n [mode]=\"'EDIT'\"></tanj-input-template-container>\n <div layout=\"row\" layout-align=\"end\">\n <button class=\"tanj-choose-widget-button\"\n mat-raised-button\n color=\"primary\"\n [disabled]=\"!canChangeWidget()\"\n (click)=\"showChooseInputDialog()\">\n <tanj-icon ligature=\"edit\" label=\"Choose Widget\" i18n-label></tanj-icon>\n </button>\n </div>\n </fieldset>\n\n\n <div flex class=\"tanj-inputs-configuration-container\" layout=\"column\" layout-align=\"start\">\n <div flex=\"70\"\n *ngIf=\"inputTemplate\"\n class=\"tanj-input-configuration-inner\"\n layout=\"column\"\n layout-align=\"start\">\n <div layout=\"row\" layout-align=\"start start\">\n <tanj-input-template-container flex\n [inputConfig]=\"inputTemplate.config\"\n [inputIval]=\"inputTemplate.ival\"\n [mode]=\"inputTemplate.mode\"\n (change)=\"onTemplateChanged(inputTemplate)\"></tanj-input-template-container>\n </div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.IconComponent, selector: "tanj-icon", inputs: ["icon", "align", "font", "ligature", "disabled", "label"], outputs: ["click"] }, { kind: "component", type: i6.InputTemplateContainerComponent, selector: "tanj-input-template-container", inputs: ["template", "inputConfig", "inputIval", "mode", "hideLabel", "onlyLabel"], outputs: ["change"] }], changeDetection: i0.ChangeDetectionStrategy.Default, encapsulation: i0.ViewEncapsulation.None });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: EditConfigurableWidgetComponent, decorators: [{
type: Component,
args: [{ selector: 'tanj-edit-configurable-widget', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.Default, template: "<div flex\n *ngIf=\"inputConfig\"\n layout=\"column\"\n layout-align=\"space-between\">\n <fieldset class=\"tanj-input-preview\" layout=\"row\" layout-align=\"start\">\n <legend>Preview</legend>\n <tanj-input-template-container [inputConfig]=\"inputTemplate.config\"\n [inputIval]=\"inputTemplate.ival\"\n [mode]=\"'EDIT'\"></tanj-input-template-container>\n <div layout=\"row\" layout-align=\"end\">\n <button class=\"tanj-choose-widget-button\"\n mat-raised-button\n color=\"primary\"\n [disabled]=\"!canChangeWidget()\"\n (click)=\"showChooseInputDialog()\">\n <tanj-icon ligature=\"edit\" label=\"Choose Widget\" i18n-label></tanj-icon>\n </button>\n </div>\n </fieldset>\n\n\n <div flex class=\"tanj-inputs-configuration-container\" layout=\"column\" layout-align=\"start\">\n <div flex=\"70\"\n *ngIf=\"inputTemplate\"\n class=\"tanj-input-configuration-inner\"\n layout=\"column\"\n layout-align=\"start\">\n <div layout=\"row\" layout-align=\"start start\">\n <tanj-input-template-container flex\n [inputConfig]=\"inputTemplate.config\"\n [inputIval]=\"inputTemplate.ival\"\n [mode]=\"inputTemplate.mode\"\n (change)=\"onTemplateChanged(inputTemplate)\"></tanj-input-template-container>\n </div>\n </div>\n </div>\n</div>\n" }]
}], ctorParameters: function () { return [{ type: i1.InputRegistry }, { type: i0.ChangeDetectorRef }, { type: i2.MatDialog }]; }, propDecorators: { inputConfig: [{
type: Input
}], inputConfigChange: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdC1jb25maWd1cmFibGUtd2lkZ2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdlbnRpYWwvY29uZmlndXJhYmxlLWlucHV0LXdpZGdldHMvc3JjL2xpYi9zdXBwb3J0L2VkaXQtY29uZmlndXJhYmxlLXdpZGdldC1jb21wb25lbnQvZWRpdC1jb25maWd1cmFibGUtd2lkZ2V0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdlbnRpYWwvY29uZmlndXJhYmxlLWlucHV0LXdpZGdldHMvc3JjL2xpYi9zdXBwb3J0L2VkaXQtY29uZmlndXJhYmxlLXdpZGdldC1jb21wb25lbnQvZWRpdC1jb25maWd1cmFibGUtd2lkZ2V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLDBCQUEwQixDQUFBO0FBQ2xELE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUN0QyxPQUFPLEVBQUMsV0FBVyxFQUFrQixNQUFNLG9CQUFvQixDQUFBO0FBQy9ELG1DQUFtQztBQUNuQyxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSwwREFBMEQsQ0FBQTtBQUNoRyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0seUJBQXlCLENBQUE7QUFDckQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFBOzs7Ozs7OztBQVVqRCxNQUFNLE9BQU8sK0JBQStCO0lBUTFDLFlBQW9CLGFBQTRCLEVBQzVCLGlCQUFvQyxFQUNyQyxNQUFpQjtRQUZoQixrQkFBYSxH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aUIsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7YUFDdEM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxRQUF5QjtRQUN6QyxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFO1lBQ3BGLFFBQVEsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUE7U0FDekQ7SUFDSCxDQUFDOzs2SEExRVUsK0JBQStCO2lIQUEvQiwrQkFBK0IsdUxDNUI1QywrakRBcUNBOzRGRFRhLCtCQUErQjtrQkFOM0MsU0FBUzsrQkFDUywrQkFBK0IsaUJBRS9CLGlCQUFpQixDQUFDLElBQUksbUJBQ3RCLHVCQUF1QixDQUFDLE9BQU87NEpBSXZDLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0ksaUJBQWlCO3NCQUExQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZSxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7TWF0RGlhbG9nfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnXG5pbXBvcnQge0hhY2tzfSBmcm9tICdAdGFuZ2VudGlhbC9jb3JlJ1xuaW1wb3J0IHtJbnB1dENvbmZpZywgSW5wdXRDb25maWdKc29ufSBmcm9tICcuLi8uLi9pbnB1dC1jb25maWcnXG4vL25vaW5zcGVjdGlvbiBFUzZQcmVmZXJTaG9ydEltcG9ydFxuaW1wb3J0IHtDaG9vc2VJbnB1dFdpZGdldERpYWxvZ30gZnJvbSAnLi4vY2hvb3NlLWlucHV0LXdpZGdldC1kaWFsb2cvY2hvb3NlLWlucHV0LXdpZGdldC1kaWFsb2cnXG5pbXBvcnQge0lucHV0UmVnaXN0cnl9IGZyb20gJy4uL2lucHV0LXR5cGVzLXJlZ2lzdHJ5J1xuaW1wb3J0IHtJbnB1dFZpZXdNb2Rlc30gZnJvbSAnLi4vaW5wdXQtdmlldy1tb2RlJ1xuLy9ub2luc3BlY3Rpb24gRVM2UHJlZmVyU2hvcnRJbXBvcnRcbmltcG9ydCB7SW5wdXRUZW1wbGF0ZUlGfSBmcm9tICcuLi90ZW1wbGF0ZS1jb21wb25lbnRzL2lucHV0LXRlbXBsYXRlLWNvbXBvbmVudC9pbnB1dC10ZW1wbGF0ZS5jb21wb25lbnQnXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogICAgICAgICd0YW5qLWVkaXQtY29uZmlndXJhYmxlLXdpZGdldCcsXG4gIHRlbXBsYXRlVXJsOiAgICAgJy4vZWRpdC1jb25maWd1cmFibGUtd2lkZ2V0LmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogICBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkRlZmF1bHRcbn0pXG5leHBvcnQgY2xhc3MgRWRpdENvbmZpZ3VyYWJsZVdpZGdldENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoKSBpbnB1dENvbmZpZzogSW5wdXRDb25maWdcbiAgQE91dHB1dCgpIGlucHV0Q29uZmlnQ2hhbmdlOiBFdmVudEVtaXR0ZXI8SW5wdXRDb25maWc+ID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSlcblxuICBpbnB1dE5hbWVzOiBzdHJpbmdbXSA9IFtdXG4gIGlucHV0VGVtcGxhdGU6IElucHV0VGVtcGxhdGVJRlxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaW5wdXRSZWdpc3RyeTogSW5wdXRSZWdpc3RyeSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgICAgICAgIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZykge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbnB1dE5hbWVzID0gdGhpcy5pbnB1dFJlZ2lzdHJ5LmlucHV0TmFtZXNcbiAgICBpZiAodGhpcy5pbnB1dENvbmZpZykge1xuICAgICAgdGhpcy51cGRhdGVJbnB1dENvbmZpZyh0aGlzLmlucHV0Q29uZmlnKVxuICAgIH1cblxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogeyBpbnB1dENvbmZpZzogU2ltcGxlQ2hhbmdlIH0pOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5pbnB1dENvbmZpZykge1xuICAgICAgdGhpcy51cGRhdGVJbnB1dENvbmZpZyh0aGlzLmlucHV0Q29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIGlucHV0V2lkZ2V0Q2hhbmdlKG5ld0NvbmZpZzogSW5wdXRDb25maWcpIHtcbiAgICBjb25zdCBpbnB1dE5hbWU6IHN0cmluZyA9IG5ld0NvbmZpZy5faW5wdXROYW1lXG4gICAgaWYgKCF0aGlzLmlucHV0Q29uZmlnIHx8IGlucHV0TmFtZSAhPT0gdGhpcy5pbnB1dENvbmZpZy5faW5wdXROYW1lKSB7XG4gICAgICBjb25zdCBpbnB1dEVudHJ5U2V0ID0gdGhpcy5pbnB1dFJlZ2lzdHJ5LmdldElucHV0U2V0KGlucHV0TmFtZSlcblxuICAgICAgY29uc3QgYmFzZTogSW5wdXRDb25maWdKc29uID0gbmV3Q29uZmlnLnRvSnNvbih0cnVlKVxuICAgICAgaWYgKHRoaXMuaW5wdXRDb25maWcpIHtcbiAgICAgICAgLyoqIEB0b2RvOiBnZ3JhbnVtOiBGaWd1cmUgb3V0IHdoeSB0aGlzIGlzIHVzaW5nIGxhYmVsIG9uIGEgQmFzZU1lZGlhVHlwZSBtb2RlbCwgdGhhdCBkb2Vzbid0IGhhdmUgYSBsYWJlbCBmaWVsZC4gICovXG4gICAgICAgIGJhc2UubGFiZWwgPSB0aGlzLmlucHV0Q29uZmlnLmxhYmVsICE9PSAodGhpcy5pbnB1dENvbmZpZy5nZXRNb2RlbCgpIGFzIGFueSkubGFiZWxcbiAgICAgICAgICA/IHRoaXMuaW5wdXRDb25maWcubGFiZWxcbiAgICAgICAgICA6IG51bGxcbiAgICAgICAgYmFzZS5vcmRlckluZGV4ID0gdGhpcy5pbnB1dENvbmZpZy5vcmRlckluZGV4XG4gICAgICB9XG4gICAgICBjb25zdCBuZXdJbnB1dENvbmZpZzogSW5wdXRDb25maWcgPSBpbnB1dEVudHJ5U2V0LmNyZWF0ZUlucHV0Q29uZmlnKGJhc2UpXG4gICAgICBuZXdJbnB1dENvbmZpZy5faW5wdXROYW1lID0gaW5wdXROYW1lXG4gICAgICB0aGlzLnVwZGF0ZUlucHV0Q29uZmlnKG5ld0lucHV0Q29uZmlnKVxuICAgICAgdGhpcy5pbnB1dENvbmZpZ0NoYW5nZS5lbWl0KHRoaXMuaW5wdXRDb25maWcpXG4gICAgfVxuICB9XG5cbiAgdXBkYXRlSW5wdXRDb25maWcoaW5wdXRDb25maWc6IElucHV0Q29uZmlnKSB7XG4gICAgdGhpcy5pbnB1dENvbmZpZyA9IGlucHV0Q29uZmlnXG4gICAgY29uc3QgaW5wdXRWYWx1ZSA9IGlucHV0Q29uZmlnLnR5cGVDb25maWcuY3JlYXRlVmFsdWUoKVxuICAgIHRoaXMuaW5wdXRUZW1wbGF0ZSA9IHRoaXMuaW5wdXRSZWdpc3RyeS5jcmVhdGVUZW1wbGF0ZUZvclR5cGUoaW5wdXRDb25maWcsIElucHV0Vmlld01vZGVzLkNPTkZJR1VSRSwgaW5wdXRWYWx1ZSlcbiAgICBIYWNrcy5tYXRlcmlhbERlc2lnblBsYWNlaG9sZGVyVGV4dCh0aGlzLmNoYW5nZURldGVjdG9yUmVmKVxuICB9XG5cbiAgY2FuQ2hhbmdlV2lkZ2V0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5pbnB1dENvbmZpZy4kaXNTeXN0ZW1cbiAgfVxuXG4gIHNob3dDaG9vc2VJbnB1dERpYWxvZygpIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENob29zZUlucHV0V2lkZ2V0RGlhbG9nLCB7XG4gICAgICBoZWlnaHQ6ICc4MCUnLFxuICAgICAgd2lkdGg6ICAnMTAwJScsXG4gICAgfSk7XG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQ6IElucHV0VGVtcGxhdGVJRikgPT4ge1xuICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQuY29uZmlnKSB7XG4gICAgICAgIHRoaXMuaW5wdXRXaWRnZXRDaGFuZ2UocmVzdWx0LmNvbmZpZylcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uVGVtcGxhdGVDaGFuZ2VkKHRlbXBsYXRlOiBJbnB1dFRlbXBsYXRlSUYpIHtcbiAgICBpZiAodGVtcGxhdGUuaXZhbCAmJiB0ZW1wbGF0ZS5pdmFsLnZhbHVlICE9PSB0ZW1wbGF0ZS5jb25maWcudHlwZUNvbmZpZy5kZWZhdWx0VmFsdWUpIHtcbiAgICAgIHRlbXBsYXRlLml2YWwgPSB0ZW1wbGF0ZS5jb25maWcudHlwZUNvbmZpZy5jcmVhdGVWYWx1ZSgpXG4gICAgfVxuICB9XG5cbn1cblxuIiwiPGRpdiBmbGV4XG4gICAgICpuZ0lmPVwiaW5wdXRDb25maWdcIlxuICAgICBsYXlvdXQ9XCJjb2x1bW5cIlxuICAgICBsYXlvdXQtYWxpZ249XCJzcGFjZS1iZXR3ZWVuXCI+XG4gIDxmaWVsZHNldCBjbGFzcz1cInRhbmotaW5wdXQtcHJldmlld1wiIGxheW91dD1cInJvd1wiIGxheW91dC1hbGlnbj1cInN0YXJ0XCI+XG4gICAgPGxlZ2VuZD5QcmV2aWV3PC9sZWdlbmQ+XG4gICAgPHRhbmotaW5wdXQtdGVtcGxhdGUtY29udGFpbmVyIFtpbnB1dENvbmZpZ109XCJpbnB1dFRlbXBsYXRlLmNvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lucHV0SXZhbF09XCJpbnB1dFRlbXBsYXRlLml2YWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb2RlXT1cIidFRElUJ1wiPjwvdGFuai1pbnB1dC10ZW1wbGF0ZS1jb250YWluZXI+XG4gICAgPGRpdiBsYXlvdXQ9XCJyb3dcIiBsYXlvdXQtYWxpZ249XCJlbmRcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJ0YW5qLWNob29zZS13aWRnZXQtYnV0dG9uXCJcbiAgICAgICAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5DaGFuZ2VXaWRnZXQoKVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzaG93Q2hvb3NlSW5wdXREaWFsb2coKVwiPlxuICAgICAgICA8dGFuai1pY29uIGxpZ2F0dXJlPVwiZWRpdFwiIGxhYmVsPVwiQ2hvb3NlIFdpZGdldFwiIGkxOG4tbGFiZWw+PC90YW5qLWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9maWVsZHNldD5cblxuXG4gIDxkaXYgZmxleCBjbGFzcz1cInRhbmotaW5wdXRzLWNvbmZpZ3VyYXRpb24tY29udGFpbmVyXCIgbGF5b3V0PVwiY29sdW1uXCIgbGF5b3V0LWFsaWduPVwic3RhcnRcIj5cbiAgICA8ZGl2IGZsZXg9XCI3MFwiXG4gICAgICAgICAqbmdJZj1cImlucHV0VGVtcGxhdGVcIlxuICAgICAgICAgY2xhc3M9XCJ0YW5qLWlucHV0LWNvbmZpZ3VyYXRpb24taW5uZXJcIlxuICAgICAgICAgbGF5b3V0PVwiY29sdW1uXCJcbiAgICAgICAgIGxheW91dC1hbGlnbj1cInN0YXJ0XCI+XG4gICAgICA8ZGl2IGxheW91dD1cInJvd1wiIGxheW91dC1hbGlnbj1cInN0YXJ0IHN0YXJ0XCI+XG4gICAgICAgIDx0YW5qLWlucHV0LXRlbXBsYXRlLWNvbnRhaW5lciBmbGV4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dENvbmZpZ109XCJpbnB1dFRlbXBsYXRlLmNvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dEl2YWxdPVwiaW5wdXRUZW1wbGF0ZS5pdmFsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vZGVdPVwiaW5wdXRUZW1wbGF0ZS5tb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblRlbXBsYXRlQ2hhbmdlZChpbnB1dFRlbXBsYXRlKVwiPjwvdGFuai1pbnB1dC10ZW1wbGF0ZS1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==