barsa-novin-ray-core 2.1.1 → 2.1.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.
Files changed (210) hide show
  1. package/fesm2022/barsa-novin-ray-core.mjs +254 -135
  2. package/fesm2022/barsa-novin-ray-core.mjs.map +1 -1
  3. package/package.json +3 -5
  4. package/esm2022/barsa-novin-ray-core.mjs +0 -5
  5. package/esm2022/lib/abstract-classes/application-base.mjs +0 -24
  6. package/esm2022/lib/abstract-classes/barsa-api.mjs +0 -43
  7. package/esm2022/lib/abstract-classes/base-column-props.mjs +0 -84
  8. package/esm2022/lib/abstract-classes/base.component.mjs +0 -59
  9. package/esm2022/lib/abstract-classes/field-base.mjs +0 -232
  10. package/esm2022/lib/abstract-classes/files-validation-helper.mjs +0 -75
  11. package/esm2022/lib/abstract-classes/form-base.mjs +0 -163
  12. package/esm2022/lib/abstract-classes/form-field-report-page.component.mjs +0 -54
  13. package/esm2022/lib/abstract-classes/form-page-base.mjs +0 -129
  14. package/esm2022/lib/abstract-classes/form-page.component.mjs +0 -53
  15. package/esm2022/lib/abstract-classes/form-props.base.mjs +0 -97
  16. package/esm2022/lib/abstract-classes/form-toolbar-base.mjs +0 -56
  17. package/esm2022/lib/abstract-classes/index.mjs +0 -25
  18. package/esm2022/lib/abstract-classes/layout-item-base.mjs +0 -48
  19. package/esm2022/lib/abstract-classes/layout-panel-base.mjs +0 -63
  20. package/esm2022/lib/abstract-classes/linear-list-helper.mjs +0 -135
  21. package/esm2022/lib/abstract-classes/models.mjs +0 -184
  22. package/esm2022/lib/abstract-classes/module-with-dynamic-components.mjs +0 -2
  23. package/esm2022/lib/abstract-classes/number-base.mjs +0 -200
  24. package/esm2022/lib/abstract-classes/page-base.mjs +0 -97
  25. package/esm2022/lib/abstract-classes/page-with-form-handler-base.mjs +0 -40
  26. package/esm2022/lib/abstract-classes/report-base.mjs +0 -254
  27. package/esm2022/lib/abstract-classes/report-item-base.mjs +0 -53
  28. package/esm2022/lib/abstract-classes/report-view-base.component.mjs +0 -428
  29. package/esm2022/lib/abstract-classes/system-base.mjs +0 -24
  30. package/esm2022/lib/abstract-classes/tile-props.mjs +0 -46
  31. package/esm2022/lib/auth-guard.mjs +0 -48
  32. package/esm2022/lib/barsa-novin-ray-core-routing.module.mjs +0 -292
  33. package/esm2022/lib/barsa-novin-ray-core.module.mjs +0 -487
  34. package/esm2022/lib/base-ulv-setting.component.mjs +0 -45
  35. package/esm2022/lib/base.module.mjs +0 -28
  36. package/esm2022/lib/button-loading/button-loading.component.mjs +0 -18
  37. package/esm2022/lib/constants.mjs +0 -898
  38. package/esm2022/lib/container.component.mjs +0 -99
  39. package/esm2022/lib/controllers/base-controller.mjs +0 -30
  40. package/esm2022/lib/controllers/index.mjs +0 -5
  41. package/esm2022/lib/controllers/login-controller.mjs +0 -54
  42. package/esm2022/lib/controllers/login-verification-controller.mjs +0 -56
  43. package/esm2022/lib/controllers/models.mjs +0 -2
  44. package/esm2022/lib/custom-route-reuse-strategy.mjs +0 -32
  45. package/esm2022/lib/date-services/date-hijri.service.mjs +0 -146
  46. package/esm2022/lib/date-services/date-info.mjs +0 -2
  47. package/esm2022/lib/date-services/date-miladi.service.mjs +0 -124
  48. package/esm2022/lib/date-services/date-shamsi.service.mjs +0 -148
  49. package/esm2022/lib/date-services/date.service.mjs +0 -149
  50. package/esm2022/lib/date-services/index.mjs +0 -6
  51. package/esm2022/lib/device.mjs +0 -663
  52. package/esm2022/lib/directives/absolute-div-body.directive.mjs +0 -45
  53. package/esm2022/lib/directives/anchor-scroll.directive.mjs +0 -24
  54. package/esm2022/lib/directives/attr-rtl.directive.mjs +0 -35
  55. package/esm2022/lib/directives/base.directive.mjs +0 -55
  56. package/esm2022/lib/directives/body-click.directive.mjs +0 -35
  57. package/esm2022/lib/directives/column-resizer.directive.mjs +0 -39
  58. package/esm2022/lib/directives/copy.directive.mjs +0 -59
  59. package/esm2022/lib/directives/count-down.directive.mjs +0 -108
  60. package/esm2022/lib/directives/dynamic-command.directive.mjs +0 -42
  61. package/esm2022/lib/directives/dynamic-style.directive.mjs +0 -57
  62. package/esm2022/lib/directives/ellapsis-text.directive.mjs +0 -69
  63. package/esm2022/lib/directives/ellipsify.directive.mjs +0 -72
  64. package/esm2022/lib/directives/field-binding.directive.mjs +0 -17
  65. package/esm2022/lib/directives/fill-empty-space.mjs +0 -83
  66. package/esm2022/lib/directives/form-close.directive.mjs +0 -32
  67. package/esm2022/lib/directives/img-lazy.directive.mjs +0 -81
  68. package/esm2022/lib/directives/index.mjs +0 -35
  69. package/esm2022/lib/directives/intersection-observer.directive.mjs +0 -51
  70. package/esm2022/lib/directives/items-renderer.directive.mjs +0 -59
  71. package/esm2022/lib/directives/label-mandatory.directive.mjs +0 -48
  72. package/esm2022/lib/directives/load-external-files.directive.mjs +0 -37
  73. package/esm2022/lib/directives/mobile.directive.mjs +0 -29
  74. package/esm2022/lib/directives/nowraptext.directive.mjs +0 -26
  75. package/esm2022/lib/directives/numbers-only-input.directive.mjs +0 -26
  76. package/esm2022/lib/directives/placeHolder.directive.mjs +0 -15
  77. package/esm2022/lib/directives/prevent-default.directive.mjs +0 -20
  78. package/esm2022/lib/directives/render-ulv-paging.directive.mjs +0 -80
  79. package/esm2022/lib/directives/render-ulv-viewer.directive.mjs +0 -75
  80. package/esm2022/lib/directives/route-form-change.directive.mjs +0 -37
  81. package/esm2022/lib/directives/stop-propagation.directive.mjs +0 -20
  82. package/esm2022/lib/directives/table-resizer.directive.mjs +0 -235
  83. package/esm2022/lib/directives/ulv-command.directive.mjs +0 -42
  84. package/esm2022/lib/directives/until-inview.directive.mjs +0 -52
  85. package/esm2022/lib/directives/workflow-choice-command.directive.mjs +0 -60
  86. package/esm2022/lib/dynamic-component/base-dynamic.component.mjs +0 -96
  87. package/esm2022/lib/dynamic-component/base-form-toolbaritem-props.mjs +0 -52
  88. package/esm2022/lib/dynamic-component/base-item-content-props.mjs +0 -80
  89. package/esm2022/lib/dynamic-component/base-view-content-props.mjs +0 -20
  90. package/esm2022/lib/dynamic-component/base-view-item-props.mjs +0 -525
  91. package/esm2022/lib/dynamic-component/base-view-props.mjs +0 -162
  92. package/esm2022/lib/dynamic-component/dynamic-form-toolbar-item.component.mjs +0 -38
  93. package/esm2022/lib/dynamic-component/dynamic-form.component.mjs +0 -66
  94. package/esm2022/lib/dynamic-component/dynamic-item.component.mjs +0 -76
  95. package/esm2022/lib/dynamic-component/dynamic-layout.component.mjs +0 -63
  96. package/esm2022/lib/dynamic-component/index.mjs +0 -11
  97. package/esm2022/lib/empty-page/empty-page.component.mjs +0 -44
  98. package/esm2022/lib/empty-page-with-router-and-router-outlet/empty-page-with-router-and-router-outlet.component.mjs +0 -16
  99. package/esm2022/lib/field-ui/field-ui.component.mjs +0 -146
  100. package/esm2022/lib/form/form.component.mjs +0 -211
  101. package/esm2022/lib/form-new/form-new.component.mjs +0 -30
  102. package/esm2022/lib/form-page-routing/barsa-sap-ui-form-page-routing.module.mjs +0 -54
  103. package/esm2022/lib/form-page-routing/barsa-sap-ui-form-page.module.mjs +0 -29
  104. package/esm2022/lib/form-page-routing/constants.mjs +0 -9
  105. package/esm2022/lib/form-page-routing/index.mjs +0 -3
  106. package/esm2022/lib/from-intersection-observer.mjs +0 -53
  107. package/esm2022/lib/global-error-handler.mjs +0 -26
  108. package/esm2022/lib/injdection-tokens.mjs +0 -8
  109. package/esm2022/lib/login-enter-mobile/login-enter-mobile.component.mjs +0 -64
  110. package/esm2022/lib/login-verification/login-verification.component.mjs +0 -79
  111. package/esm2022/lib/login2/login2.component.mjs +0 -60
  112. package/esm2022/lib/modal-root.component.mjs +0 -33
  113. package/esm2022/lib/not-found/not-found.component.mjs +0 -16
  114. package/esm2022/lib/not-internet/not-internet.component.mjs +0 -21
  115. package/esm2022/lib/pipes/barsa-icon-dict.pipe.mjs +0 -19
  116. package/esm2022/lib/pipes/bbb-translate.pipe.mjs +0 -35
  117. package/esm2022/lib/pipes/can-upload.pipe.mjs +0 -30
  118. package/esm2022/lib/pipes/column-custom-component.pipe.mjs +0 -40
  119. package/esm2022/lib/pipes/column-customui.pipe.mjs +0 -32
  120. package/esm2022/lib/pipes/column-icon.pipe.mjs +0 -22
  121. package/esm2022/lib/pipes/column-value.pipe.mjs +0 -34
  122. package/esm2022/lib/pipes/combo-row-img.pipe.mjs +0 -16
  123. package/esm2022/lib/pipes/context-menu.pipe.mjs +0 -40
  124. package/esm2022/lib/pipes/control-ui.pipe.mjs +0 -31
  125. package/esm2022/lib/pipes/convert-to-style.pipe.mjs +0 -32
  126. package/esm2022/lib/pipes/date-time-to-caption.pipe.mjs +0 -34
  127. package/esm2022/lib/pipes/fileinfo-count.pipe.mjs +0 -20
  128. package/esm2022/lib/pipes/filter-columns-by-details.pipe.mjs +0 -22
  129. package/esm2022/lib/pipes/filter-string.pipe.mjs +0 -44
  130. package/esm2022/lib/pipes/filter-tab.pipe.mjs +0 -19
  131. package/esm2022/lib/pipes/filter-toolbar-control.pipe.mjs +0 -16
  132. package/esm2022/lib/pipes/filter-workflow-mobile.pipe.mjs +0 -24
  133. package/esm2022/lib/pipes/filter.pipe.mjs +0 -33
  134. package/esm2022/lib/pipes/find-column-by-db-name.pipe.mjs +0 -27
  135. package/esm2022/lib/pipes/find-preview-column.pipe.mjs +0 -19
  136. package/esm2022/lib/pipes/fiori-icon.pipe.mjs +0 -42
  137. package/esm2022/lib/pipes/groupby.pipe.mjs +0 -63
  138. package/esm2022/lib/pipes/header-facet-value.pipe.mjs +0 -22
  139. package/esm2022/lib/pipes/hide-columns-inmobile.pipe.mjs +0 -22
  140. package/esm2022/lib/pipes/index.mjs +0 -48
  141. package/esm2022/lib/pipes/list-count.pipe.mjs +0 -17
  142. package/esm2022/lib/pipes/merge-fields-to-columns.pipe.mjs +0 -42
  143. package/esm2022/lib/pipes/mo-info-ulv-data.pipe.mjs +0 -58
  144. package/esm2022/lib/pipes/mo-info-ulv-paging.pipe.mjs +0 -16
  145. package/esm2022/lib/pipes/mo-report-value-concat.pipe.mjs +0 -35
  146. package/esm2022/lib/pipes/mo-report-value.pipe.mjs +0 -17
  147. package/esm2022/lib/pipes/mo-value.pipe.mjs +0 -18
  148. package/esm2022/lib/pipes/multiple-groupby.pipe.mjs +0 -90
  149. package/esm2022/lib/pipes/numeral.pipe.mjs +0 -43
  150. package/esm2022/lib/pipes/picture-field-source.pipe.mjs +0 -22
  151. package/esm2022/lib/pipes/remove-newline.pipe.mjs +0 -20
  152. package/esm2022/lib/pipes/replace.pipe.mjs +0 -17
  153. package/esm2022/lib/pipes/reverse.pipe.mjs +0 -22
  154. package/esm2022/lib/pipes/rownumber.pipe.mjs +0 -25
  155. package/esm2022/lib/pipes/sanitize-text.pipe.mjs +0 -20
  156. package/esm2022/lib/pipes/seperator-fix.pipe.mjs +0 -23
  157. package/esm2022/lib/pipes/sort.pipe.mjs +0 -48
  158. package/esm2022/lib/pipes/th-image-icon.pipe.mjs +0 -22
  159. package/esm2022/lib/pipes/tlbButtons.pipe.mjs +0 -59
  160. package/esm2022/lib/pipes/total-summary.pipe.mjs +0 -16
  161. package/esm2022/lib/pipes/tree-item-isexpanded.pipe.mjs +0 -25
  162. package/esm2022/lib/pipes/visible-value.pipe.mjs +0 -18
  163. package/esm2022/lib/portal-page/portal-page.component.mjs +0 -23
  164. package/esm2022/lib/portal-page/portal-sidebar.component.mjs +0 -36
  165. package/esm2022/lib/redirect-home-guard.mjs +0 -51
  166. package/esm2022/lib/redirect-report-navigator-command/redirect-report-navigator-command.component.mjs +0 -12
  167. package/esm2022/lib/report-container/report-container.component.mjs +0 -63
  168. package/esm2022/lib/resizable-module/resizable.component.mjs +0 -31
  169. package/esm2022/lib/resizable-module/resizable.directive.mjs +0 -41
  170. package/esm2022/lib/resizable-module/resizable.module.mjs +0 -17
  171. package/esm2022/lib/resolvers/index.mjs +0 -6
  172. package/esm2022/lib/resolvers/portal-dynamic-page.resolver.mjs +0 -49
  173. package/esm2022/lib/resolvers/portal-form-page.resolver.mjs +0 -18
  174. package/esm2022/lib/resolvers/portal-page.resolver.mjs +0 -30
  175. package/esm2022/lib/resolvers/portal-report-page.resolver.mjs +0 -37
  176. package/esm2022/lib/resolvers/tile-group-breadcrumb.resolver.mjs +0 -30
  177. package/esm2022/lib/root-page/root-page.component.mjs +0 -21
  178. package/esm2022/lib/root-portal/root-portal.component.mjs +0 -164
  179. package/esm2022/lib/server-connection-error/server-connection-error.component.mjs +0 -19
  180. package/esm2022/lib/services/api.service.mjs +0 -63
  181. package/esm2022/lib/services/audio-recording.service.mjs +0 -95
  182. package/esm2022/lib/services/barsa-dialog.service.mjs +0 -80
  183. package/esm2022/lib/services/barsa-storage.service.mjs +0 -78
  184. package/esm2022/lib/services/breadcrumb.service.mjs +0 -64
  185. package/esm2022/lib/services/column.service.mjs +0 -20
  186. package/esm2022/lib/services/container.service.mjs +0 -69
  187. package/esm2022/lib/services/dynamic-component.service.mjs +0 -55
  188. package/esm2022/lib/services/form-panel.service.mjs +0 -380
  189. package/esm2022/lib/services/form.service.mjs +0 -14
  190. package/esm2022/lib/services/horizontal-layout.service.mjs +0 -16
  191. package/esm2022/lib/services/index.mjs +0 -29
  192. package/esm2022/lib/services/indexeddb.service.mjs +0 -34
  193. package/esm2022/lib/services/layout.service.mjs +0 -42
  194. package/esm2022/lib/services/local-storage.service.mjs +0 -32
  195. package/esm2022/lib/services/log.service.mjs +0 -50
  196. package/esm2022/lib/services/network-status.service.mjs +0 -15
  197. package/esm2022/lib/services/notification-popup.service.mjs +0 -2
  198. package/esm2022/lib/services/notification-sw.service.mjs +0 -180
  199. package/esm2022/lib/services/notification.service.mjs +0 -308
  200. package/esm2022/lib/services/portal.service.mjs +0 -929
  201. package/esm2022/lib/services/prompt-update.service.mjs +0 -56
  202. package/esm2022/lib/services/routing.service.mjs +0 -60
  203. package/esm2022/lib/services/save-scoll-position.service.mjs +0 -29
  204. package/esm2022/lib/services/service-worker-communication.service.mjs +0 -120
  205. package/esm2022/lib/services/toast.service.mjs +0 -2
  206. package/esm2022/lib/services/ui.service.mjs +0 -23
  207. package/esm2022/lib/services/ulvmain.service.mjs +0 -810
  208. package/esm2022/lib/services/upload.service.mjs +0 -161
  209. package/esm2022/lib/services/video-recording.service.mjs +0 -115
  210. package/esm2022/public-api.mjs +0 -44
