@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
38 lines • 16.9 kB
JavaScript
import { Component, ViewChild } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { shareReplay, switchMap, tap } from 'rxjs/operators';
import { EcosystemService, ListFiltersComponent } from '@c8y/ngx-components/ecosystem/shared';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/ngx-components/ecosystem/shared";
import * as i2 from "@c8y/ngx-components";
import * as i3 from "@angular/common";
export class FeatureListComponent {
constructor(ecosystemService) {
this.ecosystemService = ecosystemService;
this.reloading = false;
this.reload$ = new BehaviorSubject(null);
this.features$ = this.reload$.pipe(tap(() => (this.reloading = true)), switchMap(() => this.ecosystemService.getFeatureApplications()), tap(() => (this.reloading = false)), shareReplay());
}
ngOnInit() {
this.loadFeatures();
}
loadFeatures() {
this.reload$.next();
}
setFilterPipe(pipe) {
this.filteredFeatures$ = this.features$.pipe(src => pipe(src));
}
resetFilters() {
this.filtersComponent?.resetAllFilters();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureListComponent, deps: [{ token: i1.EcosystemService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FeatureListComponent, selector: "c8y-feature-list", viewQueries: [{ propertyName: "filtersComponent", first: true, predicate: ListFiltersComponent, descendants: true }], ngImport: i0, template: "<c8y-title>{{ 'Features' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item [icon]=\"'c8y-atom'\" [label]=\"'Ecosystem' | translate\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-modules'\"\n [label]=\"'Applications' | translate\"\n [path]=\"'ecosystem/application/applications'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [icon]=\"'tab'\" [label]=\"'Features' | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button (click)=\"reload$.next()\" class=\"btn btn-link\" title=\"{{ 'Reload' | translate }}\">\n <i [ngClass]=\"{ 'icon-spin': reloading }\" c8yIcon=\"refresh\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'left'\">\n <c8y-list-filters\n *ngIf=\"features$ | async\"\n (filterPipeChange)=\"setFilterPipe($event)\"\n ></c8y-list-filters>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'left'\" itemClass=\"navbar-form hidden-xs\">\n <c8y-list-display-switch\n (onListClassChange)=\"listClass = $event\"\n [listLength]=\"(features$ | async)?.length\"\n ></c8y-list-display-switch>\n</c8y-action-bar-item>\n\n<div *ngIf=\"(features$ | async)?.length === 0\" class=\"c8y-empty-state text-center\">\n <h1 class=\"c8y-icon c8y-icon-modules c8y-icon-duocolor\"></h1>\n <h3 translate>No features to display.</h3>\n <p translate>No additional features are subscribed to the tenant.</p>\n</div>\n\n<div [ngClass]=\"listClass\" class=\"card-group\">\n <div class=\"page-sticky-header hidden-xs d-flex\" *ngIf=\"(features$ | async)?.length > 0\">\n <div class=\"card-block card-column-40\">\n <div class=\"card-appicon p-l-32 p-r-16 m-r-0 m-l-4\"></div>\n {{ 'Feature' | translate }}\n </div>\n <div class=\"card-block p-0 card-column-80\">\n <div class=\"card-block card-column-80\">{{ 'Description' | translate }}</div>\n <div class=\"card-block card-column-20\">{{ 'Type' | translate }}</div>\n </div>\n </div>\n <div *ngFor=\"let feature of filteredFeatures$ | async\" class=\"col-xs-12 col-sm-4 col-md-3\">\n <c8y-application-card\n [app]=\"feature\"\n [canEdit]=\"false\"\n class=\"d-contents\"\n ></c8y-application-card>\n </div>\n</div>\n\n<c8y-ui-empty-state\n *ngIf=\"(features$ | async)?.length > 0 && (filteredFeatures$ | async)?.length === 0\"\n [icon]=\"'search'\"\n [title]=\"'No matching features.' | translate\"\n [subtitle]=\"'Refine your search terms and/or the filters' | translate\"\n>\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n title=\"{{ 'Reset filters' | translate }}\"\n (click)=\"resetFilters()\"\n >\n {{ 'Reset filters' | translate }}\n </button>\n</c8y-ui-empty-state>\n", dependencies: [{ kind: "component", type: i2.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "component", type: i2.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i2.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "component", type: i2.ListDisplaySwitchComponent, selector: "c8y-list-display-switch", inputs: ["listKey", "listLength", "filterPipe"], outputs: ["onListClassChange"] }, { kind: "component", type: i1.ApplicationCardComponent, selector: "c8y-application-card", inputs: ["app", "canEdit"], outputs: ["onAppDeleted", "onAppCloned"] }, { kind: "component", type: i1.ListFiltersComponent, selector: "c8y-list-filters", inputs: ["packageTypes", "packageAvailabilities", "packageContents"], outputs: ["filterPipeChange"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureListComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-feature-list', template: "<c8y-title>{{ 'Features' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item [icon]=\"'c8y-atom'\" [label]=\"'Ecosystem' | translate\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-modules'\"\n [label]=\"'Applications' | translate\"\n [path]=\"'ecosystem/application/applications'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [icon]=\"'tab'\" [label]=\"'Features' | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button (click)=\"reload$.next()\" class=\"btn btn-link\" title=\"{{ 'Reload' | translate }}\">\n <i [ngClass]=\"{ 'icon-spin': reloading }\" c8yIcon=\"refresh\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'left'\">\n <c8y-list-filters\n *ngIf=\"features$ | async\"\n (filterPipeChange)=\"setFilterPipe($event)\"\n ></c8y-list-filters>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'left'\" itemClass=\"navbar-form hidden-xs\">\n <c8y-list-display-switch\n (onListClassChange)=\"listClass = $event\"\n [listLength]=\"(features$ | async)?.length\"\n ></c8y-list-display-switch>\n</c8y-action-bar-item>\n\n<div *ngIf=\"(features$ | async)?.length === 0\" class=\"c8y-empty-state text-center\">\n <h1 class=\"c8y-icon c8y-icon-modules c8y-icon-duocolor\"></h1>\n <h3 translate>No features to display.</h3>\n <p translate>No additional features are subscribed to the tenant.</p>\n</div>\n\n<div [ngClass]=\"listClass\" class=\"card-group\">\n <div class=\"page-sticky-header hidden-xs d-flex\" *ngIf=\"(features$ | async)?.length > 0\">\n <div class=\"card-block card-column-40\">\n <div class=\"card-appicon p-l-32 p-r-16 m-r-0 m-l-4\"></div>\n {{ 'Feature' | translate }}\n </div>\n <div class=\"card-block p-0 card-column-80\">\n <div class=\"card-block card-column-80\">{{ 'Description' | translate }}</div>\n <div class=\"card-block card-column-20\">{{ 'Type' | translate }}</div>\n </div>\n </div>\n <div *ngFor=\"let feature of filteredFeatures$ | async\" class=\"col-xs-12 col-sm-4 col-md-3\">\n <c8y-application-card\n [app]=\"feature\"\n [canEdit]=\"false\"\n class=\"d-contents\"\n ></c8y-application-card>\n </div>\n</div>\n\n<c8y-ui-empty-state\n *ngIf=\"(features$ | async)?.length > 0 && (filteredFeatures$ | async)?.length === 0\"\n [icon]=\"'search'\"\n [title]=\"'No matching features.' | translate\"\n [subtitle]=\"'Refine your search terms and/or the filters' | translate\"\n>\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n title=\"{{ 'Reset filters' | translate }}\"\n (click)=\"resetFilters()\"\n >\n {{ 'Reset filters' | translate }}\n </button>\n</c8y-ui-empty-state>\n" }]
}], ctorParameters: () => [{ type: i1.EcosystemService }], propDecorators: { filtersComponent: [{
type: ViewChild,
args: [ListFiltersComponent]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2Vjb3N5c3RlbS9mZWF0dXJlcy9mZWF0dXJlLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vZWNvc3lzdGVtL2ZlYXR1cmVzL2ZlYXR1cmUtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdELE9BQU8sRUFDTCxnQkFBZ0IsRUFHaEIsb0JBQW9CLEVBQ3JCLE1BQU0sc0NBQXNDLENBQUM7Ozs7O0FBTTlDLE1BQU0sT0FBTyxvQkFBb0I7SUFjL0IsWUFBb0IsZ0JBQWtDO1FBQWxDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFidEQsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixZQUFPLEdBQTBCLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTNELGNBQVMsR0FBK0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ3ZELEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFDbEMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLEVBQy9ELEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFDbkMsV0FBVyxFQUFFLENBQ2QsQ0FBQztJQUt1RCxDQUFDO0lBRTFELFFBQVE7UUFDTixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxhQUFhLENBQUMsSUFBZ0I7UUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLENBQUM7SUFDM0MsQ0FBQzsrR0E5QlUsb0JBQW9CO21HQUFwQixvQkFBb0IsMEdBWXBCLG9CQUFvQixnREMzQmpDLDR2RkEwRUE7OzRGRDNEYSxvQkFBb0I7a0JBSmhDLFNBQVM7K0JBQ0Usa0JBQWtCO3FGQWVLLGdCQUFnQjtzQkFBaEQsU0FBUzt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJQXBwbGljYXRpb24gfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBzaGFyZVJlcGxheSwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBFY29zeXN0ZW1TZXJ2aWNlLFxuICBGaWx0ZXJhYmxlQXBwT3JQbHVnaW4sXG4gIEZpbHRlclBpcGUsXG4gIExpc3RGaWx0ZXJzQ29tcG9uZW50XG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvZWNvc3lzdGVtL3NoYXJlZCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1mZWF0dXJlLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vZmVhdHVyZS1saXN0LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBGZWF0dXJlTGlzdENvbXBvbmVudCB7XG4gIHJlbG9hZGluZyA9IGZhbHNlO1xuICByZWxvYWQkOiBCZWhhdmlvclN1YmplY3Q8dm9pZD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuXG4gIGZlYXR1cmVzJDogT2JzZXJ2YWJsZTxJQXBwbGljYXRpb25bXT4gPSB0aGlzLnJlbG9hZCQucGlwZShcbiAgICB0YXAoKCkgPT4gKHRoaXMucmVsb2FkaW5nID0gdHJ1ZSkpLFxuICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmVjb3N5c3RlbVNlcnZpY2UuZ2V0RmVhdHVyZUFwcGxpY2F0aW9ucygpKSxcbiAgICB0YXAoKCkgPT4gKHRoaXMucmVsb2FkaW5nID0gZmFsc2UpKSxcbiAgICBzaGFyZVJlcGxheSgpXG4gICk7XG4gIGZpbHRlcmVkRmVhdHVyZXMkOiBPYnNlcnZhYmxlPEZpbHRlcmFibGVBcHBPclBsdWdpbltdPjtcbiAgbGlzdENsYXNzOiBzdHJpbmc7XG4gIEBWaWV3Q2hpbGQoTGlzdEZpbHRlcnNDb21wb25lbnQpIGZpbHRlcnNDb21wb25lbnQ6IExpc3RGaWx0ZXJzQ29tcG9uZW50O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWNvc3lzdGVtU2VydmljZTogRWNvc3lzdGVtU2VydmljZSkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmxvYWRGZWF0dXJlcygpO1xuICB9XG5cbiAgbG9hZEZlYXR1cmVzKCkge1xuICAgIHRoaXMucmVsb2FkJC5uZXh0KCk7XG4gIH1cblxuICBzZXRGaWx0ZXJQaXBlKHBpcGU6IEZpbHRlclBpcGUpIHtcbiAgICB0aGlzLmZpbHRlcmVkRmVhdHVyZXMkID0gdGhpcy5mZWF0dXJlcyQucGlwZShzcmMgPT4gcGlwZShzcmMpKTtcbiAgfVxuXG4gIHJlc2V0RmlsdGVycygpIHtcbiAgICB0aGlzLmZpbHRlcnNDb21wb25lbnQ/LnJlc2V0QWxsRmlsdGVycygpO1xuICB9XG59XG4iLCI8Yzh5LXRpdGxlPnt7ICdGZWF0dXJlcycgfCB0cmFuc2xhdGUgfX08L2M4eS10aXRsZT5cblxuPGM4eS1icmVhZGNydW1iPlxuICA8Yzh5LWJyZWFkY3J1bWItaXRlbSBbaWNvbl09XCInYzh5LWF0b20nXCIgW2xhYmVsXT1cIidFY29zeXN0ZW0nIHwgdHJhbnNsYXRlXCI+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuICA8Yzh5LWJyZWFkY3J1bWItaXRlbVxuICAgIFtpY29uXT1cIidjOHktbW9kdWxlcydcIlxuICAgIFtsYWJlbF09XCInQXBwbGljYXRpb25zJyB8IHRyYW5zbGF0ZVwiXG4gICAgW3BhdGhdPVwiJ2Vjb3N5c3RlbS9hcHBsaWNhdGlvbi9hcHBsaWNhdGlvbnMnXCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW0gW2ljb25dPVwiJ3RhYidcIiBbbGFiZWxdPVwiJ0ZlYXR1cmVzJyB8IHRyYW5zbGF0ZVwiPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbjwvYzh5LWJyZWFkY3J1bWI+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiPlxuICA8YnV0dG9uIChjbGljayk9XCJyZWxvYWQkLm5leHQoKVwiIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCIgdGl0bGU9XCJ7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgIDxpIFtuZ0NsYXNzXT1cInsgJ2ljb24tc3Bpbic6IHJlbG9hZGluZyB9XCIgYzh5SWNvbj1cInJlZnJlc2hcIj48L2k+XG4gICAge3sgJ1JlbG9hZCcgfCB0cmFuc2xhdGUgfX1cbiAgPC9idXR0b24+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ2xlZnQnXCI+XG4gIDxjOHktbGlzdC1maWx0ZXJzXG4gICAgKm5nSWY9XCJmZWF0dXJlcyQgfCBhc3luY1wiXG4gICAgKGZpbHRlclBpcGVDaGFuZ2UpPVwic2V0RmlsdGVyUGlwZSgkZXZlbnQpXCJcbiAgPjwvYzh5LWxpc3QtZmlsdGVycz5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW0gW3BsYWNlbWVudF09XCInbGVmdCdcIiBpdGVtQ2xhc3M9XCJuYXZiYXItZm9ybSBoaWRkZW4teHNcIj5cbiAgPGM4eS1saXN0LWRpc3BsYXktc3dpdGNoXG4gICAgKG9uTGlzdENsYXNzQ2hhbmdlKT1cImxpc3RDbGFzcyA9ICRldmVudFwiXG4gICAgW2xpc3RMZW5ndGhdPVwiKGZlYXR1cmVzJCB8IGFzeW5jKT8ubGVuZ3RoXCJcbiAgPjwvYzh5LWxpc3QtZGlzcGxheS1zd2l0Y2g+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxkaXYgKm5nSWY9XCIoZmVhdHVyZXMkIHwgYXN5bmMpPy5sZW5ndGggPT09IDBcIiBjbGFzcz1cImM4eS1lbXB0eS1zdGF0ZSB0ZXh0LWNlbnRlclwiPlxuICA8aDEgY2xhc3M9XCJjOHktaWNvbiBjOHktaWNvbi1tb2R1bGVzIGM4eS1pY29uLWR1b2NvbG9yXCI+PC9oMT5cbiAgPGgzIHRyYW5zbGF0ZT5ObyBmZWF0dXJlcyB0byBkaXNwbGF5LjwvaDM+XG4gIDxwIHRyYW5zbGF0ZT5ObyBhZGRpdGlvbmFsIGZlYXR1cmVzIGFyZSBzdWJzY3JpYmVkIHRvIHRoZSB0ZW5hbnQuPC9wPlxuPC9kaXY+XG5cbjxkaXYgW25nQ2xhc3NdPVwibGlzdENsYXNzXCIgY2xhc3M9XCJjYXJkLWdyb3VwXCI+XG4gIDxkaXYgY2xhc3M9XCJwYWdlLXN0aWNreS1oZWFkZXIgaGlkZGVuLXhzIGQtZmxleFwiICpuZ0lmPVwiKGZlYXR1cmVzJCB8IGFzeW5jKT8ubGVuZ3RoID4gMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrIGNhcmQtY29sdW1uLTQwXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1hcHBpY29uIHAtbC0zMiBwLXItMTYgbS1yLTAgbS1sLTRcIj48L2Rpdj5cbiAgICAgIHt7ICdGZWF0dXJlJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrIHAtMCBjYXJkLWNvbHVtbi04MFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYmxvY2sgY2FyZC1jb2x1bW4tODBcIj57eyAnRGVzY3JpcHRpb24nIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ibG9jayBjYXJkLWNvbHVtbi0yMFwiPnt7ICdUeXBlJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiAqbmdGb3I9XCJsZXQgZmVhdHVyZSBvZiBmaWx0ZXJlZEZlYXR1cmVzJCB8IGFzeW5jXCIgY2xhc3M9XCJjb2wteHMtMTIgY29sLXNtLTQgY29sLW1kLTNcIj5cbiAgICA8Yzh5LWFwcGxpY2F0aW9uLWNhcmRcbiAgICAgIFthcHBdPVwiZmVhdHVyZVwiXG4gICAgICBbY2FuRWRpdF09XCJmYWxzZVwiXG4gICAgICBjbGFzcz1cImQtY29udGVudHNcIlxuICAgID48L2M4eS1hcHBsaWNhdGlvbi1jYXJkPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48Yzh5LXVpLWVtcHR5LXN0YXRlXG4gICpuZ0lmPVwiKGZlYXR1cmVzJCB8IGFzeW5jKT8ubGVuZ3RoID4gMCAmJiAoZmlsdGVyZWRGZWF0dXJlcyQgfCBhc3luYyk/Lmxlbmd0aCA9PT0gMFwiXG4gIFtpY29uXT1cIidzZWFyY2gnXCJcbiAgW3RpdGxlXT1cIidObyBtYXRjaGluZyBmZWF0dXJlcy4nIHwgdHJhbnNsYXRlXCJcbiAgW3N1YnRpdGxlXT1cIidSZWZpbmUgeW91ciBzZWFyY2ggdGVybXMgYW5kL29yIHRoZSBmaWx0ZXJzJyB8IHRyYW5zbGF0ZVwiXG4+XG4gIDxidXR0b25cbiAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgdGl0bGU9XCJ7eyAnUmVzZXQgZmlsdGVycycgfCB0cmFuc2xhdGUgfX1cIlxuICAgIChjbGljayk9XCJyZXNldEZpbHRlcnMoKVwiXG4gID5cbiAgICB7eyAnUmVzZXQgZmlsdGVycycgfCB0cmFuc2xhdGUgfX1cbiAgPC9idXR0b24+XG48L2M4eS11aS1lbXB0eS1zdGF0ZT5cbiJdfQ==