barsa-novin-ray-core 2.1.1 → 2.1.3

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 (211) hide show
  1. package/fesm2022/barsa-novin-ray-core.mjs +257 -142
  2. package/fesm2022/barsa-novin-ray-core.mjs.map +1 -1
  3. package/lib/pipes/can-upload.pipe.d.ts +1 -1
  4. package/package.json +3 -5
  5. package/esm2022/barsa-novin-ray-core.mjs +0 -5
  6. package/esm2022/lib/abstract-classes/application-base.mjs +0 -24
  7. package/esm2022/lib/abstract-classes/barsa-api.mjs +0 -43
  8. package/esm2022/lib/abstract-classes/base-column-props.mjs +0 -84
  9. package/esm2022/lib/abstract-classes/base.component.mjs +0 -59
  10. package/esm2022/lib/abstract-classes/field-base.mjs +0 -232
  11. package/esm2022/lib/abstract-classes/files-validation-helper.mjs +0 -75
  12. package/esm2022/lib/abstract-classes/form-base.mjs +0 -163
  13. package/esm2022/lib/abstract-classes/form-field-report-page.component.mjs +0 -54
  14. package/esm2022/lib/abstract-classes/form-page-base.mjs +0 -129
  15. package/esm2022/lib/abstract-classes/form-page.component.mjs +0 -53
  16. package/esm2022/lib/abstract-classes/form-props.base.mjs +0 -97
  17. package/esm2022/lib/abstract-classes/form-toolbar-base.mjs +0 -56
  18. package/esm2022/lib/abstract-classes/index.mjs +0 -25
  19. package/esm2022/lib/abstract-classes/layout-item-base.mjs +0 -48
  20. package/esm2022/lib/abstract-classes/layout-panel-base.mjs +0 -63
  21. package/esm2022/lib/abstract-classes/linear-list-helper.mjs +0 -135
  22. package/esm2022/lib/abstract-classes/models.mjs +0 -184
  23. package/esm2022/lib/abstract-classes/module-with-dynamic-components.mjs +0 -2
  24. package/esm2022/lib/abstract-classes/number-base.mjs +0 -200
  25. package/esm2022/lib/abstract-classes/page-base.mjs +0 -97
  26. package/esm2022/lib/abstract-classes/page-with-form-handler-base.mjs +0 -40
  27. package/esm2022/lib/abstract-classes/report-base.mjs +0 -254
  28. package/esm2022/lib/abstract-classes/report-item-base.mjs +0 -53
  29. package/esm2022/lib/abstract-classes/report-view-base.component.mjs +0 -428
  30. package/esm2022/lib/abstract-classes/system-base.mjs +0 -24
  31. package/esm2022/lib/abstract-classes/tile-props.mjs +0 -46
  32. package/esm2022/lib/auth-guard.mjs +0 -48
  33. package/esm2022/lib/barsa-novin-ray-core-routing.module.mjs +0 -292
  34. package/esm2022/lib/barsa-novin-ray-core.module.mjs +0 -487
  35. package/esm2022/lib/base-ulv-setting.component.mjs +0 -45
  36. package/esm2022/lib/base.module.mjs +0 -28
  37. package/esm2022/lib/button-loading/button-loading.component.mjs +0 -18
  38. package/esm2022/lib/constants.mjs +0 -898
  39. package/esm2022/lib/container.component.mjs +0 -99
  40. package/esm2022/lib/controllers/base-controller.mjs +0 -30
  41. package/esm2022/lib/controllers/index.mjs +0 -5
  42. package/esm2022/lib/controllers/login-controller.mjs +0 -54
  43. package/esm2022/lib/controllers/login-verification-controller.mjs +0 -56
  44. package/esm2022/lib/controllers/models.mjs +0 -2
  45. package/esm2022/lib/custom-route-reuse-strategy.mjs +0 -32
  46. package/esm2022/lib/date-services/date-hijri.service.mjs +0 -146
  47. package/esm2022/lib/date-services/date-info.mjs +0 -2
  48. package/esm2022/lib/date-services/date-miladi.service.mjs +0 -124
  49. package/esm2022/lib/date-services/date-shamsi.service.mjs +0 -148
  50. package/esm2022/lib/date-services/date.service.mjs +0 -149
  51. package/esm2022/lib/date-services/index.mjs +0 -6
  52. package/esm2022/lib/device.mjs +0 -663
  53. package/esm2022/lib/directives/absolute-div-body.directive.mjs +0 -45
  54. package/esm2022/lib/directives/anchor-scroll.directive.mjs +0 -24
  55. package/esm2022/lib/directives/attr-rtl.directive.mjs +0 -35
  56. package/esm2022/lib/directives/base.directive.mjs +0 -55
  57. package/esm2022/lib/directives/body-click.directive.mjs +0 -35
  58. package/esm2022/lib/directives/column-resizer.directive.mjs +0 -39
  59. package/esm2022/lib/directives/copy.directive.mjs +0 -59
  60. package/esm2022/lib/directives/count-down.directive.mjs +0 -108
  61. package/esm2022/lib/directives/dynamic-command.directive.mjs +0 -42
  62. package/esm2022/lib/directives/dynamic-style.directive.mjs +0 -57
  63. package/esm2022/lib/directives/ellapsis-text.directive.mjs +0 -69
  64. package/esm2022/lib/directives/ellipsify.directive.mjs +0 -72
  65. package/esm2022/lib/directives/field-binding.directive.mjs +0 -17
  66. package/esm2022/lib/directives/fill-empty-space.mjs +0 -83
  67. package/esm2022/lib/directives/form-close.directive.mjs +0 -32
  68. package/esm2022/lib/directives/img-lazy.directive.mjs +0 -81
  69. package/esm2022/lib/directives/index.mjs +0 -35
  70. package/esm2022/lib/directives/intersection-observer.directive.mjs +0 -51
  71. package/esm2022/lib/directives/items-renderer.directive.mjs +0 -59
  72. package/esm2022/lib/directives/label-mandatory.directive.mjs +0 -48
  73. package/esm2022/lib/directives/load-external-files.directive.mjs +0 -37
  74. package/esm2022/lib/directives/mobile.directive.mjs +0 -29
  75. package/esm2022/lib/directives/nowraptext.directive.mjs +0 -26
  76. package/esm2022/lib/directives/numbers-only-input.directive.mjs +0 -26
  77. package/esm2022/lib/directives/placeHolder.directive.mjs +0 -15
  78. package/esm2022/lib/directives/prevent-default.directive.mjs +0 -20
  79. package/esm2022/lib/directives/render-ulv-paging.directive.mjs +0 -80
  80. package/esm2022/lib/directives/render-ulv-viewer.directive.mjs +0 -75
  81. package/esm2022/lib/directives/route-form-change.directive.mjs +0 -37
  82. package/esm2022/lib/directives/stop-propagation.directive.mjs +0 -20
  83. package/esm2022/lib/directives/table-resizer.directive.mjs +0 -235
  84. package/esm2022/lib/directives/ulv-command.directive.mjs +0 -42
  85. package/esm2022/lib/directives/until-inview.directive.mjs +0 -52
  86. package/esm2022/lib/directives/workflow-choice-command.directive.mjs +0 -60
  87. package/esm2022/lib/dynamic-component/base-dynamic.component.mjs +0 -96
  88. package/esm2022/lib/dynamic-component/base-form-toolbaritem-props.mjs +0 -52
  89. package/esm2022/lib/dynamic-component/base-item-content-props.mjs +0 -80
  90. package/esm2022/lib/dynamic-component/base-view-content-props.mjs +0 -20
  91. package/esm2022/lib/dynamic-component/base-view-item-props.mjs +0 -525
  92. package/esm2022/lib/dynamic-component/base-view-props.mjs +0 -162
  93. package/esm2022/lib/dynamic-component/dynamic-form-toolbar-item.component.mjs +0 -38
  94. package/esm2022/lib/dynamic-component/dynamic-form.component.mjs +0 -66
  95. package/esm2022/lib/dynamic-component/dynamic-item.component.mjs +0 -76
  96. package/esm2022/lib/dynamic-component/dynamic-layout.component.mjs +0 -63
  97. package/esm2022/lib/dynamic-component/index.mjs +0 -11
  98. package/esm2022/lib/empty-page/empty-page.component.mjs +0 -44
  99. package/esm2022/lib/empty-page-with-router-and-router-outlet/empty-page-with-router-and-router-outlet.component.mjs +0 -16
  100. package/esm2022/lib/field-ui/field-ui.component.mjs +0 -146
  101. package/esm2022/lib/form/form.component.mjs +0 -211
  102. package/esm2022/lib/form-new/form-new.component.mjs +0 -30
  103. package/esm2022/lib/form-page-routing/barsa-sap-ui-form-page-routing.module.mjs +0 -54
  104. package/esm2022/lib/form-page-routing/barsa-sap-ui-form-page.module.mjs +0 -29
  105. package/esm2022/lib/form-page-routing/constants.mjs +0 -9
  106. package/esm2022/lib/form-page-routing/index.mjs +0 -3
  107. package/esm2022/lib/from-intersection-observer.mjs +0 -53
  108. package/esm2022/lib/global-error-handler.mjs +0 -26
  109. package/esm2022/lib/injdection-tokens.mjs +0 -8
  110. package/esm2022/lib/login-enter-mobile/login-enter-mobile.component.mjs +0 -64
  111. package/esm2022/lib/login-verification/login-verification.component.mjs +0 -79
  112. package/esm2022/lib/login2/login2.component.mjs +0 -60
  113. package/esm2022/lib/modal-root.component.mjs +0 -33
  114. package/esm2022/lib/not-found/not-found.component.mjs +0 -16
  115. package/esm2022/lib/not-internet/not-internet.component.mjs +0 -21
  116. package/esm2022/lib/pipes/barsa-icon-dict.pipe.mjs +0 -19
  117. package/esm2022/lib/pipes/bbb-translate.pipe.mjs +0 -35
  118. package/esm2022/lib/pipes/can-upload.pipe.mjs +0 -30
  119. package/esm2022/lib/pipes/column-custom-component.pipe.mjs +0 -40
  120. package/esm2022/lib/pipes/column-customui.pipe.mjs +0 -32
  121. package/esm2022/lib/pipes/column-icon.pipe.mjs +0 -22
  122. package/esm2022/lib/pipes/column-value.pipe.mjs +0 -34
  123. package/esm2022/lib/pipes/combo-row-img.pipe.mjs +0 -16
  124. package/esm2022/lib/pipes/context-menu.pipe.mjs +0 -40
  125. package/esm2022/lib/pipes/control-ui.pipe.mjs +0 -31
  126. package/esm2022/lib/pipes/convert-to-style.pipe.mjs +0 -32
  127. package/esm2022/lib/pipes/date-time-to-caption.pipe.mjs +0 -34
  128. package/esm2022/lib/pipes/fileinfo-count.pipe.mjs +0 -20
  129. package/esm2022/lib/pipes/filter-columns-by-details.pipe.mjs +0 -22
  130. package/esm2022/lib/pipes/filter-string.pipe.mjs +0 -44
  131. package/esm2022/lib/pipes/filter-tab.pipe.mjs +0 -19
  132. package/esm2022/lib/pipes/filter-toolbar-control.pipe.mjs +0 -16
  133. package/esm2022/lib/pipes/filter-workflow-mobile.pipe.mjs +0 -24
  134. package/esm2022/lib/pipes/filter.pipe.mjs +0 -33
  135. package/esm2022/lib/pipes/find-column-by-db-name.pipe.mjs +0 -27
  136. package/esm2022/lib/pipes/find-preview-column.pipe.mjs +0 -19
  137. package/esm2022/lib/pipes/fiori-icon.pipe.mjs +0 -42
  138. package/esm2022/lib/pipes/groupby.pipe.mjs +0 -63
  139. package/esm2022/lib/pipes/header-facet-value.pipe.mjs +0 -22
  140. package/esm2022/lib/pipes/hide-columns-inmobile.pipe.mjs +0 -22
  141. package/esm2022/lib/pipes/index.mjs +0 -48
  142. package/esm2022/lib/pipes/list-count.pipe.mjs +0 -17
  143. package/esm2022/lib/pipes/merge-fields-to-columns.pipe.mjs +0 -42
  144. package/esm2022/lib/pipes/mo-info-ulv-data.pipe.mjs +0 -58
  145. package/esm2022/lib/pipes/mo-info-ulv-paging.pipe.mjs +0 -16
  146. package/esm2022/lib/pipes/mo-report-value-concat.pipe.mjs +0 -35
  147. package/esm2022/lib/pipes/mo-report-value.pipe.mjs +0 -17
  148. package/esm2022/lib/pipes/mo-value.pipe.mjs +0 -18
  149. package/esm2022/lib/pipes/multiple-groupby.pipe.mjs +0 -90
  150. package/esm2022/lib/pipes/numeral.pipe.mjs +0 -43
  151. package/esm2022/lib/pipes/picture-field-source.pipe.mjs +0 -22
  152. package/esm2022/lib/pipes/remove-newline.pipe.mjs +0 -20
  153. package/esm2022/lib/pipes/replace.pipe.mjs +0 -17
  154. package/esm2022/lib/pipes/reverse.pipe.mjs +0 -22
  155. package/esm2022/lib/pipes/rownumber.pipe.mjs +0 -25
  156. package/esm2022/lib/pipes/sanitize-text.pipe.mjs +0 -20
  157. package/esm2022/lib/pipes/seperator-fix.pipe.mjs +0 -23
  158. package/esm2022/lib/pipes/sort.pipe.mjs +0 -48
  159. package/esm2022/lib/pipes/th-image-icon.pipe.mjs +0 -22
  160. package/esm2022/lib/pipes/tlbButtons.pipe.mjs +0 -59
  161. package/esm2022/lib/pipes/total-summary.pipe.mjs +0 -16
  162. package/esm2022/lib/pipes/tree-item-isexpanded.pipe.mjs +0 -25
  163. package/esm2022/lib/pipes/visible-value.pipe.mjs +0 -18
  164. package/esm2022/lib/portal-page/portal-page.component.mjs +0 -23
  165. package/esm2022/lib/portal-page/portal-sidebar.component.mjs +0 -36
  166. package/esm2022/lib/redirect-home-guard.mjs +0 -51
  167. package/esm2022/lib/redirect-report-navigator-command/redirect-report-navigator-command.component.mjs +0 -12
  168. package/esm2022/lib/report-container/report-container.component.mjs +0 -63
  169. package/esm2022/lib/resizable-module/resizable.component.mjs +0 -31
  170. package/esm2022/lib/resizable-module/resizable.directive.mjs +0 -41
  171. package/esm2022/lib/resizable-module/resizable.module.mjs +0 -17
  172. package/esm2022/lib/resolvers/index.mjs +0 -6
  173. package/esm2022/lib/resolvers/portal-dynamic-page.resolver.mjs +0 -49
  174. package/esm2022/lib/resolvers/portal-form-page.resolver.mjs +0 -18
  175. package/esm2022/lib/resolvers/portal-page.resolver.mjs +0 -30
  176. package/esm2022/lib/resolvers/portal-report-page.resolver.mjs +0 -37
  177. package/esm2022/lib/resolvers/tile-group-breadcrumb.resolver.mjs +0 -30
  178. package/esm2022/lib/root-page/root-page.component.mjs +0 -21
  179. package/esm2022/lib/root-portal/root-portal.component.mjs +0 -164
  180. package/esm2022/lib/server-connection-error/server-connection-error.component.mjs +0 -19
  181. package/esm2022/lib/services/api.service.mjs +0 -63
  182. package/esm2022/lib/services/audio-recording.service.mjs +0 -95
  183. package/esm2022/lib/services/barsa-dialog.service.mjs +0 -80
  184. package/esm2022/lib/services/barsa-storage.service.mjs +0 -78
  185. package/esm2022/lib/services/breadcrumb.service.mjs +0 -64
  186. package/esm2022/lib/services/column.service.mjs +0 -20
  187. package/esm2022/lib/services/container.service.mjs +0 -69
  188. package/esm2022/lib/services/dynamic-component.service.mjs +0 -55
  189. package/esm2022/lib/services/form-panel.service.mjs +0 -380
  190. package/esm2022/lib/services/form.service.mjs +0 -14
  191. package/esm2022/lib/services/horizontal-layout.service.mjs +0 -16
  192. package/esm2022/lib/services/index.mjs +0 -29
  193. package/esm2022/lib/services/indexeddb.service.mjs +0 -34
  194. package/esm2022/lib/services/layout.service.mjs +0 -42
  195. package/esm2022/lib/services/local-storage.service.mjs +0 -32
  196. package/esm2022/lib/services/log.service.mjs +0 -50
  197. package/esm2022/lib/services/network-status.service.mjs +0 -15
  198. package/esm2022/lib/services/notification-popup.service.mjs +0 -2
  199. package/esm2022/lib/services/notification-sw.service.mjs +0 -180
  200. package/esm2022/lib/services/notification.service.mjs +0 -308
  201. package/esm2022/lib/services/portal.service.mjs +0 -929
  202. package/esm2022/lib/services/prompt-update.service.mjs +0 -56
  203. package/esm2022/lib/services/routing.service.mjs +0 -60
  204. package/esm2022/lib/services/save-scoll-position.service.mjs +0 -29
  205. package/esm2022/lib/services/service-worker-communication.service.mjs +0 -120
  206. package/esm2022/lib/services/toast.service.mjs +0 -2
  207. package/esm2022/lib/services/ui.service.mjs +0 -23
  208. package/esm2022/lib/services/ulvmain.service.mjs +0 -810
  209. package/esm2022/lib/services/upload.service.mjs +0 -161
  210. package/esm2022/lib/services/video-recording.service.mjs +0 -115
  211. package/esm2022/public-api.mjs +0 -44