@@ -1,810 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { BehaviorSubject, combineLatest, of, Subject } from 'rxjs';
3
- import { delay, distinctUntilChanged, filter, map, shareReplay, switchMap, takeUntil, tap } from 'rxjs/operators';
4
- import { BarsaApi, MetaobjectDataModel } from '../abstract-classes';
5
- import { executeUlvCommandHandler, genrateInlineMoId, getControlList, GetDefaultMoObjectInfo, getNewMoGridEditor } from '../constants';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "../pipes";
8
- import * as i2 from "./api.service";
9
- export class UlvMainService {
10
- constructor(_bbbPipe, _apiService) {
11
- this._bbbPipe = _bbbPipe;
12
- this._apiService = _apiService;
13
- this.moDataListSource = new BehaviorSubject([]);
14
- this._cartableTemplates$ = new BehaviorSubject({});
15
- this._cartableChildsMo$ = new BehaviorSubject({});
16
- this._setUiViewerSelector$ = new Subject();
17
- this._gridFreeColumnSizing$ = new BehaviorSubject(false);
18
- this._layoutInfoSource = new Subject();
19
- this._contextSource = new Subject();
20
- this._canSaveGridSetting$ = new BehaviorSubject(false);
21
- this._inDialog$ = new BehaviorSubject(false);
22
- this._isMultiSelect$ = new BehaviorSubject(false);
23
- this._fullscreen$ = new BehaviorSubject(false);
24
- this._conditionalFormatsSource = new BehaviorSubject([]);
25
- this._reportSource = new BehaviorSubject(null);
26
- this._viewerControlSource = new BehaviorSubject(null);
27
- this._hideToolbarSource = new BehaviorSubject(true);
28
- this._onDestroy$ = new Subject();
29
- this._maskSource = new BehaviorSubject(false);
30
- this._showContextMenuSource = new Subject();
31
- this._viewerMaskSource = new BehaviorSubject(false);
32
- this._visibleSource = new BehaviorSubject(true);
33
- this._enableSource = new BehaviorSubject(true);
34
- this._readonlySource = new BehaviorSubject(false);
35
- this._menuItemsSource = new BehaviorSubject([]);
36
- this._onlyInlineEditSource = new BehaviorSubject(false);
37
- this._inlineEditModeSource = new BehaviorSubject(false);
38
- this._allowInlineEditSource = new BehaviorSubject(false);
39
- this._cartableKeySeperator = '@';
40
- this._titleSource = new BehaviorSubject({
41
- text: '',
42
- image: ''
43
- });
44
- this._hideUlvPageTitle$ = new BehaviorSubject(false);
45
- this._searchPanelUiSource = new BehaviorSubject(null);
46
- this._pagingSettingSource = new BehaviorSubject(null);
47
- this._toolbarButtonsSource = new BehaviorSubject([]);
48
- this._toolbarButtonsWorkflowButtons = new BehaviorSubject([]);
49
- this._destroySource = new Subject();
50
- this._firstApplyAutomatically = true;
51
- this._controlInfosMetaobject = [];
52
- this._selectedSearchPanelSettingsIdSource = new BehaviorSubject('');
53
- this._defaultSearchPanelSettingsSource = new Subject();
54
- this._allSearchPanelSettingsSource = new BehaviorSubject([]);
55
- this._openSearchPanelHiddenSettingsSource = new Subject();
56
- this._openSearchFilesManageSource = new Subject();
57
- this._searchPanelMoChangedSource = new BehaviorSubject(false);
58
- this._newInlineEditMoSource = new BehaviorSubject(null);
59
- this._hideSearchapanelSource = new BehaviorSubject(false);
60
- this._workflowShareButtons = [];
61
- this.context$ = this._contextSource
62
- .asObservable()
63
- .pipe(takeUntil(this._onDestroy$), tap((context) => (this.context = context)), tap((context) => this._initialize(context)), tap((context) => this._addEventListener(context)))
64
- .subscribe();
65
- this.newInlineEditMo$ = this._newInlineEditMoSource.asObservable().pipe(takeUntil(this._onDestroy$));
66
- this.viewer$ = this._viewerControlSource.asObservable().pipe(takeUntil(this._onDestroy$));
67
- this.conditionalFormats$ = this._conditionalFormatsSource.asObservable().pipe(takeUntil(this._onDestroy$));
68
- this.hideToolbar$ = this._hideToolbarSource.asObservable().pipe(takeUntil(this._onDestroy$));
69
- this.mask$ = this._maskSource.asObservable().pipe(takeUntil(this._onDestroy$));
70
- this.viwerMask$ = this._viewerMaskSource.asObservable().pipe(takeUntil(this._onDestroy$));
71
- this.visible$ = this._visibleSource.asObservable().pipe(takeUntil(this._onDestroy$));
72
- this.enable$ = this._enableSource.asObservable().pipe(takeUntil(this._onDestroy$));
73
- this.readonly$ = this._readonlySource.asObservable().pipe(takeUntil(this._onDestroy$));
74
- this.hideUlvPageTitle$ = this._hideUlvPageTitle$.asObservable().pipe(takeUntil(this._onDestroy$));
75
- this.uiViewerSelector$ = this._setUiViewerSelector$.asObservable();
76
- this.menuItems$ = this._menuItemsSource.asObservable().pipe(takeUntil(this._onDestroy$), filter((items) => items?.length > 0), map((items) => items.filter((c) => c.itemId !== 'ExportToExcel' && c.itemId !== 'Delete')));
77
- this.title$ = this._titleSource.asObservable().pipe(takeUntil(this._onDestroy$));
78
- this.searchPanelUi$ = this._searchPanelUiSource.asObservable().pipe(takeUntil(this._onDestroy$), tap((searchPanel) => this._addDefaultSearchPanelSettings(searchPanel)));
79
- this.openSearchPanelHiddenSettings$ = this._openSearchPanelHiddenSettingsSource.asObservable();
80
- this.pagingSetting$ = this._pagingSettingSource.asObservable().pipe(takeUntil(this._onDestroy$));
81
- this.toolbarButtons$ = combineLatest([
82
- this._toolbarButtonsWorkflowButtons.asObservable(),
83
- this._toolbarButtonsSource.asObservable()
84
- ]).pipe(takeUntil(this._onDestroy$), map(([wfBtns, c]) => !c
85
- ? []
86
- : [
87
- ...wfBtns,
88
- ...c.map((d) => ({
89
- ...d,
90
- hideText: d.Command?.IsBuiltin && d.itemId !== 'New' ? true : false
91
- }))
92
- ]), map((c) => !c ? [] : [...c.filter((d) => !d.Command?.IsBuiltin), ...c.filter((d) => d.Command?.IsBuiltin)]), map((c) => c.reduce((acc, b) => (acc.length > 0 && acc[acc.length - 1]['0'] && b['0'] ? acc : [...acc, b]), [])));
93
- this.destroy$ = this._destroySource.asObservable().pipe(tap(() => this._unscubscribeContext()));
94
- this.moDataList$ = this.moDataListSource.asObservable().pipe();
95
- this.selectedCount$ = this.moDataList$.pipe(map((items) => items.filter((d) => d.$IsChecked).length));
96
- this.reportId$ = this._reportSource.asObservable().pipe(map((report) => report?.Id));
97
- this.allowInlineEdit$ = this._allowInlineEditSource.asObservable();
98
- this.inlineEditMode$ = this._inlineEditModeSource.asObservable();
99
- this.onlyInlineEdit$ = this._onlyInlineEditSource.asObservable();
100
- this.openSearchFilesManage$ = this._openSearchFilesManageSource.asObservable();
101
- this.searchPanelMoChanged$ = this._searchPanelMoChangedSource.asObservable().pipe(distinctUntilChanged());
102
- this.layoutInfo$ = this._layoutInfoSource.asObservable().pipe(shareReplay(1));
103
- this.allSearchPanelSettings$ = combineLatest([
104
- this._allSearchPanelSettingsSource.asObservable(),
105
- this._defaultSearchPanelSettingsSource.asObservable()
106
- ]).pipe(map(([allSettings, defaultSettings]) => {
107
- if (defaultSettings && allSettings) {
108
- defaultSettings.IsDefault = !allSettings.some((c) => c.IsDefault);
109
- allSettings = [defaultSettings, ...allSettings];
110
- }
111
- return allSettings;
112
- }), delay(0), shareReplay(1));
113
- this.selectedSearchPanelSettingsId$ = this._selectedSearchPanelSettingsIdSource
114
- .asObservable()
115
- .pipe(distinctUntilChanged());
116
- this.selectedSearchPanelSettings$ = combineLatest([
117
- this.selectedSearchPanelSettingsId$,
118
- this.allSearchPanelSettings$
119
- ]).pipe(map(([id, settings]) => settings?.find((c) => c.Id === id)), shareReplay(1));
120
- }
121
- get showContextMenu$() {
122
- return this._showContextMenuSource.asObservable();
123
- }
124
- get gridFreeColumnSizing$() {
125
- return this._gridFreeColumnSizing$.asObservable();
126
- }
127
- get canSaveGridSetting$() {
128
- return this._canSaveGridSetting$.asObservable();
129
- }
130
- get inDialog$() {
131
- return this._inDialog$.asObservable();
132
- }
133
- get isMultiSelect$() {
134
- return this._isMultiSelect$.asObservable();
135
- }
136
- get fullscreen$() {
137
- return this._fullscreen$.asObservable();
138
- }
139
- get cartableChildsMo$() {
140
- return this._cartableChildsMo$.asObservable();
141
- }
142
- get cartableTemplates$() {
143
- return this._cartableTemplates$.asObservable();
144
- }
145
- get searchPanelUi() {
146
- return this._searchPanelUiSource.getValue();
147
- }
148
- get reportId() {
149
- return this._reportSource.getValue()?.Id;
150
- }
151
- get allSearchPanelSettings() {
152
- return this._allSearchPanelSettingsSource.getValue();
153
- }
154
- get hideSearchpanel$() {
155
- return this._hideSearchapanelSource.asObservable().pipe(distinctUntilChanged());
156
- }
157
- get hideSearchpanel() {
158
- return this._hideSearchapanelSource.getValue();
159
- }
160
- setUiViewerClass(selector) {
161
- this._setUiViewerSelector$.next(selector);
162
- }
163
- hideUlvTitlePage() {
164
- this._hideUlvPageTitle$.next(true);
165
- }
166
- setCanSaveGridSettings(val) {
167
- this._canSaveGridSetting$.next(val);
168
- }
169
- executeToolbarButton(itemId, options) {
170
- const buttons = this._toolbarButtonsSource.getValue();
171
- if (!buttons.length) {
172
- return;
173
- }
174
- const btn = buttons.find((c) => c.itemId === itemId);
175
- if (btn) {
176
- executeUlvCommandHandler(btn, options);
177
- }
178
- }
179
- addWorkflowButtonsInToolbar(e) {
180
- const arrOfShareButtons = this._createWorkflowShareButtons(e);
181
- const value = arrOfShareButtons.map((c) => ({
182
- icon: '',
183
- text: c,
184
- itemId: c,
185
- Data: null,
186
- $ShareWorkflowButtons: true,
187
- Command: { _isVisible: true, _isEnable: true, JsonExtraProp: { Design: 'attention' } },
188
- handler: (d) => this.onWorkflowButtonInToolbarClick(d),
189
- IsBuiltin: false
190
- }));
191
- this._toolbarButtonsWorkflowButtons.next(value);
192
- }
193
- _excludeWrapperFromMo(mo) {
194
- /* eslint-disable no-unused-vars */
195
- const { $Wrapper, ...newMo } = mo;
196
- return newMo;
197
- }
198
- onWorkflowButtonInToolbarClick(shareButton) {
199
- BarsaApi.Bw.Msg.OKCancel('آیا از تایید موارد کارتابل مطمئن هستید؟', 'تایید', (res) => {
200
- if (res === 'ok') {
201
- this._workflowShareButtons.forEach((c) => {
202
- const choiceDef = c.choiceList.find((d) => d.Title === shareButton.text);
203
- if (choiceDef) {
204
- c.formPanelCtrlr.WorkflowTransition(choiceDef, () => {
205
- // this._setWorkflowState('Finish', [c.mo]);
206
- });
207
- }
208
- });
209
- // this._setWorkflowState(
210
- // 'Pending',
211
- // this._workflowShareButtons.map((c) => c.mo)
212
- // );
213
- // const params = this._workflowShareButtons.map((c) => ({
214
- // mo: this._excludeWrapperFromMo(c.mo.RelatedMo),
215
- // choiceDef: c.choiceList.find((d) => d.Title === shareButton.text)
216
- // }));
217
- // this._setWorkflowState('Pending', params);
218
- // BarsaApi.Common.Ajax.GetServerData(
219
- // 'Workflow94.OnGroupOfChoiceDefsSelect',
220
- // { parameter: { DataList: params } },
221
- // () => {
222
- // this._setWorkflowState('Success', params);
223
- // }, // success
224
- // () => {
225
- // this._setWorkflowState('Failed', params, 'متاسفانه عملیات ناموفق بود.');
226
- // }, // failure
227
- // null,
228
- // this
229
- // );
230
- }
231
- });
232
- }
233
- setTitle(title) {
234
- this._titleSource.next({ text: title, image: '' });
235
- }
236
- toggleHideSearchpanel(val) {
237
- this._hideSearchapanelSource.next(typeof val !== 'undefined' ? val : !this._hideSearchapanelSource.getValue());
238
- }
239
- setContext(context) {
240
- this._contextSource.next(context);
241
- }
242
- setInDialog(val) {
243
- this._inDialog$.next(val);
244
- }
245
- setIsMultiSelect(val) {
246
- this._isMultiSelect$.next(val);
247
- }
248
- setFullscreen(val) {
249
- this._fullscreen$.next(val);
250
- }
251
- createNewInlineMo(isChecked) {
252
- const context = this.context;
253
- const formSetting = context.Setting.FormTemplate;
254
- const typeDefId = context.Setting.Extra.Report.TypeDefId;
255
- const newMo = getNewMoGridEditor(formSetting, typeDefId);
256
- newMo.Id = genrateInlineMoId();
257
- newMo.$IsChecked = isChecked;
258
- newMo.$NewInlineMo = true;
259
- if (this._isComposite(context)) {
260
- const relation = BarsaApi.Common.Util.TryGetValue(this.context.Setting, 'Extra.Relation');
261
- newMo[relation.ParentFdName] = relation.ParentMoId;
262
- }
263
- // this._newInlineEditMoSource.next(newMo);
264
- return newMo;
265
- }
266
- setLayoutInfo(layoutInfo) {
267
- this._layoutInfoSource.next(layoutInfo);
268
- }
269
- destroy() {
270
- this._onDestroy$.next();
271
- this._unscubscribeContext();
272
- }
273
- pageSizeChanged(pageIndex) {
274
- this.context.fireEvent('PageChange', this.context, pageIndex);
275
- }
276
- pageChanged(pageIndex) {
277
- this.context.currentPage = pageIndex;
278
- this.context.fireEvent('PageChange', this.context, pageIndex);
279
- }
280
- reSetMoDataList(moDataList) {
281
- const newMoDataList = moDataList ?? this.moDataListSource.getValue();
282
- this._moDataListChanged([...newMoDataList]);
283
- if (!this.context.Setting?.IsCartableReport) {
284
- return;
285
- }
286
- const keyOfCatableTemplates = new Set();
287
- newMoDataList.forEach((c) => {
288
- const tpdfId = c.RelatedMo?.$TypeDefId;
289
- if (tpdfId) {
290
- const key = `${tpdfId}${this._cartableKeySeperator}${c.CartableSettings?.Id || '0'}`;
291
- keyOfCatableTemplates.add(key);
292
- }
293
- });
294
- if (keyOfCatableTemplates.size > 0) {
295
- this._loadCartableTemplate(keyOfCatableTemplates);
296
- }
297
- }
298
- // Search Setting Manager
299
- clearSearch() {
300
- const searchPanelUi = this.searchPanelUi;
301
- if (!searchPanelUi) {
302
- return;
303
- }
304
- const fieldUi = searchPanelUi._dictFieldUi.$Search ?? searchPanelUi._dictFieldUi.جستجو;
305
- fieldUi.fireEvent('ClearClick');
306
- }
307
- search() {
308
- const searchPanelUi = this.searchPanelUi;
309
- if (!searchPanelUi) {
310
- return;
311
- }
312
- let fieldUi = searchPanelUi._dictFieldUi.$Search ?? searchPanelUi._dictFieldUi.جستجو;
313
- if (!fieldUi) {
314
- Object.keys(searchPanelUi._dictFieldUi).forEach((c) => {
315
- const e = searchPanelUi._dictFieldUi[c];
316
- if (e.originalXtype === 'Ui.SearchCommandInfoUi') {
317
- fieldUi = e;
318
- }
319
- });
320
- }
321
- if (fieldUi) {
322
- fieldUi.fireEvent('SearchClick');
323
- }
324
- }
325
- getValueInlineEdit() {
326
- return this._inlineEditModeSource.getValue();
327
- }
328
- getAllowInlineEdit() {
329
- return this._allowInlineEditSource.getValue();
330
- }
331
- setInlineEdit(value) {
332
- this._inlineEditModeSource.next(value);
333
- }
334
- openSearchFieldsHiddenSettings() {
335
- this._openSearchPanelHiddenSettingsSource.next();
336
- }
337
- openSearchFilesManage() {
338
- this._openSearchFilesManageSource.next();
339
- }
340
- searchPanelMoChanged(change) {
341
- this._searchPanelMoChangedSource.next(change);
342
- }
343
- loadSearchPanelSettings() {
344
- if (this.context.FormPanelUi) {
345
- return;
346
- }
347
- this.reportId$
348
- .pipe(takeUntil(this._onDestroy$), tap((reportId) => this._loadSearchPanelSettings(reportId)))
349
- .subscribe();
350
- }
351
- addSearchPanelSettings(searchPanelSettings) {
352
- const allSearchPanelSettings = this._allSearchPanelSettingsSource.getValue();
353
- allSearchPanelSettings.push(searchPanelSettings);
354
- this._allSearchPanelSettingsSource.next(allSearchPanelSettings);
355
- }
356
- saveSearchPanelSetting(selectedSearchPanelSettings) {
357
- const searchMo = this.getSearchPanelMo();
358
- const fieldsSetting = this.getSearchPanelFieldsSetting();
359
- if (!selectedSearchPanelSettings) {
360
- return;
361
- }
362
- selectedSearchPanelSettings.SearchMo = JSON.stringify(searchMo);
363
- selectedSearchPanelSettings.FieldsSetting = JSON.stringify(fieldsSetting);
364
- BarsaApi.Bw.RunBlMethod('SaveSearchPanelSettings', new BarsaApi.Common.MetaObjectWeb({
365
- Id: selectedSearchPanelSettings.Id,
366
- $Caption: selectedSearchPanelSettings.Title,
367
- ReportId: selectedSearchPanelSettings.Report?.Id,
368
- Title: selectedSearchPanelSettings.Title,
369
- IsDefault: selectedSearchPanelSettings.IsDefault,
370
- IsPublic: selectedSearchPanelSettings.IsPublic,
371
- ApplyAutomatically: selectedSearchPanelSettings.ApplyAutomatically,
372
- HideSearchPanel: selectedSearchPanelSettings.HideSearchPanel,
373
- SearchMo: selectedSearchPanelSettings.SearchMo,
374
- FieldsSetting: selectedSearchPanelSettings.FieldsSetting
375
- }), true);
376
- this.searchPanelMoChanged(false);
377
- }
378
- applySearchPanelSettings(searchPanelSettings) {
379
- const searchPanelUi = this.searchPanelUi;
380
- if (!searchPanelSettings) {
381
- return;
382
- }
383
- if (this._firstApplyAutomatically && searchPanelSettings.IsPrimary) {
384
- this._firstApplyAutomatically = false;
385
- return;
386
- }
387
- this._firstApplyAutomatically = false;
388
- this.resetSearchPanelSettings(searchPanelUi);
389
- if (searchPanelSettings.SearchMo) {
390
- const searchMo = JSON.parse(searchPanelSettings.SearchMo);
391
- Object.keys(searchMo).forEach((c) => {
392
- const field = searchPanelUi._dictFieldUi[c];
393
- if (field && c.indexOf('$') === -1) {
394
- field.SetValue(searchMo[c]);
395
- searchPanelUi.Mo.SetFValue(c, searchMo[c]);
396
- }
397
- });
398
- if (searchPanelSettings.IsPrimary && !searchPanelUi.Setting.ImmediateExecute) {
399
- this.searchPanelMoChanged(false);
400
- return;
401
- }
402
- if (searchPanelSettings.ApplyAutomatically) {
403
- this.search();
404
- }
405
- }
406
- // TODO set hidden fields
407
- if (searchPanelSettings.FieldsSetting) {
408
- const settings = JSON.parse(searchPanelSettings.FieldsSetting);
409
- this.setAndApplySearchPanelSettingFieldsSetting(typeof settings === 'string' ? JSON.parse(settings) : settings);
410
- }
411
- this.searchPanelMoChanged(false);
412
- }
413
- getSearchPanelMo() {
414
- return this.searchPanelUi.Mo;
415
- }
416
- getSearchPanelFieldsSetting() {
417
- const searchPanelUi = this.searchPanelUi;
418
- const fields = searchPanelUi.Setting.View.ControlInfo.filter((c) => c.ControlName !== '$Search' && c.ControlName !== 'جستجو');
419
- const fieldsSetting = fields.map((c) => ({
420
- Name: c.ControlName,
421
- Caption: c.ControlFieldCaptionTranslated,
422
- Hidden: searchPanelUi._dictFieldUi[c.ControlName].Setting.IsVisible === false ? true : false,
423
- IsMandatory: c.IsMandatory
424
- }));
425
- return fieldsSetting;
426
- }
427
- setAndApplySearchPanelSettingFieldsSetting(fieldsSetting) {
428
- const searchPanelUi = this.searchPanelUi;
429
- fieldsSetting.forEach((c) => {
430
- const field = searchPanelUi._dictFieldUi[c.Name];
431
- if (field) {
432
- searchPanelUi.fireEvent('ChangeFieldVisible', field.Setting.ControlFieldCaption, !c.Hidden);
433
- }
434
- });
435
- }
436
- updateSearchPanelSettings(allSearchPanelSettings) {
437
- allSearchPanelSettings = allSearchPanelSettings.filter((c) => !c.IsPrimary && !c.IsDeleted);
438
- this._allSearchPanelSettingsSource.next(allSearchPanelSettings);
439
- }
440
- removeSearchPanelSettings(searchPanelSettingsId) {
441
- const allSearchPanelSettings = this._allSearchPanelSettingsSource.getValue();
442
- allSearchPanelSettings.filter((c) => c.Id !== searchPanelSettingsId);
443
- this._allSearchPanelSettingsSource.next(allSearchPanelSettings);
444
- }
445
- changeSelectedSearchPanel(selectedSearchPanelSettingsId) {
446
- this._selectedSearchPanelSettingsIdSource.next(selectedSearchPanelSettingsId);
447
- }
448
- loadMetaConditionsControlInfos(typeDefId, fieldDbNames) {
449
- const mo = GetDefaultMoObjectInfo(typeDefId);
450
- return of(this._controlInfosMetaobject).pipe(switchMap((controlsInfo) => {
451
- if (controlsInfo.length > 0) {
452
- return of(controlsInfo);
453
- }
454
- return getControlList(mo, fieldDbNames, true, false);
455
- }), tap((controlsInfo) => (this._controlInfosMetaobject = controlsInfo)));
456
- }
457
- _createWorkflowShareButtons(e) {
458
- let shareButtons = [];
459
- if (e.add) {
460
- this._workflowShareButtons.push(e);
461
- }
462
- else {
463
- this._workflowShareButtons = this._workflowShareButtons.filter((c) => c.mo.Id !== e.mo.Id);
464
- }
465
- if (!this._workflowShareButtons.length) {
466
- return [];
467
- }
468
- // this._workflowShareButtons = this._workflowShareButtons.filter((c) => c.mo?.$IsChecked);
469
- if (this._workflowShareButtons.length > 0) {
470
- shareButtons = this._workflowShareButtons[0].choiceList.map((d) => d.Title);
471
- const unShareButtons = [];
472
- for (let i = 1; i < this._workflowShareButtons.length; i++) {
473
- const item = this._workflowShareButtons[i];
474
- for (let j = 0; j < shareButtons.length; j++) {
475
- if (item.choiceList.map((d) => d.Title).indexOf(shareButtons[j]) < 0) {
476
- unShareButtons.push(shareButtons[j]);
477
- }
478
- }
479
- }
480
- shareButtons = shareButtons.filter((c) => unShareButtons.indexOf(c) === -1);
481
- }
482
- return shareButtons;
483
- }
484
- _initCreateNewInlineMo(context) {
485
- if (!context) {
486
- return;
487
- }
488
- const formSetting = context.Setting.FormTemplate;
489
- if (formSetting) {
490
- this.createNewInlineMo(false);
491
- }
492
- }
493
- _isComposite(context) {
494
- const relationType = BarsaApi.Common.Util.TryGetValue(context.Setting, 'Extra.Relation.RelationType');
495
- return relationType === BarsaApi.Common.Enums.RelationType.Composition;
496
- }
497
- _addEventListener(context) {
498
- context.on({
499
- scope: this,
500
- ShowContextMenu: this._showContextMenu,
501
- MaskChanged: this._maskChanged,
502
- ViewerMaskChanged: this._viewerMaskChanged,
503
- ViewerControlChanged: this._viewerControlChanged,
504
- VisibleChanged: this._visibleChanged,
505
- ReadonlyChanged: this._readonlyChanged,
506
- MenuItemsChanged: this._menuItemsChanged,
507
- TitleChanged: this._titleChanged,
508
- SearchPanelChanged: this._searchPanelChanged,
509
- PagingSettingChanged: this._pagingSettingChanged,
510
- ToolbarButtonsChanged: this._toolbarButtonsChanged,
511
- EnableChanged: this._enableChanged,
512
- Destroy: this._destroyChanged,
513
- ExitInlineEdit: this._existInlineEdit
514
- });
515
- }
516
- _initialize(context) {
517
- this._initCartablesFormTemplate(context);
518
- this._initConditionalFormats(context);
519
- this._initAllowInlineEdit(context);
520
- this._initOnlyInlineEdit(context);
521
- this._initInlineEditMode(context);
522
- this._initReport(context);
523
- this._initViewerControl(context);
524
- this._initHideToolbar(context);
525
- this._initToolbarButtons(context);
526
- this._initVisible(context);
527
- this._initEnable(context);
528
- this._initTitle(context);
529
- this._initReadonly(context);
530
- this._initMoDataList(context);
531
- this._initPagingSetting(context);
532
- this._initMenuItems(context);
533
- this._initSearchpanel(context);
534
- this._initCreateNewInlineMo(context);
535
- this._initGridFreeColumnSizing(context);
536
- }
537
- _initGridFreeColumnSizing(context) {
538
- if (context && context.Setting.View?.Grid_FreeColumnSizing) {
539
- this._gridFreeColumnSizing$.next(context.Setting.View?.Grid_FreeColumnSizing);
540
- }
541
- }
542
- _initCartablesFormTemplate(context) {
543
- const cartableTemplates = context.Setting.CartableTemplates;
544
- if (cartableTemplates) {
545
- const keys = Object.keys(cartableTemplates);
546
- keys.forEach((key) => {
547
- if (typeof cartableTemplates[key] === 'string') {
548
- cartableTemplates[key] = BarsaApi.Ext.decode(cartableTemplates[key]);
549
- }
550
- });
551
- this._cartableTemplates$.next(cartableTemplates);
552
- }
553
- this._cartableChildsMo(context);
554
- }
555
- _initSearchpanel(context) {
556
- if (context && context._searchPanelControl) {
557
- this._searchPanelChanged(context._searchPanelControl);
558
- }
559
- }
560
- _initConditionalFormats(context) {
561
- if (context && context.Setting.View?.ConditionalFormats) {
562
- this._conditionalFormatsChanged(context.Setting.View?.ConditionalFormats);
563
- }
564
- }
565
- _initMenuItems(context) {
566
- if (context && context.menuItems) {
567
- // const newItems = context.menuItems;
568
- this._menuItemsChanged(context.menuItems);
569
- }
570
- }
571
- _initReport(context) {
572
- const report = BarsaApi.Common.Util.TryGetValue(context, 'Setting.Extra.Report', []);
573
- this._reportSource.next(report);
574
- }
575
- _initMoDataList(context) {
576
- const moDataList = BarsaApi.Common.Util.TryGetValue(context, 'Setting.Data.MoDataList', []);
577
- this._moDataListChanged(moDataList);
578
- }
579
- _cartableChildsMo(context) {
580
- if (context.Setting.CartableChildsMo) {
581
- this._cartableChildsMo$.next(context.Setting.CartableChildsMo);
582
- }
583
- }
584
- _initPagingSetting(context) {
585
- const pagingSetting = BarsaApi.Common.Util.TryGetValue(context, 'Setting.Data.Paging', null);
586
- this._pagingSettingChanged(pagingSetting);
587
- }
588
- _initTitle(context) {
589
- let title = BarsaApi.Common.Util.TryGetValue(context, 'title', null);
590
- if (title === null) {
591
- title = BarsaApi.Common.Util.TryGetValue(context, 'Setting.Extra.Report.Caption', '');
592
- }
593
- this._titleChanged({ text: title, image: '' });
594
- }
595
- _initReadonly(context) {
596
- const readonly = context.readonly === true ? true : false;
597
- this._readonlyChanged(readonly);
598
- }
599
- _initEnable(context) {
600
- const enable = context.enable === false ? false : true;
601
- this._enableChanged(enable);
602
- }
603
- _initVisible(context) {
604
- const visible = context.Setting.IsVisible === false ? false : true;
605
- this._visibleChanged(visible);
606
- }
607
- _initToolbarButtons(context) {
608
- const buttons = context.tlbButtons;
609
- if (Array.isArray(buttons)) {
610
- this._toolbarButtonsChanged(buttons);
611
- }
612
- }
613
- _initInlineEditMode(context) {
614
- const inlineEditMode = context.Setting?.View?.AutoInlineEdit;
615
- this._inlineEditModeSource.next(inlineEditMode);
616
- }
617
- _initAllowInlineEdit(context) {
618
- const allowInlineEdit = context.Setting?.View?.AllowInlineEdit;
619
- const allowEdit = context.Setting.Extra?.DefaultCommandsAccess?.Edit;
620
- this._allowInlineEditSource.next(allowInlineEdit && allowEdit);
621
- }
622
- _initOnlyInlineEdit(context) {
623
- const onlyInlineEdit = context.Setting?.View?.OnlyInlineEdit;
624
- this._onlyInlineEditSource.next(onlyInlineEdit);
625
- }
626
- _initViewerControl(context) {
627
- const viewerControl = context.viewerControl;
628
- if (viewerControl) {
629
- this._viewerControlChanged(viewerControl);
630
- }
631
- }
632
- _initHideToolbar(context) {
633
- const hideToolbar = BarsaApi.Common.Util.TryGetValue(context, 'Setting.Extra.Report.HideToolbar', false);
634
- this._hideToolbarSource.next(hideToolbar);
635
- }
636
- _unscubscribeContext() {
637
- this.context.un('ShowContextMenu', this._showContextMenu);
638
- this.context.un('MaskChanged', this._maskChanged);
639
- this.context.un('ViewerControlChanged', this._viewerControlChanged);
640
- this.context.un('ViewerMaskChanged', this._viewerMaskChanged);
641
- this.context.un('VisibleChanged', this._visibleChanged);
642
- this.context.un('ReadonlyChanged', this._readonlyChanged);
643
- this.context.un('MenuItemsChanged', this._menuItemsChanged);
644
- this.context.un('TitleChanged', this._titleChanged);
645
- this.context.un('PagingSettingChanged', this._pagingSettingChanged);
646
- this.context.un('ToolbarButtonsChanged', this._toolbarButtonsChanged);
647
- this.context.un('EnableChanged', this._enableChanged);
648
- this.context.un('Destroy', this._destroyChanged);
649
- this.context.un('ExitInlineEdit', this._existInlineEdit);
650
- }
651
- _conditionalFormatsChanged(conditionalFormats) {
652
- this._conditionalFormatsSource.next(conditionalFormats);
653
- }
654
- _moDataListChanged(moDataList) {
655
- this.moDataListSource.next(moDataList);
656
- if (this.context) {
657
- this._cartableChildsMo(this.context);
658
- this._initCartablesFormTemplate(this.context);
659
- this._checkCartableWorkflowShareButtons(moDataList);
660
- }
661
- }
662
- _checkCartableWorkflowShareButtons(moDataList) {
663
- const hasSelected = moDataList.some((c) => c.$IsChecked);
664
- const moIds = moDataList.map((c) => c.Id);
665
- this._workflowShareButtons = this._workflowShareButtons.filter((c) => moIds.indexOf(c.mo.Id) > -1);
666
- if (!hasSelected) {
667
- this._toolbarButtonsWorkflowButtons.next([]);
668
- }
669
- }
670
- _viewerControlChanged(viewerControl) {
671
- this._viewerControlSource.next(viewerControl);
672
- this._initConditionalFormats(this.context);
673
- this._initInlineEditMode(this.context);
674
- this._initAllowInlineEdit(this.context);
675
- this._initOnlyInlineEdit(this.context);
676
- }
677
- _maskChanged(mask) {
678
- this._maskSource.next(mask);
679
- }
680
- _showContextMenu(xy) {
681
- this._showContextMenuSource.next(xy);
682
- }
683
- _viewerMaskChanged(viewerMask) {
684
- this._viewerMaskSource.next(viewerMask);
685
- }
686
- _readonlyChanged(readonly) {
687
- this._readonlySource.next(readonly);
688
- }
689
- _visibleChanged(viewerMask) {
690
- this._visibleSource.next(viewerMask);
691
- }
692
- _removeExtraMenuItems(menuItems) {
693
- if (!menuItems) {
694
- return [];
695
- }
696
- const newItems = menuItems.filter((c) => c.itemId !== 'Delete' && c.itemId !== 'AddToList' && c.itemId !== 'RemoveFromList');
697
- return newItems;
698
- }
699
- _menuItemsChanged(menuItems) {
700
- const newMenuItems = this._removeExtraMenuItems(menuItems);
701
- this._menuItemsSource.next(newMenuItems);
702
- }
703
- _titleChanged(titleObj) {
704
- this._titleSource.next(titleObj);
705
- }
706
- _searchPanelChanged(searchPanel) {
707
- this._searchPanelUiSource.next(searchPanel);
708
- }
709
- _pagingSettingChanged(pageingSetting) {
710
- this._pagingSettingSource.next(pageingSetting);
711
- }
712
- _toolbarButtonsChanged(buttons) {
713
- this._toolbarButtonsSource.next(buttons);
714
- }
715
- _enableChanged(enable) {
716
- this._enableSource.next(enable);
717
- }
718
- _destroyChanged() {
719
- this._destroySource.next();
720
- }
721
- _existInlineEdit() {
722
- this._inlineEditModeSource.next(false);
723
- }
724
- _addDefaultSearchPanelSettings(searchPanel) {
725
- const searchMo = JSON.stringify(searchPanel?.Mo ?? new MetaobjectDataModel());
726
- const StandardText = this._bbbPipe.transform('Standard');
727
- const standardSettings = {
728
- Id: '',
729
- $Caption: StandardText,
730
- IsStandard: true,
731
- IsDefault: true,
732
- IsPublic: true,
733
- IsPrimary: true,
734
- ApplyAutomatically: true,
735
- HideSearchPanel: false,
736
- Title: StandardText,
737
- SearchMo: searchMo,
738
- ReportId: ''
739
- };
740
- this._defaultSearchPanelSettingsSource.next(standardSettings);
741
- }
742
- _loadSearchPanelSettings(reportId) {
743
- BarsaApi.Bw.RunBlMethodAsync({
744
- Parameters: [reportId],
745
- Method: 'LoadAllUserSearchPanelSettings',
746
- SuccessFn: (allSearchPanelSettings) => {
747
- if (Array.isArray(allSearchPanelSettings)) {
748
- allSearchPanelSettings = BarsaApi.Bw._unwrap(allSearchPanelSettings);
749
- this._allSearchPanelSettingsSource.next(allSearchPanelSettings);
750
- const defaultSearch = allSearchPanelSettings.find((c) => c.IsDefault);
751
- if (defaultSearch) {
752
- this._selectedSearchPanelSettingsIdSource.next(defaultSearch.Id);
753
- }
754
- }
755
- },
756
- FailFn: () => { }
757
- });
758
- }
759
- resetSearchPanelSettings(searchPanelUi) {
760
- this.clearSearch();
761
- const fieldUi = searchPanelUi._dictFieldUi;
762
- const changed = searchPanelUi.Mo.GetChangedObject();
763
- Object.keys(changed).forEach((c) => {
764
- const field = searchPanelUi._dictFieldUi[c];
765
- if (field) {
766
- field.SetValue(null);
767
- searchPanelUi.Mo.SetFValue(c, null);
768
- }
769
- searchPanelUi.Mo.SetState('New');
770
- });
771
- Object.keys(fieldUi).forEach((c) => {
772
- if (c !== '$Search' && fieldUi[c].LayoutControl) {
773
- searchPanelUi.fireEvent('ChangeFieldVisible', fieldUi[c].Setting.ControlFieldCaption, true);
774
- }
775
- });
776
- }
777
- _loadCartableTemplate(keyOfCartableTemplates) {
778
- let cartableTemplates = this._cartableTemplates$.getValue();
779
- if (!cartableTemplates) {
780
- return;
781
- }
782
- const keys = [];
783
- keyOfCartableTemplates.forEach((key) => {
784
- const values = key.split(this._cartableKeySeperator);
785
- if (!cartableTemplates[key]) {
786
- keys.push({ TypeDefId: values[0], SettingsId: values[1] });
787
- }
788
- });
789
- if (keys.length === 0) {
790
- return;
791
- }
792
- this._apiService.GetCartableTemplate(keys).subscribe((c) => {
793
- if (!c) {
794
- return;
795
- }
796
- const templates = {};
797
- Object.keys(c).forEach((cId) => {
798
- templates[cId] = BarsaApi.Ext.decode(c[cId]);
799
- });
800
- cartableTemplates = { ...cartableTemplates, ...templates };
801
- this._cartableTemplates$.next(cartableTemplates);
802
- });
803
- }
804
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UlvMainService, deps: [{ token: i1.BbbTranslatePipe }, { token: i2.ApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
805
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UlvMainService }); }
806
- }
807
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UlvMainService, decorators: [{
808
- type: Injectable
809
- }], ctorParameters: () => [{ type: i1.BbbTranslatePipe }, { type: i2.ApiService }] });
810
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWx2bWFpbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2Etbm92aW4tcmF5LWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy91bHZtYWluLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM3RixPQUFPLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEgsT0FBTyxFQUNILFFBQVEsRUFFUixtQkFBbUIsRUFRdEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0gsd0JBQXdCLEVBQ3hCLGlCQUFpQixFQUNqQixjQUFjLEVBQ2Qsc0JBQXNCLEVBQ3RCLGtCQUFrQixFQUNyQixNQUFNLGNBQWMsQ0FBQzs7OztBQUl0QixNQUFNLE9BQU8sY0FBYztJQXNGdkIsWUFBb0IsUUFBMEIsRUFBVSxXQUF1QjtRQUEzRCxhQUFRLEdBQVIsUUFBUSxDQUFrQjtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBckYvRSxxQkFBZ0IsR0FBRyxJQUFJLGVBQWUsQ0FBd0IsRUFBRSxDQUFDLENBQUM7UUErQmxFLHdCQUFtQixHQUFHLElBQUksZUFBZSxDQUFpQyxFQUFFLENBQUMsQ0FBQztRQUM5RSx1QkFBa0IsR0FBRyxJQUFJLGVBQWUsQ0FBZ0QsRUFBRSxDQUFDLENBQUM7UUFLcEYsMEJBQXFCLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUM5QywyQkFBc0IsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUM3RCxz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LGlCQUFpQixHQUFHLEVBQUUsR0FBRyxpQkFBaUIsRUFBRSxHQUFHLFNBQVMsRUFBRSxDQUFDO1lBQzNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7K0dBOTVCUSxjQUFjO21IQUFkLGNBQWM7OzRGQUFkLGNBQWM7a0JBRDFCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlbGF5LCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIHNoYXJlUmVwbGF5LCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgICBCYXJzYUFwaSxcbiAgICBNZW51SXRlbSxcbiAgICBNZXRhb2JqZWN0RGF0YU1vZGVsLFxuICAgIFBhZ2luZ1NldHRpbmcsXG4gICAgU2VhcmNoUGFuZWxTZXR0aW5ncyxcbiAgICBHZW5lcmFsQ29udHJvbEluZm9Nb2RlbCxcbiAgICBDb2x1bW5JbmZvVHlwZSxcbiAgICBGb3JtU2V0dGluZyxcbiAgICBTaGFyZUJ1dHRvbnNDaG9pY2VEZWYsXG4gICAgQ2FydGFibGVUZW1wbGF0ZUtleVxufSBmcm9tICcuLi9hYnN0cmFjdC1jbGFzc2VzJztcbmltcG9ydCB7XG4gICAgZXhlY3V0ZVVsdkNvbW1hbmRIYW5kbGVyLFxuICAgIGdlbnJhdGVJbmxpbmVNb0lkLFxuICAgIGdldENvbnRyb2xMaXN0LFxuICAgIEdldERlZmF1bHRNb09iamVjdEluZm8sXG4gICAgZ2V0TmV3TW9HcmlkRWRpdG9yXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBCYmJUcmFuc2xhdGVQaXBlIH0gZnJvbSAnLi4vcGlwZXMnO1xuaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gJy4vYXBpLnNlcnZpY2UnO1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFVsdk1haW5TZXJ2aWNlIHtcbiAgICBtb0RhdGFMaXN0U291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNZXRhb2JqZWN0RGF0YU1vZGVsW10+KFtdKTtcbiAgICBjb250ZXh0JDogU3Vic2NyaXB0aW9uO1xuICAgIHZpZXdlciQ6IE9ic2VydmFibGU8YW55PjtcbiAgICBjb25kaXRpb25hbEZvcm1hdHMkOiBPYnNlcnZhYmxlPGFueT47XG4gICAgaGlkZVRvb2xiYXIkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIG1hc2skOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIHZpd2VyTWFzayQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgdmlzaWJsZSQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgZW5hYmxlJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgICByZWFkb25seSQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgbWVudUl0ZW1zJDogT2JzZXJ2YWJsZTxNZW51SXRlbVtdPjtcbiAgICB0aXRsZSQ6IE9ic2VydmFibGU8eyB0ZXh0OiBzdHJpbmc7IGltYWdlOiBzdHJpbmcgfT47XG5cbiAgICBzZWFyY2hQYW5lbFVpJDogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIHBhZ2luZ1NldHRpbmckOiBPYnNlcnZhYmxlPFBhZ2luZ1NldHRpbmcgfCBudWxsPjtcbiAgICB0b29sYmFyQnV0dG9ucyQ6IE9ic2VydmFibGU8YW55W10+O1xuICAgIGRlc3Ryb3kkOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICAgIG1vRGF0YUxpc3QkOiBPYnNlcnZhYmxlPE1ldGFvYmplY3REYXRhTW9kZWxbXT47XG4gICAgcmVwb3J0SWQkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gICAgYWxsb3dJbmxpbmVFZGl0JDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgICBpbmxpbmVFZGl0TW9kZSQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgb25seUlubGluZUVkaXQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIGNvbnRleHQ6IGFueTtcbiAgICBvcGVuU2VhcmNoUGFuZWxIaWRkZW5TZXR0aW5ncyQ6IE9ic2VydmFibGU8dm9pZD47XG4gICAgb3BlblNlYXJjaEZpbGVzTWFuYWdlJDogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgICBzZWFyY2hQYW5lbE1vQ2hhbmdlZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgYWxsU2VhcmNoUGFuZWxTZXR0aW5ncyQ6IE9ic2VydmFibGU8U2VhcmNoUGFuZWxTZXR0aW5nc1tdPjtcbiAgICBsYXlvdXRJbmZvJDogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIHNlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5nc0lkJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICAgIHNlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5ncyQ6IE9ic2VydmFibGU8U2VhcmNoUGFuZWxTZXR0aW5ncyB8IHVuZGVmaW5lZD47XG4gICAgbmV3SW5saW5lRWRpdE1vJDogT2JzZXJ2YWJsZTxNZXRhb2JqZWN0RGF0YU1vZGVsIHwgbnVsbD47XG4gICAgX2NhcnRhYmxlVGVtcGxhdGVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8eyBba2V5OiBzdHJpbmddOiBGb3JtU2V0dGluZyB9Pih7fSk7XG4gICAgX2NhcnRhYmxlQ2hpbGRzTW8kID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IFtrZXk6IHN0cmluZ106IE1ldGFvYmplY3REYXRhTW9kZWwgfSB8IG51bGw+KHt9KTtcbiAgICBzZWxlY3RlZENvdW50JDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICAgIGhpZGVVbHZQYWdlVGl0bGUkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIHVpVmlld2VyU2VsZWN0b3IkOiBPYnNlcnZhYmxlPHN0cmluZz47XG5cbiAgICBwcml2YXRlIF9zZXRVaVZpZXdlclNlbGVjdG9yJCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIF9ncmlkRnJlZUNvbHVtblNpemluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgICBwcml2YXRlIF9sYXlvdXRJbmZvU291cmNlID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICAgIHByaXZhdGUgX2NvbnRleHRTb3VyY2UgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gICAgcHJpdmF0ZSBfY2FuU2F2ZUdyaWRTZXR0aW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIHByaXZhdGUgX2luRGlhbG9nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIHByaXZhdGUgX2lzTXVsdGlTZWxlY3QkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgcHJpdmF0ZSBfZnVsbHNjcmVlbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgICBwcml2YXRlIF9jb25kaXRpb25hbEZvcm1hdHNTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gICAgcHJpdmF0ZSBfcmVwb3J0U291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpO1xuICAgIHByaXZhdGUgX3ZpZXdlckNvbnRyb2xTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4obnVsbCk7XG4gICAgcHJpdmF0ZSBfaGlkZVRvb2xiYXJTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuICAgIHByaXZhdGUgX29uRGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByaXZhdGUgX21hc2tTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgICBwcml2YXRlIF9zaG93Q29udGV4dE1lbnVTb3VyY2UgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByaXZhdGUgX3ZpZXdlck1hc2tTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgICBwcml2YXRlIF92aXNpYmxlU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgICBwcml2YXRlIF9lbmFibGVTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuICAgIHByaXZhdGUgX3JlYWRvbmx5U291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgcHJpdmF0ZSBfbWVudUl0ZW1zU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNZW51SXRlbVtdPihbXSk7XG4gICAgcHJpdmF0ZSBfb25seUlubGluZUVkaXRTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgICBwcml2YXRlIF9pbmxpbmVFZGl0TW9kZVNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIHByaXZhdGUgX2FsbG93SW5saW5lRWRpdFNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIHByaXZhdGUgX2NhcnRhYmxlS2V5U2VwZXJhdG9yID0gJ0AnO1xuICAgIHByaXZhdGUgX3RpdGxlU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IHRleHQ6IHN0cmluZzsgaW1hZ2U6IHN0cmluZyB9Pih7XG4gICAgICAgIHRleHQ6ICcnLFxuICAgICAgICBpbWFnZTogJydcbiAgICB9KTtcbiAgICBwcml2YXRlIF9oaWRlVWx2UGFnZVRpdGxlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgcHJpdmF0ZSBfc2VhcmNoUGFuZWxVaVNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcblxuICAgIHByaXZhdGUgX3BhZ2luZ1NldHRpbmdTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFBhZ2luZ1NldHRpbmcgfCBudWxsPihudWxsKTtcbiAgICBwcml2YXRlIF90b29sYmFyQnV0dG9uc1NvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgICBwcml2YXRlIF90b29sYmFyQnV0dG9uc1dvcmtmbG93QnV0dG9ucyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgICBwcml2YXRlIF9kZXN0cm95U291cmNlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBwcml2YXRlIF9maXJzdEFwcGx5QXV0b21hdGljYWxseSA9IHRydWU7XG4gICAgcHJpdmF0ZSBfY29udHJvbEluZm9zTWV0YW9iamVjdDogR2VuZXJhbENvbnRyb2xJbmZvTW9kZWxbXSA9IFtdO1xuICAgIHByaXZhdGUgX3NlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5nc0lkU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgICBwcml2YXRlIF9kZWZhdWx0U2VhcmNoUGFuZWxTZXR0aW5nc1NvdXJjZSA9IG5ldyBTdWJqZWN0PFNlYXJjaFBhbmVsU2V0dGluZ3M+KCk7XG4gICAgcHJpdmF0ZSBfYWxsU2VhcmNoUGFuZWxTZXR0aW5nc1NvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2VhcmNoUGFuZWxTZXR0aW5nc1tdPihbXSk7XG4gICAgcHJpdmF0ZSBfb3BlblNlYXJjaFBhbmVsSGlkZGVuU2V0dGluZ3NTb3VyY2UgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByaXZhdGUgX29wZW5TZWFyY2hGaWxlc01hbmFnZVNvdXJjZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgcHJpdmF0ZSBfc2VhcmNoUGFuZWxNb0NoYW5nZWRTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgICBwcml2YXRlIF9uZXdJbmxpbmVFZGl0TW9Tb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1ldGFvYmplY3REYXRhTW9kZWwgfCBudWxsPihudWxsKTtcbiAgICBwcml2YXRlIF9oaWRlU2VhcmNoYXBhbmVsU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgcHJpdmF0ZSBfd29ya2Zsb3dTaGFyZUJ1dHRvbnM6IFNoYXJlQnV0dG9uc0Nob2ljZURlZltdID0gW107XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9iYmJQaXBlOiBCYmJUcmFuc2xhdGVQaXBlLCBwcml2YXRlIF9hcGlTZXJ2aWNlOiBBcGlTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuY29udGV4dCQgPSB0aGlzLl9jb250ZXh0U291cmNlXG4gICAgICAgICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgICB0YXAoKGNvbnRleHQpID0+ICh0aGlzLmNvbnRleHQgPSBjb250ZXh0KSksXG4gICAgICAgICAgICAgICAgdGFwKChjb250ZXh0KSA9PiB0aGlzLl9pbml0aWFsaXplKGNvbnRleHQpKSxcbiAgICAgICAgICAgICAgICB0YXAoKGNvbnRleHQpID0+IHRoaXMuX2FkZEV2ZW50TGlzdGVuZXIoY29udGV4dCkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMubmV3SW5saW5lRWRpdE1vJCA9IHRoaXMuX25ld0lubGluZUVkaXRNb1NvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSk7XG4gICAgICAgIHRoaXMudmlld2VyJCA9IHRoaXMuX3ZpZXdlckNvbnRyb2xTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpO1xuICAgICAgICB0aGlzLmNvbmRpdGlvbmFsRm9ybWF0cyQgPSB0aGlzLl9jb25kaXRpb25hbEZvcm1hdHNTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpO1xuICAgICAgICB0aGlzLmhpZGVUb29sYmFyJCA9IHRoaXMuX2hpZGVUb29sYmFyU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKTtcbiAgICAgICAgdGhpcy5tYXNrJCA9IHRoaXMuX21hc2tTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpO1xuICAgICAgICB0aGlzLnZpd2VyTWFzayQgPSB0aGlzLl92aWV3ZXJNYXNrU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKTtcbiAgICAgICAgdGhpcy52aXNpYmxlJCA9IHRoaXMuX3Zpc2libGVTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpO1xuICAgICAgICB0aGlzLmVuYWJsZSQgPSB0aGlzLl9lbmFibGVTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpO1xuICAgICAgICB0aGlzLnJlYWRvbmx5JCA9IHRoaXMuX3JlYWRvbmx5U291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKTtcbiAgICAgICAgdGhpcy5oaWRlVWx2UGFnZVRpdGxlJCA9IHRoaXMuX2hpZGVVbHZQYWdlVGl0bGUkLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKTtcbiAgICAgICAgdGhpcy51aVZpZXdlclNlbGVjdG9yJCA9IHRoaXMuX3NldFVpVmlld2VyU2VsZWN0b3IkLmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICB0aGlzLm1lbnVJdGVtcyQgPSB0aGlzLl9tZW51SXRlbXNTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZShcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSxcbiAgICAgICAgICAgIGZpbHRlcigoaXRlbXMpID0+IGl0ZW1zPy5sZW5ndGggPiAwKSxcbiAgICAgICAgICAgIG1hcCgoaXRlbXMpID0+IGl0ZW1zLmZpbHRlcigoYykgPT4gYy5pdGVtSWQgIT09ICdFeHBvcnRUb0V4Y2VsJyAmJiBjLml0ZW1JZCAhPT0gJ0RlbGV0ZScpKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnRpdGxlJCA9IHRoaXMuX3RpdGxlU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKTtcblxuICAgICAgICB0aGlzLnNlYXJjaFBhbmVsVWkkID0gdGhpcy5fc2VhcmNoUGFuZWxVaVNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpLFxuICAgICAgICAgICAgdGFwKChzZWFyY2hQYW5lbCkgPT4gdGhpcy5fYWRkRGVmYXVsdFNlYXJjaFBhbmVsU2V0dGluZ3Moc2VhcmNoUGFuZWwpKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLm9wZW5TZWFyY2hQYW5lbEhpZGRlblNldHRpbmdzJCA9IHRoaXMuX29wZW5TZWFyY2hQYW5lbEhpZGRlblNldHRpbmdzU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICB0aGlzLnBhZ2luZ1NldHRpbmckID0gdGhpcy5fcGFnaW5nU2V0dGluZ1NvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSk7XG4gICAgICAgIHRoaXMudG9vbGJhckJ1dHRvbnMkID0gY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgICB0aGlzLl90b29sYmFyQnV0dG9uc1dvcmtmbG93QnV0dG9ucy5hc09ic2VydmFibGUoKSxcbiAgICAgICAgICAgIHRoaXMuX3Rvb2xiYXJCdXR0b25zU291cmNlLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgIF0pLnBpcGUoXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCksXG4gICAgICAgICAgICBtYXAoKFt3ZkJ0bnMsIGNdKSA9PlxuICAgICAgICAgICAgICAgICFjXG4gICAgICAgICAgICAgICAgICAgID8gW11cbiAgICAgICAgICAgICAgICAgICAgOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLndmQnRucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uYy5tYXAoKGQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZVRleHQ6IGQuQ29tbWFuZD8uSXNCdWlsdGluICYmIGQuaXRlbUlkICE9PSAnTmV3JyA/IHRydWUgOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgbWFwKChjKSA9PlxuICAgICAgICAgICAgICAgICFjID8gW10gOiBbLi4uYy5maWx0ZXIoKGQpID0+ICFkLkNvbW1hbmQ/LklzQnVpbHRpbiksIC4uLmMuZmlsdGVyKChkKSA9PiBkLkNvbW1hbmQ/LklzQnVpbHRpbildXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgbWFwKChjKSA9PlxuICAgICAgICAgICAgICAgIGMucmVkdWNlKChhY2MsIGIpID0+IChhY2MubGVuZ3RoID4gMCAmJiBhY2NbYWNjLmxlbmd0aCAtIDFdWycwJ10gJiYgYlsnMCddID8gYWNjIDogWy4uLmFjYywgYl0pLCBbXSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JCA9IHRoaXMuX2Rlc3Ryb3lTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZSh0YXAoKCkgPT4gdGhpcy5fdW5zY3Vic2NyaWJlQ29udGV4dCgpKSk7XG4gICAgICAgIHRoaXMubW9EYXRhTGlzdCQgPSB0aGlzLm1vRGF0YUxpc3RTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZSgpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ291bnQkID0gdGhpcy5tb0RhdGFMaXN0JC5waXBlKG1hcCgoaXRlbXMpID0+IGl0ZW1zLmZpbHRlcigoZCkgPT4gZC4kSXNDaGVja2VkKS5sZW5ndGgpKTtcbiAgICAgICAgdGhpcy5yZXBvcnRJZCQgPSB0aGlzLl9yZXBvcnRTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZShtYXAoKHJlcG9ydCkgPT4gcmVwb3J0Py5JZCkpO1xuXG4gICAgICAgIHRoaXMuYWxsb3dJbmxpbmVFZGl0JCA9IHRoaXMuX2FsbG93SW5saW5lRWRpdFNvdXJjZS5hc09ic2VydmFibGUoKTtcbiAgICAgICAgdGhpcy5pbmxpbmVFZGl0TW9kZSQgPSB0aGlzLl9pbmxpbmVFZGl0TW9kZVNvdXJjZS5hc09ic2VydmFibGUoKTtcbiAgICAgICAgdGhpcy5vbmx5SW5saW5lRWRpdCQgPSB0aGlzLl9vbmx5SW5saW5lRWRpdFNvdXJjZS5hc09ic2VydmFibGUoKTtcbiAgICAgICAgdGhpcy5vcGVuU2VhcmNoRmlsZXNNYW5hZ2UkID0gdGhpcy5fb3BlblNlYXJjaEZpbGVzTWFuYWdlU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICB0aGlzLnNlYXJjaFBhbmVsTW9DaGFuZ2VkJCA9IHRoaXMuX3NlYXJjaFBhbmVsTW9DaGFuZ2VkU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gICAgICAgIHRoaXMubGF5b3V0SW5mbyQgPSB0aGlzLl9sYXlvdXRJbmZvU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuICAgICAgICB0aGlzLmFsbFNlYXJjaFBhbmVsU2V0dGluZ3MkID0gY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgICB0aGlzLl9hbGxTZWFyY2hQYW5lbFNldHRpbmdzU291cmNlLmFzT2JzZXJ2YWJsZSgpLFxuICAgICAgICAgICAgdGhpcy5fZGVmYXVsdFNlYXJjaFBhbmVsU2V0dGluZ3NTb3VyY2UuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgXSkucGlwZShcbiAgICAgICAgICAgIG1hcCgoW2FsbFNldHRpbmdzLCBkZWZhdWx0U2V0dGluZ3NdKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRTZXR0aW5ncyAmJiBhbGxTZXR0aW5ncykge1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0U2V0dGluZ3MuSXNEZWZhdWx0ID0gIWFsbFNldHRpbmdzLnNvbWUoKGMpID0+IGMuSXNEZWZhdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgYWxsU2V0dGluZ3MgPSBbZGVmYXVsdFNldHRpbmdzLCAuLi5hbGxTZXR0aW5nc107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhbGxTZXR0aW5ncztcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgZGVsYXkoMCksXG4gICAgICAgICAgICBzaGFyZVJlcGxheSgxKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5nc0lkJCA9IHRoaXMuX3NlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5nc0lkU291cmNlXG4gICAgICAgICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5ncyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTZWFyY2hQYW5lbFNldHRpbmdzSWQkLFxuICAgICAgICAgICAgdGhpcy5hbGxTZWFyY2hQYW5lbFNldHRpbmdzJFxuICAgICAgICBdKS5waXBlKFxuICAgICAgICAgICAgbWFwKChbaWQsIHNldHRpbmdzXSkgPT4gc2V0dGluZ3M/LmZpbmQoKGMpID0+IGMuSWQgPT09IGlkKSksXG4gICAgICAgICAgICBzaGFyZVJlcGxheSgxKVxuICAgICAgICApO1xuICAgIH1cbiAgICBnZXQgc2hvd0NvbnRleHRNZW51JCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nob3dDb250ZXh0TWVudVNvdXJjZS5hc09ic2VydmFibGUoKTtcbiAgICB9XG4gICAgZ2V0IGdyaWRGcmVlQ29sdW1uU2l6aW5nJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dyaWRGcmVlQ29sdW1uU2l6aW5nJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG4gICAgZ2V0IGNhblNhdmVHcmlkU2V0dGluZyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYW5TYXZlR3JpZFNldHRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cbiAgICBnZXQgaW5EaWFsb2ckKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5EaWFsb2ckLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cbiAgICBnZXQgaXNNdWx0aVNlbGVjdCQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc011bHRpU2VsZWN0JC5hc09ic2VydmFibGUoKTtcbiAgICB9XG4gICAgZ2V0IGZ1bGxzY3JlZW4kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZnVsbHNjcmVlbiQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuICAgIGdldCBjYXJ0YWJsZUNoaWxkc01vJCgpOiBPYnNlcnZhYmxlPHsgW2tleTogc3RyaW5nXTogTWV0YW9iamVjdERhdGFNb2RlbCB9IHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FydGFibGVDaGlsZHNNbyQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuICAgIGdldCBjYXJ0YWJsZVRlbXBsYXRlcyQoKTogT2JzZXJ2YWJsZTx7IFtrZXk6IHN0cmluZ106IEZvcm1TZXR0aW5nIH0gfCBudWxsPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYXJ0YWJsZVRlbXBsYXRlcyQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuICAgIGdldCBzZWFyY2hQYW5lbFVpKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWFyY2hQYW5lbFVpU291cmNlLmdldFZhbHVlKCk7XG4gICAgfVxuICAgIGdldCByZXBvcnRJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVwb3J0U291cmNlLmdldFZhbHVlKCk/LklkO1xuICAgIH1cbiAgICBnZXQgYWxsU2VhcmNoUGFuZWxTZXR0aW5ncygpOiBTZWFyY2hQYW5lbFNldHRpbmdzW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWxsU2VhcmNoUGFuZWxTZXR0aW5nc1NvdXJjZS5nZXRWYWx1ZSgpO1xuICAgIH1cbiAgICBnZXQgaGlkZVNlYXJjaHBhbmVsJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hpZGVTZWFyY2hhcGFuZWxTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcbiAgICB9XG4gICAgZ2V0IGhpZGVTZWFyY2hwYW5lbCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hpZGVTZWFyY2hhcGFuZWxTb3VyY2UuZ2V0VmFsdWUoKTtcbiAgICB9XG4gICAgc2V0VWlWaWV3ZXJDbGFzcyhzZWxlY3Rvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3NldFVpVmlld2VyU2VsZWN0b3IkLm5leHQoc2VsZWN0b3IpO1xuICAgIH1cbiAgICBoaWRlVWx2VGl0bGVQYWdlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9oaWRlVWx2UGFnZVRpdGxlJC5uZXh0KHRydWUpO1xuICAgIH1cbiAgICBzZXRDYW5TYXZlR3JpZFNldHRpbmdzKHZhbDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9jYW5TYXZlR3JpZFNldHRpbmckLm5leHQodmFsKTtcbiAgICB9XG4gICAgZXhlY3V0ZVRvb2xiYXJCdXR0b24oaXRlbUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYnV0dG9ucyA9IHRoaXMuX3Rvb2xiYXJCdXR0b25zU291cmNlLmdldFZhbHVlKCk7XG4gICAgICAgIGlmICghYnV0dG9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBidG4gPSBidXR0b25zLmZpbmQoKGMpID0+IGMuaXRlbUlkID09PSBpdGVtSWQpO1xuICAgICAgICBpZiAoYnRuKSB7XG4gICAgICAgICAgICBleGVjdXRlVWx2Q29tbWFuZEhhbmRsZXIoYnRuLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGRXb3JrZmxvd0J1dHRvbnNJblRvb2xiYXIoZTogU2hhcmVCdXR0b25zQ2hvaWNlRGVmKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFyck9mU2hhcmVCdXR0b25zID0gdGhpcy5fY3JlYXRlV29ya2Zsb3dTaGFyZUJ1dHRvbnMoZSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXJyT2ZTaGFyZUJ1dHRvbnMubWFwKChjKSA9PiAoe1xuICAgICAgICAgICAgaWNvbjogJycsXG4gICAgICAgICAgICB0ZXh0OiBjLFxuICAgICAgICAgICAgaXRlbUlkOiBjLFxuICAgICAgICAgICAgRGF0YTogbnVsbCxcbiAgICAgICAgICAgICRTaGFyZVdvcmtmbG93QnV0dG9uczogdHJ1ZSxcbiAgICAgICAgICAgIENvbW1hbmQ6IHsgX2lzVmlzaWJsZTogdHJ1ZSwgX2lzRW5hYmxlOiB0cnVlLCBKc29uRXh0cmFQcm9wOiB7IERlc2lnbjogJ2F0dGVudGlvbicgfSB9LFxuICAgICAgICAgICAgaGFuZGxlcjogKGQpID0+IHRoaXMub25Xb3JrZmxvd0J1dHRvbkluVG9vbGJhckNsaWNrKGQpLFxuICAgICAgICAgICAgSXNCdWlsdGluOiBmYWxzZVxuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMuX3Rvb2xiYXJCdXR0b25zV29ya2Zsb3dCdXR0b25zLm5leHQodmFsdWUpO1xuICAgIH1cbiAgICBfZXhjbHVkZVdyYXBwZXJGcm9tTW8obW86IE1ldGFvYmplY3REYXRhTW9kZWwpOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbiAgICAgICAgY29uc3QgeyAkV3JhcHBlciwgLi4ubmV3TW8gfSA9IG1vO1xuICAgICAgICByZXR1cm4gbmV3TW87XG4gICAgfVxuICAgIG9uV29ya2Zsb3dCdXR0b25JblRvb2xiYXJDbGljayhzaGFyZUJ1dHRvbjogeyB0ZXh0OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgICAgICBCYXJzYUFwaS5Cdy5Nc2cuT0tDYW5jZWwoJ9ii24zYpyDYp9iyINiq2KfbjNuM2K8g2YXZiNin2LHYryDaqdin2LHYqtin2KjZhCDZhdi32YXYptmGINmH2LPYqtuM2K/YnycsICfYqtin24zbjNivJywgKHJlcykgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcyA9PT0gJ29rJykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtmbG93U2hhcmVCdXR0b25zLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hvaWNlRGVmID0gYy5jaG9pY2VMaXN0LmZpbmQoKGQpID0+IGQuVGl0bGUgPT09IHNoYXJlQnV0dG9uLnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hvaWNlRGVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjLmZvcm1QYW5lbEN0cmxyLldvcmtmbG93VHJhbnNpdGlvbihjaG9pY2VEZWYsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl9zZXRXb3JrZmxvd1N0YXRlKCdGaW5pc2gnLCBbYy5tb10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLl9zZXRXb3JrZmxvd1N0YXRlKFxuICAgICAgICAgICAgICAgIC8vICAgICAnUGVuZGluZycsXG4gICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuX3dvcmtmbG93U2hhcmVCdXR0b25zLm1hcCgoYykgPT4gYy5tbylcbiAgICAgICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgICAgIC8vIGNvbnN0IHBhcmFtcyA9IHRoaXMuX3dvcmtmbG93U2hhcmVCdXR0b25zLm1hcCgoYykgPT4gKHtcbiAgICAgICAgICAgICAgICAvLyAgICAgbW86IHRoaXMuX2V4Y2x1ZGVXcmFwcGVyRnJvbU1vKGMubW8uUmVsYXRlZE1vKSxcbiAgICAgICAgICAgICAgICAvLyAgICAgY2hvaWNlRGVmOiBjLmNob2ljZUxpc3QuZmluZCgoZCkgPT4gZC5UaXRsZSA9PT0gc2hhcmVCdXR0b24udGV4dClcbiAgICAgICAgICAgICAgICAvLyB9KSk7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5fc2V0V29ya2Zsb3dTdGF0ZSgnUGVuZGluZycsIHBhcmFtcyk7XG5cbiAgICAgICAgICAgICAgICAvLyBCYXJzYUFwaS5Db21tb24uQWpheC5HZXRTZXJ2ZXJEYXRhKFxuICAgICAgICAgICAgICAgIC8vICAgICAnV29ya2Zsb3c5NC5Pbkdyb3VwT2ZDaG9pY2VEZWZzU2VsZWN0JyxcbiAgICAgICAgICAgICAgICAvLyAgICAgeyBwYXJhbWV0ZXI6IHsgRGF0YUxpc3Q6IHBhcmFtcyB9IH0sXG4gICAgICAgICAgICAgICAgLy8gICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRoaXMuX3NldFdvcmtmbG93U3RhdGUoJ1N1Y2Nlc3MnLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIC8vICAgICB9LCAvLyBzdWNjZXNzXG4gICAgICAgICAgICAgICAgLy8gICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRoaXMuX3NldFdvcmtmbG93U3RhdGUoJ0ZhaWxlZCcsIHBhcmFtcywgJ9mF2KrYp9iz2YHYp9mG2Ycg2LnZhdmE24zYp9iqINmG2KfZhdmI2YHZgiDYqNmI2K8uJyk7XG4gICAgICAgICAgICAgICAgLy8gICAgIH0sIC8vIGZhaWx1cmVcbiAgICAgICAgICAgICAgICAvLyAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpc1xuICAgICAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldFRpdGxlKHRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdGl0bGVTb3VyY2UubmV4dCh7IHRleHQ6IHRpdGxlLCBpbWFnZTogJycgfSk7XG4gICAgfVxuICAgIHRvZ2dsZUhpZGVTZWFyY2hwYW5lbCh2YWw/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2hpZGVTZWFyY2hhcGFuZWxTb3VyY2UubmV4dCh0eXBlb2YgdmFsICE9PSAndW5kZWZpbmVkJyA/IHZhbCA6ICF0aGlzLl9oaWRlU2VhcmNoYXBhbmVsU291cmNlLmdldFZhbHVlKCkpO1xuICAgIH1cbiAgICBzZXRDb250ZXh0KGNvbnRleHQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY29udGV4dFNvdXJjZS5uZXh0KGNvbnRleHQpO1xuICAgIH1cbiAgICBzZXRJbkRpYWxvZyh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faW5EaWFsb2ckLm5leHQodmFsKTtcbiAgICB9XG4gICAgc2V0SXNNdWx0aVNlbGVjdCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faXNNdWx0aVNlbGVjdCQubmV4dCh2YWwpO1xuICAgIH1cbiAgICBzZXRGdWxsc2NyZWVuKHZhbDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9mdWxsc2NyZWVuJC5uZXh0KHZhbCk7XG4gICAgfVxuXG4gICAgY3JlYXRlTmV3SW5saW5lTW8oaXNDaGVja2VkOiBib29sZWFuKTogTWV0YW9iamVjdERhdGFNb2RlbCB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGZvcm1TZXR0aW5nID0gY29udGV4dC5TZXR0aW5nLkZvcm1UZW1wbGF0ZTtcbiAgICAgICAgY29uc3QgdHlwZURlZklkID0gY29udGV4dC5TZXR0aW5nLkV4dHJhLlJlcG9ydC5UeXBlRGVmSWQ7XG4gICAgICAgIGNvbnN0IG5ld01vID0gZ2V0TmV3TW9HcmlkRWRpdG9yKGZvcm1TZXR0aW5nLCB0eXBlRGVmSWQpIGFzIE1ldGFvYmplY3REYXRhTW9kZWw7XG4gICAgICAgIG5ld01vLklkID0gZ2VucmF0ZUlubGluZU1vSWQoKTtcbiAgICAgICAgbmV3TW8uJElzQ2hlY2tlZCA9IGlzQ2hlY2tlZDtcbiAgICAgICAgbmV3TW8uJE5ld0lubGluZU1vID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ29tcG9zaXRlKGNvbnRleHQpKSB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGlvbiA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKHRoaXMuY29udGV4dC5TZXR0aW5nLCAnRXh0cmEuUmVsYXRpb24nKTtcbiAgICAgICAgICAgIG5ld01vW3JlbGF0aW9uLlBhcmVudEZkTmFtZV0gPSByZWxhdGlvbi5QYXJlbnRNb0lkO1xuICAgICAgICB9XG4gICAgICAgIC8vICB0aGlzLl9uZXdJbmxpbmVFZGl0TW9Tb3VyY2UubmV4dChuZXdNbyk7XG4gICAgICAgIHJldHVybiBuZXdNbztcbiAgICB9XG4gICAgc2V0TGF5b3V0SW5mbyhsYXlvdXRJbmZvKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2xheW91dEluZm9Tb3VyY2UubmV4dChsYXlvdXRJbmZvKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5fdW5zY3Vic2NyaWJlQ29udGV4dCgpO1xuICAgIH1cblxuICAgIHBhZ2VTaXplQ2hhbmdlZChwYWdlSW5kZXgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudCgnUGFnZUNoYW5nZScsIHRoaXMuY29udGV4dCwgcGFnZUluZGV4KTtcbiAgICB9XG5cbiAgICBwYWdlQ2hhbmdlZChwYWdlSW5kZXgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LmN1cnJlbnRQYWdlID0gcGFnZUluZGV4O1xuICAgICAgICB0aGlzLmNvbnRleHQuZmlyZUV2ZW50KCdQYWdlQ2hhbmdlJywgdGhpcy5jb250ZXh0LCBwYWdlSW5kZXgpO1xuICAgIH1cblxuICAgIHJlU2V0TW9EYXRhTGlzdChtb0RhdGFMaXN0PzogTWV0YW9iamVjdERhdGFNb2RlbFtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5ld01vRGF0YUxpc3QgPSBtb0RhdGFMaXN0ID8/IHRoaXMubW9EYXRhTGlzdFNvdXJjZS5nZXRWYWx1ZSgpO1xuICAgICAgICB0aGlzLl9tb0RhdGFMaXN0Q2hhbmdlZChbLi4ubmV3TW9EYXRhTGlzdF0pO1xuICAgICAgICBpZiAoIXRoaXMuY29udGV4dC5TZXR0aW5nPy5Jc0NhcnRhYmxlUmVwb3J0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5T2ZDYXRhYmxlVGVtcGxhdGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIG5ld01vRGF0YUxpc3QuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHBkZklkID0gYy5SZWxhdGVkTW8/LiRUeXBlRGVmSWQ7XG4gICAgICAgICAgICBpZiAodHBkZklkKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gYCR7dHBkZklkfSR7dGhpcy5fY2FydGFibGVLZXlTZXBlcmF0b3J9JHtjLkNhcnRhYmxlU2V0dGluZ3M/LklkIHx8ICcwJ31gO1xuICAgICAgICAgICAgICAgIGtleU9mQ2F0YWJsZVRlbXBsYXRlcy5hZGQoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChrZXlPZkNhdGFibGVUZW1wbGF0ZXMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRDYXJ0YWJsZVRlbXBsYXRlKGtleU9mQ2F0YWJsZVRlbXBsYXRlcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gU2VhcmNoIFNldHRpbmcgTWFuYWdlclxuICAgIGNsZWFyU2VhcmNoKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzZWFyY2hQYW5lbFVpID0gdGhpcy5zZWFyY2hQYW5lbFVpO1xuICAgICAgICBpZiAoIXNlYXJjaFBhbmVsVWkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaWVsZFVpID0gc2VhcmNoUGFuZWxVaS5fZGljdEZpZWxkVWkuJFNlYXJjaCA/PyBzZWFyY2hQYW5lbFVpLl9kaWN0RmllbGRVaS7YrNiz2KrYrNmIO1xuICAgICAgICBmaWVsZFVpLmZpcmVFdmVudCgnQ2xlYXJDbGljaycpO1xuICAgIH1cbiAgICBzZWFyY2goKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlYXJjaFBhbmVsVWkgPSB0aGlzLnNlYXJjaFBhbmVsVWk7XG4gICAgICAgIGlmICghc2VhcmNoUGFuZWxVaSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmaWVsZFVpID0gc2VhcmNoUGFuZWxVaS5fZGljdEZpZWxkVWkuJFNlYXJjaCA/PyBzZWFyY2hQYW5lbFVpLl9kaWN0RmllbGRVaS7YrNiz2KrYrNmIO1xuICAgICAgICBpZiAoIWZpZWxkVWkpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHNlYXJjaFBhbmVsVWkuX2RpY3RGaWVsZFVpKS5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IHNlYXJjaFBhbmVsVWkuX2RpY3RGaWVsZFVpW2NdO1xuICAgICAgICAgICAgICAgIGlmIChlLm9yaWdpbmFsWHR5cGUgPT09ICdVaS5TZWFyY2hDb21tYW5kSW5mb1VpJykge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZFVpID0gZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmllbGRVaSkge1xuICAgICAgICAgICAgZmllbGRVaS5maXJlRXZlbnQoJ1NlYXJjaENsaWNrJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRWYWx1ZUlubGluZUVkaXQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbmxpbmVFZGl0TW9kZVNvdXJjZS5nZXRWYWx1ZSgpO1xuICAgIH1cblxuICAgIGdldEFsbG93SW5saW5lRWRpdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FsbG93SW5saW5lRWRpdFNvdXJjZS5nZXRWYWx1ZSgpO1xuICAgIH1cbiAgICBzZXRJbmxpbmVFZGl0KHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2lubGluZUVkaXRNb2RlU291cmNlLm5leHQodmFsdWUpO1xuICAgIH1cblxuICAgIG9wZW5TZWFyY2hGaWVsZHNIaWRkZW5TZXR0aW5ncygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb3BlblNlYXJjaFBhbmVsSGlkZGVuU2V0dGluZ3NTb3VyY2UubmV4dCgpO1xuICAgIH1cblxuICAgIG9wZW5TZWFyY2hGaWxlc01hbmFnZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb3BlblNlYXJjaEZpbGVzTWFuYWdlU291cmNlLm5leHQoKTtcbiAgICB9XG5cbiAgICBzZWFyY2hQYW5lbE1vQ2hhbmdlZChjaGFuZ2U6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc2VhcmNoUGFuZWxNb0NoYW5nZWRTb3VyY2UubmV4dChjaGFuZ2UpO1xuICAgIH1cblxuICAgIGxvYWRTZWFyY2hQYW5lbFNldHRpbmdzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0LkZvcm1QYW5lbFVpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXBvcnRJZCRcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgICB0YXAoKHJlcG9ydElkKSA9PiB0aGlzLl9sb2FkU2VhcmNoUGFuZWxTZXR0aW5ncyhyZXBvcnRJZCkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgYWRkU2VhcmNoUGFuZWxTZXR0aW5ncyhzZWFyY2hQYW5lbFNldHRpbmdzOiBTZWFyY2hQYW5lbFNldHRpbmdzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFsbFNlYXJjaFBhbmVsU2V0dGluZ3MgPSB0aGlzLl9hbGxTZWFyY2hQYW5lbFNldHRpbmdzU291cmNlLmdldFZhbHVlKCk7XG4gICAgICAgIGFsbFNlYXJjaFBhbmVsU2V0dGluZ3MucHVzaChzZWFyY2hQYW5lbFNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5fYWxsU2VhcmNoUGFuZWxTZXR0aW5nc1NvdXJjZS5uZXh0KGFsbFNlYXJjaFBhbmVsU2V0dGluZ3MpO1xuICAgIH1cbiAgICBzYXZlU2VhcmNoUGFuZWxTZXR0aW5nKHNlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5nczogU2VhcmNoUGFuZWxTZXR0aW5ncyk6IHZvaWQge1xuICAgICAgICBjb25zdCBzZWFyY2hNbyA9IHRoaXMuZ2V0U2VhcmNoUGFuZWxNbygpO1xuICAgICAgICBjb25zdCBmaWVsZHNTZXR0aW5nID0gdGhpcy5nZXRTZWFyY2hQYW5lbEZpZWxkc1NldHRpbmcoKTtcbiAgICAgICAgaWYgKCFzZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3MuU2VhcmNoTW8gPSBKU09OLnN0cmluZ2lmeShzZWFyY2hNbyk7XG4gICAgICAgIHNlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5ncy5GaWVsZHNTZXR0aW5nID0gSlNPTi5zdHJpbmdpZnkoZmllbGRzU2V0dGluZyk7XG4gICAgICAgIEJhcnNhQXBpLkJ3LlJ1bkJsTWV0aG9kKFxuICAgICAgICAgICAgJ1NhdmVTZWFyY2hQYW5lbFNldHRpbmdzJyxcbiAgICAgICAgICAgIG5ldyBCYXJzYUFwaS5Db21tb24uTWV0YU9iamVjdFdlYih7XG4gICAgICAgICAgICAgICAgSWQ6IHNlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5ncy5JZCxcbiAgICAgICAgICAgICAgICAkQ2FwdGlvbjogc2VsZWN0ZWRTZWFyY2hQYW5lbFNldHRpbmdzLlRpdGxlLFxuICAgICAgICAgICAgICAgIFJlcG9ydElkOiBzZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3MuUmVwb3J0Py5JZCxcbiAgICAgICAgICAgICAgICBUaXRsZTogc2VsZWN0ZWRTZWFyY2hQYW5lbFNldHRpbmdzLlRpdGxlLFxuICAgICAgICAgICAgICAgIElzRGVmYXVsdDogc2VsZWN0ZWRTZWFyY2hQYW5lbFNldHRpbmdzLklzRGVmYXVsdCxcbiAgICAgICAgICAgICAgICBJc1B1YmxpYzogc2VsZWN0ZWRTZWFyY2hQYW5lbFNldHRpbmdzLklzUHVibGljLFxuICAgICAgICAgICAgICAgIEFwcGx5QXV0b21hdGljYWxseTogc2VsZWN0ZWRTZWFyY2hQYW5lbFNldHRpbmdzLkFwcGx5QXV0b21hdGljYWxseSxcbiAgICAgICAgICAgICAgICBIaWRlU2VhcmNoUGFuZWw6IHNlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5ncy5IaWRlU2VhcmNoUGFuZWwsXG4gICAgICAgICAgICAgICAgU2VhcmNoTW86IHNlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5ncy5TZWFyY2hNbyxcbiAgICAgICAgICAgICAgICBGaWVsZHNTZXR0aW5nOiBzZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3MuRmllbGRzU2V0dGluZ1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2VhcmNoUGFuZWxNb0NoYW5nZWQoZmFsc2UpO1xuICAgIH1cblxuICAgIGFwcGx5U2VhcmNoUGFuZWxTZXR0aW5ncyhzZWFyY2hQYW5lbFNldHRpbmdzOiBTZWFyY2hQYW5lbFNldHRpbmdzIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlYXJjaFBhbmVsVWkgPSB0aGlzLnNlYXJjaFBhbmVsVWk7XG4gICAgICAgIGlmICghc2VhcmNoUGFuZWxTZXR0aW5ncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9maXJzdEFwcGx5QXV0b21hdGljYWxseSAmJiBzZWFyY2hQYW5lbFNldHRpbmdzLklzUHJpbWFyeSkge1xuICAgICAgICAgICAgdGhpcy5fZmlyc3RBcHBseUF1dG9tYXRpY2FsbHkgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9maXJzdEFwcGx5QXV0b21hdGljYWxseSA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMucmVzZXRTZWFyY2hQYW5lbFNldHRpbmdzKHNlYXJjaFBhbmVsVWkpO1xuICAgICAgICBpZiAoc2VhcmNoUGFuZWxTZXR0aW5ncy5TZWFyY2hNbykge1xuICAgICAgICAgICAgY29uc3Qgc2VhcmNoTW8gPSBKU09OLnBhcnNlKHNlYXJjaFBhbmVsU2V0dGluZ3MuU2VhcmNoTW8pO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoc2VhcmNoTW8pLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IHNlYXJjaFBhbmVsVWkuX2RpY3RGaWVsZFVpW2NdO1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZCAmJiBjLmluZGV4T2YoJyQnKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuU2V0VmFsdWUoc2VhcmNoTW9bY10pO1xuICAgICAgICAgICAgICAgICAgICBzZWFyY2hQYW5lbFVpLk1vLlNldEZWYWx1ZShjLCBzZWFyY2hNb1tjXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoc2VhcmNoUGFuZWxTZXR0aW5ncy5Jc1ByaW1hcnkgJiYgIXNlYXJjaFBhbmVsVWkuU2V0dGluZy5JbW1lZGlhdGVFeGVjdXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hQYW5lbE1vQ2hhbmdlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlYXJjaFBhbmVsU2V0dGluZ3MuQXBwbHlBdXRvbWF0aWNhbGx5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2goKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPIHNldCBoaWRkZW4gZmllbGRzXG4gICAgICAgIGlmIChzZWFyY2hQYW5lbFNldHRpbmdzLkZpZWxkc1NldHRpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShzZWFyY2hQYW5lbFNldHRpbmdzLkZpZWxkc1NldHRpbmcpO1xuICAgICAgICAgICAgdGhpcy5zZXRBbmRBcHBseVNlYXJjaFBhbmVsU2V0dGluZ0ZpZWxkc1NldHRpbmcoXG4gICAgICAgICAgICAgICAgdHlwZW9mIHNldHRpbmdzID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2Uoc2V0dGluZ3MpIDogc2V0dGluZ3NcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWFyY2hQYW5lbE1vQ2hhbmdlZChmYWxzZSk7XG4gICAgfVxuICAgIGdldFNlYXJjaFBhbmVsTW8oKTogTWV0YW9iamVjdERhdGFNb2RlbCB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlYXJjaFBhbmVsVWkuTW87XG4gICAgfVxuICAgIGdldFNlYXJjaFBhbmVsRmllbGRzU2V0dGluZygpOiBBcnJheTxQYXJ0aWFsPEdlbmVyYWxDb250cm9sSW5mb01vZGVsPj4ge1xuICAgICAgICBjb25zdCBzZWFyY2hQYW5lbFVpID0gdGhpcy5zZWFyY2hQYW5lbFVpO1xuICAgICAgICBjb25zdCBmaWVsZHM6IEFycmF5PEdlbmVyYWxDb250cm9sSW5mb01vZGVsPiA9IHNlYXJjaFBhbmVsVWkuU2V0dGluZy5WaWV3LkNvbnRyb2xJbmZvLmZpbHRlcihcbiAgICAgICAgICAgIChjKSA9PiBjLkNvbnRyb2xOYW1lICE9PSAnJFNlYXJjaCcgJiYgYy5Db250cm9sTmFtZSAhPT0gJ9is2LPYqtis2YgnXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGZpZWxkc1NldHRpbmcgPSBmaWVsZHMubWFwKChjKSA9PiAoe1xuICAgICAgICAgICAgTmFtZTogYy5Db250cm9sTmFtZSxcbiAgICAgICAgICAgIENhcHRpb246IGMuQ29udHJvbEZpZWxkQ2FwdGlvblRyYW5zbGF0ZWQsXG4gICAgICAgICAgICBIaWRkZW46IHNlYXJjaFBhbmVsVWkuX2RpY3RGaWVsZFVpW2MuQ29udHJvbE5hbWVdLlNldHRpbmcuSXNWaXNpYmxlID09PSBmYWxzZSA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgICAgIElzTWFuZGF0b3J5OiBjLklzTWFuZGF0b3J5XG4gICAgICAgIH0pKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkc1NldHRpbmc7XG4gICAgfVxuICAgIHNldEFuZEFwcGx5U2VhcmNoUGFuZWxTZXR0aW5nRmllbGRzU2V0dGluZyhmaWVsZHNTZXR0aW5nOiBDb2x1bW5JbmZvVHlwZVtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlYXJjaFBhbmVsVWkgPSB0aGlzLnNlYXJjaFBhbmVsVWk7XG4gICAgICAgIGZpZWxkc1NldHRpbmcuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBzZWFyY2hQYW5lbFVpLl9kaWN0RmllbGRVaVtjLk5hbWVdO1xuICAgICAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgICAgICAgc2VhcmNoUGFuZWxVaS5maXJlRXZlbnQoJ0NoYW5nZUZpZWxkVmlzaWJsZScsIGZpZWxkLlNldHRpbmcuQ29udHJvbEZpZWxkQ2FwdGlvbiwgIWMuSGlkZGVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVwZGF0ZVNlYXJjaFBhbmVsU2V0dGluZ3MoYWxsU2VhcmNoUGFuZWxTZXR0aW5nczogU2VhcmNoUGFuZWxTZXR0aW5nc1tdKTogdm9pZCB7XG4gICAgICAgIGFsbFNlYXJjaFBhbmVsU2V0dGluZ3MgPSBhbGxTZWFyY2hQYW5lbFNldHRpbmdzLmZpbHRlcigoYykgPT4gIWMuSXNQcmltYXJ5ICYmICFjLklzRGVsZXRlZCk7XG4gICAgICAgIHRoaXMuX2FsbFNlYXJjaFBhbmVsU2V0dGluZ3NTb3VyY2UubmV4dChhbGxTZWFyY2hQYW5lbFNldHRpbmdzKTtcbiAgICB9XG5cbiAgICByZW1vdmVTZWFyY2hQYW5lbFNldHRpbmdzKHNlYXJjaFBhbmVsU2V0dGluZ3NJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFsbFNlYXJjaFBhbmVsU2V0dGluZ3MgPSB0aGlzLl9hbGxTZWFyY2hQYW5lbFNldHRpbmdzU291cmNlLmdldFZhbHVlKCk7XG4gICAgICAgIGFsbFNlYXJjaFBhbmVsU2V0dGluZ3MuZmlsdGVyKChjKSA9PiBjLklkICE9PSBzZWFyY2hQYW5lbFNldHRpbmdzSWQpO1xuICAgICAgICB0aGlzLl9hbGxTZWFyY2hQYW5lbFNldHRpbmdzU291cmNlLm5leHQoYWxsU2VhcmNoUGFuZWxTZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgY2hhbmdlU2VsZWN0ZWRTZWFyY2hQYW5lbChzZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3NJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5nc0lkU291cmNlLm5leHQoc2VsZWN0ZWRTZWFyY2hQYW5lbFNldHRpbmdzSWQpO1xuICAgIH1cblxuICAgIGxvYWRNZXRhQ29uZGl0aW9uc0NvbnRyb2xJbmZvcyh0eXBlRGVmSWQ6IHN0cmluZywgZmllbGREYk5hbWVzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8R2VuZXJhbENvbnRyb2xJbmZvTW9kZWxbXT4ge1xuICAgICAgICBjb25zdCBtbyA9IEdldERlZmF1bHRNb09iamVjdEluZm8odHlwZURlZklkKTtcbiAgICAgICAgcmV0dXJuIG9mKHRoaXMuX2NvbnRyb2xJbmZvc01ldGFvYmplY3QpLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKGNvbnRyb2xzSW5mbykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sc0luZm8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YoY29udHJvbHNJbmZvKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldENvbnRyb2xMaXN0KG1vLCBmaWVsZERiTmFtZXMsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGFwKChjb250cm9sc0luZm86IEdlbmVyYWxDb250cm9sSW5mb01vZGVsW10pID0+ICh0aGlzLl9jb250cm9sSW5mb3NNZXRhb2JqZWN0ID0gY29udHJvbHNJbmZvKSlcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIF9jcmVhdGVXb3JrZmxvd1NoYXJlQnV0dG9ucyhlOiBTaGFyZUJ1dHRvbnNDaG9pY2VEZWYpOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCBzaGFyZUJ1dHRvbnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChlLmFkZCkge1xuICAgICAgICAgICAgdGhpcy5fd29ya2Zsb3dTaGFyZUJ1dHRvbnMucHVzaChlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtmbG93U2hhcmVCdXR0b25zID0gdGhpcy5fd29ya2Zsb3dTaGFyZUJ1dHRvbnMuZmlsdGVyKChjKSA9PiBjLm1vLklkICE9PSBlLm1vLklkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX3dvcmtmbG93U2hhcmVCdXR0b25zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRoaXMuX3dvcmtmbG93U2hhcmVCdXR0b25zID0gdGhpcy5fd29ya2Zsb3dTaGFyZUJ1dHRvbnMuZmlsdGVyKChjKSA9PiBjLm1vPy4kSXNDaGVja2VkKTtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtmbG93U2hhcmVCdXR0b25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNoYXJlQnV0dG9ucyA9IHRoaXMuX3dvcmtmbG93U2hhcmVCdXR0b25zWzBdLmNob2ljZUxpc3QubWFwKChkKSA9PiBkLlRpdGxlKTtcbiAgICAgICAgICAgIGNvbnN0IHVuU2hhcmVCdXR0b25zOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLl93b3JrZmxvd1NoYXJlQnV0dG9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl93b3JrZmxvd1NoYXJlQnV0dG9uc1tpXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNoYXJlQnV0dG9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5jaG9pY2VMaXN0Lm1hcCgoZCkgPT4gZC5UaXRsZSkuaW5kZXhPZihzaGFyZUJ1dHRvbnNbal0pIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5TaGFyZUJ1dHRvbnMucHVzaChzaGFyZUJ1dHRvbnNbal0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2hhcmVCdXR0b25zID0gc2hhcmVCdXR0b25zLmZpbHRlcigoYykgPT4gdW5TaGFyZUJ1dHRvbnMuaW5kZXhPZihjKSA9PT0gLTEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaGFyZUJ1dHRvbnM7XG4gICAgfVxuICAgIHByb3RlY3RlZCBfaW5pdENyZWF0ZU5ld0lubGluZU1vKGNvbnRleHQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZm9ybVNldHRpbmcgPSBjb250ZXh0LlNldHRpbmcuRm9ybVRlbXBsYXRlO1xuICAgICAgICBpZiAoZm9ybVNldHRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlTmV3SW5saW5lTW8oZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9pc0NvbXBvc2l0ZShjb250ZXh0KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uVHlwZSA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKGNvbnRleHQuU2V0dGluZywgJ0V4dHJhLlJlbGF0aW9uLlJlbGF0aW9uVHlwZScpO1xuICAgICAgICByZXR1cm4gcmVsYXRpb25UeXBlID09PSBCYXJzYUFwaS5Db21tb24uRW51bXMuUmVsYXRpb25UeXBlLkNvbXBvc2l0aW9uO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgX2FkZEV2ZW50TGlzdGVuZXIoY29udGV4dDogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnRleHQub24oe1xuICAgICAgICAgICAgc2NvcGU6IHRoaXMsXG4gICAgICAgICAgICBTaG93Q29udGV4dE1lbnU6IHRoaXMuX3Nob3dDb250ZXh0TWVudSxcbiAgICAgICAgICAgIE1hc2tDaGFuZ2VkOiB0aGlzLl9tYXNrQ2hhbmdlZCxcbiAgICAgICAgICAgIFZpZXdlck1hc2tDaGFuZ2VkOiB0aGlzLl92aWV3ZXJNYXNrQ2hhbmdlZCxcbiAgICAgICAgICAgIFZpZXdlckNvbnRyb2xDaGFuZ2VkOiB0aGlzLl92aWV3ZXJDb250cm9sQ2hhbmdlZCxcbiAgICAgICAgICAgIFZpc2libGVDaGFuZ2VkOiB0aGlzLl92aXNpYmxlQ2hhbmdlZCxcbiAgICAgICAgICAgIFJlYWRvbmx5Q2hhbmdlZDogdGhpcy5fcmVhZG9ubHlDaGFuZ2VkLFxuICAgICAgICAgICAgTWVudUl0ZW1zQ2hhbmdlZDogdGhpcy5fbWVudUl0ZW1zQ2hhbmdlZCxcbiAgICAgICAgICAgIFRpdGxlQ2hhbmdlZDogdGhpcy5fdGl0bGVDaGFuZ2VkLFxuICAgICAgICAgICAgU2VhcmNoUGFuZWxDaGFuZ2VkOiB0aGlzLl9zZWFyY2hQYW5lbENoYW5nZWQsXG4gICAgICAgICAgICBQYWdpbmdTZXR0aW5nQ2hhbmdlZDogdGhpcy5fcGFnaW5nU2V0dGluZ0NoYW5nZWQsXG4gICAgICAgICAgICBUb29sYmFyQnV0dG9uc0NoYW5nZWQ6IHRoaXMuX3Rvb2xiYXJCdXR0b25zQ2hhbmdlZCxcbiAgICAgICAgICAgIEVuYWJsZUNoYW5nZWQ6IHRoaXMuX2VuYWJsZUNoYW5nZWQsXG4gICAgICAgICAgICBEZXN0cm95OiB0aGlzLl9kZXN0cm95Q2hhbmdlZCxcbiAgICAgICAgICAgIEV4aXRJbmxpbmVFZGl0OiB0aGlzLl9leGlzdElubGluZUVkaXRcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9pbml0aWFsaXplKGNvbnRleHQ6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9pbml0Q2FydGFibGVzRm9ybVRlbXBsYXRlKGNvbnRleHQpO1xuICAgICAgICB0aGlzLl9pbml0Q29uZGl0aW9uYWxGb3JtYXRzKGNvbnRleHQpO1xuICAgICAgICB0aGlzLl9pbml0QWxsb3dJbmxpbmVFZGl0KGNvbnRleHQpO1xuICAgICAgICB0aGlzLl9pbml0T25seUlubGluZUVkaXQoY29udGV4dCk7XG4gICAgICAgIHRoaXMuX2luaXRJbmxpbmVFZGl0TW9kZShjb250ZXh0KTtcbiAgICAgICAgdGhpcy5faW5pdFJlcG9ydChjb250ZXh0KTtcbiAgICAgICAgdGhpcy5faW5pdFZpZXdlckNvbnRyb2woY29udGV4dCk7XG4gICAgICAgIHRoaXMuX2luaXRIaWRlVG9vbGJhcihjb250ZXh0KTtcbiAgICAgICAgdGhpcy5faW5pdFRvb2xiYXJCdXR0b25zKGNvbnRleHQpO1xuICAgICAgICB0aGlzLl9pbml0VmlzaWJsZShjb250ZXh0KTtcbiAgICAgICAgdGhpcy5faW5pdEVuYWJsZShjb250ZXh0KTtcbiAgICAgICAgdGhpcy5faW5pdFRpdGxlKGNvbnRleHQpO1xuICAgICAgICB0aGlzLl9pbml0UmVhZG9ubHkoY29udGV4dCk7XG4gICAgICAgIHRoaXMuX2luaXRNb0RhdGFMaXN0KGNvbnRleHQpO1xuICAgICAgICB0aGlzLl9pbml0UGFnaW5nU2V0dGluZyhjb250ZXh0KTtcbiAgICAgICAgdGhpcy5faW5pdE1lbnVJdGVtcyhjb250ZXh0KTtcbiAgICAgICAgdGhpcy5faW5pdFNlYXJjaHBhbmVsKGNvbnRleHQpO1xuICAgICAgICB0aGlzLl9pbml0Q3JlYXRlTmV3SW5saW5lTW8oY29udGV4dCk7XG4gICAgICAgIHRoaXMuX2luaXRHcmlkRnJlZUNvbHVtblNpemluZyhjb250ZXh0KTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIF9pbml0R3JpZEZyZWVDb2x1bW5TaXppbmcoY29udGV4dCk6IHZvaWQge1xuICAgICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0LlNldHRpbmcuVmlldz8uR3JpZF9GcmVlQ29sdW1uU2l6aW5nKSB7XG4gICAgICAgICAgICB0aGlzLl9ncmlkRnJlZUNvbHVtblNpemluZyQubmV4dChjb250ZXh0LlNldHRpbmcuVmlldz8uR3JpZF9GcmVlQ29sdW1uU2l6aW5nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgX2luaXRDYXJ0YWJsZXNGb3JtVGVtcGxhdGUoY29udGV4dCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjYXJ0YWJsZVRlbXBsYXRlcyA9IGNvbnRleHQuU2V0dGluZy5DYXJ0YWJsZVRlbXBsYXRlcztcbiAgICAgICAgaWYgKGNhcnRhYmxlVGVtcGxhdGVzKSB7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoY2FydGFibGVUZW1wbGF0ZXMpO1xuICAgICAgICAgICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhcnRhYmxlVGVtcGxhdGVzW2tleV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhcnRhYmxlVGVtcGxhdGVzW2tleV0gPSBCYXJzYUFwaS5FeHQuZGVjb2RlKGNhcnRhYmxlVGVtcGxhdGVzW2tleV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fY2FydGFibGVUZW1wbGF0ZXMkLm5leHQoY2FydGFibGVUZW1wbGF0ZXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhcnRhYmxlQ2hpbGRzTW8oY29udGV4dCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBfaW5pdFNlYXJjaHBhbmVsKGNvbnRleHQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5fc2VhcmNoUGFuZWxDb250cm9sKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWFyY2hQYW5lbENoYW5nZWQoY29udGV4dC5fc2VhcmNoUGFuZWxDb250cm9sKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBfaW5pdENvbmRpdGlvbmFsRm9ybWF0cyhjb250ZXh0KTogdm9pZCB7XG4gICAgICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQuU2V0dGluZy5WaWV3Py5Db25kaXRpb25hbEZvcm1hdHMpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbmRpdGlvbmFsRm9ybWF0c0NoYW5nZWQoY29udGV4dC5TZXR0aW5nLlZpZXc/LkNvbmRpdGlvbmFsRm9ybWF0cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2luaXRNZW51SXRlbXMoY29udGV4dCk6IHZvaWQge1xuICAgICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0Lm1lbnVJdGVtcykge1xuICAgICAgICAgICAgLy8gY29uc3QgbmV3SXRlbXMgPSBjb250ZXh0Lm1lbnVJdGVtcztcbiAgICAgICAgICAgIHRoaXMuX21lbnVJdGVtc0NoYW5nZWQoY29udGV4dC5tZW51SXRlbXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9pbml0UmVwb3J0KGNvbnRleHQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVwb3J0ID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoY29udGV4dCwgJ1NldHRpbmcuRXh0cmEuUmVwb3J0JywgW10pO1xuICAgICAgICB0aGlzLl9yZXBvcnRTb3VyY2UubmV4dChyZXBvcnQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfaW5pdE1vRGF0YUxpc3QoY29udGV4dCk6IHZvaWQge1xuICAgICAgICBjb25zdCBtb0RhdGFMaXN0ID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoY29udGV4dCwgJ1NldHRpbmcuRGF0YS5Nb0RhdGFMaXN0JywgW10pO1xuICAgICAgICB0aGlzLl9tb0RhdGFMaXN0Q2hhbmdlZChtb0RhdGFMaXN0KTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIF9jYXJ0YWJsZUNoaWxkc01vKGNvbnRleHQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNvbnRleHQuU2V0dGluZy5DYXJ0YWJsZUNoaWxkc01vKSB7XG4gICAgICAgICAgICB0aGlzLl9jYXJ0YWJsZUNoaWxkc01vJC5uZXh0KGNvbnRleHQuU2V0dGluZy5DYXJ0YWJsZUNoaWxkc01vKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBfaW5pdFBhZ2luZ1NldHRpbmcoY29udGV4dCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYWdpbmdTZXR0aW5nID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoY29udGV4dCwgJ1NldHRpbmcuRGF0YS5QYWdpbmcnLCBudWxsKTtcbiAgICAgICAgdGhpcy5fcGFnaW5nU2V0dGluZ0NoYW5nZWQocGFnaW5nU2V0dGluZyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9pbml0VGl0bGUoY29udGV4dCk6IHZvaWQge1xuICAgICAgICBsZXQgdGl0bGUgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZShjb250ZXh0LCAndGl0bGUnLCBudWxsKTtcbiAgICAgICAgaWYgKHRpdGxlID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aXRsZSA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKGNvbnRleHQsICdTZXR0aW5nLkV4dHJhLlJlcG9ydC5DYXB0aW9uJywgJycpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RpdGxlQ2hhbmdlZCh7IHRleHQ6IHRpdGxlLCBpbWFnZTogJycgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9pbml0UmVhZG9ubHkoY29udGV4dCk6IHZvaWQge1xuICAgICAgICBjb25zdCByZWFkb25seSA9IGNvbnRleHQucmVhZG9ubHkgPT09IHRydWUgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIHRoaXMuX3JlYWRvbmx5Q2hhbmdlZChyZWFkb25seSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9pbml0RW5hYmxlKGNvbnRleHQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZW5hYmxlID0gY29udGV4dC5lbmFibGUgPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlO1xuICAgICAgICB0aGlzLl9lbmFibGVDaGFuZ2VkKGVuYWJsZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9pbml0VmlzaWJsZShjb250ZXh0KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZpc2libGUgPSBjb250ZXh0LlNldHRpbmcuSXNWaXNpYmxlID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgdGhpcy5fdmlzaWJsZUNoYW5nZWQodmlzaWJsZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9pbml0VG9vbGJhckJ1dHRvbnMoY29udGV4dCk6IHZvaWQge1xuICAgICAgICBjb25zdCBidXR0b25zID0gY29udGV4dC50bGJCdXR0b25zO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShidXR0b25zKSkge1xuICAgICAgICAgICAgdGhpcy5fdG9vbGJhckJ1dHRvbnNDaGFuZ2VkKGJ1dHRvbnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9pbml0SW5saW5lRWRpdE1vZGUoY29udGV4dCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbmxpbmVFZGl0TW9kZTogYm9vbGVhbiA9IGNvbnRleHQuU2V0dGluZz8uVmlldz8uQXV0b0lubGluZUVkaXQ7XG4gICAgICAgIHRoaXMuX2lubGluZUVkaXRNb2RlU291cmNlLm5leHQoaW5saW5lRWRpdE1vZGUpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfaW5pdEFsbG93SW5saW5lRWRpdChjb250ZXh0KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFsbG93SW5saW5lRWRpdDogYm9vbGVhbiA9IGNvbnRleHQuU2V0dGluZz8uVmlldz8uQWxsb3dJbmxpbmVFZGl0O1xuICAgICAgICBjb25zdCBhbGxvd0VkaXQgPSBjb250ZXh0LlNldHRpbmcuRXh0cmE/LkRlZmF1bHRDb21tYW5kc0FjY2Vzcz8uRWRpdDtcbiAgICAgICAgdGhpcy5fYWxsb3dJbmxpbmVFZGl0U291cmNlLm5leHQoYWxsb3dJbmxpbmVFZGl0ICYmIGFsbG93RWRpdCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9pbml0T25seUlubGluZUVkaXQoY29udGV4dCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvbmx5SW5saW5lRWRpdDogYm9vbGVhbiA9IGNvbnRleHQuU2V0dGluZz8uVmlldz8uT25seUlubGluZUVkaXQ7XG4gICAgICAgIHRoaXMuX29ubHlJbmxpbmVFZGl0U291cmNlLm5leHQob25seUlubGluZUVkaXQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfaW5pdFZpZXdlckNvbnRyb2woY29udGV4dCk6IHZvaWQge1xuICAgICAgICBjb25zdCB2aWV3ZXJDb250cm9sID0gY29udGV4dC52aWV3ZXJDb250cm9sO1xuICAgICAgICBpZiAodmlld2VyQ29udHJvbCkge1xuICAgICAgICAgICAgdGhpcy5fdmlld2VyQ29udHJvbENoYW5nZWQodmlld2VyQ29udHJvbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2luaXRIaWRlVG9vbGJhcihjb250ZXh0KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGhpZGVUb29sYmFyID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoY29udGV4dCwgJ1NldHRpbmcuRXh0cmEuUmVwb3J0LkhpZGVUb29sYmFyJywgZmFsc2UpO1xuICAgICAgICB0aGlzLl9oaWRlVG9vbGJhclNvdXJjZS5uZXh0KGhpZGVUb29sYmFyKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3Vuc2N1YnNjcmliZUNvbnRleHQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29udGV4dC51bignU2hvd0NvbnRleHRNZW51JywgdGhpcy5fc2hvd0NvbnRleHRNZW51KTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnVuKCdNYXNrQ2hhbmdlZCcsIHRoaXMuX21hc2tDaGFuZ2VkKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnVuKCdWaWV3ZXJDb250cm9sQ2hhbmdlZCcsIHRoaXMuX3ZpZXdlckNvbnRyb2xDaGFuZ2VkKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnVuKCdWaWV3ZXJNYXNrQ2hhbmdlZCcsIHRoaXMuX3ZpZXdlck1hc2tDaGFuZ2VkKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnVuKCdWaXNpYmxlQ2hhbmdlZCcsIHRoaXMuX3Zpc2libGVDaGFuZ2VkKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnVuKCdSZWFkb25seUNoYW5nZWQnLCB0aGlzLl9yZWFkb25seUNoYW5nZWQpO1xuICAgICAgICB0aGlzLmNvbnRleHQudW4oJ01lbnVJdGVtc0NoYW5nZWQnLCB0aGlzLl9tZW51SXRlbXNDaGFuZ2VkKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnVuKCdUaXRsZUNoYW5nZWQnLCB0aGlzLl90aXRsZUNoYW5nZWQpO1xuICAgICAgICB0aGlzLmNvbnRleHQudW4oJ1BhZ2luZ1NldHRpbmdDaGFuZ2VkJywgdGhpcy5fcGFnaW5nU2V0dGluZ0NoYW5nZWQpO1xuICAgICAgICB0aGlzLmNvbnRleHQudW4oJ1Rvb2xiYXJCdXR0b25zQ2hhbmdlZCcsIHRoaXMuX3Rvb2xiYXJCdXR0b25zQ2hhbmdlZCk7XG4gICAgICAgIHRoaXMuY29udGV4dC51bignRW5hYmxlQ2hhbmdlZCcsIHRoaXMuX2VuYWJsZUNoYW5nZWQpO1xuICAgICAgICB0aGlzLmNvbnRleHQudW4oJ0Rlc3Ryb3knLCB0aGlzLl9kZXN0cm95Q2hhbmdlZCk7XG4gICAgICAgIHRoaXMuY29udGV4dC51bignRXhpdElubGluZUVkaXQnLCB0aGlzLl9leGlzdElubGluZUVkaXQpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgX2NvbmRpdGlvbmFsRm9ybWF0c0NoYW5nZWQoY29uZGl0aW9uYWxGb3JtYXRzOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY29uZGl0aW9uYWxGb3JtYXRzU291cmNlLm5leHQoY29uZGl0aW9uYWxGb3JtYXRzKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIF9tb0RhdGFMaXN0Q2hhbmdlZChtb0RhdGFMaXN0KTogdm9pZCB7XG4gICAgICAgIHRoaXMubW9EYXRhTGlzdFNvdXJjZS5uZXh0KG1vRGF0YUxpc3QpO1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLl9jYXJ0YWJsZUNoaWxkc01vKHRoaXMuY29udGV4dCk7XG4gICAgICAgICAgICB0aGlzLl9pbml0Q2FydGFibGVzRm9ybVRlbXBsYXRlKHRoaXMuY29udGV4dCk7XG4gICAgICAgICAgICB0aGlzLl9jaGVja0NhcnRhYmxlV29ya2Zsb3dTaGFyZUJ1dHRvbnMobW9EYXRhTGlzdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIF9jaGVja0NhcnRhYmxlV29ya2Zsb3dTaGFyZUJ1dHRvbnMobW9EYXRhTGlzdDogTWV0YW9iamVjdERhdGFNb2RlbFtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGhhc1NlbGVjdGVkID0gbW9EYXRhTGlzdC5zb21lKChjKSA9PiBjLiRJc0NoZWNrZWQpO1xuICAgICAgICBjb25zdCBtb0lkcyA9IG1vRGF0YUxpc3QubWFwKChjKSA9PiBjLklkKTtcbiAgICAgICAgdGhpcy5fd29ya2Zsb3dTaGFyZUJ1dHRvbnMgPSB0aGlzLl93b3JrZmxvd1NoYXJlQnV0dG9ucy5maWx0ZXIoKGMpID0+IG1vSWRzLmluZGV4T2YoYy5tby5JZCkgPiAtMSk7XG4gICAgICAgIGlmICghaGFzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Rvb2xiYXJCdXR0b25zV29ya2Zsb3dCdXR0b25zLm5leHQoW10pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF92aWV3ZXJDb250cm9sQ2hhbmdlZCh2aWV3ZXJDb250cm9sKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3ZpZXdlckNvbnRyb2xTb3VyY2UubmV4dCh2aWV3ZXJDb250cm9sKTtcbiAgICAgICAgdGhpcy5faW5pdENvbmRpdGlvbmFsRm9ybWF0cyh0aGlzLmNvbnRleHQpO1xuICAgICAgICB0aGlzLl9pbml0SW5saW5lRWRpdE1vZGUodGhpcy5jb250ZXh0KTtcbiAgICAgICAgdGhpcy5faW5pdEFsbG93SW5saW5lRWRpdCh0aGlzLmNvbnRleHQpO1xuICAgICAgICB0aGlzLl9pbml0T25seUlubGluZUVkaXQodGhpcy5jb250ZXh0KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX21hc2tDaGFuZ2VkKG1hc2s6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbWFza1NvdXJjZS5uZXh0KG1hc2spO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgX3Nob3dDb250ZXh0TWVudSh4eSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zaG93Q29udGV4dE1lbnVTb3VyY2UubmV4dCh4eSk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBfdmlld2VyTWFza0NoYW5nZWQodmlld2VyTWFzazogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLl92aWV3ZXJNYXNrU291cmNlLm5leHQodmlld2VyTWFzayk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9yZWFkb25seUNoYW5nZWQocmVhZG9ubHk6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcmVhZG9ubHlTb3VyY2UubmV4dChyZWFkb25seSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF92aXNpYmxlQ2hhbmdlZCh2aWV3ZXJNYXNrOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Zpc2libGVTb3VyY2UubmV4dCh2aWV3ZXJNYXNrKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIF9yZW1vdmVFeHRyYU1lbnVJdGVtcyhtZW51SXRlbXM6IE1lbnVJdGVtW10pOiBNZW51SXRlbVtdIHtcbiAgICAgICAgaWYgKCFtZW51SXRlbXMpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdJdGVtcyA9IG1lbnVJdGVtcy5maWx0ZXIoXG4gICAgICAgICAgICAoYykgPT4gYy5pdGVtSWQgIT09ICdEZWxldGUnICYmIGMuaXRlbUlkICE9PSAnQWRkVG9MaXN0JyAmJiBjLml0ZW1JZCAhPT0gJ1JlbW92ZUZyb21MaXN0J1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbmV3SXRlbXM7XG4gICAgfVxuICAgIHByb3RlY3RlZCBfbWVudUl0ZW1zQ2hhbmdlZChtZW51SXRlbXM6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5ld01lbnVJdGVtcyA9IHRoaXMuX3JlbW92ZUV4dHJhTWVudUl0ZW1zKG1lbnVJdGVtcyk7XG4gICAgICAgIHRoaXMuX21lbnVJdGVtc1NvdXJjZS5uZXh0KG5ld01lbnVJdGVtcyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF90aXRsZUNoYW5nZWQodGl0bGVPYmo6IHsgdGV4dDogc3RyaW5nOyBpbWFnZTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdGl0bGVTb3VyY2UubmV4dCh0aXRsZU9iaik7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9zZWFyY2hQYW5lbENoYW5nZWQoc2VhcmNoUGFuZWw6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zZWFyY2hQYW5lbFVpU291cmNlLm5leHQoc2VhcmNoUGFuZWwpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfcGFnaW5nU2V0dGluZ0NoYW5nZWQocGFnZWluZ1NldHRpbmc6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9wYWdpbmdTZXR0aW5nU291cmNlLm5leHQocGFnZWluZ1NldHRpbmcpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfdG9vbGJhckJ1dHRvbnNDaGFuZ2VkKGJ1dHRvbnM6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Rvb2xiYXJCdXR0b25zU291cmNlLm5leHQoYnV0dG9ucyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9lbmFibGVDaGFuZ2VkKGVuYWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9lbmFibGVTb3VyY2UubmV4dChlbmFibGUpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZGVzdHJveUNoYW5nZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2Rlc3Ryb3lTb3VyY2UubmV4dCgpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgX2V4aXN0SW5saW5lRWRpdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faW5saW5lRWRpdE1vZGVTb3VyY2UubmV4dChmYWxzZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9hZGREZWZhdWx0U2VhcmNoUGFuZWxTZXR0aW5ncyhzZWFyY2hQYW5lbDogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlYXJjaE1vID0gSlNPTi5zdHJpbmdpZnkoc2VhcmNoUGFuZWw/Lk1vID8/IG5ldyBNZXRhb2JqZWN0RGF0YU1vZGVsKCkpO1xuICAgICAgICBjb25zdCBTdGFuZGFyZFRleHQgPSB0aGlzLl9iYmJQaXBlLnRyYW5zZm9ybSgnU3RhbmRhcmQnKTtcbiAgICAgICAgY29uc3Qgc3RhbmRhcmRTZXR0aW5ncyA9IHtcbiAgICAgICAgICAgIElkOiAnJyxcbiAgICAgICAgICAgICRDYXB0aW9uOiBTdGFuZGFyZFRleHQsXG4gICAgICAgICAgICBJc1N0YW5kYXJkOiB0cnVlLFxuICAgICAgICAgICAgSXNEZWZhdWx0OiB0cnVlLFxuICAgICAgICAgICAgSXNQdWJsaWM6IHRydWUsXG4gICAgICAgICAgICBJc1ByaW1hcnk6IHRydWUsXG4gICAgICAgICAgICBBcHBseUF1dG9tYXRpY2FsbHk6IHRydWUsXG4gICAgICAgICAgICBIaWRlU2VhcmNoUGFuZWw6IGZhbHNlLFxuICAgICAgICAgICAgVGl0bGU6IFN0YW5kYXJkVGV4dCxcbiAgICAgICAgICAgIFNlYXJjaE1vOiBzZWFyY2hNbyxcbiAgICAgICAgICAgIFJlcG9ydElkOiAnJ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kZWZhdWx0U2VhcmNoUGFuZWxTZXR0aW5nc1NvdXJjZS5uZXh0KHN0YW5kYXJkU2V0dGluZ3MpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfbG9hZFNlYXJjaFBhbmVsU2V0dGluZ3MocmVwb3J0SWQpOiB2b2lkIHtcbiAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XG4gICAgICAgICAgICBQYXJhbWV0ZXJzOiBbcmVwb3J0SWRdLFxuICAgICAgICAgICAgTWV0aG9kOiAnTG9hZEFsbFVzZXJTZWFyY2hQYW5lbFNldHRpbmdzJyxcbiAgICAgICAgICAgIFN1Y2Nlc3NGbjogKGFsbFNlYXJjaFBhbmVsU2V0dGluZ3MpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhbGxTZWFyY2hQYW5lbFNldHRpbmdzKSkge1xuICAgICAgICAgICAgICAgICAgICBhbGxTZWFyY2hQYW5lbFNldHRpbmdzID0gQmFyc2FBcGkuQncuX3Vud3JhcChhbGxTZWFyY2hQYW5lbFNldHRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWxsU2VhcmNoUGFuZWxTZXR0aW5nc1NvdXJjZS5uZXh0KGFsbFNlYXJjaFBhbmVsU2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0U2VhcmNoID0gYWxsU2VhcmNoUGFuZWxTZXR0aW5ncy5maW5kKChjKSA9PiBjLklzRGVmYXVsdCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0U2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3NJZFNvdXJjZS5uZXh0KGRlZmF1bHRTZWFyY2guSWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIEZhaWxGbjogKCkgPT4ge31cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHByb3RlY3RlZCByZXNldFNlYXJjaFBhbmVsU2V0dGluZ3Moc2VhcmNoUGFuZWxVaSk6IHZvaWQge1xuICAgICAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XG4gICAgICAgIGNvbnN0IGZpZWxkVWkgPSBzZWFyY2hQYW5lbFVpLl9kaWN0RmllbGRVaTtcbiAgICAgICAgY29uc3QgY2hhbmdlZCA9IHNlYXJjaFBhbmVsVWkuTW8uR2V0Q2hhbmdlZE9iamVjdCgpO1xuICAgICAgICBPYmplY3Qua2V5cyhjaGFuZ2VkKS5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IHNlYXJjaFBhbmVsVWkuX2RpY3RGaWVsZFVpW2NdO1xuICAgICAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgICAgICAgZmllbGQuU2V0VmFsdWUobnVsbCk7XG4gICAgICAgICAgICAgICAgc2VhcmNoUGFuZWxVaS5Nby5TZXRGVmFsdWUoYywgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWFyY2hQYW5lbFVpLk1vLlNldFN0YXRlKCdOZXcnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5rZXlzKGZpZWxkVWkpLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgICAgIGlmIChjICE9PSAnJFNlYXJjaCcgJiYgZmllbGRVaVtjXS5MYXlvdXRDb250cm9sKSB7XG4gICAgICAgICAgICAgICAgc2VhcmNoUGFuZWxVaS5maXJlRXZlbnQoJ0NoYW5nZUZpZWxkVmlzaWJsZScsIGZpZWxkVWlbY10uU2V0dGluZy5Db250cm9sRmllbGRDYXB0aW9uLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBfbG9hZENhcnRhYmxlVGVtcGxhdGUoa2V5T2ZDYXJ0YWJsZVRlbXBsYXRlczogU2V0PHN0cmluZz4pOiB2b2lkIHtcbiAgICAgICAgbGV0IGNhcnRhYmxlVGVtcGxhdGVzID0gdGhpcy5fY2FydGFibGVUZW1wbGF0ZXMkLmdldFZhbHVlKCk7XG4gICAgICAgIGlmICghY2FydGFibGVUZW1wbGF0ZXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXlzOiBDYXJ0YWJsZVRlbXBsYXRlS2V5W10gPSBbXTtcblxuICAgICAgICBrZXlPZkNhcnRhYmxlVGVtcGxhdGVzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0ga2V5LnNwbGl0KHRoaXMuX2NhcnRhYmxlS2V5U2VwZXJhdG9yKTtcbiAgICAgICAgICAgIGlmICghY2FydGFibGVUZW1wbGF0ZXNba2V5XSkge1xuICAgICAgICAgICAgICAgIGtleXMucHVzaCh7IFR5cGVEZWZJZDogdmFsdWVzWzBdLCBTZXR0aW5nc0lkOiB2YWx1ZXNbMV0gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hcGlTZXJ2aWNlLkdldENhcnRhYmxlVGVtcGxhdGUoa2V5cykuc3Vic2NyaWJlKChjKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZXM6IHsgW2tleTogc3RyaW5nXTogRm9ybVNldHRpbmcgfSA9IHt9O1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoYykuZm9yRWFjaCgoY0lkKSA9PiB7XG4gICAgICAgICAgICAgICAgdGVtcGxhdGVzW2NJZF0gPSBCYXJzYUFwaS5FeHQuZGVjb2RlKGNbY0lkXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNhcnRhYmxlVGVtcGxhdGVzID0geyAuLi5jYXJ0YWJsZVRlbXBsYXRlcywgLi4udGVtcGxhdGVzIH07XG4gICAgICAgICAgICB0aGlzLl9jYXJ0YWJsZVRlbXBsYXRlcyQubmV4dChjYXJ0YWJsZVRlbXBsYXRlcyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==