UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

126 lines 18.4 kB
import { Component, EventEmitter, Injector, Input, Output, ViewChild, ViewContainerRef } from '@angular/core'; import { Router } from '@angular/router'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { WizardService } from '../wizard.service'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; import * as i2 from "../wizard.service"; import * as i3 from "@angular/common"; import * as i4 from "../../common/icon.directive"; import * as i5 from "../../i18n/c8y-translate.directive"; import * as i6 from "../../i18n/c8y-translate.pipe"; export class WizardOutletComponent { constructor(router, c8yWizardService, viewContainerRef, injector) { this.router = router; this.c8yWizardService = c8yWizardService; this.viewContainerRef = viewContainerRef; this.injector = injector; /** * The initial state to be assigned to the created component. */ this.initialState = {}; /** * The event that is emitted when the wizard entry is clicked. */ this.onSelect = new EventEmitter(); /** * The event that is emitted when the URL path is provided. */ this.onPath = new EventEmitter(); /** * List of wizard entries. */ this.entries = []; /** * @ignore */ this.showList = true; /** * @ignore */ this.destroy$ = new Subject(); } ngAfterViewInit() { this.c8yWizardService .getEntriesListById(this.id) .pipe(takeUntil(this.destroy$)) .subscribe((entries) => { this.container.clear(); this.entries = entries; this.onEntriesLoaded(); }); } /** * Handles the wizard entry, if the entry contains a path, the user will be redirected to it. * Otherwise, an attempt will be made to create a dynamic component provided in the entry. * @param entry Wizard menu entry. */ handleEntry(entry = {}) { const { path, component, injector } = entry; if (path) { this.handlePath(path); return; } if (component) { this.handleComponent(component, injector); this.onSelect.emit(entry); } } /** * Resets the wizard to its initial state. */ reset() { if (this.componentInstance) { this.componentInstance = undefined; this.container.clear(); this.showList = true; } } ngOnDestroy() { if (this.componentInstance) { this.container.clear(); } this.destroy$.next(true); this.destroy$.unsubscribe(); } onEntriesLoaded() { const [firstEntry] = this.entries; const isSingleEntry = this.entries.length === 1; const shouldRedirectToPath = firstEntry && !!firstEntry.path; const shouldOmitListOfEntries = isSingleEntry && !shouldRedirectToPath; if (shouldOmitListOfEntries) { this.handleEntry(firstEntry); } } handlePath(path) { this.router.navigateByUrl(path); this.onPath.emit(path); } handleComponent(component, injector) { this.showList = false; const componentInstance = this.viewContainerRef.createComponent(component, { environmentInjector: (injector || this.injector) }); Object.assign(componentInstance.instance, this.initialState); this.componentInstance = componentInstance; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WizardOutletComponent, deps: [{ token: i1.Router }, { token: i2.WizardService }, { token: i0.ViewContainerRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: WizardOutletComponent, selector: "c8y-wizard-outlet", inputs: { initialState: "initialState", id: "id" }, outputs: { onSelect: "onSelect", onPath: "onPath" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<ng-container>\n <div class=\"modal-inner-scroll animated fadeIn\" *ngIf=\"showList\" id=\"modal-body\">\n <p class=\"p-16 text-center text-medium separator-bottom\">\n <span translate>Select method</span>\n </p>\n <div class=\"list-group list-group-links\" *ngIf=\"entries.length > 0; else emptyState\">\n <button\n *ngFor=\"let entry of entries\"\n type=\"button\"\n class=\"list-group-item d-flex a-i-center p-t-8 p-b-8\"\n (click)=\"handleEntry(entry)\"\n >\n <div class=\"list-item-icon\">\n <i [c8yIcon]=\"entry.c8yIcon || 'cogs'\"></i>\n </div>\n <div title=\"{{ entry.name | translate }}\" class=\"list-item-body text-truncate\">\n {{ entry.name | translate }}\n </div>\n </button>\n </div>\n\n <ng-template #emptyState>\n <div class=\"c8y-empty-state\">\n <p>{{ 'No options available.' | translate }}</p>\n </div>\n </ng-template>\n </div>\n</ng-container>\n<template #container [hidden]=\"showList\"></template>\n", dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i5.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "pipe", type: i6.C8yTranslatePipe, name: "translate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WizardOutletComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-wizard-outlet', template: "<ng-container>\n <div class=\"modal-inner-scroll animated fadeIn\" *ngIf=\"showList\" id=\"modal-body\">\n <p class=\"p-16 text-center text-medium separator-bottom\">\n <span translate>Select method</span>\n </p>\n <div class=\"list-group list-group-links\" *ngIf=\"entries.length > 0; else emptyState\">\n <button\n *ngFor=\"let entry of entries\"\n type=\"button\"\n class=\"list-group-item d-flex a-i-center p-t-8 p-b-8\"\n (click)=\"handleEntry(entry)\"\n >\n <div class=\"list-item-icon\">\n <i [c8yIcon]=\"entry.c8yIcon || 'cogs'\"></i>\n </div>\n <div title=\"{{ entry.name | translate }}\" class=\"list-item-body text-truncate\">\n {{ entry.name | translate }}\n </div>\n </button>\n </div>\n\n <ng-template #emptyState>\n <div class=\"c8y-empty-state\">\n <p>{{ 'No options available.' | translate }}</p>\n </div>\n </ng-template>\n </div>\n</ng-container>\n<template #container [hidden]=\"showList\"></template>\n" }] }], ctorParameters: () => [{ type: i1.Router }, { type: i2.WizardService }, { type: i0.ViewContainerRef }, { type: i0.Injector }], propDecorators: { container: [{ type: ViewChild, args: ['container', { read: ViewContainerRef }] }], initialState: [{ type: Input }], id: [{ type: Input }], onSelect: [{ type: Output }], onPath: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l6YXJkLW91dGxldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9jb3JlL3dpemFyZC93aXphcmQtb3V0bGV0L3dpemFyZC1vdXRsZXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vY29yZS93aXphcmQvd2l6YXJkLW91dGxldC93aXphcmQtb3V0bGV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBR1QsWUFBWSxFQUNaLFFBQVEsRUFDUixLQUFLLEVBRUwsTUFBTSxFQUVOLFNBQVMsRUFDVCxnQkFBZ0IsRUFDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7Ozs7QUFNbEQsTUFBTSxPQUFPLHFCQUFxQjtJQW1DaEMsWUFDVSxNQUFjLEVBQ2QsZ0JBQStCLEVBQy9CLGdCQUFrQyxFQUNsQyxRQUFrQjtRQUhsQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFlO1FBQy9CLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQXJDNUI7O1dBRUc7UUFDTSxpQkFBWSxHQUFRLEVBQUUsQ0FBQztRQU1oQzs7V0FFRztRQUNPLGFBQVEsR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNuRTs7V0FFRztRQUNPLFdBQU0sR0FBeUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM1RDs7V0FFRztRQUNILFlBQU8sR0FBa0IsRUFBRSxDQUFDO1FBQzVCOztXQUVHO1FB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QixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO0lBQzdDLENBQUM7K0dBakhVLHFCQUFxQjttR0FBckIscUJBQXFCLHFQQUNBLGdCQUFnQiw2QkN6QmxELGdpQ0E2QkE7OzRGRExhLHFCQUFxQjtrQkFKakMsU0FBUzsrQkFDRSxtQkFBbUI7NkpBSXVCLFNBQVM7c0JBQTVELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQUl6QyxZQUFZO3NCQUFwQixLQUFLO2dCQUtHLEVBQUU7c0JBQVYsS0FBSztnQkFJSSxRQUFRO3NCQUFqQixNQUFNO2dCQUlHLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgQ29tcG9uZW50UmVmLFxuICBFbnZpcm9ubWVudEluamVjdG9yLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFR5cGUsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBXaXphcmRFbnRyeSB9IGZyb20gJy4uL3dpemFyZC5tb2RlbCc7XG5pbXBvcnQgeyBXaXphcmRTZXJ2aWNlIH0gZnJvbSAnLi4vd2l6YXJkLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktd2l6YXJkLW91dGxldCcsXG4gIHRlbXBsYXRlVXJsOiAnLi93aXphcmQtb3V0bGV0LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBXaXphcmRPdXRsZXRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCdjb250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSkgY29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xuICAvKipcbiAgICogVGhlIGluaXRpYWwgc3RhdGUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIGNyZWF0ZWQgY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgaW5pdGlhbFN0YXRlOiBhbnkgPSB7fTtcbiAgLyoqXG4gICAqIFRoZSBpZCBwYXJhbWV0ZXIgaWRlbnRpZmllcyB0aGUgcGFydGljdWxhciB3aXphcmQgYW5kIGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIGl0IHdoZW4gaG9va2luZyB3aXphcmQgZW50cmllcy5cbiAgICogRXhhbXBsZTogXCJ3aXphcmRJZFwiLlxuICAgKi9cbiAgQElucHV0KCkgaWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiB0aGUgd2l6YXJkIGVudHJ5IGlzIGNsaWNrZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgb25TZWxlY3Q6IEV2ZW50RW1pdHRlcjxXaXphcmRFbnRyeT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gdGhlIFVSTCBwYXRoIGlzIHByb3ZpZGVkLlxuICAgKi9cbiAgQE91dHB1dCgpIG9uUGF0aDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8qKlxuICAgKiBMaXN0IG9mIHdpemFyZCBlbnRyaWVzLlxuICAgKi9cbiAgZW50cmllczogV2l6YXJkRW50cnlbXSA9IFtdO1xuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgc2hvd0xpc3QgPSB0cnVlO1xuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcHJpdmF0ZSBkZXN0cm95JDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBwcml2YXRlIGNvbXBvbmVudEluc3RhbmNlOiBDb21wb25lbnRSZWY8dW5rbm93bj47XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBjOHlXaXphcmRTZXJ2aWNlOiBXaXphcmRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvclxuICApIHt9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuYzh5V2l6YXJkU2VydmljZVxuICAgICAgLmdldEVudHJpZXNMaXN0QnlJZCh0aGlzLmlkKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoZW50cmllczogV2l6YXJkRW50cnlbXSkgPT4ge1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGVhcigpO1xuICAgICAgICB0aGlzLmVudHJpZXMgPSBlbnRyaWVzO1xuICAgICAgICB0aGlzLm9uRW50cmllc0xvYWRlZCgpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgd2l6YXJkIGVudHJ5LCBpZiB0aGUgZW50cnkgY29udGFpbnMgYSBwYXRoLCB0aGUgdXNlciB3aWxsIGJlIHJlZGlyZWN0ZWQgdG8gaXQuXG4gICAqIE90aGVyd2lzZSwgYW4gYXR0ZW1wdCB3aWxsIGJlIG1hZGUgdG8gY3JlYXRlIGEgZHluYW1pYyBjb21wb25lbnQgcHJvdmlkZWQgaW4gdGhlIGVudHJ5LlxuICAgKiBAcGFyYW0gZW50cnkgV2l6YXJkIG1lbnUgZW50cnkuXG4gICAqL1xuICBoYW5kbGVFbnRyeShlbnRyeTogV2l6YXJkRW50cnkgPSB7fSBhcyBXaXphcmRFbnRyeSkge1xuICAgIGNvbnN0IHsgcGF0aCwgY29tcG9uZW50LCBpbmplY3RvciB9ID0gZW50cnk7XG4gICAgaWYgKHBhdGgpIHtcbiAgICAgIHRoaXMuaGFuZGxlUGF0aChwYXRoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICB0aGlzLmhhbmRsZUNvbXBvbmVudChjb21wb25lbnQsIGluamVjdG9yKTtcbiAgICAgIHRoaXMub25TZWxlY3QuZW1pdChlbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgd2l6YXJkIHRvIGl0cyBpbml0aWFsIHN0YXRlLlxuICAgKi9cbiAgcmVzZXQoKSB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50SW5zdGFuY2UgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmNvbnRhaW5lci5jbGVhcigpO1xuICAgICAgdGhpcy5zaG93TGlzdCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLmNsZWFyKCk7XG4gICAgfVxuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRlc3Ryb3kkLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIG9uRW50cmllc0xvYWRlZCgpIHtcbiAgICBjb25zdCBbZmlyc3RFbnRyeV0gPSB0aGlzLmVudHJpZXM7XG4gICAgY29uc3QgaXNTaW5nbGVFbnRyeSA9IHRoaXMuZW50cmllcy5sZW5ndGggPT09IDE7XG4gICAgY29uc3Qgc2hvdWxkUmVkaXJlY3RUb1BhdGggPSBmaXJzdEVudHJ5ICYmICEhZmlyc3RFbnRyeS5wYXRoO1xuICAgIGNvbnN0IHNob3VsZE9taXRMaXN0T2ZFbnRyaWVzID0gaXNTaW5nbGVFbnRyeSAmJiAhc2hvdWxkUmVkaXJlY3RUb1BhdGg7XG5cbiAgICBpZiAoc2hvdWxkT21pdExpc3RPZkVudHJpZXMpIHtcbiAgICAgIHRoaXMuaGFuZGxlRW50cnkoZmlyc3RFbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVQYXRoKHBhdGg6IHN0cmluZykge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwocGF0aCk7XG4gICAgdGhpcy5vblBhdGguZW1pdChwYXRoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ29tcG9uZW50KGNvbXBvbmVudDogVHlwZTx1bmtub3duPiwgaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgdGhpcy5zaG93TGlzdCA9IGZhbHNlO1xuICAgIGNvbnN0IGNvbXBvbmVudEluc3RhbmNlID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnQsIHtcbiAgICAgIGVudmlyb25tZW50SW5qZWN0b3I6IChpbmplY3RvciB8fCB0aGlzLmluamVjdG9yKSBhcyBFbnZpcm9ubWVudEluamVjdG9yXG4gICAgfSk7XG4gICAgT2JqZWN0LmFzc2lnbihjb21wb25lbnRJbnN0YW5jZS5pbnN0YW5jZSwgdGhpcy5pbml0aWFsU3RhdGUpO1xuICAgIHRoaXMuY29tcG9uZW50SW5zdGFuY2UgPSBjb21wb25lbnRJbnN0YW5jZTtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lcj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWlubmVyLXNjcm9sbCBhbmltYXRlZCBmYWRlSW5cIiAqbmdJZj1cInNob3dMaXN0XCIgaWQ9XCJtb2RhbC1ib2R5XCI+XG4gICAgPHAgY2xhc3M9XCJwLTE2IHRleHQtY2VudGVyIHRleHQtbWVkaXVtIHNlcGFyYXRvci1ib3R0b21cIj5cbiAgICAgIDxzcGFuIHRyYW5zbGF0ZT5TZWxlY3QgbWV0aG9kPC9zcGFuPlxuICAgIDwvcD5cbiAgICA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWxpbmtzXCIgKm5nSWY9XCJlbnRyaWVzLmxlbmd0aCA+IDA7IGVsc2UgZW1wdHlTdGF0ZVwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdGb3I9XCJsZXQgZW50cnkgb2YgZW50cmllc1wiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBkLWZsZXggYS1pLWNlbnRlciBwLXQtOCBwLWItOFwiXG4gICAgICAgIChjbGljayk9XCJoYW5kbGVFbnRyeShlbnRyeSlcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1pdGVtLWljb25cIj5cbiAgICAgICAgICA8aSBbYzh5SWNvbl09XCJlbnRyeS5jOHlJY29uIHx8ICdjb2dzJ1wiPjwvaT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgdGl0bGU9XCJ7eyBlbnRyeS5uYW1lIHwgdHJhbnNsYXRlIH19XCIgY2xhc3M9XCJsaXN0LWl0ZW0tYm9keSB0ZXh0LXRydW5jYXRlXCI+XG4gICAgICAgICAge3sgZW50cnkubmFtZSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLXRlbXBsYXRlICNlbXB0eVN0YXRlPlxuICAgICAgPGRpdiBjbGFzcz1cImM4eS1lbXB0eS1zdGF0ZVwiPlxuICAgICAgICA8cD57eyAnTm8gb3B0aW9ucyBhdmFpbGFibGUuJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG48dGVtcGxhdGUgI2NvbnRhaW5lciBbaGlkZGVuXT1cInNob3dMaXN0XCI+PC90ZW1wbGF0ZT5cbiJdfQ==