barsa-novin-ray-core 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -0
- package/esm2020/barsa-novin-ray-core.mjs +5 -0
- package/esm2020/lib/abstract-classes/application-base.mjs +24 -0
- package/esm2020/lib/abstract-classes/barsa-api.mjs +40 -0
- package/esm2020/lib/abstract-classes/field-base.mjs +167 -0
- package/esm2020/lib/abstract-classes/files-validation-helper.mjs +71 -0
- package/esm2020/lib/abstract-classes/form-base.mjs +101 -0
- package/esm2020/lib/abstract-classes/form-props.base.mjs +79 -0
- package/esm2020/lib/abstract-classes/form-toolbar-base.mjs +45 -0
- package/esm2020/lib/abstract-classes/index.mjs +21 -0
- package/esm2020/lib/abstract-classes/layout-item-base.mjs +33 -0
- package/esm2020/lib/abstract-classes/layout-panel-base.mjs +80 -0
- package/esm2020/lib/abstract-classes/models.mjs +172 -0
- package/esm2020/lib/abstract-classes/module-with-dynamic-components.mjs +2 -0
- package/esm2020/lib/abstract-classes/number-base.mjs +117 -0
- package/esm2020/lib/abstract-classes/page-base.mjs +97 -0
- package/esm2020/lib/abstract-classes/report-base.mjs +231 -0
- package/esm2020/lib/abstract-classes/report-item-base.mjs +53 -0
- package/esm2020/lib/abstract-classes/report-view-base.component.mjs +262 -0
- package/esm2020/lib/abstract-classes/system-base.mjs +24 -0
- package/esm2020/lib/auth-guard.mjs +37 -0
- package/esm2020/lib/barsa-novin-ray-core-routing.module.mjs +18 -0
- package/esm2020/lib/barsa-novin-ray-core.module.mjs +271 -0
- package/esm2020/lib/base-ulv-setting.component.mjs +37 -0
- package/esm2020/lib/base.component.mjs +59 -0
- package/esm2020/lib/base.module.mjs +28 -0
- package/esm2020/lib/constants.mjs +441 -0
- package/esm2020/lib/container.component.mjs +76 -0
- package/esm2020/lib/custom-route-reuse-strategy.mjs +32 -0
- package/esm2020/lib/date-services/date-hijri.service.mjs +127 -0
- package/esm2020/lib/date-services/date-info.mjs +2 -0
- package/esm2020/lib/date-services/date-miladi.service.mjs +124 -0
- package/esm2020/lib/date-services/date-shamsi.service.mjs +129 -0
- package/esm2020/lib/date-services/date.service.mjs +139 -0
- package/esm2020/lib/date-services/index.mjs +6 -0
- package/esm2020/lib/device.mjs +663 -0
- package/esm2020/lib/directives/anchor-scroll.directive.mjs +24 -0
- package/esm2020/lib/directives/attr-rtl.directive.mjs +35 -0
- package/esm2020/lib/directives/base.directive.mjs +51 -0
- package/esm2020/lib/directives/column-resizer.directive.mjs +39 -0
- package/esm2020/lib/directives/dynamic-command.directive.mjs +43 -0
- package/esm2020/lib/directives/ellipsify.directive.mjs +72 -0
- package/esm2020/lib/directives/field-binding.directive.mjs +17 -0
- package/esm2020/lib/directives/img-lazy.directive.mjs +75 -0
- package/esm2020/lib/directives/index.mjs +19 -0
- package/esm2020/lib/directives/intersection-observer.directive.mjs +49 -0
- package/esm2020/lib/directives/items-renderer.directive.mjs +59 -0
- package/esm2020/lib/directives/numbers-only-input.directive.mjs +26 -0
- package/esm2020/lib/directives/placeHolder.directive.mjs +15 -0
- package/esm2020/lib/directives/render-ulv-paging.directive.mjs +58 -0
- package/esm2020/lib/directives/render-ulv-viewer.directive.mjs +60 -0
- package/esm2020/lib/directives/table-resizer.directive.mjs +235 -0
- package/esm2020/lib/directives/ulv-command.directive.mjs +41 -0
- package/esm2020/lib/directives/until-inview.directive.mjs +51 -0
- package/esm2020/lib/dynamic-component/base-dynamic.component.mjs +89 -0
- package/esm2020/lib/dynamic-component/base-form-toolbaritem-props.mjs +50 -0
- package/esm2020/lib/dynamic-component/base-item-content-props.mjs +70 -0
- package/esm2020/lib/dynamic-component/base-view-content-props.mjs +26 -0
- package/esm2020/lib/dynamic-component/base-view-item-props.mjs +374 -0
- package/esm2020/lib/dynamic-component/base-view-props.mjs +127 -0
- package/esm2020/lib/dynamic-component/dynamic-form-toolbar-item.component.mjs +36 -0
- package/esm2020/lib/dynamic-component/dynamic-form.component.mjs +62 -0
- package/esm2020/lib/dynamic-component/dynamic-item.component.mjs +60 -0
- package/esm2020/lib/dynamic-component/index.mjs +10 -0
- package/esm2020/lib/empty-page-with-router-and-router-outlet/empty-page-with-router-and-router-outlet.component.mjs +16 -0
- package/esm2020/lib/field-ui/field-ui.component.mjs +116 -0
- package/esm2020/lib/form/form.component.mjs +151 -0
- package/esm2020/lib/form-new/form-new.component.mjs +30 -0
- package/esm2020/lib/from-intersection-observer.mjs +53 -0
- package/esm2020/lib/global-error-handler.mjs +26 -0
- package/esm2020/lib/modal-root.component.mjs +31 -0
- package/esm2020/lib/not-found/not-found.component.mjs +16 -0
- package/esm2020/lib/pipes/barsa-icon-dict.pipe.mjs +18 -0
- package/esm2020/lib/pipes/bbb-translate.pipe.mjs +29 -0
- package/esm2020/lib/pipes/can-upload.pipe.mjs +30 -0
- package/esm2020/lib/pipes/context-menu.pipe.mjs +40 -0
- package/esm2020/lib/pipes/control-ui.pipe.mjs +31 -0
- package/esm2020/lib/pipes/convert-to-style.pipe.mjs +32 -0
- package/esm2020/lib/pipes/date-time-to-caption.pipe.mjs +34 -0
- package/esm2020/lib/pipes/fileinfo-count.pipe.mjs +20 -0
- package/esm2020/lib/pipes/filter-columns-by-details.pipe.mjs +20 -0
- package/esm2020/lib/pipes/filter-string.pipe.mjs +44 -0
- package/esm2020/lib/pipes/filter-tab.pipe.mjs +19 -0
- package/esm2020/lib/pipes/filter-toolbar-control.pipe.mjs +16 -0
- package/esm2020/lib/pipes/filter.pipe.mjs +33 -0
- package/esm2020/lib/pipes/find-column-by-db-name.pipe.mjs +17 -0
- package/esm2020/lib/pipes/fiori-icon.pipe.mjs +42 -0
- package/esm2020/lib/pipes/groupby.pipe.mjs +48 -0
- package/esm2020/lib/pipes/header-facet-value.pipe.mjs +22 -0
- package/esm2020/lib/pipes/index.mjs +33 -0
- package/esm2020/lib/pipes/list-count.pipe.mjs +17 -0
- package/esm2020/lib/pipes/merge-fields-to-columns.pipe.mjs +42 -0
- package/esm2020/lib/pipes/mo-info-ulv-data.pipe.mjs +24 -0
- package/esm2020/lib/pipes/mo-report-value-concat.pipe.mjs +35 -0
- package/esm2020/lib/pipes/mo-report-value.pipe.mjs +28 -0
- package/esm2020/lib/pipes/mo-value.pipe.mjs +31 -0
- package/esm2020/lib/pipes/multiple-groupby.pipe.mjs +97 -0
- package/esm2020/lib/pipes/numeral.pipe.mjs +40 -0
- package/esm2020/lib/pipes/picture-field-source.pipe.mjs +22 -0
- package/esm2020/lib/pipes/remove-newline.pipe.mjs +20 -0
- package/esm2020/lib/pipes/seperator-fix.pipe.mjs +23 -0
- package/esm2020/lib/pipes/sort.pipe.mjs +48 -0
- package/esm2020/lib/pipes/tlbButtons.pipe.mjs +58 -0
- package/esm2020/lib/pipes/total-summary.pipe.mjs +16 -0
- package/esm2020/lib/pipes/visible-value.pipe.mjs +24 -0
- package/esm2020/lib/portal-page/portal-page.component.mjs +13 -0
- package/esm2020/lib/redirect-home-guard.mjs +28 -0
- package/esm2020/lib/redirect-report-navigator-command/redirect-report-navigator-command.component.mjs +33 -0
- package/esm2020/lib/report-container/report-container.component.mjs +52 -0
- package/esm2020/lib/resolvers/index.mjs +5 -0
- package/esm2020/lib/resolvers/portal-dynamic-page.resolver.mjs +49 -0
- package/esm2020/lib/resolvers/portal-form-page.resolver.mjs +18 -0
- package/esm2020/lib/resolvers/portal-page.resolver.mjs +30 -0
- package/esm2020/lib/resolvers/portal-report-page.resolver.mjs +37 -0
- package/esm2020/lib/root-page/root-page.component.mjs +21 -0
- package/esm2020/lib/root-portal/root-portal.component.mjs +51 -0
- package/esm2020/lib/services/api.service.mjs +60 -0
- package/esm2020/lib/services/barsa-dialog.service.mjs +80 -0
- package/esm2020/lib/services/breadcrumb.service.mjs +60 -0
- package/esm2020/lib/services/container.service.mjs +36 -0
- package/esm2020/lib/services/dynamic-component.service.mjs +55 -0
- package/esm2020/lib/services/form-panel.service.mjs +235 -0
- package/esm2020/lib/services/form.service.mjs +14 -0
- package/esm2020/lib/services/horizontal-layout.service.mjs +16 -0
- package/esm2020/lib/services/index.mjs +16 -0
- package/esm2020/lib/services/layout.service.mjs +42 -0
- package/esm2020/lib/services/log.service.mjs +50 -0
- package/esm2020/lib/services/network-status.service.mjs +15 -0
- package/esm2020/lib/services/portal.service.mjs +638 -0
- package/esm2020/lib/services/ui.service.mjs +23 -0
- package/esm2020/lib/services/ulvmain.service.mjs +594 -0
- package/esm2020/lib/services/upload.service.mjs +75 -0
- package/esm2020/public-api.mjs +33 -0
- package/fesm2015/barsa-novin-ray-core.mjs +9047 -0
- package/fesm2015/barsa-novin-ray-core.mjs.map +1 -0
- package/fesm2020/barsa-novin-ray-core.mjs +8945 -0
- package/fesm2020/barsa-novin-ray-core.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/abstract-classes/application-base.d.ts +53 -0
- package/lib/abstract-classes/barsa-api.d.ts +28 -0
- package/lib/abstract-classes/field-base.d.ts +81 -0
- package/lib/abstract-classes/files-validation-helper.d.ts +15 -0
- package/lib/abstract-classes/form-base.d.ts +59 -0
- package/lib/abstract-classes/form-props.base.d.ts +45 -0
- package/lib/abstract-classes/form-toolbar-base.d.ts +17 -0
- package/lib/abstract-classes/index.d.ts +20 -0
- package/lib/abstract-classes/layout-item-base.d.ts +15 -0
- package/lib/abstract-classes/layout-panel-base.d.ts +24 -0
- package/lib/abstract-classes/models.d.ts +660 -0
- package/lib/abstract-classes/module-with-dynamic-components.d.ts +4 -0
- package/lib/abstract-classes/number-base.d.ts +20 -0
- package/lib/abstract-classes/page-base.d.ts +31 -0
- package/lib/abstract-classes/report-base.d.ts +97 -0
- package/lib/abstract-classes/report-item-base.d.ts +33 -0
- package/lib/abstract-classes/report-view-base.component.d.ts +130 -0
- package/lib/abstract-classes/system-base.d.ts +45 -0
- package/lib/auth-guard.d.ts +12 -0
- package/lib/barsa-novin-ray-core-routing.module.d.ts +7 -0
- package/lib/barsa-novin-ray-core.module.d.ts +88 -0
- package/lib/base-ulv-setting.component.d.ts +18 -0
- package/lib/base.component.d.ts +15 -0
- package/lib/base.module.d.ts +13 -0
- package/lib/constants.d.ts +89 -0
- package/lib/container.component.d.ts +33 -0
- package/lib/custom-route-reuse-strategy.d.ts +11 -0
- package/lib/date-services/date-hijri.service.d.ts +40 -0
- package/lib/date-services/date-info.d.ts +15 -0
- package/lib/date-services/date-miladi.service.d.ts +39 -0
- package/lib/date-services/date-shamsi.service.d.ts +40 -0
- package/lib/date-services/date.service.d.ts +54 -0
- package/lib/date-services/index.d.ts +5 -0
- package/lib/device.d.ts +15 -0
- package/lib/directives/anchor-scroll.directive.d.ts +7 -0
- package/lib/directives/attr-rtl.directive.d.ts +13 -0
- package/lib/directives/base.directive.d.ts +13 -0
- package/lib/directives/column-resizer.directive.d.ts +13 -0
- package/lib/directives/dynamic-command.directive.d.ts +12 -0
- package/lib/directives/ellipsify.directive.d.ts +17 -0
- package/lib/directives/field-binding.directive.d.ts +7 -0
- package/lib/directives/img-lazy.directive.d.ts +20 -0
- package/lib/directives/index.d.ts +18 -0
- package/lib/directives/intersection-observer.directive.d.ts +17 -0
- package/lib/directives/items-renderer.directive.d.ts +17 -0
- package/lib/directives/numbers-only-input.directive.d.ts +9 -0
- package/lib/directives/placeHolder.directive.d.ts +6 -0
- package/lib/directives/render-ulv-paging.directive.d.ts +19 -0
- package/lib/directives/render-ulv-viewer.directive.d.ts +19 -0
- package/lib/directives/table-resizer.directive.d.ts +47 -0
- package/lib/directives/ulv-command.directive.d.ts +11 -0
- package/lib/directives/until-inview.directive.d.ts +17 -0
- package/lib/dynamic-component/base-dynamic.component.d.ts +26 -0
- package/lib/dynamic-component/base-form-toolbaritem-props.d.ts +28 -0
- package/lib/dynamic-component/base-item-content-props.d.ts +40 -0
- package/lib/dynamic-component/base-view-content-props.d.ts +11 -0
- package/lib/dynamic-component/base-view-item-props.d.ts +95 -0
- package/lib/dynamic-component/base-view-props.d.ts +65 -0
- package/lib/dynamic-component/dynamic-form-toolbar-item.component.d.ts +18 -0
- package/lib/dynamic-component/dynamic-form.component.d.ts +33 -0
- package/lib/dynamic-component/dynamic-item.component.d.ts +30 -0
- package/lib/dynamic-component/index.d.ts +9 -0
- package/lib/empty-page-with-router-and-router-outlet/empty-page-with-router-and-router-outlet.component.d.ts +7 -0
- package/lib/field-ui/field-ui.component.d.ts +27 -0
- package/lib/form/form.component.d.ts +36 -0
- package/lib/form-new/form-new.component.d.ts +23 -0
- package/lib/from-intersection-observer.d.ts +7 -0
- package/lib/global-error-handler.d.ts +8 -0
- package/lib/modal-root.component.d.ts +15 -0
- package/lib/not-found/not-found.component.d.ts +8 -0
- package/lib/pipes/barsa-icon-dict.pipe.d.ts +9 -0
- package/lib/pipes/bbb-translate.pipe.d.ts +7 -0
- package/lib/pipes/can-upload.pipe.d.ts +8 -0
- package/lib/pipes/context-menu.pipe.d.ts +11 -0
- package/lib/pipes/control-ui.pipe.d.ts +9 -0
- package/lib/pipes/convert-to-style.pipe.d.ts +8 -0
- package/lib/pipes/date-time-to-caption.pipe.d.ts +9 -0
- package/lib/pipes/fileinfo-count.pipe.d.ts +10 -0
- package/lib/pipes/filter-columns-by-details.pipe.d.ts +8 -0
- package/lib/pipes/filter-string.pipe.d.ts +11 -0
- package/lib/pipes/filter-tab.pipe.d.ts +7 -0
- package/lib/pipes/filter-toolbar-control.pipe.d.ts +8 -0
- package/lib/pipes/filter.pipe.d.ts +10 -0
- package/lib/pipes/find-column-by-db-name.pipe.d.ts +8 -0
- package/lib/pipes/fiori-icon.pipe.d.ts +7 -0
- package/lib/pipes/groupby.pipe.d.ts +7 -0
- package/lib/pipes/header-facet-value.pipe.d.ts +8 -0
- package/lib/pipes/index.d.ts +32 -0
- package/lib/pipes/list-count.pipe.d.ts +8 -0
- package/lib/pipes/merge-fields-to-columns.pipe.d.ts +10 -0
- package/lib/pipes/mo-info-ulv-data.pipe.d.ts +7 -0
- package/lib/pipes/mo-report-value-concat.pipe.d.ts +9 -0
- package/lib/pipes/mo-report-value.pipe.d.ts +12 -0
- package/lib/pipes/mo-value.pipe.d.ts +9 -0
- package/lib/pipes/multiple-groupby.pipe.d.ts +23 -0
- package/lib/pipes/numeral.pipe.d.ts +9 -0
- package/lib/pipes/picture-field-source.pipe.d.ts +8 -0
- package/lib/pipes/remove-newline.pipe.d.ts +8 -0
- package/lib/pipes/seperator-fix.pipe.d.ts +7 -0
- package/lib/pipes/sort.pipe.d.ts +9 -0
- package/lib/pipes/tlbButtons.pipe.d.ts +9 -0
- package/lib/pipes/total-summary.pipe.d.ts +8 -0
- package/lib/pipes/visible-value.pipe.d.ts +8 -0
- package/lib/portal-page/portal-page.component.d.ts +6 -0
- package/lib/redirect-home-guard.d.ts +13 -0
- package/lib/redirect-report-navigator-command/redirect-report-navigator-command.component.d.ts +14 -0
- package/lib/report-container/report-container.component.d.ts +24 -0
- package/lib/resolvers/index.d.ts +4 -0
- package/lib/resolvers/portal-dynamic-page.resolver.d.ts +12 -0
- package/lib/resolvers/portal-form-page.resolver.d.ts +8 -0
- package/lib/resolvers/portal-page.resolver.d.ts +12 -0
- package/lib/resolvers/portal-report-page.resolver.d.ts +12 -0
- package/lib/root-page/root-page.component.d.ts +10 -0
- package/lib/root-portal/root-portal.component.d.ts +14 -0
- package/lib/services/api.service.d.ts +18 -0
- package/lib/services/barsa-dialog.service.d.ts +31 -0
- package/lib/services/breadcrumb.service.d.ts +14 -0
- package/lib/services/container.service.d.ts +14 -0
- package/lib/services/dynamic-component.service.d.ts +13 -0
- package/lib/services/form-panel.service.d.ts +83 -0
- package/lib/services/form.service.d.ts +8 -0
- package/lib/services/horizontal-layout.service.d.ts +7 -0
- package/lib/services/index.d.ts +15 -0
- package/lib/services/layout.service.d.ts +23 -0
- package/lib/services/log.service.d.ts +17 -0
- package/lib/services/network-status.service.d.ts +7 -0
- package/lib/services/portal.service.d.ts +130 -0
- package/lib/services/ui.service.d.ts +14 -0
- package/lib/services/ulvmain.service.d.ts +178 -0
- package/lib/services/upload.service.d.ts +18 -0
- package/package.json +38 -0
- package/public-api.d.ts +29 -0
|
@@ -0,0 +1,638 @@
|
|
|
1
|
+
import { Injectable, NgModuleFactory } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, of, from, forkJoin, fromEvent, Subject } from 'rxjs';
|
|
3
|
+
import { tap, map, concatMap, finalize, publishReplay, refCount, exhaustMap, distinctUntilChanged, startWith, debounceTime } from 'rxjs/operators';
|
|
4
|
+
import { BarsaApi } from '../abstract-classes/barsa-api';
|
|
5
|
+
import { getComponentDefined, getDeviceIsMobile, getDeviceIsTablet, getHeaderValue, getUniqueId } from '../constants';
|
|
6
|
+
import { PortalPageResolver } from '../resolvers/portal-page.resolver';
|
|
7
|
+
import { AuthGuard } from '../auth-guard';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "./dynamic-component.service";
|
|
10
|
+
import * as i2 from "./api.service";
|
|
11
|
+
import * as i3 from "./log.service";
|
|
12
|
+
import * as i4 from "./barsa-dialog.service";
|
|
13
|
+
import * as i5 from "@angular/router";
|
|
14
|
+
import * as i6 from "@angular/common";
|
|
15
|
+
export class PortalService {
|
|
16
|
+
constructor(dcm, apiService, logService, dialogService, compiler, _router, _location) {
|
|
17
|
+
this.dcm = dcm;
|
|
18
|
+
this.apiService = apiService;
|
|
19
|
+
this.logService = logService;
|
|
20
|
+
this.dialogService = dialogService;
|
|
21
|
+
this.compiler = compiler;
|
|
22
|
+
this._router = _router;
|
|
23
|
+
this._location = _location;
|
|
24
|
+
this.offsetTop = 0;
|
|
25
|
+
this.loginLoading = new BehaviorSubject(false);
|
|
26
|
+
this.loaded = false;
|
|
27
|
+
this.formPanels = {};
|
|
28
|
+
this.cachedImages = {};
|
|
29
|
+
this.cachedPageData = {};
|
|
30
|
+
this.pages = [];
|
|
31
|
+
this.rtlSource = new BehaviorSubject(BarsaApi.LoginFormData.IsRtl);
|
|
32
|
+
this.dictionary = {};
|
|
33
|
+
this.portalDataSource = new BehaviorSubject(null);
|
|
34
|
+
this._isAnonumousSource = new BehaviorSubject(true);
|
|
35
|
+
this._deviceSizeSource = new BehaviorSubject('l');
|
|
36
|
+
this._loggedInSource = new BehaviorSubject(false);
|
|
37
|
+
this.routeInitializedSource = new BehaviorSubject(false);
|
|
38
|
+
this.dateTextSource = new BehaviorSubject('');
|
|
39
|
+
this._navigationStart$ = new BehaviorSubject(null);
|
|
40
|
+
this._navigationEnd$ = new BehaviorSubject(null);
|
|
41
|
+
this._userPortalSettings$ = new BehaviorSubject(null);
|
|
42
|
+
this._notifications$ = new BehaviorSubject([]);
|
|
43
|
+
this._cssUrlSource = new BehaviorSubject(null);
|
|
44
|
+
this._cssCustomUrlSource = new BehaviorSubject(null);
|
|
45
|
+
this._searchTerm$ = new BehaviorSubject('');
|
|
46
|
+
this._windowResize$ = new Subject();
|
|
47
|
+
this.initialize();
|
|
48
|
+
this._isAnonumousSource.next(BarsaApi.LoginFormData.IsAnonymous);
|
|
49
|
+
}
|
|
50
|
+
get windowResize$() {
|
|
51
|
+
return this._windowResize$.asObservable();
|
|
52
|
+
}
|
|
53
|
+
get notifications$() {
|
|
54
|
+
return this._notifications$.asObservable();
|
|
55
|
+
}
|
|
56
|
+
get notificationsCount$() {
|
|
57
|
+
return this._notifications$.asObservable().pipe(map((items) => items.filter((c) => c.Unread).length));
|
|
58
|
+
}
|
|
59
|
+
get portalData() {
|
|
60
|
+
return this.portalDataSource.getValue();
|
|
61
|
+
}
|
|
62
|
+
get searchTerm$() {
|
|
63
|
+
return this._searchTerm$.asObservable();
|
|
64
|
+
}
|
|
65
|
+
get cssUrl$() {
|
|
66
|
+
return this._cssUrlSource.asObservable();
|
|
67
|
+
}
|
|
68
|
+
get cssCustomUrl$() {
|
|
69
|
+
return this._cssCustomUrlSource.asObservable();
|
|
70
|
+
}
|
|
71
|
+
get userPortalSettings() {
|
|
72
|
+
return this._userPortalSettings$.getValue();
|
|
73
|
+
}
|
|
74
|
+
get userPortalSettings$() {
|
|
75
|
+
return this._userPortalSettings$.asObservable();
|
|
76
|
+
}
|
|
77
|
+
get deviceSize() {
|
|
78
|
+
return this._deviceSizeSource.getValue();
|
|
79
|
+
}
|
|
80
|
+
get isAnonymous$() {
|
|
81
|
+
return this._isAnonumousSource.asObservable();
|
|
82
|
+
}
|
|
83
|
+
get navigationEnd$() {
|
|
84
|
+
return this._navigationEnd$.asObservable();
|
|
85
|
+
}
|
|
86
|
+
get navigationStart$() {
|
|
87
|
+
return this._navigationStart$.asObservable();
|
|
88
|
+
}
|
|
89
|
+
loadNotifications() {
|
|
90
|
+
BarsaApi.Bw.RunBlMethodAsync({
|
|
91
|
+
Parameters: [],
|
|
92
|
+
Method: 'GetShellbarNotifications',
|
|
93
|
+
SuccessFn: (moList) => {
|
|
94
|
+
this._notifications$.next(moList);
|
|
95
|
+
},
|
|
96
|
+
FailFn: (e) => {
|
|
97
|
+
this.logService.error(e);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
setSearchTerm(term) {
|
|
102
|
+
this._searchTerm$.next(term);
|
|
103
|
+
}
|
|
104
|
+
windowResize() {
|
|
105
|
+
this._windowResize$.next();
|
|
106
|
+
}
|
|
107
|
+
naviationEnd(event) {
|
|
108
|
+
this._navigationEnd$.next(event);
|
|
109
|
+
}
|
|
110
|
+
naviationStart(event) {
|
|
111
|
+
this._navigationStart$.next(event);
|
|
112
|
+
}
|
|
113
|
+
setUserPortalSettings(userPortalSettings) {
|
|
114
|
+
this._userPortalSettings$.next(userPortalSettings);
|
|
115
|
+
}
|
|
116
|
+
setTheme(themeUrl) {
|
|
117
|
+
this._cssUrlSource.next(themeUrl);
|
|
118
|
+
this._cssCustomUrlSource.next(themeUrl);
|
|
119
|
+
}
|
|
120
|
+
setData(key, data) {
|
|
121
|
+
if (!this.dictionary[key]) {
|
|
122
|
+
this.dictionary[key] = new BehaviorSubject(data);
|
|
123
|
+
this.dictionary[key].next(data);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
const oldVal = this.dictionary[key].getValue();
|
|
127
|
+
if (oldVal !== data) {
|
|
128
|
+
this.dictionary[key].next(data);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
getData(key, defaultValue = null) {
|
|
133
|
+
if (!this.dictionary[key]) {
|
|
134
|
+
this.dictionary[key] = new BehaviorSubject(defaultValue);
|
|
135
|
+
}
|
|
136
|
+
return this.dictionary[key].asObservable();
|
|
137
|
+
}
|
|
138
|
+
getDataSync(key, defaultValue = null) {
|
|
139
|
+
if (!this.dictionary[key]) {
|
|
140
|
+
return defaultValue;
|
|
141
|
+
}
|
|
142
|
+
return this.dictionary[key].getValue();
|
|
143
|
+
}
|
|
144
|
+
createForReport(navItem) {
|
|
145
|
+
return from(new Promise((resolve, reject) => {
|
|
146
|
+
BarsaApi.Ul.UlvMainCtrlr.CreateForReport({}, navItem, (err, result) => {
|
|
147
|
+
if (err) {
|
|
148
|
+
reject(err);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
resolve(result);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
}));
|
|
155
|
+
}
|
|
156
|
+
renderUlvMainUi(navItem, vcr, injector, isReportPage = false) {
|
|
157
|
+
return this.createForReport(navItem).pipe(exhaustMap((ulvMainCtrlr) => this.getUlvMainUiComponent(ulvMainCtrlr.Adapter.Control, injector, isReportPage).pipe(tap((ulvManiUiComponent) => vcr.insert(ulvManiUiComponent.hostView)), map(() => ulvMainCtrlr))));
|
|
158
|
+
}
|
|
159
|
+
getUlvMainUiComponent(customUlvMainUi, injector, isReportPage) {
|
|
160
|
+
const customUiSetting = BarsaApi.Common.Util.TryGetValue(customUlvMainUi.Setting, 'CustomUi', null);
|
|
161
|
+
const { moduleName, modulePath, componentName, selector } = getComponentDefined(customUlvMainUi, customUiSetting);
|
|
162
|
+
return this.getComponent(moduleName, modulePath, componentName, selector, injector).pipe(map((component) => {
|
|
163
|
+
const componentInstance = component.instance;
|
|
164
|
+
componentInstance.id = customUlvMainUi.id;
|
|
165
|
+
componentInstance.context = customUlvMainUi;
|
|
166
|
+
componentInstance.isReportPage = isReportPage;
|
|
167
|
+
customUlvMainUi.controlUi = componentInstance;
|
|
168
|
+
return component;
|
|
169
|
+
}));
|
|
170
|
+
}
|
|
171
|
+
initialize() {
|
|
172
|
+
this.deviceSize$ = this._deviceSizeSource.asObservable().pipe(distinctUntilChanged());
|
|
173
|
+
this.portalData$ = this.portalDataSource.asObservable();
|
|
174
|
+
this.rtl$ = this.rtlSource.asObservable().pipe(distinctUntilChanged());
|
|
175
|
+
this.dirValue$ = this.rtl$.pipe(map((isRtl) => (isRtl ? 'rtl' : 'ltr')));
|
|
176
|
+
this.routeInitialized$ = this.routeInitializedSource.asObservable().pipe(distinctUntilChanged());
|
|
177
|
+
this.dateText$ = this.dateTextSource.asObservable();
|
|
178
|
+
this.portalSettings$ = this.portalDataSource
|
|
179
|
+
.asObservable()
|
|
180
|
+
.pipe(map((portalData) => (portalData ? portalData.PortalSettings : {})));
|
|
181
|
+
fromEvent(window, 'resize')
|
|
182
|
+
.pipe(startWith(null), debounceTime(1000), map(() => this._initalizeDeviceSize()))
|
|
183
|
+
.subscribe((c) => {
|
|
184
|
+
this._windowResize$.next();
|
|
185
|
+
this._deviceSizeSource.next(c);
|
|
186
|
+
});
|
|
187
|
+
this.setUserLoginStatus(BarsaApi.LoginFormData.IsUserLoggedIn);
|
|
188
|
+
this.userLoggedIn$ = this._loggedInSource
|
|
189
|
+
.asObservable()
|
|
190
|
+
.pipe(map((isLoggedIn) => isLoggedIn && BarsaApi.LoginFormData.IsAnonymous === false));
|
|
191
|
+
}
|
|
192
|
+
_setDeviceSize() {
|
|
193
|
+
const deviceSize = this._initalizeDeviceSize();
|
|
194
|
+
this._deviceSizeSource.next(deviceSize);
|
|
195
|
+
}
|
|
196
|
+
_initalizeDeviceSize() {
|
|
197
|
+
const _ismobile = getDeviceIsMobile();
|
|
198
|
+
const _isTablet = getDeviceIsTablet();
|
|
199
|
+
let _windoWSize = 's';
|
|
200
|
+
if (window.innerWidth <= 600) {
|
|
201
|
+
_windoWSize = 's';
|
|
202
|
+
}
|
|
203
|
+
else if (window.innerWidth > 600 && window.innerWidth <= 992) {
|
|
204
|
+
_windoWSize = 'm';
|
|
205
|
+
}
|
|
206
|
+
else if (window.innerWidth > 992 && window.innerWidth <= 1200) {
|
|
207
|
+
_windoWSize = 'l';
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
_windoWSize = 'xl';
|
|
211
|
+
}
|
|
212
|
+
if (_ismobile) {
|
|
213
|
+
return 's';
|
|
214
|
+
}
|
|
215
|
+
if (_isTablet && _windoWSize !== 'l' && _windoWSize !== 'xl') {
|
|
216
|
+
return 'm';
|
|
217
|
+
}
|
|
218
|
+
return _windoWSize;
|
|
219
|
+
}
|
|
220
|
+
compileModule(dependency) {
|
|
221
|
+
const module$ = this.getModule(dependency);
|
|
222
|
+
return module$.pipe(concatMap((modules) => {
|
|
223
|
+
const moduleFactory = this.getNgModuleFactory(modules, dependency.name);
|
|
224
|
+
return of(moduleFactory);
|
|
225
|
+
}));
|
|
226
|
+
}
|
|
227
|
+
getModule(dependency) {
|
|
228
|
+
const { name, kebabName, umd, exportAs } = dependency;
|
|
229
|
+
const base = `/assets/modules/${kebabName}/bundles`;
|
|
230
|
+
const date = BarsaApi.LoginFormData.abc;
|
|
231
|
+
const path = `${base}/${kebabName}.umd.js?t=${date}`;
|
|
232
|
+
return of(true).pipe(concatMap(() => {
|
|
233
|
+
const modules = this.getRegisteredModules(umd, exportAs, name);
|
|
234
|
+
if (modules) {
|
|
235
|
+
return of(modules);
|
|
236
|
+
}
|
|
237
|
+
return this.loadJs$(path).pipe(map(() => this.getRegisteredModules(umd, exportAs, name)));
|
|
238
|
+
}));
|
|
239
|
+
}
|
|
240
|
+
setValueOnObject(path, index, modules, object) {
|
|
241
|
+
const splited = path.split('.');
|
|
242
|
+
const prop = splited[index];
|
|
243
|
+
if (typeof object[prop] === typeof undefined) {
|
|
244
|
+
object[prop] = {};
|
|
245
|
+
}
|
|
246
|
+
if (index === splited.length - 1) {
|
|
247
|
+
object[prop] = modules;
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
this.setValueOnObject(path, index + 1, modules, object[prop]);
|
|
251
|
+
}
|
|
252
|
+
getComponent(moduleName, modulePath, componentName, selector, parentInjector) {
|
|
253
|
+
return this.dcm.getComponentBySelector(selector, moduleName, parentInjector);
|
|
254
|
+
}
|
|
255
|
+
loadJs$(path) {
|
|
256
|
+
return from(new Promise((resolve, reject) => {
|
|
257
|
+
const script = document.createElement('script');
|
|
258
|
+
script.setAttribute('type', 'text/javascript');
|
|
259
|
+
script.setAttribute('src', path);
|
|
260
|
+
script.onload = () => {
|
|
261
|
+
resolve(path);
|
|
262
|
+
};
|
|
263
|
+
document.getElementsByTagName('head')[0].appendChild(script);
|
|
264
|
+
setTimeout(() => {
|
|
265
|
+
reject();
|
|
266
|
+
}, 5000);
|
|
267
|
+
}));
|
|
268
|
+
}
|
|
269
|
+
ReportExecute(reportName) {
|
|
270
|
+
return from(this.ReportExecutePromise(reportName));
|
|
271
|
+
}
|
|
272
|
+
ReportExecutePromise(reportName) {
|
|
273
|
+
const ulvParams = {
|
|
274
|
+
Flags: {
|
|
275
|
+
Data: 'True',
|
|
276
|
+
Extra: 'False',
|
|
277
|
+
Search: 'False',
|
|
278
|
+
View: 'False'
|
|
279
|
+
// General:"False", // ulvmainctrl does not craete ui control raise error
|
|
280
|
+
},
|
|
281
|
+
ReportName: reportName,
|
|
282
|
+
UsageEnum: 'SystemContainer'
|
|
283
|
+
};
|
|
284
|
+
return new Promise((resolve, reject) => {
|
|
285
|
+
BarsaApi.Bw.ExecuteReport({ ulvParams }, (result) => {
|
|
286
|
+
resolve(result.Data);
|
|
287
|
+
}, (err) => {
|
|
288
|
+
reject(err);
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
addFormPanelCtrlr(id, formpanelCtrlr) {
|
|
293
|
+
this.formPanels[id] = formpanelCtrlr;
|
|
294
|
+
}
|
|
295
|
+
setUserLoginStatus(status) {
|
|
296
|
+
this._loggedInSource.next(status);
|
|
297
|
+
}
|
|
298
|
+
extractAllPages(portalData) {
|
|
299
|
+
if (!portalData) {
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
portalData.ChildPageList.MoDataList.forEach((pageData) => {
|
|
303
|
+
this.addChildPages(pageData);
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
extractAllPages_Old(portalData) {
|
|
307
|
+
if (!portalData) {
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
const config = this._router.config;
|
|
311
|
+
portalData.ChildPageList.MoDataList.forEach((pageData) => {
|
|
312
|
+
const path = pageData.Route.replace('/', '');
|
|
313
|
+
config.push(this.createRoute(pageData, path, pageData.HasAuthorize, pageData.PageModule?.$Caption, null, null));
|
|
314
|
+
if (pageData.IsDefaultRoute) {
|
|
315
|
+
this.defaultRoute = path;
|
|
316
|
+
config.push(this.createRoute(pageData, '', false, portalData.PageModule?.$Caption, path, null));
|
|
317
|
+
}
|
|
318
|
+
this.addChildPages(pageData);
|
|
319
|
+
});
|
|
320
|
+
this._router.resetConfig(config);
|
|
321
|
+
if (this._location.path() === '') {
|
|
322
|
+
// this._router.navigate([this.defaultRoute]);
|
|
323
|
+
this._router.navigate(['']);
|
|
324
|
+
}
|
|
325
|
+
// this.routeInitialized();
|
|
326
|
+
}
|
|
327
|
+
ssoLogin() {
|
|
328
|
+
AjaxHelper.AjaxRequest('/api/base/ssologin', null, false, () => {
|
|
329
|
+
// console.log(response);
|
|
330
|
+
}, () => {
|
|
331
|
+
alert('error in sso login.');
|
|
332
|
+
}, null);
|
|
333
|
+
}
|
|
334
|
+
ssoLogout() {
|
|
335
|
+
AjaxHelper.AjaxRequest('/api/base/ssologout', null, false, () => {
|
|
336
|
+
// console.log(response);
|
|
337
|
+
}, () => {
|
|
338
|
+
alert('error in sso logout.');
|
|
339
|
+
}, null);
|
|
340
|
+
}
|
|
341
|
+
addChildPages(pageData) {
|
|
342
|
+
this.pages.push(pageData);
|
|
343
|
+
if (!pageData.ChildPageList?.MoDataList?.length) {
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
pageData.ChildPageList.MoDataList.forEach((childPage) => {
|
|
347
|
+
this.addChildPages(childPage);
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
/* eslint-disable */
|
|
351
|
+
createRoute(pageData, path, hasAuthorized, moduleName, redirectTo, isDynamicRoute) {
|
|
352
|
+
return {};
|
|
353
|
+
}
|
|
354
|
+
createRoute2(pageData, path, hasAuthorized, moduleName, redirectTo = null, isDynamicRoute = false) {
|
|
355
|
+
let modulePath = BarsaApi.Common.Util.GetKebabCase(moduleName);
|
|
356
|
+
const umd = moduleName;
|
|
357
|
+
modulePath = modulePath.substring(1, modulePath.length);
|
|
358
|
+
const dynamicRoute = {};
|
|
359
|
+
dynamicRoute.path = path;
|
|
360
|
+
dynamicRoute.data = { pageData };
|
|
361
|
+
if (!isDynamicRoute) {
|
|
362
|
+
dynamicRoute.resolve = {
|
|
363
|
+
pageData: PortalPageResolver
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
if (path === '') {
|
|
367
|
+
dynamicRoute.pathMatch = 'full';
|
|
368
|
+
}
|
|
369
|
+
if (redirectTo) {
|
|
370
|
+
dynamicRoute.redirectTo = redirectTo;
|
|
371
|
+
}
|
|
372
|
+
else {
|
|
373
|
+
if (hasAuthorized) {
|
|
374
|
+
dynamicRoute.canActivate = [AuthGuard];
|
|
375
|
+
}
|
|
376
|
+
dynamicRoute.loadChildren = () => {
|
|
377
|
+
const dependencies = JSON.parse(pageData.Dependencies); // eval(pageData.Dependencies);
|
|
378
|
+
const pageLibrary = {
|
|
379
|
+
name: moduleName,
|
|
380
|
+
kebabName: modulePath,
|
|
381
|
+
umd,
|
|
382
|
+
exportAs: [moduleName]
|
|
383
|
+
};
|
|
384
|
+
const dependencies$ = from(dependencies).pipe(concatMap((dependency) => this.compileModule(dependency)));
|
|
385
|
+
return forkJoin([dependencies$]).pipe(concatMap(() => this.getModule(pageLibrary)), map((modules) => modules[moduleName + 'Module']), tap(() => this.routeInitialized()));
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
return dynamicRoute;
|
|
389
|
+
}
|
|
390
|
+
routeInitialized() {
|
|
391
|
+
this.routeInitializedSource.next(true);
|
|
392
|
+
}
|
|
393
|
+
loginByAnonymous() {
|
|
394
|
+
this.loginLoading.next(true);
|
|
395
|
+
return this.apiService.loginPortal().pipe(map((result) => {
|
|
396
|
+
if (typeof result === 'object' && result !== null) {
|
|
397
|
+
this.logService.debug(result);
|
|
398
|
+
window.localStorage.setItem(BarsaApi.LoginAction.token2StorageKey, result.data.sth);
|
|
399
|
+
return true;
|
|
400
|
+
}
|
|
401
|
+
else {
|
|
402
|
+
return false;
|
|
403
|
+
}
|
|
404
|
+
}), finalize(() => {
|
|
405
|
+
this.loginLoading.next(false);
|
|
406
|
+
}));
|
|
407
|
+
}
|
|
408
|
+
getPageData(url, isRoot) {
|
|
409
|
+
if (isRoot || url === '' || url === '/') {
|
|
410
|
+
return this.portalData$;
|
|
411
|
+
}
|
|
412
|
+
if (url.indexOf('?') > -1) {
|
|
413
|
+
url = url.substr(0, url.indexOf('?'));
|
|
414
|
+
}
|
|
415
|
+
if (this.cachedPageData[url]) {
|
|
416
|
+
return this.cachedPageData[url];
|
|
417
|
+
}
|
|
418
|
+
const pageData = this.findPageByRoute(url);
|
|
419
|
+
AjaxHelper.UseCache = !pageData?.HasAuthorize;
|
|
420
|
+
this.cachedPageData[url] = this.apiService
|
|
421
|
+
.loadPortalPageData(pageData?.Id, this.portalDataSource.getValue()?.ChildPageList.TypeDefId)
|
|
422
|
+
.pipe(map((pageMo) => pageMo.Data.Mo), tap((pageMo) => {
|
|
423
|
+
this.addChildRoute(pageMo, pageMo.ChildPageList);
|
|
424
|
+
this.addChildPages(pageMo);
|
|
425
|
+
}), publishReplay(1), refCount());
|
|
426
|
+
// this.cachedPageData[url] = this.portalData$.pipe(
|
|
427
|
+
// filter((portalData) => portalData != null),
|
|
428
|
+
// map((portalData) => ),
|
|
429
|
+
// concatMap((pageData) => {
|
|
430
|
+
// return
|
|
431
|
+
// }),
|
|
432
|
+
// tap(pageData=>{})
|
|
433
|
+
// );
|
|
434
|
+
return this.cachedPageData[url];
|
|
435
|
+
}
|
|
436
|
+
resolveData(routePageData) {
|
|
437
|
+
// const pageData = this.pages.find((c) => c.Route === routePageData.Route && c.Module === routePageData.Module);
|
|
438
|
+
const pageData = this.pages.find((c) => c.Route === routePageData.Route);
|
|
439
|
+
if (!pageData) {
|
|
440
|
+
return of(null);
|
|
441
|
+
}
|
|
442
|
+
const id = pageData.Id;
|
|
443
|
+
if (this.cachedPageData[id]) {
|
|
444
|
+
return this.cachedPageData[id];
|
|
445
|
+
}
|
|
446
|
+
AjaxHelper.UseCache = !pageData?.HasAuthorize;
|
|
447
|
+
this.cachedPageData[id] = this.apiService
|
|
448
|
+
.loadPortalPageData(id, this.portalDataSource.getValue()?.ChildPageList.TypeDefId)
|
|
449
|
+
.pipe(map((pageMo) => pageMo.Data.Mo), tap((pageMo) => {
|
|
450
|
+
this.addChildRoute(pageMo, pageMo.ChildPageList);
|
|
451
|
+
this.addChildPages(pageMo);
|
|
452
|
+
}), publishReplay(1), refCount());
|
|
453
|
+
// this.cachedPageData[url] = this.portalData$.pipe(
|
|
454
|
+
// filter((portalData) => portalData != null),
|
|
455
|
+
// map((portalData) => ),
|
|
456
|
+
// concatMap((pageData) => {
|
|
457
|
+
// return
|
|
458
|
+
// }),
|
|
459
|
+
// tap(pageData=>{})
|
|
460
|
+
// );
|
|
461
|
+
return this.cachedPageData[id];
|
|
462
|
+
}
|
|
463
|
+
addChildRoute(pageMo, ChildPageList) {
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
466
|
+
addChildRoute_Old(pageMo, ChildPageList) {
|
|
467
|
+
if (!ChildPageList?.MoDataList?.length) {
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
const config = this._router.config;
|
|
471
|
+
const parentPath = pageMo.Route.replace('/', '');
|
|
472
|
+
const parentRoute = config.find((c) => (c.path = parentPath));
|
|
473
|
+
const children = [];
|
|
474
|
+
if (parentRoute) {
|
|
475
|
+
ChildPageList.MoDataList.forEach((child) => {
|
|
476
|
+
const path = child.Route.replace('/', '');
|
|
477
|
+
const childroute = this.createRoute(child, path, child.HasAuthorize, child.PageModule?.$Caption, null, true);
|
|
478
|
+
children.push(childroute);
|
|
479
|
+
});
|
|
480
|
+
// debugger;
|
|
481
|
+
parentRoute._loadedConfig.routes[0].children = children;
|
|
482
|
+
this._router.resetConfig(config);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
loadPortalData_Old1() {
|
|
486
|
+
return this.apiService.loadPortal(BarsaApi.LoginFormData.PortalId, BarsaApi.LoginFormData.PortalTypeDefId).pipe(tap((portalSetting) => {
|
|
487
|
+
const portalData = portalSetting.Data.Mo;
|
|
488
|
+
this.extractAllPages(portalData);
|
|
489
|
+
this.portalDataSource.next(portalData);
|
|
490
|
+
}), concatMap(() => from(this.loadSystems())), tap((all) => this.dateTextSource.next(BarsaApi.LoginFormData.DateText)));
|
|
491
|
+
}
|
|
492
|
+
loadPortalDataSync_Old2() {
|
|
493
|
+
const portalSetting = this.apiService.loadPortalSync(BarsaApi.LoginFormData.PortalId, BarsaApi.LoginFormData.PortalTypeDefId);
|
|
494
|
+
const portalData = portalSetting.Data.Mo;
|
|
495
|
+
this.extractAllPages(portalData);
|
|
496
|
+
this.portalDataSource.next(portalData);
|
|
497
|
+
this.loadSystems();
|
|
498
|
+
this.dateTextSource.next(BarsaApi.LoginFormData.DateText);
|
|
499
|
+
}
|
|
500
|
+
loadPortalDataSync() {
|
|
501
|
+
const portalSettingStr = BarsaApi.Bw.RunBlMethod('GetPortal', BarsaApi.LoginFormData.PortalId);
|
|
502
|
+
const portalSetting = BarsaApi.Ext.decode(portalSettingStr);
|
|
503
|
+
const portalData = portalSetting;
|
|
504
|
+
this.extractAllPages(portalData);
|
|
505
|
+
this.portalDataSource.next(portalData);
|
|
506
|
+
this.dateTextSource.next(BarsaApi.LoginFormData.DateText);
|
|
507
|
+
}
|
|
508
|
+
loadUserPortalSetting() {
|
|
509
|
+
BarsaApi.Bw.RunBlMethodAsync({
|
|
510
|
+
Parameters: [],
|
|
511
|
+
Method: 'GetUserPortalSettings',
|
|
512
|
+
SuccessFn: (userPortalSetting) => {
|
|
513
|
+
this._userPortalSettings$.next(userPortalSetting);
|
|
514
|
+
},
|
|
515
|
+
FailFn: (e) => {
|
|
516
|
+
this.logService.error(e);
|
|
517
|
+
}
|
|
518
|
+
});
|
|
519
|
+
}
|
|
520
|
+
ShowFormPanelControl(formpanelCtrlr, router, activatedRoute, dialogComponent, isPage, isReload = false) {
|
|
521
|
+
if (!formpanelCtrlr) {
|
|
522
|
+
console.warn('form panel controler is undefined!');
|
|
523
|
+
return;
|
|
524
|
+
}
|
|
525
|
+
const mo = formpanelCtrlr.Mo;
|
|
526
|
+
const headerLayout = BarsaApi.Common.Util.TryGetValue(formpanelCtrlr, 'Setting.View.HeaderLayout', null);
|
|
527
|
+
let isModal = BarsaApi.Common.Util.TryGetValue(formpanelCtrlr, 'Setting.View.ExtraJsonProp.Modal', false);
|
|
528
|
+
const modalSetting = BarsaApi.Common.Util.TryGetValue(formpanelCtrlr, 'Setting.View.CustomUi.Parameters.ModalSetting', null);
|
|
529
|
+
if (modalSetting) {
|
|
530
|
+
isModal = true;
|
|
531
|
+
}
|
|
532
|
+
formpanelCtrlr.Setting.IsModal = isModal;
|
|
533
|
+
formpanelCtrlr.IsModal = isModal;
|
|
534
|
+
const breadCrumb = getHeaderValue(headerLayout?.BreadCrumb);
|
|
535
|
+
const queryParams = {
|
|
536
|
+
id: mo.$State === 'New' ? '0' : mo.Id,
|
|
537
|
+
tyid: mo.$TypeDefId,
|
|
538
|
+
tycp: mo.$Caption ? mo.$Caption : null,
|
|
539
|
+
repid: mo.$ReportId,
|
|
540
|
+
vid: formpanelCtrlr?.Setting?.View?.TypeViewId,
|
|
541
|
+
bc: breadCrumb ? breadCrumb : mo.$State === 'New' ? mo.$TypeDefName : mo.$Caption
|
|
542
|
+
};
|
|
543
|
+
const id = getUniqueId(4);
|
|
544
|
+
this.addFormPanelCtrlr(id, formpanelCtrlr);
|
|
545
|
+
if (isModal) {
|
|
546
|
+
this.dialogService.showForm(dialogComponent, {
|
|
547
|
+
...queryParams,
|
|
548
|
+
formpanelCtrlr
|
|
549
|
+
});
|
|
550
|
+
}
|
|
551
|
+
else {
|
|
552
|
+
const state = { formPanelCtrlrId: id };
|
|
553
|
+
if (isPage) {
|
|
554
|
+
router.navigate([
|
|
555
|
+
'form',
|
|
556
|
+
{
|
|
557
|
+
outlets: {
|
|
558
|
+
main: ['show', { ...queryParams, formPanelCtrlrId: id, isFirst: true }]
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
], {
|
|
562
|
+
state,
|
|
563
|
+
relativeTo: activatedRoute,
|
|
564
|
+
skipLocationChange: isReload
|
|
565
|
+
});
|
|
566
|
+
}
|
|
567
|
+
else {
|
|
568
|
+
router.navigate([
|
|
569
|
+
'popup',
|
|
570
|
+
{
|
|
571
|
+
outlets: {
|
|
572
|
+
main: ['show', { ...queryParams, formPanelCtrlrId: id }]
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
], {
|
|
576
|
+
relativeTo: activatedRoute,
|
|
577
|
+
state,
|
|
578
|
+
queryParamsHandling: 'preserve',
|
|
579
|
+
skipLocationChange: isReload
|
|
580
|
+
});
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
loadSystems() {
|
|
585
|
+
return new Promise((resolve, reject) => {
|
|
586
|
+
BarsaApi.Ul.ApplicationCtrlr._loadSystem(0, true, (data) => {
|
|
587
|
+
resolve(data);
|
|
588
|
+
}, (err) => {
|
|
589
|
+
reject(err);
|
|
590
|
+
});
|
|
591
|
+
});
|
|
592
|
+
}
|
|
593
|
+
findPageByRoute(url) {
|
|
594
|
+
const findedPage = this.pages.find((c) => c.Route === url);
|
|
595
|
+
return findedPage || null;
|
|
596
|
+
}
|
|
597
|
+
getNgModuleFactory(modules, moduleName) {
|
|
598
|
+
const moduleClass = modules[moduleName + 'Module'];
|
|
599
|
+
let moduleFactory;
|
|
600
|
+
if (moduleClass instanceof NgModuleFactory) {
|
|
601
|
+
moduleFactory = moduleClass;
|
|
602
|
+
}
|
|
603
|
+
else {
|
|
604
|
+
const compiled = this.compiler.compileModuleAndAllComponentsSync(moduleClass);
|
|
605
|
+
moduleFactory = compiled.ngModuleFactory;
|
|
606
|
+
}
|
|
607
|
+
return moduleFactory;
|
|
608
|
+
}
|
|
609
|
+
getRegisteredModules(umd, exportAs, moduleName) {
|
|
610
|
+
let modules;
|
|
611
|
+
if (umd !== '') {
|
|
612
|
+
modules = window;
|
|
613
|
+
umd.split('.').forEach((c) => {
|
|
614
|
+
if (typeof modules !== typeof undefined) {
|
|
615
|
+
modules = modules[c];
|
|
616
|
+
}
|
|
617
|
+
});
|
|
618
|
+
}
|
|
619
|
+
else {
|
|
620
|
+
modules = window[moduleName];
|
|
621
|
+
}
|
|
622
|
+
if (exportAs.length > 0 && modules) {
|
|
623
|
+
exportAs.forEach((c) => {
|
|
624
|
+
this.setValueOnObject(c, 0, modules, window);
|
|
625
|
+
});
|
|
626
|
+
}
|
|
627
|
+
return modules;
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
PortalService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: PortalService, deps: [{ token: i1.DynamicComponentService }, { token: i2.ApiService }, { token: i3.LogService }, { token: i4.BarsaDialogService }, { token: i0.Compiler }, { token: i5.Router }, { token: i6.Location }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
631
|
+
PortalService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: PortalService, providedIn: 'root' });
|
|
632
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: PortalService, decorators: [{
|
|
633
|
+
type: Injectable,
|
|
634
|
+
args: [{
|
|
635
|
+
providedIn: 'root'
|
|
636
|
+
}]
|
|
637
|
+
}], ctorParameters: function () { return [{ type: i1.DynamicComponentService }, { type: i2.ApiService }, { type: i3.LogService }, { type: i4.BarsaDialogService }, { type: i0.Compiler }, { type: i5.Router }, { type: i6.Location }]; } });
|
|
638
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydGFsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1ub3Zpbi1yYXktY29yZS9zcmMvbGliL3NlcnZpY2VzL3BvcnRhbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBMEIsVUFBVSxFQUFZLGVBQWUsRUFBMEIsTUFBTSxlQUFlLENBQUM7QUFHdEgsT0FBTyxFQUFjLGVBQWUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNGLE9BQU8sRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILFNBQVMsRUFDVCxRQUFRLEVBQ1IsYUFBYSxFQUNiLFFBQVEsRUFDUixVQUFVLEVBQ1Ysb0JBQW9CLEVBQ3BCLFNBQVMsRUFDVCxZQUFZLEVBQ2YsTUFBTSxnQkFBZ0IsQ0FBQztBQWF4QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHekQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7QUFTMUMsTUFBTSxPQUFPLGFBQWE7SUFrQ3RCLFlBQ1ksR0FBNEIsRUFDNUIsVUFBc0IsRUFDdEIsVUFBc0IsRUFDdEIsYUFBaUMsRUFDakMsUUFBa0IsRUFDbEIsT0FBZSxFQUNmLFNBQW1CO1FBTm5CLFFBQUcsR0FBSCxHQUFHLENBQXlCO1FBQzVCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixrQkFBYSxHQUFiLGFBQWEsQ0FBb0I7UUFDakMsYUFB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QUFJLE9BQU8sT0FBTyxLQUFLLE9BQU8sU0FBUyxFQUFFO29CQUNyQyxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN4QjtZQUNMLENBQUMsQ0FBQyxDQUFDO1NBQ047YUFBTTtZQUNILE9BQU8sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDaEM7UUFDRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE9BQU8sRUFBRTtZQUNoQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNqRCxDQUFDLENBQUMsQ0FBQztTQUNOO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQzs7MEdBdnZCUSxhQUFhOzhHQUFiLGFBQWEsY0FGVixNQUFNOzJGQUVULGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcGlsZXIsIENvbXBvbmVudFJlZiwgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIE5nTW9kdWxlRmFjdG9yeSwgVHlwZSwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25FbmQsIE5hdmlnYXRpb25TdGFydCwgUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QsIG9mLCBmcm9tLCBmb3JrSm9pbiwgZnJvbUV2ZW50LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICAgIHRhcCxcbiAgICBtYXAsXG4gICAgY29uY2F0TWFwLFxuICAgIGZpbmFsaXplLFxuICAgIHB1Ymxpc2hSZXBsYXksXG4gICAgcmVmQ291bnQsXG4gICAgZXhoYXVzdE1hcCxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgICBzdGFydFdpdGgsXG4gICAgZGVib3VuY2VUaW1lXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtcbiAgICBBYmJyZXZhdGlvbkRldmljZVNpemUsXG4gICAgTG9naW5SZXN1bHQsXG4gICAgTWV0YW9iamVjdERhdGFNb2RlbCxcbiAgICBNb0ZvclJlcG9ydE1vZGVsLFxuICAgIFBhZ2VEYXRhTW9kZWwsXG4gICAgUG9ydGFsRGF0YU1vZGVsLFxuICAgIFJlcG9ydE1vZGVsXG59IGZyb20gJy4uL2Fic3RyYWN0LWNsYXNzZXMvbW9kZWxzJztcbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICcuL2FwaS5zZXJ2aWNlJztcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICcuL2xvZy5zZXJ2aWNlJztcbmltcG9ydCB7IEJhcnNhQXBpIH0gZnJvbSAnLi4vYWJzdHJhY3QtY2xhc3Nlcy9iYXJzYS1hcGknO1xuaW1wb3J0IHsgQmFyc2FEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi9iYXJzYS1kaWFsb2cuc2VydmljZSc7XG5cbmltcG9ydCB7IGdldENvbXBvbmVudERlZmluZWQsIGdldERldmljZUlzTW9iaWxlLCBnZXREZXZpY2VJc1RhYmxldCwgZ2V0SGVhZGVyVmFsdWUsIGdldFVuaXF1ZUlkIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFBvcnRhbFBhZ2VSZXNvbHZlciB9IGZyb20gJy4uL3Jlc29sdmVycy9wb3J0YWwtcGFnZS5yZXNvbHZlcic7XG5pbXBvcnQgeyBBdXRoR3VhcmQgfSBmcm9tICcuLi9hdXRoLWd1YXJkJztcbmltcG9ydCB7IER5bmFtaWNDb21wb25lbnRTZXJ2aWNlIH0gZnJvbSAnLi9keW5hbWljLWNvbXBvbmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhZmVSZXNvdXJjZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuXG5kZWNsYXJlIGxldCBBamF4SGVscGVyOiBhbnk7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUG9ydGFsU2VydmljZSB7XG4gICAgcHVibGljIG9mZnNldFRvcCA9IDA7XG5cbiAgICBsb2dpbkxvYWRpbmcgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgICBsb2FkZWQgPSBmYWxzZTtcbiAgICBmb3JtUGFuZWxzOiBhbnkgPSB7fTtcbiAgICBjYWNoZWRJbWFnZXM6IGFueSA9IHt9O1xuICAgIGRhdGVUZXh0JDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICAgIGRlZmF1bHRSb3V0ZTogc3RyaW5nO1xuICAgIGNhY2hlZFBhZ2VEYXRhOiB7IFtrZXk6IHN0cmluZ106IE9ic2VydmFibGU8UGFnZURhdGFNb2RlbD4gfSA9IHt9O1xuICAgIHBhZ2VzOiBQYWdlRGF0YU1vZGVsW10gPSBbXTtcbiAgICBydGxTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuSXNSdGwpO1xuICAgIHVzZXJMb2dnZWRJbiQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgZGljdGlvbmFyeTogeyBba2V5OiBzdHJpbmddOiBCZWhhdmlvclN1YmplY3Q8YW55PiB9ID0ge307XG4gICAgcG9ydGFsRGF0YVNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UG9ydGFsRGF0YU1vZGVsIHwgbnVsbD4obnVsbCk7XG4gICAgcG9ydGFsU2V0dGluZ3MkOiBPYnNlcnZhYmxlPE1ldGFvYmplY3REYXRhTW9kZWw+O1xuICAgIHBvcnRhbERhdGEkOiBPYnNlcnZhYmxlPFBvcnRhbERhdGFNb2RlbCB8IG51bGw+O1xuICAgIGRldmljZVNpemUkOiBPYnNlcnZhYmxlPEFiYnJldmF0aW9uRGV2aWNlU2l6ZT47XG4gICAgcnRsJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgICBkaXJWYWx1ZSQ6IE9ic2VydmFibGU8J3J0bCcgfCAnbHRyJz47XG4gICAgcm91dGVJbml0aWFsaXplZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgX2lzQW5vbnVtb3VzU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgICBwcml2YXRlIF9kZXZpY2VTaXplU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBYmJyZXZhdGlvbkRldmljZVNpemU+KCdsJyk7XG4gICAgcHJpdmF0ZSBfbG9nZ2VkSW5Tb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgICBwcml2YXRlIHJvdXRlSW5pdGlhbGl6ZWRTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgICBwcml2YXRlIGRhdGVUZXh0U291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgICBwcml2YXRlIF9uYXZpZ2F0aW9uU3RhcnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxOYXZpZ2F0aW9uU3RhcnQgfCBudWxsPihudWxsKTtcbiAgICBwcml2YXRlIF9uYXZpZ2F0aW9uRW5kJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TmF2aWdhdGlvbkVuZCB8IG51bGw+KG51bGwpO1xuICAgIHByaXZhdGUgX3VzZXJQb3J0YWxTZXR0aW5ncyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1ldGFvYmplY3REYXRhTW9kZWwgfCBudWxsPihudWxsKTtcbiAgICBwcml2YXRlIF9ub3RpZmljYXRpb25zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWV0YW9iamVjdERhdGFNb2RlbFtdPihbXSk7XG4gICAgcHJpdmF0ZSBfY3NzVXJsU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTYWZlUmVzb3VyY2VVcmwgfCBudWxsPihudWxsKTtcbiAgICBwcml2YXRlIF9jc3NDdXN0b21VcmxTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNhZmVSZXNvdXJjZVVybCB8IG51bGw+KG51bGwpO1xuICAgIHByaXZhdGUgX3NlYXJjaFRlcm0kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgICBwcml2YXRlIF93aW5kb3dSZXNpemUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBkY206IER5bmFtaWNDb21wb25lbnRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGFwaVNlcnZpY2U6IEFwaVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbG9nU2VydmljZTogTG9nU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlOiBCYXJzYURpYWxvZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY29tcGlsZXI6IENvbXBpbGVyLFxuICAgICAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSBfbG9jYXRpb246IExvY2F0aW9uXG4gICAgKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICAgICAgICB0aGlzLl9pc0Fub251bW91c1NvdXJjZS5uZXh0KEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuSXNBbm9ueW1vdXMpO1xuICAgIH1cbiAgICBnZXQgd2luZG93UmVzaXplJCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpbmRvd1Jlc2l6ZSQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuICAgIGdldCBub3RpZmljYXRpb25zJCgpOiBPYnNlcnZhYmxlPE1ldGFvYmplY3REYXRhTW9kZWxbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbm90aWZpY2F0aW9ucyQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuICAgIGdldCBub3RpZmljYXRpb25zQ291bnQkKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ub3RpZmljYXRpb25zJC5hc09ic2VydmFibGUoKS5waXBlKG1hcCgoaXRlbXMpID0+IGl0ZW1zLmZpbHRlcigoYykgPT4gYy5VbnJlYWQpLmxlbmd0aCkpO1xuICAgIH1cblxuICAgIGdldCBwb3J0YWxEYXRhKCk6IFBvcnRhbERhdGFNb2RlbCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3J0YWxEYXRhU291cmNlLmdldFZhbHVlKCk7XG4gICAgfVxuICAgIGdldCBzZWFyY2hUZXJtJCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VhcmNoVGVybSQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuICAgIGdldCBjc3NVcmwkKCk6IE9ic2VydmFibGU8U2FmZVJlc291cmNlVXJsIHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3NzVXJsU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cbiAgICBnZXQgY3NzQ3VzdG9tVXJsJCgpOiBPYnNlcnZhYmxlPFNhZmVSZXNvdXJjZVVybCB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nzc0N1c3RvbVVybFNvdXJjZS5hc09ic2VydmFibGUoKTtcbiAgICB9XG4gICAgZ2V0IHVzZXJQb3J0YWxTZXR0aW5ncygpOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl91c2VyUG9ydGFsU2V0dGluZ3MkLmdldFZhbHVlKCk7XG4gICAgfVxuICAgIGdldCB1c2VyUG9ydGFsU2V0dGluZ3MkKCk6IE9ic2VydmFibGU8TWV0YW9iamVjdERhdGFNb2RlbCB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJQb3J0YWxTZXR0aW5ncyQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuICAgIGdldCBkZXZpY2VTaXplKCk6IEFiYnJldmF0aW9uRGV2aWNlU2l6ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZXZpY2VTaXplU291cmNlLmdldFZhbHVlKCk7XG4gICAgfVxuICAgIGdldCBpc0Fub255bW91cyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0Fub251bW91c1NvdXJjZS5hc09ic2VydmFibGUoKTtcbiAgICB9XG4gICAgZ2V0IG5hdmlnYXRpb25FbmQkKCk6IE9ic2VydmFibGU8TmF2aWdhdGlvbkVuZCB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hdmlnYXRpb25FbmQkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cbiAgICBnZXQgbmF2aWdhdGlvblN0YXJ0JCgpOiBPYnNlcnZhYmxlPE5hdmlnYXRpb25TdGFydCB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hdmlnYXRpb25TdGFydCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuICAgIHB1YmxpYyBsb2FkTm90aWZpY2F0aW9ucygpOiB2b2lkIHtcbiAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XG4gICAgICAgICAgICBQYXJhbWV0ZXJzOiBbXSxcbiAgICAgICAgICAgIE1ldGhvZDogJ0dldFNoZWxsYmFyTm90aWZpY2F0aW9ucycsXG4gICAgICAgICAgICBTdWNjZXNzRm46IChtb0xpc3Q6IE1ldGFvYmplY3REYXRhTW9kZWxbXSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWNhdGlvbnMkLm5leHQobW9MaXN0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBGYWlsRm46IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2V0U2VhcmNoVGVybSh0ZXJtOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc2VhcmNoVGVybSQubmV4dCh0ZXJtKTtcbiAgICB9XG4gICAgd2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl93aW5kb3dSZXNpemUkLm5leHQoKTtcbiAgICB9XG4gICAgbmF2aWF0aW9uRW5kKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX25hdmlnYXRpb25FbmQkLm5leHQoZXZlbnQpO1xuICAgIH1cbiAgICBuYXZpYXRpb25TdGFydChldmVudDogTmF2aWdhdGlvblN0YXJ0KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX25hdmlnYXRpb25TdGFydCQubmV4dChldmVudCk7XG4gICAgfVxuICAgIHNldFVzZXJQb3J0YWxTZXR0aW5ncyh1c2VyUG9ydGFsU2V0dGluZ3M6IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdXNlclBvcnRhbFNldHRpbmdzJC5uZXh0KHVzZXJQb3J0YWxTZXR0aW5ncyk7XG4gICAgfVxuICAgIHNldFRoZW1lKHRoZW1lVXJsOiBTYWZlUmVzb3VyY2VVcmwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY3NzVXJsU291cmNlLm5leHQodGhlbWVVcmwpO1xuICAgICAgICB0aGlzLl9jc3NDdXN0b21VcmxTb3VyY2UubmV4dCh0aGVtZVVybCk7XG4gICAgfVxuICAgIHNldERhdGEoa2V5LCBkYXRhKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5kaWN0aW9uYXJ5W2tleV0pIHtcbiAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyeVtrZXldID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KGRhdGEpO1xuICAgICAgICAgICAgdGhpcy5kaWN0aW9uYXJ5W2tleV0ubmV4dChkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZFZhbCA9IHRoaXMuZGljdGlvbmFyeVtrZXldLmdldFZhbHVlKCk7XG4gICAgICAgICAgICBpZiAob2xkVmFsICE9PSBkYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaWN0aW9uYXJ5W2tleV0ubmV4dChkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXREYXRhKGtleSwgZGVmYXVsdFZhbHVlOiBhbnkgPSBudWxsKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgaWYgKCF0aGlzLmRpY3Rpb25hcnlba2V5XSkge1xuICAgICAgICAgICAgdGhpcy5kaWN0aW9uYXJ5W2tleV0gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5kaWN0aW9uYXJ5W2tleV0uYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuICAgIGdldERhdGFTeW5jPFQ+KGtleSwgZGVmYXVsdFZhbHVlOiBhbnkgPSBudWxsKTogVCB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMuZGljdGlvbmFyeVtrZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3Rpb25hcnlba2V5XS5nZXRWYWx1ZSgpO1xuICAgIH1cbiAgICBjcmVhdGVGb3JSZXBvcnQobmF2SXRlbSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIHJldHVybiBmcm9tKFxuICAgICAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIEJhcnNhQXBpLlVsLlVsdk1haW5DdHJsci5DcmVhdGVGb3JSZXBvcnQoe30sIG5hdkl0ZW0sIChlcnIsIHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmVuZGVyVWx2TWFpblVpKFxuICAgICAgICBuYXZJdGVtLFxuICAgICAgICB2Y3I6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgaXNSZXBvcnRQYWdlOiBib29sZWFuID0gZmFsc2VcbiAgICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVGb3JSZXBvcnQobmF2SXRlbSkucGlwZShcbiAgICAgICAgICAgIGV4aGF1c3RNYXAoKHVsdk1haW5DdHJscikgPT5cbiAgICAgICAgICAgICAgICB0aGlzLmdldFVsdk1haW5VaUNvbXBvbmVudCh1bHZNYWluQ3RybHIuQWRhcHRlci5Db250cm9sLCBpbmplY3RvciwgaXNSZXBvcnRQYWdlKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YXAoKHVsdk1hbmlVaUNvbXBvbmVudCkgPT4gdmNyLmluc2VydCh1bHZNYW5pVWlDb21wb25lbnQuaG9zdFZpZXcpKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwKCgpID0+IHVsdk1haW5DdHJscilcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuICAgIGdldFVsdk1haW5VaUNvbXBvbmVudChjdXN0b21VbHZNYWluVWksIGluamVjdG9yOiBJbmplY3RvciwgaXNSZXBvcnRQYWdlKTogT2JzZXJ2YWJsZTxDb21wb25lbnRSZWY8YW55Pj4ge1xuICAgICAgICBjb25zdCBjdXN0b21VaVNldHRpbmcgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZShjdXN0b21VbHZNYWluVWkuU2V0dGluZywgJ0N1c3RvbVVpJywgbnVsbCk7XG4gICAgICAgIGNvbnN0IHsgbW9kdWxlTmFtZSwgbW9kdWxlUGF0aCwgY29tcG9uZW50TmFtZSwgc2VsZWN0b3IgfSA9IGdldENvbXBvbmVudERlZmluZWQoXG4gICAgICAgICAgICBjdXN0b21VbHZNYWluVWksXG4gICAgICAgICAgICBjdXN0b21VaVNldHRpbmdcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50KG1vZHVsZU5hbWUsIG1vZHVsZVBhdGgsIGNvbXBvbmVudE5hbWUsIHNlbGVjdG9yLCBpbmplY3RvcikucGlwZShcbiAgICAgICAgICAgIG1hcCgoY29tcG9uZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50SW5zdGFuY2UgPSBjb21wb25lbnQuaW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuaWQgPSBjdXN0b21VbHZNYWluVWkuaWQ7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuY29udGV4dCA9IGN1c3RvbVVsdk1haW5VaTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5pc1JlcG9ydFBhZ2UgPSBpc1JlcG9ydFBhZ2U7XG4gICAgICAgICAgICAgICAgY3VzdG9tVWx2TWFpblVpLmNvbnRyb2xVaSA9IGNvbXBvbmVudEluc3RhbmNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cbiAgICBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRldmljZVNpemUkID0gdGhpcy5fZGV2aWNlU2l6ZVNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgICAgICB0aGlzLnBvcnRhbERhdGEkID0gdGhpcy5wb3J0YWxEYXRhU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICB0aGlzLnJ0bCQgPSB0aGlzLnJ0bFNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgICAgICB0aGlzLmRpclZhbHVlJCA9IHRoaXMucnRsJC5waXBlKG1hcCgoaXNSdGwpID0+IChpc1J0bCA/ICdydGwnIDogJ2x0cicpKSk7XG4gICAgICAgIHRoaXMucm91dGVJbml0aWFsaXplZCQgPSB0aGlzLnJvdXRlSW5pdGlhbGl6ZWRTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcblxuICAgICAgICB0aGlzLmRhdGVUZXh0JCA9IHRoaXMuZGF0ZVRleHRTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG4gICAgICAgIHRoaXMucG9ydGFsU2V0dGluZ3MkID0gdGhpcy5wb3J0YWxEYXRhU291cmNlXG4gICAgICAgICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgICAgIC5waXBlKG1hcCgocG9ydGFsRGF0YSkgPT4gKHBvcnRhbERhdGEgPyBwb3J0YWxEYXRhLlBvcnRhbFNldHRpbmdzIDogKHt9IGFzIGFueSkpKSk7XG4gICAgICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgc3RhcnRXaXRoKG51bGwpLFxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSgxMDAwKSxcbiAgICAgICAgICAgICAgICBtYXAoKCkgPT4gdGhpcy5faW5pdGFsaXplRGV2aWNlU2l6ZSgpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoYykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dpbmRvd1Jlc2l6ZSQubmV4dCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2RldmljZVNpemVTb3VyY2UubmV4dChjKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2V0VXNlckxvZ2luU3RhdHVzKEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuSXNVc2VyTG9nZ2VkSW4pO1xuXG4gICAgICAgIHRoaXMudXNlckxvZ2dlZEluJCA9IHRoaXMuX2xvZ2dlZEluU291cmNlXG4gICAgICAgICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgICAgIC5waXBlKG1hcCgoaXNMb2dnZWRJbikgPT4gaXNMb2dnZWRJbiAmJiBCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLklzQW5vbnltb3VzID09PSBmYWxzZSkpO1xuICAgIH1cbiAgICBfc2V0RGV2aWNlU2l6ZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGV2aWNlU2l6ZSA9IHRoaXMuX2luaXRhbGl6ZURldmljZVNpemUoKTtcbiAgICAgICAgdGhpcy5fZGV2aWNlU2l6ZVNvdXJjZS5uZXh0KGRldmljZVNpemUpO1xuICAgIH1cbiAgICBfaW5pdGFsaXplRGV2aWNlU2l6ZSgpOiBBYmJyZXZhdGlvbkRldmljZVNpemUge1xuICAgICAgICBjb25zdCBfaXNtb2JpbGUgPSBnZXREZXZpY2VJc01vYmlsZSgpO1xuICAgICAgICBjb25zdCBfaXNUYWJsZXQgPSBnZXREZXZpY2VJc1RhYmxldCgpO1xuICAgICAgICBsZXQgX3dpbmRvV1NpemU6IEFiYnJldmF0aW9uRGV2aWNlU2l6ZSA9ICdzJztcbiAgICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDw9IDYwMCkge1xuICAgICAgICAgICAgX3dpbmRvV1NpemUgPSAncyc7XG4gICAgICAgIH0gZWxzZSBpZiAod2luZG93LmlubmVyV2lkdGggPiA2MDAgJiYgd2luZG93LmlubmVyV2lkdGggPD0gOTkyKSB7XG4gICAgICAgICAgICBfd2luZG9XU2l6ZSA9ICdtJztcbiAgICAgICAgfSBlbHNlIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA+IDk5MiAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8PSAxMjAwKSB7XG4gICAgICAgICAgICBfd2luZG9XU2l6ZSA9ICdsJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF93aW5kb1dTaXplID0gJ3hsJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoX2lzbW9iaWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3MnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfaXNUYWJsZXQgJiYgX3dpbmRvV1NpemUgIT09ICdsJyAmJiBfd2luZG9XU2l6ZSAhPT0gJ3hsJykge1xuICAgICAgICAgICAgcmV0dXJuICdtJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3dpbmRvV1NpemU7XG4gICAgfVxuICAgIGNvbXBpbGVNb2R1bGUoZGVwZW5kZW5jeTogTGlicmFyeURlcGVuZWN5KTogT2JzZXJ2YWJsZTxOZ01vZHVsZUZhY3Rvcnk8YW55Pj4ge1xuICAgICAgICBjb25zdCBtb2R1bGUkID0gdGhpcy5nZXRNb2R1bGUoZGVwZW5kZW5jeSk7XG4gICAgICAgIHJldHVybiBtb2R1bGUkLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKG1vZHVsZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVGYWN0b3J5ID0gdGhpcy5nZXROZ01vZHVsZUZhY3RvcnkobW9kdWxlcywgZGVwZW5kZW5jeS5uYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2YobW9kdWxlRmFjdG9yeSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cbiAgICBnZXRNb2R1bGUoZGVwZW5kZW5jeTogTGlicmFyeURlcGVuZWN5KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3QgeyBuYW1lLCBrZWJhYk5hbWUsIHVtZCwgZXhwb3J0QXMgfSA9IGRlcGVuZGVuY3k7XG4gICAgICAgIGNvbnN0IGJhc2UgPSBgL2Fzc2V0cy9tb2R1bGVzLyR7a2ViYWJOYW1lfS9idW5kbGVzYDtcbiAgICAgICAgY29uc3QgZGF0ZSA9IEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuYWJjO1xuICAgICAgICBjb25zdCBwYXRoID0gYCR7YmFzZX0vJHtrZWJhYk5hbWV9LnVtZC5qcz90PSR7ZGF0ZX1gO1xuICAgICAgICByZXR1cm4gb2YodHJ1ZSkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlcyA9IHRoaXMuZ2V0UmVnaXN0ZXJlZE1vZHVsZXModW1kLCBleHBvcnRBcywgbmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKG1vZHVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKG1vZHVsZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkSnMkKHBhdGgpLnBpcGUobWFwKCgpID0+IHRoaXMuZ2V0UmVnaXN0ZXJlZE1vZHVsZXModW1kLCBleHBvcnRBcywgbmFtZSkpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc2V0VmFsdWVPbk9iamVjdChwYXRoLCBpbmRleCwgbW9kdWxlcywgb2JqZWN0KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNwbGl0ZWQgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgICAgIGNvbnN0IHByb3AgPSBzcGxpdGVkW2luZGV4XTtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmplY3RbcHJvcF0gPT09IHR5cGVvZiB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9iamVjdFtwcm9wXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleCA9PT0gc3BsaXRlZC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBvYmplY3RbcHJvcF0gPSBtb2R1bGVzO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0VmFsdWVPbk9iamVjdChwYXRoLCBpbmRleCArIDEsIG1vZHVsZXMsIG9iamVjdFtwcm9wXSk7XG4gICAgfVxuXG4gICAgZ2V0Q29tcG9uZW50KFxuICAgICAgICBtb2R1bGVOYW1lOiBzdHJpbmcsXG4gICAgICAgIG1vZHVsZVBhdGg6IHN0cmluZyxcbiAgICAgICAgY29tcG9uZW50TmFtZTogc3RyaW5nLFxuICAgICAgICBzZWxlY3Rvcjogc3RyaW5nLFxuICAgICAgICBwYXJlbnRJbmplY3RvcjogSW5qZWN0b3JcbiAgICApOiBPYnNlcnZhYmxlPENvbXBvbmVudFJlZjxhbnk+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRjbS5nZXRDb21wb25lbnRCeVNlbGVjdG9yKHNlbGVjdG9yLCBtb2R1bGVOYW1lLCBwYXJlbnRJbmplY3Rvcik7XG4gICAgfVxuICAgIGxvYWRKcyQocGF0aCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBmcm9tKFxuICAgICAgICAgICAgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICAgICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2phdmFzY3JpcHQnKTtcbiAgICAgICAgICAgICAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCdzcmMnLCBwYXRoKTtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHBhdGgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICB9LCA1MDAwKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgUmVwb3J0RXhlY3V0ZShyZXBvcnROYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE1vRm9yUmVwb3J0TW9kZWw+IHtcbiAgICAgICAgcmV0dXJuIGZyb20odGhpcy5SZXBvcnRFeGVjdXRlUHJvbWlzZShyZXBvcnROYW1lKSk7XG4gICAgfVxuICAgIFJlcG9ydEV4ZWN1dGVQcm9taXNlKHJlcG9ydE5hbWU6IHN0cmluZyk6IFByb21pc2U8TW9Gb3JSZXBvcnRNb2RlbD4ge1xuICAgICAgICBjb25zdCB1bHZQYXJhbXMgPSB7XG4gICAgICAgICAgICBGbGFnczoge1xuICAgICAgICAgICAgICAgIERhdGE6ICdUcnVlJyxcbiAgICAgICAgICAgICAgICBFeHRyYTogJ0ZhbHNlJyxcbiAgICAgICAgICAgICAgICBTZWFyY2g6ICdGYWxzZScsXG4gICAgICAgICAgICAgICAgVmlldzogJ0ZhbHNlJ1xuICAgICAgICAgICAgICAgIC8vIEdlbmVyYWw6XCJGYWxzZVwiLCAvLyB1bHZtYWluY3RybCBkb2VzIG5vdCBjcmFldGUgdWkgY29udHJvbCByYWlzZSBlcnJvclxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFJlcG9ydE5hbWU6IHJlcG9ydE5hbWUsXG4gICAgICAgICAgICBVc2FnZUVudW06ICdTeXN0ZW1Db250YWluZXInXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxNb0ZvclJlcG9ydE1vZGVsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBCYXJzYUFwaS5Cdy5FeGVjdXRlUmVwb3J0KFxuICAgICAgICAgICAgICAgIHsgdWx2UGFyYW1zIH0sXG4gICAgICAgICAgICAgICAgKHJlc3VsdDogUmVwb3J0TW9kZWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQuRGF0YSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhZGRGb3JtUGFuZWxDdHJscihpZCwgZm9ybXBhbmVsQ3RybHI6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvcm1QYW5lbHNbaWRdID0gZm9ybXBhbmVsQ3RybHI7XG4gICAgfVxuICAgIHNldFVzZXJMb2dpblN0YXR1cyhzdGF0dXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VkSW5Tb3VyY2UubmV4dChzdGF0dXMpO1xuICAgIH1cbiAgICBleHRyYWN0QWxsUGFnZXMocG9ydGFsRGF0YTogUG9ydGFsRGF0YU1vZGVsIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAoIXBvcnRhbERhdGEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwb3J0YWxEYXRhLkNoaWxkUGFnZUxpc3QuTW9EYXRhTGlzdC5mb3JFYWNoKChwYWdlRGF0YSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hZGRDaGlsZFBhZ2VzKHBhZ2VEYXRhKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGV4dHJhY3RBbGxQYWdlc19PbGQocG9ydGFsRGF0YTogUG9ydGFsRGF0YU1vZGVsIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAoIXBvcnRhbERhdGEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuX3JvdXRlci5jb25maWc7XG4gICAgICAgIHBvcnRhbERhdGEuQ2hpbGRQYWdlTGlzdC5Nb0RhdGFMaXN0LmZvckVhY2goKHBhZ2VEYXRhKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gcGFnZURhdGEuUm91dGUucmVwbGFjZSgnLycsICcnKTtcbiAgICAgICAgICAgIGNvbmZpZy5wdXNoKFxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlUm91dGUocGFnZURhdGEsIHBhdGgsIHBhZ2VEYXRhLkhhc0F1dGhvcml6ZSwgcGFnZURhdGEuUGFnZU1vZHVsZT8uJENhcHRpb24sIG51bGwsIG51bGwpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHBhZ2VEYXRhLklzRGVmYXVsdFJvdXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0Um91dGUgPSBwYXRoO1xuICAgICAgICAgICAgICAgIGNvbmZpZy5wdXNoKHRoaXMuY3JlYXRlUm91dGUocGFnZURhdGEsICcnLCBmYWxzZSwgcG9ydGFsRGF0YS5QYWdlTW9kdWxlPy4kQ2FwdGlvbiwgcGF0aCwgbnVsbCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmFkZENoaWxkUGFnZXMocGFnZURhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fcm91dGVyLnJlc2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICAgIGlmICh0aGlzLl9sb2NhdGlvbi5wYXRoKCkgPT09ICcnKSB7XG4gICAgICAgICAgICAvLyB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW3RoaXMuZGVmYXVsdFJvdXRlXSk7XG4gICAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoWycnXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhpcy5yb3V0ZUluaXRpYWxpemVkKCk7XG4gICAgfVxuICAgIHNzb0xvZ2luKCk6IHZvaWQge1xuICAgICAgICBBamF4SGVscGVyLkFqYXhSZXF1ZXN0KFxuICAgICAgICAgICAgJy9hcGkvYmFzZS9zc29sb2dpbicsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBhbGVydCgnZXJyb3IgaW4gc3NvIGxvZ2luLicpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgc3NvTG9nb3V0KCk6IHZvaWQge1xuICAgICAgICBBamF4SGVscGVyLkFqYXhSZXF1ZXN0KFxuICAgICAgICAgICAgJy9hcGkvYmFzZS9zc29sb2dvdXQnLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYWxlcnQoJ2Vycm9yIGluIHNzbyBsb2dvdXQuJyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgIH1cbiAgICBhZGRDaGlsZFBhZ2VzKHBhZ2VEYXRhOiBQYWdlRGF0YU1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGFnZXMucHVzaChwYWdlRGF0YSk7XG4gICAgICAgIGlmICghcGFnZURhdGEuQ2hpbGRQYWdlTGlzdD8uTW9EYXRhTGlzdD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcGFnZURhdGEuQ2hpbGRQYWdlTGlzdC5Nb0RhdGFMaXN0LmZvckVhY2goKGNoaWxkUGFnZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hZGRDaGlsZFBhZ2VzKGNoaWxkUGFnZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgIGNyZWF0ZVJvdXRlKHBhZ2VEYXRhLCBwYXRoLCBoYXNBdXRob3JpemVkLCBtb2R1bGVOYW1lLCByZWRpcmVjdFRvLCBpc0R5bmFtaWNSb3V0ZSk6IFJvdXRlIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjcmVhdGVSb3V0ZTIoXG4gICAgICAgIHBhZ2VEYXRhLFxuICAgICAgICBwYXRoLFxuICAgICAgICBoYXNBdXRob3JpemVkLFxuICAgICAgICBtb2R1bGVOYW1lLFxuICAgICAgICByZWRpcmVjdFRvOiBzdHJpbmcgfCBudWxsID0gbnVsbCxcbiAgICAgICAgaXNEeW5hbWljUm91dGU6IGJvb2xlYW4gPSBmYWxzZVxuICAgICk6IFJvdXRlIHtcbiAgICAgICAgbGV0IG1vZHVsZVBhdGg6IHN0cmluZyA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLkdldEtlYmFiQ2FzZShtb2R1bGVOYW1lKTtcbiAgICAgICAgY29uc3QgdW1kID0gbW9kdWxlTmFtZTtcbiAgICAgICAgbW9kdWxlUGF0aCA9IG1vZHVsZVBhdGguc3Vic3RyaW5nKDEsIG1vZHVsZVBhdGgubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgZHluYW1pY1JvdXRlOiBSb3V0ZSA9IHt9O1xuICAgICAgICBkeW5hbWljUm91dGUucGF0aCA9IHBhdGg7XG4gICAgICAgIGR5bmFtaWNSb3V0ZS5kYXRhID0geyBwYWdlRGF0YSB9O1xuICAgICAgICBpZiAoIWlzRHluYW1pY1JvdXRlKSB7XG4gICAgICAgICAgICBkeW5hbWljUm91dGUucmVzb2x2ZSA9IHtcbiAgICAgICAgICAgICAgICBwYWdlRGF0YTogUG9ydGFsUGFnZVJlc29sdmVyXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoID09PSAnJykge1xuICAgICAgICAgICAgZHluYW1pY1JvdXRlLnBhdGhNYXRjaCA9ICdmdWxsJztcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVkaXJlY3RUbykge1xuICAgICAgICAgICAgZHluYW1pY1JvdXRlLnJlZGlyZWN0VG8gPSByZWRpcmVjdFRvO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGhhc0F1dGhvcml6ZWQpIHtcbiAgICAgICAgICAgICAgICBkeW5hbWljUm91dGUuY2FuQWN0aXZhdGUgPSBbQXV0aEd1YXJkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGR5bmFtaWNSb3V0ZS5sb2FkQ2hpbGRyZW4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwZW5kZW5jaWVzOiBMaWJyYXJ5RGVwZW5lY3lbXSA9IEpTT04ucGFyc2UocGFnZURhdGEuRGVwZW5kZW5jaWVzKTsgLy8gZXZhbChwYWdlRGF0YS5EZXBlbmRlbmNpZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VMaWJyYXJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBtb2R1bGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICBrZWJhYk5hbWU6IG1vZHVsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHVtZCxcbiAgICAgICAgICAgICAgICAgICAgZXhwb3J0QXM6IFttb2R1bGVOYW1lXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwZW5kZW5jaWVzJCA9IGZyb20oZGVwZW5kZW5jaWVzKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICBjb25jYXRNYXAoKGRlcGVuZGVuY3k6IExpYnJhcnlEZXBlbmVjeSkgPT4gdGhpcy5jb21waWxlTW9kdWxlKGRlcGVuZGVuY3kpKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKFtkZXBlbmRlbmNpZXMkXSkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuZ2V0TW9kdWxlKHBhZ2VMaWJyYXJ5KSksXG4gICAgICAgICAgICAgICAgICAgIG1hcCgobW9kdWxlcykgPT4gbW9kdWxlc1ttb2R1bGVOYW1lICsgJ01vZHVsZSddKSxcbiAgICAgICAgICAgICAgICAgICAgdGFwKCgpID0+IHRoaXMucm91dGVJbml0aWFsaXplZCgpKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGR5bmFtaWNSb3V0ZTtcbiAgICB9XG4gICAgcm91dGVJbml0aWFsaXplZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yb3V0ZUluaXRpYWxpemVkU291cmNlLm5leHQodHJ1ZSk7XG4gICAgfVxuICAgIHB1YmxpYyBsb2dpbkJ5QW5vbnltb3VzKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICB0aGlzLmxvZ2luTG9hZGluZy5uZXh0KHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLmxvZ2luUG9ydGFsKCkucGlwZShcbiAgICAgICAgICAgIG1hcCgocmVzdWx0OiBMb2dpblJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmRlYnVnKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShCYXJzYUFwaS5Mb2dpbkFjdGlvbi50b2tlbjJTdG9yYWdlS2V5LCByZXN1bHQuZGF0YS5zdGgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dpbkxvYWRpbmcubmV4dChmYWxzZSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0UGFnZURhdGEodXJsOiBzdHJpbmcsIGlzUm9vdDogYm9vbGVhbik6IE9ic2VydmFibGU8UGFnZURhdGFNb2RlbCB8IG51bGw+IHtcbiAgICAgICAgaWYgKGlzUm9vdCB8fCB1cmwgPT09ICcnIHx8IHVybCA9PT0gJy8nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3J0YWxEYXRhJDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cmwuaW5kZXhPZignPycpID4gLTEpIHtcbiAgICAgICAgICAgIHVybCA9IHVybC5zdWJzdHIoMCwgdXJsLmluZGV4T2YoJz8nKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2FjaGVkUGFnZURhdGFbdXJsXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkUGFnZURhdGFbdXJsXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWdlRGF0YSA9IHRoaXMuZmluZFBhZ2VCeVJvdXRlKHVybCk7XG4gICAgICAgIEFqYXhIZWxwZXIuVXNlQ2FjaGUgPSAhcGFnZURhdGE/Lkhhc0F1dGhvcml6ZTtcblxuICAgICAgICB0aGlzLmNhY2hlZFBhZ2VEYXRhW3VybF0gPSB0aGlzLmFwaVNlcnZpY2VcbiAgICAgICAgICAgIC5sb2FkUG9ydGFsUGFnZURhdGEocGFnZURhdGE/LklkLCB0aGlzLnBvcnRhbERhdGFTb3VyY2UuZ2V0VmFsdWUoKT8uQ2hpbGRQYWdlTGlzdC5UeXBlRGVmSWQpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKHBhZ2VNbykgPT4gcGFnZU1vLkRhdGEuTW8pLFxuICAgICAgICAgICAgICAgIHRhcCgocGFnZU1vKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGRSb3V0ZShwYWdlTW8sIHBhZ2VNby5DaGlsZFBhZ2VMaXN0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDaGlsZFBhZ2VzKHBhZ2VNbyk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgcHVibGlzaFJlcGxheSgxKSxcbiAgICAgICAgICAgICAgICByZWZDb3VudCgpXG4gICAgICAgICAgICApO1xuICAgICAgICAvLyB0aGlzLmNhY2hlZFBhZ2VEYXRhW3VybF0gPSB0aGlzLnBvcnRhbERhdGEkLnBpcGUoXG4gICAgICAgIC8vICAgZmlsdGVyKChwb3J0YWxEYXRhKSA9PiBwb3J0YWxEYXRhICE9IG51bGwpLFxuICAgICAgICAvLyAgIG1hcCgocG9ydGFsRGF0YSkgPT4gKSxcbiAgICAgICAgLy8gICBjb25jYXRNYXAoKHBhZ2VEYXRhKSA9PiB7XG4gICAgICAgIC8vICAgICByZXR1cm5cbiAgICAgICAgLy8gICB9KSxcblxuICAgICAgICAvLyAgIHRhcChwYWdlRGF0YT0+e30pXG4gICAgICAgIC8vICk7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlZFBhZ2VEYXRhW3VybF07XG4gICAgfVxuICAgIHB1YmxpYyByZXNvbHZlRGF0YShyb3V0ZVBhZ2VEYXRhKTogT2JzZXJ2YWJsZTxQYWdlRGF0YU1vZGVsIHwgbnVsbD4ge1xuICAgICAgICAvLyBjb25zdCBwYWdlRGF0YSA9IHRoaXMucGFnZXMuZmluZCgoYykgPT4gYy5Sb3V0ZSA9PT0gcm91dGVQYWdlRGF0YS5Sb3V0ZSAmJiBjLk1vZHVsZSA9PT0gcm91dGVQYWdlRGF0YS5Nb2R1bGUpO1xuICAgICAgICBjb25zdCBwYWdlRGF0YSA9IHRoaXMucGFnZXMuZmluZCgoYykgPT4gYy5Sb3V0ZSA9PT0gcm91dGVQYWdlRGF0YS5Sb3V0ZSk7XG4gICAgICAgIGlmICghcGFnZURhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpZCA9IHBhZ2VEYXRhLklkO1xuXG4gICAgICAgIGlmICh0aGlzLmNhY2hlZFBhZ2VEYXRhW2lkXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkUGFnZURhdGFbaWRdO1xuICAgICAgICB9XG5cbiAgICAgICAgQWpheEhlbHBlci5Vc2VDYWNoZSA9ICFwYWdlRGF0YT8uSGFzQXV0aG9yaXplO1xuICAgICAgICB0aGlzLmNhY2hlZFBhZ2VEYXRhW2lkXSA9IHRoaXMuYXBpU2VydmljZVxuICAgICAgICAgICAgLmxvYWRQb3J0YWxQYWdlRGF0YShpZCwgdGhpcy5wb3J0YWxEYXRhU291cmNlLmdldFZhbHVlKCk/LkNoaWxkUGFnZUxpc3QuVHlwZURlZklkKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChwYWdlTW8pID0+IHBhZ2VNby5EYXRhLk1vKSxcbiAgICAgICAgICAgICAgICB0YXAoKHBhZ2VNbykgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZENoaWxkUm91dGUocGFnZU1vLCBwYWdlTW8uQ2hpbGRQYWdlTGlzdCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGRQYWdlcyhwYWdlTW8pO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHB1Ymxpc2hSZXBsYXkoMSksXG4gICAgICAgICAgICAgICAgcmVmQ291bnQoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgLy8gdGhpcy5jYWNoZWRQYWdlRGF0YVt1cmxdID0gdGhpcy5wb3J0YWxEYXRhJC5waXBlKFxuICAgICAgICAvLyAgIGZpbHRlcigocG9ydGFsRGF0YSkgPT4gcG9ydGFsRGF0YSAhPSBudWxsKSxcbiAgICAgICAgLy8gICBtYXAoKHBvcnRhbERhdGEpID0+ICksXG4gICAgICAgIC8vICAgY29uY2F0TWFwKChwYWdlRGF0YSkgPT4ge1xuICAgICAgICAvLyAgICAgcmV0dXJuXG4gICAgICAgIC8vICAgfSksXG5cbiAgICAgICAgLy8gICB0YXAocGFnZURhdGE9Pnt9KVxuICAgICAgICAvLyApO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRQYWdlRGF0YVtpZF07XG4gICAgfVxuXG4gICAgYWRkQ2hpbGRSb3V0ZShwYWdlTW86IE1ldGFvYmplY3REYXRhTW9kZWwsIENoaWxkUGFnZUxpc3Q6IE1vRm9yUmVwb3J0TW9kZWwpOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhZGRDaGlsZFJvdXRlX09sZChwYWdlTW86IE1ldGFvYmplY3REYXRhTW9kZWwsIENoaWxkUGFnZUxpc3Q6IE1vRm9yUmVwb3J0TW9kZWwpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFDaGlsZFBhZ2VMaXN0Py5Nb0RhdGFMaXN0Py5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuX3JvdXRlci5jb25maWc7XG4gICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYWdlTW8uUm91dGUucmVwbGFjZSgnLycsICcnKTtcbiAgICAgICAgY29uc3QgcGFyZW50Um91dGUgPSBjb25maWcuZmluZCgoYykgPT4gKGMucGF0aCA9IHBhcmVudFBhdGgpKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW46IFJvdXRlW10gPSBbXTtcbiAgICAgICAgaWYgKHBhcmVudFJvdXRlKSB7XG4gICAgICAgICAgICBDaGlsZFBhZ2VMaXN0Lk1vRGF0YUxpc3QuZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gY2hpbGQuUm91dGUucmVwbGFjZSgnLycsICcnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJvdXRlID0gdGhpcy5jcmVhdGVSb3V0ZShcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLkhhc0F1dGhvcml6ZSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuUGFnZU1vZHVsZT8uJENhcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGRyb3V0ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGRlYnVnZ2VyO1xuXG4gICAgICAgICAgICAocGFyZW50Um91dGUgYXMgYW55KS5fbG9hZGVkQ29uZmlnLnJvdXRlc1swXS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuXG4gICAgICAgICAgICB0aGlzLl9yb3V0ZXIucmVzZXRDb25maWcoY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkUG9ydGFsRGF0YV9PbGQxKCk6IE9ic2VydmFibGU8UG9ydGFsRGF0YU1vZGVsPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UubG9hZFBvcnRhbChCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLlBvcnRhbElkLCBCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLlBvcnRhbFR5cGVEZWZJZCkucGlwZShcbiAgICAgICAgICAgIHRhcCgocG9ydGFsU2V0dGluZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvcnRhbERhdGEgPSBwb3J0YWxTZXR0aW5nLkRhdGEuTW87XG4gICAgICAgICAgICAgICAgdGhpcy5leHRyYWN0QWxsUGFnZXMocG9ydGFsRGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3J0YWxEYXRhU291cmNlLm5leHQocG9ydGFsRGF0YSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiBmcm9tKHRoaXMubG9hZFN5c3RlbXMoKSkpLFxuICAgICAgICAgICAgdGFwKChhbGwpID0+IHRoaXMuZGF0ZVRleHRTb3VyY2UubmV4dChCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLkRhdGVUZXh0KSlcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcHVibGljIGxvYWRQb3J0YWxEYXRhU3luY19PbGQyKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwb3J0YWxTZXR0aW5nID0gdGhpcy5hcGlTZXJ2aWNlLmxvYWRQb3J0YWxTeW5jKFxuICAgICAgICAgICAgQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5Qb3J0YWxJZCxcbiAgICAgICAgICAgIEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuUG9ydGFsVHlwZURlZklkXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHBvcnRhbERhdGEgPSBwb3J0YWxTZXR0aW5nLkRhdGEuTW87XG5cbiAgICAgICAgdGhpcy5leHRyYWN0QWxsUGFnZXMocG9ydGFsRGF0YSk7XG5cbiAgICAgICAgdGhpcy5wb3J0YWxEYXRhU291cmNlLm5leHQocG9ydGFsRGF0YSk7XG5cbiAgICAgICAgdGhpcy5sb2FkU3lzdGVtcygpO1xuICAgICAgICB0aGlzLmRhdGVUZXh0U291cmNlLm5leHQoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5EYXRlVGV4dCk7XG4gICAgfVxuICAgIHB1YmxpYyBsb2FkUG9ydGFsRGF0YVN5bmMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBvcnRhbFNldHRpbmdTdHIgPSBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZCgnR2V0UG9ydGFsJywgQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5Qb3J0YWxJZCk7XG4gICAgICAgIGNvbnN0IHBvcnRhbFNldHRpbmcgPSBCYXJzYUFwaS5FeHQuZGVjb2RlKHBvcnRhbFNldHRpbmdTdHIpO1xuICAgICAgICBjb25zdCBwb3J0YWxEYXRhID0gcG9ydGFsU2V0dGluZztcblxuICAgICAgICB0aGlzLmV4dHJhY3RBbGxQYWdlcyhwb3J0YWxEYXRhKTtcblxuICAgICAgICB0aGlzLnBvcnRhbERhdGFTb3VyY2UubmV4dChwb3J0YWxEYXRhKTtcblxuICAgICAgICB0aGlzLmRhdGVUZXh0U291cmNlLm5leHQoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5EYXRlVGV4dCk7XG4gICAgfVxuICAgIHB1YmxpYyBsb2FkVXNlclBvcnRhbFNldHRpbmcoKTogdm9pZCB7XG4gICAgICAgIEJhcnNhQXBpLkJ3LlJ1bkJsTWV0aG9kQXN5bmMoe1xuICAgICAgICAgICAgUGFyYW1ldGVyczogW10sXG4gICAgICAgICAgICBNZXRob2Q6ICdHZXRVc2VyUG9ydGFsU2V0dGluZ3MnLFxuICAgICAgICAgICAgU3VjY2Vzc0ZuOiAodXNlclBvcnRhbFNldHRpbmc6IE1ldGFvYmplY3REYXRhTW9kZWwpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl91c2VyUG9ydGFsU2V0dGluZ3MkLm5leHQodXNlclBvcnRhbFNldHRpbmcpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIEZhaWxGbjogKGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIFNob3dGb3JtUGFuZWxDb250cm9sKFxuICAgICAgICBmb3JtcGFuZWxDdHJscjogYW55LFxuICAgICAgICByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICBkaWFsb2dDb21wb25lbnQ6IFR5cGU8YW55PixcbiAgICAgICAgaXNQYWdlOiBib29sZWFuLFxuICAgICAgICBpc1JlbG9hZDogYm9vbGVhbiA9IGZhbHNlXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGlmICghZm9ybXBhbmVsQ3RybHIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignZm9ybSBwYW5lbCBjb250cm9sZXIgaXMgdW5kZWZpbmVkIScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1vID0gZm9ybXBhbmVsQ3RybHIuTW87XG4gICAgICAgIGNvbnN0IGhlYWRlckxheW91dCA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKGZvcm1wYW5lbEN0cmxyLCAnU2V0dGluZy5WaWV3LkhlYWRlckxheW91dCcsIG51bGwpO1xuICAgICAgICBsZXQgaXNNb2RhbCA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKGZvcm1wYW5lbEN0cmxyLCAnU2V0dGluZy5WaWV3LkV4dHJhSnNvblByb3AuTW9kYWwnLCBmYWxzZSk7XG4gICAgICAgIGNvbnN0IG1vZGFsU2V0dGluZyA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKFxuICAgICAgICAgICAgZm9ybXBhbmVsQ3RybHIsXG4gICAgICAgICAgICAnU2V0dGluZy5WaWV3LkN1c3RvbVVpLlBhcmFtZXRlcnMuTW9kYWxTZXR0aW5nJyxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG1vZGFsU2V0dGluZykge1xuICAgICAgICAgICAgaXNNb2RhbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZm9ybXBhbmVsQ3RybHIuU2V0dGluZy5Jc01vZGFsID0gaXNNb2RhbDtcbiAgICAgICAgZm9ybXBhbmVsQ3RybHIuSXNNb2RhbCA9IGlzTW9kYWw7XG4gICAgICAgIGNvbnN0IGJyZWFkQ3J1bWIgPSBnZXRIZWFkZXJWYWx1ZShoZWFkZXJMYXlvdXQ/LkJyZWFkQ3J1bWIpO1xuICAgICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHtcbiAgICAgICAgICAgIGlkOiBtby4kU3RhdGUgPT09ICdOZXcnID8gJzAnIDogbW8uSWQsXG4gICAgICAgICAgICB0eWlkOiBtby4kVHlwZURlZklkLFxuICAgICAgICAgICAgdHljcDogbW8uJENhcHRpb24gPyBtby4kQ2FwdGlvbiA6IG51bGwsXG4gICAgICAgICAgICByZXBpZDogbW8uJFJlcG9ydElkLFxuICAgICAgICAgICAgdmlkOiBmb3JtcGFuZWxDdHJscj8uU2V0dGluZz8uVmlldz8uVHlwZVZpZXdJZCxcbiAgICAgICAgICAgIGJjOiBicmVhZENydW1iID8gYnJlYWRDcnVtYiA6IG1vLiRTdGF0ZSA9PT0gJ05ldycgPyBtby4kVHlwZURlZk5hbWUgOiBtby4kQ2FwdGlvblxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBpZCA9IGdldFVuaXF1ZUlkKDQpO1xuICAgICAgICB0aGlzLmFkZEZvcm1QYW5lbEN0cmxyKGlkLCBmb3JtcGFuZWxDdHJscik7XG4gICAgICAgIGlmIChpc01vZGFsKSB7XG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uuc2hvd0Zvcm0oZGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgICAgICAgLi4ucXVlcnlQYXJhbXMsXG4gICAgICAgICAgICAgICAgZm9ybXBhbmVsQ3RybHJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSB7IGZvcm1QYW5lbEN0cmxySWQ6IGlkIH07XG4gICAgICAgICAgICBpZiAoaXNQYWdlKSB7XG4gICAgICAgICAgICAgICAgcm91dGVyLm5hdmlnYXRlKFxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAnZm9ybScsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGV0czoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluOiBbJ3Nob3cnLCB7IC4uLnF1ZXJ5UGFyYW1zLCBmb3JtUGFuZWxDdHJscklkOiBpZCwgaXNGaXJzdDogdHJ1ZSB9XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVRvOiBhY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNraXBMb2NhdGlvbkNoYW5nZTogaXNSZWxvYWRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJvdXRlci5uYXZpZ2F0ZShcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3BvcHVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsZXRzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW46IFsnc2hvdycsIHsgLi4ucXVlcnlQYXJhbXMsIGZvcm1QYW5lbEN0cmxySWQ6IGlkIH1dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVRvOiBhY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ3ByZXNlcnZlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNraXBMb2NhdGlvbkNoYW5nZTogaXNSZWxvYWRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGxvYWRTeXN0ZW1zKCk6IFByb21pc2U8UG9ydGFsRGF0YU1vZGVsPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBCYXJzYUFwaS5VbC5BcHBsaWNhdGlvbkN0cmxyLl9sb2FkU3lzdGVtKFxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBmaW5kUGFnZUJ5Um91dGUodXJsOiBzdHJpbmcpOiBQYWdlRGF0YU1vZGVsIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGZpbmRlZFBhZ2UgPSB0aGlzLnBhZ2VzLmZpbmQoKGMpID0+IGMuUm91dGUgPT09IHVybCk7XG4gICAgICAgIHJldHVybiBmaW5kZWRQYWdlIHx8IG51bGw7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0TmdNb2R1bGVGYWN0b3J5KG1vZHVsZXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0sIG1vZHVsZU5hbWU6IHN0cmluZyk6IE5nTW9kdWxlRmFjdG9yeTxhbnk+IHtcbiAgICAgICAgY29uc3QgbW9kdWxlQ2xhc3MgPSBtb2R1bGVzW21vZHVsZU5hbWUgKyAnTW9kdWxlJ107XG4gICAgICAgIGxldCBtb2R1bGVGYWN0b3J5OiBOZ01vZHVsZUZhY3Rvcnk8YW55PjtcbiAgICAgICAgaWYgKG1vZHVsZUNsYXNzIGluc3RhbmNlb2YgTmdNb2R1bGVGYWN0b3J5KSB7XG4gICAgICAgICAgICBtb2R1bGVGYWN0b3J5ID0gbW9kdWxlQ2xhc3M7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjb21waWxlZCA9IHRoaXMuY29tcGlsZXIuY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNTeW5jKG1vZHVsZUNsYXNzKTtcbiAgICAgICAgICAgIG1vZHVsZUZhY3RvcnkgPSBjb21waWxlZC5uZ01vZHVsZUZhY3Rvcnk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1vZHVsZUZhY3Rvcnk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRSZWdpc3RlcmVkTW9kdWxlcyh1bWQ6IHN0cmluZywgZXhwb3J0QXM6IHN0cmluZ1tdLCBtb2R1bGVOYW1lOiBzdHJpbmcpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgICAgICAgbGV0IG1vZHVsZXM7XG4gICAgICAgIGlmICh1bWQgIT09ICcnKSB7XG4gICAgICAgICAgICBtb2R1bGVzID0gd2luZG93O1xuICAgICAgICAgICAgdW1kLnNwbGl0KCcuJykuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbW9kdWxlcyAhPT0gdHlwZW9mIHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtb2R1bGVzID0gbW9kdWxlc1tjXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1vZHVsZXMgPSB3aW5kb3dbbW9kdWxlTmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cG9ydEFzLmxlbmd0aCA+IDAgJiYgbW9kdWxlcykge1xuICAgICAgICAgICAgZXhwb3J0QXMuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVPbk9iamVjdChjLCAwLCBtb2R1bGVzLCB3aW5kb3cpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1vZHVsZXM7XG4gICAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBMaWJyYXJ5RGVwZW5lY3kge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBrZWJhYk5hbWU6IHN0cmluZztcbiAgICB1bWQ6IHN0cmluZztcbiAgICBleHBvcnRBczogc3RyaW5nW107XG59XG5leHBvcnQgaW50ZXJmYWNlIEJyZWFkQ3J1bWJJbmZvIHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIHVybDogc3RyaW5nO1xuICAgIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZTtcbn1cbiJdfQ==
|