@bimeister/pupakit.forms
Version:
PupaKit Forms
222 lines • 40.2 kB
JavaScript
import '@angular/cdk/overlay';
import { DOCUMENT } from '@angular/common';
import { EventEmitter, Inject, Injectable } from '@angular/core';
import '@angular/forms';
import { filterNotNil, isEmpty, isNil, shareReplayWithRefCount } from '@bimeister/utilities';
import { BehaviorSubject, combineLatest, fromEvent, merge, of, Subscription } from 'rxjs';
import { distinctUntilChanged, filter, map, startWith, switchMap, take, withLatestFrom } from 'rxjs/operators';
import { isFormControlValidStatus } from '../../../declarations/functions/is-form-control-valid-status.function';
import '../../../declarations/interfaces/select-state-service-declaration.interface';
import '../../../declarations/types/on-change-callback.type';
import '../../../declarations/types/on-touched-callback.type';
import '../../../declarations/types/select-outer-value.type';
import '../../../declarations/types/select-size.type';
import * as i0 from "@angular/core";
export class SelectStateService {
constructor(document) {
this.document = document;
this.currentSerializedValue$ = new BehaviorSubject(new Set());
this.currentValue$ = this.currentSerializedValue$.pipe(map((serializedSet) => SelectStateService.getParsedValue(serializedSet)), shareReplayWithRefCount());
this.subscription = new Subscription();
this.isMultiSelectionEnabled$ = new BehaviorSubject(false);
this.isUnselectionEnabled$ = new BehaviorSubject(false);
this.isDisabled$ = new BehaviorSubject(false);
this.isExpanded$ = new BehaviorSubject(false);
this.control$ = new BehaviorSubject(null);
this.isTouched$ = new BehaviorSubject(null);
this.isPatched$ = new BehaviorSubject(null);
this.isValid$ = this.control$.pipe(switchMap((control) => isNil(control)
? of(true)
: control.statusChanges.pipe(startWith(control.status), map((status) => isFormControlValidStatus(status)))), distinctUntilChanged(), shareReplayWithRefCount());
this.isFilled$ = new BehaviorSubject(false);
this.withReset$ = new BehaviorSubject(false);
this.inline$ = new BehaviorSubject(false);
this.size$ = new BehaviorSubject('medium');
this.isTriggerTouched$ = new BehaviorSubject(false);
this.invalidTooltipHideOnHover$ = new BehaviorSubject(false);
this.invalidTooltipDisabled$ = new BehaviorSubject(false);
this.invalidTooltip$ = new BehaviorSubject(null);
this.invalidTooltipContentTemplate$ = new BehaviorSubject(null);
this.placeholder$ = new BehaviorSubject(null);
this.onChangeCallback$ = new BehaviorSubject(null);
this.onTouchedCallback$ = new BehaviorSubject(null);
this.dropdownOverlayOrigin$ = new BehaviorSubject(null);
this.dropdownTriggerButton$ = new BehaviorSubject(null);
this.dropdownOverlayRef$ = new BehaviorSubject(null);
this.dropdownTriggerButtonWidthPx$ = this.dropdownTriggerButton$.pipe(map((button) => {
if (isNil(button)) {
return undefined;
}
const { width } = button?.getBoundingClientRect();
return width;
}), map((width) => (isNil(width) ? 0 : width)));
this.resetOutput = new EventEmitter();
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
setControlRef(control) {
this.control$.next(control);
}
collapse() {
this.isExpanded$.next(false);
}
open() {
this.isExpanded$.next(true);
this.listenOutsideEventsForClose();
}
toggleExpansion() {
this.isExpanded$.pipe(take(1)).subscribe((isExpanded) => {
isExpanded ? this.collapse() : this.open();
});
}
defineDropdownTrigger(overlayOrigin, buttonElement) {
this.dropdownOverlayOrigin$.next(overlayOrigin);
this.dropdownTriggerButton$.next(buttonElement);
}
defineDropdownOverlayRef(overlayRef) {
this.dropdownOverlayRef$.next(overlayRef);
}
defineOnChangeCallback(onChange) {
this.onChangeCallback$.next(onChange);
}
defineOnTouchedCallback(onTouched) {
this.onTouchedCallback$.next(onTouched);
}
setMultiSelectionState(isEnabled) {
this.isMultiSelectionEnabled$.next(isEnabled);
}
setIsTriggerTouchedState(isTriggerTouched) {
this.isTriggerTouched$.next(isTriggerTouched);
}
setUnselectionState(isEnabled) {
this.isUnselectionEnabled$.next(isEnabled);
}
setIsPatchedState(isPatched) {
this.isPatched$.next(isPatched);
}
setPlaceholderState(placeholder) {
this.placeholder$.next(placeholder);
}
setWithResetState(withReset) {
this.withReset$.next(withReset);
}
setInlineState(inline) {
this.inline$.next(inline);
}
setSizeState(size) {
this.size$.next(size);
}
setInvalidTooltipHideOnHoverState(invalidTooltipHideOnHover) {
this.invalidTooltipHideOnHover$.next(invalidTooltipHideOnHover);
}
setInvalidTooltipDisabledState(invalidTooltipDisabled) {
this.invalidTooltipDisabled$.next(invalidTooltipDisabled);
}
setInvalidTooltipState(invalidTooltip) {
this.invalidTooltip$.next(invalidTooltip);
}
setInvalidTooltipContentTemplateState(invalidTooltipContentTemplate) {
this.invalidTooltipContentTemplate$.next(invalidTooltipContentTemplate);
}
setDisabledState(isDisabled) {
this.isDisabled$.next(isDisabled);
}
processSelection(value) {
combineLatest([this.isMultiSelectionEnabled$, this.isUnselectionEnabled$, this.currentSerializedValue$])
.pipe(take(1), map(([isMultiSelectionEnabled, isUnselectionEnabled, currentSerializedValue]) => {
const upcomingSerializedValue = JSON.stringify(value);
const upcomingValueAlreadyExists = currentSerializedValue.has(upcomingSerializedValue);
const currentSerializedValueItems = Array.from(currentSerializedValue.values());
if (isMultiSelectionEnabled && upcomingValueAlreadyExists) {
const updatedItems = currentSerializedValueItems.filter((valueItem) => valueItem !== upcomingSerializedValue);
return new Set(updatedItems);
}
if (isMultiSelectionEnabled && !upcomingValueAlreadyExists) {
const updatedItems = [...currentSerializedValueItems, upcomingSerializedValue];
return new Set(updatedItems);
}
if (!isMultiSelectionEnabled && !upcomingValueAlreadyExists) {
return new Set([upcomingSerializedValue]);
}
return isUnselectionEnabled ? new Set() : new Set(currentSerializedValue);
}), withLatestFrom(this.onChangeCallback$, this.onTouchedCallback$, this.isMultiSelectionEnabled$))
.subscribe(([updatedValue, onChangeCallback, onTouchedCallback, isMultiSelectionEnabled]) => {
this.setIsFilled(updatedValue.size !== 0);
this.currentSerializedValue$.next(updatedValue);
this.isTouched$.next(true);
if (typeof onChangeCallback === 'function') {
const parsedValue = SelectStateService.getParsedValue(updatedValue);
onChangeCallback(isMultiSelectionEnabled ? parsedValue : parsedValue[0]);
}
if (typeof onTouchedCallback === 'function') {
onTouchedCallback();
}
if (!isMultiSelectionEnabled) {
this.collapse();
}
});
}
setIsFilled(isFilled) {
this.isFilled$.next(isFilled);
}
isPicked(value) {
return this.currentSerializedValue$.pipe(map((serializedSet) => {
const serializedValue = JSON.stringify(value);
return serializedSet.has(serializedValue);
}));
}
setValue(value) {
const sanitizedValue = Array.isArray(value) ? value : [value];
const serializedValue = sanitizedValue.map((valueItem) => JSON.stringify(valueItem));
const serializedSet = new Set(serializedValue);
this.currentSerializedValue$.next(serializedSet);
if (!isEmpty(value)) {
this.isTouched$.next(true);
}
}
reset() {
this.control$
.pipe(take(1), filterNotNil(), withLatestFrom(this.isMultiSelectionEnabled$, this.onTouchedCallback$, this.onChangeCallback$))
.subscribe(([control, isMultiSelectionEnable, onTouchedCallback, onChangeCallback]) => {
const resetValue = isMultiSelectionEnable ? [] : null;
control.control.setValue(resetValue);
if (typeof onTouchedCallback === 'function') {
onTouchedCallback();
}
if (typeof onChangeCallback === 'function') {
onChangeCallback(resetValue);
}
this.resetOutput.next();
});
}
processFocusInputContainer(inputElement) {
return this.isExpanded$
.pipe(filter(() => !isNil(inputElement)))
.subscribe((isExpanded) => isExpanded ? inputElement.nativeElement.focus() : inputElement.nativeElement.blur());
}
listenOutsideEventsForClose() {
const touchMove$ = fromEvent(this.document, 'touchmove');
const wheel$ = fromEvent(this.document, 'wheel');
const resize$ = fromEvent(window, 'resize');
merge(touchMove$, wheel$, resize$)
.pipe(take(1))
.subscribe(() => this.collapse());
}
static getParsedValue(serializedSet) {
const parsedValue = Array.from(serializedSet.values()).map((setValue) => JSON.parse(setValue));
return parsedValue;
}
}
SelectStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SelectStateService, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
SelectStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SelectStateService, providedIn: 'any' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SelectStateService, decorators: [{
type: Injectable,
args: [{
providedIn: 'any',
}]
}], ctorParameters: function () { return [{ type: Document, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LXN0YXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zZWxlY3Qvc2VydmljZXMvc2VsZWN0LXN0YXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBNkMsc0JBQXNCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBMEIsTUFBTSxlQUFlLENBQUM7QUFDckcsT0FBNkMsZ0JBQWdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFZLHVCQUF1QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdkcsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBYyxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9HLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHVFQUF1RSxDQUFDO0FBQ2pILE9BQTZFLDZFQUE2RSxDQUFDO0FBQzNKLE9BQWlDLHFEQUFxRCxDQUFDO0FBQ3ZGLE9BQWtDLHNEQUFzRCxDQUFDO0FBQ3pGLE9BQWlDLHFEQUFxRCxDQUFDO0FBQ3ZGLE9BQTJCLDhDQUE4QyxDQUFDOztBQU0xRSxNQUFNLE9BQU8sa0JBQWtCO0lBNEU3QixZQUErQyxRQUFrQjtRQUFsQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBM0VoRCw0QkFBdUIsR0FBaUMsSUFBSSxlQUFlLENBQzFGLElBQUksR0FBRyxFQUFVLENBQ2xCLENBQUM7UUFDYyxrQkFBYSxH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dmVybGF5T3JpZ2luLCBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIEluamVjdGFibGUsIE9uRGVzdHJveSwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sU3RhdHVzLCBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBmaWx0ZXJOb3ROaWwsIGlzRW1wdHksIGlzTmlsLCBOdWxsYWJsZSwgc2hhcmVSZXBsYXlXaXRoUmVmQ291bnQgfSBmcm9tICdAYmltZWlzdGVyL3V0aWxpdGllcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGZyb21FdmVudCwgbWVyZ2UsIE9ic2VydmFibGUsIG9mLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAsIHRha2UsIHdpdGhMYXRlc3RGcm9tIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgaXNGb3JtQ29udHJvbFZhbGlkU3RhdHVzIH0gZnJvbSAnLi4vLi4vLi4vZGVjbGFyYXRpb25zL2Z1bmN0aW9ucy9pcy1mb3JtLWNvbnRyb2wtdmFsaWQtc3RhdHVzLmZ1bmN0aW9uJztcbmltcG9ydCB7IFNlbGVjdFN0YXRlU2VydmljZURlY2xhcmF0aW9uIGFzIFNlbGVjdFN0YXRlU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL2RlY2xhcmF0aW9ucy9pbnRlcmZhY2VzL3NlbGVjdC1zdGF0ZS1zZXJ2aWNlLWRlY2xhcmF0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBPbkNoYW5nZUNhbGxiYWNrIH0gZnJvbSAnLi4vLi4vLi4vZGVjbGFyYXRpb25zL3R5cGVzL29uLWNoYW5nZS1jYWxsYmFjay50eXBlJztcbmltcG9ydCB7IE9uVG91Y2hlZENhbGxiYWNrIH0gZnJvbSAnLi4vLi4vLi4vZGVjbGFyYXRpb25zL3R5cGVzL29uLXRvdWNoZWQtY2FsbGJhY2sudHlwZSc7XG5pbXBvcnQgeyBTZWxlY3RPdXRlclZhbHVlIH0gZnJvbSAnLi4vLi4vLi4vZGVjbGFyYXRpb25zL3R5cGVzL3NlbGVjdC1vdXRlci12YWx1ZS50eXBlJztcbmltcG9ydCB7IFNlbGVjdFNpemUgfSBmcm9tICcuLi8uLi8uLi9kZWNsYXJhdGlvbnMvdHlwZXMvc2VsZWN0LXNpemUudHlwZSc7XG5cbi8qKiBAZHluYW1pYyAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAnYW55Jyxcbn0pXG5leHBvcnQgY2xhc3MgU2VsZWN0U3RhdGVTZXJ2aWNlPFQ+IGltcGxlbWVudHMgU2VsZWN0U3RhdGVTZXJ2aWNlSW50ZXJmYWNlPFQ+LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRTZXJpYWxpemVkVmFsdWUkOiBCZWhhdmlvclN1YmplY3Q8U2V0PHN0cmluZz4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTZXQ8c3RyaW5nPj4oXG4gICAgbmV3IFNldDxzdHJpbmc+KClcbiAgKTtcbiAgcHVibGljIHJlYWRvbmx5IGN1cnJlbnRWYWx1ZSQ6IE9ic2VydmFibGU8VFtdPiA9IHRoaXMuY3VycmVudFNlcmlhbGl6ZWRWYWx1ZSQucGlwZShcbiAgICBtYXAoKHNlcmlhbGl6ZWRTZXQ6IFNldDxzdHJpbmc+KSA9PiBTZWxlY3RTdGF0ZVNlcnZpY2UuZ2V0UGFyc2VkVmFsdWU8VD4oc2VyaWFsaXplZFNldCkpLFxuICAgIHNoYXJlUmVwbGF5V2l0aFJlZkNvdW50KClcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNNdWx0aVNlbGVjdGlvbkVuYWJsZWQkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpc1Vuc2VsZWN0aW9uRW5hYmxlZCQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgcmVhZG9ubHkgaXNEaXNhYmxlZCQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgcmVhZG9ubHkgaXNFeHBhbmRlZCQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgcmVhZG9ubHkgY29udHJvbCQ6IEJlaGF2aW9yU3ViamVjdDxOdWxsYWJsZTxOZ0NvbnRyb2w+PiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TnVsbGFibGU8TmdDb250cm9sPj4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSBpc1RvdWNoZWQkOiBCZWhhdmlvclN1YmplY3Q8TnVsbGFibGU8Ym9vbGVhbj4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxOdWxsYWJsZTxib29sZWFuPj4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSBpc1BhdGNoZWQkOiBCZWhhdmlvclN1YmplY3Q8TnVsbGFibGU8Ym9vbGVhbj4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxOdWxsYWJsZTxib29sZWFuPj4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSBpc1ZhbGlkJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuY29udHJvbCQucGlwZShcbiAgICBzd2l0Y2hNYXAoKGNvbnRyb2w6IE5nQ29udHJvbCkgPT5cbiAgICAgIGlzTmlsKGNvbnRyb2wpXG4gICAgICAgID8gb2YodHJ1ZSlcbiAgICAgICAgOiBjb250cm9sLnN0YXR1c0NoYW5nZXMucGlwZShcbiAgICAgICAgICAgIHN0YXJ0V2l0aChjb250cm9sLnN0YXR1cyksXG4gICAgICAgICAgICBtYXAoKHN0YXR1czogRm9ybUNvbnRyb2xTdGF0dXMpID0+IGlzRm9ybUNvbnRyb2xWYWxpZFN0YXR1cyhzdGF0dXMpKVxuICAgICAgICAgIClcbiAgICApLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXlXaXRoUmVmQ291bnQoKVxuICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBpc0ZpbGxlZCQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHB1YmxpYyByZWFkb25seSB3aXRoUmVzZXQkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIHJlYWRvbmx5IGlubGluZSQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgcmVhZG9ubHkgc2l6ZSQ6IEJlaGF2aW9yU3ViamVjdDxTZWxlY3RTaXplPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2VsZWN0U2l6ZT4oJ21lZGl1bScpO1xuXG4gIHB1YmxpYyByZWFkb25seSBpc1RyaWdnZXJUb3VjaGVkJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGludmFsaWRUb29sdGlwSGlkZU9uSG92ZXIkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIHJlYWRvbmx5IGludmFsaWRUb29sdGlwRGlzYWJsZWQkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIHJlYWRvbmx5IGludmFsaWRUb29sdGlwJDogQmVoYXZpb3JTdWJqZWN0PE51bGxhYmxlPHN0cmluZz4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxOdWxsYWJsZTxzdHJpbmc+PihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IGludmFsaWRUb29sdGlwQ29udGVudFRlbXBsYXRlJDogQmVoYXZpb3JTdWJqZWN0PE51bGxhYmxlPFRlbXBsYXRlUmVmPHVua25vd24+Pj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIE51bGxhYmxlPFRlbXBsYXRlUmVmPHVua25vd24+PlxuICA+KG51bGwpO1xuXG4gIHB1YmxpYyByZWFkb25seSBwbGFjZWhvbGRlciQ6IEJlaGF2aW9yU3ViamVjdDxOdWxsYWJsZTxzdHJpbmc+PiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TnVsbGFibGU8c3RyaW5nPj4obnVsbCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvbkNoYW5nZUNhbGxiYWNrJDogQmVoYXZpb3JTdWJqZWN0PE9uQ2hhbmdlQ2FsbGJhY2s8U2VsZWN0T3V0ZXJWYWx1ZTxUPj4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBPbkNoYW5nZUNhbGxiYWNrPFNlbGVjdE91dGVyVmFsdWU8VD4+XG4gID4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25Ub3VjaGVkQ2FsbGJhY2skOiBCZWhhdmlvclN1YmplY3Q8T25Ub3VjaGVkQ2FsbGJhY2s+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxPblRvdWNoZWRDYWxsYmFjaz4oXG4gICAgbnVsbFxuICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBkcm9wZG93bk92ZXJsYXlPcmlnaW4kOiBCZWhhdmlvclN1YmplY3Q8Q2RrT3ZlcmxheU9yaWdpbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENka092ZXJsYXlPcmlnaW4+KFxuICAgIG51bGxcbiAgKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkcm9wZG93blRyaWdnZXJCdXR0b24kOiBCZWhhdmlvclN1YmplY3Q8SFRNTEJ1dHRvbkVsZW1lbnQ+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxIVE1MQnV0dG9uRWxlbWVudD4oXG4gICAgbnVsbFxuICApO1xuICBwdWJsaWMgcmVhZG9ubHkgZHJvcGRvd25PdmVybGF5UmVmJDogQmVoYXZpb3JTdWJqZWN0PE92ZXJsYXlSZWY+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxPdmVybGF5UmVmPihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IGRyb3Bkb3duVHJpZ2dlckJ1dHRvbldpZHRoUHgkOiBPYnNlcnZhYmxlPG51bWJlcj4gPSB0aGlzLmRyb3Bkb3duVHJpZ2dlckJ1dHRvbiQucGlwZShcbiAgICBtYXAoKGJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsKSA9PiB7XG4gICAgICBpZiAoaXNOaWwoYnV0dG9uKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHdpZHRoIH06IERPTVJlY3QgPSBidXR0b24/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgcmV0dXJuIHdpZHRoO1xuICAgIH0pLFxuICAgIG1hcCgod2lkdGg6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4gKGlzTmlsKHdpZHRoKSA/IDAgOiB3aWR0aCkpXG4gICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHJlc2V0T3V0cHV0OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudDogRG9jdW1lbnQpIHt9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29udHJvbFJlZihjb250cm9sOiBOZ0NvbnRyb2wpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2wkLm5leHQoY29udHJvbCk7XG4gIH1cblxuICBwdWJsaWMgY29sbGFwc2UoKTogdm9pZCB7XG4gICAgdGhpcy5pc0V4cGFuZGVkJC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyBvcGVuKCk6IHZvaWQge1xuICAgIHRoaXMuaXNFeHBhbmRlZCQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmxpc3Rlbk91dHNpZGVFdmVudHNGb3JDbG9zZSgpO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZUV4cGFuc2lvbigpOiB2b2lkIHtcbiAgICB0aGlzLmlzRXhwYW5kZWQkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKChpc0V4cGFuZGVkOiBib29sZWFuKSA9PiB7XG4gICAgICBpc0V4cGFuZGVkID8gdGhpcy5jb2xsYXBzZSgpIDogdGhpcy5vcGVuKCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZGVmaW5lRHJvcGRvd25UcmlnZ2VyKG92ZXJsYXlPcmlnaW46IENka092ZXJsYXlPcmlnaW4sIGJ1dHRvbkVsZW1lbnQ6IEhUTUxCdXR0b25FbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5kcm9wZG93bk92ZXJsYXlPcmlnaW4kLm5leHQob3ZlcmxheU9yaWdpbik7XG4gICAgdGhpcy5kcm9wZG93blRyaWdnZXJCdXR0b24kLm5leHQoYnV0dG9uRWxlbWVudCk7XG4gIH1cblxuICBwdWJsaWMgZGVmaW5lRHJvcGRvd25PdmVybGF5UmVmKG92ZXJsYXlSZWY6IE92ZXJsYXlSZWYpOiB2b2lkIHtcbiAgICB0aGlzLmRyb3Bkb3duT3ZlcmxheVJlZiQubmV4dChvdmVybGF5UmVmKTtcbiAgfVxuXG4gIHB1YmxpYyBkZWZpbmVPbkNoYW5nZUNhbGxiYWNrKG9uQ2hhbmdlOiBPbkNoYW5nZUNhbGxiYWNrPFRbXT4pOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2skLm5leHQob25DaGFuZ2UpO1xuICB9XG5cbiAgcHVibGljIGRlZmluZU9uVG91Y2hlZENhbGxiYWNrKG9uVG91Y2hlZDogT25Ub3VjaGVkQ2FsbGJhY2spOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZENhbGxiYWNrJC5uZXh0KG9uVG91Y2hlZCk7XG4gIH1cblxuICBwdWJsaWMgc2V0TXVsdGlTZWxlY3Rpb25TdGF0ZShpc0VuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmlzTXVsdGlTZWxlY3Rpb25FbmFibGVkJC5uZXh0KGlzRW5hYmxlZCk7XG4gIH1cblxuICBwdWJsaWMgc2V0SXNUcmlnZ2VyVG91Y2hlZFN0YXRlKGlzVHJpZ2dlclRvdWNoZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmlzVHJpZ2dlclRvdWNoZWQkLm5leHQoaXNUcmlnZ2VyVG91Y2hlZCk7XG4gIH1cblxuICBwdWJsaWMgc2V0VW5zZWxlY3Rpb25TdGF0ZShpc0VuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmlzVW5zZWxlY3Rpb25FbmFibGVkJC5uZXh0KGlzRW5hYmxlZCk7XG4gIH1cblxuICBwdWJsaWMgc2V0SXNQYXRjaGVkU3RhdGUoaXNQYXRjaGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pc1BhdGNoZWQkLm5leHQoaXNQYXRjaGVkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRQbGFjZWhvbGRlclN0YXRlKHBsYWNlaG9sZGVyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnBsYWNlaG9sZGVyJC5uZXh0KHBsYWNlaG9sZGVyKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRXaXRoUmVzZXRTdGF0ZSh3aXRoUmVzZXQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLndpdGhSZXNldCQubmV4dCh3aXRoUmVzZXQpO1xuICB9XG5cbiAgcHVibGljIHNldElubGluZVN0YXRlKGlubGluZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaW5saW5lJC5uZXh0KGlubGluZSk7XG4gIH1cblxuICBwdWJsaWMgc2V0U2l6ZVN0YXRlKHNpemU6IFNlbGVjdFNpemUpOiB2b2lkIHtcbiAgICB0aGlzLnNpemUkLm5leHQoc2l6ZSk7XG4gIH1cblxuICBwdWJsaWMgc2V0SW52YWxpZFRvb2x0aXBIaWRlT25Ib3ZlclN0YXRlKGludmFsaWRUb29sdGlwSGlkZU9uSG92ZXI6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmludmFsaWRUb29sdGlwSGlkZU9uSG92ZXIkLm5leHQoaW52YWxpZFRvb2x0aXBIaWRlT25Ib3Zlcik7XG4gIH1cblxuICBwdWJsaWMgc2V0SW52YWxpZFRvb2x0aXBEaXNhYmxlZFN0YXRlKGludmFsaWRUb29sdGlwRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmludmFsaWRUb29sdGlwRGlzYWJsZWQkLm5leHQoaW52YWxpZFRvb2x0aXBEaXNhYmxlZCk7XG4gIH1cblxuICBwdWJsaWMgc2V0SW52YWxpZFRvb2x0aXBTdGF0ZShpbnZhbGlkVG9vbHRpcDogTnVsbGFibGU8c3RyaW5nPik6IHZvaWQge1xuICAgIHRoaXMuaW52YWxpZFRvb2x0aXAkLm5leHQoaW52YWxpZFRvb2x0aXApO1xuICB9XG5cbiAgcHVibGljIHNldEludmFsaWRUb29sdGlwQ29udGVudFRlbXBsYXRlU3RhdGUoaW52YWxpZFRvb2x0aXBDb250ZW50VGVtcGxhdGU6IE51bGxhYmxlPFRlbXBsYXRlUmVmPHVua25vd24+Pik6IHZvaWQge1xuICAgIHRoaXMuaW52YWxpZFRvb2x0aXBDb250ZW50VGVtcGxhdGUkLm5leHQoaW52YWxpZFRvb2x0aXBDb250ZW50VGVtcGxhdGUpO1xuICB9XG5cbiAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaXNEaXNhYmxlZCQubmV4dChpc0Rpc2FibGVkKTtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzU2VsZWN0aW9uKHZhbHVlOiBUKTogdm9pZCB7XG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5pc011bHRpU2VsZWN0aW9uRW5hYmxlZCQsIHRoaXMuaXNVbnNlbGVjdGlvbkVuYWJsZWQkLCB0aGlzLmN1cnJlbnRTZXJpYWxpemVkVmFsdWUkXSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICBtYXAoXG4gICAgICAgICAgKFtpc011bHRpU2VsZWN0aW9uRW5hYmxlZCwgaXNVbnNlbGVjdGlvbkVuYWJsZWQsIGN1cnJlbnRTZXJpYWxpemVkVmFsdWVdOiBbXG4gICAgICAgICAgICBib29sZWFuLFxuICAgICAgICAgICAgYm9vbGVhbixcbiAgICAgICAgICAgIFNldDxzdHJpbmc+XG4gICAgICAgICAgXSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXBjb21pbmdTZXJpYWxpemVkVmFsdWU6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcblxuICAgICAgICAgICAgY29uc3QgdXBjb21pbmdWYWx1ZUFscmVhZHlFeGlzdHM6IGJvb2xlYW4gPSBjdXJyZW50U2VyaWFsaXplZFZhbHVlLmhhcyh1cGNvbWluZ1NlcmlhbGl6ZWRWYWx1ZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTZXJpYWxpemVkVmFsdWVJdGVtczogc3RyaW5nW10gPSBBcnJheS5mcm9tKGN1cnJlbnRTZXJpYWxpemVkVmFsdWUudmFsdWVzKCkpO1xuXG4gICAgICAgICAgICBpZiAoaXNNdWx0aVNlbGVjdGlvbkVuYWJsZWQgJiYgdXBjb21pbmdWYWx1ZUFscmVhZHlFeGlzdHMpIHtcbiAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZEl0ZW1zOiBzdHJpbmdbXSA9IGN1cnJlbnRTZXJpYWxpemVkVmFsdWVJdGVtcy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKHZhbHVlSXRlbTogc3RyaW5nKSA9PiB2YWx1ZUl0ZW0gIT09IHVwY29taW5nU2VyaWFsaXplZFZhbHVlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgU2V0PHN0cmluZz4odXBkYXRlZEl0ZW1zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzTXVsdGlTZWxlY3Rpb25FbmFibGVkICYmICF1cGNvbWluZ1ZhbHVlQWxyZWFkeUV4aXN0cykge1xuICAgICAgICAgICAgICBjb25zdCB1cGRhdGVkSXRlbXM6IHN0cmluZ1tdID0gWy4uLmN1cnJlbnRTZXJpYWxpemVkVmFsdWVJdGVtcywgdXBjb21pbmdTZXJpYWxpemVkVmFsdWVdO1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IFNldDxzdHJpbmc+KHVwZGF0ZWRJdGVtcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghaXNNdWx0aVNlbGVjdGlvbkVuYWJsZWQgJiYgIXVwY29taW5nVmFsdWVBbHJlYWR5RXhpc3RzKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgU2V0PHN0cmluZz4oW3VwY29taW5nU2VyaWFsaXplZFZhbHVlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXNVbnNlbGVjdGlvbkVuYWJsZWQgPyBuZXcgU2V0PHN0cmluZz4oKSA6IG5ldyBTZXQ8c3RyaW5nPihjdXJyZW50U2VyaWFsaXplZFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMub25DaGFuZ2VDYWxsYmFjayQsIHRoaXMub25Ub3VjaGVkQ2FsbGJhY2skLCB0aGlzLmlzTXVsdGlTZWxlY3Rpb25FbmFibGVkJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgIChbdXBkYXRlZFZhbHVlLCBvbkNoYW5nZUNhbGxiYWNrLCBvblRvdWNoZWRDYWxsYmFjaywgaXNNdWx0aVNlbGVjdGlvbkVuYWJsZWRdOiBbXG4gICAgICAgICAgU2V0PHN0cmluZz4sXG4gICAgICAgICAgT25DaGFuZ2VDYWxsYmFjazxTZWxlY3RPdXRlclZhbHVlPFQ+PixcbiAgICAgICAgICBPblRvdWNoZWRDYWxsYmFjayxcbiAgICAgICAgICBib29sZWFuXG4gICAgICAgIF0pID0+IHtcbiAgICAgICAgICB0aGlzLnNldElzRmlsbGVkKHVwZGF0ZWRWYWx1ZS5zaXplICE9PSAwKTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRTZXJpYWxpemVkVmFsdWUkLm5leHQodXBkYXRlZFZhbHVlKTtcbiAgICAgICAgICB0aGlzLmlzVG91Y2hlZCQubmV4dCh0cnVlKTtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygb25DaGFuZ2VDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkVmFsdWU6IFRbXSA9IFNlbGVjdFN0YXRlU2VydmljZS5nZXRQYXJzZWRWYWx1ZTxUPih1cGRhdGVkVmFsdWUpO1xuICAgICAgICAgICAgb25DaGFuZ2VDYWxsYmFjayhpc011bHRpU2VsZWN0aW9uRW5hYmxlZCA/IHBhcnNlZFZhbHVlIDogcGFyc2VkVmFsdWVbMF0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2Ygb25Ub3VjaGVkQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG9uVG91Y2hlZENhbGxiYWNrKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFpc011bHRpU2VsZWN0aW9uRW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5jb2xsYXBzZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRJc0ZpbGxlZChpc0ZpbGxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaXNGaWxsZWQkLm5leHQoaXNGaWxsZWQpO1xuICB9XG5cbiAgcHVibGljIGlzUGlja2VkKHZhbHVlOiBUKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFNlcmlhbGl6ZWRWYWx1ZSQucGlwZShcbiAgICAgIG1hcCgoc2VyaWFsaXplZFNldDogU2V0PHN0cmluZz4pID0+IHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZFZhbHVlOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkU2V0LmhhcyhzZXJpYWxpemVkVmFsdWUpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNldFZhbHVlKHZhbHVlOiBTZWxlY3RPdXRlclZhbHVlPFQ+KTogdm9pZCB7XG4gICAgY29uc3Qgc2FuaXRpemVkVmFsdWU6IFRbXSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRWYWx1ZTogc3RyaW5nW10gPSBzYW5pdGl6ZWRWYWx1ZS5tYXAoKHZhbHVlSXRlbTogVCkgPT4gSlNPTi5zdHJpbmdpZnkodmFsdWVJdGVtKSk7XG4gICAgY29uc3Qgc2VyaWFsaXplZFNldDogU2V0PHN0cmluZz4gPSBuZXcgU2V0PHN0cmluZz4oc2VyaWFsaXplZFZhbHVlKTtcbiAgICB0aGlzLmN1cnJlbnRTZXJpYWxpemVkVmFsdWUkLm5leHQoc2VyaWFsaXplZFNldCk7XG5cbiAgICBpZiAoIWlzRW1wdHkodmFsdWUpKSB7XG4gICAgICB0aGlzLmlzVG91Y2hlZCQubmV4dCh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIGZpbHRlck5vdE5pbCgpLFxuICAgICAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLmlzTXVsdGlTZWxlY3Rpb25FbmFibGVkJCwgdGhpcy5vblRvdWNoZWRDYWxsYmFjayQsIHRoaXMub25DaGFuZ2VDYWxsYmFjayQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAoW2NvbnRyb2wsIGlzTXVsdGlTZWxlY3Rpb25FbmFibGUsIG9uVG91Y2hlZENhbGxiYWNrLCBvbkNoYW5nZUNhbGxiYWNrXTogW1xuICAgICAgICAgIE5nQ29udHJvbCxcbiAgICAgICAgICBib29sZWFuLFxuICAgICAgICAgIE9uVG91Y2hlZENhbGxiYWNrLFxuICAgICAgICAgIE9uQ2hhbmdlQ2FsbGJhY2s8VCB8IFRbXT5cbiAgICAgICAgXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc2V0VmFsdWU6IFQgfCBUW10gPSBpc011bHRpU2VsZWN0aW9uRW5hYmxlID8gW10gOiBudWxsO1xuXG4gICAgICAgICAgY29udHJvbC5jb250cm9sLnNldFZhbHVlKHJlc2V0VmFsdWUpO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBvblRvdWNoZWRDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgb25Ub3VjaGVkQ2FsbGJhY2soKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZW9mIG9uQ2hhbmdlQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG9uQ2hhbmdlQ2FsbGJhY2socmVzZXRWYWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5yZXNldE91dHB1dC5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgcHJvY2Vzc0ZvY3VzSW5wdXRDb250YWluZXIoaW5wdXRFbGVtZW50OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+KTogU3Vic2NyaXB0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5pc0V4cGFuZGVkJFxuICAgICAgLnBpcGUoZmlsdGVyKCgpID0+ICFpc05pbChpbnB1dEVsZW1lbnQpKSlcbiAgICAgIC5zdWJzY3JpYmUoKGlzRXhwYW5kZWQ6IGJvb2xlYW4pID0+XG4gICAgICAgIGlzRXhwYW5kZWQgPyBpbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpIDogaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYmx1cigpXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBsaXN0ZW5PdXRzaWRlRXZlbnRzRm9yQ2xvc2UoKTogdm9pZCB7XG4gICAgY29uc3QgdG91Y2hNb3ZlJDogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50PiA9IGZyb21FdmVudDxNb3VzZUV2ZW50Pih0aGlzLmRvY3VtZW50LCAndG91Y2htb3ZlJyk7XG4gICAgY29uc3Qgd2hlZWwkOiBPYnNlcnZhYmxlPE1vdXNlRXZlbnQ+ID0gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMuZG9jdW1lbnQsICd3aGVlbCcpO1xuICAgIGNvbnN0IHJlc2l6ZSQ6IE9ic2VydmFibGU8TW91c2VFdmVudD4gPSBmcm9tRXZlbnQ8TW91c2VFdmVudD4od2luZG93LCAncmVzaXplJyk7XG5cbiAgICBtZXJnZSh0b3VjaE1vdmUkLCB3aGVlbCQsIHJlc2l6ZSQpXG4gICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNvbGxhcHNlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UGFyc2VkVmFsdWU8Vj4oc2VyaWFsaXplZFNldDogU2V0PHN0cmluZz4pOiBWW10ge1xuICAgIGNvbnN0IHBhcnNlZFZhbHVlOiBWW10gPSBBcnJheS5mcm9tKHNlcmlhbGl6ZWRTZXQudmFsdWVzKCkpLm1hcCgoc2V0VmFsdWU6IHN0cmluZykgPT4gSlNPTi5wYXJzZShzZXRWYWx1ZSkpO1xuICAgIHJldHVybiBwYXJzZWRWYWx1ZTtcbiAgfVxufVxuIl19