UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

46 lines 19.1 kB
import { Component } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { ContextRouteService, gettext, PluginsService } from '@c8y/ngx-components'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; import * as i2 from "@c8y/ngx-components"; import * as i3 from "@angular/common"; import * as i4 from "./package-contents/packages-contents.component"; import * as i5 from "./package-versions-list/package-versions-list.component"; export class PackageVersionsComponent { constructor(activatedRoute, contextRouteService, pluginsService) { this.activatedRoute = activatedRoute; this.contextRouteService = contextRouteService; this.pluginsService = pluginsService; this.package = {}; this.packageContentsTitle = gettext('Version {{ selectedVersion }} package contents'); } async ngOnInit() { this.package = this.contextRouteService.getContextData(this.activatedRoute)?.contextData; } async showPluginOverview(plugin) { this.selectedPlugin = plugin; const baseUrl = `/apps/${plugin.id}/`; this.pluginBaseUrl = baseUrl; this.pluginMarkdown = await this.pluginsService.getReadmeFileContent(baseUrl); } closeOverview() { this.selectedPlugin = null; } clearSelectedVersion() { this.selectedVersion = null; } selectVersion(version) { if (this.selectedVersion !== version) { this.selectedVersion = version; this.closeOverview(); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PackageVersionsComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.ContextRouteService }, { token: i2.PluginsService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PackageVersionsComponent, selector: "c8y-package-versions", ngImport: i0, template: "<c8y-title>{{ package?.name | humanizeAppName | async }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-atom'\"\n [label]=\"'Ecosystem' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'big-parcel'\"\n [label]=\"'Extensions' | translate\"\n [path]=\"'ecosystem/extension/extensions'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"package?.name | humanizeAppName | async\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"'Versions' | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<div\n class=\"card content-fullpage d-grid\"\n [ngClass]=\"{ 'grid__col--6-6-0': !selectedPlugin, 'grid__col--0-6-6': !!selectedPlugin }\"\n>\n <c8y-package-versions-list\n class=\"d-contents\"\n (onVersionSelect)=\"selectVersion($event)\"\n ></c8y-package-versions-list>\n\n <!-- Package contents -->\n <div\n class=\"inner-scroll split-view__detail\"\n [ngClass]=\"{ 'split-view__detail--selected': selectedVersion }\"\n >\n <div class=\"large-padding card-header separator visible-sm visible-xs fit-w sticky-top\">\n <div class=\"d-flex a-i-center\">\n <button\n class=\"btn-clean text-primary m-r-8\"\n title=\"{{ 'Back' | translate }}\"\n (click)=\"clearSelectedVersion()\"\n >\n <i c8yIcon=\"chevron-left\"></i>\n <span translate>Back</span>\n </button>\n <div\n class=\"card-title\"\n translate\n >\n {{ packageContentsTitle | translate: { selectedVersion } }}\n </div>\n </div>\n </div>\n <div class=\"card-header large-padding separator sticky-top visible-md visible-lg\">\n <div class=\"card-title\">\n <ng-container *ngIf=\"selectedVersion\">\n {{ packageContentsTitle | translate: { selectedVersion } }}\n </ng-container>\n </div>\n </div>\n <div class=\"inner-scroll split-view__list\">\n <c8y-package-contents\n [selectedVersion]=\"selectedVersion\"\n [selectedPlugin]=\"selectedPlugin\"\n (showOverview)=\"showPluginOverview($event)\"\n ></c8y-package-contents>\n </div>\n </div>\n\n <!-- Plugin readme -->\n <div\n class=\"inner-scroll split-view__detail\"\n [ngClass]=\"{ 'split-view__detail--selected': selectedPlugin }\"\n >\n <div\n class=\"card-header separator sticky-top\"\n *ngIf=\"selectedPlugin\"\n >\n <button\n class=\"btn-clean\"\n (click)=\"closeOverview()\"\n >\n <i c8yIcon=\"caret-back\"></i>\n {{ 'Back to package versions overview ' | translate }}\n </button>\n </div>\n <div\n class=\"card-block p-l-16 p-r-16 overflow-visible\"\n *ngIf=\"selectedPlugin\"\n >\n <div\n class=\"markdown-content\"\n *ngIf=\"pluginMarkdown\"\n [innerHTML]=\"pluginMarkdown | markdownToHtml: { baseUrl: pluginBaseUrl } | async\"\n ></div>\n <c8y-ui-empty-state\n [icon]=\"'user-manual'\"\n [title]=\"'No README.md found for plugin' | translate\"\n [subtitle]=\"\n 'To view the contents of &quot;README&quot;, add the file &quot;README.md&quot; to the plugin.'\n | translate\n \"\n *ngIf=\"!pluginMarkdown\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n </div>\n</div>\n", dependencies: [{ 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.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "component", type: i4.PackageContentsComponent, selector: "c8y-package-contents", inputs: ["selectedVersion", "selectedPlugin"], outputs: ["showOverview"] }, { kind: "component", type: i5.PackageVersionsListComponent, selector: "c8y-package-versions-list", outputs: ["onVersionSelect"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.HumanizeAppNamePipe, name: "humanizeAppName" }, { kind: "pipe", type: i2.MarkdownToHtmlPipe, name: "markdownToHtml" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PackageVersionsComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-package-versions', template: "<c8y-title>{{ package?.name | humanizeAppName | async }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-atom'\"\n [label]=\"'Ecosystem' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'big-parcel'\"\n [label]=\"'Extensions' | translate\"\n [path]=\"'ecosystem/extension/extensions'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"package?.name | humanizeAppName | async\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"'Versions' | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<div\n class=\"card content-fullpage d-grid\"\n [ngClass]=\"{ 'grid__col--6-6-0': !selectedPlugin, 'grid__col--0-6-6': !!selectedPlugin }\"\n>\n <c8y-package-versions-list\n class=\"d-contents\"\n (onVersionSelect)=\"selectVersion($event)\"\n ></c8y-package-versions-list>\n\n <!-- Package contents -->\n <div\n class=\"inner-scroll split-view__detail\"\n [ngClass]=\"{ 'split-view__detail--selected': selectedVersion }\"\n >\n <div class=\"large-padding card-header separator visible-sm visible-xs fit-w sticky-top\">\n <div class=\"d-flex a-i-center\">\n <button\n class=\"btn-clean text-primary m-r-8\"\n title=\"{{ 'Back' | translate }}\"\n (click)=\"clearSelectedVersion()\"\n >\n <i c8yIcon=\"chevron-left\"></i>\n <span translate>Back</span>\n </button>\n <div\n class=\"card-title\"\n translate\n >\n {{ packageContentsTitle | translate: { selectedVersion } }}\n </div>\n </div>\n </div>\n <div class=\"card-header large-padding separator sticky-top visible-md visible-lg\">\n <div class=\"card-title\">\n <ng-container *ngIf=\"selectedVersion\">\n {{ packageContentsTitle | translate: { selectedVersion } }}\n </ng-container>\n </div>\n </div>\n <div class=\"inner-scroll split-view__list\">\n <c8y-package-contents\n [selectedVersion]=\"selectedVersion\"\n [selectedPlugin]=\"selectedPlugin\"\n (showOverview)=\"showPluginOverview($event)\"\n ></c8y-package-contents>\n </div>\n </div>\n\n <!-- Plugin readme -->\n <div\n class=\"inner-scroll split-view__detail\"\n [ngClass]=\"{ 'split-view__detail--selected': selectedPlugin }\"\n >\n <div\n class=\"card-header separator sticky-top\"\n *ngIf=\"selectedPlugin\"\n >\n <button\n class=\"btn-clean\"\n (click)=\"closeOverview()\"\n >\n <i c8yIcon=\"caret-back\"></i>\n {{ 'Back to package versions overview ' | translate }}\n </button>\n </div>\n <div\n class=\"card-block p-l-16 p-r-16 overflow-visible\"\n *ngIf=\"selectedPlugin\"\n >\n <div\n class=\"markdown-content\"\n *ngIf=\"pluginMarkdown\"\n [innerHTML]=\"pluginMarkdown | markdownToHtml: { baseUrl: pluginBaseUrl } | async\"\n ></div>\n <c8y-ui-empty-state\n [icon]=\"'user-manual'\"\n [title]=\"'No README.md found for plugin' | translate\"\n [subtitle]=\"\n 'To view the contents of &quot;README&quot;, add the file &quot;README.md&quot; to the plugin.'\n | translate\n \"\n *ngIf=\"!pluginMarkdown\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n </div>\n</div>\n" }] }], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.ContextRouteService }, { type: i2.PluginsService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZXMtdmVyc2lvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vZWNvc3lzdGVtL3BhY2thZ2VzL3BhY2thZ2UtdmVyc2lvbnMvcGFja2FnZXMtdmVyc2lvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vZWNvc3lzdGVtL3BhY2thZ2VzL3BhY2thZ2UtdmVyc2lvbnMvcGFja2FnZXMtdmVyc2lvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFakQsT0FBTyxFQUVMLG1CQUFtQixFQUNuQixPQUFPLEVBQ1AsY0FBYyxFQUNmLE1BQU0scUJBQXFCLENBQUM7Ozs7Ozs7QUFNN0IsTUFBTSxPQUFPLHdCQUF3QjtJQVFuQyxZQUNVLGNBQThCLEVBQzlCLG1CQUF3QyxFQUN4QyxjQUE4QjtRQUY5QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFWeEMsWUFBTyxHQUFpQixFQUFFLENBQUM7UUFLM0IseUJBQW9CLEdBQUcsT0FBTyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFNOUUsQ0FBQztJQUVKLEtBQUssQ0FBQyxRQUFRO1FBQ1osSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxXQUFXLENBQUM7SUFDM0YsQ0FBQztJQUVELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUF5QjtRQUNoRCxJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQztRQUM3QixNQUFNLE9BQU8sR0FBRyxTQUFTLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQztRQUN0QyxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQztRQUM3QixJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFFRCxvQkFBb0I7UUFDbEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7SUFDOUIsQ0FBQztJQUVELGFBQWEsQ0FBQyxPQUFlO1FBQzNCLElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQztZQUMvQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUM7K0dBdENVLHdCQUF3QjttR0FBeEIsd0JBQXdCLDREQ2RyQyw0MEdBdUdBOzs0RkR6RmEsd0JBQXdCO2tCQUpwQyxTQUFTOytCQUNFLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgSUFwcGxpY2F0aW9uIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgQXBwbGljYXRpb25QbHVnaW4sXG4gIENvbnRleHRSb3V0ZVNlcnZpY2UsXG4gIGdldHRleHQsXG4gIFBsdWdpbnNTZXJ2aWNlXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktcGFja2FnZS12ZXJzaW9ucycsXG4gIHRlbXBsYXRlVXJsOiAnLi9wYWNrYWdlcy12ZXJzaW9ucy5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgUGFja2FnZVZlcnNpb25zQ29tcG9uZW50IHtcbiAgcGFja2FnZTogSUFwcGxpY2F0aW9uID0ge307XG4gIHNlbGVjdGVkVmVyc2lvbjogc3RyaW5nO1xuICBzZWxlY3RlZFBsdWdpbjogQXBwbGljYXRpb25QbHVnaW47XG4gIHBsdWdpbkJhc2VVcmw6IHN0cmluZztcbiAgcGx1Z2luTWFya2Rvd246IHN0cmluZztcbiAgcGFja2FnZUNvbnRlbnRzVGl0bGUgPSBnZXR0ZXh0KCdWZXJzaW9uIHt7IHNlbGVjdGVkVmVyc2lvbiB9fSBwYWNrYWdlIGNvbnRlbnRzJyk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBjb250ZXh0Um91dGVTZXJ2aWNlOiBDb250ZXh0Um91dGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcGx1Z2luc1NlcnZpY2U6IFBsdWdpbnNTZXJ2aWNlXG4gICkge31cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnBhY2thZ2UgPSB0aGlzLmNvbnRleHRSb3V0ZVNlcnZpY2UuZ2V0Q29udGV4dERhdGEodGhpcy5hY3RpdmF0ZWRSb3V0ZSk/LmNvbnRleHREYXRhO1xuICB9XG5cbiAgYXN5bmMgc2hvd1BsdWdpbk92ZXJ2aWV3KHBsdWdpbjogQXBwbGljYXRpb25QbHVnaW4pIHtcbiAgICB0aGlzLnNlbGVjdGVkUGx1Z2luID0gcGx1Z2luO1xuICAgIGNvbnN0IGJhc2VVcmwgPSBgL2FwcHMvJHtwbHVnaW4uaWR9L2A7XG4gICAgdGhpcy5wbHVnaW5CYXNlVXJsID0gYmFzZVVybDtcbiAgICB0aGlzLnBsdWdpbk1hcmtkb3duID0gYXdhaXQgdGhpcy5wbHVnaW5zU2VydmljZS5nZXRSZWFkbWVGaWxlQ29udGVudChiYXNlVXJsKTtcbiAgfVxuXG4gIGNsb3NlT3ZlcnZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZFBsdWdpbiA9IG51bGw7XG4gIH1cblxuICBjbGVhclNlbGVjdGVkVmVyc2lvbigpIHtcbiAgICB0aGlzLnNlbGVjdGVkVmVyc2lvbiA9IG51bGw7XG4gIH1cblxuICBzZWxlY3RWZXJzaW9uKHZlcnNpb246IHN0cmluZykge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkVmVyc2lvbiAhPT0gdmVyc2lvbikge1xuICAgICAgdGhpcy5zZWxlY3RlZFZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgdGhpcy5jbG9zZU92ZXJ2aWV3KCk7XG4gICAgfVxuICB9XG59XG4iLCI8Yzh5LXRpdGxlPnt7IHBhY2thZ2U/Lm5hbWUgfCBodW1hbml6ZUFwcE5hbWUgfCBhc3luYyB9fTwvYzh5LXRpdGxlPlxuXG48Yzh5LWJyZWFkY3J1bWI+XG4gIDxjOHktYnJlYWRjcnVtYi1pdGVtXG4gICAgW2ljb25dPVwiJ2M4eS1hdG9tJ1wiXG4gICAgW2xhYmVsXT1cIidFY29zeXN0ZW0nIHwgdHJhbnNsYXRlXCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW1cbiAgICBbaWNvbl09XCInYmlnLXBhcmNlbCdcIlxuICAgIFtsYWJlbF09XCInRXh0ZW5zaW9ucycgfCB0cmFuc2xhdGVcIlxuICAgIFtwYXRoXT1cIidlY29zeXN0ZW0vZXh0ZW5zaW9uL2V4dGVuc2lvbnMnXCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW0gW2xhYmVsXT1cInBhY2thZ2U/Lm5hbWUgfCBodW1hbml6ZUFwcE5hbWUgfCBhc3luY1wiPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW0gW2xhYmVsXT1cIidWZXJzaW9ucycgfCB0cmFuc2xhdGVcIj48L2M4eS1icmVhZGNydW1iLWl0ZW0+XG48L2M4eS1icmVhZGNydW1iPlxuXG48ZGl2XG4gIGNsYXNzPVwiY2FyZCBjb250ZW50LWZ1bGxwYWdlIGQtZ3JpZFwiXG4gIFtuZ0NsYXNzXT1cInsgJ2dyaWRfX2NvbC0tNi02LTAnOiAhc2VsZWN0ZWRQbHVnaW4sICdncmlkX19jb2wtLTAtNi02JzogISFzZWxlY3RlZFBsdWdpbiB9XCJcbj5cbiAgPGM4eS1wYWNrYWdlLXZlcnNpb25zLWxpc3RcbiAgICBjbGFzcz1cImQtY29udGVudHNcIlxuICAgIChvblZlcnNpb25TZWxlY3QpPVwic2VsZWN0VmVyc2lvbigkZXZlbnQpXCJcbiAgPjwvYzh5LXBhY2thZ2UtdmVyc2lvbnMtbGlzdD5cblxuICA8IS0tIFBhY2thZ2UgY29udGVudHMgLS0+XG4gIDxkaXZcbiAgICBjbGFzcz1cImlubmVyLXNjcm9sbCBzcGxpdC12aWV3X19kZXRhaWxcIlxuICAgIFtuZ0NsYXNzXT1cInsgJ3NwbGl0LXZpZXdfX2RldGFpbC0tc2VsZWN0ZWQnOiBzZWxlY3RlZFZlcnNpb24gfVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwibGFyZ2UtcGFkZGluZyBjYXJkLWhlYWRlciBzZXBhcmF0b3IgdmlzaWJsZS1zbSB2aXNpYmxlLXhzIGZpdC13IHN0aWNreS10b3BcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYS1pLWNlbnRlclwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJidG4tY2xlYW4gdGV4dC1wcmltYXJ5IG0tci04XCJcbiAgICAgICAgICB0aXRsZT1cInt7ICdCYWNrJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgKGNsaWNrKT1cImNsZWFyU2VsZWN0ZWRWZXJzaW9uKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPGkgYzh5SWNvbj1cImNoZXZyb24tbGVmdFwiPjwvaT5cbiAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+QmFjazwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImNhcmQtdGl0bGVcIlxuICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICA+XG4gICAgICAgICAge3sgcGFja2FnZUNvbnRlbnRzVGl0bGUgfCB0cmFuc2xhdGU6IHsgc2VsZWN0ZWRWZXJzaW9uIH0gfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgbGFyZ2UtcGFkZGluZyBzZXBhcmF0b3Igc3RpY2t5LXRvcCB2aXNpYmxlLW1kIHZpc2libGUtbGdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRpdGxlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFZlcnNpb25cIj5cbiAgICAgICAgICB7eyBwYWNrYWdlQ29udGVudHNUaXRsZSB8IHRyYW5zbGF0ZTogeyBzZWxlY3RlZFZlcnNpb24gfSB9fVxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJpbm5lci1zY3JvbGwgc3BsaXQtdmlld19fbGlzdFwiPlxuICAgICAgPGM4eS1wYWNrYWdlLWNvbnRlbnRzXG4gICAgICAgIFtzZWxlY3RlZFZlcnNpb25dPVwic2VsZWN0ZWRWZXJzaW9uXCJcbiAgICAgICAgW3NlbGVjdGVkUGx1Z2luXT1cInNlbGVjdGVkUGx1Z2luXCJcbiAgICAgICAgKHNob3dPdmVydmlldyk9XCJzaG93UGx1Z2luT3ZlcnZpZXcoJGV2ZW50KVwiXG4gICAgICA+PC9jOHktcGFja2FnZS1jb250ZW50cz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBQbHVnaW4gcmVhZG1lIC0tPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJpbm5lci1zY3JvbGwgc3BsaXQtdmlld19fZGV0YWlsXCJcbiAgICBbbmdDbGFzc109XCJ7ICdzcGxpdC12aWV3X19kZXRhaWwtLXNlbGVjdGVkJzogc2VsZWN0ZWRQbHVnaW4gfVwiXG4gID5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImNhcmQtaGVhZGVyIHNlcGFyYXRvciBzdGlja3ktdG9wXCJcbiAgICAgICpuZ0lmPVwic2VsZWN0ZWRQbHVnaW5cIlxuICAgID5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4tY2xlYW5cIlxuICAgICAgICAoY2xpY2spPVwiY2xvc2VPdmVydmlldygpXCJcbiAgICAgID5cbiAgICAgICAgPGkgYzh5SWNvbj1cImNhcmV0LWJhY2tcIj48L2k+XG4gICAgICAgIHt7ICdCYWNrIHRvIHBhY2thZ2UgdmVyc2lvbnMgb3ZlcnZpZXcgJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJjYXJkLWJsb2NrIHAtbC0xNiBwLXItMTYgb3ZlcmZsb3ctdmlzaWJsZVwiXG4gICAgICAqbmdJZj1cInNlbGVjdGVkUGx1Z2luXCJcbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwibWFya2Rvd24tY29udGVudFwiXG4gICAgICAgICpuZ0lmPVwicGx1Z2luTWFya2Rvd25cIlxuICAgICAgICBbaW5uZXJIVE1MXT1cInBsdWdpbk1hcmtkb3duIHwgbWFya2Rvd25Ub0h0bWw6IHsgYmFzZVVybDogcGx1Z2luQmFzZVVybCB9IHwgYXN5bmNcIlxuICAgICAgPjwvZGl2PlxuICAgICAgPGM4eS11aS1lbXB0eS1zdGF0ZVxuICAgICAgICBbaWNvbl09XCIndXNlci1tYW51YWwnXCJcbiAgICAgICAgW3RpdGxlXT1cIidObyBSRUFETUUubWQgZm91bmQgZm9yIHBsdWdpbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbc3VidGl0bGVdPVwiXG4gICAgICAgICAgJ1RvIHZpZXcgdGhlIGNvbnRlbnRzIG9mICZxdW90O1JFQURNRSZxdW90OywgYWRkIHRoZSBmaWxlICZxdW90O1JFQURNRS5tZCZxdW90OyB0byB0aGUgcGx1Z2luLidcbiAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgIFwiXG4gICAgICAgICpuZ0lmPVwiIXBsdWdpbk1hcmtkb3duXCJcbiAgICAgICAgW2hvcml6b250YWxdPVwidHJ1ZVwiXG4gICAgICA+PC9jOHktdWktZW1wdHktc3RhdGU+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=