@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
127 lines • 25.3 kB
JavaScript
import { Component, inject, Input } from '@angular/core';
import { FormBuilder } from '@angular/forms';
import { BehaviorSubject, Subject } from 'rxjs';
import { filter, takeUntil, tap } from 'rxjs/operators';
import { GLOBAL_CONTEXT_AUTO_REFRESH } from './widget-auto-refresh-context.model';
import { WidgetGlobalAutoRefreshService } from './widget-global-auto-refresh.service';
import * as i0 from "@angular/core";
import * as i1 from "../../common/icon.directive";
import * as i2 from "@angular/common";
import * as i3 from "../../action-bar/action-bar-item.component";
import * as i4 from "ngx-bootstrap/tooltip";
import * as i5 from "@angular/forms";
import * as i6 from "./auto-refresh-control.component";
import * as i7 from "./auto-refresh-select-control.component";
import * as i8 from "@ngx-translate/core";
export class WidgetAutoRefreshContextComponent {
constructor() {
this.globalRefreshWidgetLoading = true;
this.ACTION_BAR_GROUP_ID = 'globalrefreshcontext';
this.ACTION_BAR_PRIORITY = 5;
this.destroy$ = new Subject();
this.fb = inject(FormBuilder);
this.widgetGlobalAutoRefresh = inject(WidgetGlobalAutoRefreshService);
}
ngOnInit() {
this.widgetGlobalAutoRefresh.globalRefreshWidgetsCount.update(count => count + 1);
this.form = this.createForm();
this.subscribeOnAutoRefreshSecondsChange();
this.subscribeOnAutoRefreshChange();
this.subscribeOnRouterEvents();
}
ngAfterViewInit() {
this.initializeWidgetSubscriptions();
this.subscribeOnQueryParamChange();
this.widgetGlobalAutoRefresh.autoRefreshSettings.isEnabled$
.pipe(tap(() => this.setAutoRefreshQueryParam()))
.pipe(takeUntil(this.destroy$))
.subscribe();
this.widgetGlobalAutoRefresh
.initializeAutoRefreshCountdownLoading$(this.editMode$)
.pipe(takeUntil(this.destroy$))
.subscribe();
this.listenOnDashboardSaveOperation();
}
ngOnDestroy() {
this.onContextDestroy();
}
onRefresh() {
this.widgetGlobalAutoRefresh.countdownActions.countdownEnded$.next();
}
createForm() {
return this.fb.group({
autoRefresh: this.widgetGlobalAutoRefresh.autoRefreshSettings.isEnabled$.getValue(),
autoRefreshSeconds: this.widgetGlobalAutoRefresh.autoRefreshSettings.refreshInterval$.getValue()
});
}
subscribeOnAutoRefreshSecondsChange() {
const autoRefreshSecondsChanges$ = this.form.controls.autoRefreshSeconds.valueChanges;
autoRefreshSecondsChanges$
.pipe(tap(value => this.widgetGlobalAutoRefresh.autoRefreshSettings.refreshInterval$.next(value)), this.widgetGlobalAutoRefresh.resetCountdownOnLoadingComplete$(), takeUntil(this.destroy$))
.subscribe();
}
subscribeOnAutoRefreshChange() {
const autoRefreshChanges$ = this.form.controls.autoRefresh.valueChanges;
autoRefreshChanges$
.pipe(tap(value => this.widgetGlobalAutoRefresh.autoRefreshSettings.isEnabled$.next(value)), filter(Boolean), this.widgetGlobalAutoRefresh.resetCountdownOnLoadingComplete$(), takeUntil(this.destroy$))
.subscribe();
}
initializeWidgetSubscriptions() {
this.editMode$
.pipe(takeUntil(this.destroy$))
.subscribe(editMode => this.widgetGlobalAutoRefresh.onEditModeChange(editMode));
}
setAutoRefreshQueryParam() {
queueMicrotask(() => {
if (this.widgetGlobalAutoRefresh.globalRefreshWidgetsCount() === 0) {
return;
}
const queryParam = {
[GLOBAL_CONTEXT_AUTO_REFRESH]: this.widgetGlobalAutoRefresh.autoRefreshSettings.isEnabled$.getValue()
};
this.widgetGlobalAutoRefresh.setAutoRefreshQueryParam(queryParam);
});
}
subscribeOnQueryParamChange() {
this.widgetGlobalAutoRefresh
.getQueryParamChangeValue$()
.pipe(tap(paramValue => paramValue === null && this.setAutoRefreshQueryParam()), filter(paramValue => paramValue !== null &&
this.widgetGlobalAutoRefresh.autoRefreshSettings.isEnabled$.getValue() !== paramValue), tap(paramValue => {
this.widgetGlobalAutoRefresh.autoRefreshSettings.isEnabled$.next(paramValue);
this.setAutoRefreshQueryParam();
if (paramValue) {
this.widgetGlobalAutoRefresh.resetCountdown();
}
}), takeUntil(this.destroy$))
.subscribe();
}
subscribeOnRouterEvents() {
this.widgetGlobalAutoRefresh
.handleNavigationInProgress$()
.pipe(takeUntil(this.destroy$))
.subscribe();
}
onContextDestroy() {
const widgetsCount = this.widgetGlobalAutoRefresh.globalRefreshWidgetsCount;
widgetsCount.update(count => count - 1);
if (widgetsCount() === 0) {
this.destroy$.next();
this.destroy$.complete();
this.widgetGlobalAutoRefresh.resetServiceToDefaults();
}
}
listenOnDashboardSaveOperation() {
this.widgetGlobalAutoRefresh.onDashboardSave$
.pipe(this.widgetGlobalAutoRefresh.resetCountdownOnLoadingComplete$(), takeUntil(this.destroy$))
.subscribe();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetAutoRefreshContextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: WidgetAutoRefreshContextComponent, selector: "c8y-widget-auto-refresh-context", inputs: { editMode$: "editMode$" }, ngImport: i0, template: "<c8y-action-bar-item\n [groupId]=\"ACTION_BAR_GROUP_ID\"\n [priority]=\"ACTION_BAR_PRIORITY\"\n [placement]=\"'left'\"\n>\n <form\n class=\"d-flex\"\n [formGroup]=\"form\"\n >\n <c8y-auto-refresh-control\n [hidden]=\"editMode$ | async\"\n (loading)=\"globalRefreshWidgetLoading = $event\"\n formControlName=\"autoRefresh\"\n ></c8y-auto-refresh-control>\n\n <c8y-auto-refresh-select-control\n [hidden]=\"editMode$ | async\"\n formControlName=\"autoRefreshSeconds\"\n ></c8y-auto-refresh-select-control>\n </form>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n style=\"border-left: 0\"\n [attr.aria-label]=\"'Refresh' | translate\"\n [tooltip]=\"'Refresh' | translate\"\n placement=\"bottom\"\n type=\"button\"\n *ngIf=\"!(editMode$ | async)\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n [disabled]=\"globalRefreshWidgetLoading\"\n (click)=\"onRefresh()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': globalRefreshWidgetLoading }\"\n ></i>\n </button>\n </div>\n</c8y-action-bar-item>\n", dependencies: [{ kind: "directive", type: i1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6.AutoRefreshControlComponent, selector: "c8y-auto-refresh-control", outputs: ["loading"] }, { kind: "component", type: i7.AutoRefreshSelectControlComponent, selector: "c8y-auto-refresh-select-control" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetAutoRefreshContextComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-widget-auto-refresh-context', template: "<c8y-action-bar-item\n [groupId]=\"ACTION_BAR_GROUP_ID\"\n [priority]=\"ACTION_BAR_PRIORITY\"\n [placement]=\"'left'\"\n>\n <form\n class=\"d-flex\"\n [formGroup]=\"form\"\n >\n <c8y-auto-refresh-control\n [hidden]=\"editMode$ | async\"\n (loading)=\"globalRefreshWidgetLoading = $event\"\n formControlName=\"autoRefresh\"\n ></c8y-auto-refresh-control>\n\n <c8y-auto-refresh-select-control\n [hidden]=\"editMode$ | async\"\n formControlName=\"autoRefreshSeconds\"\n ></c8y-auto-refresh-select-control>\n </form>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n style=\"border-left: 0\"\n [attr.aria-label]=\"'Refresh' | translate\"\n [tooltip]=\"'Refresh' | translate\"\n placement=\"bottom\"\n type=\"button\"\n *ngIf=\"!(editMode$ | async)\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n [disabled]=\"globalRefreshWidgetLoading\"\n (click)=\"onRefresh()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': globalRefreshWidgetLoading }\"\n ></i>\n </button>\n </div>\n</c8y-action-bar-item>\n" }]
}], propDecorators: { editMode$: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWF1dG8tcmVmcmVzaC1jb250ZXh0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2NvcmUvZGFzaGJvYXJkL3dpZGdldC1hdXRvLXJlZnJlc2gtY29udGV4dC93aWRnZXQtYXV0by1yZWZyZXNoLWNvbnRleHQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vY29yZS9kYXNoYm9hcmQvd2lkZ2V0LWF1dG8tcmVmcmVzaC1jb250ZXh0L3dpZGdldC1hdXRvLXJlZnJlc2gtY29udGV4dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEQsT0FBTyxFQUNMLDJCQUEyQixFQUU1QixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOzs7Ozs7Ozs7O0FBTXRGLE1BQU0sT0FBTyxpQ0FBaUM7SUFKOUM7UUFVRSwrQkFBMEIsR0FBRyxJQUFJLENBQUM7UUFDekIsd0JBQW1CLEdBQUcsc0JBQXNCLENBQUM7UUFDN0Msd0JBQW1CLEdBQUcsQ0FBQyxDQUFDO1FBRXpCLGFBQVEsR0FBa0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUUvQixPQUFFLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3pCLDRCQUF1QixHQUFHLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0tBMEluRjtJQXhJQyxRQUFRO1FBQ04sSUFB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bXBvbmVudCwgaW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgR0xPQkFMX0NPTlRFWFRfQVVUT19SRUZSRVNILFxuICBHbG9iYWxBdXRvUmVmcmVzaFF1ZXJ5UGFyYW1cbn0gZnJvbSAnLi93aWRnZXQtYXV0by1yZWZyZXNoLWNvbnRleHQubW9kZWwnO1xuaW1wb3J0IHsgV2lkZ2V0R2xvYmFsQXV0b1JlZnJlc2hTZXJ2aWNlIH0gZnJvbSAnLi93aWRnZXQtZ2xvYmFsLWF1dG8tcmVmcmVzaC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LXdpZGdldC1hdXRvLXJlZnJlc2gtY29udGV4dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi93aWRnZXQtYXV0by1yZWZyZXNoLWNvbnRleHQuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFdpZGdldEF1dG9SZWZyZXNoQ29udGV4dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgZm9ybTogUmV0dXJuVHlwZTxXaWRnZXRBdXRvUmVmcmVzaENvbnRleHRDb21wb25lbnRbJ2NyZWF0ZUZvcm0nXT47XG5cbiAgQElucHV0KClcbiAgZWRpdE1vZGUkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj47XG5cbiAgZ2xvYmFsUmVmcmVzaFdpZGdldExvYWRpbmcgPSB0cnVlO1xuICByZWFkb25seSBBQ1RJT05fQkFSX0dST1VQX0lEID0gJ2dsb2JhbHJlZnJlc2hjb250ZXh0JztcbiAgcmVhZG9ubHkgQUNUSU9OX0JBUl9QUklPUklUWSA9IDU7XG5cbiAgcHJpdmF0ZSBkZXN0cm95JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBmYiA9IGluamVjdChGb3JtQnVpbGRlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgd2lkZ2V0R2xvYmFsQXV0b1JlZnJlc2ggPSBpbmplY3QoV2lkZ2V0R2xvYmFsQXV0b1JlZnJlc2hTZXJ2aWNlKTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLndpZGdldEdsb2JhbEF1dG9SZWZyZXNoLmdsb2JhbFJlZnJlc2hXaWRnZXRzQ291bnQudXBkYXRlKGNvdW50ID0+IGNvdW50ICsgMSk7XG5cbiAgICB0aGlzLmZvcm0gPSB0aGlzLmNyZWF0ZUZvcm0oKTtcblxuICAgIHRoaXMuc3Vic2NyaWJlT25BdXRvUmVmcmVzaFNlY29uZHNDaGFuZ2UoKTtcbiAgICB0aGlzLnN1YnNjcmliZU9uQXV0b1JlZnJlc2hDaGFuZ2UoKTtcbiAgICB0aGlzLnN1YnNjcmliZU9uUm91dGVyRXZlbnRzKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5pbml0aWFsaXplV2lkZ2V0U3Vic2NyaXB0aW9ucygpO1xuICAgIHRoaXMuc3Vic2NyaWJlT25RdWVyeVBhcmFtQ2hhbmdlKCk7XG5cbiAgICB0aGlzLndpZGdldEdsb2JhbEF1dG9SZWZyZXNoLmF1dG9SZWZyZXNoU2V0dGluZ3MuaXNFbmFibGVkJFxuICAgICAgLnBpcGUodGFwKCgpID0+IHRoaXMuc2V0QXV0b1JlZnJlc2hRdWVyeVBhcmFtKCkpKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy53aWRnZXRHbG9iYWxBdXRvUmVmcmVzaFxuICAgICAgLmluaXRpYWxpemVBdXRvUmVmcmVzaENvdW50ZG93bkxvYWRpbmckKHRoaXMuZWRpdE1vZGUkKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5saXN0ZW5PbkRhc2hib2FyZFNhdmVPcGVyYXRpb24oKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMub25Db250ZXh0RGVzdHJveSgpO1xuICB9XG5cbiAgb25SZWZyZXNoKCkge1xuICAgIHRoaXMud2lkZ2V0R2xvYmFsQXV0b1JlZnJlc2guY291bnRkb3duQWN0aW9ucy5jb3VudGRvd25FbmRlZCQubmV4dCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGb3JtKCkge1xuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGF1dG9SZWZyZXNoOiB0aGlzLndpZGdldEdsb2JhbEF1dG9SZWZyZXNoLmF1dG9SZWZyZXNoU2V0dGluZ3MuaXNFbmFibGVkJC5nZXRWYWx1ZSgpLFxuICAgICAgYXV0b1JlZnJlc2hTZWNvbmRzOlxuICAgICAgICB0aGlzLndpZGdldEdsb2JhbEF1dG9SZWZyZXNoLmF1dG9SZWZyZXNoU2V0dGluZ3MucmVmcmVzaEludGVydmFsJC5nZXRWYWx1ZSgpXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZU9uQXV0b1JlZnJlc2hTZWNvbmRzQ2hhbmdlKCkge1xuICAgIGNvbnN0IGF1dG9SZWZyZXNoU2Vjb25kc0NoYW5nZXMkID0gdGhpcy5mb3JtLmNvbnRyb2xzLmF1dG9SZWZyZXNoU2Vjb25kcy52YWx1ZUNoYW5nZXM7XG5cbiAgICBhdXRvUmVmcmVzaFNlY29uZHNDaGFuZ2VzJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCh2YWx1ZSA9PiB0aGlzLndpZGdldEdsb2JhbEF1dG9SZWZyZXNoLmF1dG9SZWZyZXNoU2V0dGluZ3MucmVmcmVzaEludGVydmFsJC5uZXh0KHZhbHVlKSksXG4gICAgICAgIHRoaXMud2lkZ2V0R2xvYmFsQXV0b1JlZnJlc2gucmVzZXRDb3VudGRvd25PbkxvYWRpbmdDb21wbGV0ZSQoKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZU9uQXV0b1JlZnJlc2hDaGFuZ2UoKSB7XG4gICAgY29uc3QgYXV0b1JlZnJlc2hDaGFuZ2VzJCA9IHRoaXMuZm9ybS5jb250cm9scy5hdXRvUmVmcmVzaC52YWx1ZUNoYW5nZXM7XG5cbiAgICBhdXRvUmVmcmVzaENoYW5nZXMkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKHZhbHVlID0+IHRoaXMud2lkZ2V0R2xvYmFsQXV0b1JlZnJlc2guYXV0b1JlZnJlc2hTZXR0aW5ncy5pc0VuYWJsZWQkLm5leHQodmFsdWUpKSxcbiAgICAgICAgZmlsdGVyKEJvb2xlYW4pLFxuICAgICAgICB0aGlzLndpZGdldEdsb2JhbEF1dG9SZWZyZXNoLnJlc2V0Q291bnRkb3duT25Mb2FkaW5nQ29tcGxldGUkKCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplV2lkZ2V0U3Vic2NyaXB0aW9ucygpIHtcbiAgICB0aGlzLmVkaXRNb2RlJFxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZShlZGl0TW9kZSA9PiB0aGlzLndpZGdldEdsb2JhbEF1dG9SZWZyZXNoLm9uRWRpdE1vZGVDaGFuZ2UoZWRpdE1vZGUpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QXV0b1JlZnJlc2hRdWVyeVBhcmFtKCkge1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLndpZGdldEdsb2JhbEF1dG9SZWZyZXNoLmdsb2JhbFJlZnJlc2hXaWRnZXRzQ291bnQoKSA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBxdWVyeVBhcmFtOiBHbG9iYWxBdXRvUmVmcmVzaFF1ZXJ5UGFyYW0gPSB7XG4gICAgICAgIFtHTE9CQUxfQ09OVEVYVF9BVVRPX1JFRlJFU0hdOlxuICAgICAgICAgIHRoaXMud2lkZ2V0R2xvYmFsQXV0b1JlZnJlc2guYXV0b1JlZnJlc2hTZXR0aW5ncy5pc0VuYWJsZWQkLmdldFZhbHVlKClcbiAgICAgIH07XG4gICAgICB0aGlzLndpZGdldEdsb2JhbEF1dG9SZWZyZXNoLnNldEF1dG9SZWZyZXNoUXVlcnlQYXJhbShxdWVyeVBhcmFtKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlT25RdWVyeVBhcmFtQ2hhbmdlKCkge1xuICAgIHRoaXMud2lkZ2V0R2xvYmFsQXV0b1JlZnJlc2hcbiAgICAgIC5nZXRRdWVyeVBhcmFtQ2hhbmdlVmFsdWUkKClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAocGFyYW1WYWx1ZSA9PiBwYXJhbVZhbHVlID09PSBudWxsICYmIHRoaXMuc2V0QXV0b1JlZnJlc2hRdWVyeVBhcmFtKCkpLFxuICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgcGFyYW1WYWx1ZSA9PlxuICAgICAgICAgICAgcGFyYW1WYWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgdGhpcy53aWRnZXRHbG9iYWxBdXRvUmVmcmVzaC5hdXRvUmVmcmVzaFNldHRpbmdzLmlzRW5hYmxlZCQuZ2V0VmFsdWUoKSAhPT0gcGFyYW1WYWx1ZVxuICAgICAgICApLFxuICAgICAgICB0YXAocGFyYW1WYWx1ZSA9PiB7XG4gICAgICAgICAgdGhpcy53aWRnZXRHbG9iYWxBdXRvUmVmcmVzaC5hdXRvUmVmcmVzaFNldHRpbmdzLmlzRW5hYmxlZCQubmV4dChwYXJhbVZhbHVlKTtcbiAgICAgICAgICB0aGlzLnNldEF1dG9SZWZyZXNoUXVlcnlQYXJhbSgpO1xuICAgICAgICAgIGlmIChwYXJhbVZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLndpZGdldEdsb2JhbEF1dG9SZWZyZXNoLnJlc2V0Q291bnRkb3duKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZU9uUm91dGVyRXZlbnRzKCkge1xuICAgIHRoaXMud2lkZ2V0R2xvYmFsQXV0b1JlZnJlc2hcbiAgICAgIC5oYW5kbGVOYXZpZ2F0aW9uSW5Qcm9ncmVzcyQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkNvbnRleHREZXN0cm95KCkge1xuICAgIGNvbnN0IHdpZGdldHNDb3VudCA9IHRoaXMud2lkZ2V0R2xvYmFsQXV0b1JlZnJlc2guZ2xvYmFsUmVmcmVzaFdpZGdldHNDb3VudDtcbiAgICB3aWRnZXRzQ291bnQudXBkYXRlKGNvdW50ID0+IGNvdW50IC0gMSk7XG5cbiAgICBpZiAod2lkZ2V0c0NvdW50KCkgPT09IDApIHtcbiAgICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuXG4gICAgICB0aGlzLndpZGdldEdsb2JhbEF1dG9SZWZyZXNoLnJlc2V0U2VydmljZVRvRGVmYXVsdHMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGxpc3Rlbk9uRGFzaGJvYXJkU2F2ZU9wZXJhdGlvbigpIHtcbiAgICB0aGlzLndpZGdldEdsb2JhbEF1dG9SZWZyZXNoLm9uRGFzaGJvYXJkU2F2ZSRcbiAgICAgIC5waXBlKFxuICAgICAgICB0aGlzLndpZGdldEdsb2JhbEF1dG9SZWZyZXNoLnJlc2V0Q291bnRkb3duT25Mb2FkaW5nQ29tcGxldGUkKCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG59XG4iLCI8Yzh5LWFjdGlvbi1iYXItaXRlbVxuICBbZ3JvdXBJZF09XCJBQ1RJT05fQkFSX0dST1VQX0lEXCJcbiAgW3ByaW9yaXR5XT1cIkFDVElPTl9CQVJfUFJJT1JJVFlcIlxuICBbcGxhY2VtZW50XT1cIidsZWZ0J1wiXG4+XG4gIDxmb3JtXG4gICAgY2xhc3M9XCJkLWZsZXhcIlxuICAgIFtmb3JtR3JvdXBdPVwiZm9ybVwiXG4gID5cbiAgICA8Yzh5LWF1dG8tcmVmcmVzaC1jb250cm9sXG4gICAgICBbaGlkZGVuXT1cImVkaXRNb2RlJCB8IGFzeW5jXCJcbiAgICAgIChsb2FkaW5nKT1cImdsb2JhbFJlZnJlc2hXaWRnZXRMb2FkaW5nID0gJGV2ZW50XCJcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cImF1dG9SZWZyZXNoXCJcbiAgICA+PC9jOHktYXV0by1yZWZyZXNoLWNvbnRyb2w+XG5cbiAgICA8Yzh5LWF1dG8tcmVmcmVzaC1zZWxlY3QtY29udHJvbFxuICAgICAgW2hpZGRlbl09XCJlZGl0TW9kZSQgfCBhc3luY1wiXG4gICAgICBmb3JtQ29udHJvbE5hbWU9XCJhdXRvUmVmcmVzaFNlY29uZHNcIlxuICAgID48L2M4eS1hdXRvLXJlZnJlc2gtc2VsZWN0LWNvbnRyb2w+XG4gIDwvZm9ybT5cbiAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWJ0blwiPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgIHN0eWxlPVwiYm9yZGVyLWxlZnQ6IDBcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInUmVmcmVzaCcgfCB0cmFuc2xhdGVcIlxuICAgICAgW3Rvb2x0aXBdPVwiJ1JlZnJlc2gnIHwgdHJhbnNsYXRlXCJcbiAgICAgIHBsYWNlbWVudD1cImJvdHRvbVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICpuZ0lmPVwiIShlZGl0TW9kZSQgfCBhc3luYylcIlxuICAgICAgW2FkYXB0aXZlUG9zaXRpb25dPVwiZmFsc2VcIlxuICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsUmVmcmVzaFdpZGdldExvYWRpbmdcIlxuICAgICAgKGNsaWNrKT1cIm9uUmVmcmVzaCgpXCJcbiAgICA+XG4gICAgICA8aVxuICAgICAgICBjOHlJY29uPVwicmVmcmVzaFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgJ2ljb24tc3Bpbic6IGdsb2JhbFJlZnJlc2hXaWRnZXRMb2FkaW5nIH1cIlxuICAgICAgPjwvaT5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG4iXX0=