@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
168 lines • 23.1 kB
JavaScript
import { Injectable } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { filter, map } from 'rxjs/operators';
import { DateContextQueryParamNames } from './widget-time-context.model';
import { WidgetTimeContextHelperService } from './widget-time-context-helper.service';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "./widget-time-context-helper.service";
export class WidgetTimeContextQueryService {
constructor(activatedRoute, helperService, router) {
this.activatedRoute = activatedRoute;
this.helperService = helperService;
this.router = router;
}
/**
* Returns observable that emits date context query params every time query params change.
* Invalid values are filtered out.
*
* @returns Observable of date context query params.
*/
queryParamsChange$() {
return this.activatedRoute.queryParams.pipe(map((params) => this.processQueryParams(params)), filter((params) => this.queryParamsContainsTimeRange(params)));
}
/**
* Creates widget time context from query parameters.
* Interval data takes precedence over date time context described by date "from" and date "to",
* so if valid interval is provided, date "from" and date "to" are ignored, and they are recalculated
* with interval.
*
* @returns Widget time context state based on current query params or null if query params provide no valid context.
*/
dateTimeContextFromQueryParams() {
const realtime = this.parseRealtime(this.activatedRoute.snapshot.queryParams[DateContextQueryParamNames.DATE_CONTEXT_REALTIME]);
// trying to get date context from query params by interval first
const dateContextInterval = this.activatedRoute.snapshot.queryParams[DateContextQueryParamNames.DATE_CONTEXT_INTERVAL];
const aggregation = this.activatedRoute.snapshot.queryParams[DateContextQueryParamNames.DATE_CONTEXT_AGGREGATION];
const isValidInterval = this.helperService.isSelectableInterval(dateContextInterval);
if (isValidInterval) {
return {
date: this.helperService.getDateTimeContextByInterval(dateContextInterval),
interval: dateContextInterval,
realtime,
aggregation
};
}
// if date context by interval is not provided, try getting date "from" and date "to" from query params
const dateTimeContextFromQueryParams = this.getDateContextFromQueryParams();
if (dateTimeContextFromQueryParams) {
return {
date: dateTimeContextFromQueryParams,
interval: 'custom',
realtime,
aggregation
};
}
return null;
}
/**
* Sets query parameters related to date time context.
* Valid interval (and other than 'custom') takes precedence over context described by date "from" and date "to".
* Interval and context described by date "from" and date "to" exclude each other.
*
* @param widgetTimeContextState Widget time context state.
*/
setDateContextQueryParams({ interval, date, realtime, aggregation }) {
let queryParams;
if (interval && interval !== 'custom') {
queryParams = {
dateContextInterval: interval,
dateContextRealtime: realtime,
dateContextAggregation: aggregation,
dateContextTo: null,
dateContextFrom: null
};
}
else {
queryParams = {
dateContextFrom: date[0].toISOString(),
dateContextTo: date[1].toISOString(),
dateContextRealtime: realtime,
dateContextAggregation: aggregation,
dateContextInterval: null
};
}
this.router.navigate([], {
relativeTo: this.activatedRoute,
queryParams,
queryParamsHandling: 'merge'
});
}
/**
* Clears all date time context related query parameters.
*/
clearQueryParams() {
const clearingQueryParams = {
dateContextFrom: null,
dateContextTo: null,
dateContextInterval: null,
dateContextRealtime: null,
dateContextAggregation: null
};
this.router.navigate([], {
relativeTo: this.activatedRoute,
queryParams: clearingQueryParams,
replaceUrl: true
});
}
/**
* Parses and validates date context from query params described by date "from" and date "to".
*
* @returns Date context as tuple of date "from" and date "to", or null if date context is invalid.
*/
getDateContextFromQueryParams() {
const dateContextFrom = this.activatedRoute.snapshot.queryParams[DateContextQueryParamNames.DATE_CONTEXT_FROM];
const dateContextTo = this.activatedRoute.snapshot.queryParams[DateContextQueryParamNames.DATE_CONTEXT_TO];
if (this.helperService.isValidDateRange(dateContextFrom, dateContextTo)) {
return [new Date(dateContextFrom), new Date(dateContextTo)];
}
return null;
}
/**
* Parses realtime query param.
*
* @returns Parsed realtime value or null.
*/
parseRealtime(realtime) {
return realtime === 'false' ? false : realtime === 'true' ? true : null;
}
/**
* Maps query params object to proper type.
*
* @param params Query parameters object with string values only.
*
* @returns Query params object of proper type.
*/
processQueryParams(params) {
const dateContextRealtime = this.parseRealtime(params.dateContextRealtime);
const dateContextInterval = this.helperService.isSelectableInterval(params.dateContextInterval)
? params.dateContextInterval
: null;
const dateContextAggregation = this.helperService.isValidAggregation(params.dateContextAggregation)
? params.dateContextAggregation
: null;
return { ...params, dateContextRealtime, dateContextInterval, dateContextAggregation };
}
/**
* Determines if provided query params contains valid time range.
*
* @param params Query parameters object.
*
* @returns True if query params contains valid time range, otherwise false.
*/
queryParamsContainsTimeRange(params) {
if (!params.dateContextInterval && !params.dateContextFrom && !params.dateContextTo) {
return false;
}
const intervalProvided = !!params.dateContextInterval;
const dateRangeValid = this.helperService.isValidDateRange(params.dateContextFrom, params.dateContextTo);
return intervalProvided || dateRangeValid;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetTimeContextQueryService, deps: [{ token: i1.ActivatedRoute }, { token: i2.WidgetTimeContextHelperService }, { token: i1.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetTimeContextQueryService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetTimeContextQueryService, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.WidgetTimeContextHelperService }, { type: i1.Router }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LXRpbWUtY29udGV4dC1xdWVyeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vY29yZS9kYXNoYm9hcmQvd2lnZXQtdGltZS1jb250ZXh0L3dpZGdldC10aW1lLWNvbnRleHQtcXVlcnkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekQsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsMEJBQTBCLEVBRzNCLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7Ozs7QUFNdEYsTUFBTSxPQUFPLDZCQUE2QjtJQUN4QyxZQUNVLGNBQThCLEVBQzlCLGFBQTZDLEVBQzdDLE1BQWM7UUFGZCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsa0JBQWEsR0FBYixhQUFhLENBQWdDO1FBQzdDLFdBQU0sR0FBTixNQUFNLENBQVE7SUFDckIsQ0FBQztJQUVKOzs7OztPQUtHO0lBQ0gsa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUN6QyxHQUFHLENBQUMsQ0FBQyxNQUFrRCxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDNUYsTUFBTSxDQUFDLENBQUMsTUFBbUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQzNGLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILDhCQUE4QjtRQUM1QixNQUFNLFFBQVEsR0FBRyxJQUFJLENB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QixFQUFFLHNCQUFzQixFQUFFLENBQUM7SUFDekYsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLDRCQUE0QixDQUFDLE1BQW1DO1FBQ3RFLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3BGLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQztRQUN0RCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUN4RCxNQUFNLENBQUMsZUFBZSxFQUN0QixNQUFNLENBQUMsYUFBYSxDQUNyQixDQUFDO1FBQ0YsT0FBTyxnQkFBZ0IsSUFBSSxjQUFjLENBQUM7SUFDNUMsQ0FBQzsrR0F2TFUsNkJBQTZCO21IQUE3Qiw2QkFBNkIsY0FEaEIsTUFBTTs7NEZBQ25CLDZCQUE2QjtrQkFEekMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgRGF0ZUNvbnRleHRRdWVyeVBhcmFtTmFtZXMsXG4gIElucHV0RGF0ZUNvbnRleHRRdWVyeVBhcmFtcyxcbiAgV2lkZ2V0VGltZUNvbnRleHRTdGF0ZVxufSBmcm9tICcuL3dpZGdldC10aW1lLWNvbnRleHQubW9kZWwnO1xuaW1wb3J0IHsgV2lkZ2V0VGltZUNvbnRleHRIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi93aWRnZXQtdGltZS1jb250ZXh0LWhlbHBlci5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGVUaW1lQ29udGV4dCB9IGZyb20gJy4uL3dpZGdldC1jaGFuZ2UtZXZlbnQubW9kZWwnO1xuaW1wb3J0IHsgYWdncmVnYXRpb25UeXBlIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgSW50ZXJ2YWwgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2ludGVydmFsLXBpY2tlcic7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgV2lkZ2V0VGltZUNvbnRleHRRdWVyeVNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIGhlbHBlclNlcnZpY2U6IFdpZGdldFRpbWVDb250ZXh0SGVscGVyU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyXG4gICkge31cblxuICAvKipcbiAgICogUmV0dXJucyBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgZGF0ZSBjb250ZXh0IHF1ZXJ5IHBhcmFtcyBldmVyeSB0aW1lIHF1ZXJ5IHBhcmFtcyBjaGFuZ2UuXG4gICAqIEludmFsaWQgdmFsdWVzIGFyZSBmaWx0ZXJlZCBvdXQuXG4gICAqXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgZGF0ZSBjb250ZXh0IHF1ZXJ5IHBhcmFtcy5cbiAgICovXG4gIHF1ZXJ5UGFyYW1zQ2hhbmdlJCgpOiBPYnNlcnZhYmxlPElucHV0RGF0ZUNvbnRleHRRdWVyeVBhcmFtcz4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2YXRlZFJvdXRlLnF1ZXJ5UGFyYW1zLnBpcGUoXG4gICAgICBtYXAoKHBhcmFtczogUmVjb3JkPERhdGVDb250ZXh0UXVlcnlQYXJhbU5hbWVzLCBzdHJpbmc+KSA9PiB0aGlzLnByb2Nlc3NRdWVyeVBhcmFtcyhwYXJhbXMpKSxcbiAgICAgIGZpbHRlcigocGFyYW1zOiBJbnB1dERhdGVDb250ZXh0UXVlcnlQYXJhbXMpID0+IHRoaXMucXVlcnlQYXJhbXNDb250YWluc1RpbWVSYW5nZShwYXJhbXMpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB3aWRnZXQgdGltZSBjb250ZXh0IGZyb20gcXVlcnkgcGFyYW1ldGVycy5cbiAgICogSW50ZXJ2YWwgZGF0YSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgZGF0ZSB0aW1lIGNvbnRleHQgZGVzY3JpYmVkIGJ5IGRhdGUgXCJmcm9tXCIgYW5kIGRhdGUgXCJ0b1wiLFxuICAgKiBzbyBpZiB2YWxpZCBpbnRlcnZhbCBpcyBwcm92aWRlZCwgZGF0ZSBcImZyb21cIiBhbmQgZGF0ZSBcInRvXCIgYXJlIGlnbm9yZWQsIGFuZCB0aGV5IGFyZSByZWNhbGN1bGF0ZWRcbiAgICogd2l0aCBpbnRlcnZhbC5cbiAgICpcbiAgICogQHJldHVybnMgV2lkZ2V0IHRpbWUgY29udGV4dCBzdGF0ZSBiYXNlZCBvbiBjdXJyZW50IHF1ZXJ5IHBhcmFtcyBvciBudWxsIGlmIHF1ZXJ5IHBhcmFtcyBwcm92aWRlIG5vIHZhbGlkIGNvbnRleHQuXG4gICAqL1xuICBkYXRlVGltZUNvbnRleHRGcm9tUXVlcnlQYXJhbXMoKTogV2lkZ2V0VGltZUNvbnRleHRTdGF0ZSB8IG51bGwge1xuICAgIGNvbnN0IHJlYWx0aW1lID0gdGhpcy5wYXJzZVJlYWx0aW1lKFxuICAgICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1tEYXRlQ29udGV4dFF1ZXJ5UGFyYW1OYW1lcy5EQVRFX0NPTlRFWFRfUkVBTFRJTUVdXG4gICAgKTtcbiAgICAvLyB0cnlpbmcgdG8gZ2V0IGRhdGUgY29udGV4dCBmcm9tIHF1ZXJ5IHBhcmFtcyBieSBpbnRlcnZhbCBmaXJzdFxuICAgIGNvbnN0IGRhdGVDb250ZXh0SW50ZXJ2YWwgPVxuICAgICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1tEYXRlQ29udGV4dFF1ZXJ5UGFyYW1OYW1lcy5EQVRFX0NPTlRFWFRfSU5URVJWQUxdO1xuICAgIGNvbnN0IGFnZ3JlZ2F0aW9uID1cbiAgICAgIHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbRGF0ZUNvbnRleHRRdWVyeVBhcmFtTmFtZXMuREFURV9DT05URVhUX0FHR1JFR0FUSU9OXTtcbiAgICBjb25zdCBpc1ZhbGlkSW50ZXJ2YWwgPSB0aGlzLmhlbHBlclNlcnZpY2UuaXNTZWxlY3RhYmxlSW50ZXJ2YWwoZGF0ZUNvbnRleHRJbnRlcnZhbCk7XG4gICAgaWYgKGlzVmFsaWRJbnRlcnZhbCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0ZTogdGhpcy5oZWxwZXJTZXJ2aWNlLmdldERhdGVUaW1lQ29udGV4dEJ5SW50ZXJ2YWwoZGF0ZUNvbnRleHRJbnRlcnZhbCksXG4gICAgICAgIGludGVydmFsOiBkYXRlQ29udGV4dEludGVydmFsLFxuICAgICAgICByZWFsdGltZSxcbiAgICAgICAgYWdncmVnYXRpb25cbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gaWYgZGF0ZSBjb250ZXh0IGJ5IGludGVydmFsIGlzIG5vdCBwcm92aWRlZCwgdHJ5IGdldHRpbmcgZGF0ZSBcImZyb21cIiBhbmQgZGF0ZSBcInRvXCIgZnJvbSBxdWVyeSBwYXJhbXNcbiAgICBjb25zdCBkYXRlVGltZUNvbnRleHRGcm9tUXVlcnlQYXJhbXMgPSB0aGlzLmdldERhdGVDb250ZXh0RnJvbVF1ZXJ5UGFyYW1zKCk7XG4gICAgaWYgKGRhdGVUaW1lQ29udGV4dEZyb21RdWVyeVBhcmFtcykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0ZTogZGF0ZVRpbWVDb250ZXh0RnJvbVF1ZXJ5UGFyYW1zLFxuICAgICAgICBpbnRlcnZhbDogJ2N1c3RvbScsXG4gICAgICAgIHJlYWx0aW1lLFxuICAgICAgICBhZ2dyZWdhdGlvblxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBxdWVyeSBwYXJhbWV0ZXJzIHJlbGF0ZWQgdG8gZGF0ZSB0aW1lIGNvbnRleHQuXG4gICAqIFZhbGlkIGludGVydmFsIChhbmQgb3RoZXIgdGhhbiAnY3VzdG9tJykgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGNvbnRleHQgZGVzY3JpYmVkIGJ5IGRhdGUgXCJmcm9tXCIgYW5kIGRhdGUgXCJ0b1wiLlxuICAgKiBJbnRlcnZhbCBhbmQgY29udGV4dCBkZXNjcmliZWQgYnkgZGF0ZSBcImZyb21cIiBhbmQgZGF0ZSBcInRvXCIgZXhjbHVkZSBlYWNoIG90aGVyLlxuICAgKlxuICAgKiBAcGFyYW0gd2lkZ2V0VGltZUNvbnRleHRTdGF0ZSBXaWRnZXQgdGltZSBjb250ZXh0IHN0YXRlLlxuICAgKi9cbiAgc2V0RGF0ZUNvbnRleHRRdWVyeVBhcmFtcyh7XG4gICAgaW50ZXJ2YWwsXG4gICAgZGF0ZSxcbiAgICByZWFsdGltZSxcbiAgICBhZ2dyZWdhdGlvblxuICB9OiBXaWRnZXRUaW1lQ29udGV4dFN0YXRlKTogdm9pZCB7XG4gICAgbGV0IHF1ZXJ5UGFyYW1zOiBSZWNvcmQ8RGF0ZUNvbnRleHRRdWVyeVBhcmFtTmFtZXMsIG51bGwgfCBzdHJpbmcgfCBib29sZWFuPjtcbiAgICBpZiAoaW50ZXJ2YWwgJiYgaW50ZXJ2YWwgIT09ICdjdXN0b20nKSB7XG4gICAgICBxdWVyeVBhcmFtcyA9IHtcbiAgICAgICAgZGF0ZUNvbnRleHRJbnRlcnZhbDogaW50ZXJ2YWwsXG4gICAgICAgIGRhdGVDb250ZXh0UmVhbHRpbWU6IHJlYWx0aW1lLFxuICAgICAgICBkYXRlQ29udGV4dEFnZ3JlZ2F0aW9uOiBhZ2dyZWdhdGlvbixcbiAgICAgICAgZGF0ZUNvbnRleHRUbzogbnVsbCxcbiAgICAgICAgZGF0ZUNvbnRleHRGcm9tOiBudWxsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWVyeVBhcmFtcyA9IHtcbiAgICAgICAgZGF0ZUNvbnRleHRGcm9tOiBkYXRlWzBdLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGRhdGVDb250ZXh0VG86IGRhdGVbMV0udG9JU09TdHJpbmcoKSxcbiAgICAgICAgZGF0ZUNvbnRleHRSZWFsdGltZTogcmVhbHRpbWUsXG4gICAgICAgIGRhdGVDb250ZXh0QWdncmVnYXRpb246IGFnZ3JlZ2F0aW9uLFxuICAgICAgICBkYXRlQ29udGV4dEludGVydmFsOiBudWxsXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwge1xuICAgICAgcmVsYXRpdmVUbzogdGhpcy5hY3RpdmF0ZWRSb3V0ZSxcbiAgICAgIHF1ZXJ5UGFyYW1zLFxuICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJ1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbGwgZGF0ZSB0aW1lIGNvbnRleHQgcmVsYXRlZCBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgY2xlYXJRdWVyeVBhcmFtcygpOiB2b2lkIHtcbiAgICBjb25zdCBjbGVhcmluZ1F1ZXJ5UGFyYW1zOiBSZWNvcmQ8RGF0ZUNvbnRleHRRdWVyeVBhcmFtTmFtZXMsIG51bGw+ID0ge1xuICAgICAgZGF0ZUNvbnRleHRGcm9tOiBudWxsLFxuICAgICAgZGF0ZUNvbnRleHRUbzogbnVsbCxcbiAgICAgIGRhdGVDb250ZXh0SW50ZXJ2YWw6IG51bGwsXG4gICAgICBkYXRlQ29udGV4dFJlYWx0aW1lOiBudWxsLFxuICAgICAgZGF0ZUNvbnRleHRBZ2dyZWdhdGlvbjogbnVsbFxuICAgIH07XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcbiAgICAgIHJlbGF0aXZlVG86IHRoaXMuYWN0aXZhdGVkUm91dGUsXG4gICAgICBxdWVyeVBhcmFtczogY2xlYXJpbmdRdWVyeVBhcmFtcyxcbiAgICAgIHJlcGxhY2VVcmw6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYW5kIHZhbGlkYXRlcyBkYXRlIGNvbnRleHQgZnJvbSBxdWVyeSBwYXJhbXMgZGVzY3JpYmVkIGJ5IGRhdGUgXCJmcm9tXCIgYW5kIGRhdGUgXCJ0b1wiLlxuICAgKlxuICAgKiBAcmV0dXJucyBEYXRlIGNvbnRleHQgYXMgdHVwbGUgb2YgZGF0ZSBcImZyb21cIiBhbmQgZGF0ZSBcInRvXCIsIG9yIG51bGwgaWYgZGF0ZSBjb250ZXh0IGlzIGludmFsaWQuXG4gICAqL1xuICBwcml2YXRlIGdldERhdGVDb250ZXh0RnJvbVF1ZXJ5UGFyYW1zKCk6IERhdGVUaW1lQ29udGV4dCB8IG51bGwge1xuICAgIGNvbnN0IGRhdGVDb250ZXh0RnJvbSA9XG4gICAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zW0RhdGVDb250ZXh0UXVlcnlQYXJhbU5hbWVzLkRBVEVfQ09OVEVYVF9GUk9NXTtcbiAgICBjb25zdCBkYXRlQ29udGV4dFRvID1cbiAgICAgIHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbRGF0ZUNvbnRleHRRdWVyeVBhcmFtTmFtZXMuREFURV9DT05URVhUX1RPXTtcblxuICAgIGlmICh0aGlzLmhlbHBlclNlcnZpY2UuaXNWYWxpZERhdGVSYW5nZShkYXRlQ29udGV4dEZyb20sIGRhdGVDb250ZXh0VG8pKSB7XG4gICAgICByZXR1cm4gW25ldyBEYXRlKGRhdGVDb250ZXh0RnJvbSksIG5ldyBEYXRlKGRhdGVDb250ZXh0VG8pXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHJlYWx0aW1lIHF1ZXJ5IHBhcmFtLlxuICAgKlxuICAgKiBAcmV0dXJucyBQYXJzZWQgcmVhbHRpbWUgdmFsdWUgb3IgbnVsbC5cbiAgICovXG4gIHByaXZhdGUgcGFyc2VSZWFsdGltZShyZWFsdGltZTogc3RyaW5nKTogYm9vbGVhbiB8IG51bGwge1xuICAgIHJldHVybiByZWFsdGltZSA9PT0gJ2ZhbHNlJyA/IGZhbHNlIDogcmVhbHRpbWUgPT09ICd0cnVlJyA/IHRydWUgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgcXVlcnkgcGFyYW1zIG9iamVjdCB0byBwcm9wZXIgdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBRdWVyeSBwYXJhbWV0ZXJzIG9iamVjdCB3aXRoIHN0cmluZyB2YWx1ZXMgb25seS5cbiAgICpcbiAgICogQHJldHVybnMgUXVlcnkgcGFyYW1zIG9iamVjdCBvZiBwcm9wZXIgdHlwZS5cbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc1F1ZXJ5UGFyYW1zKFxuICAgIHBhcmFtczogUmVjb3JkPERhdGVDb250ZXh0UXVlcnlQYXJhbU5hbWVzLCBzdHJpbmc+XG4gICk6IElucHV0RGF0ZUNvbnRleHRRdWVyeVBhcmFtcyB7XG4gICAgY29uc3QgZGF0ZUNvbnRleHRSZWFsdGltZSA9IHRoaXMucGFyc2VSZWFsdGltZShwYXJhbXMuZGF0ZUNvbnRleHRSZWFsdGltZSk7XG4gICAgY29uc3QgZGF0ZUNvbnRleHRJbnRlcnZhbCA9IHRoaXMuaGVscGVyU2VydmljZS5pc1NlbGVjdGFibGVJbnRlcnZhbChcbiAgICAgIHBhcmFtcy5kYXRlQ29udGV4dEludGVydmFsIGFzIEludGVydmFsWydpZCddXG4gICAgKVxuICAgICAgPyAocGFyYW1zLmRhdGVDb250ZXh0SW50ZXJ2YWwgYXMgSW50ZXJ2YWxbJ2lkJ10pXG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgZGF0ZUNvbnRleHRBZ2dyZWdhdGlvbiA9IHRoaXMuaGVscGVyU2VydmljZS5pc1ZhbGlkQWdncmVnYXRpb24oXG4gICAgICBwYXJhbXMuZGF0ZUNvbnRleHRBZ2dyZWdhdGlvbiBhcyBhZ2dyZWdhdGlvblR5cGVcbiAgICApXG4gICAgICA/IChwYXJhbXMuZGF0ZUNvbnRleHRBZ2dyZWdhdGlvbiBhcyBhZ2dyZWdhdGlvblR5cGUpXG4gICAgICA6IG51bGw7XG4gICAgcmV0dXJuIHsgLi4ucGFyYW1zLCBkYXRlQ29udGV4dFJlYWx0aW1lLCBkYXRlQ29udGV4dEludGVydmFsLCBkYXRlQ29udGV4dEFnZ3JlZ2F0aW9uIH07XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBwcm92aWRlZCBxdWVyeSBwYXJhbXMgY29udGFpbnMgdmFsaWQgdGltZSByYW5nZS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBRdWVyeSBwYXJhbWV0ZXJzIG9iamVjdC5cbiAgICpcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBxdWVyeSBwYXJhbXMgY29udGFpbnMgdmFsaWQgdGltZSByYW5nZSwgb3RoZXJ3aXNlIGZhbHNlLlxuICAgKi9cbiAgcHJpdmF0ZSBxdWVyeVBhcmFtc0NvbnRhaW5zVGltZVJhbmdlKHBhcmFtczogSW5wdXREYXRlQ29udGV4dFF1ZXJ5UGFyYW1zKTogYm9vbGVhbiB7XG4gICAgaWYgKCFwYXJhbXMuZGF0ZUNvbnRleHRJbnRlcnZhbCAmJiAhcGFyYW1zLmRhdGVDb250ZXh0RnJvbSAmJiAhcGFyYW1zLmRhdGVDb250ZXh0VG8pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaW50ZXJ2YWxQcm92aWRlZCA9ICEhcGFyYW1zLmRhdGVDb250ZXh0SW50ZXJ2YWw7XG4gICAgY29uc3QgZGF0ZVJhbmdlVmFsaWQgPSB0aGlzLmhlbHBlclNlcnZpY2UuaXNWYWxpZERhdGVSYW5nZShcbiAgICAgIHBhcmFtcy5kYXRlQ29udGV4dEZyb20sXG4gICAgICBwYXJhbXMuZGF0ZUNvbnRleHRUb1xuICAgICk7XG4gICAgcmV0dXJuIGludGVydmFsUHJvdmlkZWQgfHwgZGF0ZVJhbmdlVmFsaWQ7XG4gIH1cbn1cbiJdfQ==