UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

123 lines 19.7 kB
import { Injectable } from '@angular/core'; import { InventoryService, FetchClient, IdentityService } from '@c8y/client'; import { get, orderBy } from 'lodash-es'; import { MultipleLnsConnectorService } from './multiple-lns-connectors'; import { ConnectionType } from './multiple-lns-connectors/multiple-lns-connector.model'; import * as i0 from "@angular/core"; import * as i1 from "@c8y/client"; import * as i2 from "./multiple-lns-connectors"; export class LpwanSetDeviceProtocolService { constructor(inventoryService, client, identityService, lnsService) { this.inventoryService = inventoryService; this.client = client; this.identityService = identityService; this.lnsService = lnsService; this.supportedDevicesCfgs = [ { name: 'actility', match: device => get(device, 'c8y_LpwanDevice.lpwanDeviceType') === 'Lora' && get(device, 'c8y_LpwanDevice.serviceProvider') === 'Actility', protocolTypes: ['c8y_ActilityDeviceType', 'c8y_LoraDeviceType', 'c8y_LpwanDeviceType'], externalIdTypes: ['c8y_LoriotEUI', 'c8y_Serial'], connectionType: ConnectionType.ACTILITY }, { name: 'loriot', match: device => get(device, 'c8y_LpwanDevice.lpwanDeviceType') === 'Lora' && get(device, 'c8y_LpwanDevice.serviceProvider') === 'Loriot', protocolTypes: ['c8y_LoraDeviceType', 'c8y_LpwanDeviceType'], externalIdTypes: ['c8y_LoriotEUI', 'c8y_Serial'], connectionType: ConnectionType.LORIOT }, { name: 'sigfox', match: device => get(device, 'c8y_LpwanDevice.serviceProvider') === 'Sigfox', protocolTypes: ['c8y_SigfoxDeviceType', 'c8y_LpwanDeviceType'], externalIdTypes: ['com.sigfox.deviceId'], connectionType: ConnectionType.SIGFOX } ]; this.header = { 'Content-Type': 'application/json' }; } async refreshCache(device) { const externalId = await this.getExternalId(device); if (externalId) { const url = `${this.getMicroserviceUrl(device)}/refreshCache/${externalId}`; const options = { method: 'POST', headers: this.header, body: JSON.stringify({}) }; return this.client.fetch(url, options); } } getMicroserviceUrl(device) { const { serviceProvider } = device.c8y_LpwanDevice; let serviceName = serviceProvider.toLowerCase(); if (serviceProvider === 'Sigfox') { serviceName = 'sigfox-agent'; } return `/service/${serviceName}`; } isSupportedDevice(device) { return this.supportedDevicesCfgs.some(({ match }) => match(device)); } async getCurrentProtocol(device) { const lpwanDevice = device.c8y_LpwanDevice; let protocolId; if (lpwanDevice.typeExternalId) { const externalId = (await this.identityService.detail(lpwanDevice.typeExternalId)).data; protocolId = externalId.managedObject.id; } if (!protocolId && lpwanDevice.type) { protocolId = lpwanDevice.type.split('/')[2]; } if (!protocolId) { return null; } return (await this.inventoryService.detail(protocolId)).data; } async applyProtocol(device, selectedProtocol) { const [protocolExternalId] = (await this.identityService.list(selectedProtocol.id)).data; const { externalId, type } = protocolExternalId; device.c8y_LpwanDevice.typeExternalId = { externalId, type }; device.c8y_LpwanDevice.type = 'inventory/managedObjects/' + selectedProtocol.id; device.type = selectedProtocol.name; return this.inventoryService.update(device); } async getAvailableProtocols(device) { const query = { __filter: { type: { __in: this.getProtocolTypesMatchingDevice(device) } }, __orderby: [{ name: 1 }] }; return this.inventoryService.listQuery(query, { withTotalPages: true, pageSize: 5 }); } async getAvailableConnections(device) { let list; const matchingCfg = this.supportedDevicesCfgs.find(({ match }) => match(device)); const response = await this.lnsService.list(matchingCfg.connectionType); if (response && response.status === 200) { list = await response.json(); list = orderBy(list, ['name'], ['asc']); return { res: response, data: list }; } } getProtocolTypesMatchingDevice(device) { const matchingCfg = this.supportedDevicesCfgs.find(({ match }) => match(device)); return matchingCfg ? matchingCfg.protocolTypes : []; } async getExternalId(device) { const matchingCfg = this.supportedDevicesCfgs.find(({ match }) => match(device)); const externalIds = (await this.identityService.list(device.id)).data; const externalId = externalIds.find(({ type }) => matchingCfg.externalIdTypes.includes(type)); return externalId ? externalId.externalId : null; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LpwanSetDeviceProtocolService, deps: [{ token: i1.InventoryService }, { token: i1.FetchClient }, { token: i1.IdentityService }, { token: i2.MultipleLnsConnectorService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LpwanSetDeviceProtocolService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LpwanSetDeviceProtocolService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.InventoryService }, { type: i1.FetchClient }, { type: i1.IdentityService }, { type: i2.MultipleLnsConnectorService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHB3YW4tc2V0LWRldmljZS1wcm90b2NvbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvdG9jb2wtbHB3YW4vbHB3YW4tc2V0LWRldmljZS1wcm90b2NvbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUVMLGdCQUFnQixFQUVoQixXQUFXLEVBRVgsZUFBZSxFQUNoQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN6QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN4RSxPQUFPLEVBRUwsY0FBYyxFQUVmLE1BQU0sd0RBQXdELENBQUM7Ozs7QUFHaEUsTUFBTSxPQUFPLDZCQUE2QjtJQStCeEMsWUFDVSxnQkFBa0MsRUFDbEMsTUFBbUIsRUFDbkIsZUFBZ0MsRUFDaEMsVUFBdUM7UUFIdkMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxXQUFNLEdBQU4sTUFBTSxDQUFhO1FBQ25CLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxlQUFVLEdBQVYsVUFBVSxDQUE2QjtRQWxDakQseUJBQW9CLEdBQUc7WUFDckI7Z0JBQ0UsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxDQUNkLEdBQUcsQ0FBQyxNQUFNLEVBQUUsaUNBQWlDLENBQUMsS0FBSyxNQUFNO29CQUN6RCxHQUFHLENBQUMsTUFBTSxFQUFFLGlDQUFpQyxDQUFDLEtBQUssVUFBVTtnQkFDL0QsYUFBYSxFQUFFLENBQUMsd0JBQXdCLEVBQUUsb0JBQW9CLEVBQUUscUJBQXFCLENBQUM7Z0JBQ3RGLGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxZQUFZLENBQUM7Z0JBQ2hELGNBQWMsRUFB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RSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2pGLE1BQU0sV0FBVyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDdEUsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUYsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNuRCxDQUFDOytHQWhJVSw2QkFBNkI7bUhBQTdCLDZCQUE2Qjs7NEZBQTdCLDZCQUE2QjtrQkFEekMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIElNYW5hZ2VkT2JqZWN0LFxuICBJbnZlbnRvcnlTZXJ2aWNlLFxuICBJUmVzdWx0TGlzdCxcbiAgRmV0Y2hDbGllbnQsXG4gIElGZXRjaE9wdGlvbnMsXG4gIElkZW50aXR5U2VydmljZVxufSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBnZXQsIG9yZGVyQnkgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgTXVsdGlwbGVMbnNDb25uZWN0b3JTZXJ2aWNlIH0gZnJvbSAnLi9tdWx0aXBsZS1sbnMtY29ubmVjdG9ycyc7XG5pbXBvcnQge1xuICBBY3RpbGl0eUNvbm5lY3Rpb24sXG4gIENvbm5lY3Rpb25UeXBlLFxuICBTaWdmb3hDb25uZWN0aW9uXG59IGZyb20gJy4vbXVsdGlwbGUtbG5zLWNvbm5lY3RvcnMvbXVsdGlwbGUtbG5zLWNvbm5lY3Rvci5tb2RlbCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBMcHdhblNldERldmljZVByb3RvY29sU2VydmljZSB7XG4gIHN1cHBvcnRlZERldmljZXNDZmdzID0gW1xuICAgIHtcbiAgICAgIG5hbWU6ICdhY3RpbGl0eScsXG4gICAgICBtYXRjaDogZGV2aWNlID0+XG4gICAgICAgIGdldChkZXZpY2UsICdjOHlfTHB3YW5EZXZpY2UubHB3YW5EZXZpY2VUeXBlJykgPT09ICdMb3JhJyAmJlxuICAgICAgICBnZXQoZGV2aWNlLCAnYzh5X0xwd2FuRGV2aWNlLnNlcnZpY2VQcm92aWRlcicpID09PSAnQWN0aWxpdHknLFxuICAgICAgcHJvdG9jb2xUeXBlczogWydjOHlfQWN0aWxpdHlEZXZpY2VUeXBlJywgJ2M4eV9Mb3JhRGV2aWNlVHlwZScsICdjOHlfTHB3YW5EZXZpY2VUeXBlJ10sXG4gICAgICBleHRlcm5hbElkVHlwZXM6IFsnYzh5X0xvcmlvdEVVSScsICdjOHlfU2VyaWFsJ10sXG4gICAgICBjb25uZWN0aW9uVHlwZTogQ29ubmVjdGlvblR5cGUuQUNUSUxJVFlcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdsb3Jpb3QnLFxuICAgICAgbWF0Y2g6IGRldmljZSA9PlxuICAgICAgICBnZXQoZGV2aWNlLCAnYzh5X0xwd2FuRGV2aWNlLmxwd2FuRGV2aWNlVHlwZScpID09PSAnTG9yYScgJiZcbiAgICAgICAgZ2V0KGRldmljZSwgJ2M4eV9McHdhbkRldmljZS5zZXJ2aWNlUHJvdmlkZXInKSA9PT0gJ0xvcmlvdCcsXG4gICAgICBwcm90b2NvbFR5cGVzOiBbJ2M4eV9Mb3JhRGV2aWNlVHlwZScsICdjOHlfTHB3YW5EZXZpY2VUeXBlJ10sXG4gICAgICBleHRlcm5hbElkVHlwZXM6IFsnYzh5X0xvcmlvdEVVSScsICdjOHlfU2VyaWFsJ10sXG4gICAgICBjb25uZWN0aW9uVHlwZTogQ29ubmVjdGlvblR5cGUuTE9SSU9UXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnc2lnZm94JyxcbiAgICAgIG1hdGNoOiBkZXZpY2UgPT4gZ2V0KGRldmljZSwgJ2M4eV9McHdhbkRldmljZS5zZXJ2aWNlUHJvdmlkZXInKSA9PT0gJ1NpZ2ZveCcsXG4gICAgICBwcm90b2NvbFR5cGVzOiBbJ2M4eV9TaWdmb3hEZXZpY2VUeXBlJywgJ2M4eV9McHdhbkRldmljZVR5cGUnXSxcbiAgICAgIGV4dGVybmFsSWRUeXBlczogWydjb20uc2lnZm94LmRldmljZUlkJ10sXG4gICAgICBjb25uZWN0aW9uVHlwZTogQ29ubmVjdGlvblR5cGUuU0lHRk9YXG4gICAgfVxuICBdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaGVhZGVyOiBhbnkgPSB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGludmVudG9yeVNlcnZpY2U6IEludmVudG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjbGllbnQ6IEZldGNoQ2xpZW50LFxuICAgIHByaXZhdGUgaWRlbnRpdHlTZXJ2aWNlOiBJZGVudGl0eVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsbnNTZXJ2aWNlOiBNdWx0aXBsZUxuc0Nvbm5lY3RvclNlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIHJlZnJlc2hDYWNoZShkZXZpY2UpIHtcbiAgICBjb25zdCBleHRlcm5hbElkID0gYXdhaXQgdGhpcy5nZXRFeHRlcm5hbElkKGRldmljZSk7XG4gICAgaWYgKGV4dGVybmFsSWQpIHtcbiAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZ2V0TWljcm9zZXJ2aWNlVXJsKGRldmljZSl9L3JlZnJlc2hDYWNoZS8ke2V4dGVybmFsSWR9YDtcbiAgICAgIGNvbnN0IG9wdGlvbnM6IElGZXRjaE9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcixcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe30pXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LmZldGNoKHVybCwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0TWljcm9zZXJ2aWNlVXJsKGRldmljZSkge1xuICAgIGNvbnN0IHsgc2VydmljZVByb3ZpZGVyIH0gPSBkZXZpY2UuYzh5X0xwd2FuRGV2aWNlO1xuXG4gICAgbGV0IHNlcnZpY2VOYW1lID0gc2VydmljZVByb3ZpZGVyLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHNlcnZpY2VQcm92aWRlciA9PT0gJ1NpZ2ZveCcpIHtcbiAgICAgIHNlcnZpY2VOYW1lID0gJ3NpZ2ZveC1hZ2VudCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAvc2VydmljZS8ke3NlcnZpY2VOYW1lfWA7XG4gIH1cblxuICBpc1N1cHBvcnRlZERldmljZShkZXZpY2U6IElNYW5hZ2VkT2JqZWN0KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3VwcG9ydGVkRGV2aWNlc0NmZ3Muc29tZSgoeyBtYXRjaCB9KSA9PiBtYXRjaChkZXZpY2UpKTtcbiAgfVxuXG4gIGFzeW5jIGdldEN1cnJlbnRQcm90b2NvbChkZXZpY2U6IElNYW5hZ2VkT2JqZWN0KSB7XG4gICAgY29uc3QgbHB3YW5EZXZpY2UgPSBkZXZpY2UuYzh5X0xwd2FuRGV2aWNlO1xuICAgIGxldCBwcm90b2NvbElkO1xuXG4gICAgaWYgKGxwd2FuRGV2aWNlLnR5cGVFeHRlcm5hbElkKSB7XG4gICAgICBjb25zdCBleHRlcm5hbElkID0gKGF3YWl0IHRoaXMuaWRlbnRpdHlTZXJ2aWNlLmRldGFpbChscHdhbkRldmljZS50eXBlRXh0ZXJuYWxJZCkpLmRhdGE7XG4gICAgICBwcm90b2NvbElkID0gZXh0ZXJuYWxJZC5tYW5hZ2VkT2JqZWN0LmlkO1xuICAgIH1cblxuICAgIGlmICghcHJvdG9jb2xJZCAmJiBscHdhbkRldmljZS50eXBlKSB7XG4gICAgICBwcm90b2NvbElkID0gbHB3YW5EZXZpY2UudHlwZS5zcGxpdCgnLycpWzJdO1xuICAgIH1cblxuICAgIGlmICghcHJvdG9jb2xJZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmludmVudG9yeVNlcnZpY2UuZGV0YWlsKHByb3RvY29sSWQpKS5kYXRhO1xuICB9XG5cbiAgYXN5bmMgYXBwbHlQcm90b2NvbChkZXZpY2U6IElNYW5hZ2VkT2JqZWN0LCBzZWxlY3RlZFByb3RvY29sOiBJTWFuYWdlZE9iamVjdCkge1xuICAgIGNvbnN0IFtwcm90b2NvbEV4dGVybmFsSWRdID0gKGF3YWl0IHRoaXMuaWRlbnRpdHlTZXJ2aWNlLmxpc3Qoc2VsZWN0ZWRQcm90b2NvbC5pZCkpLmRhdGE7XG4gICAgY29uc3QgeyBleHRlcm5hbElkLCB0eXBlIH0gPSBwcm90b2NvbEV4dGVybmFsSWQ7XG4gICAgZGV2aWNlLmM4eV9McHdhbkRldmljZS50eXBlRXh0ZXJuYWxJZCA9IHsgZXh0ZXJuYWxJZCwgdHlwZSB9O1xuICAgIGRldmljZS5jOHlfTHB3YW5EZXZpY2UudHlwZSA9ICdpbnZlbnRvcnkvbWFuYWdlZE9iamVjdHMvJyArIHNlbGVjdGVkUHJvdG9jb2wuaWQ7XG4gICAgZGV2aWNlLnR5cGUgPSBzZWxlY3RlZFByb3RvY29sLm5hbWU7XG4gICAgcmV0dXJuIHRoaXMuaW52ZW50b3J5U2VydmljZS51cGRhdGUoZGV2aWNlKTtcbiAgfVxuXG4gIGFzeW5jIGdldEF2YWlsYWJsZVByb3RvY29scyhkZXZpY2U6IElNYW5hZ2VkT2JqZWN0KTogUHJvbWlzZTxJUmVzdWx0TGlzdDxJTWFuYWdlZE9iamVjdD4+IHtcbiAgICBjb25zdCBxdWVyeSA9IHtcbiAgICAgIF9fZmlsdGVyOiB7XG4gICAgICAgIHR5cGU6IHsgX19pbjogdGhpcy5nZXRQcm90b2NvbFR5cGVzTWF0Y2hpbmdEZXZpY2UoZGV2aWNlKSB9XG4gICAgICB9LFxuICAgICAgX19vcmRlcmJ5OiBbeyBuYW1lOiAxIH1dXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5pbnZlbnRvcnlTZXJ2aWNlLmxpc3RRdWVyeShxdWVyeSwgeyB3aXRoVG90YWxQYWdlczogdHJ1ZSwgcGFnZVNpemU6IDUgfSk7XG4gIH1cblxuICBhc3luYyBnZXRBdmFpbGFibGVDb25uZWN0aW9ucyhcbiAgICBkZXZpY2U6IElNYW5hZ2VkT2JqZWN0XG4gICk6IFByb21pc2U8SVJlc3VsdExpc3Q8QWN0aWxpdHlDb25uZWN0aW9uIHwgU2lnZm94Q29ubmVjdGlvbj4+IHtcbiAgICBsZXQgbGlzdDtcbiAgICBjb25zdCBtYXRjaGluZ0NmZyA9IHRoaXMuc3VwcG9ydGVkRGV2aWNlc0NmZ3MuZmluZCgoeyBtYXRjaCB9KSA9PiBtYXRjaChkZXZpY2UpKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMubG5zU2VydmljZS5saXN0KG1hdGNoaW5nQ2ZnLmNvbm5lY3Rpb25UeXBlKTtcbiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHtcbiAgICAgIGxpc3QgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBsaXN0ID0gb3JkZXJCeShsaXN0LCBbJ25hbWUnXSwgWydhc2MnXSk7XG4gICAgICByZXR1cm4geyByZXM6IHJlc3BvbnNlLCBkYXRhOiBsaXN0IH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRQcm90b2NvbFR5cGVzTWF0Y2hpbmdEZXZpY2UoZGV2aWNlOiBJTWFuYWdlZE9iamVjdCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBtYXRjaGluZ0NmZyA9IHRoaXMuc3VwcG9ydGVkRGV2aWNlc0NmZ3MuZmluZCgoeyBtYXRjaCB9KSA9PiBtYXRjaChkZXZpY2UpKTtcbiAgICByZXR1cm4gbWF0Y2hpbmdDZmcgPyBtYXRjaGluZ0NmZy5wcm90b2NvbFR5cGVzIDogW107XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldEV4dGVybmFsSWQoZGV2aWNlOiBJTWFuYWdlZE9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgbWF0Y2hpbmdDZmcgPSB0aGlzLnN1cHBvcnRlZERldmljZXNDZmdzLmZpbmQoKHsgbWF0Y2ggfSkgPT4gbWF0Y2goZGV2aWNlKSk7XG4gICAgY29uc3QgZXh0ZXJuYWxJZHMgPSAoYXdhaXQgdGhpcy5pZGVudGl0eVNlcnZpY2UubGlzdChkZXZpY2UuaWQpKS5kYXRhO1xuICAgIGNvbnN0IGV4dGVybmFsSWQgPSBleHRlcm5hbElkcy5maW5kKCh7IHR5cGUgfSkgPT4gbWF0Y2hpbmdDZmcuZXh0ZXJuYWxJZFR5cGVzLmluY2x1ZGVzKHR5cGUpKTtcbiAgICByZXR1cm4gZXh0ZXJuYWxJZCA/IGV4dGVybmFsSWQuZXh0ZXJuYWxJZCA6IG51bGw7XG4gIH1cbn1cbiJdfQ==