@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
93 lines • 16.2 kB
JavaScript
import { Component, Input, Output, EventEmitter, HostListener } from '@angular/core';
import { AlertService, gettext } from '@c8y/ngx-components';
import { InventoryService } from '@c8y/client';
import { SubAssetsService } from '../sub-assets.service';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/ngx-components";
import * as i2 from "../sub-assets.service";
import * as i3 from "@c8y/client";
import * as i4 from "@angular/common";
import * as i5 from "../sub-assets-grid.component";
export class AssignChildDevicesComponent {
constructor(alert, subAssetsService, inventoryService) {
this.alert = alert;
this.subAssetsService = subAssetsService;
this.inventoryService = inventoryService;
this.onCancel = new EventEmitter();
this.onSelectedDevices = new EventEmitter();
this.refresh = new EventEmitter();
this.onlySelect = false; // if true, devices are only selected, not assigned
this.selected = [];
this.canAssignDevice = false;
this.pendingStatus = false;
}
onEnterKeyDown(_event) {
if (this.selected.length > 0) {
this.assignDevices();
}
}
onEscapeKeyDown(_event) {
this.onCancel.emit();
}
async ngOnInit() {
this.setNotIncludedInGroupQuery();
this.canAssignDevice = await this.subAssetsService.canAssignDevice({
id: this.currentGroupId
});
}
setNotIncludedInGroupQuery() {
const notIncludedInGroupQuery = { __not: { __bygroupid: this.currentGroupId } };
this.baseQuery = notIncludedInGroupQuery;
}
async assignDevices() {
if (this.canAssignDevice === false) {
return;
}
if (this.onlySelect) {
this.onSelectedDevices.emit(this.selected);
this.alert.success(gettext('Child devices selected.'));
this.onCancel.emit();
return;
}
this.pendingStatus = true;
try {
await this.inventoryService.childAssetsBulkAdd(this.selected, this.currentGroupId);
this.refresh.emit();
this.alert.success(gettext('Child devices assigned.'));
}
catch (error) {
this.alert.danger(gettext('Could not assign child devices.'), error);
}
this.pendingStatus = false;
this.selected = [];
this.onCancel.emit();
}
onSelected(selectedDevicesIDs) {
this.selected = selectedDevicesIDs;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AssignChildDevicesComponent, deps: [{ token: i1.AlertService }, { token: i2.SubAssetsService }, { token: i3.InventoryService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AssignChildDevicesComponent, selector: "c8y-assign-child-devices", inputs: { currentGroupId: "currentGroupId", parentDevice: "parentDevice", refresh: "refresh", onlySelect: "onlySelect" }, outputs: { onCancel: "onCancel", onSelectedDevices: "onSelectedDevices" }, host: { listeners: { "document:keydown.enter": "onEnterKeyDown($event)", "document:keydown.escape": "onEscapeKeyDown($event)" } }, ngImport: i0, template: "<div class=\"card-block flex-no-shrink separator-bottom col-xs-12 large-padding p-t-24 p-b-24\">\n <div class=\"row\">\n <div class=\"col-md-6 col-md-offset-3 col-lg-4 col-lg-offset-4\">\n <h4 class=\"text-center text-medium\">\n {{ 'Assign child devices' | translate }}\n </h4>\n </div>\n </div>\n</div>\n\n<c8y-sub-assets-grid\n [title]=\"''\"\n [emptyStateText]=\"'All child devices are already assigned' | translate\"\n [refresh]=\"refresh\"\n [actionControls]=\"[]\"\n [columnsConfigKey]=\"'assign-child-devices'\"\n [selectable]=\"true\"\n [parent-group]=\"parentDevice\"\n [baseQuery]=\"baseQuery\"\n (itemsSelect)=\"onSelected($event)\"\n class=\"d-contents\"\n></c8y-sub-assets-grid>\n\n<div class=\"text-center card-footer p-24 separator\">\n <button\n (click)=\"onCancel.emit()\"\n type=\"button\"\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n >\n <span>{{ 'Cancel' | translate }}</span>\n </button>\n <button\n (click)=\"assignDevices()\"\n type=\"button\"\n class=\"btn btn-primary\"\n [ngClass]=\"{ 'btn-pending': pendingStatus }\"\n title=\"{{ 'Assign' | translate }}\"\n [disabled]=\"selected.length === 0 || !canAssignDevice\"\n >\n <span>{{ 'Assign' | translate }}</span>\n </button>\n</div>\n", dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i5.SubAssetsGridComponent, selector: "c8y-sub-assets-grid", inputs: ["parent-group", "refresh", "title", "emptyStateText", "loadingItemsLabel", "columnsConfigKey", "columns", "pagination", "actionControls", "selectable", "baseQuery", "bulkActionControls", "filterable", "sortable", "displayOptions"], outputs: ["onColumnsChange", "itemsSelect"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AssignChildDevicesComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-assign-child-devices', template: "<div class=\"card-block flex-no-shrink separator-bottom col-xs-12 large-padding p-t-24 p-b-24\">\n <div class=\"row\">\n <div class=\"col-md-6 col-md-offset-3 col-lg-4 col-lg-offset-4\">\n <h4 class=\"text-center text-medium\">\n {{ 'Assign child devices' | translate }}\n </h4>\n </div>\n </div>\n</div>\n\n<c8y-sub-assets-grid\n [title]=\"''\"\n [emptyStateText]=\"'All child devices are already assigned' | translate\"\n [refresh]=\"refresh\"\n [actionControls]=\"[]\"\n [columnsConfigKey]=\"'assign-child-devices'\"\n [selectable]=\"true\"\n [parent-group]=\"parentDevice\"\n [baseQuery]=\"baseQuery\"\n (itemsSelect)=\"onSelected($event)\"\n class=\"d-contents\"\n></c8y-sub-assets-grid>\n\n<div class=\"text-center card-footer p-24 separator\">\n <button\n (click)=\"onCancel.emit()\"\n type=\"button\"\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n >\n <span>{{ 'Cancel' | translate }}</span>\n </button>\n <button\n (click)=\"assignDevices()\"\n type=\"button\"\n class=\"btn btn-primary\"\n [ngClass]=\"{ 'btn-pending': pendingStatus }\"\n title=\"{{ 'Assign' | translate }}\"\n [disabled]=\"selected.length === 0 || !canAssignDevice\"\n >\n <span>{{ 'Assign' | translate }}</span>\n </button>\n</div>\n" }]
}], ctorParameters: () => [{ type: i1.AlertService }, { type: i2.SubAssetsService }, { type: i3.InventoryService }], propDecorators: { currentGroupId: [{
type: Input
}], parentDevice: [{
type: Input
}], onCancel: [{
type: Output
}], onSelectedDevices: [{
type: Output
}], refresh: [{
type: Input
}], onlySelect: [{
type: Input
}], onEnterKeyDown: [{
type: HostListener,
args: ['document:keydown.enter', ['$event']]
}], onEscapeKeyDown: [{
type: HostListener,
args: ['document:keydown.escape', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzaWduLWNoaWxkLWRldmljZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3ViLWFzc2V0cy9hc3NpZ24tZGV2aWNlcy9hc3NpZ24tY2hpbGQtZGV2aWNlcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zdWItYXNzZXRzL2Fzc2lnbi1kZXZpY2VzL2Fzc2lnbi1jaGlsZC1kZXZpY2VzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7O0FBT3pELE1BQU0sT0FBTywyQkFBMkI7SUFhdEMsWUFDVSxLQUFtQixFQUNuQixnQkFBa0MsRUFDbEMsZ0JBQWtDO1FBRmxDLFVBQUssR0FBTCxLQUFLLENBQWM7UUFDbkIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBYmxDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ25DLHNCQUFpQixHQUFHLElBQUksWUFBWSxFQUFZLENBQUM7UUFDbEQsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDbEMsZUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLG1EQUFtRDtRQUVoRixhQUFRLEdBQWEsRUFBRSxDQUFDO1FBRXhCLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO0lBTW5CLENBQUM7SUFFZ0QsY0FBYyxDQUFDLE1BQXFCO1FBQ3RGLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO0lBRW9ELGVBQWUsQ0FBQyxNQUFxQjtRQUN4RixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUTtRQUNaLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDO1lBQ2pFLEVBQUUsRUFBRSxJQUFJLENBQUMsY0FBYztTQUNOLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQsMEJBQTBCO1FBQ3hCLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7UUFDaEYsSUFBSSxDQUFDLFNBQVMsR0FBRyx1QkFBdUIsQ0FBQztJQUMzQyxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWE7UUFDakIsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ25DLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3JCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFFMUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDbkYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGlDQUFpQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELFVBQVUsQ0FBQyxrQkFBNEI7UUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQztJQUNyQyxDQUFDOytHQXBFVSwyQkFBMkI7bUdBQTNCLDJCQUEyQix3WUNWeEMsaXlDQTJDQTs7NEZEakNhLDJCQUEyQjtrQkFKdkMsU0FBUzsrQkFDRSwwQkFBMEI7K0lBSTNCLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRSxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFhOEMsY0FBYztzQkFBakUsWUFBWTt1QkFBQyx3QkFBd0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFNRyxlQUFlO3NCQUFuRSxZQUFZO3VCQUFDLHlCQUF5QixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlLCBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBJbnZlbnRvcnlTZXJ2aWNlIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgU3ViQXNzZXRzU2VydmljZSB9IGZyb20gJy4uL3N1Yi1hc3NldHMuc2VydmljZSc7XG5pbXBvcnQgeyBJTWFuYWdlZE9iamVjdCB9IGZyb20gJ0BjOHkvY2xpZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWFzc2lnbi1jaGlsZC1kZXZpY2VzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Fzc2lnbi1jaGlsZC1kZXZpY2VzLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBBc3NpZ25DaGlsZERldmljZXNDb21wb25lbnQge1xuICBASW5wdXQoKSBjdXJyZW50R3JvdXBJZDogc3RyaW5nO1xuICBASW5wdXQoKSBwYXJlbnREZXZpY2U6IElNYW5hZ2VkT2JqZWN0O1xuICBAT3V0cHV0KCkgb25DYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9uU2VsZWN0ZWREZXZpY2VzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmdbXT4oKTtcbiAgQElucHV0KCkgcmVmcmVzaCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBASW5wdXQoKSBvbmx5U2VsZWN0ID0gZmFsc2U7IC8vIGlmIHRydWUsIGRldmljZXMgYXJlIG9ubHkgc2VsZWN0ZWQsIG5vdCBhc3NpZ25lZFxuXG4gIHNlbGVjdGVkOiBzdHJpbmdbXSA9IFtdO1xuICBiYXNlUXVlcnk6IGFueTtcbiAgY2FuQXNzaWduRGV2aWNlID0gZmFsc2U7XG4gIHBlbmRpbmdTdGF0dXMgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFsZXJ0OiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdWJBc3NldHNTZXJ2aWNlOiBTdWJBc3NldHNTZXJ2aWNlLFxuICAgIHByaXZhdGUgaW52ZW50b3J5U2VydmljZTogSW52ZW50b3J5U2VydmljZVxuICApIHt9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bi5lbnRlcicsIFsnJGV2ZW50J10pIG9uRW50ZXJLZXlEb3duKF9ldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuYXNzaWduRGV2aWNlcygpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJywgWyckZXZlbnQnXSkgb25Fc2NhcGVLZXlEb3duKF9ldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIHRoaXMub25DYW5jZWwuZW1pdCgpO1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zZXROb3RJbmNsdWRlZEluR3JvdXBRdWVyeSgpO1xuICAgIHRoaXMuY2FuQXNzaWduRGV2aWNlID0gYXdhaXQgdGhpcy5zdWJBc3NldHNTZXJ2aWNlLmNhbkFzc2lnbkRldmljZSh7XG4gICAgICBpZDogdGhpcy5jdXJyZW50R3JvdXBJZFxuICAgIH0gYXMgSU1hbmFnZWRPYmplY3QpO1xuICB9XG5cbiAgc2V0Tm90SW5jbHVkZWRJbkdyb3VwUXVlcnkoKSB7XG4gICAgY29uc3Qgbm90SW5jbHVkZWRJbkdyb3VwUXVlcnkgPSB7IF9fbm90OiB7IF9fYnlncm91cGlkOiB0aGlzLmN1cnJlbnRHcm91cElkIH0gfTtcbiAgICB0aGlzLmJhc2VRdWVyeSA9IG5vdEluY2x1ZGVkSW5Hcm91cFF1ZXJ5O1xuICB9XG5cbiAgYXN5bmMgYXNzaWduRGV2aWNlcygpIHtcbiAgICBpZiAodGhpcy5jYW5Bc3NpZ25EZXZpY2UgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm9ubHlTZWxlY3QpIHtcbiAgICAgIHRoaXMub25TZWxlY3RlZERldmljZXMuZW1pdCh0aGlzLnNlbGVjdGVkKTtcbiAgICAgIHRoaXMuYWxlcnQuc3VjY2VzcyhnZXR0ZXh0KCdDaGlsZCBkZXZpY2VzIHNlbGVjdGVkLicpKTtcbiAgICAgIHRoaXMub25DYW5jZWwuZW1pdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ1N0YXR1cyA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5pbnZlbnRvcnlTZXJ2aWNlLmNoaWxkQXNzZXRzQnVsa0FkZCh0aGlzLnNlbGVjdGVkLCB0aGlzLmN1cnJlbnRHcm91cElkKTtcbiAgICAgIHRoaXMucmVmcmVzaC5lbWl0KCk7XG4gICAgICB0aGlzLmFsZXJ0LnN1Y2Nlc3MoZ2V0dGV4dCgnQ2hpbGQgZGV2aWNlcyBhc3NpZ25lZC4nKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuYWxlcnQuZGFuZ2VyKGdldHRleHQoJ0NvdWxkIG5vdCBhc3NpZ24gY2hpbGQgZGV2aWNlcy4nKSwgZXJyb3IpO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmdTdGF0dXMgPSBmYWxzZTtcbiAgICB0aGlzLnNlbGVjdGVkID0gW107XG4gICAgdGhpcy5vbkNhbmNlbC5lbWl0KCk7XG4gIH1cblxuICBvblNlbGVjdGVkKHNlbGVjdGVkRGV2aWNlc0lEczogc3RyaW5nW10pIHtcbiAgICB0aGlzLnNlbGVjdGVkID0gc2VsZWN0ZWREZXZpY2VzSURzO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY2FyZC1ibG9jayBmbGV4LW5vLXNocmluayBzZXBhcmF0b3ItYm90dG9tIGNvbC14cy0xMiBsYXJnZS1wYWRkaW5nIHAtdC0yNCBwLWItMjRcIj5cbiAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiBjb2wtbWQtb2Zmc2V0LTMgY29sLWxnLTQgY29sLWxnLW9mZnNldC00XCI+XG4gICAgICA8aDQgY2xhc3M9XCJ0ZXh0LWNlbnRlciB0ZXh0LW1lZGl1bVwiPlxuICAgICAgICB7eyAnQXNzaWduIGNoaWxkIGRldmljZXMnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2g0PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48Yzh5LXN1Yi1hc3NldHMtZ3JpZFxuICBbdGl0bGVdPVwiJydcIlxuICBbZW1wdHlTdGF0ZVRleHRdPVwiJ0FsbCBjaGlsZCBkZXZpY2VzIGFyZSBhbHJlYWR5IGFzc2lnbmVkJyB8IHRyYW5zbGF0ZVwiXG4gIFtyZWZyZXNoXT1cInJlZnJlc2hcIlxuICBbYWN0aW9uQ29udHJvbHNdPVwiW11cIlxuICBbY29sdW1uc0NvbmZpZ0tleV09XCInYXNzaWduLWNoaWxkLWRldmljZXMnXCJcbiAgW3NlbGVjdGFibGVdPVwidHJ1ZVwiXG4gIFtwYXJlbnQtZ3JvdXBdPVwicGFyZW50RGV2aWNlXCJcbiAgW2Jhc2VRdWVyeV09XCJiYXNlUXVlcnlcIlxuICAoaXRlbXNTZWxlY3QpPVwib25TZWxlY3RlZCgkZXZlbnQpXCJcbiAgY2xhc3M9XCJkLWNvbnRlbnRzXCJcbj48L2M4eS1zdWItYXNzZXRzLWdyaWQ+XG5cbjxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBjYXJkLWZvb3RlciBwLTI0IHNlcGFyYXRvclwiPlxuICA8YnV0dG9uXG4gICAgKGNsaWNrKT1cIm9uQ2FuY2VsLmVtaXQoKVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIlxuICAgIHRpdGxlPVwie3sgJ0NhbmNlbCcgfCB0cmFuc2xhdGUgfX1cIlxuICA+XG4gICAgPHNwYW4+e3sgJ0NhbmNlbCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gIDwvYnV0dG9uPlxuICA8YnV0dG9uXG4gICAgKGNsaWNrKT1cImFzc2lnbkRldmljZXMoKVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIlxuICAgIFtuZ0NsYXNzXT1cInsgJ2J0bi1wZW5kaW5nJzogcGVuZGluZ1N0YXR1cyB9XCJcbiAgICB0aXRsZT1cInt7ICdBc3NpZ24nIHwgdHJhbnNsYXRlIH19XCJcbiAgICBbZGlzYWJsZWRdPVwic2VsZWN0ZWQubGVuZ3RoID09PSAwIHx8ICFjYW5Bc3NpZ25EZXZpY2VcIlxuICA+XG4gICAgPHNwYW4+e3sgJ0Fzc2lnbicgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9kaXY+XG4iXX0=