UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

114 lines 19.5 kB
import { Component, Input } from '@angular/core'; import { StoreBrandingService } from '@c8y/ngx-components/branding/shared/data'; import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms'; import { CoreModule, gettext } from '@c8y/ngx-components'; import { NgIf } from '@angular/common'; import * as i0 from "@angular/core"; import * as i1 from "@c8y/ngx-components/branding/shared/data"; import * as i2 from "@angular/forms"; import * as i3 from "@c8y/ngx-components"; import * as i4 from "@angular/common"; export class AddBrandingModalComponent { constructor(branding, formBuilder) { this.branding = branding; this.formBuilder = formBuilder; this.duplicateBranding = false; this.namesAlreadyTaken = []; this.loading = true; this.result = new Promise((resolve, reject) => { this._resovle = resolve; this._reject = reject; }); this.messages = [ { name: 'nameAlreadyTaken', text: gettext('The provided name is already taken.') }, { name: 'onlyLowerCaseCharacters', text: gettext('Only lower case characters are allowed.') }, { name: 'shouldStartWithLowerCaseLetterOrNumber', text: gettext('Should start with a lower case letter or a number.') }, { name: 'invalidCharacters', text: gettext('Invalid character "{{ invalidCharacter }}". Only a-z, 0-9 and - are allowed.') } ]; this.form = this.initForm(); this.getExistingBrandingVersions(); } async getExistingBrandingVersions() { try { const { variants } = await this.branding.loadBrandingVariants(); this.namesAlreadyTaken = variants.map(variant => variant.version); } catch (e) { console.warn(e); } this.loading = false; } initForm() { return this.formBuilder.group({ brandingName: [ '', [Validators.required, this.ensureProperVariantName(), this.ensureNotExistingName()] ] }); } cancel() { this._reject(); } save() { this._resovle(this.form.value); } ensureNotExistingName() { return (control) => { if (typeof control.value === 'string') { const lowercaseName = control.value.toLowerCase(); const nameAlreadyTaken = this.namesAlreadyTaken.some(name => name.toLowerCase().startsWith(lowercaseName + '-')); if (nameAlreadyTaken) { return { nameAlreadyTaken: {} }; } } return null; }; } ensureProperVariantName() { return (control) => { if (typeof control.value === 'string') { const value = control.value; if (/[A-Z]/.test(value)) { return { onlyLowerCaseCharacters: {} }; } if (!/^[a-z0-9]+/.test(value)) { return { shouldStartWithLowerCaseLetterOrNumber: {} }; } const matches = /[^a-z0-9-]/.exec(value); if (matches) { return { invalidCharacters: { invalidCharacter: matches[0] } }; } } return null; }; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AddBrandingModalComponent, deps: [{ token: i1.StoreBrandingService }, { token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AddBrandingModalComponent, isStandalone: true, selector: "c8y-add-branding-modal", inputs: { duplicateBranding: "duplicateBranding" }, ngImport: i0, template: "<c8y-modal\n [title]=\"duplicateBranding ? 'Duplicate Branding' : 'Create Branding'\"\n [headerClasses]=\"'dialog-header'\"\n (onDismiss)=\"cancel()\"\n (onClose)=\"save()\"\n [disabled]=\"form.invalid\"\n [labels]=\"{ cancel: 'Cancel', ok: 'Save' }\"\n>\n<ng-container c8y-modal-title>\n <span [c8yIcon]=\"'palette'\"></span>\n</ng-container>\n <div [formGroup]=\"form\" class=\"p-24\">\n <c8y-form-group>\n <label\n for=\"brandingName\"\n translate\n >\n Branding name\n </label>\n <input\n class=\"form-control\"\n name=\"brandingName\"\n id=\"brandingName\"\n type=\"text\"\n formControlName=\"brandingName\"\n placeholder=\"{{'e.g. {{ example }}' | translate : { example: 'main-branding' } }}\"\n />\n <c8y-messages [helpMessage]=\"'Upper case letters not allowed' | translate\">\n <c8y-message *ngFor=\"let message of messages\"\n [name]=\"message.name\"\n [text]=\"message.text | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n</c8y-modal>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i3.ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i3.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i3.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i3.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i3.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AddBrandingModalComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-add-branding-modal', standalone: true, imports: [CoreModule, NgIf, ReactiveFormsModule], template: "<c8y-modal\n [title]=\"duplicateBranding ? 'Duplicate Branding' : 'Create Branding'\"\n [headerClasses]=\"'dialog-header'\"\n (onDismiss)=\"cancel()\"\n (onClose)=\"save()\"\n [disabled]=\"form.invalid\"\n [labels]=\"{ cancel: 'Cancel', ok: 'Save' }\"\n>\n<ng-container c8y-modal-title>\n <span [c8yIcon]=\"'palette'\"></span>\n</ng-container>\n <div [formGroup]=\"form\" class=\"p-24\">\n <c8y-form-group>\n <label\n for=\"brandingName\"\n translate\n >\n Branding name\n </label>\n <input\n class=\"form-control\"\n name=\"brandingName\"\n id=\"brandingName\"\n type=\"text\"\n formControlName=\"brandingName\"\n placeholder=\"{{'e.g. {{ example }}' | translate : { example: 'main-branding' } }}\"\n />\n <c8y-messages [helpMessage]=\"'Upper case letters not allowed' | translate\">\n <c8y-message *ngFor=\"let message of messages\"\n [name]=\"message.name\"\n [text]=\"message.text | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n</c8y-modal>\n" }] }], ctorParameters: () => [{ type: i1.StoreBrandingService }, { type: i2.FormBuilder }], propDecorators: { duplicateBranding: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWJyYW5kaW5nLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2JyYW5kaW5nL3NoYXJlZC9sYXp5L2FkZC1icmFuZGluZy1tb2RhbC9hZGQtYnJhbmRpbmctbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vYnJhbmRpbmcvc2hhcmVkL2xhenkvYWRkLWJyYW5kaW5nLW1vZGFsL2FkZC1icmFuZGluZy1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNoRixPQUFPLEVBRUwsV0FBVyxFQUNYLG1CQUFtQixFQUVuQixVQUFVLEVBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7O0FBUXZDLE1BQU0sT0FBTyx5QkFBeUI7SUFpQ3BDLFlBQ1UsUUFBOEIsRUFDOUIsV0FBd0I7UUFEeEIsYUFBUSxHQUFSLFFBQVEsQ0FBc0I7UUFDOUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFsQ3pCLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUVuQyxzQkFBaUIsR0FBYSxFQUFFLENBQUM7UUFDakMsWUFBTyxHQUFHLElBQUksQ0FBQztRQUVmLFdBQU0sR0FBRyxJQUFJLE9BQU8sQ0FBNEMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDbEYsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7WUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7UUFF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LENBQUM7b0JBQzlCLE9BQU87d0JBQ0wsc0NBQXNDLEVBQUUsRUFBRTtxQkFDM0MsQ0FBQztnQkFDSixDQUFDO2dCQUVELE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3pDLElBQUksT0FBTyxFQUFFLENBQUM7b0JBQ1osT0FBTzt3QkFDTCxpQkFBaUIsRUFBRTs0QkFDakIsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQzt5QkFDN0I7cUJBQ0YsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDO0lBQ0osQ0FBQzsrR0E3R1UseUJBQXlCO21HQUF6Qix5QkFBeUIsc0lDbEJ0QyxzbUNBb0NBLDJDRHBCWSxVQUFVLDg1REFBUSxtQkFBbUI7OzRGQUVwQyx5QkFBeUI7a0JBTnJDLFNBQVM7K0JBQ0Usd0JBQXdCLGNBRXRCLElBQUksV0FDUCxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUM7bUhBR3ZDLGlCQUFpQjtzQkFBekIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0b3JlQnJhbmRpbmdTZXJ2aWNlIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9icmFuZGluZy9zaGFyZWQvZGF0YSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIEZvcm1CdWlsZGVyLFxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICBWYWxpZGF0b3JGbixcbiAgVmFsaWRhdG9yc1xufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDb3JlTW9kdWxlLCBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWFkZC1icmFuZGluZy1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9hZGQtYnJhbmRpbmctbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29yZU1vZHVsZSwgTmdJZiwgUmVhY3RpdmVGb3Jtc01vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgQWRkQnJhbmRpbmdNb2RhbENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGR1cGxpY2F0ZUJyYW5kaW5nID0gZmFsc2U7XG4gIGZvcm06IFJldHVyblR5cGU8dHlwZW9mIHRoaXMuaW5pdEZvcm0+O1xuICBuYW1lc0FscmVhZHlUYWtlbjogc3RyaW5nW10gPSBbXTtcbiAgbG9hZGluZyA9IHRydWU7XG5cbiAgcmVzdWx0ID0gbmV3IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5pbml0Rm9ybT5bJ3ZhbHVlJ10+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0aGlzLl9yZXNvdmxlID0gcmVzb2x2ZTtcbiAgICB0aGlzLl9yZWplY3QgPSByZWplY3Q7XG4gIH0pO1xuXG4gIG1lc3NhZ2VzID0gW1xuICAgIHtcbiAgICAgIG5hbWU6ICduYW1lQWxyZWFkeVRha2VuJyxcbiAgICAgIHRleHQ6IGdldHRleHQoJ1RoZSBwcm92aWRlZCBuYW1lIGlzIGFscmVhZHkgdGFrZW4uJylcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdvbmx5TG93ZXJDYXNlQ2hhcmFjdGVycycsXG4gICAgICB0ZXh0OiBnZXR0ZXh0KCdPbmx5IGxvd2VyIGNhc2UgY2hhcmFjdGVycyBhcmUgYWxsb3dlZC4nKVxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ3Nob3VsZFN0YXJ0V2l0aExvd2VyQ2FzZUxldHRlck9yTnVtYmVyJyxcbiAgICAgIHRleHQ6IGdldHRleHQoJ1Nob3VsZCBzdGFydCB3aXRoIGEgbG93ZXIgY2FzZSBsZXR0ZXIgb3IgYSBudW1iZXIuJylcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdpbnZhbGlkQ2hhcmFjdGVycycsXG4gICAgICB0ZXh0OiBnZXR0ZXh0KCdJbnZhbGlkIGNoYXJhY3RlciBcInt7IGludmFsaWRDaGFyYWN0ZXIgfX1cIi4gT25seSBhLXosIDAtOSBhbmQgLSBhcmUgYWxsb3dlZC4nKVxuICAgIH1cbiAgXSBhcyBjb25zdDtcblxuICBwcml2YXRlIF9yZXNvdmxlOiAodmFsdWU6IFJldHVyblR5cGU8dHlwZW9mIHRoaXMuaW5pdEZvcm0+Wyd2YWx1ZSddKSA9PiB2b2lkO1xuICBwcml2YXRlIF9yZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBicmFuZGluZzogU3RvcmVCcmFuZGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXJcbiAgKSB7XG4gICAgdGhpcy5mb3JtID0gdGhpcy5pbml0Rm9ybSgpO1xuICAgIHRoaXMuZ2V0RXhpc3RpbmdCcmFuZGluZ1ZlcnNpb25zKCk7XG4gIH1cblxuICBhc3luYyBnZXRFeGlzdGluZ0JyYW5kaW5nVmVyc2lvbnMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdmFyaWFudHMgfSA9IGF3YWl0IHRoaXMuYnJhbmRpbmcubG9hZEJyYW5kaW5nVmFyaWFudHMoKTtcbiAgICAgIHRoaXMubmFtZXNBbHJlYWR5VGFrZW4gPSB2YXJpYW50cy5tYXAodmFyaWFudCA9PiB2YXJpYW50LnZlcnNpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihlKTtcbiAgICB9XG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIH1cblxuICBpbml0Rm9ybSgpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBicmFuZGluZ05hbWU6IFtcbiAgICAgICAgJycsXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLmVuc3VyZVByb3BlclZhcmlhbnROYW1lKCksIHRoaXMuZW5zdXJlTm90RXhpc3RpbmdOYW1lKCldXG4gICAgICBdXG4gICAgfSk7XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5fcmVqZWN0KCk7XG4gIH1cblxuICBzYXZlKCkge1xuICAgIHRoaXMuX3Jlc292bGUodGhpcy5mb3JtLnZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlTm90RXhpc3RpbmdOYW1lKCk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBjb250cm9sLnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBsb3dlcmNhc2VOYW1lID0gY29udHJvbC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBuYW1lQWxyZWFkeVRha2VuID0gdGhpcy5uYW1lc0FscmVhZHlUYWtlbi5zb21lKG5hbWUgPT5cbiAgICAgICAgICBuYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChsb3dlcmNhc2VOYW1lICsgJy0nKVxuICAgICAgICApO1xuICAgICAgICBpZiAobmFtZUFscmVhZHlUYWtlbikge1xuICAgICAgICAgIHJldHVybiB7IG5hbWVBbHJlYWR5VGFrZW46IHt9IH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVByb3BlclZhcmlhbnROYW1lKCk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBjb250cm9sLnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgICAgIGlmICgvW0EtWl0vLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9ubHlMb3dlckNhc2VDaGFyYWN0ZXJzOiB7fVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEvXlthLXowLTldKy8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2hvdWxkU3RhcnRXaXRoTG93ZXJDYXNlTGV0dGVyT3JOdW1iZXI6IHt9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSAvW15hLXowLTktXS8uZXhlYyh2YWx1ZSk7XG4gICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGludmFsaWRDaGFyYWN0ZXJzOiB7XG4gICAgICAgICAgICAgIGludmFsaWRDaGFyYWN0ZXI6IG1hdGNoZXNbMF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG59XG4iLCI8Yzh5LW1vZGFsXG4gIFt0aXRsZV09XCJkdXBsaWNhdGVCcmFuZGluZyA/ICdEdXBsaWNhdGUgQnJhbmRpbmcnIDogJ0NyZWF0ZSBCcmFuZGluZydcIlxuICBbaGVhZGVyQ2xhc3Nlc109XCInZGlhbG9nLWhlYWRlcidcIlxuICAob25EaXNtaXNzKT1cImNhbmNlbCgpXCJcbiAgKG9uQ2xvc2UpPVwic2F2ZSgpXCJcbiAgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZFwiXG4gIFtsYWJlbHNdPVwieyBjYW5jZWw6ICdDYW5jZWwnLCBvazogJ1NhdmUnIH1cIlxuPlxuPG5nLWNvbnRhaW5lciBjOHktbW9kYWwtdGl0bGU+XG4gIDxzcGFuIFtjOHlJY29uXT1cIidwYWxldHRlJ1wiPjwvc3Bhbj5cbjwvbmctY29udGFpbmVyPlxuICA8ZGl2IFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwicC0yNFwiPlxuICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgIDxsYWJlbFxuICAgICAgICBmb3I9XCJicmFuZGluZ05hbWVcIlxuICAgICAgICB0cmFuc2xhdGVcbiAgICAgID5cbiAgICAgICAgQnJhbmRpbmcgbmFtZVxuICAgICAgPC9sYWJlbD5cbiAgICAgIDxpbnB1dFxuICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgIG5hbWU9XCJicmFuZGluZ05hbWVcIlxuICAgICAgICBpZD1cImJyYW5kaW5nTmFtZVwiXG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYnJhbmRpbmdOYW1lXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eydlLmcuIHt7IGV4YW1wbGUgfX0nIHwgdHJhbnNsYXRlIDogeyBleGFtcGxlOiAnbWFpbi1icmFuZGluZycgfSB9fVwiXG4gICAgICAvPlxuICAgICAgPGM4eS1tZXNzYWdlcyBbaGVscE1lc3NhZ2VdPVwiJ1VwcGVyIGNhc2UgbGV0dGVycyBub3QgYWxsb3dlZCcgfCB0cmFuc2xhdGVcIj5cbiAgICAgICAgPGM4eS1tZXNzYWdlICpuZ0Zvcj1cImxldCBtZXNzYWdlIG9mIG1lc3NhZ2VzXCJcbiAgICAgICAgICBbbmFtZV09XCJtZXNzYWdlLm5hbWVcIlxuICAgICAgICAgIFt0ZXh0XT1cIm1lc3NhZ2UudGV4dCB8IHRyYW5zbGF0ZVwiXG4gICAgICAgID48L2M4eS1tZXNzYWdlPlxuICAgICAgPC9jOHktbWVzc2FnZXM+XG4gICAgPC9jOHktZm9ybS1ncm91cD5cbiAgPC9kaXY+XG48L2M4eS1tb2RhbD5cbiJdfQ==