UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

283 lines 31.6 kB
import { ScrollingModule } from '@angular/cdk/scrolling'; import { CommonModule as NgCommonModule } from '@angular/common'; import { APP_INITIALIZER, NgModule } from '@angular/core'; import { DataModule } from '@c8y/ngx-components/api'; import { TooltipModule } from 'ngx-bootstrap/tooltip'; import { setTheme } from 'ngx-bootstrap/utils'; import { distinctUntilChanged, filter, map, startWith, switchMap } from 'rxjs/operators'; import { I18nModule } from '../i18n/i18n.module'; import { TranslateService } from '../i18n/translate.service'; import { AssetLinkPipe } from './asset-link.pipe'; import { BytesPipe } from './bytes.pipe'; import { C8yComponentOutlet } from './component-outlet.directive'; import { DatePipe } from './date.pipe'; import { DropdownDirectionDirective } from './dropdown-direction.directive'; import { EmptyStateContextDirective } from './empty-state/empty-state-context.directive'; import { EmptyStateComponent } from './empty-state/empty-state.component'; import { ForOfDirective } from './forOf.directive'; import { GenericFileIconPipe } from './generic-file-icon.pipe'; import { GetGroupIconPipe } from './get-group-icon.pipe'; import { HumanizeAppNamePipe } from './humanize-app-name.pipe'; import { HumanizePipe } from './humanize.pipe'; import { IconDirective } from './icon.directive'; import { IfAllowedDirective } from './if-allowed.directive'; import { LoadMoreComponent } from './load-more.component'; import { LoadingComponent } from './loading.component'; import { MapFunctionPipe } from './map-function.pipe'; import { MarkdownToHtmlPipe } from './markdown-to-html.pipe'; import { MoNamePipe } from './mo-name.pipe'; import { NumberPipe } from './number.pipe'; import { OperationResultComponent } from './operation-result.component'; import { hookOptions } from './options.service'; import { OutletDirective } from './outlet.directive'; import { ProgressBarComponent } from './progress-bar.component'; import { ShortenUserNamePipe } from './shorten-user-name.pipe'; import { ShouldShowMoPipe } from './should-show-mo.pipe'; import { ShowIfFilterPipe } from './show-if-filter.pipe'; import { SkipLinkDirective } from './skip-link.directive'; import { StringifyObjectPipe } from './stringify-object.pipe'; import { TabsetAriaDirective } from './tabset-aria.directive'; import { TextareaAutoresizeDirective } from './textarea-autoresize.directive'; import { AppStateService } from './ui-state.service'; import { UserNameInitialsPipe } from './user-name-initials.pipe'; import { UserPreferencesService } from './user-preferences/user-preferences.service'; import { VirtualScrollWindowDirective } from './virtual-scroll/virtual-scroll-window.directive'; import { VirtualScrollerWrapperComponent } from './virtual-scroll/virtual-scroller-wrapper.component'; import * as i0 from "@angular/core"; export function initializeServices(translateService, state, userPreferences) { const initialize = () => { const queryStringLanguage = translateService.queryStringLang(); const firstLanguage = translateService.firstSupportedLanguage(); /* The ?lang parameter will prevent the user preference language from being activated */ if (queryStringLanguage && translateService.getSupported(queryStringLanguage)) { translateService.switchToLanguage(queryStringLanguage); } else { state.currentUser .pipe(map(user => user && user.userName), filter(u => !!u), distinctUntilChanged(), switchMap(() => userPreferences.get('language')), startWith(firstLanguage), filter(lang => !!lang), distinctUntilChanged()) .subscribe(lang => { translateService.switchToLanguage(lang); }); } }; return initialize; } /** * Commonly used directives, data access and translation. This module is the shared * module across all core components. It should be imported by default. * * @exports IconDirective A directive to set a c8y icon with [c8yIcon]="'rocket'". * @exports OutletDirective A directive which allows to set DOM or Angular templates (used for upgrade). * @exports I18nModule Translation module. * @exports NgCommonModule Angular common module. * @exports DataModule The data layer to allow DI with @c8y/client. * @exports HumanizeAppNamePipe Humanize an application name for display in e.g. the app switcher (e.g. `devicemanagement` becomes `Device Management`). * @exports HumanizePipe Humanize a string, e.g. `c8y_water_temperature` becomes `Water Temperature`. * @exports ShouldShowMoPipe Checks if passed managed object is device or group type. * @exports GetGroupIconPipe Gets proper group icon. * @exports ShortenUserNamePipe Allows a short name. E.g. `Foo Bar` gets `F. Bar`. * @exports UserNameInitialsPipe Allows the initials from the name. E.g. `Foo Bar` gets `FB`. * @exports ForOfDirective A forOf directive like ngFor but with load-more function. * @exports LoadMoreComponent A component to load more data from a certain data-source. * @exports ProgressBarComponent Displays either defined or undefined progress. * @exports DropdownDirectionDirective Determines if a dropdown opens to the bottom or to the top. * @exports TextareaAutoresizeDirective resizes a textarea height as the user inputs. * @exports OperationResultComponent displays an animated svg for success and error operations. */ export class CommonModule { static providers() { return [ ...DataModule.providers(), // TODO: maybe we can think of a way to remove this C8Y_APP global // tslint:disable-next-line hookOptions(window.C8Y_APP || {}), { provide: APP_INITIALIZER, useFactory: initializeServices, deps: [TranslateService, AppStateService, UserPreferencesService], multi: true }, ...I18nModule.providers(), HumanizePipe, ShouldShowMoPipe, GetGroupIconPipe, HumanizeAppNamePipe, ShortenUserNamePipe, MapFunctionPipe, DatePipe, BytesPipe ]; } static forRoot() { return { ngModule: CommonModule, providers: CommonModule.providers() }; } constructor() { setTheme('bs4'); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CommonModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); } static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: CommonModule, declarations: [OutletDirective, ShouldShowMoPipe, GetGroupIconPipe, ForOfDirective, LoadMoreComponent, MapFunctionPipe, ProgressBarComponent, DropdownDirectionDirective, TextareaAutoresizeDirective, TabsetAriaDirective, VirtualScrollerWrapperComponent, VirtualScrollWindowDirective, ShowIfFilterPipe, SkipLinkDirective, GenericFileIconPipe, StringifyObjectPipe], imports: [NgCommonModule, I18nModule, TooltipModule, ScrollingModule, AssetLinkPipe, C8yComponentOutlet, HumanizeAppNamePipe, IconDirective, DatePipe, LoadingComponent, EmptyStateComponent, EmptyStateContextDirective, BytesPipe, UserNameInitialsPipe, ShortenUserNamePipe, HumanizePipe, IfAllowedDirective, NumberPipe, OperationResultComponent, MarkdownToHtmlPipe, MoNamePipe], exports: [EmptyStateComponent, EmptyStateContextDirective, IconDirective, OutletDirective, I18nModule, NgCommonModule, HumanizeAppNamePipe, HumanizePipe, ShouldShowMoPipe, GetGroupIconPipe, IfAllowedDirective, ShortenUserNamePipe, UserNameInitialsPipe, ForOfDirective, LoadMoreComponent, MapFunctionPipe, ProgressBarComponent, DatePipe, NumberPipe, LoadingComponent, DropdownDirectionDirective, TextareaAutoresizeDirective, TabsetAriaDirective, OperationResultComponent, VirtualScrollerWrapperComponent, VirtualScrollWindowDirective, BytesPipe, ShowIfFilterPipe, SkipLinkDirective, MarkdownToHtmlPipe, MoNamePipe, GenericFileIconPipe, StringifyObjectPipe, AssetLinkPipe, C8yComponentOutlet] }); } static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CommonModule, providers: [AssetLinkPipe], imports: [NgCommonModule, I18nModule, TooltipModule, ScrollingModule, I18nModule, NgCommonModule] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CommonModule, decorators: [{ type: NgModule, args: [{ imports: [ NgCommonModule, I18nModule, TooltipModule, ScrollingModule, AssetLinkPipe, C8yComponentOutlet, HumanizeAppNamePipe, IconDirective, DatePipe, LoadingComponent, EmptyStateComponent, EmptyStateContextDirective, BytesPipe, UserNameInitialsPipe, ShortenUserNamePipe, HumanizePipe, IfAllowedDirective, NumberPipe, OperationResultComponent, MarkdownToHtmlPipe, MoNamePipe ], exports: [ EmptyStateComponent, EmptyStateContextDirective, IconDirective, OutletDirective, I18nModule, NgCommonModule, HumanizeAppNamePipe, HumanizePipe, ShouldShowMoPipe, GetGroupIconPipe, IfAllowedDirective, ShortenUserNamePipe, UserNameInitialsPipe, ForOfDirective, LoadMoreComponent, MapFunctionPipe, ProgressBarComponent, DatePipe, NumberPipe, LoadingComponent, DropdownDirectionDirective, TextareaAutoresizeDirective, TabsetAriaDirective, OperationResultComponent, VirtualScrollerWrapperComponent, VirtualScrollWindowDirective, BytesPipe, ShowIfFilterPipe, SkipLinkDirective, MarkdownToHtmlPipe, MoNamePipe, GenericFileIconPipe, StringifyObjectPipe, AssetLinkPipe, C8yComponentOutlet ], declarations: [ OutletDirective, ShouldShowMoPipe, GetGroupIconPipe, ForOfDirective, LoadMoreComponent, MapFunctionPipe, ProgressBarComponent, DropdownDirectionDirective, TextareaAutoresizeDirective, TabsetAriaDirective, VirtualScrollerWrapperComponent, VirtualScrollWindowDirective, ShowIfFilterPipe, SkipLinkDirective, GenericFileIconPipe, StringifyObjectPipe ], providers: [AssetLinkPipe] }] }], ctorParameters: () => [] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvY29tbW9uL2NvbW1vbi5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLElBQUksY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakUsT0FBTyxFQUFFLGVBQWUsRUFBdUIsUUFBUSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUN6RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDckYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDaEcsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0scURBQXFELENBQUM7O0FBRXRHLE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsZ0JBQWtDLEVBQ2xDLEtBQXNCLEVBQ3RCLGVBQXVDO0lBRXZDLE1BQU0sVUFBVSxHQUFHLEdBQUcsRUFBRTtRQUN0QixNQUFNLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQy9ELE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFFaEU7O1VBRUU7UUFDRixJQUFJLG1CQUFtQixJQUFJLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7WUFDOUUsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN6RCxDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssQ0FBQyxXQUFXO2lCQUNkLElBQUksQ0FDSCxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUNsQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ2hCLG9CQUFvQixFQUFFLEVBQ3RCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQ2hELFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUN0QixvQkFBb0IsRUFBRSxDQUN2QjtpQkFDQSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2hCLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFDLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNILENBQUMsQ0FBQztJQUNGLE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBa0ZILE1BQU0sT0FBTyxZQUFZO0lBQ3ZCLE1BQU0sQ0FBQyxTQUFTO1FBQ2QsT0FBTztZQUNMLEdBQUcsVUFBVSxDQUFDLFNBQVMsRUFBRTtZQUN6QixrRUFBa0U7WUFDbEUsMkJBQTJCO1lBQzNCLFdBQVcsQ0FBRSxNQUFjLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUMxQztnQkFDRSxPQUFPLEVBQUUsZUFBZTtnQkFDeEIsVUFBVSxFQUFFLGtCQUFrQjtnQkFDOUIsSUFBSSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLHNCQUFzQixDQUFDO2dCQUNqRSxLQUFLLEVBQUUsSUFBSTthQUNaO1lBQ0QsR0FBRyxVQUFVLENBQUMsU0FBUyxFQUFFO1lBQ3pCLFlBQVk7WUFDWixnQkFBZ0I7WUFDaEIsZ0JBQWdCO1lBQ2hCLG1CQUFtQjtZQUNuQixtQkFBbUI7WUFDbkIsZUFBZTtZQUNmLFFBQVE7WUFDUixTQUFTO1NBQ1YsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsT0FBTztRQUNaLE9BQU87WUFDTCxRQUFRLEVBQUUsWUFBWTtZQUN0QixTQUFTLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRTtTQUNwQyxDQUFDO0lBQ0osQ0FBQztJQUNEO1FBQ0UsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xCLENBQUM7K0dBakNVLFlBQVk7Z0hBQVosWUFBWSxpQkFuQnJCLGVBQWU7WUFDZixnQkFBZ0I7WUFDaEIsZ0JBQWdCO1lBQ2hCLGNBQWM7WUFDZCxpQkFBaUI7WUFDakIsZUFBZTtZQUNmLG9CQUFvQjtZQUNwQiwwQkFBMEI7WUFDMUIsMkJBQTJCO1lBQzNCLG1CQUFtQjtZQUNuQiwrQkFBK0I7WUFDL0IsNEJBQTRCO1lBQzVCLGdCQUFnQjtZQUNoQixpQkFBaUI7WUFDakIsbUJBQW1CO1lBQ25CLG1CQUFtQixhQTNFbkIsY0FBYztZQUNkLFVBQVU7WUFDVixhQUFhO1lBQ2IsZUFBZTtZQUNmLGFBQWE7WUFDYixrQkFBa0I7WUFDbEIsbUJBQW1CO1lBQ25CLGFBQWE7WUFDYixRQUFRO1lBQ1IsZ0JBQWdCO1lBQ2hCLG1CQUFtQjtZQUNuQiwwQkFBMEI7WUFDMUIsU0FBUztZQUNULG9CQUFvQjtZQUNwQixtQkFBbUI7WUFDbkIsWUFBWTtZQUNaLGtCQUFrQjtZQUNsQixVQUFVO1lBQ1Ysd0JBQXdCO1lBQ3hCLGtCQUFrQjtZQUNsQixVQUFVLGFBR1YsbUJBQW1CO1lBQ25CLDBCQUEwQjtZQUMxQixhQUFhO1lBQ2IsZUFBZTtZQUNmLFVBQVU7WUFDVixjQUFjO1lBQ2QsbUJBQW1CO1lBQ25CLFlBQVk7WUFDWixnQkFBZ0I7WUFDaEIsZ0JBQWdCO1lBQ2hCLGtCQUFrQjtZQUNsQixtQkFBbUI7WUFDbkIsb0JBQW9CO1lBQ3BCLGNBQWM7WUFDZCxpQkFBaUI7WUFDakIsZUFBZTtZQUNmLG9CQUFvQjtZQUNwQixRQUFRO1lBQ1IsVUFBVTtZQUNWLGdCQUFnQjtZQUNoQiwwQkFBMEI7WUFDMUIsMkJBQTJCO1lBQzNCLG1CQUFtQjtZQUNuQix3QkFBd0I7WUFDeEIsK0JBQStCO1lBQy9CLDRCQUE0QjtZQUM1QixTQUFTO1lBQ1QsZ0JBQWdCO1lBQ2hCLGlCQUFpQjtZQUNqQixrQkFBa0I7WUFDbEIsVUFBVTtZQUNWLG1CQUFtQjtZQUNuQixtQkFBbUI7WUFDbkIsYUFBYTtZQUNiLGtCQUFrQjtnSEFzQlQsWUFBWSxhQUZaLENBQUMsYUFBYSxDQUFDLFlBN0V4QixjQUFjO1lBQ2QsVUFBVTtZQUNWLGFBQWE7WUFDYixlQUFlLEVBd0JmLFVBQVU7WUFDVixjQUFjOzs0RkFtREwsWUFBWTtrQkFqRnhCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFO3dCQUNQLGNBQWM7d0JBQ2QsVUFBVTt3QkFDVixhQUFhO3dCQUNiLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixrQkFBa0I7d0JBQ2xCLG1CQUFtQjt3QkFDbkIsYUFBYTt3QkFDYixRQUFRO3dCQUNSLGdCQUFnQjt3QkFDaEIsbUJBQW1CO3dCQUNuQiwwQkFBMEI7d0JBQzFCLFNBQVM7d0JBQ1Qsb0JBQW9CO3dCQUNwQixtQkFBbUI7d0JBQ25CLFlBQVk7d0JBQ1osa0JBQWtCO3dCQUNsQixVQUFVO3dCQUNWLHdCQUF3Qjt3QkFDeEIsa0JBQWtCO3dCQUNsQixVQUFVO3FCQUNYO29CQUNELE9BQU8sRUFBRTt3QkFDUCxtQkFBbUI7d0JBQ25CLDBCQUEwQjt3QkFDMUIsYUFBYTt3QkFDYixlQUFlO3dCQUNmLFVBQVU7d0JBQ1YsY0FBYzt3QkFDZCxtQkFBbUI7d0JBQ25CLFlBQVk7d0JBQ1osZ0JBQWdCO3dCQUNoQixnQkFBZ0I7d0JBQ2hCLGtCQUFrQjt3QkFDbEIsbUJBQW1CO3dCQUNuQixvQkFBb0I7d0JBQ3BCLGNBQWM7d0JBQ2QsaUJBQWlCO3dCQUNqQixlQUFlO3dCQUNmLG9CQUFvQjt3QkFDcEIsUUFBUTt3QkFDUixVQUFVO3dCQUNWLGdCQUFnQjt3QkFDaEIsMEJBQTBCO3dCQUMxQiwyQkFBMkI7d0JBQzNCLG1CQUFtQjt3QkFDbkIsd0JBQXdCO3dCQUN4QiwrQkFBK0I7d0JBQy9CLDRCQUE0Qjt3QkFDNUIsU0FBUzt3QkFDVCxnQkFBZ0I7d0JBQ2hCLGlCQUFpQjt3QkFDakIsa0JBQWtCO3dCQUNsQixVQUFVO3dCQUNWLG1CQUFtQjt3QkFDbkIsbUJBQW1CO3dCQUNuQixhQUFhO3dCQUNiLGtCQUFrQjtxQkFDbkI7b0JBQ0QsWUFBWSxFQUFFO3dCQUNaLGVBQWU7d0JBQ2YsZ0JBQWdCO3dCQUNoQixnQkFBZ0I7d0JBQ2hCLGNBQWM7d0JBQ2QsaUJBQWlCO3dCQUNqQixlQUFlO3dCQUNmLG9CQUFvQjt3QkFDcEIsMEJBQTBCO3dCQUMxQiwyQkFBMkI7d0JBQzNCLG1CQUFtQjt3QkFDbkIsK0JBQStCO3dCQUMvQiw0QkFBNEI7d0JBQzVCLGdCQUFnQjt3QkFDaEIsaUJBQWlCO3dCQUNqQixtQkFBbUI7d0JBQ25CLG1CQUFtQjtxQkFDcEI7b0JBQ0QsU0FBUyxFQUFFLENBQUMsYUFBYSxDQUFDO2lCQUMzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNjcm9sbGluZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIGFzIE5nQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFQUF9JTklUSUFMSVpFUiwgTW9kdWxlV2l0aFByb3ZpZGVycywgTmdNb2R1bGUsIFByb3ZpZGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYXRhTW9kdWxlIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9hcGknO1xuaW1wb3J0IHsgVG9vbHRpcE1vZHVsZSB9IGZyb20gJ25neC1ib290c3RyYXAvdG9vbHRpcCc7XG5pbXBvcnQgeyBzZXRUaGVtZSB9IGZyb20gJ25neC1ib290c3RyYXAvdXRpbHMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCBzdGFydFdpdGgsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEkxOG5Nb2R1bGUgfSBmcm9tICcuLi9pMThuL2kxOG4ubW9kdWxlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9pMThuL3RyYW5zbGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IEFzc2V0TGlua1BpcGUgfSBmcm9tICcuL2Fzc2V0LWxpbmsucGlwZSc7XG5pbXBvcnQgeyBCeXRlc1BpcGUgfSBmcm9tICcuL2J5dGVzLnBpcGUnO1xuaW1wb3J0IHsgQzh5Q29tcG9uZW50T3V0bGV0IH0gZnJvbSAnLi9jb21wb25lbnQtb3V0bGV0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJy4vZGF0ZS5waXBlJztcbmltcG9ydCB7IERyb3Bkb3duRGlyZWN0aW9uRGlyZWN0aXZlIH0gZnJvbSAnLi9kcm9wZG93bi1kaXJlY3Rpb24uZGlyZWN0aXZlJztcbmltcG9ydCB7IEVtcHR5U3RhdGVDb250ZXh0RGlyZWN0aXZlIH0gZnJvbSAnLi9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS1jb250ZXh0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBFbXB0eVN0YXRlQ29tcG9uZW50IH0gZnJvbSAnLi9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRm9yT2ZEaXJlY3RpdmUgfSBmcm9tICcuL2Zvck9mLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBHZW5lcmljRmlsZUljb25QaXBlIH0gZnJvbSAnLi9nZW5lcmljLWZpbGUtaWNvbi5waXBlJztcbmltcG9ydCB7IEdldEdyb3VwSWNvblBpcGUgfSBmcm9tICcuL2dldC1ncm91cC1pY29uLnBpcGUnO1xuaW1wb3J0IHsgSHVtYW5pemVBcHBOYW1lUGlwZSB9IGZyb20gJy4vaHVtYW5pemUtYXBwLW5hbWUucGlwZSc7XG5pbXBvcnQgeyBIdW1hbml6ZVBpcGUgfSBmcm9tICcuL2h1bWFuaXplLnBpcGUnO1xuaW1wb3J0IHsgSWNvbkRpcmVjdGl2ZSB9IGZyb20gJy4vaWNvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWZBbGxvd2VkRGlyZWN0aXZlIH0gZnJvbSAnLi9pZi1hbGxvd2VkLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBMb2FkTW9yZUNvbXBvbmVudCB9IGZyb20gJy4vbG9hZC1tb3JlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMb2FkaW5nQ29tcG9uZW50IH0gZnJvbSAnLi9sb2FkaW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXBGdW5jdGlvblBpcGUgfSBmcm9tICcuL21hcC1mdW5jdGlvbi5waXBlJztcbmltcG9ydCB7IE1hcmtkb3duVG9IdG1sUGlwZSB9IGZyb20gJy4vbWFya2Rvd24tdG8taHRtbC5waXBlJztcbmltcG9ydCB7IE1vTmFtZVBpcGUgfSBmcm9tICcuL21vLW5hbWUucGlwZSc7XG5pbXBvcnQgeyBOdW1iZXJQaXBlIH0gZnJvbSAnLi9udW1iZXIucGlwZSc7XG5pbXBvcnQgeyBPcGVyYXRpb25SZXN1bHRDb21wb25lbnQgfSBmcm9tICcuL29wZXJhdGlvbi1yZXN1bHQuY29tcG9uZW50JztcbmltcG9ydCB7IGhvb2tPcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLnNlcnZpY2UnO1xuaW1wb3J0IHsgT3V0bGV0RGlyZWN0aXZlIH0gZnJvbSAnLi9vdXRsZXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IFByb2dyZXNzQmFyQ29tcG9uZW50IH0gZnJvbSAnLi9wcm9ncmVzcy1iYXIuY29tcG9uZW50JztcbmltcG9ydCB7IFNob3J0ZW5Vc2VyTmFtZVBpcGUgfSBmcm9tICcuL3Nob3J0ZW4tdXNlci1uYW1lLnBpcGUnO1xuaW1wb3J0IHsgU2hvdWxkU2hvd01vUGlwZSB9IGZyb20gJy4vc2hvdWxkLXNob3ctbW8ucGlwZSc7XG5pbXBvcnQgeyBTaG93SWZGaWx0ZXJQaXBlIH0gZnJvbSAnLi9zaG93LWlmLWZpbHRlci5waXBlJztcbmltcG9ydCB7IFNraXBMaW5rRGlyZWN0aXZlIH0gZnJvbSAnLi9za2lwLWxpbmsuZGlyZWN0aXZlJztcbmltcG9ydCB7IFN0cmluZ2lmeU9iamVjdFBpcGUgfSBmcm9tICcuL3N0cmluZ2lmeS1vYmplY3QucGlwZSc7XG5pbXBvcnQgeyBUYWJzZXRBcmlhRGlyZWN0aXZlIH0gZnJvbSAnLi90YWJzZXQtYXJpYS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgVGV4dGFyZWFBdXRvcmVzaXplRGlyZWN0aXZlIH0gZnJvbSAnLi90ZXh0YXJlYS1hdXRvcmVzaXplLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBBcHBTdGF0ZVNlcnZpY2UgfSBmcm9tICcuL3VpLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlck5hbWVJbml0aWFsc1BpcGUgfSBmcm9tICcuL3VzZXItbmFtZS1pbml0aWFscy5waXBlJztcbmltcG9ydCB7IFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UgfSBmcm9tICcuL3VzZXItcHJlZmVyZW5jZXMvdXNlci1wcmVmZXJlbmNlcy5zZXJ2aWNlJztcbmltcG9ydCB7IFZpcnR1YWxTY3JvbGxXaW5kb3dEaXJlY3RpdmUgfSBmcm9tICcuL3ZpcnR1YWwtc2Nyb2xsL3ZpcnR1YWwtc2Nyb2xsLXdpbmRvdy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgVmlydHVhbFNjcm9sbGVyV3JhcHBlckNvbXBvbmVudCB9IGZyb20gJy4vdmlydHVhbC1zY3JvbGwvdmlydHVhbC1zY3JvbGxlci13cmFwcGVyLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplU2VydmljZXMoXG4gIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gIHN0YXRlOiBBcHBTdGF0ZVNlcnZpY2UsXG4gIHVzZXJQcmVmZXJlbmNlczogVXNlclByZWZlcmVuY2VzU2VydmljZVxuKSB7XG4gIGNvbnN0IGluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgY29uc3QgcXVlcnlTdHJpbmdMYW5ndWFnZSA9IHRyYW5zbGF0ZVNlcnZpY2UucXVlcnlTdHJpbmdMYW5nKCk7XG4gICAgY29uc3QgZmlyc3RMYW5ndWFnZSA9IHRyYW5zbGF0ZVNlcnZpY2UuZmlyc3RTdXBwb3J0ZWRMYW5ndWFnZSgpO1xuXG4gICAgLypcbiAgICAgIFRoZSA/bGFuZyBwYXJhbWV0ZXIgd2lsbCBwcmV2ZW50IHRoZSB1c2VyIHByZWZlcmVuY2UgbGFuZ3VhZ2UgZnJvbSBiZWluZyBhY3RpdmF0ZWRcbiAgICAqL1xuICAgIGlmIChxdWVyeVN0cmluZ0xhbmd1YWdlICYmIHRyYW5zbGF0ZVNlcnZpY2UuZ2V0U3VwcG9ydGVkKHF1ZXJ5U3RyaW5nTGFuZ3VhZ2UpKSB7XG4gICAgICB0cmFuc2xhdGVTZXJ2aWNlLnN3aXRjaFRvTGFuZ3VhZ2UocXVlcnlTdHJpbmdMYW5ndWFnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmN1cnJlbnRVc2VyXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcCh1c2VyID0+IHVzZXIgJiYgdXNlci51c2VyTmFtZSksXG4gICAgICAgICAgZmlsdGVyKHUgPT4gISF1KSxcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB1c2VyUHJlZmVyZW5jZXMuZ2V0KCdsYW5ndWFnZScpKSxcbiAgICAgICAgICBzdGFydFdpdGgoZmlyc3RMYW5ndWFnZSksXG4gICAgICAgICAgZmlsdGVyKGxhbmcgPT4gISFsYW5nKSxcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZShsYW5nID0+IHtcbiAgICAgICAgICB0cmFuc2xhdGVTZXJ2aWNlLnN3aXRjaFRvTGFuZ3VhZ2UobGFuZyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGluaXRpYWxpemU7XG59XG5cbi8qKlxuICogQ29tbW9ubHkgdXNlZCBkaXJlY3RpdmVzLCBkYXRhIGFjY2VzcyBhbmQgdHJhbnNsYXRpb24uIFRoaXMgbW9kdWxlIGlzIHRoZSBzaGFyZWRcbiAqIG1vZHVsZSBhY3Jvc3MgYWxsIGNvcmUgY29tcG9uZW50cy4gSXQgc2hvdWxkIGJlIGltcG9ydGVkIGJ5IGRlZmF1bHQuXG4gKlxuICogQGV4cG9ydHMgSWNvbkRpcmVjdGl2ZSBBIGRpcmVjdGl2ZSB0byBzZXQgYSBjOHkgaWNvbiB3aXRoIFtjOHlJY29uXT1cIidyb2NrZXQnXCIuXG4gKiBAZXhwb3J0cyBPdXRsZXREaXJlY3RpdmUgQSBkaXJlY3RpdmUgd2hpY2ggYWxsb3dzIHRvIHNldCBET00gb3IgQW5ndWxhciB0ZW1wbGF0ZXMgKHVzZWQgZm9yIHVwZ3JhZGUpLlxuICogQGV4cG9ydHMgSTE4bk1vZHVsZSBUcmFuc2xhdGlvbiBtb2R1bGUuXG4gKiBAZXhwb3J0cyBOZ0NvbW1vbk1vZHVsZSBBbmd1bGFyIGNvbW1vbiBtb2R1bGUuXG4gKiBAZXhwb3J0cyBEYXRhTW9kdWxlIFRoZSBkYXRhIGxheWVyIHRvIGFsbG93IERJIHdpdGggQGM4eS9jbGllbnQuXG4gKiBAZXhwb3J0cyBIdW1hbml6ZUFwcE5hbWVQaXBlIEh1bWFuaXplIGFuIGFwcGxpY2F0aW9uIG5hbWUgZm9yIGRpc3BsYXkgaW4gZS5nLiB0aGUgYXBwIHN3aXRjaGVyIChlLmcuIGBkZXZpY2VtYW5hZ2VtZW50YCBiZWNvbWVzIGBEZXZpY2UgTWFuYWdlbWVudGApLlxuICogQGV4cG9ydHMgSHVtYW5pemVQaXBlIEh1bWFuaXplIGEgc3RyaW5nLCBlLmcuIGBjOHlfd2F0ZXJfdGVtcGVyYXR1cmVgIGJlY29tZXMgYFdhdGVyIFRlbXBlcmF0dXJlYC5cbiAqIEBleHBvcnRzIFNob3VsZFNob3dNb1BpcGUgQ2hlY2tzIGlmIHBhc3NlZCBtYW5hZ2VkIG9iamVjdCBpcyBkZXZpY2Ugb3IgZ3JvdXAgdHlwZS5cbiAqIEBleHBvcnRzIEdldEdyb3VwSWNvblBpcGUgR2V0cyBwcm9wZXIgZ3JvdXAgaWNvbi5cbiAqIEBleHBvcnRzIFNob3J0ZW5Vc2VyTmFtZVBpcGUgQWxsb3dzIGEgc2hvcnQgbmFtZS4gRS5nLiBgRm9vIEJhcmAgZ2V0cyBgRi4gQmFyYC5cbiAqIEBleHBvcnRzIFVzZXJOYW1lSW5pdGlhbHNQaXBlIEFsbG93cyB0aGUgaW5pdGlhbHMgZnJvbSB0aGUgbmFtZS4gRS5nLiBgRm9vIEJhcmAgZ2V0cyBgRkJgLlxuICogQGV4cG9ydHMgRm9yT2ZEaXJlY3RpdmUgQSBmb3JPZiBkaXJlY3RpdmUgbGlrZSBuZ0ZvciBidXQgd2l0aCBsb2FkLW1vcmUgZnVuY3Rpb24uXG4gKiBAZXhwb3J0cyBMb2FkTW9yZUNvbXBvbmVudCBBIGNvbXBvbmVudCB0byBsb2FkIG1vcmUgZGF0YSBmcm9tIGEgY2VydGFpbiBkYXRhLXNvdXJjZS5cbiAqIEBleHBvcnRzIFByb2dyZXNzQmFyQ29tcG9uZW50IERpc3BsYXlzIGVpdGhlciBkZWZpbmVkIG9yIHVuZGVmaW5lZCBwcm9ncmVzcy5cbiAqIEBleHBvcnRzIERyb3Bkb3duRGlyZWN0aW9uRGlyZWN0aXZlIERldGVybWluZXMgaWYgYSBkcm9wZG93biBvcGVucyB0byB0aGUgYm90dG9tIG9yIHRvIHRoZSB0b3AuXG4gKiBAZXhwb3J0cyBUZXh0YXJlYUF1dG9yZXNpemVEaXJlY3RpdmUgcmVzaXplcyBhIHRleHRhcmVhIGhlaWdodCBhcyB0aGUgdXNlciBpbnB1dHMuXG4gKiBAZXhwb3J0cyBPcGVyYXRpb25SZXN1bHRDb21wb25lbnQgZGlzcGxheXMgYW4gYW5pbWF0ZWQgc3ZnIGZvciBzdWNjZXNzIGFuZCBlcnJvciBvcGVyYXRpb25zLlxuICovXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgTmdDb21tb25Nb2R1bGUsXG4gICAgSTE4bk1vZHVsZSxcbiAgICBUb29sdGlwTW9kdWxlLFxuICAgIFNjcm9sbGluZ01vZHVsZSxcbiAgICBBc3NldExpbmtQaXBlLFxuICAgIEM4eUNvbXBvbmVudE91dGxldCxcbiAgICBIdW1hbml6ZUFwcE5hbWVQaXBlLFxuICAgIEljb25EaXJlY3RpdmUsXG4gICAgRGF0ZVBpcGUsXG4gICAgTG9hZGluZ0NvbXBvbmVudCxcbiAgICBFbXB0eVN0YXRlQ29tcG9uZW50LFxuICAgIEVtcHR5U3RhdGVDb250ZXh0RGlyZWN0aXZlLFxuICAgIEJ5dGVzUGlwZSxcbiAgICBVc2VyTmFtZUluaXRpYWxzUGlwZSxcbiAgICBTaG9ydGVuVXNlck5hbWVQaXBlLFxuICAgIEh1bWFuaXplUGlwZSxcbiAgICBJZkFsbG93ZWREaXJlY3RpdmUsXG4gICAgTnVtYmVyUGlwZSxcbiAgICBPcGVyYXRpb25SZXN1bHRDb21wb25lbnQsXG4gICAgTWFya2Rvd25Ub0h0bWxQaXBlLFxuICAgIE1vTmFtZVBpcGVcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIEVtcHR5U3RhdGVDb21wb25lbnQsXG4gICAgRW1wdHlTdGF0ZUNvbnRleHREaXJlY3RpdmUsXG4gICAgSWNvbkRpcmVjdGl2ZSxcbiAgICBPdXRsZXREaXJlY3RpdmUsXG4gICAgSTE4bk1vZHVsZSxcbiAgICBOZ0NvbW1vbk1vZHVsZSxcbiAgICBIdW1hbml6ZUFwcE5hbWVQaXBlLFxuICAgIEh1bWFuaXplUGlwZSxcbiAgICBTaG91bGRTaG93TW9QaXBlLFxuICAgIEdldEdyb3VwSWNvblBpcGUsXG4gICAgSWZBbGxvd2VkRGlyZWN0aXZlLFxuICAgIFNob3J0ZW5Vc2VyTmFtZVBpcGUsXG4gICAgVXNlck5hbWVJbml0aWFsc1BpcGUsXG4gICAgRm9yT2ZEaXJlY3RpdmUsXG4gICAgTG9hZE1vcmVDb21wb25lbnQsXG4gICAgTWFwRnVuY3Rpb25QaXBlLFxuICAgIFByb2dyZXNzQmFyQ29tcG9uZW50LFxuICAgIERhdGVQaXBlLFxuICAgIE51bWJlclBpcGUsXG4gICAgTG9hZGluZ0NvbXBvbmVudCxcbiAgICBEcm9wZG93bkRpcmVjdGlvbkRpcmVjdGl2ZSxcbiAgICBUZXh0YXJlYUF1dG9yZXNpemVEaXJlY3RpdmUsXG4gICAgVGFic2V0QXJpYURpcmVjdGl2ZSxcbiAgICBPcGVyYXRpb25SZXN1bHRDb21wb25lbnQsXG4gICAgVmlydHVhbFNjcm9sbGVyV3JhcHBlckNvbXBvbmVudCxcbiAgICBWaXJ0dWFsU2Nyb2xsV2luZG93RGlyZWN0aXZlLFxuICAgIEJ5dGVzUGlwZSxcbiAgICBTaG93SWZGaWx0ZXJQaXBlLFxuICAgIFNraXBMaW5rRGlyZWN0aXZlLFxuICAgIE1hcmtkb3duVG9IdG1sUGlwZSxcbiAgICBNb05hbWVQaXBlLFxuICAgIEdlbmVyaWNGaWxlSWNvblBpcGUsXG4gICAgU3RyaW5naWZ5T2JqZWN0UGlwZSxcbiAgICBBc3NldExpbmtQaXBlLFxuICAgIEM4eUNvbXBvbmVudE91dGxldFxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBPdXRsZXREaXJlY3RpdmUsXG4gICAgU2hvdWxkU2hvd01vUGlwZSxcbiAgICBHZXRHcm91cEljb25QaXBlLFxuICAgIEZvck9mRGlyZWN0aXZlLFxuICAgIExvYWRNb3JlQ29tcG9uZW50LFxuICAgIE1hcEZ1bmN0aW9uUGlwZSxcbiAgICBQcm9ncmVzc0JhckNvbXBvbmVudCxcbiAgICBEcm9wZG93bkRpcmVjdGlvbkRpcmVjdGl2ZSxcbiAgICBUZXh0YXJlYUF1dG9yZXNpemVEaXJlY3RpdmUsXG4gICAgVGFic2V0QXJpYURpcmVjdGl2ZSxcbiAgICBWaXJ0dWFsU2Nyb2xsZXJXcmFwcGVyQ29tcG9uZW50LFxuICAgIFZpcnR1YWxTY3JvbGxXaW5kb3dEaXJlY3RpdmUsXG4gICAgU2hvd0lmRmlsdGVyUGlwZSxcbiAgICBTa2lwTGlua0RpcmVjdGl2ZSxcbiAgICBHZW5lcmljRmlsZUljb25QaXBlLFxuICAgIFN0cmluZ2lmeU9iamVjdFBpcGVcbiAgXSxcbiAgcHJvdmlkZXJzOiBbQXNzZXRMaW5rUGlwZV1cbn0pXG5leHBvcnQgY2xhc3MgQ29tbW9uTW9kdWxlIHtcbiAgc3RhdGljIHByb3ZpZGVycygpOiBQcm92aWRlcltdIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4uRGF0YU1vZHVsZS5wcm92aWRlcnMoKSxcbiAgICAgIC8vIFRPRE86IG1heWJlIHdlIGNhbiB0aGluayBvZiBhIHdheSB0byByZW1vdmUgdGhpcyBDOFlfQVBQIGdsb2JhbFxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgICBob29rT3B0aW9ucygod2luZG93IGFzIGFueSkuQzhZX0FQUCB8fCB7fSksXG4gICAgICB7XG4gICAgICAgIHByb3ZpZGU6IEFQUF9JTklUSUFMSVpFUixcbiAgICAgICAgdXNlRmFjdG9yeTogaW5pdGlhbGl6ZVNlcnZpY2VzLFxuICAgICAgICBkZXBzOiBbVHJhbnNsYXRlU2VydmljZSwgQXBwU3RhdGVTZXJ2aWNlLCBVc2VyUHJlZmVyZW5jZXNTZXJ2aWNlXSxcbiAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgIH0sXG4gICAgICAuLi5JMThuTW9kdWxlLnByb3ZpZGVycygpLFxuICAgICAgSHVtYW5pemVQaXBlLFxuICAgICAgU2hvdWxkU2hvd01vUGlwZSxcbiAgICAgIEdldEdyb3VwSWNvblBpcGUsXG4gICAgICBIdW1hbml6ZUFwcE5hbWVQaXBlLFxuICAgICAgU2hvcnRlblVzZXJOYW1lUGlwZSxcbiAgICAgIE1hcEZ1bmN0aW9uUGlwZSxcbiAgICAgIERhdGVQaXBlLFxuICAgICAgQnl0ZXNQaXBlXG4gICAgXTtcbiAgfVxuXG4gIHN0YXRpYyBmb3JSb290KCk6IE1vZHVsZVdpdGhQcm92aWRlcnM8Q29tbW9uTW9kdWxlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBDb21tb25Nb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IENvbW1vbk1vZHVsZS5wcm92aWRlcnMoKVxuICAgIH07XG4gIH1cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc2V0VGhlbWUoJ2JzNCcpO1xuICB9XG59XG4iXX0=