UNPKG

@netgrif/components

Version:

Netgrif Application Engine frontend Angular components

272 lines 63 kB
import { Component, Inject, Optional, ViewChild } from '@angular/core'; import { FormControl, Validators } from '@angular/forms'; import { BehaviorSubject, combineLatest, ReplaySubject } from 'rxjs'; import { LoadingEmitter, NAE_NET_ALL_VERSIONS, NAE_NET_VERSION_VISIBLE } from '@netgrif/components-core'; import { Hotkey } from 'angular2-hotkeys'; import { map, startWith, tap } from 'rxjs/operators'; import semver from 'semver'; import { MAT_DIALOG_DATA } from '@angular/material/dialog'; import * as i0 from "@angular/core"; import * as i1 from "@angular/material/dialog"; import * as i2 from "@angular/forms"; import * as i3 from "@netgrif/components-core"; import * as i4 from "angular2-hotkeys"; import * as i5 from "@ngx-translate/core"; import * as i6 from "@angular/common"; import * as i7 from "@ngbracket/ngx-layout"; import * as i8 from "@angular/material/autocomplete"; import * as i9 from "@angular/material/core"; import * as i10 from "@angular/material/button"; import * as i11 from "@angular/material/stepper"; import * as i12 from "@angular/material/input"; import * as i13 from "@angular/material/form-field"; import * as i14 from "@angular/material/progress-spinner"; export class NewCaseDialogComponent { _dialogRef; _data; _formBuilder; _snackBarService; _caseResourceService; _hotkeysService; _translate; isVersionVisible; allVersionEnabled; processFormControl = new FormControl('', Validators.required); titleFormControl = new FormControl('', Validators.required); netVersion; options = []; colors = [ { value: 'panel-primary-icon', viewValue: 'Primary' }, { value: 'panel-accent-icon', viewValue: 'Accent' }, ]; filteredOptions$; toolbar; stepper1; stepper2; loadingSubmit; _options$; _injectedData; _hasMultipleNets$; _notInitialized$; _allowedNetsSubscription; constructor(_dialogRef, _data, _formBuilder, _snackBarService, _caseResourceService, _hotkeysService, _translate, isVersionVisible, allVersionEnabled) { this._dialogRef = _dialogRef; this._data = _data; this._formBuilder = _formBuilder; this._snackBarService = _snackBarService; this._caseResourceService = _caseResourceService; this._hotkeysService = _hotkeysService; this._translate = _translate; if (this._data) { this._injectedData = this._data; } this.isVersionVisible = isVersionVisible !== null ? isVersionVisible : true; this.allVersionEnabled = allVersionEnabled !== null ? allVersionEnabled : false; if (!this._injectedData) { this.closeNoNets(); } this._hotkeysService.add(new Hotkey('enter', (event) => { this.nextStep(); return false; })); this._hasMultipleNets$ = new ReplaySubject(1); this._notInitialized$ = new BehaviorSubject(true); this._options$ = new ReplaySubject(1); this.loadingSubmit = new LoadingEmitter(false); this._allowedNetsSubscription = this._injectedData.allowedNets$.pipe(map(nets => nets.map(petriNet => ({ value: petriNet.stringId, viewValue: petriNet.title, version: petriNet.version }))), map(nets => { if (!this.allVersionEnabled) { return this.removeOldVersions(nets); } else { return nets; } }), tap(options => { if (options.length === 0) { this.closeNoNets(); } this.options = options; this._hasMultipleNets$.next(options.length > 1); })).subscribe(options => { this._options$.next(options); if (!this._notInitialized$.closed) { this._notInitialized$.next(false); this._notInitialized$.complete(); } }); this.filteredOptions$ = combineLatest([this._options$, this.processFormControl.valueChanges.pipe(startWith(''))]).pipe(map(sources => { const options = sources[0]; const input = typeof sources[1] === 'string' || sources[1] === null ? sources[1] : sources[1].viewValue; return input ? this._filter(input, options) : options.slice(); }), tap(filteredOptions => { if (filteredOptions.length === 1) { this.processFormControl.setValue(filteredOptions[0], { emitEvent: false }); } })); } ngOnDestroy() { this._hasMultipleNets$.complete(); this.loadingSubmit.complete(); this._allowedNetsSubscription.unsubscribe(); } get hasMultipleNets$() { return this._hasMultipleNets$.asObservable(); } get notInitialized$() { return this._notInitialized$.asObservable(); } displayFn(process) { return process?.viewValue ? process?.viewValue : ''; } createNewCase() { if (this.loadingSubmit.value) { return; } if (this.titleFormControl.valid || !this.isCaseTitleRequired()) { const newCase = { title: this.titleFormControl.value === '' ? null : this.titleFormControl.value, color: 'panel-primary-icon', netId: this.options.length === 1 ? this.options[0].value : (typeof this.processFormControl.value === 'string' ? this.processFormControl.value : this.processFormControl.value.value) }; this.loadingSubmit.on(); this._caseResourceService.createCase(newCase) .subscribe((response) => { this.loadingSubmit.off(); if (!!response.outcome) { this._snackBarService.openSuccessSnackBar(response.outcome.message === undefined ? this._translate.instant('side-menu.new-case.createCase') + ' ' + newCase.title : response.outcome.message); this._dialogRef.close({ opened: false, message: response.outcome.message === undefined ? 'Confirm new case setup' : response.outcome.message, data: response.outcome.aCase }); } else if (!!response.error) { this._snackBarService.openWarningSnackBar(this._translate.instant('side-menu.new-case.createCaseError') + ' ' + newCase.title); this._dialogRef.close({ opened: false, message: response.error === undefined ? 'Confirm new case setup' : response.error }); } }, error => { this.loadingSubmit.off(); this._snackBarService.openErrorSnackBar(error.message ? error.message : error); }); } } /** * Function to filter out matchless options without accent and case-sensitive differences * @param value to compare matching options * @param options that should be filtered * @return return matched options */ _filter(value, options) { const filterValue = value.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, ''); return options.filter(option => option.viewValue.toLowerCase().normalize('NFD') .replace(/[\u0300-\u036f]/g, '').indexOf(filterValue) === 0); } closeNoNets() { this._snackBarService.openErrorSnackBar(this._translate.instant('side-menu.new-case.noNets')); this._dialogRef.close({ opened: false }); } nextStep() { if (this.stepper1) { if (this.stepper1.selectedIndex === 1) { this.createNewCase(); } else { this.stepper1.next(); } } if (this.stepper2) { if (this.stepper2.selectedIndex === 0) { this.createNewCase(); } else { this.stepper2.next(); } } } titleResolving() { const caze = this._translate.instant('side-menu.new-case.case'); const name = typeof this.processFormControl.value === 'string' || this.processFormControl.value === null ? undefined : this.processFormControl.value.viewValue; return name === undefined ? caze : caze + ' - ' + name; } removeOldVersions(options) { const tempNets = Object.assign([], options); const petriNetIds = new Set(options.map(form => form.value)); const newestNets = new Array(); for (const value of petriNetIds) { let current = { value, version: '1.0.0', viewValue: '' }; for (const net of tempNets) { if (value === net.value && !semver.lt(net.version, current.version)) { current = net; } } newestNets.push(current); } return newestNets; } isCaseTitleEnabled() { return !!(this._injectedData?.newCaseCreationConfiguration?.enableCaseTitle ?? true); } isCaseTitleRequired() { return this.isCaseTitleEnabled() && !!(this._injectedData?.newCaseCreationConfiguration?.isCaseTitleRequired ?? true); } showVersion(option) { if (option?.value?.version !== undefined) this.netVersion = option.value.version; } checkVersion(viewValue) { const currentOption = typeof viewValue === 'string' || viewValue === null ? undefined : viewValue.version; if (currentOption === undefined) { this.netVersion = ''; } } toNextStep(viewValue) { if (viewValue !== null && viewValue?.value !== undefined) { this.stepper1.next(); } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NewCaseDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.FormBuilder }, { token: i3.SnackBarService }, { token: i3.CaseResourceService }, { token: i4.HotkeysService }, { token: i5.TranslateService }, { token: NAE_NET_VERSION_VISIBLE, optional: true }, { token: NAE_NET_ALL_VERSIONS, optional: true }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NewCaseDialogComponent, selector: "nc-new-case-dialog", viewQueries: [{ propertyName: "toolbar", first: true, predicate: ["toolbar"], descendants: true }, { propertyName: "stepper1", first: true, predicate: ["stepper1"], descendants: true }, { propertyName: "stepper2", first: true, predicate: ["stepper2"], descendants: true }], ngImport: i0, template: "<div #toolbar class=\"mat-dialog-title\" fxLayout=\"column\" fxLayoutAlign=\"center none\">\n {{titleResolving()}}\n</div>\n<div mat-dialog-content class=\"dialog-field-fix\">\n <mat-vertical-stepper *ngIf=\"hasMultipleNets$ | async\" linear #stepper1 class=\" netgrif-input\">\n <mat-step [stepControl]=\"processFormControl\" errorMessage=\"{{'side-menu.new-case.errFirst' | translate}}\" >\n <ng-template matStepLabel>{{'side-menu.new-case.choose' | translate}}</ng-template>\n <mat-form-field color=\"primary\" appearance=\"outline\" class=\"margin-top-field\">\n <mat-label>\n {{'side-menu.new-case.choose' | translate}}\n </mat-label>\n <input type=\"text\" matInput [formControl]=\"processFormControl\" [matAutocomplete]=\"auto\" required\n (keyup.enter)=\"nextStep()\" (change)=\"checkVersion(processFormControl.value)\">\n <span class=\"version-span\" *ngIf=\"isVersionVisible\" matSuffix>{{netVersion}}</span>\n <mat-autocomplete #auto=\"matAutocomplete\" [displayWith]=\"displayFn\"\n (optionSelected)=\"showVersion($event.option)\">\n <mat-option *ngFor=\"let option of filteredOptions$ | async\" [value]=\"option\">\n {{option.viewValue}}\n <span class=\"version-span\" *ngIf=\"isVersionVisible\">{{option.version}}</span>\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n <div mat-dialog-actions class=\"cvti-button-field\" >\n <button *ngIf=\"isCaseTitleEnabled()\" mat-stroked-button (click)=\"toNextStep(processFormControl.value)\">{{'side-menu.new-case.next' | translate}}</button>\n <button *ngIf=\"!isCaseTitleEnabled()\" mat-raised-button color=\"primary\" (click)=\"createNewCase()\" [class.spinner]=\"loadingSubmit | async\"\n [disabled]=\"loadingSubmit | async\">{{'side-menu.new-case.create' | translate}}</button>\n </div>\n </mat-step>\n <mat-step *ngIf=\"isCaseTitleEnabled()\" [stepControl]=\"titleFormControl\" errorMessage=\"{{'side-menu.new-case.errSecond' | translate}}\" >\n <ng-template matStepLabel>{{'side-menu.new-case.caseTitle' | translate}}</ng-template>\n <mat-form-field color=\"primary\" appearance=\"outline\" class=\"margin-top-field\">\n <mat-label>\n {{'side-menu.new-case.caseTitle' | translate}}\n </mat-label>\n <input matInput autocomplete=\"off\" [formControl]=\"titleFormControl\" [required]=\"isCaseTitleRequired()\" (keyup.enter)=\"nextStep()\">\n </mat-form-field>\n <div mat-dialog-actions class=\"cvti-button-field\">\n <button mat-button class=\"margin-right\" (click)=\"stepper1.reset(); checkVersion(processFormControl.value)\">{{'side-menu.new-case.reset' | translate}}</button>\n <button mat-stroked-button color=\"primary\" class=\"min-height-36px\" (click)=\"createNewCase()\" [class.spinner]=\"loadingSubmit | async\"\n [disabled]=\"loadingSubmit | async\">\n <span *ngIf=\"(loadingSubmit | async) === false\"\n fxFlex>{{'side-menu.new-case.create' | translate}}</span>\n </button>\n </div>\n </mat-step>\n </mat-vertical-stepper>\n <mat-vertical-stepper *ngIf=\"(hasMultipleNets$ | async) === false\" linear #stepper2 class=\" netgrif-input\">\n <mat-step [stepControl]=\"titleFormControl\" errorMessage=\"{{'side-menu.new-case.errSecond' | translate}}\" >\n <ng-template matStepLabel>{{'side-menu.new-case.caseTitle' | translate}}</ng-template>\n <mat-form-field color=\"primary\" appearance=\"outline\" class=\"margin-top-field\">\n <mat-label>\n {{'side-menu.new-case.caseTitle' | translate}}\n </mat-label>\n <input matInput autocomplete=\"off\" [formControl]=\"titleFormControl\" [required]=\"isCaseTitleRequired()\" (keyup.enter)=\"nextStep()\">\n </mat-form-field>\n <div mat-dialog-actions class=\"cvti-button-field\">\n <button mat-stroked-button (click)=\"stepper2.reset()\">{{'side-menu.new-case.reset' | translate}}</button>\n <button mat-raised-button color=\"primary\" (click)=\"createNewCase()\" [class.spinner]=\"loadingSubmit | async\"\n [disabled]=\"loadingSubmit | async\">{{'side-menu.new-case.create' | translate}}</button>\n </div>\n </mat-step>\n </mat-vertical-stepper>\n <div *ngIf=\"(notInitialized$ | async)\" class=\"spinner-padding\" fxLayout=\"row\" fxLayoutAlign=\"center center\">\n <mat-spinner></mat-spinner>\n </div>\n\n</div>\n\n", styles: [".version-span{padding-right:8px;color:gray}.spinner-padding{padding:24px}.spinner-margin{margin-top:16px}.min-height-36px{min-height:36px}.margin-right{margin-right:8px}@keyframes spinner{to{transform:rotate(360deg)}}.spinner:before{content:\"\";box-sizing:border-box;position:absolute;top:50%;left:50%;width:20px;height:20px;margin-top:-10px;margin-left:-10px;border-radius:50%;border:2px solid #ffffff;border-top-color:#000;animation:spinner .8s linear infinite}.margin-top-field{margin-top:4px}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i7.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i7.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "component", type: i8.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i8.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i10.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i11.MatStep, selector: "mat-step", inputs: ["color"], exportAs: ["matStep"] }, { kind: "directive", type: i11.MatStepLabel, selector: "[matStepLabel]" }, { kind: "component", type: i11.MatStepper, selector: "mat-stepper, mat-vertical-stepper, mat-horizontal-stepper, [matStepper]", inputs: ["disableRipple", "color", "labelPosition", "headerPosition", "animationDuration"], outputs: ["animationDone"], exportAs: ["matStepper", "matVerticalStepper", "matHorizontalStepper"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i13.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i13.MatLabel, selector: "mat-label" }, { kind: "directive", type: i13.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i14.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NewCaseDialogComponent, decorators: [{ type: Component, args: [{ selector: 'nc-new-case-dialog', template: "<div #toolbar class=\"mat-dialog-title\" fxLayout=\"column\" fxLayoutAlign=\"center none\">\n {{titleResolving()}}\n</div>\n<div mat-dialog-content class=\"dialog-field-fix\">\n <mat-vertical-stepper *ngIf=\"hasMultipleNets$ | async\" linear #stepper1 class=\" netgrif-input\">\n <mat-step [stepControl]=\"processFormControl\" errorMessage=\"{{'side-menu.new-case.errFirst' | translate}}\" >\n <ng-template matStepLabel>{{'side-menu.new-case.choose' | translate}}</ng-template>\n <mat-form-field color=\"primary\" appearance=\"outline\" class=\"margin-top-field\">\n <mat-label>\n {{'side-menu.new-case.choose' | translate}}\n </mat-label>\n <input type=\"text\" matInput [formControl]=\"processFormControl\" [matAutocomplete]=\"auto\" required\n (keyup.enter)=\"nextStep()\" (change)=\"checkVersion(processFormControl.value)\">\n <span class=\"version-span\" *ngIf=\"isVersionVisible\" matSuffix>{{netVersion}}</span>\n <mat-autocomplete #auto=\"matAutocomplete\" [displayWith]=\"displayFn\"\n (optionSelected)=\"showVersion($event.option)\">\n <mat-option *ngFor=\"let option of filteredOptions$ | async\" [value]=\"option\">\n {{option.viewValue}}\n <span class=\"version-span\" *ngIf=\"isVersionVisible\">{{option.version}}</span>\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n <div mat-dialog-actions class=\"cvti-button-field\" >\n <button *ngIf=\"isCaseTitleEnabled()\" mat-stroked-button (click)=\"toNextStep(processFormControl.value)\">{{'side-menu.new-case.next' | translate}}</button>\n <button *ngIf=\"!isCaseTitleEnabled()\" mat-raised-button color=\"primary\" (click)=\"createNewCase()\" [class.spinner]=\"loadingSubmit | async\"\n [disabled]=\"loadingSubmit | async\">{{'side-menu.new-case.create' | translate}}</button>\n </div>\n </mat-step>\n <mat-step *ngIf=\"isCaseTitleEnabled()\" [stepControl]=\"titleFormControl\" errorMessage=\"{{'side-menu.new-case.errSecond' | translate}}\" >\n <ng-template matStepLabel>{{'side-menu.new-case.caseTitle' | translate}}</ng-template>\n <mat-form-field color=\"primary\" appearance=\"outline\" class=\"margin-top-field\">\n <mat-label>\n {{'side-menu.new-case.caseTitle' | translate}}\n </mat-label>\n <input matInput autocomplete=\"off\" [formControl]=\"titleFormControl\" [required]=\"isCaseTitleRequired()\" (keyup.enter)=\"nextStep()\">\n </mat-form-field>\n <div mat-dialog-actions class=\"cvti-button-field\">\n <button mat-button class=\"margin-right\" (click)=\"stepper1.reset(); checkVersion(processFormControl.value)\">{{'side-menu.new-case.reset' | translate}}</button>\n <button mat-stroked-button color=\"primary\" class=\"min-height-36px\" (click)=\"createNewCase()\" [class.spinner]=\"loadingSubmit | async\"\n [disabled]=\"loadingSubmit | async\">\n <span *ngIf=\"(loadingSubmit | async) === false\"\n fxFlex>{{'side-menu.new-case.create' | translate}}</span>\n </button>\n </div>\n </mat-step>\n </mat-vertical-stepper>\n <mat-vertical-stepper *ngIf=\"(hasMultipleNets$ | async) === false\" linear #stepper2 class=\" netgrif-input\">\n <mat-step [stepControl]=\"titleFormControl\" errorMessage=\"{{'side-menu.new-case.errSecond' | translate}}\" >\n <ng-template matStepLabel>{{'side-menu.new-case.caseTitle' | translate}}</ng-template>\n <mat-form-field color=\"primary\" appearance=\"outline\" class=\"margin-top-field\">\n <mat-label>\n {{'side-menu.new-case.caseTitle' | translate}}\n </mat-label>\n <input matInput autocomplete=\"off\" [formControl]=\"titleFormControl\" [required]=\"isCaseTitleRequired()\" (keyup.enter)=\"nextStep()\">\n </mat-form-field>\n <div mat-dialog-actions class=\"cvti-button-field\">\n <button mat-stroked-button (click)=\"stepper2.reset()\">{{'side-menu.new-case.reset' | translate}}</button>\n <button mat-raised-button color=\"primary\" (click)=\"createNewCase()\" [class.spinner]=\"loadingSubmit | async\"\n [disabled]=\"loadingSubmit | async\">{{'side-menu.new-case.create' | translate}}</button>\n </div>\n </mat-step>\n </mat-vertical-stepper>\n <div *ngIf=\"(notInitialized$ | async)\" class=\"spinner-padding\" fxLayout=\"row\" fxLayoutAlign=\"center center\">\n <mat-spinner></mat-spinner>\n </div>\n\n</div>\n\n", styles: [".version-span{padding-right:8px;color:gray}.spinner-padding{padding:24px}.spinner-margin{margin-top:16px}.min-height-36px{min-height:36px}.margin-right{margin-right:8px}@keyframes spinner{to{transform:rotate(360deg)}}.spinner:before{content:\"\";box-sizing:border-box;position:absolute;top:50%;left:50%;width:20px;height:20px;margin-top:-10px;margin-left:-10px;border-radius:50%;border:2px solid #ffffff;border-top-color:#000;animation:spinner .8s linear infinite}.margin-top-field{margin-top:4px}\n"] }] }], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{ type: Inject, args: [MAT_DIALOG_DATA] }] }, { type: i2.FormBuilder }, { type: i3.SnackBarService }, { type: i3.CaseResourceService }, { type: i4.HotkeysService }, { type: i5.TranslateService }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NAE_NET_VERSION_VISIBLE] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NAE_NET_ALL_VERSIONS] }] }], propDecorators: { toolbar: [{ type: ViewChild, args: ['toolbar'] }], stepper1: [{ type: ViewChild, args: ['stepper1'] }], stepper2: [{ type: ViewChild, args: ['stepper2'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3LWNhc2UtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy9zcmMvbGliL2RpYWxvZy9uZXctY2FzZS1kaWFsb2cvbmV3LWNhc2UtZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy9zcmMvbGliL2RpYWxvZy9uZXctY2FzZS1kaWFsb2cvbmV3LWNhc2UtZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFhLFFBQVEsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDaEYsT0FBTyxFQUFjLFdBQVcsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUMsZUFBZSxFQUFFLGFBQWEsRUFBYyxhQUFhLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFFN0YsT0FBTyxFQUUwQixjQUFjLEVBQzNDLG9CQUFvQixFQUFFLHVCQUF1QixFQUdoRCxNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBQyxNQUFNLEVBQWlCLE1BQU0sa0JBQWtCLENBQUM7QUFFeEQsT0FBTyxFQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBQyxlQUFlLEVBQWUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQWF2RSxNQUFNLE9BQU8sc0JBQXNCO0lBMEJUO0lBQ3lCO0lBQ3pCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUE5QnRCLGdCQUFnQixDQUFXO0lBQzNCLGlCQUFpQixDQUFXO0lBQzVCLGtCQUFrQixHQUFHLElBQUksV0FBVyxDQUFn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bEMsU0FBUzsrQkFDSSxvQkFBb0I7OzBCQStCakIsTUFBTTsyQkFBQyxlQUFlOzswQkFNdEIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyx1QkFBdUI7OzBCQUMxQyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLG9CQUFvQjt5Q0FwQjlCLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUztnQkFFRyxRQUFRO3NCQUE5QixTQUFTO3VCQUFDLFVBQVU7Z0JBQ0UsUUFBUTtzQkFBOUIsU0FBUzt1QkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEluamVjdCwgT25EZXN0cm95LCBPcHRpb25hbCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Rm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBWYWxpZGF0b3JzfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgUmVwbGF5U3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7TWF0VG9vbGJhcn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbGJhcic7XG5pbXBvcnQge1xuICAgIENhc2VSZXNvdXJjZVNlcnZpY2UsIENyZWF0ZUNhc2VFdmVudE91dGNvbWUsXG4gICAgRXZlbnRPdXRjb21lTWVzc2FnZVJlc291cmNlLCBMb2FkaW5nRW1pdHRlcixcbiAgICBOQUVfTkVUX0FMTF9WRVJTSU9OUywgTkFFX05FVF9WRVJTSU9OX1ZJU0lCTEUsXG4gICAgTmV3Q2FzZUluamVjdGlvbkRhdGEsIFNpZGVNZW51SW5qZWN0aW9uRGF0YSxcbiAgICBTbmFja0JhclNlcnZpY2Vcbn0gZnJvbSAnQG5ldGdyaWYvY29tcG9uZW50cy1jb3JlJztcbmltcG9ydCB7SG90a2V5LCBIb3RrZXlzU2VydmljZX0gZnJvbSAnYW5ndWxhcjItaG90a2V5cyc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHttYXAsIHN0YXJ0V2l0aCwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQge01hdE9wdGlvbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQge01BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nUmVmfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuXG5pbnRlcmZhY2UgRm9ybSB7XG4gICAgdmFsdWU6IHN0cmluZztcbiAgICB2aWV3VmFsdWU6IHN0cmluZztcbiAgICB2ZXJzaW9uPzogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25jLW5ldy1jYXNlLWRpYWxvZycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL25ldy1jYXNlLWRpYWxvZy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vbmV3LWNhc2UtZGlhbG9nLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTmV3Q2FzZURpYWxvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgICBpc1ZlcnNpb25WaXNpYmxlPzogYm9vbGVhbjtcbiAgICBhbGxWZXJzaW9uRW5hYmxlZD86IGJvb2xlYW47XG4gICAgcHJvY2Vzc0Zvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IEZvcm0+KCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICB0aXRsZUZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICBuZXRWZXJzaW9uOiBzdHJpbmc7XG5cbiAgICBvcHRpb25zOiBBcnJheTxGb3JtPiA9IFtdO1xuICAgIGNvbG9yczogQXJyYXk8Rm9ybT4gPSBbXG4gICAgICAgIHt2YWx1ZTogJ3BhbmVsLXByaW1hcnktaWNvbicsIHZpZXdWYWx1ZTogJ1ByaW1hcnknfSxcbiAgICAgICAge3ZhbHVlOiAncGFuZWwtYWNjZW50LWljb24nLCB2aWV3VmFsdWU6ICdBY2NlbnQnfSxcbiAgICBdO1xuICAgIGZpbHRlcmVkT3B0aW9ucyQ6IE9ic2VydmFibGU8QXJyYXk8Rm9ybT4+O1xuICAgIEBWaWV3Q2hpbGQoJ3Rvb2xiYXInKSB0b29sYmFyOiBNYXRUb29sYmFyO1xuXG4gICAgQFZpZXdDaGlsZCgnc3RlcHBlcjEnKSBzdGVwcGVyMTtcbiAgICBAVmlld0NoaWxkKCdzdGVwcGVyMicpIHN0ZXBwZXIyO1xuXG4gICAgcHVibGljIGxvYWRpbmdTdWJtaXQ6IExvYWRpbmdFbWl0dGVyO1xuICAgIHByb3RlY3RlZCBfb3B0aW9ucyQ6IFJlcGxheVN1YmplY3Q8QXJyYXk8Rm9ybT4+O1xuICAgIHByb3RlY3RlZCBfaW5qZWN0ZWREYXRhOiBOZXdDYXNlSW5qZWN0aW9uRGF0YTtcbiAgICBwcm90ZWN0ZWQgX2hhc011bHRpcGxlTmV0cyQ6IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj47XG4gICAgcHJvdGVjdGVkIF9ub3RJbml0aWFsaXplZCQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPjtcbiAgICBwcml2YXRlIF9hbGxvd2VkTmV0c1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9kaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxOZXdDYXNlRGlhbG9nQ29tcG9uZW50PixcbiAgICAgICAgICAgICAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHJvdGVjdGVkIF9kYXRhOiBTaWRlTWVudUluamVjdGlvbkRhdGEsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9mb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9zbmFja0JhclNlcnZpY2U6IFNuYWNrQmFyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2Nhc2VSZXNvdXJjZVNlcnZpY2U6IENhc2VSZXNvdXJjZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9ob3RrZXlzU2VydmljZTogSG90a2V5c1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF90cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChOQUVfTkVUX1ZFUlNJT05fVklTSUJMRSkgaXNWZXJzaW9uVmlzaWJsZTogYm9vbGVhbixcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE5BRV9ORVRfQUxMX1ZFUlNJT05TKSBhbGxWZXJzaW9uRW5hYmxlZDogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5faW5qZWN0ZWREYXRhID0gdGhpcy5fZGF0YSBhcyBOZXdDYXNlSW5qZWN0aW9uRGF0YTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzVmVyc2lvblZpc2libGUgPSBpc1ZlcnNpb25WaXNpYmxlICE9PSBudWxsID8gaXNWZXJzaW9uVmlzaWJsZSA6IHRydWU7XG4gICAgICAgIHRoaXMuYWxsVmVyc2lvbkVuYWJsZWQgPSBhbGxWZXJzaW9uRW5hYmxlZCAhPT0gbnVsbCA/IGFsbFZlcnNpb25FbmFibGVkIDogZmFsc2U7XG4gICAgICAgIGlmICghdGhpcy5faW5qZWN0ZWREYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlTm9OZXRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faG90a2V5c1NlcnZpY2UuYWRkKG5ldyBIb3RrZXkoJ2VudGVyJywgKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiA9PiB7XG4gICAgICAgICAgICB0aGlzLm5leHRTdGVwKCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pKTtcblxuICAgICAgICB0aGlzLl9oYXNNdWx0aXBsZU5ldHMkID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG4gICAgICAgIHRoaXMuX25vdEluaXRpYWxpemVkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gICAgICAgIHRoaXMuX29wdGlvbnMkID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG4gICAgICAgIHRoaXMubG9hZGluZ1N1Ym1pdCA9IG5ldyBMb2FkaW5nRW1pdHRlcihmYWxzZSk7XG5cbiAgICAgICAgdGhpcy5fYWxsb3dlZE5ldHNTdWJzY3JpcHRpb24gPSB0aGlzLl9pbmplY3RlZERhdGEuYWxsb3dlZE5ldHMkLnBpcGUoXG4gICAgICAgICAgICBtYXAobmV0cyA9PiBuZXRzLm1hcChwZXRyaU5ldCA9PiAoe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBwZXRyaU5ldC5zdHJpbmdJZCxcbiAgICAgICAgICAgICAgICB2aWV3VmFsdWU6IHBldHJpTmV0LnRpdGxlLFxuICAgICAgICAgICAgICAgIHZlcnNpb246IHBldHJpTmV0LnZlcnNpb25cbiAgICAgICAgICAgIH0pKSksXG4gICAgICAgICAgICBtYXAobmV0cyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmFsbFZlcnNpb25FbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbW92ZU9sZFZlcnNpb25zKG5ldHMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGFwKG9wdGlvbnMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlTm9OZXRzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgICAgICAgICAgdGhpcy5faGFzTXVsdGlwbGVOZXRzJC5uZXh0KG9wdGlvbnMubGVuZ3RoID4gMSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApLnN1YnNjcmliZShvcHRpb25zID0+IHtcbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnMkLm5leHQob3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX25vdEluaXRpYWxpemVkJC5jbG9zZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RJbml0aWFsaXplZCQubmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbm90SW5pdGlhbGl6ZWQkLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX29wdGlvbnMkLCB0aGlzLnByb2Nlc3NGb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShzdGFydFdpdGgoJycpKV0pLnBpcGUoXG4gICAgICAgICAgICBtYXAoc291cmNlcyA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHNvdXJjZXNbMF07XG4gICAgICAgICAgICAgICAgY29uc3QgaW5wdXQgPSB0eXBlb2Ygc291cmNlc1sxXSA9PT0gJ3N0cmluZycgfHwgc291cmNlc1sxXSA9PT0gbnVsbCA/IHNvdXJjZXNbMV0gOiBzb3VyY2VzWzFdLnZpZXdWYWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQgPyB0aGlzLl9maWx0ZXIoaW5wdXQgYXMgc3RyaW5nLCBvcHRpb25zKSA6IG9wdGlvbnMuc2xpY2UoKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGFwKGZpbHRlcmVkT3B0aW9ucyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRm9ybUNvbnRyb2wuc2V0VmFsdWUoZmlsdGVyZWRPcHRpb25zWzBdLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2hhc011bHRpcGxlTmV0cyQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nU3VibWl0LmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX2FsbG93ZWROZXRzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNNdWx0aXBsZU5ldHMkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFzTXVsdGlwbGVOZXRzJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG5vdEluaXRpYWxpemVkJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vdEluaXRpYWxpemVkJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBkaXNwbGF5Rm4ocHJvY2VzczogRm9ybSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzPy52aWV3VmFsdWUgPyBwcm9jZXNzPy52aWV3VmFsdWUgOiAnJztcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlTmV3Q2FzZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubG9hZGluZ1N1Ym1pdC52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudGl0bGVGb3JtQ29udHJvbC52YWxpZCB8fCAhdGhpcy5pc0Nhc2VUaXRsZVJlcXVpcmVkKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0Nhc2UgPSB7XG4gICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMudGl0bGVGb3JtQ29udHJvbC52YWx1ZSA9PT0gJycgPyBudWxsIDogdGhpcy50aXRsZUZvcm1Db250cm9sLnZhbHVlLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAncGFuZWwtcHJpbWFyeS1pY29uJyxcbiAgICAgICAgICAgICAgICBuZXRJZDogdGhpcy5vcHRpb25zLmxlbmd0aCA9PT0gMSA/IHRoaXMub3B0aW9uc1swXS52YWx1ZSA6XG4gICAgICAgICAgICAgICAgICAgICggdHlwZW9mIHRoaXMucHJvY2Vzc0Zvcm1Db250cm9sLnZhbHVlID09PSAnc3RyaW5nJyA/IHRoaXMucHJvY2Vzc0Zvcm1Db250cm9sLnZhbHVlIDogdGhpcy5wcm9jZXNzRm9ybUNvbnRyb2wudmFsdWUudmFsdWUgKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N1Ym1pdC5vbigpO1xuICAgICAgICAgICAgdGhpcy5fY2FzZVJlc291cmNlU2VydmljZS5jcmVhdGVDYXNlKG5ld0Nhc2UpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlOiBFdmVudE91dGNvbWVNZXNzYWdlUmVzb3VyY2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ1N1Ym1pdC5vZmYoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXJlc3BvbnNlLm91dGNvbWUpIHtcbiAgICAgICAgI