@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
192 lines • 29.7 kB
JavaScript
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { DeviceRegistrationService } from '@c8y/client';
import { get, pick } from 'lodash-es';
import { BehaviorSubject, forkJoin, from, Subject } from 'rxjs';
import { AlertService, gettext } from '@c8y/ngx-components';
import { finalize, map, mergeMap, takeLast, takeUntil } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "@c8y/client";
import * as i3 from "@c8y/ngx-components";
export class RegisterDeviceService {
constructor(router, deviceRegService, alertService) {
this.router = router;
this.deviceRegService = deviceRegService;
this.alertService = alertService;
this._loading = new Subject();
this._limit = new BehaviorSubject({
isReached: false
});
this._deviceRegistrationRequests = new BehaviorSubject({ data: [] });
this.deviceRegistrationRequests$ = this._deviceRegistrationRequests.asObservable();
this.loading$ = this._loading.asObservable();
this.limit$ = this._limit.asObservable();
this.deviceRegUrl = '/deviceregistration';
this.endSubscriptions = new Subject();
}
isDeviceRegistration() {
return get(this.router, 'url') === this.deviceRegUrl;
}
internalListUpdate(deviceRequests, pagingObject) {
let { paging, data } = this._deviceRegistrationRequests.getValue();
if (pagingObject) {
paging = pagingObject;
}
data = [...data, ...deviceRequests].filter(deviceReq => deviceReq.type !== 'c8y_DataBroker');
this._deviceRegistrationRequests.next({ data, paging });
}
onDeviceBootstrap(bsData) {
const { id, status } = bsData;
this._deviceRegistrationRequests.next({
data: this.updateStatusById(id, status)
});
}
list(pageSize = 100) {
this._loading.next(true);
this._deviceRegistrationRequests.next({ data: [], paging: undefined });
from(this.deviceRegService.list({ pageSize, withTotalPages: true }))
.pipe(takeUntil(this.endSubscriptions), finalize(() => this.limit()))
.subscribe(res => {
const { data, paging } = res;
this.internalListUpdate(data, paging);
this._loading.next(false);
}, err => {
this._loading.next(false);
this.alertService.addServerFailure(err);
});
}
createMultiple(newDeviceRequests) {
if (newDeviceRequests && newDeviceRequests.length > 0) {
this._loading.next(true);
const newRequests$ = newDeviceRequests.map(element => {
return from(this.deviceRegService.create(element).catch((err) => ({
res: err.res,
data: { ...err.data, id: element.id }
})));
});
const groupedRequests = {
success: [],
failed: []
};
return forkJoin(newRequests$).pipe(mergeMap(resp => resp.map(el => {
el.res.ok
? groupedRequests.success.push(el.data)
: groupedRequests.failed.push(el.data);
return groupedRequests;
})), takeLast(1), finalize(() => {
this.internalListUpdate(groupedRequests.success);
this._loading.next(false);
}));
}
}
remove(id) {
this._loading.next(true);
from(this.deviceRegService.delete(id))
.pipe(takeUntil(this.endSubscriptions))
.subscribe(() => {
this._deviceRegistrationRequests.next({
data: this.removeDeviceRegistrationRequestById(id)
});
this._loading.next(false);
this.alertService.success(gettext('Device registration cancelled.'));
}, err => {
this._loading.next(false);
this.alertService.addServerFailure(err);
});
}
accept(request) {
this._loading.next(true);
const payload = pick(request, ['id', 'securityToken']);
from(this.deviceRegService.accept(payload))
.pipe(takeUntil(this.endSubscriptions))
.subscribe(() => {
this._deviceRegistrationRequests.next({
data: this.removeDeviceRegistrationRequestById(payload.id)
});
this.limit();
this._loading.next(false);
this.alertService.success(gettext('Device registration accepted.'));
}, err => {
this._loading.next(false);
this.alertService.addServerFailure(err);
});
}
acceptAll() {
const acceptedDeviceRequests = [];
const failedDeviceRequests = [];
this._loading.next(true);
from(this.deviceRegService.acceptAll())
.pipe(takeUntil(this.endSubscriptions), map(({ data }) => {
data.map(deviceRegistrationRequest => {
if (deviceRegistrationRequest.successful) {
acceptedDeviceRequests.push(deviceRegistrationRequest);
this.removeDeviceRegistrationRequestById(deviceRegistrationRequest.id);
}
else {
failedDeviceRequests.push(deviceRegistrationRequest);
}
});
return data;
}), finalize(() => {
// update rendered list with successful accepted device registrations
// see: this.updateStatusById(...)
this.internalListUpdate([]);
this.limit();
this._loading.next(false);
if (failedDeviceRequests.length > 0) {
this.alertService.warning(gettext('Could not accept all pending registration requests.'), JSON.stringify({
failedDeviceRequests,
acceptedDeviceRequests
}, undefined, 2));
}
else {
this.alertService.success(gettext('Accepted all pending registration requests.'));
}
}))
.subscribe(() => {
// empty by design
}, err => {
this._loading.next(false);
this.alertService.addServerFailure(err);
});
}
limit() {
from(this.deviceRegService.limit())
.pipe(takeUntil(this.endSubscriptions))
.subscribe(res => this._limit.next(res.data), err => this.alertService.addServerFailure(err));
}
getRequestByStatus(status) {
return this._deviceRegistrationRequests.getValue().data.filter(req => req.status === status);
}
ngOnDestroy() {
this.endSubscriptions.next();
this.endSubscriptions.complete();
}
updateStatusById(id, status) {
const items = this._deviceRegistrationRequests.getValue().data;
const matchingElementIndex = items.findIndex(element => element.id === id);
if (matchingElementIndex >= 0) {
items[matchingElementIndex].status = status;
}
return items;
}
removeDeviceRegistrationRequestById(id) {
const items = this._deviceRegistrationRequests.getValue().data;
const matchingElementIndex = items.findIndex(element => element.id === id);
if (matchingElementIndex >= 0) {
items.splice(matchingElementIndex, 1);
}
this._loading.next(false);
return items;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RegisterDeviceService, deps: [{ token: i1.Router }, { token: i2.DeviceRegistrationService }, { token: i3.AlertService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RegisterDeviceService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RegisterDeviceService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i1.Router }, { type: i2.DeviceRegistrationService }, { type: i3.AlertService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXItZGV2aWNlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9yZWdpc3Rlci1kZXZpY2UvcmVnaXN0ZXItZGV2aWNlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUNMLHlCQUF5QixFQVExQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN0QyxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUE0QixNQUFNLHFCQUFxQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBSzlFLE1BQU0sT0FBTyxxQkFBcUI7SUFvQmhDLFlBQ1UsTUFBYyxFQUNkLGdCQUEyQyxFQUMzQyxZQUEwQjtRQUYxQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QscUJBQWdCLEdBQWhCLGdCQUFnQixDQUEyQjtRQUMzQyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQXRCM0IsYUFBUSxHQUFxQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzNDLFdBQU0sR0FBOEMsSUFBSSxlQUFlLENBQUM7WUFDL0UsU0FBUyxFQUFFLEtBQUs7U0FDakIsQ0FBQyxDQUFDO1FBQ00sZ0NBQTJCLEdBRy9CLElBQUksZUFBZSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUIsZ0NBQTJCLEdBRy9CLElBQUksQ0FBQywyQkFB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QUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDM0UsSUFBSSxvQkFBb0IsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM5QixLQUFLLENBQUMsTUFBTSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7K0dBN09VLHFCQUFxQjttSEFBckIscUJBQXFCLGNBRnBCLE1BQU07OzRGQUVQLHFCQUFxQjtrQkFIakMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtcbiAgRGV2aWNlUmVnaXN0cmF0aW9uU2VydmljZSxcbiAgRGV2aWNlUmVnaXN0cmF0aW9uU3RhdHVzLFxuICBJRGV2aWNlUmVnaXN0cmF0aW9uLFxuICBJRGV2aWNlUmVnaXN0cmF0aW9uQWNjZXB0LFxuICBJRGV2aWNlUmVnaXN0cmF0aW9uQ3JlYXRlLFxuICBJRGV2aWNlUmVnaXN0cmF0aW9uTGltaXQsXG4gIElSZXN1bHQsXG4gIFBhZ2luZ1xufSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBnZXQsIHBpY2sgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmb3JrSm9pbiwgZnJvbSwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlLCBnZXR0ZXh0LCBJUmVhbHRpbWVEZXZpY2VCb290c3RyYXAgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IGZpbmFsaXplLCBtYXAsIG1lcmdlTWFwLCB0YWtlTGFzdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBSZWdpc3RlckRldmljZVNlcnZpY2Uge1xuICByZWFkb25seSBfbG9hZGluZzogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0KCk7XG4gIHJlYWRvbmx5IF9saW1pdDogQmVoYXZpb3JTdWJqZWN0PElEZXZpY2VSZWdpc3RyYXRpb25MaW1pdD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHtcbiAgICBpc1JlYWNoZWQ6IGZhbHNlXG4gIH0pO1xuICByZWFkb25seSBfZGV2aWNlUmVnaXN0cmF0aW9uUmVxdWVzdHM6IEJlaGF2aW9yU3ViamVjdDx7XG4gICAgZGF0YTogSURldmljZVJlZ2lzdHJhdGlvbltdO1xuICAgIHBhZ2luZz86IFBhZ2luZzxJRGV2aWNlUmVnaXN0cmF0aW9uPjtcbiAgfT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHsgZGF0YTogW10gfSk7XG4gIHJlYWRvbmx5IGRldmljZVJlZ2lzdHJhdGlvblJlcXVlc3RzJDogT2JzZXJ2YWJsZTx7XG4gICAgZGF0YTogSURldmljZVJlZ2lzdHJhdGlvbltdO1xuICAgIHBhZ2luZz86IFBhZ2luZzxJRGV2aWNlUmVnaXN0cmF0aW9uPjtcbiAgfT4gPSB0aGlzLl9kZXZpY2VSZWdpc3RyYXRpb25SZXF1ZXN0cy5hc09ic2VydmFibGUoKTtcbiAgcmVhZG9ubHkgbG9hZGluZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLl9sb2FkaW5nLmFzT2JzZXJ2YWJsZSgpO1xuICByZWFkb25seSBsaW1pdCQ6IE9ic2VydmFibGU8SURldmljZVJlZ2lzdHJhdGlvbkxpbWl0PiA9IHRoaXMuX2xpbWl0LmFzT2JzZXJ2YWJsZSgpO1xuICBwYWdpbmc6IFBhZ2luZzxJRGV2aWNlUmVnaXN0cmF0aW9uPjtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRldmljZVJlZ1VybCA9ICcvZGV2aWNlcmVnaXN0cmF0aW9uJztcbiAgcHJpdmF0ZSBlbmRTdWJzY3JpcHRpb25zOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgZGV2aWNlUmVnU2VydmljZTogRGV2aWNlUmVnaXN0cmF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlXG4gICkge31cblxuICBpc0RldmljZVJlZ2lzdHJhdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMucm91dGVyLCAndXJsJykgPT09IHRoaXMuZGV2aWNlUmVnVXJsO1xuICB9XG5cbiAgaW50ZXJuYWxMaXN0VXBkYXRlKFxuICAgIGRldmljZVJlcXVlc3RzOiBJRGV2aWNlUmVnaXN0cmF0aW9uW10sXG4gICAgcGFnaW5nT2JqZWN0PzogUGFnaW5nPElEZXZpY2VSZWdpc3RyYXRpb24+XG4gICkge1xuICAgIGxldCB7IHBhZ2luZywgZGF0YSB9ID0gdGhpcy5fZGV2aWNlUmVnaXN0cmF0aW9uUmVxdWVzdHMuZ2V0VmFsdWUoKTtcbiAgICBpZiAocGFnaW5nT2JqZWN0KSB7XG4gICAgICBwYWdpbmcgPSBwYWdpbmdPYmplY3Q7XG4gICAgfVxuICAgIGRhdGEgPSBbLi4uZGF0YSwgLi4uZGV2aWNlUmVxdWVzdHNdLmZpbHRlcihkZXZpY2VSZXEgPT4gZGV2aWNlUmVxLnR5cGUgIT09ICdjOHlfRGF0YUJyb2tlcicpO1xuICAgIHRoaXMuX2RldmljZVJlZ2lzdHJhdGlvblJlcXVlc3RzLm5leHQoeyBkYXRhLCBwYWdpbmcgfSk7XG4gIH1cblxuICBvbkRldmljZUJvb3RzdHJhcChic0RhdGE6IElSZWFsdGltZURldmljZUJvb3RzdHJhcCkge1xuICAgIGNvbnN0IHsgaWQsIHN0YXR1cyB9ID0gYnNEYXRhO1xuICAgIHRoaXMuX2RldmljZVJlZ2lzdHJhdGlvblJlcXVlc3RzLm5leHQoe1xuICAgICAgZGF0YTogdGhpcy51cGRhdGVTdGF0dXNCeUlkKGlkLCBzdGF0dXMpXG4gICAgfSk7XG4gIH1cblxuICBsaXN0KHBhZ2VTaXplID0gMTAwKSB7XG4gICAgdGhpcy5fbG9hZGluZy5uZXh0KHRydWUpO1xuICAgIHRoaXMuX2RldmljZVJlZ2lzdHJhdGlvblJlcXVlc3RzLm5leHQoeyBkYXRhOiBbXSwgcGFnaW5nOiB1bmRlZmluZWQgfSk7XG5cbiAgICBmcm9tKHRoaXMuZGV2aWNlUmVnU2VydmljZS5saXN0KHsgcGFnZVNpemUsIHdpdGhUb3RhbFBhZ2VzOiB0cnVlIH0pKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmVuZFN1YnNjcmlwdGlvbnMpLFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLmxpbWl0KCkpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKFxuICAgICAgICByZXMgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZGF0YSwgcGFnaW5nIH0gPSByZXM7XG4gICAgICAgICAgdGhpcy5pbnRlcm5hbExpc3RVcGRhdGUoZGF0YSwgcGFnaW5nKTtcbiAgICAgICAgICB0aGlzLl9sb2FkaW5nLm5leHQoZmFsc2UpO1xuICAgICAgICB9LFxuICAgICAgICBlcnIgPT4ge1xuICAgICAgICAgIHRoaXMuX2xvYWRpbmcubmV4dChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShlcnIpO1xuICAgICAgICB9XG4gICAgICApO1xuICB9XG5cbiAgY3JlYXRlTXVsdGlwbGUobmV3RGV2aWNlUmVxdWVzdHM6IElEZXZpY2VSZWdpc3RyYXRpb25DcmVhdGVbXSkge1xuICAgIGlmIChuZXdEZXZpY2VSZXF1ZXN0cyAmJiBuZXdEZXZpY2VSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9sb2FkaW5nLm5leHQodHJ1ZSk7XG4gICAgICBjb25zdCBuZXdSZXF1ZXN0cyQgPSBuZXdEZXZpY2VSZXF1ZXN0cy5tYXAoZWxlbWVudCA9PiB7XG4gICAgICAgIHJldHVybiBmcm9tKFxuICAgICAgICAgIHRoaXMuZGV2aWNlUmVnU2VydmljZS5jcmVhdGUoZWxlbWVudCkuY2F0Y2goKGVycjogSVJlc3VsdDxJRGV2aWNlUmVnaXN0cmF0aW9uPikgPT4gKHtcbiAgICAgICAgICAgIHJlczogZXJyLnJlcyxcbiAgICAgICAgICAgIGRhdGE6IHsgLi4uZXJyLmRhdGEsIGlkOiBlbGVtZW50LmlkIH1cbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBncm91cGVkUmVxdWVzdHM6IHtcbiAgICAgICAgc3VjY2VzczogSURldmljZVJlZ2lzdHJhdGlvbltdO1xuICAgICAgICBmYWlsZWQ6IElEZXZpY2VSZWdpc3RyYXRpb25bXTtcbiAgICAgIH0gPSB7XG4gICAgICAgIHN1Y2Nlc3M6IFtdLFxuICAgICAgICBmYWlsZWQ6IFtdXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gZm9ya0pvaW4obmV3UmVxdWVzdHMkKS5waXBlKFxuICAgICAgICBtZXJnZU1hcChyZXNwID0+XG4gICAgICAgICAgcmVzcC5tYXAoZWwgPT4ge1xuICAgICAgICAgICAgZWwucmVzLm9rXG4gICAgICAgICAgICAgID8gZ3JvdXBlZFJlcXVlc3RzLnN1Y2Nlc3MucHVzaChlbC5kYXRhKVxuICAgICAgICAgICAgICA6IGdyb3VwZWRSZXF1ZXN0cy5mYWlsZWQucHVzaChlbC5kYXRhKTtcbiAgICAgICAgICAgIHJldHVybiBncm91cGVkUmVxdWVzdHM7XG4gICAgICAgICAgfSlcbiAgICAgICAgKSxcbiAgICAgICAgdGFrZUxhc3QoMSksXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmludGVybmFsTGlzdFVwZGF0ZShncm91cGVkUmVxdWVzdHMuc3VjY2Vzcyk7XG4gICAgICAgICAgdGhpcy5fbG9hZGluZy5uZXh0KGZhbHNlKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlKGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2FkaW5nLm5leHQodHJ1ZSk7XG4gICAgZnJvbSh0aGlzLmRldmljZVJlZ1NlcnZpY2UuZGVsZXRlKGlkKSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmVuZFN1YnNjcmlwdGlvbnMpKVxuICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2RldmljZVJlZ2lzdHJhdGlvblJlcXVlc3RzLm5leHQoe1xuICAgICAgICAgICAgZGF0YTogdGhpcy5yZW1vdmVEZXZpY2VSZWdpc3RyYXRpb25SZXF1ZXN0QnlJZChpZClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLl9sb2FkaW5nLm5leHQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnRGV2aWNlIHJlZ2lzdHJhdGlvbiBjYW5jZWxsZWQuJykpO1xuICAgICAgICB9LFxuICAgICAgICBlcnIgPT4ge1xuICAgICAgICAgIHRoaXMuX2xvYWRpbmcubmV4dChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShlcnIpO1xuICAgICAgICB9XG4gICAgICApO1xuICB9XG5cbiAgYWNjZXB0KHJlcXVlc3Q6IElEZXZpY2VSZWdpc3RyYXRpb24pIHtcbiAgICB0aGlzLl9sb2FkaW5nLm5leHQodHJ1ZSk7XG4gICAgY29uc3QgcGF5bG9hZCA9IHBpY2socmVxdWVzdCwgWydpZCcsICdzZWN1cml0eVRva2VuJ10pO1xuICAgIGZyb20odGhpcy5kZXZpY2VSZWdTZXJ2aWNlLmFjY2VwdChwYXlsb2FkKSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmVuZFN1YnNjcmlwdGlvbnMpKVxuICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2RldmljZVJlZ2lzdHJhdGlvblJlcXVlc3RzLm5leHQoe1xuICAgICAgICAgICAgZGF0YTogdGhpcy5yZW1vdmVEZXZpY2VSZWdpc3RyYXRpb25SZXF1ZXN0QnlJZChwYXlsb2FkLmlkKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMubGltaXQoKTtcbiAgICAgICAgICB0aGlzLl9sb2FkaW5nLm5leHQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnRGV2aWNlIHJlZ2lzdHJhdGlvbiBhY2NlcHRlZC4nKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgdGhpcy5fbG9hZGluZy5uZXh0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGVycik7XG4gICAgICAgIH1cbiAgICAgICk7XG4gIH1cblxuICBhY2NlcHRBbGwoKSB7XG4gICAgY29uc3QgYWNjZXB0ZWREZXZpY2VSZXF1ZXN0czogSURldmljZVJlZ2lzdHJhdGlvbkFjY2VwdFtdID0gW107XG4gICAgY29uc3QgZmFpbGVkRGV2aWNlUmVxdWVzdHM6IElEZXZpY2VSZWdpc3RyYXRpb25BY2NlcHRbXSA9IFtdO1xuICAgIHRoaXMuX2xvYWRpbmcubmV4dCh0cnVlKTtcblxuICAgIGZyb20odGhpcy5kZXZpY2VSZWdTZXJ2aWNlLmFjY2VwdEFsbCgpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmVuZFN1YnNjcmlwdGlvbnMpLFxuICAgICAgICBtYXAoKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgICAgZGF0YS5tYXAoZGV2aWNlUmVnaXN0cmF0aW9uUmVxdWVzdCA9PiB7XG4gICAgICAgICAgICBpZiAoZGV2aWNlUmVnaXN0cmF0aW9uUmVxdWVzdC5zdWNjZXNzZnVsKSB7XG4gICAgICAgICAgICAgIGFjY2VwdGVkRGV2aWNlUmVxdWVzdHMucHVzaChkZXZpY2VSZWdpc3RyYXRpb25SZXF1ZXN0KTtcbiAgICAgICAgICAgICAgdGhpcy5yZW1vdmVEZXZpY2VSZWdpc3RyYXRpb25SZXF1ZXN0QnlJZChkZXZpY2VSZWdpc3RyYXRpb25SZXF1ZXN0LmlkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZhaWxlZERldmljZVJlcXVlc3RzLnB1c2goZGV2aWNlUmVnaXN0cmF0aW9uUmVxdWVzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH0pLFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgLy8gdXBkYXRlIHJlbmRlcmVkIGxpc3Qgd2l0aCBzdWNjZXNzZnVsIGFjY2VwdGVkIGRldmljZSByZWdpc3RyYXRpb25zXG4gICAgICAgICAgLy8gc2VlOiB0aGlzLnVwZGF0ZVN0YXR1c0J5SWQoLi4uKVxuICAgICAgICAgIHRoaXMuaW50ZXJuYWxMaXN0VXBkYXRlKFtdKTtcbiAgICAgICAgICB0aGlzLmxpbWl0KCk7XG4gICAgICAgICAgdGhpcy5fbG9hZGluZy5uZXh0KGZhbHNlKTtcbiAgICAgICAgICBpZiAoZmFpbGVkRGV2aWNlUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2Uud2FybmluZyhcbiAgICAgICAgICAgICAgZ2V0dGV4dCgnQ291bGQgbm90IGFjY2VwdCBhbGwgcGVuZGluZyByZWdpc3RyYXRpb24gcmVxdWVzdHMuJyksXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGZhaWxlZERldmljZVJlcXVlc3RzLFxuICAgICAgICAgICAgICAgICAgYWNjZXB0ZWREZXZpY2VSZXF1ZXN0c1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2VzcyhnZXR0ZXh0KCdBY2NlcHRlZCBhbGwgcGVuZGluZyByZWdpc3RyYXRpb24gcmVxdWVzdHMuJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICAvLyBlbXB0eSBieSBkZXNpZ25cbiAgICAgICAgfSxcbiAgICAgICAgZXJyID0+IHtcbiAgICAgICAgICB0aGlzLl9sb2FkaW5nLm5leHQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXJyKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIGxpbWl0KCkge1xuICAgIGZyb20odGhpcy5kZXZpY2VSZWdTZXJ2aWNlLmxpbWl0KCkpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5lbmRTdWJzY3JpcHRpb25zKSlcbiAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgIHJlcyA9PiB0aGlzLl9saW1pdC5uZXh0KHJlcy5kYXRhKSxcbiAgICAgICAgZXJyID0+IHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXJyKVxuICAgICAgKTtcbiAgfVxuXG4gIGdldFJlcXVlc3RCeVN0YXR1cyhzdGF0dXM6IERldmljZVJlZ2lzdHJhdGlvblN0YXR1cyk6IElEZXZpY2VSZWdpc3RyYXRpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2RldmljZVJlZ2lzdHJhdGlvblJlcXVlc3RzLmdldFZhbHVlKCkuZGF0YS5maWx0ZXIocmVxID0+IHJlcS5zdGF0dXMgPT09IHN0YXR1cyk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmVuZFN1YnNjcmlwdGlvbnMubmV4dCgpO1xuICAgIHRoaXMuZW5kU3Vic2NyaXB0aW9ucy5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdGF0dXNCeUlkKGlkOiBzdHJpbmcsIHN0YXR1czogRGV2aWNlUmVnaXN0cmF0aW9uU3RhdHVzKSB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLl9kZXZpY2VSZWdpc3RyYXRpb25SZXF1ZXN0cy5nZXRWYWx1ZSgpLmRhdGE7XG4gICAgY29uc3QgbWF0Y2hpbmdFbGVtZW50SW5kZXggPSBpdGVtcy5maW5kSW5kZXgoZWxlbWVudCA9PiBlbGVtZW50LmlkID09PSBpZCk7XG4gICAgaWYgKG1hdGNoaW5nRWxlbWVudEluZGV4ID49IDApIHtcbiAgICAgIGl0ZW1zW21hdGNoaW5nRWxlbWVudEluZGV4XS5zdGF0dXMgPSBzdGF0dXM7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRGV2aWNlUmVnaXN0cmF0aW9uUmVxdWVzdEJ5SWQoaWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5fZGV2aWNlUmVnaXN0cmF0aW9uUmVxdWVzdHMuZ2V0VmFsdWUoKS5kYXRhO1xuICAgIGNvbnN0IG1hdGNoaW5nRWxlbWVudEluZGV4ID0gaXRlbXMuZmluZEluZGV4KGVsZW1lbnQgPT4gZWxlbWVudC5pZCA9PT0gaWQpO1xuICAgIGlmIChtYXRjaGluZ0VsZW1lbnRJbmRleCA+PSAwKSB7XG4gICAgICBpdGVtcy5zcGxpY2UobWF0Y2hpbmdFbGVtZW50SW5kZXgsIDEpO1xuICAgIH1cbiAgICB0aGlzLl9sb2FkaW5nLm5leHQoZmFsc2UpO1xuICAgIHJldHVybiBpdGVtcztcbiAgfVxufVxuIl19