@@ -1,308 +0,0 @@
1
- import { Inject, Injectable } from '@angular/core';
2
- import { BehaviorSubject } from 'rxjs';
3
- import { BarsaApi } from '../abstract-classes/barsa-api';
4
- import { NOTIFICATAION_POPUP_SERVER } from '../injdection-tokens';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "./log.service";
7
- import * as i2 from "@angular/common";
8
- import * as i3 from "../pipes/bbb-translate.pipe";
9
- import * as i4 from "@angular/platform-browser";
10
- import * as i5 from "./notification-sw.service";
11
- import * as i6 from "./portal.service";
12
- export class NotificationService {
13
- constructor(_popupService, _logService, _lowerCase, _bbbTranslate, _domSanitizer, _serviceWorkerNotification, _portalService, _ngZone) {
14
- this._popupService = _popupService;
15
- this._logService = _logService;
16
- this._lowerCase = _lowerCase;
17
- this._bbbTranslate = _bbbTranslate;
18
- this._domSanitizer = _domSanitizer;
19
- this._serviceWorkerNotification = _serviceWorkerNotification;
20
- this._portalService = _portalService;
21
- this._ngZone = _ngZone;
22
- this._notifications$ = new BehaviorSubject([]);
23
- this._notificationCount$ = new BehaviorSubject({ unread: 0, all: 0 });
24
- this._notificationUnreadCount$ = new BehaviorSubject(0);
25
- this._notificationLoading$ = new BehaviorSubject(false);
26
- this._notifiationCountLoaded$ = new BehaviorSubject(false);
27
- this.pageCount = 1;
28
- this.pageIndex = 0;
29
- this._portalService.userPortalSettings$.pipe().subscribe((userPortalSettings) => {
30
- this.userNotificationSettings = userPortalSettings['UserNotificationSetting'];
31
- });
32
- }
33
- get notificationCountLoaded$() {
34
- return this._notifiationCountLoaded$.asObservable();
35
- }
36
- get notificationCount$() {
37
- return this._notificationCount$.asObservable();
38
- }
39
- get notifications$() {
40
- return this._notifications$.asObservable().pipe();
41
- }
42
- get notificationLoading$() {
43
- return this._notificationLoading$.asObservable();
44
- }
45
- loadMore() {
46
- this.loadNotifications(this.pageIndex);
47
- }
48
- setNotificationViewed(tags) {
49
- BarsaApi.Bw.RunBlMethodAsync({
50
- Parameters: [tags],
51
- Method: 'SetNotificationViewed',
52
- SuccessFn: () => {
53
- const molistCurr = this._notifications$.getValue();
54
- const updatedUnreadMoList = molistCurr.map((c) => ({
55
- ...c,
56
- Unread: tags.indexOf(c.Tag) > -1 ? false : c.Unread
57
- }));
58
- this._notifications$.next([...updatedUnreadMoList]);
59
- this.increaseNotifcationCount(-tags.length, 0);
60
- return tags;
61
- },
62
- FailFn: (e) => {
63
- this._logService.error(e);
64
- }
65
- });
66
- }
67
- ShowNotificationRelatedMo(e) {
68
- const ee = {
69
- ...e,
70
- afterReady: (e2) => {
71
- BarsaApi.Bw.RunBlMethodAsync({
72
- Parameters: [e.tag],
73
- Method: 'Barsa_SetReadRadifCartableByTag',
74
- FailFn: (err) => {
75
- this._logService.error(err);
76
- }
77
- });
78
- }
79
- };
80
- this._portalService.ShowForm(ee);
81
- }
82
- handleTopic(eventTopic, content, ownerKey) {
83
- if (eventTopic === 'DeleteNotificationMessage') {
84
- const { Tags } = content;
85
- const notifications = this._notifications$.getValue();
86
- const { findInNotifications, unreadCount, count } = this._findNotificationsMessage(Tags, notifications);
87
- if (findInNotifications) {
88
- this._notifications$.next(notifications.filter((c) => !Tags.includes(c.Tag)));
89
- }
90
- if (unreadCount > 0) {
91
- this.increaseNotifcationCount(-unreadCount, -count);
92
- }
93
- }
94
- else if (eventTopic === 'SetReadNotificationMessage') {
95
- const notifications = this._notifications$.getValue();
96
- const { Tags } = content;
97
- Tags.forEach((tag) => {
98
- const foundIndex = notifications.findIndex((c) => c.Tag === tag);
99
- if (foundIndex > -1) {
100
- notifications[foundIndex] = {
101
- ...notifications[foundIndex],
102
- Unread: false,
103
- Unread$Caption: 'نادرست'
104
- };
105
- this._notifications$.next([...notifications]);
106
- }
107
- });
108
- const notificationsCount = this._notificationCount$.getValue();
109
- this.increaseNotifcationCount(-Tags.length, notificationsCount.all);
110
- }
111
- }
112
- _findNotificationsMessage(Tags, notifications) {
113
- let findInNotifications = false;
114
- let unreadCount = 0;
115
- let count = 0;
116
- Tags.forEach((tag) => {
117
- const foundNotification = notifications.find((c) => c.Tag === tag);
118
- if (foundNotification) {
119
- findInNotifications = true;
120
- count++;
121
- if (foundNotification.Unread) {
122
- unreadCount++;
123
- }
124
- }
125
- });
126
- return { findInNotifications, unreadCount, count };
127
- }
128
- addNotification(msg, title, type, image, mo, uiOptions, otherOptions) {
129
- this._ngZone.run(() => {
130
- if (otherOptions) {
131
- const { MoId, TypeDefId } = otherOptions;
132
- let newNotification = {
133
- $Caption: title,
134
- Id: MoId,
135
- $TypeDefId: TypeDefId,
136
- Title: title,
137
- Unread: true,
138
- Icon: image,
139
- Image: '',
140
- Content: msg,
141
- Tag: '',
142
- Priority: 0,
143
- Subject: '',
144
- $SafeContent: this._domSanitizer.bypassSecurityTrustHtml(msg),
145
- CreationDate: new Date(),
146
- CreationDate$Caption: this._bbbTranslate.transform('DateR_Today')
147
- };
148
- const parsedMo = mo ? BarsaApi.Ext.decode(mo) : null;
149
- newNotification = this._prepareProperties(newNotification, parsedMo, msg);
150
- if (parsedMo) {
151
- const molist = this._notifications$.getValue();
152
- this._notifications$.next([newNotification, ...molist]);
153
- this.increaseNotifcationCount(1, 1);
154
- }
155
- this.showNotification(newNotification, parsedMo, uiOptions, otherOptions);
156
- }
157
- });
158
- }
159
- increaseNotifcationCount(unread, count) {
160
- const countValue = this._notificationCount$.getValue();
161
- const sumUnread = countValue.unread + +unread;
162
- const sumAll = countValue.all + +count;
163
- this._notificationCount$.next({ unread: sumUnread > 0 ? sumUnread : 0, all: sumAll > 0 ? sumAll : 0 });
164
- }
165
- loadUnreadNotificationCount() {
166
- BarsaApi.Bw.RunBlMethodAsync({
167
- Parameters: [BarsaApi.LoginFormData.PortalId],
168
- Method: 'GetShellbarNotificationCountByPortalId',
169
- SuccessFn: (e) => {
170
- this._updateUnreadAndCount(e);
171
- this._notifiationCountLoaded$.next(true);
172
- },
173
- FailFn: (e) => {
174
- this._logService.error(e);
175
- }
176
- });
177
- }
178
- loadNotifications(pageIndex = 0) {
179
- if (pageIndex + 1 > this.pageCount) {
180
- return;
181
- }
182
- this.notificationLoading(true);
183
- BarsaApi.Bw.RunBlMethodAsync({
184
- Parameters: [pageIndex, BarsaApi.LoginFormData.PortalId],
185
- Method: 'GetShellbarNotificationsByPortalId',
186
- SuccessFn: (e) => {
187
- const notifications = this._notifications$.getValue();
188
- const notifListOfTags = notifications.map((c) => c.Tag);
189
- const molist = e.MoList.filter((c) => notifListOfTags.indexOf(c.Tag) === -1).map((mo) => this._prepareProperties(mo, mo, mo.IMessage?.Content));
190
- this._notifications$.next([...notifications, ...molist]);
191
- this.pageCount = +e.PageCount;
192
- this.pageIndex = pageIndex + 1;
193
- this.notificationLoading(false);
194
- },
195
- FailFn: (e) => {
196
- this._logService.error(e);
197
- this.notificationLoading(false);
198
- }
199
- });
200
- }
201
- removeNotification(molist, closeNotification = true) {
202
- const moIds = this._setNotificationLoading(molist, true);
203
- BarsaApi.Bw.RunBlMethodAsync({
204
- Parameters: [moIds, BarsaApi.LoginFormData.PortalId],
205
- Method: 'RemoveShellbarNotification',
206
- SuccessFn: (e) => {
207
- const notificationList = this._notifications$.getValue();
208
- this._updateUnreadAndCount(e);
209
- const newMoList = notificationList.filter((c) => moIds.indexOf(c.Id) === -1);
210
- this._notifications$.next(newMoList);
211
- if (closeNotification) {
212
- this._serviceWorkerNotification.closeNotifications(moIds);
213
- }
214
- if (this._notificationCount$.getValue().all > 0) {
215
- this.loadNotifications(this.pageIndex - 1);
216
- }
217
- },
218
- FailFn: (e) => {
219
- this._logService.error(e);
220
- this._setNotificationLoading(molist, false);
221
- }
222
- });
223
- }
224
- _updateUnreadAndCount(e) {
225
- this._notificationUnreadCount$.next(+e.Unread);
226
- this._notificationCount$.next({ unread: +e.Unread, all: +e.All });
227
- }
228
- get SupportNotifications() {
229
- return typeof Notification !== 'undefined' && this._serviceWorkerNotification.isEnabled;
230
- }
231
- showNotification(notificationItem, mo, uiOptions, otherOptions) {
232
- if (notificationItem.Title && notificationItem.Title.startsWith('[') && notificationItem.Title.endsWith(']')) {
233
- return;
234
- }
235
- if (notificationItem.Title && notificationItem.Title.startsWith('{') && notificationItem.Title.endsWith('}')) {
236
- return;
237
- }
238
- if (mo && !mo.ShowPopup) {
239
- return;
240
- }
241
- if (!this.SupportNotifications) {
242
- this._logService.warn(`InApp Notification is not supported.`);
243
- uiOptions = uiOptions ?? {};
244
- uiOptions.NotificationItem = notificationItem;
245
- this._popupNotify(notificationItem, mo, uiOptions, otherOptions);
246
- return;
247
- }
248
- this._inAppNotify(notificationItem);
249
- }
250
- notificationLoading(loading) {
251
- this._notificationLoading$.next(loading);
252
- }
253
- _setNotificationLoading(molist, loading = true) {
254
- const molistCurr = this._notifications$.getValue();
255
- const moIds = molist.map((c) => c.Id);
256
- const molistWithLoadingProperty = molistCurr.map((c) => ({
257
- ...c,
258
- $NotificatoinLoading: moIds.indexOf(c.Id) !== -1 ? loading : c.$NotificatoinLoading
259
- }));
260
- this._notifications$.next([...molistWithLoadingProperty]);
261
- return moIds;
262
- }
263
- _popupNotify(notificationItem, mo, uiOptions, otherOptions) {
264
- this._popupService.popupNotify(notificationItem.$SafeContent, notificationItem.Title, notificationItem.Subject, notificationItem.Image, mo, uiOptions, otherOptions);
265
- }
266
- _prepareProperties(notificationItem, mo, content) {
267
- if (!mo) {
268
- return notificationItem;
269
- }
270
- return {
271
- ...notificationItem,
272
- ...mo,
273
- UiActions: !mo.UiActions ? [] : JSON.parse(mo.UiActions),
274
- CreationDate: mo.IMessage.CreationDate,
275
- CreationDate$Caption: mo.IMessage.CreationDate$Caption,
276
- CreatorUser: mo.IMessage.CreatorUser,
277
- CreatorUser$Caption: mo.IMessage.CreatorUser$Caption,
278
- Icon: `${BarsaApi.Bw.Origin()}${notificationItem.Icon}`,
279
- $SafeContent: this._domSanitizer.bypassSecurityTrustHtml(content)
280
- };
281
- }
282
- _inAppNotify(notificationItem) {
283
- Notification.requestPermission((result) => {
284
- const lang = BarsaApi.LoginFormData.Culture;
285
- const isRtl = BarsaApi.LoginFormData.CulturesRtl[lang];
286
- if (result === 'granted') {
287
- this._serviceWorkerNotification.showNotification({
288
- notificationItem,
289
- isRtl,
290
- lang
291
- });
292
- }
293
- else {
294
- // TODO:permission denied
295
- this._logService.error('notification permission denied.');
296
- }
297
- });
298
- }
299
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NotificationService, deps: [{ token: NOTIFICATAION_POPUP_SERVER }, { token: i1.LogService }, { token: i2.LowerCasePipe }, { token: i3.BbbTranslatePipe }, { token: i4.DomSanitizer }, { token: i5.ServiceWorkerNotificationService }, { token: i6.PortalService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
300
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NotificationService }); }
301
- }
302
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NotificationService, decorators: [{
303
- type: Injectable
304
- }], ctorParameters: () => [{ type: undefined, decorators: [{
305
- type: Inject,
306
- args: [NOTIFICATAION_POPUP_SERVER]
307
- }] }, { type: i1.LogService }, { type: i2.LowerCasePipe }, { type: i3.BbbTranslatePipe }, { type: i4.DomSanitizer }, { type: i5.ServiceWorkerNotificationService }, { type: i6.PortalService }, { type: i0.NgZone }] });
308
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1ub3Zpbi1yYXktY29yZS9zcmMvbGliL3NlcnZpY2VzL25vdGlmaWNhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBRTNELE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFFbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRXpELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7Ozs7OztBQVFsRSxNQUFNLE9BQU8sbUJBQW1CO0lBUzVCLFlBQ2tELGFBQXVDLEVBQzdFLFdBQXVCLEVBQ3ZCLFVBQXlCLEVBQ3pCLGFBQStCLEVBQy9CLGFBQTJCLEVBQzNCLDBCQUE0RCxFQUM1RCxjQUE2QixFQUM3QixPQUFlO1FBUHVCLGtCQUFhLEdBQWIsYUFBYSxDQUEwQjtRQUM3RSxnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUN2QixlQUFVLEdBQVYsVUFBVSxDQUFlO1FBQ3pCLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUMvQixrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUMzQiwrQkFBMEIsR0FBMUIsMEJBQTBCLENBQWtDO1FBQzVELG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQzdCLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFoQm5CLG9CQUFlLEdBQUcsSUFBSSxlQUFlLENBQXdCLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLHdCQUFtQixHQUFHLElBQUksZUFBZSxDQUFrQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEcsOEJBQXlCLEdBQUcsSUFBSSxlQUFlLENBQVMsQ0FBQyxDQUFDLENB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WUFDdEMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0I7WUFDdEQsV0FBVyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVztZQUNwQyxtQkFBbUIsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLG1CQUFtQjtZQUNwRCxJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxHQUFHLGdCQUFnQixDQUFDLElBQUksRUFBRTtZQUN2RCxZQUFZLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUM7U0FDcEUsQ0FBQztJQUNOLENBQUM7SUFDTyxZQUFZLENBQUMsZ0JBQWtDO1FBQ25ELFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3RDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDO1lBQzVDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXZELElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsMEJBQTBCLENBQUMsZ0JBQWdCLENBQUM7b0JBQzdDLGdCQUFnQjtvQkFDaEIsS0FBSztvQkFDTCxJQUFJO2lCQUNQLENBQUMsQ0FBQztZQUNQLENBQUM7aUJBQU0sQ0FBQztnQkFDSix5QkFBeUI7Z0JBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7WUFDOUQsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzsrR0F6VVEsbUJBQW1CLGtCQVVoQiwwQkFBMEI7bUhBVjdCLG1CQUFtQjs7NEZBQW5CLG1CQUFtQjtrQkFEL0IsVUFBVTs7MEJBV0YsTUFBTTsyQkFBQywwQkFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb3dlckNhc2VQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBCYXJzYUFwaSB9IGZyb20gJy4uL2Fic3RyYWN0LWNsYXNzZXMvYmFyc2EtYXBpJztcbmltcG9ydCB7IE1ldGFvYmplY3REYXRhTW9kZWwsIE1vRm9yUmVwb3J0TW9kZWwsIE5vdGlmaWNhdGlvbkl0ZW0sIE5vdGlmeU9wdGlvbnMgfSBmcm9tICcuLi9hYnN0cmFjdC1jbGFzc2VzL21vZGVscyc7XG5pbXBvcnQgeyBOT1RJRklDQVRBSU9OX1BPUFVQX1NFUlZFUiB9IGZyb20gJy4uL2luamRlY3Rpb24tdG9rZW5zJztcbmltcG9ydCB7IEJiYlRyYW5zbGF0ZVBpcGUgfSBmcm9tICcuLi9waXBlcy9iYmItdHJhbnNsYXRlLnBpcGUnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJy4vbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uUG9wdXBTZXJ2aWNlIH0gZnJvbSAnLi9ub3RpZmljYXRpb24tcG9wdXAuc2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlV29ya2VyTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4vbm90aWZpY2F0aW9uLXN3LnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9ydGFsU2VydmljZSB9IGZyb20gJy4vcG9ydGFsLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uU2VydmljZSB7XG4gICAgcHJpdmF0ZSBfbm90aWZpY2F0aW9ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1ldGFvYmplY3REYXRhTW9kZWxbXT4oW10pO1xuICAgIHByaXZhdGUgX25vdGlmaWNhdGlvbkNvdW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8eyB1bnJlYWQ6IG51bWJlcjsgYWxsOiBudW1iZXIgfT4oeyB1bnJlYWQ6IDAsIGFsbDogMCB9KTtcbiAgICBwcml2YXRlIF9ub3RpZmljYXRpb25VbnJlYWRDb3VudCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gICAgcHJpdmF0ZSBfbm90aWZpY2F0aW9uTG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgICBwcml2YXRlIF9ub3RpZmlhdGlvbkNvdW50TG9hZGVkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIHBhZ2VDb3VudCA9IDE7XG4gICAgcGFnZUluZGV4ID0gMDtcbiAgICB1c2VyTm90aWZpY2F0aW9uU2V0dGluZ3M6IFVzZXJOb3RpZmljYXRpb25TZXR0aW5nO1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KE5PVElGSUNBVEFJT05fUE9QVVBfU0VSVkVSKSBwcm90ZWN0ZWQgX3BvcHVwU2VydmljZTogTm90aWZpY2F0aW9uUG9wdXBTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9sb2dTZXJ2aWNlOiBMb2dTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9sb3dlckNhc2U6IExvd2VyQ2FzZVBpcGUsXG4gICAgICAgIHByaXZhdGUgX2JiYlRyYW5zbGF0ZTogQmJiVHJhbnNsYXRlUGlwZSxcbiAgICAgICAgcHJpdmF0ZSBfZG9tU2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgICAgIHByaXZhdGUgX3NlcnZpY2VXb3JrZXJOb3RpZmljYXRpb246IFNlcnZpY2VXb3JrZXJOb3RpZmljYXRpb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9wb3J0YWxTZXJ2aWNlOiBQb3J0YWxTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9uZ1pvbmU6IE5nWm9uZVxuICAgICkge1xuICAgICAgICB0aGlzLl9wb3J0YWxTZXJ2aWNlLnVzZXJQb3J0YWxTZXR0aW5ncyQucGlwZSgpLnN1YnNjcmliZSgodXNlclBvcnRhbFNldHRpbmdzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVzZXJOb3RpZmljYXRpb25TZXR0aW5ncyA9IDxVc2VyTm90aWZpY2F0aW9uU2V0dGluZz51c2VyUG9ydGFsU2V0dGluZ3NbJ1VzZXJOb3RpZmljYXRpb25TZXR0aW5nJ107XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgbm90aWZpY2F0aW9uQ291bnRMb2FkZWQkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbm90aWZpYXRpb25Db3VudExvYWRlZCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuICAgIGdldCBub3RpZmljYXRpb25Db3VudCQoKTogT2JzZXJ2YWJsZTx7IHVucmVhZDogbnVtYmVyOyBhbGw6IG51bWJlciB9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ub3RpZmljYXRpb25Db3VudCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgZ2V0IG5vdGlmaWNhdGlvbnMkKCk6IE9ic2VydmFibGU8TWV0YW9iamVjdERhdGFNb2RlbFtdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ub3RpZmljYXRpb25zJC5hc09ic2VydmFibGUoKS5waXBlKCk7XG4gICAgfVxuICAgIGdldCBub3RpZmljYXRpb25Mb2FkaW5nJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vdGlmaWNhdGlvbkxvYWRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cbiAgICBwdWJsaWMgbG9hZE1vcmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9hZE5vdGlmaWNhdGlvbnModGhpcy5wYWdlSW5kZXgpO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0Tm90aWZpY2F0aW9uVmlld2VkKHRhZ3M6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgICAgIEJhcnNhQXBpLkJ3LlJ1bkJsTWV0aG9kQXN5bmMoe1xuICAgICAgICAgICAgUGFyYW1ldGVyczogW3RhZ3NdLFxuICAgICAgICAgICAgTWV0aG9kOiAnU2V0Tm90aWZpY2F0aW9uVmlld2VkJyxcbiAgICAgICAgICAgIFN1Y2Nlc3NGbjogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vbGlzdEN1cnIgPSB0aGlzLl9ub3RpZmljYXRpb25zJC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRVbnJlYWRNb0xpc3QgPSBtb2xpc3RDdXJyLm1hcCgoYykgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uYyxcbiAgICAgICAgICAgICAgICAgICAgVW5yZWFkOiB0YWdzLmluZGV4T2YoYy5UYWcpID4gLTEgPyBmYWxzZSA6IGMuVW5yZWFkXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWNhdGlvbnMkLm5leHQoWy4uLnVwZGF0ZWRVbnJlYWRNb0xpc3RdKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluY3JlYXNlTm90aWZjYXRpb25Db3VudCgtdGFncy5sZW5ndGgsIDApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0YWdzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIEZhaWxGbjogKGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dTZXJ2aWNlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIFNob3dOb3RpZmljYXRpb25SZWxhdGVkTW8oZTogeyB0YWc6IHN0cmluZzsgbW86IE1ldGFvYmplY3REYXRhTW9kZWw7IG5hbWE6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVlID0ge1xuICAgICAgICAgICAgLi4uZSxcbiAgICAgICAgICAgIGFmdGVyUmVhZHk6IChlMjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnM6IFtlLnRhZ10sXG4gICAgICAgICAgICAgICAgICAgIE1ldGhvZDogJ0JhcnNhX1NldFJlYWRSYWRpZkNhcnRhYmxlQnlUYWcnLFxuICAgICAgICAgICAgICAgICAgICBGYWlsRm46IChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZ1NlcnZpY2UuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9wb3J0YWxTZXJ2aWNlLlNob3dGb3JtKGVlKTtcbiAgICB9XG4gICAgcHVibGljIGhhbmRsZVRvcGljKGV2ZW50VG9waWMsIGNvbnRlbnQsIG93bmVyS2V5KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudFRvcGljID09PSAnRGVsZXRlTm90aWZpY2F0aW9uTWVzc2FnZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgVGFncyB9OiB7IFRhZ3M6IHN0cmluZ1tdIH0gPSBjb250ZW50O1xuICAgICAgICAgICAgY29uc3Qgbm90aWZpY2F0aW9ucyA9IHRoaXMuX25vdGlmaWNhdGlvbnMkLmdldFZhbHVlKCk7XG4gICAgICAgICAgICBjb25zdCB7IGZpbmRJbk5vdGlmaWNhdGlvbnMsIHVucmVhZENvdW50LCBjb3VudCB9ID0gdGhpcy5fZmluZE5vdGlmaWNhdGlvbnNNZXNzYWdlKFRhZ3MsIG5vdGlmaWNhdGlvbnMpO1xuICAgICAgICAgICAgaWYgKGZpbmRJbk5vdGlmaWNhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmljYXRpb25zJC5uZXh0KG5vdGlmaWNhdGlvbnMuZmlsdGVyKChjKSA9PiAhVGFncy5pbmNsdWRlcyhjLlRhZykpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1bnJlYWRDb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluY3JlYXNlTm90aWZjYXRpb25Db3VudCgtdW5yZWFkQ291bnQsIC1jb3VudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnRUb3BpYyA9PT0gJ1NldFJlYWROb3RpZmljYXRpb25NZXNzYWdlJykge1xuICAgICAgICAgICAgY29uc3Qgbm90aWZpY2F0aW9ucyA9IHRoaXMuX25vdGlmaWNhdGlvbnMkLmdldFZhbHVlKCk7XG4gICAgICAgICAgICBjb25zdCB7IFRhZ3MgfTogeyBUYWdzOiBzdHJpbmdbXSB9ID0gY29udGVudDtcbiAgICAgICAgICAgIFRhZ3MuZm9yRWFjaCgodGFnKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm91bmRJbmRleCA9IG5vdGlmaWNhdGlvbnMuZmluZEluZGV4KChjKSA9PiBjLlRhZyA9PT0gdGFnKTtcbiAgICAgICAgICAgICAgICBpZiAoZm91bmRJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbnNbZm91bmRJbmRleF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5ub3RpZmljYXRpb25zW2ZvdW5kSW5kZXhdLFxuICAgICAgICAgICAgICAgICAgICAgICAgVW5yZWFkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFVucmVhZCRDYXB0aW9uOiAn2YbYp9iv2LHYs9iqJ1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmljYXRpb25zJC5uZXh0KFsuLi5ub3RpZmljYXRpb25zXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbnNDb3VudCA9IHRoaXMuX25vdGlmaWNhdGlvbkNvdW50JC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgdGhpcy5pbmNyZWFzZU5vdGlmY2F0aW9uQ291bnQoLVRhZ3MubGVuZ3RoLCBub3RpZmljYXRpb25zQ291bnQuYWxsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIF9maW5kTm90aWZpY2F0aW9uc01lc3NhZ2UoXG4gICAgICAgIFRhZ3M6IHN0cmluZ1tdLFxuICAgICAgICBub3RpZmljYXRpb25zOiBNZXRhb2JqZWN0RGF0YU1vZGVsW11cbiAgICApOiB7IGZpbmRJbk5vdGlmaWNhdGlvbnM6IGJvb2xlYW47IHVucmVhZENvdW50OiBudW1iZXI7IGNvdW50OiBudW1iZXIgfSB7XG4gICAgICAgIGxldCBmaW5kSW5Ob3RpZmljYXRpb25zID0gZmFsc2U7XG4gICAgICAgIGxldCB1bnJlYWRDb3VudCA9IDA7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIFRhZ3MuZm9yRWFjaCgodGFnKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmb3VuZE5vdGlmaWNhdGlvbiA9IG5vdGlmaWNhdGlvbnMuZmluZCgoYykgPT4gYy5UYWcgPT09IHRhZyk7XG4gICAgICAgICAgICBpZiAoZm91bmROb3RpZmljYXRpb24pIHtcbiAgICAgICAgICAgICAgICBmaW5kSW5Ob3RpZmljYXRpb25zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZE5vdGlmaWNhdGlvbi5VbnJlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5yZWFkQ291bnQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBmaW5kSW5Ob3RpZmljYXRpb25zLCB1bnJlYWRDb3VudCwgY291bnQgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkTm90aWZpY2F0aW9uKFxuICAgICAgICBtc2c6IHN0cmluZyxcbiAgICAgICAgdGl0bGU6IHN0cmluZyxcbiAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICBpbWFnZTogc3RyaW5nLFxuICAgICAgICBtbyxcbiAgICAgICAgdWlPcHRpb25zOiBOb3RpZnlPcHRpb25zLFxuICAgICAgICBvdGhlck9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBpZiAob3RoZXJPcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBNb0lkLCBUeXBlRGVmSWQgfSA9IG90aGVyT3B0aW9ucztcbiAgICAgICAgICAgICAgICBsZXQgbmV3Tm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb25JdGVtID0ge1xuICAgICAgICAgICAgICAgICAgICAkQ2FwdGlvbjogdGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIElkOiBNb0lkLFxuICAgICAgICAgICAgICAgICAgICAkVHlwZURlZklkOiBUeXBlRGVmSWQsXG4gICAgICAgICAgICAgICAgICAgIFRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgICAgICAgICAgVW5yZWFkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBJY29uOiBpbWFnZSxcbiAgICAgICAgICAgICAgICAgICAgSW1hZ2U6ICcnLFxuICAgICAgICAgICAgICAgICAgICBDb250ZW50OiBtc2csXG4gICAgICAgICAgICAgICAgICAgIFRhZzogJycsXG4gICAgICAgICAgICAgICAgICAgIFByaW9yaXR5OiAwLFxuICAgICAgICAgICAgICAgICAgICBTdWJqZWN0OiAnJyxcbiAgICAgICAgICAgICAgICAgICAgJFNhZmVDb250ZW50OiB0aGlzLl9kb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwobXNnKSxcbiAgICAgICAgICAgICAgICAgICAgQ3JlYXRpb25EYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICBDcmVhdGlvbkRhdGUkQ2FwdGlvbjogdGhpcy5fYmJiVHJhbnNsYXRlLnRyYW5zZm9ybSgnRGF0ZVJfVG9kYXknKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkTW8gPSBtbyA/IEJhcnNhQXBpLkV4dC5kZWNvZGUobW8pIDogbnVsbDtcbiAgICAgICAgICAgICAgICBuZXdOb3RpZmljYXRpb24gPSB0aGlzLl9wcmVwYXJlUHJvcGVydGllcyhuZXdOb3RpZmljYXRpb24sIHBhcnNlZE1vLCBtc2cpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZE1vKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vbGlzdCA9IHRoaXMuX25vdGlmaWNhdGlvbnMkLmdldFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWNhdGlvbnMkLm5leHQoW25ld05vdGlmaWNhdGlvbiwgLi4ubW9saXN0XSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5jcmVhc2VOb3RpZmNhdGlvbkNvdW50KDEsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNob3dOb3RpZmljYXRpb24obmV3Tm90aWZpY2F0aW9uLCBwYXJzZWRNbywgdWlPcHRpb25zLCBvdGhlck9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5jcmVhc2VOb3RpZmNhdGlvbkNvdW50KHVucmVhZDogbnVtYmVyLCBjb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvdW50VmFsdWUgPSB0aGlzLl9ub3RpZmljYXRpb25Db3VudCQuZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3Qgc3VtVW5yZWFkID0gY291bnRWYWx1ZS51bnJlYWQgKyArdW5yZWFkO1xuICAgICAgICBjb25zdCBzdW1BbGwgPSBjb3VudFZhbHVlLmFsbCArICtjb3VudDtcbiAgICAgICAgdGhpcy5fbm90aWZpY2F0aW9uQ291bnQkLm5leHQoeyB1bnJlYWQ6IHN1bVVucmVhZCA+IDAgPyBzdW1VbnJlYWQgOiAwLCBhbGw6IHN1bUFsbCA+IDAgPyBzdW1BbGwgOiAwIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgbG9hZFVucmVhZE5vdGlmaWNhdGlvbkNvdW50KCk6IHZvaWQge1xuICAgICAgICBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZEFzeW5jKHtcbiAgICAgICAgICAgIFBhcmFtZXRlcnM6IFtCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLlBvcnRhbElkXSxcbiAgICAgICAgICAgIE1ldGhvZDogJ0dldFNoZWxsYmFyTm90aWZpY2F0aW9uQ291bnRCeVBvcnRhbElkJyxcbiAgICAgICAgICAgIFN1Y2Nlc3NGbjogKGU6IHsgVW5yZWFkOiBudW1iZXI7IEFsbDogbnVtYmVyIH0pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVVbnJlYWRBbmRDb3VudChlKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmlhdGlvbkNvdW50TG9hZGVkJC5uZXh0KHRydWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIEZhaWxGbjogKGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dTZXJ2aWNlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIGxvYWROb3RpZmljYXRpb25zKHBhZ2VJbmRleDogbnVtYmVyID0gMCk6IHZvaWQge1xuICAgICAgICBpZiAocGFnZUluZGV4ICsgMSA+IHRoaXMucGFnZUNvdW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25Mb2FkaW5nKHRydWUpO1xuICAgICAgICBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZEFzeW5jKHtcbiAgICAgICAgICAgIFBhcmFtZXRlcnM6IFtwYWdlSW5kZXgsIEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuUG9ydGFsSWRdLFxuICAgICAgICAgICAgTWV0aG9kOiAnR2V0U2hlbGxiYXJOb3RpZmljYXRpb25zQnlQb3J0YWxJZCcsXG4gICAgICAgICAgICBTdWNjZXNzRm46IChlOiB7IFBhZ2VDb3VudDogbnVtYmVyOyBNb0xpc3Q6IE1ldGFvYmplY3REYXRhTW9kZWxbXSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm90aWZpY2F0aW9ucyA9IHRoaXMuX25vdGlmaWNhdGlvbnMkLmdldFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm90aWZMaXN0T2ZUYWdzID0gbm90aWZpY2F0aW9ucy5tYXAoKGMpID0+IGMuVGFnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtb2xpc3QgPSBlLk1vTGlzdC5maWx0ZXIoKGMpID0+IG5vdGlmTGlzdE9mVGFncy5pbmRleE9mKGMuVGFnKSA9PT0gLTEpLm1hcCgobW8pID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVQcm9wZXJ0aWVzKDxOb3RpZmljYXRpb25JdGVtPm1vLCBtbywgbW8uSU1lc3NhZ2U/LkNvbnRlbnQpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmljYXRpb25zJC5uZXh0KFsuLi5ub3RpZmljYXRpb25zLCAuLi5tb2xpc3RdKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VDb3VudCA9ICtlLlBhZ2VDb3VudDtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VJbmRleCA9IHBhZ2VJbmRleCArIDE7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25Mb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBGYWlsRm46IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nU2VydmljZS5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkxvYWRpbmcoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlTm90aWZpY2F0aW9uKG1vbGlzdDogTWV0YW9iamVjdERhdGFNb2RlbFtdLCBjbG9zZU5vdGlmaWNhdGlvbiA9IHRydWUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbW9JZHMgPSB0aGlzLl9zZXROb3RpZmljYXRpb25Mb2FkaW5nKG1vbGlzdCwgdHJ1ZSk7XG4gICAgICAgIEJhcnNhQXBpLkJ3LlJ1bkJsTWV0aG9kQXN5bmMoe1xuICAgICAgICAgICAgUGFyYW1ldGVyczogW21vSWRzLCBCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLlBvcnRhbElkXSxcbiAgICAgICAgICAgIE1ldGhvZDogJ1JlbW92ZVNoZWxsYmFyTm90aWZpY2F0aW9uJyxcbiAgICAgICAgICAgIFN1Y2Nlc3NGbjogKGU6IHsgVW5yZWFkOiBudW1iZXI7IEFsbDogbnVtYmVyIH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBub3RpZmljYXRpb25MaXN0ID0gdGhpcy5fbm90aWZpY2F0aW9ucyQuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVVbnJlYWRBbmRDb3VudChlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdNb0xpc3QgPSBub3RpZmljYXRpb25MaXN0LmZpbHRlcigoYykgPT4gbW9JZHMuaW5kZXhPZihjLklkKSA9PT0gLTEpO1xuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWNhdGlvbnMkLm5leHQobmV3TW9MaXN0KTtcbiAgICAgICAgICAgICAgICBpZiAoY2xvc2VOb3RpZmljYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VydmljZVdvcmtlck5vdGlmaWNhdGlvbi5jbG9zZU5vdGlmaWNhdGlvbnMobW9JZHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbm90aWZpY2F0aW9uQ291bnQkLmdldFZhbHVlKCkuYWxsID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWROb3RpZmljYXRpb25zKHRoaXMucGFnZUluZGV4IC0gMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIEZhaWxGbjogKGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dTZXJ2aWNlLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldE5vdGlmaWNhdGlvbkxvYWRpbmcobW9saXN0LCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwcml2YXRlIF91cGRhdGVVbnJlYWRBbmRDb3VudChlOiB7IFVucmVhZDogbnVtYmVyOyBBbGw6IG51bWJlciB9KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX25vdGlmaWNhdGlvblVucmVhZENvdW50JC5uZXh0KCtlLlVucmVhZCk7XG4gICAgICAgIHRoaXMuX25vdGlmaWNhdGlvbkNvdW50JC5uZXh0KHsgdW5yZWFkOiArZS5VbnJlYWQsIGFsbDogK2UuQWxsIH0pO1xuICAgIH1cblxuICAgIGdldCBTdXBwb3J0Tm90aWZpY2F0aW9ucygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBOb3RpZmljYXRpb24gIT09ICd1bmRlZmluZWQnICYmIHRoaXMuX3NlcnZpY2VXb3JrZXJOb3RpZmljYXRpb24uaXNFbmFibGVkO1xuICAgIH1cbiAgICBwdWJsaWMgc2hvd05vdGlmaWNhdGlvbihcbiAgICAgICAgbm90aWZpY2F0aW9uSXRlbTogTm90aWZpY2F0aW9uSXRlbSxcbiAgICAgICAgbW86IE1ldGFvYmplY3REYXRhTW9kZWwgfCBudWxsLFxuICAgICAgICB1aU9wdGlvbnM6IE5vdGlmeU9wdGlvbnMsXG4gICAgICAgIG90aGVyT3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PlxuICAgICk6IHZvaWQge1xuICAgICAgICBpZiAobm90aWZpY2F0aW9uSXRlbS5UaXRsZSAmJiBub3RpZmljYXRpb25JdGVtLlRpdGxlLnN0YXJ0c1dpdGgoJ1snKSAmJiBub3RpZmljYXRpb25JdGVtLlRpdGxlLmVuZHNXaXRoKCddJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm90aWZpY2F0aW9uSXRlbS5UaXRsZSAmJiBub3RpZmljYXRpb25JdGVtLlRpdGxlLnN0YXJ0c1dpdGgoJ3snKSAmJiBub3RpZmljYXRpb25JdGVtLlRpdGxlLmVuZHNXaXRoKCd9JykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW8gJiYgIW1vLlNob3dQb3B1cCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5TdXBwb3J0Tm90aWZpY2F0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5fbG9nU2VydmljZS53YXJuKGBJbkFwcCBOb3RpZmljYXRpb24gaXMgbm90IHN1cHBvcnRlZC5gKTtcbiAgICAgICAgICAgIHVpT3B0aW9ucyA9IHVpT3B0aW9ucyA/PyB7fTtcbiAgICAgICAgICAgIHVpT3B0aW9ucy5Ob3RpZmljYXRpb25JdGVtID0gbm90aWZpY2F0aW9uSXRlbTtcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwTm90aWZ5KG5vdGlmaWNhdGlvbkl0ZW0sIG1vLCB1aU9wdGlvbnMsIG90aGVyT3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faW5BcHBOb3RpZnkobm90aWZpY2F0aW9uSXRlbSk7XG4gICAgfVxuICAgIHByaXZhdGUgbm90aWZpY2F0aW9uTG9hZGluZyhsb2FkaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX25vdGlmaWNhdGlvbkxvYWRpbmckLm5leHQobG9hZGluZyk7XG4gICAgfVxuICAgIHByaXZhdGUgX3NldE5vdGlmaWNhdGlvbkxvYWRpbmcobW9saXN0OiBNZXRhb2JqZWN0RGF0YU1vZGVsW10sIGxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBtb2xpc3RDdXJyID0gdGhpcy5fbm90aWZpY2F0aW9ucyQuZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3QgbW9JZHMgPSBtb2xpc3QubWFwKChjKSA9PiBjLklkKTtcbiAgICAgICAgY29uc3QgbW9saXN0V2l0aExvYWRpbmdQcm9wZXJ0eSA9IG1vbGlzdEN1cnIubWFwKChjKSA9PiAoe1xuICAgICAgICAgICAgLi4uYyxcbiAgICAgICAgICAgICROb3RpZmljYXRvaW5Mb2FkaW5nOiBtb0lkcy5pbmRleE9mKGMuSWQpICE9PSAtMSA/IGxvYWRpbmcgOiBjLiROb3RpZmljYXRvaW5Mb2FkaW5nXG4gICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5fbm90aWZpY2F0aW9ucyQubmV4dChbLi4ubW9saXN0V2l0aExvYWRpbmdQcm9wZXJ0eV0pO1xuICAgICAgICByZXR1cm4gbW9JZHM7XG4gICAgfVxuICAgIHByaXZhdGUgX3BvcHVwTm90aWZ5KFxuICAgICAgICBub3RpZmljYXRpb25JdGVtOiBOb3RpZmljYXRpb25JdGVtLFxuICAgICAgICBtbzogTWV0YW9iamVjdERhdGFNb2RlbCB8IG51bGwsXG4gICAgICAgIHVpT3B0aW9uczogTm90aWZ5T3B0aW9ucyxcbiAgICAgICAgb3RoZXJPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3BvcHVwU2VydmljZS5wb3B1cE5vdGlmeShcbiAgICAgICAgICAgIG5vdGlmaWNhdGlvbkl0ZW0uJFNhZmVDb250ZW50LFxuICAgICAgICAgICAgbm90aWZpY2F0aW9uSXRlbS5UaXRsZSxcbiAgICAgICAgICAgIG5vdGlmaWNhdGlvbkl0ZW0uU3ViamVjdCxcbiAgICAgICAgICAgIG5vdGlmaWNhdGlvbkl0ZW0uSW1hZ2UsXG4gICAgICAgICAgICBtbyxcbiAgICAgICAgICAgIHVpT3B0aW9ucyxcbiAgICAgICAgICAgIG90aGVyT3B0aW9uc1xuICAgICAgICApO1xuICAgIH1cbiAgICBwcml2YXRlIF9wcmVwYXJlUHJvcGVydGllcyhcbiAgICAgICAgbm90aWZpY2F0aW9uSXRlbTogTm90aWZpY2F0aW9uSXRlbSxcbiAgICAgICAgbW86IE1ldGFvYmplY3REYXRhTW9kZWwsXG4gICAgICAgIGNvbnRlbnQ6IHN0cmluZ1xuICAgICk6IE5vdGlmaWNhdGlvbkl0ZW0ge1xuICAgICAgICBpZiAoIW1vKSB7XG4gICAgICAgICAgICByZXR1cm4gbm90aWZpY2F0aW9uSXRlbTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ubm90aWZpY2F0aW9uSXRlbSxcbiAgICAgICAgICAgIC4uLm1vLFxuICAgICAgICAgICAgVWlBY3Rpb25zOiAhbW8uVWlBY3Rpb25zID8gW10gOiBKU09OLnBhcnNlKG1vLlVpQWN0aW9ucyksXG4gICAgICAgICAgICBDcmVhdGlvbkRhdGU6IG1vLklNZXNzYWdlLkNyZWF0aW9uRGF0ZSxcbiAgICAgICAgICAgIENyZWF0aW9uRGF0ZSRDYXB0aW9uOiBtby5JTWVzc2FnZS5DcmVhdGlvbkRhdGUkQ2FwdGlvbixcbiAgICAgICAgICAgIENyZWF0b3JVc2VyOiBtby5JTWVzc2FnZS5DcmVhdG9yVXNlcixcbiAgICAgICAgICAgIENyZWF0b3JVc2VyJENhcHRpb246IG1vLklNZXNzYWdlLkNyZWF0b3JVc2VyJENhcHRpb24sXG4gICAgICAgICAgICBJY29uOiBgJHtCYXJzYUFwaS5Cdy5PcmlnaW4oKX0ke25vdGlmaWNhdGlvbkl0ZW0uSWNvbn1gLFxuICAgICAgICAgICAgJFNhZmVDb250ZW50OiB0aGlzLl9kb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoY29udGVudClcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfaW5BcHBOb3RpZnkobm90aWZpY2F0aW9uSXRlbTogTm90aWZpY2F0aW9uSXRlbSk6IHZvaWQge1xuICAgICAgICBOb3RpZmljYXRpb24ucmVxdWVzdFBlcm1pc3Npb24oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGFuZyA9IEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuQ3VsdHVyZTtcbiAgICAgICAgICAgIGNvbnN0IGlzUnRsID0gQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5DdWx0dXJlc1J0bFtsYW5nXTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ2dyYW50ZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VydmljZVdvcmtlck5vdGlmaWNhdGlvbi5zaG93Tm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSXRlbSxcbiAgICAgICAgICAgICAgICAgICAgaXNSdGwsXG4gICAgICAgICAgICAgICAgICAgIGxhbmdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzpwZXJtaXNzaW9uIGRlbmllZFxuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ1NlcnZpY2UuZXJyb3IoJ25vdGlmaWNhdGlvbiBwZXJtaXNzaW9uIGRlbmllZC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5pbnRlcmZhY2UgVXNlck5vdGlmaWNhdGlvblNldHRpbmcgZXh0ZW5kcyBNZXRhb2JqZWN0RGF0YU1vZGVsIHtcbiAgICBEaXNhYmxlQ2FydGFibGVHcm91cHM6IE1vRm9yUmVwb3J0TW9kZWw7XG4gICAgRW5hYmxlOiBib29sZWFuO1xufVxuIl19