@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
98 lines • 18.5 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { UserGroupService } from '@c8y/client';
import { GainsightService, Permissions } from '@c8y/ngx-components';
import { ALL_GLOBAL_ROLES_SELECTED, PRODUCT_EXPERIENCE } from './context-dashboard.model';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/client";
import * as i2 from "@c8y/ngx-components";
import * as i3 from "@angular/common";
import * as i4 from "ngx-bootstrap/popover";
export class DashboardAvailabilityComponent {
/**
* Ids of global roles assigned to the dashboard or a string "all" indicating the selection of all global roles.
* The value undefined is treated as equivalent to 'all'.
*/
get globalRolesIds() {
return this._globalRolesIds;
}
set globalRolesIds(ids) {
if (!ids || ids === ALL_GLOBAL_ROLES_SELECTED) {
this._globalRolesIds = ALL_GLOBAL_ROLES_SELECTED;
return;
}
this._globalRolesIds = [...ids];
}
constructor(userGroupService, gainsightService, permissions) {
this.userGroupService = userGroupService;
this.gainsightService = gainsightService;
this.permissions = permissions;
this.globalRolesIdsChange = new EventEmitter();
this.globalRolesItems = [];
this.globalRolesItemsSelected = [];
this.selectHidden = false;
this.globalRoles = [];
this.PAGE_SIZE = 100;
}
async ngOnInit() {
if (this.permissions.hasRole(Permissions.ROLE_USER_MANAGEMENT_READ)) {
this.globalRoles = await this.getGlobalRoles();
this.globalRolesItems = this.mapGlobalRolesToItems();
this.globalRolesItemsSelected = this.getSelectedGlobalRolesItems();
}
else {
this.selectHidden = true;
}
}
onSelected(items) {
if (!items || !Array.isArray(items)) {
return;
}
const allItemsSelected = items.length === this.globalRolesItems.length;
this.globalRolesItemsSelected = items;
if (allItemsSelected) {
this.globalRolesIdsChange.emit(ALL_GLOBAL_ROLES_SELECTED);
this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE.DASHBOARD.EVENTS.DASHBOARDS, {
component: PRODUCT_EXPERIENCE.DASHBOARD.COMPONENTS.DASHBOARD_AVAILABILITY,
action: PRODUCT_EXPERIENCE.DASHBOARD.ACTIONS.APPLY_GLOBAL_ROLES_CHANGES,
globalRoles: ALL_GLOBAL_ROLES_SELECTED
});
}
else {
const selectedGlobalRolesIds = items.map(i => i.id);
this.globalRolesIdsChange.emit([...selectedGlobalRolesIds]);
this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE.DASHBOARD.EVENTS.DASHBOARDS, {
component: PRODUCT_EXPERIENCE.DASHBOARD.COMPONENTS.DASHBOARD_AVAILABILITY,
action: PRODUCT_EXPERIENCE.DASHBOARD.ACTIONS.APPLY_GLOBAL_ROLES_CHANGES,
globalRoles: selectedGlobalRolesIds?.sort()?.join()
});
}
}
async getGlobalRoles() {
return (await this.userGroupService.list({ pageSize: this.PAGE_SIZE })).data;
}
mapGlobalRolesToItems() {
return this.globalRoles.map(({ name, id }) => ({
name,
id
}));
}
getSelectedGlobalRolesItems() {
if (!this.globalRolesIds || this.globalRolesIds === ALL_GLOBAL_ROLES_SELECTED) {
return this.globalRolesItems;
}
return this.globalRolesIds
.map(globalRoleId => this.globalRolesItems.find(gR => gR.id === globalRoleId))
.filter(Boolean);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DashboardAvailabilityComponent, deps: [{ token: i1.UserGroupService }, { token: i2.GainsightService }, { token: i2.Permissions }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DashboardAvailabilityComponent, selector: "c8y-dashboard-availability", inputs: { globalRolesIds: "globalRolesIds" }, outputs: { globalRolesIdsChange: "globalRolesIdsChange" }, ngImport: i0, template: "<fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend>{{ 'Availability`of dashboard based on permissions`' | translate }}</legend>\n <c8y-form-group>\n <label for=\"availability\">\n <span\n class=\"m-r-4\"\n id=\"availability\"\n >\n {{ 'Global roles' | translate }}\n </span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Select the global roles for which the dashboard will be available' | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </label>\n <c8y-select-legacy\n *ngIf=\"!selectHidden\"\n [items]=\"globalRolesItems\"\n [selected]=\"globalRolesItemsSelected\"\n (onChange)=\"onSelected($event)\"\n ></c8y-select-legacy>\n <p\n class=\"form-control-static\"\n *ngIf=\"selectHidden\"\n >\n {{ \"You don't have permission to change global roles.\" | translate }}\n </p>\n </c8y-form-group>\n</fieldset>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.SelectLegacyComponent, selector: "c8y-select-legacy", inputs: ["placeholder", "selectedLabel", "applyLabel", "items", "selected", "updateItems", "disableApplyOnNoSelection", "addDropdownContainerToBody"], outputs: ["onChange"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i4.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DashboardAvailabilityComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-dashboard-availability', template: "<fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend>{{ 'Availability`of dashboard based on permissions`' | translate }}</legend>\n <c8y-form-group>\n <label for=\"availability\">\n <span\n class=\"m-r-4\"\n id=\"availability\"\n >\n {{ 'Global roles' | translate }}\n </span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Select the global roles for which the dashboard will be available' | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </label>\n <c8y-select-legacy\n *ngIf=\"!selectHidden\"\n [items]=\"globalRolesItems\"\n [selected]=\"globalRolesItemsSelected\"\n (onChange)=\"onSelected($event)\"\n ></c8y-select-legacy>\n <p\n class=\"form-control-static\"\n *ngIf=\"selectHidden\"\n >\n {{ \"You don't have permission to change global roles.\" | translate }}\n </p>\n </c8y-form-group>\n</fieldset>\n" }]
}], ctorParameters: () => [{ type: i1.UserGroupService }, { type: i2.GainsightService }, { type: i2.Permissions }], propDecorators: { globalRolesIds: [{
type: Input
}], globalRolesIdsChange: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkLWF2YWlsYWJpbGl0eS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jb250ZXh0LWRhc2hib2FyZC9kYXNoYm9hcmQtYXZhaWxhYmlsaXR5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL2NvbnRleHQtZGFzaGJvYXJkL2Rhc2hib2FyZC1hdmFpbGFiaWxpdHkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQWMsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFRLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFFLE9BQU8sRUFFTCx5QkFBeUIsRUFDekIsa0JBQWtCLEVBQ25CLE1BQU0sMkJBQTJCLENBQUM7Ozs7OztBQU1uQyxNQUFNLE9BQU8sOEJBQThCO0lBQ3pDOzs7T0FHRztJQUNILElBQ0ksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUNELElBQUksY0FBYyxDQUFDLEdBQXlCO1FBQzFDLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLLHlCQUF5QixFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDLGVBQWUsR0FBRyx5QkFBeUIsQ0FBQztZQUNqRCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFTRCxZQUNVLGdCQUFrQyxFQUNsQyxnQkFBa0MsRUFDbEMsV0FBd0I7UUFGeEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FB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Q0FBQztJQUNOLENBQUM7SUFFTywyQkFBMkI7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyx5QkFBeUIsRUFBRSxDQUFDO1lBQzlFLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQy9CLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxjQUFjO2FBQ3ZCLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLFlBQVksQ0FBQyxDQUFDO2FBQzdFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQixDQUFDOytHQXJGVSw4QkFBOEI7bUdBQTlCLDhCQUE4QiwyS0NiM0MsMmxDQW9DQTs7NEZEdkJhLDhCQUE4QjtrQkFKMUMsU0FBUzsrQkFDRSw0QkFBNEI7OElBU2xDLGNBQWM7c0JBRGpCLEtBQUs7Z0JBV0ksb0JBQW9CO3NCQUE3QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSVVzZXJHcm91cCwgVXNlckdyb3VwU2VydmljZSB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEdhaW5zaWdodFNlcnZpY2UsIEl0ZW0sIFBlcm1pc3Npb25zIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQge1xuICBEYXNoYm9hcmRHbG9iYWxSb2xlcyxcbiAgQUxMX0dMT0JBTF9ST0xFU19TRUxFQ1RFRCxcbiAgUFJPRFVDVF9FWFBFUklFTkNFXG59IGZyb20gJy4vY29udGV4dC1kYXNoYm9hcmQubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktZGFzaGJvYXJkLWF2YWlsYWJpbGl0eScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXNoYm9hcmQtYXZhaWxhYmlsaXR5LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRBdmFpbGFiaWxpdHlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAvKipcbiAgICogSWRzIG9mIGdsb2JhbCByb2xlcyBhc3NpZ25lZCB0byB0aGUgZGFzaGJvYXJkIG9yIGEgc3RyaW5nIFwiYWxsXCIgaW5kaWNhdGluZyB0aGUgc2VsZWN0aW9uIG9mIGFsbCBnbG9iYWwgcm9sZXMuXG4gICAqIFRoZSB2YWx1ZSB1bmRlZmluZWQgaXMgdHJlYXRlZCBhcyBlcXVpdmFsZW50IHRvICdhbGwnLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGdsb2JhbFJvbGVzSWRzKCk6IERhc2hib2FyZEdsb2JhbFJvbGVzIHtcbiAgICByZXR1cm4gdGhpcy5fZ2xvYmFsUm9sZXNJZHM7XG4gIH1cbiAgc2V0IGdsb2JhbFJvbGVzSWRzKGlkczogRGFzaGJvYXJkR2xvYmFsUm9sZXMpIHtcbiAgICBpZiAoIWlkcyB8fCBpZHMgPT09IEFMTF9HTE9CQUxfUk9MRVNfU0VMRUNURUQpIHtcbiAgICAgIHRoaXMuX2dsb2JhbFJvbGVzSWRzID0gQUxMX0dMT0JBTF9ST0xFU19TRUxFQ1RFRDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fZ2xvYmFsUm9sZXNJZHMgPSBbLi4uaWRzXTtcbiAgfVxuICBAT3V0cHV0KCkgZ2xvYmFsUm9sZXNJZHNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhc2hib2FyZEdsb2JhbFJvbGVzPigpO1xuICBnbG9iYWxSb2xlc0l0ZW1zOiBJdGVtW10gPSBbXTtcbiAgZ2xvYmFsUm9sZXNJdGVtc1NlbGVjdGVkOiBJdGVtW10gPSBbXTtcbiAgc2VsZWN0SGlkZGVuID0gZmFsc2U7XG4gIHByaXZhdGUgZ2xvYmFsUm9sZXM6IElVc2VyR3JvdXBbXSA9IFtdO1xuICBwcml2YXRlIFBBR0VfU0laRSA9IDEwMDtcbiAgcHJpdmF0ZSBfZ2xvYmFsUm9sZXNJZHM6IERhc2hib2FyZEdsb2JhbFJvbGVzO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdXNlckdyb3VwU2VydmljZTogVXNlckdyb3VwU2VydmljZSxcbiAgICBwcml2YXRlIGdhaW5zaWdodFNlcnZpY2U6IEdhaW5zaWdodFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwZXJtaXNzaW9uczogUGVybWlzc2lvbnNcbiAgKSB7fVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLnBlcm1pc3Npb25zLmhhc1JvbGUoUGVybWlzc2lvbnMuUk9MRV9VU0VSX01BTkFHRU1FTlRfUkVBRCkpIHtcbiAgICAgIHRoaXMuZ2xvYmFsUm9sZXMgPSBhd2FpdCB0aGlzLmdldEdsb2JhbFJvbGVzKCk7XG4gICAgICB0aGlzLmdsb2JhbFJvbGVzSXRlbXMgPSB0aGlzLm1hcEdsb2JhbFJvbGVzVG9JdGVtcygpO1xuICAgICAgdGhpcy5nbG9iYWxSb2xlc0l0ZW1zU2VsZWN0ZWQgPSB0aGlzLmdldFNlbGVjdGVkR2xvYmFsUm9sZXNJdGVtcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdEhpZGRlbiA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgb25TZWxlY3RlZChpdGVtczogSXRlbVtdKSB7XG4gICAgaWYgKCFpdGVtcyB8fCAhQXJyYXkuaXNBcnJheShpdGVtcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxJdGVtc1NlbGVjdGVkID0gaXRlbXMubGVuZ3RoID09PSB0aGlzLmdsb2JhbFJvbGVzSXRlbXMubGVuZ3RoO1xuICAgIHRoaXMuZ2xvYmFsUm9sZXNJdGVtc1NlbGVjdGVkID0gaXRlbXM7XG5cbiAgICBpZiAoYWxsSXRlbXNTZWxlY3RlZCkge1xuICAgICAgdGhpcy5nbG9iYWxSb2xlc0lkc0NoYW5nZS5lbWl0KEFMTF9HTE9CQUxfUk9MRVNfU0VMRUNURUQpO1xuICAgICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLnRyaWdnZXJFdmVudChQUk9EVUNUX0VYUEVSSUVOQ0UuREFTSEJPQVJELkVWRU5UUy5EQVNIQk9BUkRTLCB7XG4gICAgICAgIGNvbXBvbmVudDogUFJPRFVDVF9FWFBFUklFTkNFLkRBU0hCT0FSRC5DT01QT05FTlRTLkRBU0hCT0FSRF9BVkFJTEFCSUxJVFksXG4gICAgICAgIGFjdGlvbjogUFJPRFVDVF9FWFBFUklFTkNFLkRBU0hCT0FSRC5BQ1RJT05TLkFQUExZX0dMT0JBTF9ST0xFU19DSEFOR0VTLFxuICAgICAgICBnbG9iYWxSb2xlczogQUxMX0dMT0JBTF9ST0xFU19TRUxFQ1RFRFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkR2xvYmFsUm9sZXNJZHMgPSBpdGVtcy5tYXAoaSA9PiBpLmlkKTtcbiAgICAgIHRoaXMuZ2xvYmFsUm9sZXNJZHNDaGFuZ2UuZW1pdChbLi4uc2VsZWN0ZWRHbG9iYWxSb2xlc0lkc10pO1xuXG4gICAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UudHJpZ2dlckV2ZW50KFBST0RVQ1RfRVhQRVJJRU5DRS5EQVNIQk9BUkQuRVZFTlRTLkRBU0hCT0FSRFMsIHtcbiAgICAgICAgY29tcG9uZW50OiBQUk9EVUNUX0VYUEVSSUVOQ0UuREFTSEJPQVJELkNPTVBPTkVOVFMuREFTSEJPQVJEX0FWQUlMQUJJTElUWSxcbiAgICAgICAgYWN0aW9uOiBQUk9EVUNUX0VYUEVSSUVOQ0UuREFTSEJPQVJELkFDVElPTlMuQVBQTFlfR0xPQkFMX1JPTEVTX0NIQU5HRVMsXG4gICAgICAgIGdsb2JhbFJvbGVzOiBzZWxlY3RlZEdsb2JhbFJvbGVzSWRzPy5zb3J0KCk/LmpvaW4oKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRHbG9iYWxSb2xlcygpIHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMudXNlckdyb3VwU2VydmljZS5saXN0KHsgcGFnZVNpemU6IHRoaXMuUEFHRV9TSVpFIH0pKS5kYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBHbG9iYWxSb2xlc1RvSXRlbXMoKTogSXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5nbG9iYWxSb2xlcy5tYXAoKHsgbmFtZSwgaWQgfSkgPT4gKHtcbiAgICAgIG5hbWUsXG4gICAgICBpZFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWRHbG9iYWxSb2xlc0l0ZW1zKCk6IEl0ZW1bXSB7XG4gICAgaWYgKCF0aGlzLmdsb2JhbFJvbGVzSWRzIHx8IHRoaXMuZ2xvYmFsUm9sZXNJZHMgPT09IEFMTF9HTE9CQUxfUk9MRVNfU0VMRUNURUQpIHtcbiAgICAgIHJldHVybiB0aGlzLmdsb2JhbFJvbGVzSXRlbXM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdsb2JhbFJvbGVzSWRzXG4gICAgICAubWFwKGdsb2JhbFJvbGVJZCA9PiB0aGlzLmdsb2JhbFJvbGVzSXRlbXMuZmluZChnUiA9PiBnUi5pZCA9PT0gZ2xvYmFsUm9sZUlkKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIH1cbn1cbiIsIjxmaWVsZHNldCBjbGFzcz1cImM4eS1maWVsZHNldCBjOHktZmllbGRzZXQtLWxnXCI+XG4gIDxsZWdlbmQ+e3sgJ0F2YWlsYWJpbGl0eWBvZiBkYXNoYm9hcmQgYmFzZWQgb24gcGVybWlzc2lvbnNgJyB8IHRyYW5zbGF0ZSB9fTwvbGVnZW5kPlxuICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgPGxhYmVsIGZvcj1cImF2YWlsYWJpbGl0eVwiPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJtLXItNFwiXG4gICAgICAgIGlkPVwiYXZhaWxhYmlsaXR5XCJcbiAgICAgID5cbiAgICAgICAge3sgJ0dsb2JhbCByb2xlcycgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4taGVscCBidG4taGVscC0tc21cIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIHBvcG92ZXI9XCJ7e1xuICAgICAgICAgICdTZWxlY3QgdGhlIGdsb2JhbCByb2xlcyBmb3Igd2hpY2ggdGhlIGRhc2hib2FyZCB3aWxsIGJlIGF2YWlsYWJsZScgfCB0cmFuc2xhdGVcbiAgICAgICAgfX1cIlxuICAgICAgICBwbGFjZW1lbnQ9XCJyaWdodFwiXG4gICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICA+PC9idXR0b24+XG4gICAgPC9sYWJlbD5cbiAgICA8Yzh5LXNlbGVjdC1sZWdhY3lcbiAgICAgICpuZ0lmPVwiIXNlbGVjdEhpZGRlblwiXG4gICAgICBbaXRlbXNdPVwiZ2xvYmFsUm9sZXNJdGVtc1wiXG4gICAgICBbc2VsZWN0ZWRdPVwiZ2xvYmFsUm9sZXNJdGVtc1NlbGVjdGVkXCJcbiAgICAgIChvbkNoYW5nZSk9XCJvblNlbGVjdGVkKCRldmVudClcIlxuICAgID48L2M4eS1zZWxlY3QtbGVnYWN5PlxuICAgIDxwXG4gICAgICBjbGFzcz1cImZvcm0tY29udHJvbC1zdGF0aWNcIlxuICAgICAgKm5nSWY9XCJzZWxlY3RIaWRkZW5cIlxuICAgID5cbiAgICAgIHt7IFwiWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBjaGFuZ2UgZ2xvYmFsIHJvbGVzLlwiIHwgdHJhbnNsYXRlIH19XG4gICAgPC9wPlxuICA8L2M4eS1mb3JtLWdyb3VwPlxuPC9maWVsZHNldD5cbiJdfQ==