@iotize/ionic
Version:
Iotize specific building blocks on top of @ionic/angular.
157 lines • 20.7 kB
JavaScript
import { ChangeDetectorRef, Component, EventEmitter, Inject, Input, Output, TemplateRef, } from '@angular/core';
import { LoadingController } from '@ionic/angular';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { TAP_BLE_SCANNER } from '../../../injection-types';
import * as i0 from "@angular/core";
import * as i1 from "@ionic/angular";
import * as i2 from "@angular/common";
import * as i3 from "./tap-scan-results/tap-scan-results.component";
/**
* Scanner for bluetooth
*/
export class TapScannerBleComponent {
constructor(tapScanner, changeDetector, loadingCtrl) {
this.tapScanner = tapScanner;
this.changeDetector = changeDetector;
this.loadingCtrl = loadingCtrl;
/**
* @deprecated Not used anymore. start/stop buttons must be define by user
*/
this.showScanButton = true;
/**
* RSSI update threshold.
* If device list is the same, we will only emit a device update event
* if the Math.abs(previousRSSI - newRSSI) >= rssiUpdateThreshold
*/
this.rssiUpdateThreshold = 10;
/**
* Event emitted when a scan result has been selected
* @deprecated see protocolSelected
*/
this.onProtocolSelected = new EventEmitter();
/**
* Event emitted when a scan result has been selected
*/
this.protocolSelected = new EventEmitter();
/**
* Event emitted when an error occurs
*/
this.onError = new EventEmitter();
this.results = [];
this.destroyed = new Subject();
this.isScanning = false;
}
ngOnInit() {
this.tapScanner.results
.pipe(takeUntil(this.destroyed))
.subscribe((values) => {
this.mergeScanResults(values);
});
this.tapScanner.scanning.pipe(takeUntil(this.destroyed)).subscribe((v) => {
if (v !== this.isScanning) {
this.isScanning = v;
}
});
}
notifyError(error) {
console.error('BLEScannerError', error);
this.onError.emit(error);
}
ngOnDestroy() {
this.stopScan();
this.destroyed.next();
this.destroyed.complete();
}
onItemClicked(device) {
const protocolMeta = {
type: 'ble',
info: {
id: device.address,
mac: device.address,
name: device.name,
},
};
const event = {
meta: protocolMeta,
};
this.protocolSelected.emit(event);
this.onProtocolSelected.emit(event);
}
startScan() {
// this.devices = this.devices.filter(device => device.address == this.tapScanner.selectedDevice);
// this.devices.splice(0, this.devices.length);
this.tapScanner.start().catch((err) => {
this.notifyError(err);
});
// this.onScanStateChanged.emit(true);
}
stopScan() {
this.tapScanner.stop().catch((err) => {
this.notifyError(err);
});
// this.onScanStateChanged.emit(false);
}
mergeScanResults(newResults) {
/*
newResults.forEach((newResult) => {
this.addOrRefreshScanResultList(newResult);
});
const indexToRemove = this.results.map((oldDevice) => {
return newResults.findIndex(
(entry) => entry.address === oldDevice.address
);
}, []);
indexToRemove.forEach((resultIndex) => {
if (resultIndex < 0) {
this.results.splice(resultIndex, 1);
}
});
*/
this.results = newResults;
this.changeDetector.detectChanges();
}
addOrRefreshScanResultList(newDevice) {
const devices = this.results;
let hasChanged = false;
const storedDeviceIndex = devices.findIndex((entry) => entry.address === newDevice.address);
if (storedDeviceIndex >= 0) {
const storedDevice = devices[storedDeviceIndex];
if (storedDevice.name !== newDevice.name) {
storedDevice.name = newDevice.name;
hasChanged = true;
}
if (Math.abs(storedDevice.rssi - newDevice.rssi) >= this.rssiUpdateThreshold) {
storedDevice.rssi = newDevice.rssi;
hasChanged = true;
}
}
else {
devices.push(newDevice);
hasChanged = true;
}
return hasChanged;
}
}
/** @nocollapse */ TapScannerBleComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TapScannerBleComponent, deps: [{ token: TAP_BLE_SCANNER }, { token: i0.ChangeDetectorRef }, { token: i1.LoadingController }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ TapScannerBleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TapScannerBleComponent, selector: "tap-scanner-ble", inputs: { scanResultsTemplate: "scanResultsTemplate", showScanButton: "showScanButton", rssiUpdateThreshold: "rssiUpdateThreshold" }, outputs: { onProtocolSelected: "onProtocolSelected", protocolSelected: "protocolSelected", onError: "onError" }, ngImport: i0, template: "<ng-container\n *ngTemplateOutlet=\"scanResultsContainer; context: { $implicit: results }\"\n></ng-container>\n\n<ng-template #scanResultsContainer let-devices>\n <!-- <ng-content #scanResultsInner select=\"[scan-results]\"></ng-content> -->\n <ng-template\n *ngTemplateOutlet=\"scanResultsTemplate; context: { $implicit: results }\"\n ></ng-template>\n <tap-ble-scan-result\n *ngIf=\"!scanResultsTemplate\"\n [devices]=\"devices\"\n [showMacAddress]=\"true\"\n (onItemClicked)=\"onItemClicked($event)\"\n ></tap-ble-scan-result>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.TapScanResultsComponent, selector: "tap-ble-scan-result", inputs: ["lines", "showMacAddress", "showSignalStrenght", "devices"], outputs: ["onItemClicked"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TapScannerBleComponent, decorators: [{
type: Component,
args: [{ selector: 'tap-scanner-ble', template: "<ng-container\n *ngTemplateOutlet=\"scanResultsContainer; context: { $implicit: results }\"\n></ng-container>\n\n<ng-template #scanResultsContainer let-devices>\n <!-- <ng-content #scanResultsInner select=\"[scan-results]\"></ng-content> -->\n <ng-template\n *ngTemplateOutlet=\"scanResultsTemplate; context: { $implicit: results }\"\n ></ng-template>\n <tap-ble-scan-result\n *ngIf=\"!scanResultsTemplate\"\n [devices]=\"devices\"\n [showMacAddress]=\"true\"\n (onItemClicked)=\"onItemClicked($event)\"\n ></tap-ble-scan-result>\n</ng-template>\n" }]
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Inject,
args: [TAP_BLE_SCANNER]
}] }, { type: i0.ChangeDetectorRef }, { type: i1.LoadingController }]; }, propDecorators: { scanResultsTemplate: [{
type: Input
}], showScanButton: [{
type: Input
}], rssiUpdateThreshold: [{
type: Input
}], onProtocolSelected: [{
type: Output
}], protocolSelected: [{
type: Output
}], onError: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLXNjYW5uZXItYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9zcmMvbGliL3RhcC1zY2FubmVyL3RhcC1zY2FubmVyLWJsZS90YXAtc2Nhbm5lci1ibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW90aXplLWlvbmljL3NyYy9saWIvdGFwLXNjYW5uZXIvdGFwLXNjYW5uZXItYmxlL3RhcC1zY2FubmVyLWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBQ04sV0FBVyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7QUFLM0Q7O0dBRUc7QUFNSCxNQUFNLE9BQU8sc0JBQXNCO0lBaURqQyxZQUVTLFVBQStDLEVBQy9DLGNBQWlDLEVBQ2pDLFdBQThCO1FBRjlCLGVBQVUsR0FBVixVQUFVLENBQXFDO1FBQy9DLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUNqQyxnQkFBVyxHQUFYLFdBQVcsQ0FBbUI7UUFwQ3ZDOztXQUVHO1FBQ00sbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFFL0I7Ozs7V0FJRztRQUNNLHdCQUFtQixHQUFHLEVBQUUsQ0FBQztRQUVsQzs7O1dBR0c7UUFDTyx1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBeUIsQ0FBQztRQUN6RTs7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TUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTG9hZGluZ0NvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBEZXZpY2VTY2FubmVyIH0gZnJvbSAnQGlvdGl6ZS90YXAvc2Nhbm5lci9hcGknO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBUQVBfQkxFX1NDQU5ORVIgfSBmcm9tICcuLi8uLi8uLi9pbmplY3Rpb24tdHlwZXMnO1xuaW1wb3J0IHsgUHJvdG9jb2xNZXRhQmxlIH0gZnJvbSAnLi4vLi4vZXh0ZW5zaW9ucy9wcm90b2NvbC1pbmZvJztcbmltcG9ydCB7IFByb3RvY29sU2VsZWN0ZWRFdmVudCB9IGZyb20gJy4uL2FwaSc7XG5pbXBvcnQgeyBEaXNjb3ZlcmVkRGV2aWNlVHlwZSB9IGZyb20gJy4vZGVmaW5pdGlvbnMnO1xuXG4vKipcbiAqIFNjYW5uZXIgZm9yIGJsdWV0b290aFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0YXAtc2Nhbm5lci1ibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFwLXNjYW5uZXItYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFwLXNjYW5uZXItYmxlLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFRhcFNjYW5uZXJCbGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBTY2FuIHJlc3VsdCB0ZW1wbGF0ZSB0byB1c2UgdG8gZGlzcGxheSBzY2FuIHJlc3VsdHMuXG4gICAqXG4gICAqIElmIG5vdCBwcm92aWRlZCwgaXQgd2lsbCB1c2UgYSBkZWZhdWx0IGNvbXBvbmVudCB0byBkaXNwbGF5IGRldmljZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIDwhLS0gRGlzcGxheSBkZXZpY2VzIHdpdGggdGFwLWJsZS1zY2FuLXJlc3VsdCBjb21wb25lbnQgLS0+XG4gICAqIDx0YXAtc2Nhbm5lci1ibGUgW3NjYW5SZXN1bHRzVGVtcGxhdGVdPVwic2NhblJlc3VsdHNUZW1wbGF0ZVwiPlxuICAgKiAgICA8bmctdGVtcGxhdGUgI3NjYW5SZXN1bHRzVGVtcGxhdGUgbGV0LWRldmljZXM+XG4gICAqICAgICAgICA8dGFwLWJsZS1zY2FuLXJlc3VsdCBbZGV2aWNlc109XCJkZXZpY2VzXCIgW3Nob3dTaWduYWxTdHJlbmdodF09XCJmYWxzZVwiPjwvdGFwLWJsZS1zY2FuLXJlc3VsdD5cbiAgICogICAgPC9uZy10ZW1wbGF0ZT5cbiAgICogPC90YXAtc2Nhbm5lci1ibGU+XG4gICAqXG4gICAqL1xuICBASW5wdXQoKSBzY2FuUmVzdWx0c1RlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgTm90IHVzZWQgYW55bW9yZS4gc3RhcnQvc3RvcCBidXR0b25zIG11c3QgYmUgZGVmaW5lIGJ5IHVzZXJcbiAgICovXG4gIEBJbnB1dCgpIHNob3dTY2FuQnV0dG9uID0gdHJ1ZTtcblxuICAvKipcbiAgICogUlNTSSB1cGRhdGUgdGhyZXNob2xkLlxuICAgKiBJZiBkZXZpY2UgbGlzdCBpcyB0aGUgc2FtZSwgd2Ugd2lsbCBvbmx5IGVtaXQgYSBkZXZpY2UgdXBkYXRlIGV2ZW50XG4gICAqIGlmIHRoZSBNYXRoLmFicyhwcmV2aW91c1JTU0kgLSBuZXdSU1NJKSA+PSByc3NpVXBkYXRlVGhyZXNob2xkXG4gICAqL1xuICBASW5wdXQoKSByc3NpVXBkYXRlVGhyZXNob2xkID0gMTA7XG5cbiAgLyoqXG4gICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBhIHNjYW4gcmVzdWx0IGhhcyBiZWVuIHNlbGVjdGVkXG4gICAqIEBkZXByZWNhdGVkIHNlZSBwcm90b2NvbFNlbGVjdGVkXG4gICAqL1xuICBAT3V0cHV0KCkgb25Qcm90b2NvbFNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxQcm90b2NvbFNlbGVjdGVkRXZlbnQ+KCk7XG4gIC8qKlxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gYSBzY2FuIHJlc3VsdCBoYXMgYmVlbiBzZWxlY3RlZFxuICAgKi9cbiAgQE91dHB1dCgpIHByb3RvY29sU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFByb3RvY29sU2VsZWN0ZWRFdmVudD4oKTtcblxuICAvKipcbiAgICogRXZlbnQgZW1pdHRlZCB3aGVuIGFuIGVycm9yIG9jY3Vyc1xuICAgKi9cbiAgQE91dHB1dCgpIG9uRXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPEVycm9yPigpO1xuXG4gIHJlc3VsdHM6IERpc2NvdmVyZWREZXZpY2VUeXBlW10gPSBbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3llZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIGlzU2Nhbm5pbmcgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFRBUF9CTEVfU0NBTk5FUilcbiAgICBwdWJsaWMgdGFwU2Nhbm5lcjogRGV2aWNlU2Nhbm5lcjxEaXNjb3ZlcmVkRGV2aWNlVHlwZT4sXG4gICAgcHVibGljIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwdWJsaWMgbG9hZGluZ0N0cmw6IExvYWRpbmdDb250cm9sbGVyXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnRhcFNjYW5uZXIucmVzdWx0c1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSlcbiAgICAgIC5zdWJzY3JpYmUoKHZhbHVlcykgPT4ge1xuICAgICAgICB0aGlzLm1lcmdlU2NhblJlc3VsdHModmFsdWVzKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy50YXBTY2FubmVyLnNjYW5uaW5nLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSkuc3Vic2NyaWJlKCh2KSA9PiB7XG4gICAgICBpZiAodiAhPT0gdGhpcy5pc1NjYW5uaW5nKSB7XG4gICAgICAgIHRoaXMuaXNTY2FubmluZyA9IHY7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBub3RpZnlFcnJvcihlcnJvcjogYW55KSB7XG4gICAgY29uc29sZS5lcnJvcignQkxFU2Nhbm5lckVycm9yJywgZXJyb3IpO1xuICAgIHRoaXMub25FcnJvci5lbWl0KGVycm9yKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3RvcFNjYW4oKTtcbiAgICB0aGlzLmRlc3Ryb3llZC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95ZWQuY29tcGxldGUoKTtcbiAgfVxuXG4gIG9uSXRlbUNsaWNrZWQoZGV2aWNlOiBEaXNjb3ZlcmVkRGV2aWNlVHlwZSkge1xuICAgIGNvbnN0IHByb3RvY29sTWV0YTogUHJvdG9jb2xNZXRhQmxlID0ge1xuICAgICAgdHlwZTogJ2JsZScsXG4gICAgICBpbmZvOiB7XG4gICAgICAgIGlkOiBkZXZpY2UuYWRkcmVzcyxcbiAgICAgICAgbWFjOiBkZXZpY2UuYWRkcmVzcyxcbiAgICAgICAgbmFtZTogZGV2aWNlLm5hbWUsXG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICBtZXRhOiBwcm90b2NvbE1ldGEsXG4gICAgfTtcbiAgICB0aGlzLnByb3RvY29sU2VsZWN0ZWQuZW1pdChldmVudCk7XG4gICAgdGhpcy5vblByb3RvY29sU2VsZWN0ZWQuZW1pdChldmVudCk7XG4gIH1cblxuICBzdGFydFNjYW4oKSB7XG4gICAgLy8gdGhpcy5kZXZpY2VzID0gdGhpcy5kZXZpY2VzLmZpbHRlcihkZXZpY2UgPT4gZGV2aWNlLmFkZHJlc3MgPT0gdGhpcy50YXBTY2FubmVyLnNlbGVjdGVkRGV2aWNlKTtcbiAgICAvLyB0aGlzLmRldmljZXMuc3BsaWNlKDAsIHRoaXMuZGV2aWNlcy5sZW5ndGgpO1xuICAgIHRoaXMudGFwU2Nhbm5lci5zdGFydCgpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIHRoaXMubm90aWZ5RXJyb3IoZXJyKTtcbiAgICB9KTtcbiAgICAvLyB0aGlzLm9uU2NhblN0YXRlQ2hhbmdlZC5lbWl0KHRydWUpO1xuICB9XG5cbiAgc3RvcFNjYW4oKSB7XG4gICAgdGhpcy50YXBTY2FubmVyLnN0b3AoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICB0aGlzLm5vdGlmeUVycm9yKGVycik7XG4gICAgfSk7XG4gICAgLy8gdGhpcy5vblNjYW5TdGF0ZUNoYW5nZWQuZW1pdChmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIG1lcmdlU2NhblJlc3VsdHMobmV3UmVzdWx0czogRGlzY292ZXJlZERldmljZVR5cGVbXSkge1xuICAgIC8qXG4gICAgbmV3UmVzdWx0cy5mb3JFYWNoKChuZXdSZXN1bHQpID0+IHtcbiAgICAgIHRoaXMuYWRkT3JSZWZyZXNoU2NhblJlc3VsdExpc3QobmV3UmVzdWx0KTtcbiAgICB9KTtcbiAgICBjb25zdCBpbmRleFRvUmVtb3ZlID0gdGhpcy5yZXN1bHRzLm1hcCgob2xkRGV2aWNlKSA9PiB7XG4gICAgICByZXR1cm4gbmV3UmVzdWx0cy5maW5kSW5kZXgoXG4gICAgICAgIChlbnRyeSkgPT4gZW50cnkuYWRkcmVzcyA9PT0gb2xkRGV2aWNlLmFkZHJlc3NcbiAgICAgICk7XG4gICAgfSwgW10pO1xuICAgIGluZGV4VG9SZW1vdmUuZm9yRWFjaCgocmVzdWx0SW5kZXgpID0+IHtcbiAgICAgIGlmIChyZXN1bHRJbmRleCA8IDApIHtcbiAgICAgICAgdGhpcy5yZXN1bHRzLnNwbGljZShyZXN1bHRJbmRleCwgMSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgKi9cbiAgICB0aGlzLnJlc3VsdHMgPSBuZXdSZXN1bHRzO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRPclJlZnJlc2hTY2FuUmVzdWx0TGlzdChuZXdEZXZpY2U6IERpc2NvdmVyZWREZXZpY2VUeXBlKSB7XG4gICAgY29uc3QgZGV2aWNlcyA9IHRoaXMucmVzdWx0cztcbiAgICBsZXQgaGFzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHN0b3JlZERldmljZUluZGV4ID0gZGV2aWNlcy5maW5kSW5kZXgoXG4gICAgICAoZW50cnkpID0+IGVudHJ5LmFkZHJlc3MgPT09IG5ld0RldmljZS5hZGRyZXNzXG4gICAgKTtcbiAgICBpZiAoc3RvcmVkRGV2aWNlSW5kZXggPj0gMCkge1xuICAgICAgY29uc3Qgc3RvcmVkRGV2aWNlID0gZGV2aWNlc1tzdG9yZWREZXZpY2VJbmRleF07XG4gICAgICBpZiAoc3RvcmVkRGV2aWNlLm5hbWUgIT09IG5ld0RldmljZS5uYW1lKSB7XG4gICAgICAgIHN0b3JlZERldmljZS5uYW1lID0gbmV3RGV2aWNlLm5hbWU7XG4gICAgICAgIGhhc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBNYXRoLmFicyhzdG9yZWREZXZpY2UucnNzaSAtIG5ld0RldmljZS5yc3NpKSA+PSB0aGlzLnJzc2lVcGRhdGVUaHJlc2hvbGRcbiAgICAgICkge1xuICAgICAgICBzdG9yZWREZXZpY2UucnNzaSA9IG5ld0RldmljZS5yc3NpO1xuICAgICAgICBoYXNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZGV2aWNlcy5wdXNoKG5ld0RldmljZSk7XG4gICAgICBoYXNDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0NoYW5nZWQ7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXJcbiAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzY2FuUmVzdWx0c0NvbnRhaW5lcjsgY29udGV4dDogeyAkaW1wbGljaXQ6IHJlc3VsdHMgfVwiXG4+PC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjc2NhblJlc3VsdHNDb250YWluZXIgbGV0LWRldmljZXM+XG4gIDwhLS0gPG5nLWNvbnRlbnQgI3NjYW5SZXN1bHRzSW5uZXIgc2VsZWN0PVwiW3NjYW4tcmVzdWx0c11cIj48L25nLWNvbnRlbnQ+IC0tPlxuICA8bmctdGVtcGxhdGVcbiAgICAqbmdUZW1wbGF0ZU91dGxldD1cInNjYW5SZXN1bHRzVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiByZXN1bHRzIH1cIlxuICA+PC9uZy10ZW1wbGF0ZT5cbiAgPHRhcC1ibGUtc2Nhbi1yZXN1bHRcbiAgICAqbmdJZj1cIiFzY2FuUmVzdWx0c1RlbXBsYXRlXCJcbiAgICBbZGV2aWNlc109XCJkZXZpY2VzXCJcbiAgICBbc2hvd01hY0FkZHJlc3NdPVwidHJ1ZVwiXG4gICAgKG9uSXRlbUNsaWNrZWQpPVwib25JdGVtQ2xpY2tlZCgkZXZlbnQpXCJcbiAgPjwvdGFwLWJsZS1zY2FuLXJlc3VsdD5cbjwvbmctdGVtcGxhdGU+XG4iXX0=