@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
55 lines • 21 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { gettext } from '@c8y/ngx-components';
import { PRODUCT_EXPERIENCE_REPOSITORY_SHARED } from '@c8y/ngx-components/repository/shared';
import { BehaviorSubject } from 'rxjs';
import { map } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@c8y/ngx-components";
import * as i3 from "@c8y/ngx-components/operations/operation-details";
import * as i4 from "./device-software-list.component";
export class DeviceSoftwareChangesComponent {
constructor() {
this.PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE_REPOSITORY_SHARED;
this.clear = new EventEmitter();
this.drop = new EventEmitter();
this.apply = new EventEmitter();
this.hideSoftwareChanges = new EventEmitter();
this.changes$ = new BehaviorSubject([]);
this.installations$ = this.changes$.pipe(map(changes => {
return changes.filter(change => change.action === 'install');
}));
this.removals$ = this.changes$.pipe(map(changes => {
return changes.filter(change => change.action === 'delete');
}));
}
get applyButtonLabel() {
return this.changesInProgress ? gettext('Applying changes…') : gettext('Apply changes');
}
ngOnChanges(changes) {
if (changes.changes) {
this.changes$.next(changes.changes.currentValue);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DeviceSoftwareChangesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DeviceSoftwareChangesComponent, selector: "c8y-device-software-changes", inputs: { changes: "changes", changesInProgress: "changesInProgress", deviceSoftwareChangesOperation: "deviceSoftwareChangesOperation" }, outputs: { clear: "clear", drop: "drop", apply: "apply", hideSoftwareChanges: "hideSoftwareChanges" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"inner-scroll d-flex d-col\">\n <div class=\"card-header separator sticky-top visible-sm visible-xs\">\n <button\n class=\"btn btn-dot text-primary\"\n [title]=\"'Back' | translate\"\n type=\"button\"\n (click)=\"hideSoftwareChanges.emit()\"\n >\n <i c8yIcon=\"chevron-left\"></i>\n <span translate>Back</span>\n </button>\n </div>\n <div class=\"card-header separator large-padding sticky-top\">\n <div\n class=\"card-title\"\n translate\n >\n Software changes\n </div>\n </div>\n <div class=\"flex-grow\">\n <fieldset\n class=\"card-block large-padding bg-level-2 p-0\"\n id=\"operation-block\"\n *ngIf=\"deviceSoftwareChangesOperation\"\n >\n <c8y-operation-details [operation]=\"deviceSoftwareChangesOperation\"></c8y-operation-details>\n </fieldset>\n </div>\n <div\n class=\"flex-grow inner-scroll\"\n id=\"software-changes-list\"\n >\n <div\n class=\"card-block large-padding\"\n *ngIf=\"(changes$ | async).length === 0; else changesList\"\n >\n <div class=\"c8y-empty-state\">\n <div class=\"h1 c8y-icon c8y-icon-device-control c8y-icon-duocolor\"></div>\n <p>\n <strong translate>No software changes.</strong>\n <br />\n <small translate>Selected actions will be displayed here.</small>\n </p>\n </div>\n </div>\n\n <ng-template #changesList>\n <fieldset\n class=\"card-block p-t-0 p-b-0\"\n *ngIf=\"(installations$ | async).length > 0\"\n [disabled]=\"changesInProgress\"\n >\n <div\n class=\"form-block legend\"\n translate\n >\n Installations`software`\n </div>\n <c8y-device-software-list\n [softwareList]=\"installations$ | async\"\n (remove)=\"drop.emit($event)\"\n ></c8y-device-software-list>\n </fieldset>\n\n <fieldset\n class=\"card-block p-t-0 p-b-0\"\n *ngIf=\"(removals$ | async).length > 0\"\n [disabled]=\"changesInProgress\"\n >\n <div\n class=\"form-block legend\"\n translate\n >\n Removals`software`\n </div>\n <c8y-device-software-list\n [softwareList]=\"removals$ | async\"\n (remove)=\"drop.emit($event)\"\n ></c8y-device-software-list>\n </fieldset>\n </ng-template>\n </div>\n <div\n class=\"card-footer separator large-padding sticky-bottom\"\n *ngIf=\"(changes$ | async).length > 0\"\n >\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Clear changes' | translate }}\"\n type=\"button\"\n (click)=\"clear.emit()\"\n [disabled]=\"changesInProgress\"\n translate\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.SOFTWARE.EVENTS.DEVICE_TAB\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.SOFTWARE.COMPONENTS.DEVICE_SOFTWARE_CHANGES,\n action: PRODUCT_EXPERIENCE.SOFTWARE.ACTIONS.CLEAR_SOFTWARE_CHANGES\n }\"\n >\n Clear`changes`\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ applyButtonLabel | translate }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn-pending': changesInProgress }\"\n [disabled]=\"changesInProgress\"\n (click)=\"apply.emit(); hideSoftwareChanges.emit()\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.SOFTWARE.EVENTS.DEVICE_TAB\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.SOFTWARE.COMPONENTS.DEVICE_SOFTWARE_CHANGES,\n action: PRODUCT_EXPERIENCE.SOFTWARE.ACTIONS.APPLY_SOFTWARE_CHANGES\n }\"\n >\n {{ applyButtonLabel | translate }}\n </button>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i2.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "component", type: i3.OperationDetailsComponent, selector: "c8y-operation-details", inputs: ["operation"] }, { kind: "component", type: i4.DeviceSoftwareListComponent, selector: "c8y-device-software-list", inputs: ["softwareList", "device", "deviceSoftwareChanges", "filterCriteria$"], outputs: ["update", "remove", "onListEmpty"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DeviceSoftwareChangesComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-device-software-changes', template: "<div class=\"inner-scroll d-flex d-col\">\n <div class=\"card-header separator sticky-top visible-sm visible-xs\">\n <button\n class=\"btn btn-dot text-primary\"\n [title]=\"'Back' | translate\"\n type=\"button\"\n (click)=\"hideSoftwareChanges.emit()\"\n >\n <i c8yIcon=\"chevron-left\"></i>\n <span translate>Back</span>\n </button>\n </div>\n <div class=\"card-header separator large-padding sticky-top\">\n <div\n class=\"card-title\"\n translate\n >\n Software changes\n </div>\n </div>\n <div class=\"flex-grow\">\n <fieldset\n class=\"card-block large-padding bg-level-2 p-0\"\n id=\"operation-block\"\n *ngIf=\"deviceSoftwareChangesOperation\"\n >\n <c8y-operation-details [operation]=\"deviceSoftwareChangesOperation\"></c8y-operation-details>\n </fieldset>\n </div>\n <div\n class=\"flex-grow inner-scroll\"\n id=\"software-changes-list\"\n >\n <div\n class=\"card-block large-padding\"\n *ngIf=\"(changes$ | async).length === 0; else changesList\"\n >\n <div class=\"c8y-empty-state\">\n <div class=\"h1 c8y-icon c8y-icon-device-control c8y-icon-duocolor\"></div>\n <p>\n <strong translate>No software changes.</strong>\n <br />\n <small translate>Selected actions will be displayed here.</small>\n </p>\n </div>\n </div>\n\n <ng-template #changesList>\n <fieldset\n class=\"card-block p-t-0 p-b-0\"\n *ngIf=\"(installations$ | async).length > 0\"\n [disabled]=\"changesInProgress\"\n >\n <div\n class=\"form-block legend\"\n translate\n >\n Installations`software`\n </div>\n <c8y-device-software-list\n [softwareList]=\"installations$ | async\"\n (remove)=\"drop.emit($event)\"\n ></c8y-device-software-list>\n </fieldset>\n\n <fieldset\n class=\"card-block p-t-0 p-b-0\"\n *ngIf=\"(removals$ | async).length > 0\"\n [disabled]=\"changesInProgress\"\n >\n <div\n class=\"form-block legend\"\n translate\n >\n Removals`software`\n </div>\n <c8y-device-software-list\n [softwareList]=\"removals$ | async\"\n (remove)=\"drop.emit($event)\"\n ></c8y-device-software-list>\n </fieldset>\n </ng-template>\n </div>\n <div\n class=\"card-footer separator large-padding sticky-bottom\"\n *ngIf=\"(changes$ | async).length > 0\"\n >\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Clear changes' | translate }}\"\n type=\"button\"\n (click)=\"clear.emit()\"\n [disabled]=\"changesInProgress\"\n translate\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.SOFTWARE.EVENTS.DEVICE_TAB\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.SOFTWARE.COMPONENTS.DEVICE_SOFTWARE_CHANGES,\n action: PRODUCT_EXPERIENCE.SOFTWARE.ACTIONS.CLEAR_SOFTWARE_CHANGES\n }\"\n >\n Clear`changes`\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ applyButtonLabel | translate }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn-pending': changesInProgress }\"\n [disabled]=\"changesInProgress\"\n (click)=\"apply.emit(); hideSoftwareChanges.emit()\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.SOFTWARE.EVENTS.DEVICE_TAB\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.SOFTWARE.COMPONENTS.DEVICE_SOFTWARE_CHANGES,\n action: PRODUCT_EXPERIENCE.SOFTWARE.ACTIONS.APPLY_SOFTWARE_CHANGES\n }\"\n >\n {{ applyButtonLabel | translate }}\n </button>\n </div>\n</div>\n" }]
}], propDecorators: { changes: [{
type: Input
}], changesInProgress: [{
type: Input
}], deviceSoftwareChangesOperation: [{
type: Input
}], clear: [{
type: Output
}], drop: [{
type: Output
}], apply: [{
type: Output
}], hideSoftwareChanges: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLXNvZnR3YXJlLWNoYW5nZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcmVwb3NpdG9yeS9zb2Z0d2FyZS9kZXZpY2UtdGFiL2RldmljZS1zb2Z0d2FyZS1jaGFuZ2VzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3JlcG9zaXRvcnkvc29mdHdhcmUvZGV2aWNlLXRhYi9kZXZpY2Utc29mdHdhcmUtY2hhbmdlcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUVqRyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUVMLG9DQUFvQyxFQUNyQyxNQUFNLHVDQUF1QyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFNckMsTUFBTSxPQUFPLDhCQUE4QjtJQUozQztRQUtFLHVCQUFrQixHQUFHLG9DQUFvQyxDQUFDO1FBSWhELFVBQUssR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMvQyxTQUFJLEdBQXVDLElBQUksWUFBWSxFQUFFLENBQUM7UUFDOUQsVUFBSyxHQUF1QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQy9DLHdCQUFtQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFNekQsYUFBUSxHQUFHLElBQUksZUFBZSxDQUF5QixFQUFFLENBQUMsQ0FBQztRQUMzRCxtQkFBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUNqQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDWixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixjQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQzVCLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNaLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUM7UUFDOUQsQ0FBQyxDQUFDLENBQ0gsQ0FBQztLQU9IO0lBdEJDLElBQUksZ0JBQWdCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzFGLENBQUM7SUFlRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNuRCxDQUFDO0lBQ0gsQ0FBQzsrR0EvQlUsOEJBQThCO21HQUE5Qiw4QkFBOEIseVVDZDNDLHlySEF5SEE7OzRGRDNHYSw4QkFBOEI7a0JBSjFDLFNBQVM7K0JBQ0UsNkJBQTZCOzhCQUs5QixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLDhCQUE4QjtzQkFBdEMsS0FBSztnQkFDSSxLQUFLO3NCQUFkLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLEtBQUs7c0JBQWQsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJT3BlcmF0aW9uIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgZ2V0dGV4dCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHtcbiAgRGV2aWNlU29mdHdhcmVDaGFuZ2UsXG4gIFBST0RVQ1RfRVhQRVJJRU5DRV9SRVBPU0lUT1JZX1NIQVJFRFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL3JlcG9zaXRvcnkvc2hhcmVkJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktZGV2aWNlLXNvZnR3YXJlLWNoYW5nZXMnLFxuICB0ZW1wbGF0ZVVybDogJ2RldmljZS1zb2Z0d2FyZS1jaGFuZ2VzLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBEZXZpY2VTb2Z0d2FyZUNoYW5nZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBQUk9EVUNUX0VYUEVSSUVOQ0UgPSBQUk9EVUNUX0VYUEVSSUVOQ0VfUkVQT1NJVE9SWV9TSEFSRUQ7XG4gIEBJbnB1dCgpIGNoYW5nZXM6IERldmljZVNvZnR3YXJlQ2hhbmdlW107XG4gIEBJbnB1dCgpIGNoYW5nZXNJblByb2dyZXNzOiBib29sZWFuO1xuICBASW5wdXQoKSBkZXZpY2VTb2Z0d2FyZUNoYW5nZXNPcGVyYXRpb246IElPcGVyYXRpb247XG4gIEBPdXRwdXQoKSBjbGVhcjogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZHJvcDogRXZlbnRFbWl0dGVyPERldmljZVNvZnR3YXJlQ2hhbmdlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGFwcGx5OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBoaWRlU29mdHdhcmVDaGFuZ2VzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGdldCBhcHBseUJ1dHRvbkxhYmVsKCkge1xuICAgIHJldHVybiB0aGlzLmNoYW5nZXNJblByb2dyZXNzID8gZ2V0dGV4dCgnQXBwbHlpbmcgY2hhbmdlc+KApicpIDogZ2V0dGV4dCgnQXBwbHkgY2hhbmdlcycpO1xuICB9XG5cbiAgY2hhbmdlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERldmljZVNvZnR3YXJlQ2hhbmdlW10+KFtdKTtcbiAgaW5zdGFsbGF0aW9ucyQgPSB0aGlzLmNoYW5nZXMkLnBpcGUoXG4gICAgbWFwKGNoYW5nZXMgPT4ge1xuICAgICAgcmV0dXJuIGNoYW5nZXMuZmlsdGVyKGNoYW5nZSA9PiBjaGFuZ2UuYWN0aW9uID09PSAnaW5zdGFsbCcpO1xuICAgIH0pXG4gICk7XG5cbiAgcmVtb3ZhbHMkID0gdGhpcy5jaGFuZ2VzJC5waXBlKFxuICAgIG1hcChjaGFuZ2VzID0+IHtcbiAgICAgIHJldHVybiBjaGFuZ2VzLmZpbHRlcihjaGFuZ2UgPT4gY2hhbmdlLmFjdGlvbiA9PT0gJ2RlbGV0ZScpO1xuICAgIH0pXG4gICk7XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLmNoYW5nZXMpIHtcbiAgICAgIHRoaXMuY2hhbmdlcyQubmV4dChjaGFuZ2VzLmNoYW5nZXMuY3VycmVudFZhbHVlKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJpbm5lci1zY3JvbGwgZC1mbGV4IGQtY29sXCI+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBzZXBhcmF0b3Igc3RpY2t5LXRvcCB2aXNpYmxlLXNtIHZpc2libGUteHNcIj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImJ0biBidG4tZG90IHRleHQtcHJpbWFyeVwiXG4gICAgICBbdGl0bGVdPVwiJ0JhY2snIHwgdHJhbnNsYXRlXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgKGNsaWNrKT1cImhpZGVTb2Z0d2FyZUNoYW5nZXMuZW1pdCgpXCJcbiAgICA+XG4gICAgICA8aSBjOHlJY29uPVwiY2hldnJvbi1sZWZ0XCI+PC9pPlxuICAgICAgPHNwYW4gdHJhbnNsYXRlPkJhY2s8L3NwYW4+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgc2VwYXJhdG9yIGxhcmdlLXBhZGRpbmcgc3RpY2t5LXRvcFwiPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiY2FyZC10aXRsZVwiXG4gICAgICB0cmFuc2xhdGVcbiAgICA+XG4gICAgICBTb2Z0d2FyZSBjaGFuZ2VzXG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93XCI+XG4gICAgPGZpZWxkc2V0XG4gICAgICBjbGFzcz1cImNhcmQtYmxvY2sgbGFyZ2UtcGFkZGluZyBiZy1sZXZlbC0yIHAtMFwiXG4gICAgICBpZD1cIm9wZXJhdGlvbi1ibG9ja1wiXG4gICAgICAqbmdJZj1cImRldmljZVNvZnR3YXJlQ2hhbmdlc09wZXJhdGlvblwiXG4gICAgPlxuICAgICAgPGM4eS1vcGVyYXRpb24tZGV0YWlscyBbb3BlcmF0aW9uXT1cImRldmljZVNvZnR3YXJlQ2hhbmdlc09wZXJhdGlvblwiPjwvYzh5LW9wZXJhdGlvbi1kZXRhaWxzPlxuICAgIDwvZmllbGRzZXQ+XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJmbGV4LWdyb3cgaW5uZXItc2Nyb2xsXCJcbiAgICBpZD1cInNvZnR3YXJlLWNoYW5nZXMtbGlzdFwiXG4gID5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImNhcmQtYmxvY2sgbGFyZ2UtcGFkZGluZ1wiXG4gICAgICAqbmdJZj1cIihjaGFuZ2VzJCB8IGFzeW5jKS5sZW5ndGggPT09IDA7IGVsc2UgY2hhbmdlc0xpc3RcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJjOHktZW1wdHktc3RhdGVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImgxIGM4eS1pY29uIGM4eS1pY29uLWRldmljZS1jb250cm9sIGM4eS1pY29uLWR1b2NvbG9yXCI+PC9kaXY+XG4gICAgICAgIDxwPlxuICAgICAgICAgIDxzdHJvbmcgdHJhbnNsYXRlPk5vIHNvZnR3YXJlIGNoYW5nZXMuPC9zdHJvbmc+XG4gICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgPHNtYWxsIHRyYW5zbGF0ZT5TZWxlY3RlZCBhY3Rpb25zIHdpbGwgYmUgZGlzcGxheWVkIGhlcmUuPC9zbWFsbD5cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctdGVtcGxhdGUgI2NoYW5nZXNMaXN0PlxuICAgICAgPGZpZWxkc2V0XG4gICAgICAgIGNsYXNzPVwiY2FyZC1ibG9jayBwLXQtMCBwLWItMFwiXG4gICAgICAgICpuZ0lmPVwiKGluc3RhbGxhdGlvbnMkIHwgYXN5bmMpLmxlbmd0aCA+IDBcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiY2hhbmdlc0luUHJvZ3Jlc3NcIlxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJmb3JtLWJsb2NrIGxlZ2VuZFwiXG4gICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgID5cbiAgICAgICAgICBJbnN0YWxsYXRpb25zYHNvZnR3YXJlYFxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGM4eS1kZXZpY2Utc29mdHdhcmUtbGlzdFxuICAgICAgICAgIFtzb2Z0d2FyZUxpc3RdPVwiaW5zdGFsbGF0aW9ucyQgfCBhc3luY1wiXG4gICAgICAgICAgKHJlbW92ZSk9XCJkcm9wLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgID48L2M4eS1kZXZpY2Utc29mdHdhcmUtbGlzdD5cbiAgICAgIDwvZmllbGRzZXQ+XG5cbiAgICAgIDxmaWVsZHNldFxuICAgICAgICBjbGFzcz1cImNhcmQtYmxvY2sgcC10LTAgcC1iLTBcIlxuICAgICAgICAqbmdJZj1cIihyZW1vdmFscyQgfCBhc3luYykubGVuZ3RoID4gMFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJjaGFuZ2VzSW5Qcm9ncmVzc1wiXG4gICAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImZvcm0tYmxvY2sgbGVnZW5kXCJcbiAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgPlxuICAgICAgICAgIFJlbW92YWxzYHNvZnR3YXJlYFxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGM4eS1kZXZpY2Utc29mdHdhcmUtbGlzdFxuICAgICAgICAgIFtzb2Z0d2FyZUxpc3RdPVwicmVtb3ZhbHMkIHwgYXN5bmNcIlxuICAgICAgICAgIChyZW1vdmUpPVwiZHJvcC5lbWl0KCRldmVudClcIlxuICAgICAgICA+PC9jOHktZGV2aWNlLXNvZnR3YXJlLWxpc3Q+XG4gICAgICA8L2ZpZWxkc2V0PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJjYXJkLWZvb3RlciBzZXBhcmF0b3IgbGFyZ2UtcGFkZGluZyBzdGlja3ktYm90dG9tXCJcbiAgICAqbmdJZj1cIihjaGFuZ2VzJCB8IGFzeW5jKS5sZW5ndGggPiAwXCJcbiAgPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgIHRpdGxlPVwie3sgJ0NsZWFyIGNoYW5nZXMnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgKGNsaWNrKT1cImNsZWFyLmVtaXQoKVwiXG4gICAgICBbZGlzYWJsZWRdPVwiY2hhbmdlc0luUHJvZ3Jlc3NcIlxuICAgICAgdHJhbnNsYXRlXG4gICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgW2FjdGlvbk5hbWVdPVwiUFJPRFVDVF9FWFBFUklFTkNFLlNPRlRXQVJFLkVWRU5UUy5ERVZJQ0VfVEFCXCJcbiAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgY29tcG9uZW50OiBQUk9EVUNUX0VYUEVSSUVOQ0UuU09GVFdBUkUuQ09NUE9ORU5UUy5ERVZJQ0VfU09GVFdBUkVfQ0hBTkdFUyxcbiAgICAgICAgYWN0aW9uOiBQUk9EVUNUX0VYUEVSSUVOQ0UuU09GVFdBUkUuQUNUSU9OUy5DTEVBUl9TT0ZUV0FSRV9DSEFOR0VTXG4gICAgICB9XCJcbiAgICA+XG4gICAgICBDbGVhcmBjaGFuZ2VzYFxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgIHRpdGxlPVwie3sgYXBwbHlCdXR0b25MYWJlbCB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ2J0bi1wZW5kaW5nJzogY2hhbmdlc0luUHJvZ3Jlc3MgfVwiXG4gICAgICBbZGlzYWJsZWRdPVwiY2hhbmdlc0luUHJvZ3Jlc3NcIlxuICAgICAgKGNsaWNrKT1cImFwcGx5LmVtaXQoKTsgaGlkZVNvZnR3YXJlQ2hhbmdlcy5lbWl0KClcIlxuICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgIFthY3Rpb25OYW1lXT1cIlBST0RVQ1RfRVhQRVJJRU5DRS5TT0ZUV0FSRS5FVkVOVFMuREVWSUNFX1RBQlwiXG4gICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgIGNvbXBvbmVudDogUFJPRFVDVF9FWFBFUklFTkNFLlNPRlRXQVJFLkNPTVBPTkVOVFMuREVWSUNFX1NPRlRXQVJFX0NIQU5HRVMsXG4gICAgICAgIGFjdGlvbjogUFJPRFVDVF9FWFBFUklFTkNFLlNPRlRXQVJFLkFDVElPTlMuQVBQTFlfU09GVFdBUkVfQ0hBTkdFU1xuICAgICAgfVwiXG4gICAgPlxuICAgICAge3sgYXBwbHlCdXR0b25MYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19