@iotize/ionic
Version:
Iotize specific building blocks on top of @ionic/angular.
146 lines • 20.6 kB
JavaScript
import { Injectable } from '@angular/core';
import { isCodeError } from '@iotize/common/error';
import { PathParameter, TapError, } from '@iotize/tap';
import { TapRequestFrame } from '@iotize/tap/client/api';
import { TapClientError } from '@iotize/tap/client/impl';
import { CurrentDeviceService } from '../current-device.service';
import { debug } from '../logger';
import { TapApiExplorerService } from '../tap-api-explorer.service';
import { TapInfoCacheService } from './tap-info-cache.service';
import { TapInfoConfigService } from './tap-info-config.service';
import { createCacheKey } from './utility';
import * as i0 from "@angular/core";
import * as i1 from "./tap-info-config.service";
import * as i2 from "./tap-info-cache.service";
import * as i3 from "../current-device.service";
import * as i4 from "../tap-api-explorer.service";
const TAG = 'TapInfoDAOService';
/**
* Tap info Data Access Object service for real LwM2M resources
*/
export class TapInfoDAOService {
constructor(tapInfoConfigService, tapInfoCacheService, tapService, tapApiExplorerService) {
this.tapInfoConfigService = tapInfoConfigService;
this.tapInfoCacheService = tapInfoCacheService;
this.tapService = tapService;
this.tapApiExplorerService = tapApiExplorerService;
}
hasPut(result) {
return this._getPut(result) !== undefined;
}
_getPut(key) {
const infoConfig = this.tapInfoConfigService.findByKey(key);
if (!infoConfig?.putValue) {
const nativeLwm2mRequestTemplate = this.tapApiExplorerService.getByUrl(TapRequestFrame.MethodType.PUT, key.key);
if (!nativeLwm2mRequestTemplate) {
return undefined;
}
return async (tap, value, ...pathParameters) => {
const request = pathParameters.length > 0
? fillWithPathParameters(nativeLwm2mRequestTemplate, pathParameters)
: { ...nativeLwm2mRequestTemplate };
request.body = value;
return await tap.lwm2m.execute(request);
};
}
else {
return infoConfig.putValue;
}
}
async put(key, value) {
const tap = this.tapService.tapOrUndefined;
const put = this._getPut(key);
if (!put) {
throw new Error(`Tap resource '${key.key}' is not editable`);
}
if (!tap) {
throw new Error(`No tap selected`);
}
return put(tap, value, ...(key.params || [])).then((result) => {
result.successful();
return result;
});
}
async get(key) {
try {
const tap = this.tapService.tapOrUndefined;
debug(TAG, `refreshKey "${createCacheKey(key)}" start`);
if (!tap) {
throw TapClientError.notConnectedError();
}
this.tapInfoCacheService.clearKey(key);
let reader;
const infoConfig = this.tapInfoConfigService.findByKey(key);
if (!infoConfig?.getValue) {
const nativeLwm2mRequestTemplate = this.tapApiExplorerService.getByUrl(TapRequestFrame.MethodType.GET, key.key);
if (nativeLwm2mRequestTemplate) {
let nativeLwm2mRequest = nativeLwm2mRequestTemplate;
if (key.params) {
nativeLwm2mRequest = fillWithPathParameters(nativeLwm2mRequestTemplate, key.params);
}
reader = async (tap) => {
return (await tap.lwm2m.execute(nativeLwm2mRequest)).body();
};
}
else {
throw new Error(`Unknown Tap Resource 'GET ${key.key}'`);
}
}
else {
reader = infoConfig.getValue;
}
if (!reader) {
// Check resource info exist
return this.tapInfoCacheService.setKeyInfo(key, {
loadDate: new Date(),
});
}
if (!tap.isConnected()) {
throw TapClientError.notConnectedError();
}
// let cacheKey = this._createCacheKey(key, params);
const responseOrBody = await reader(tap, ...(key.params || []));
const body = typeof responseOrBody['body'] === 'function'
? responseOrBody['body']()
: responseOrBody;
return this.tapInfoCacheService.setKeyValue(key, body);
}
catch (err) {
this.tapInfoCacheService.setKeyError(key, err);
if (isCodeError(TapError.Code.ResponseStatusError, err)) {
// Do not throw, tap request was successful
return;
}
throw err;
}
}
}
/** @nocollapse */ TapInfoDAOService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TapInfoDAOService, deps: [{ token: i1.TapInfoConfigService }, { token: i2.TapInfoCacheService }, { token: i3.CurrentDeviceService }, { token: i4.TapApiExplorerService }], target: i0.ɵɵFactoryTarget.Injectable });
/** @nocollapse */ TapInfoDAOService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TapInfoDAOService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TapInfoDAOService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: i1.TapInfoConfigService }, { type: i2.TapInfoCacheService }, { type: i3.CurrentDeviceService }, { type: i4.TapApiExplorerService }]; } });
function fillWithPathParameters(nativeLwm2mRequest, params) {
const parameters = PathParameter.extractParams(nativeLwm2mRequest.path);
if (parameters.length !== params.length) {
throw new Error(`${nativeLwm2mRequest.pathAlias || nativeLwm2mRequest.path} expects ${parameters.length} path parameters but given ${params.length}`);
}
if (parameters.length > 0) {
if (parameters.length === 1) {
nativeLwm2mRequest = {
...nativeLwm2mRequest,
pathParameters: {
[parameters[0]]: params[0],
},
};
}
else {
throw new Error(`${nativeLwm2mRequest.pathAlias || nativeLwm2mRequest.path} more than 1 path parameter is not implemented yet`);
}
}
return nativeLwm2mRequest;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLWluZm8tZGFvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pb3RpemUtaW9uaWMvc3JjL2xpYi90YXAtaW5mby90YXAtaW5mby1kYW8uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsYUFBYSxFQUViLFFBQVEsR0FFVCxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFNcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFdBQVcsQ0FBQzs7Ozs7O0FBRTNDLE1BQU0sR0FBRyxHQUFHLG1CQUFtQixDQUFDO0FBRWhDOztHQUVHO0FBSUgsTUFBTSxPQUFPLGlCQUFpQjtJQUM1QixZQUNVLG9CQUEwQyxFQUMxQyxtQkFBd0MsRUFDeEMsVUFBZ0MsRUFDaEMscUJBQTRDO1FBSDVDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxlQUFVLEdBQVYsVUFBVSxDQUFzQjtRQUNoQywwQkFBcUIsR0FBckIs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QyxDQUFDO2lCQUMzQjthQUNGLENBQUM7U0FDSDthQUFNO1lBQ0wsTUFBTSxJQUFJLEtBQUssQ0FDYixHQUNFLGtCQUFrQixDQUFDLFNBQVMsSUFBSSxrQkFBa0IsQ0FBQyxJQUNyRCxvREFBb0QsQ0FDckQsQ0FBQztTQUNIO0tBQ0Y7SUFDRCxPQUFPLGtCQUFrQixDQUFDO0FBQzVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc0NvZGVFcnJvciB9IGZyb20gJ0Bpb3RpemUvY29tbW9uL2Vycm9yJztcbmltcG9ydCB7XG4gIFBhdGhQYXJhbWV0ZXIsXG4gIFNlcnZpY2VDYWxsVHlwZSxcbiAgVGFwRXJyb3IsXG4gIFRhcFJlc3BvbnNlLFxufSBmcm9tICdAaW90aXplL3RhcCc7XG5pbXBvcnQgeyBUYXBSZXF1ZXN0RnJhbWUgfSBmcm9tICdAaW90aXplL3RhcC9jbGllbnQvYXBpJztcbmltcG9ydCB7IFRhcENsaWVudEVycm9yIH0gZnJvbSAnQGlvdGl6ZS90YXAvY2xpZW50L2ltcGwnO1xuaW1wb3J0IHsgQ3VycmVudERldmljZVNlcnZpY2UgfSBmcm9tICcuLi9jdXJyZW50LWRldmljZS5zZXJ2aWNlJztcbmltcG9ydCB7IGRlYnVnIH0gZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IFRhcEFwaUV4cGxvcmVyU2VydmljZSB9IGZyb20gJy4uL3RhcC1hcGktZXhwbG9yZXIuc2VydmljZSc7XG5pbXBvcnQge1xuICBUYXBDb25maWdHZXRWYWx1ZVR5cGUsXG4gIFRhcENvbmZpZ1B1dFZhbHVlVHlwZSxcbn0gZnJvbSAnLi4vdGFwLWNvbmZpZy1pdGVtL3RhcC1jb25maWctaXRlbS1iYXNlJztcbmltcG9ydCB7IFRhcEluZm9LZXkgfSBmcm9tICcuL2RlZmluaXRpb25zJztcbmltcG9ydCB7IFRhcEluZm9DYWNoZVNlcnZpY2UgfSBmcm9tICcuL3RhcC1pbmZvLWNhY2hlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGFwSW5mb0NvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL3RhcC1pbmZvLWNvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IGNyZWF0ZUNhY2hlS2V5IH0gZnJvbSAnLi91dGlsaXR5JztcblxuY29uc3QgVEFHID0gJ1RhcEluZm9EQU9TZXJ2aWNlJztcblxuLyoqXG4gKiBUYXAgaW5mbyBEYXRhIEFjY2VzcyBPYmplY3Qgc2VydmljZSBmb3IgcmVhbCBMd00yTSByZXNvdXJjZXNcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFRhcEluZm9EQU9TZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB0YXBJbmZvQ29uZmlnU2VydmljZTogVGFwSW5mb0NvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0YXBJbmZvQ2FjaGVTZXJ2aWNlOiBUYXBJbmZvQ2FjaGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGFwU2VydmljZTogQ3VycmVudERldmljZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0YXBBcGlFeHBsb3JlclNlcnZpY2U6IFRhcEFwaUV4cGxvcmVyU2VydmljZVxuICApIHt9XG5cbiAgaGFzUHV0KHJlc3VsdDogVGFwSW5mb0tleSk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9nZXRQdXQocmVzdWx0KSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UHV0KGtleTogVGFwSW5mb0tleSk6IFRhcENvbmZpZ1B1dFZhbHVlVHlwZTxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpbmZvQ29uZmlnID0gdGhpcy50YXBJbmZvQ29uZmlnU2VydmljZS5maW5kQnlLZXkoa2V5KTtcbiAgICBpZiAoIWluZm9Db25maWc/LnB1dFZhbHVlKSB7XG4gICAgICBjb25zdCBuYXRpdmVMd20ybVJlcXVlc3RUZW1wbGF0ZSA9IHRoaXMudGFwQXBpRXhwbG9yZXJTZXJ2aWNlLmdldEJ5VXJsKFxuICAgICAgICBUYXBSZXF1ZXN0RnJhbWUuTWV0aG9kVHlwZS5QVVQsXG4gICAgICAgIGtleS5rZXlcbiAgICAgICk7XG4gICAgICBpZiAoIW5hdGl2ZUx3bTJtUmVxdWVzdFRlbXBsYXRlKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXN5bmMgKHRhcCwgdmFsdWUsIC4uLnBhdGhQYXJhbWV0ZXJzKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPVxuICAgICAgICAgIHBhdGhQYXJhbWV0ZXJzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gZmlsbFdpdGhQYXRoUGFyYW1ldGVycyhuYXRpdmVMd20ybVJlcXVlc3RUZW1wbGF0ZSwgcGF0aFBhcmFtZXRlcnMpXG4gICAgICAgICAgICA6IHsgLi4ubmF0aXZlTHdtMm1SZXF1ZXN0VGVtcGxhdGUgfTtcbiAgICAgICAgcmVxdWVzdC5ib2R5ID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBhd2FpdCB0YXAubHdtMm0uZXhlY3V0ZShyZXF1ZXN0KTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbmZvQ29uZmlnLnB1dFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHB1dDxWYWx1ZVR5cGU+KFxuICAgIGtleTogVGFwSW5mb0tleSxcbiAgICB2YWx1ZTogVmFsdWVUeXBlXG4gICk6IFByb21pc2U8VGFwUmVzcG9uc2U8YW55Pj4ge1xuICAgIGNvbnN0IHRhcCA9IHRoaXMudGFwU2VydmljZS50YXBPclVuZGVmaW5lZDtcbiAgICBjb25zdCBwdXQgPSB0aGlzLl9nZXRQdXQoa2V5KTtcbiAgICBpZiAoIXB1dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYXAgcmVzb3VyY2UgJyR7a2V5LmtleX0nIGlzIG5vdCBlZGl0YWJsZWApO1xuICAgIH1cbiAgICBpZiAoIXRhcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB0YXAgc2VsZWN0ZWRgKTtcbiAgICB9XG4gICAgcmV0dXJuIHB1dCh0YXAsIHZhbHVlLCAuLi4oa2V5LnBhcmFtcyB8fCBbXSkpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgcmVzdWx0LnN1Y2Nlc3NmdWwoKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBnZXQoa2V5OiBUYXBJbmZvS2V5KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRhcCA9IHRoaXMudGFwU2VydmljZS50YXBPclVuZGVmaW5lZDtcbiAgICAgIGRlYnVnKFRBRywgYHJlZnJlc2hLZXkgXCIke2NyZWF0ZUNhY2hlS2V5KGtleSl9XCIgc3RhcnRgKTtcbiAgICAgIGlmICghdGFwKSB7XG4gICAgICAgIHRocm93IFRhcENsaWVudEVycm9yLm5vdENvbm5lY3RlZEVycm9yKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnRhcEluZm9DYWNoZVNlcnZpY2UuY2xlYXJLZXkoa2V5KTtcblxuICAgICAgbGV0IHJlYWRlcjogVGFwQ29uZmlnR2V0VmFsdWVUeXBlPGFueT4gfCBmYWxzZSB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGluZm9Db25maWcgPSB0aGlzLnRhcEluZm9Db25maWdTZXJ2aWNlLmZpbmRCeUtleShrZXkpO1xuICAgICAgaWYgKCFpbmZvQ29uZmlnPy5nZXRWYWx1ZSkge1xuICAgICAgICBjb25zdCBuYXRpdmVMd20ybVJlcXVlc3RUZW1wbGF0ZSA9IHRoaXMudGFwQXBpRXhwbG9yZXJTZXJ2aWNlLmdldEJ5VXJsKFxuICAgICAgICAgIFRhcFJlcXVlc3RGcmFtZS5NZXRob2RUeXBlLkdFVCxcbiAgICAgICAgICBrZXkua2V5XG4gICAgICAgICk7XG4gICAgICAgIGlmIChuYXRpdmVMd20ybVJlcXVlc3RUZW1wbGF0ZSkge1xuICAgICAgICAgIGxldCBuYXRpdmVMd20ybVJlcXVlc3QgPSBuYXRpdmVMd20ybVJlcXVlc3RUZW1wbGF0ZTtcbiAgICAgICAgICBpZiAoa2V5LnBhcmFtcykge1xuICAgICAgICAgICAgbmF0aXZlTHdtMm1SZXF1ZXN0ID0gZmlsbFdpdGhQYXRoUGFyYW1ldGVycyhcbiAgICAgICAgICAgICAgbmF0aXZlTHdtMm1SZXF1ZXN0VGVtcGxhdGUsXG4gICAgICAgICAgICAgIGtleS5wYXJhbXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlYWRlciA9IGFzeW5jICh0YXApID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoYXdhaXQgdGFwLmx3bTJtLmV4ZWN1dGUobmF0aXZlTHdtMm1SZXF1ZXN0KSkuYm9keSgpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIFRhcCBSZXNvdXJjZSAnR0VUICR7a2V5LmtleX0nYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlYWRlciA9IGluZm9Db25maWcuZ2V0VmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoIXJlYWRlcikge1xuICAgICAgICAvLyBDaGVjayByZXNvdXJjZSBpbmZvIGV4aXN0XG4gICAgICAgIHJldHVybiB0aGlzLnRhcEluZm9DYWNoZVNlcnZpY2Uuc2V0S2V5SW5mbyhrZXksIHtcbiAgICAgICAgICBsb2FkRGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRhcC5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgIHRocm93IFRhcENsaWVudEVycm9yLm5vdENvbm5lY3RlZEVycm9yKCk7XG4gICAgICB9XG4gICAgICAvLyBsZXQgY2FjaGVLZXkgPSB0aGlzLl9jcmVhdGVDYWNoZUtleShrZXksIHBhcmFtcyk7XG4gICAgICBjb25zdCByZXNwb25zZU9yQm9keSA9IGF3YWl0IHJlYWRlcih0YXAsIC4uLihrZXkucGFyYW1zIHx8IFtdKSk7XG4gICAgICBjb25zdCBib2R5ID1cbiAgICAgICAgdHlwZW9mIHJlc3BvbnNlT3JCb2R5Wydib2R5J10gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IHJlc3BvbnNlT3JCb2R5Wydib2R5J10oKVxuICAgICAgICAgIDogcmVzcG9uc2VPckJvZHk7XG4gICAgICByZXR1cm4gdGhpcy50YXBJbmZvQ2FjaGVTZXJ2aWNlLnNldEtleVZhbHVlKGtleSwgYm9keSk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIHRoaXMudGFwSW5mb0NhY2hlU2VydmljZS5zZXRLZXlFcnJvcihrZXksIGVycik7XG4gICAgICBpZiAoaXNDb2RlRXJyb3IoVGFwRXJyb3IuQ29kZS5SZXNwb25zZVN0YXR1c0Vycm9yLCBlcnIpKSB7XG4gICAgICAgIC8vIERvIG5vdCB0aHJvdywgdGFwIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaWxsV2l0aFBhdGhQYXJhbWV0ZXJzKFxuICBuYXRpdmVMd20ybVJlcXVlc3Q6IFNlcnZpY2VDYWxsVHlwZTxhbnksIGFueT4sXG4gIHBhcmFtczogYW55W11cbik6IFNlcnZpY2VDYWxsVHlwZTxhbnksIGFueT4ge1xuICBjb25zdCBwYXJhbWV0ZXJzID0gUGF0aFBhcmFtZXRlci5leHRyYWN0UGFyYW1zKG5hdGl2ZUx3bTJtUmVxdWVzdC5wYXRoKTtcbiAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoICE9PSBwYXJhbXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7bmF0aXZlTHdtMm1SZXF1ZXN0LnBhdGhBbGlhcyB8fCBuYXRpdmVMd20ybVJlcXVlc3QucGF0aH0gZXhwZWN0cyAke1xuICAgICAgICBwYXJhbWV0ZXJzLmxlbmd0aFxuICAgICAgfSBwYXRoIHBhcmFtZXRlcnMgYnV0IGdpdmVuICR7cGFyYW1zLmxlbmd0aH1gXG4gICAgKTtcbiAgfVxuICBpZiAocGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG4gICAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICBuYXRpdmVMd20ybVJlcXVlc3QgPSB7XG4gICAgICAgIC4uLm5hdGl2ZUx3bTJtUmVxdWVzdCxcbiAgICAgICAgcGF0aFBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBbcGFyYW1ldGVyc1swXV06IHBhcmFtc1swXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7XG4gICAgICAgICAgbmF0aXZlTHdtMm1SZXF1ZXN0LnBhdGhBbGlhcyB8fCBuYXRpdmVMd20ybVJlcXVlc3QucGF0aFxuICAgICAgICB9IG1vcmUgdGhhbiAxIHBhdGggcGFyYW1ldGVyIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXRgXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmF0aXZlTHdtMm1SZXF1ZXN0O1xufVxuIl19