UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

87 lines 24.4 kB
import { Component, ViewChild } from '@angular/core'; import { LpwanSetDeviceProtocolService } from './lpwan-set-device-protocol.service'; import { AlertService, gettext } from '@c8y/ngx-components'; import { InventoryService } from '@c8y/client'; import { Router } from '@angular/router'; import { pipe } from 'rxjs'; import { map } from 'rxjs/operators'; import { NgForm } from '@angular/forms'; import * as i0 from "@angular/core"; import * as i1 from "./lpwan-set-device-protocol.service"; import * as i2 from "@c8y/ngx-components"; import * as i3 from "@angular/router"; import * as i4 from "@c8y/client"; import * as i5 from "@angular/common"; import * as i6 from "@angular/forms"; import * as i7 from "./lpwan-set-connections.component"; export class LpwanAssignDeviceProtocolComponent { constructor(lpwanService, alertService, router, inventoryService) { this.lpwanService = lpwanService; this.alertService = alertService; this.router = router; this.inventoryService = inventoryService; this.filterProtocols = pipe(); this.pattern = ''; } async ngOnInit() { await this.reload(); this.setPipe(''); } setPipe(filterStr) { this.pattern = filterStr; this.filterProtocols = pipe(map(protocols => protocols.filter(protocol => (!this.currentProtocol || this.currentProtocol.id !== protocol.id) && (!filterStr || protocol.name.toLowerCase().indexOf(filterStr.toLowerCase()) > -1)))); } async reload() { this.loading = true; this.newProtocol = null; try { await this.loadDevice(); this.availableProtocols = await this.lpwanService.getAvailableProtocols(this.device); this.currentProtocol = await this.lpwanService.getCurrentProtocol(this.device); } catch (ex) { this.alertService.addServerFailure(ex); } finally { this.loading = false; } } async loadDevice() { const deviceId = this.router.routerState.snapshot.url.match(/\d+/)[0]; const { data } = await this.inventoryService.detail(deviceId); this.device = data; } async apply(selectedProtocol) { try { const moUpdated = (await this.lpwanService.applyProtocol(this.device, selectedProtocol)).res.status === 200; await this.reload(); this.alertService.success(gettext('Device protocol set.')); this.lpwanSetDeviceProtocolForm.reset('dirty'); if (moUpdated) { this.refreshCache(); } } catch (ex) { this.alertService.danger(gettext('Could not set device protocol.')); } } async refreshCache() { try { await this.lpwanService.refreshCache(this.device); } catch (ex) { // do nothing (refreshing is an optional step) } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LpwanAssignDeviceProtocolComponent, deps: [{ token: i1.LpwanSetDeviceProtocolService }, { token: i2.AlertService }, { token: i3.Router }, { token: i4.InventoryService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LpwanAssignDeviceProtocolComponent, selector: "set-device-protocol", viewQueries: [{ propertyName: "lpwanSetDeviceProtocolForm", first: true, predicate: ["lpwanSetDeviceProtocolForm"], descendants: true }], ngImport: i0, template: "<form #lpwanSetDeviceProtocolForm=\"ngForm\">\n <div class=\"row\">\n <div class=\"col-md-9\">\n <div class=\"card card--fullpage\">\n <div class=\"card-header separator\">\n <div class=\"card-title\">\n {{ 'LPWAN configuration' | translate }}\n </div>\n </div>\n\n <div class=\"card-block p-t-24 p-b-8 overflow-visible\">\n <div *ngIf=\"loading\">\n <c8y-loading></c8y-loading>\n </div>\n\n <div *ngIf=\"!loading\">\n <div class=\"col-md-6\">\n <div class=\"form-group\">\n <label translate>Current device protocol</label>\n <p class=\"form-control-static\" *ngIf=\"!currentProtocol\">\n {{ device.type }}\n </p>\n <p\n class=\"form-control-static text-truncate\"\n *ngIf=\"currentProtocol\"\n title=\"{{ currentProtocol.name }}\"\n >\n {{ currentProtocol.name }}\n </p>\n </div>\n <c8y-form-group>\n <c8y-typeahead\n [(ngModel)]=\"newProtocol\"\n placeholder=\"{{ 'Select new device protocol' | translate }}\"\n (onSearch)=\"setPipe($event)\"\n name=\"newProtocol\"\n [allowFreeEntries]=\"false\"\n >\n <c8y-li\n *c8yFor=\"\n let protocol of availableProtocols;\n loadMore: 'hidden';\n pipe: filterProtocols\n \"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"newProtocol = protocol; setPipe('')\"\n >\n <c8y-highlight [text]=\"protocol.name\" [pattern]=\"pattern\"></c8y-highlight>\n </c8y-li>\n </c8y-typeahead>\n <c8y-messages>\n <c8y-message\n name=\"notExisting\"\n [text]=\"'Select one of the protocols.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n <set-lns-connections [device]=\"device\"></set-lns-connections>\n </div>\n </div>\n\n <div class=\"card-footer separator\">\n <button\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n class=\"btn btn-primary\"\n (click)=\"apply(newProtocol)\"\n [disabled]=\"!newProtocol\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </div>\n </div>\n</form>\n\u200C\n", dependencies: [{ kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: i2.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: i2.HighlightComponent, selector: "c8y-highlight", inputs: ["pattern", "text", "elementClass", "shouldTrimPattern"] }, { kind: "component", type: i2.TypeaheadComponent, selector: "c8y-typeahead", inputs: ["required", "maxlength", "disabled", "allowFreeEntries", "placeholder", "displayProperty", "icon", "name", "autoClose", "hideNew", "container", "selected", "highlightFirstItem"], outputs: ["onSearch", "onIconClick"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i2.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i2.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "component", type: i2.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i7.LpwanAssignLnsConnectionsComponent, selector: "set-lns-connections", inputs: ["device"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LpwanAssignDeviceProtocolComponent, decorators: [{ type: Component, args: [{ selector: 'set-device-protocol', template: "<form #lpwanSetDeviceProtocolForm=\"ngForm\">\n <div class=\"row\">\n <div class=\"col-md-9\">\n <div class=\"card card--fullpage\">\n <div class=\"card-header separator\">\n <div class=\"card-title\">\n {{ 'LPWAN configuration' | translate }}\n </div>\n </div>\n\n <div class=\"card-block p-t-24 p-b-8 overflow-visible\">\n <div *ngIf=\"loading\">\n <c8y-loading></c8y-loading>\n </div>\n\n <div *ngIf=\"!loading\">\n <div class=\"col-md-6\">\n <div class=\"form-group\">\n <label translate>Current device protocol</label>\n <p class=\"form-control-static\" *ngIf=\"!currentProtocol\">\n {{ device.type }}\n </p>\n <p\n class=\"form-control-static text-truncate\"\n *ngIf=\"currentProtocol\"\n title=\"{{ currentProtocol.name }}\"\n >\n {{ currentProtocol.name }}\n </p>\n </div>\n <c8y-form-group>\n <c8y-typeahead\n [(ngModel)]=\"newProtocol\"\n placeholder=\"{{ 'Select new device protocol' | translate }}\"\n (onSearch)=\"setPipe($event)\"\n name=\"newProtocol\"\n [allowFreeEntries]=\"false\"\n >\n <c8y-li\n *c8yFor=\"\n let protocol of availableProtocols;\n loadMore: 'hidden';\n pipe: filterProtocols\n \"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"newProtocol = protocol; setPipe('')\"\n >\n <c8y-highlight [text]=\"protocol.name\" [pattern]=\"pattern\"></c8y-highlight>\n </c8y-li>\n </c8y-typeahead>\n <c8y-messages>\n <c8y-message\n name=\"notExisting\"\n [text]=\"'Select one of the protocols.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n <set-lns-connections [device]=\"device\"></set-lns-connections>\n </div>\n </div>\n\n <div class=\"card-footer separator\">\n <button\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n class=\"btn btn-primary\"\n (click)=\"apply(newProtocol)\"\n [disabled]=\"!newProtocol\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </div>\n </div>\n</form>\n\u200C\n" }] }], ctorParameters: () => [{ type: i1.LpwanSetDeviceProtocolService }, { type: i2.AlertService }, { type: i3.Router }, { type: i4.InventoryService }], propDecorators: { lpwanSetDeviceProtocolForm: [{ type: ViewChild, args: ['lpwanSetDeviceProtocolForm', { static: false }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHB3YW4tc2V0LWRldmljZS1wcm90b2NvbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm90b2NvbC1scHdhbi9scHdhbi1zZXQtZGV2aWNlLXByb3RvY29sLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3Byb3RvY29sLWxwd2FuL2xwd2FuLXNldC1kZXZpY2UtcHJvdG9jb2wuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDcEYsT0FBTyxFQUFFLFlBQVksRUFBbUIsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0UsT0FBTyxFQUFrQixnQkFBZ0IsRUFBZSxNQUFNLGFBQWEsQ0FBQztBQUM1RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1QixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7QUFNeEMsTUFBTSxPQUFPLGtDQUFrQztJQVU3QyxZQUNVLFlBQTJDLEVBQzNDLFlBQTBCLEVBQzFCLE1BQWMsRUFDZCxnQkFBa0M7UUFIbEMsaUJBQVksR0FBWixZQUFZLENBQStCO1FBQzNDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBUjVDLG9CQUFlLEdBQW9DLElBQUksRUFBRSxDQUFDO1FBQzFELFlBQU8sR0FBRyxFQUFFLENBQUM7SUFRVixDQUFDO0lBQ0osS0FBSyxDQUFDLFFBQVE7UUFDWixNQUFN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QUFZLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNaLDhDQUE4QztRQUNoRCxDQUFDO0lBQ0gsQ0FBQzsrR0EzRVUsa0NBQWtDO21HQUFsQyxrQ0FBa0MscU1DYi9DLDZ2RkE4RUE7OzRGRGpFYSxrQ0FBa0M7a0JBSjlDLFNBQVM7K0JBQ0UscUJBQXFCO2lMQVc2QiwwQkFBMEI7c0JBQXJGLFNBQVM7dUJBQUMsNEJBQTRCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTHB3YW5TZXREZXZpY2VQcm90b2NvbFNlcnZpY2UgfSBmcm9tICcuL2xwd2FuLXNldC1kZXZpY2UtcHJvdG9jb2wuc2VydmljZSc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UsIEZvck9mRmlsdGVyUGlwZSwgZ2V0dGV4dCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QsIEludmVudG9yeVNlcnZpY2UsIElSZXN1bHRMaXN0IH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IHBpcGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2V0LWRldmljZS1wcm90b2NvbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9scHdhbi1zZXQtZGV2aWNlLXByb3RvY29sLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBMcHdhbkFzc2lnbkRldmljZVByb3RvY29sQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgbG9hZGluZzogYm9vbGVhbjtcbiAgZGV2aWNlOiBJTWFuYWdlZE9iamVjdDtcbiAgY3VycmVudFByb3RvY29sOiBJTWFuYWdlZE9iamVjdDtcbiAgYXZhaWxhYmxlUHJvdG9jb2xzOiBJUmVzdWx0TGlzdDxJTWFuYWdlZE9iamVjdD47XG4gIG5ld1Byb3RvY29sOiBJTWFuYWdlZE9iamVjdDtcbiAgZmlsdGVyUHJvdG9jb2xzOiBGb3JPZkZpbHRlclBpcGU8SU1hbmFnZWRPYmplY3Q+ID0gcGlwZSgpO1xuICBwYXR0ZXJuID0gJyc7XG4gIEBWaWV3Q2hpbGQoJ2xwd2FuU2V0RGV2aWNlUHJvdG9jb2xGb3JtJywgeyBzdGF0aWM6IGZhbHNlIH0pIGxwd2FuU2V0RGV2aWNlUHJvdG9jb2xGb3JtOiBOZ0Zvcm07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBscHdhblNlcnZpY2U6IExwd2FuU2V0RGV2aWNlUHJvdG9jb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGludmVudG9yeVNlcnZpY2U6IEludmVudG9yeVNlcnZpY2VcbiAgKSB7fVxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICBhd2FpdCB0aGlzLnJlbG9hZCgpO1xuICAgIHRoaXMuc2V0UGlwZSgnJyk7XG4gIH1cblxuICBzZXRQaXBlKGZpbHRlclN0cjogc3RyaW5nKSB7XG4gICAgdGhpcy5wYXR0ZXJuID0gZmlsdGVyU3RyO1xuICAgIHRoaXMuZmlsdGVyUHJvdG9jb2xzID0gcGlwZShcbiAgICAgIG1hcChwcm90b2NvbHMgPT5cbiAgICAgICAgcHJvdG9jb2xzLmZpbHRlcihcbiAgICAgICAgICBwcm90b2NvbCA9PlxuICAgICAgICAgICAgKCF0aGlzLmN1cnJlbnRQcm90b2NvbCB8fCB0aGlzLmN1cnJlbnRQcm90b2NvbC5pZCAhPT0gcHJvdG9jb2wuaWQpICYmXG4gICAgICAgICAgICAoIWZpbHRlclN0ciB8fCBwcm90b2NvbC5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihmaWx0ZXJTdHIudG9Mb3dlckNhc2UoKSkgPiAtMSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBhc3luYyByZWxvYWQoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLm5ld1Byb3RvY29sID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkRGV2aWNlKCk7XG4gICAgICB0aGlzLmF2YWlsYWJsZVByb3RvY29scyA9IGF3YWl0IHRoaXMubHB3YW5TZXJ2aWNlLmdldEF2YWlsYWJsZVByb3RvY29scyh0aGlzLmRldmljZSk7XG4gICAgICB0aGlzLmN1cnJlbnRQcm90b2NvbCA9IGF3YWl0IHRoaXMubHB3YW5TZXJ2aWNlLmdldEN1cnJlbnRQcm90b2NvbCh0aGlzLmRldmljZSk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBsb2FkRGV2aWNlKCkge1xuICAgIGNvbnN0IGRldmljZUlkID0gdGhpcy5yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QudXJsLm1hdGNoKC9cXGQrLylbMF07XG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCB0aGlzLmludmVudG9yeVNlcnZpY2UuZGV0YWlsKGRldmljZUlkKTtcbiAgICB0aGlzLmRldmljZSA9IGRhdGE7XG4gIH1cblxuICBhc3luYyBhcHBseShzZWxlY3RlZFByb3RvY29sKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1vVXBkYXRlZCA9XG4gICAgICAgIChhd2FpdCB0aGlzLmxwd2FuU2VydmljZS5hcHBseVByb3RvY29sKHRoaXMuZGV2aWNlLCBzZWxlY3RlZFByb3RvY29sKSkucmVzLnN0YXR1cyA9PT0gMjAwO1xuICAgICAgYXdhaXQgdGhpcy5yZWxvYWQoKTtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnRGV2aWNlIHByb3RvY29sIHNldC4nKSk7XG4gICAgICB0aGlzLmxwd2FuU2V0RGV2aWNlUHJvdG9jb2xGb3JtLnJlc2V0KCdkaXJ0eScpO1xuICAgICAgaWYgKG1vVXBkYXRlZCkge1xuICAgICAgICB0aGlzLnJlZnJlc2hDYWNoZSgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5kYW5nZXIoZ2V0dGV4dCgnQ291bGQgbm90IHNldCBkZXZpY2UgcHJvdG9jb2wuJykpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlZnJlc2hDYWNoZSgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5scHdhblNlcnZpY2UucmVmcmVzaENhY2hlKHRoaXMuZGV2aWNlKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgLy8gZG8gbm90aGluZyAocmVmcmVzaGluZyBpcyBhbiBvcHRpb25hbCBzdGVwKVxuICAgIH1cbiAgfVxufVxuIiwiPGZvcm0gI2xwd2FuU2V0RGV2aWNlUHJvdG9jb2xGb3JtPVwibmdGb3JtXCI+XG4gIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTlcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNhcmQtLWZ1bGxwYWdlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBzZXBhcmF0b3JcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10aXRsZVwiPlxuICAgICAgICAgICAge3sgJ0xQV0FOIGNvbmZpZ3VyYXRpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrIHAtdC0yNCBwLWItOCBvdmVyZmxvdy12aXNpYmxlXCI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImxvYWRpbmdcIj5cbiAgICAgICAgICAgIDxjOHktbG9hZGluZz48L2M4eS1sb2FkaW5nPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiAqbmdJZj1cIiFsb2FkaW5nXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgdHJhbnNsYXRlPkN1cnJlbnQgZGV2aWNlIHByb3RvY29sPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZvcm0tY29udHJvbC1zdGF0aWNcIiAqbmdJZj1cIiFjdXJyZW50UHJvdG9jb2xcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGRldmljZS50eXBlIH19XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDxwXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbC1zdGF0aWMgdGV4dC10cnVuY2F0ZVwiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImN1cnJlbnRQcm90b2NvbFwiXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cInt7IGN1cnJlbnRQcm90b2NvbC5uYW1lIH19XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBjdXJyZW50UHJvdG9jb2wubmFtZSB9fVxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICA8Yzh5LXR5cGVhaGVhZFxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJuZXdQcm90b2NvbFwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdTZWxlY3QgbmV3IGRldmljZSBwcm90b2NvbCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgKG9uU2VhcmNoKT1cInNldFBpcGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICBuYW1lPVwibmV3UHJvdG9jb2xcIlxuICAgICAgICAgICAgICAgICAgW2FsbG93RnJlZUVudHJpZXNdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxjOHktbGlcbiAgICAgICAgICAgICAgICAgICAgKmM4eUZvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm90b2NvbCBvZiBhdmFpbGFibGVQcm90b2NvbHM7XG4gICAgICAgICAgICAgICAgICAgICAgbG9hZE1vcmU6ICdoaWRkZW4nO1xuICAgICAgICAgICAgICAgICAgICAgIHBpcGU6IGZpbHRlclByb3RvY29sc1xuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtbC04IHAtci04IGM4eS1saXN0X19pdGVtLS1saW5rXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5ld1Byb3RvY29sID0gcHJvdG9jb2w7IHNldFBpcGUoJycpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGM4eS1oaWdobGlnaHQgW3RleHRdPVwicHJvdG9jb2wubmFtZVwiIFtwYXR0ZXJuXT1cInBhdHRlcm5cIj48L2M4eS1oaWdobGlnaHQ+XG4gICAgICAgICAgICAgICAgICA8L2M4eS1saT5cbiAgICAgICAgICAgICAgICA8L2M4eS10eXBlYWhlYWQ+XG4gICAgICAgICAgICAgICAgPGM4eS1tZXNzYWdlcz5cbiAgICAgICAgICAgICAgICAgIDxjOHktbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICBuYW1lPVwibm90RXhpc3RpbmdcIlxuICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCInU2VsZWN0IG9uZSBvZiB0aGUgcHJvdG9jb2xzLicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgPjwvYzh5LW1lc3NhZ2U+XG4gICAgICAgICAgICAgICAgPC9jOHktbWVzc2FnZXM+XG4gICAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzZXQtbG5zLWNvbm5lY3Rpb25zIFtkZXZpY2VdPVwiZGV2aWNlXCI+PC9zZXQtbG5zLWNvbm5lY3Rpb25zPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgc2VwYXJhdG9yXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnU2F2ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYXBwbHkobmV3UHJvdG9jb2wpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhbmV3UHJvdG9jb2xcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7ICdTYXZlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZm9ybT5cbuKAjFxuIl19