@sinequa/atomic-angular 0.0.146

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 (174) hide show
  1. package/assets/tailwind.css +334 -0
  2. package/esm2022/lib/assistant/index.mjs +2 -0
  3. package/esm2022/lib/assistant/signalR.web.service.mjs +81 -0
  4. package/esm2022/lib/components/dropdown-input.mjs +97 -0
  5. package/esm2022/lib/components/dropdown-list.mjs +35 -0
  6. package/esm2022/lib/components/dropdown.mjs +127 -0
  7. package/esm2022/lib/components/index.mjs +7 -0
  8. package/esm2022/lib/components/menu/index.mjs +3 -0
  9. package/esm2022/lib/components/menu/menu-item.mjs +22 -0
  10. package/esm2022/lib/components/menu/menu.mjs +99 -0
  11. package/esm2022/lib/components/metadata/index.mjs +2 -0
  12. package/esm2022/lib/components/metadata/metadata.component.mjs +65 -0
  13. package/esm2022/lib/components/theme/index.mjs +3 -0
  14. package/esm2022/lib/components/theme/theme-selector.component.mjs +67 -0
  15. package/esm2022/lib/components/theme/theme-toggle.component.mjs +67 -0
  16. package/esm2022/lib/directives/index.mjs +5 -0
  17. package/esm2022/lib/directives/infinite-scroll.directive.mjs +47 -0
  18. package/esm2022/lib/directives/select-article-on-click.directive.mjs +39 -0
  19. package/esm2022/lib/directives/show-bookmark.directive.mjs +55 -0
  20. package/esm2022/lib/directives/theme-provider.directive.mjs +31 -0
  21. package/esm2022/lib/guards/auth.guard.mjs +27 -0
  22. package/esm2022/lib/guards/index.mjs +3 -0
  23. package/esm2022/lib/guards/initialization.guard.mjs +41 -0
  24. package/esm2022/lib/interceptors/audit.interceptor.mjs +23 -0
  25. package/esm2022/lib/interceptors/auth.interceptor.mjs +49 -0
  26. package/esm2022/lib/interceptors/body.interceptor.mjs +24 -0
  27. package/esm2022/lib/interceptors/error.interceptor.mjs +35 -0
  28. package/esm2022/lib/interceptors/index.mjs +7 -0
  29. package/esm2022/lib/interceptors/toast.interceptor.mjs +27 -0
  30. package/esm2022/lib/models/aggregation.mjs +2 -0
  31. package/esm2022/lib/models/article-metadata.mjs +2 -0
  32. package/esm2022/lib/models/autocomplete.mjs +2 -0
  33. package/esm2022/lib/models/custom-json.mjs +2 -0
  34. package/esm2022/lib/models/filter-dropdown.mjs +2 -0
  35. package/esm2022/lib/models/index.mjs +7 -0
  36. package/esm2022/lib/models/user-settings.mjs +2 -0
  37. package/esm2022/lib/pipes/highlight-word.pipe.mjs +33 -0
  38. package/esm2022/lib/pipes/index.mjs +3 -0
  39. package/esm2022/lib/pipes/source-icon.pipe.mjs +43 -0
  40. package/esm2022/lib/public-api.mjs +18 -0
  41. package/esm2022/lib/resolvers/index.mjs +2 -0
  42. package/esm2022/lib/resolvers/query-name-resolver.mjs +14 -0
  43. package/esm2022/lib/resources/index.mjs +2 -0
  44. package/esm2022/lib/resources/themes.mjs +53 -0
  45. package/esm2022/lib/services/application.service.mjs +245 -0
  46. package/esm2022/lib/services/autocomplete.service.mjs +85 -0
  47. package/esm2022/lib/services/drawer/backdrop.service.mjs +23 -0
  48. package/esm2022/lib/services/drawer/drawer-stack.service.mjs +152 -0
  49. package/esm2022/lib/services/drawer/drawer.service.mjs +38 -0
  50. package/esm2022/lib/services/index.mjs +12 -0
  51. package/esm2022/lib/services/label.service.mjs +161 -0
  52. package/esm2022/lib/services/navigation.service.mjs +59 -0
  53. package/esm2022/lib/services/saved-searches.service.mjs +75 -0
  54. package/esm2022/lib/services/search.service.mjs +89 -0
  55. package/esm2022/lib/services/selection-history.service.mjs +92 -0
  56. package/esm2022/lib/services/selection.service.mjs +87 -0
  57. package/esm2022/lib/stores/aggregations.store.mjs +59 -0
  58. package/esm2022/lib/stores/app.store.mjs +270 -0
  59. package/esm2022/lib/stores/application.store.mjs +87 -0
  60. package/esm2022/lib/stores/index.mjs +9 -0
  61. package/esm2022/lib/stores/principal.store.mjs +47 -0
  62. package/esm2022/lib/stores/query-params.store.mjs +207 -0
  63. package/esm2022/lib/stores/selection.store.mjs +45 -0
  64. package/esm2022/lib/stores/theme.store.mjs +116 -0
  65. package/esm2022/lib/stores/user-settings.store.mjs +391 -0
  66. package/esm2022/lib/tokens/highlights.mjs +32 -0
  67. package/esm2022/lib/tokens/index.mjs +2 -0
  68. package/esm2022/lib/utils/debounced-signal.mjs +38 -0
  69. package/esm2022/lib/utils/index.mjs +8 -0
  70. package/esm2022/lib/utils/inline-worker.mjs +40 -0
  71. package/esm2022/lib/utils/query.mjs +58 -0
  72. package/esm2022/lib/utils/routes.mjs +28 -0
  73. package/esm2022/lib/utils/tailwind-utils.mjs +6 -0
  74. package/esm2022/lib/utils/theme-body-hook.mjs +18 -0
  75. package/esm2022/lib/utils/theme-registry.mjs +6 -0
  76. package/esm2022/lib/web-services/aggregations.service.mjs +104 -0
  77. package/esm2022/lib/web-services/app.service.mjs +48 -0
  78. package/esm2022/lib/web-services/audit.service.mjs +122 -0
  79. package/esm2022/lib/web-services/index.mjs +10 -0
  80. package/esm2022/lib/web-services/json-method-plugin.service.mjs +54 -0
  81. package/esm2022/lib/web-services/preview.service.mjs +327 -0
  82. package/esm2022/lib/web-services/principal.service.mjs +46 -0
  83. package/esm2022/lib/web-services/query.service.mjs +123 -0
  84. package/esm2022/lib/web-services/text-chunck.service.mjs +46 -0
  85. package/esm2022/public-api.mjs +5 -0
  86. package/esm2022/sinequa-atomic-angular.mjs +5 -0
  87. package/fesm2022/sinequa-atomic-angular.mjs +4420 -0
  88. package/fesm2022/sinequa-atomic-angular.mjs.map +1 -0
  89. package/index.d.ts +5 -0
  90. package/lib/assistant/index.d.ts +1 -0
  91. package/lib/assistant/signalR.web.service.d.ts +46 -0
  92. package/lib/components/dropdown-input.d.ts +18 -0
  93. package/lib/components/dropdown-list.d.ts +8 -0
  94. package/lib/components/dropdown.d.ts +50 -0
  95. package/lib/components/index.d.ts +6 -0
  96. package/lib/components/menu/index.d.ts +2 -0
  97. package/lib/components/menu/menu-item.d.ts +8 -0
  98. package/lib/components/menu/menu.d.ts +24 -0
  99. package/lib/components/metadata/index.d.ts +1 -0
  100. package/lib/components/metadata/metadata.component.d.ts +24 -0
  101. package/lib/components/theme/index.d.ts +2 -0
  102. package/lib/components/theme/theme-selector.component.d.ts +70 -0
  103. package/lib/components/theme/theme-toggle.component.d.ts +10 -0
  104. package/lib/directives/index.d.ts +4 -0
  105. package/lib/directives/infinite-scroll.directive.d.ts +30 -0
  106. package/lib/directives/select-article-on-click.directive.d.ts +14 -0
  107. package/lib/directives/show-bookmark.directive.d.ts +60 -0
  108. package/lib/directives/theme-provider.directive.d.ts +20 -0
  109. package/lib/guards/auth.guard.d.ts +7 -0
  110. package/lib/guards/index.d.ts +2 -0
  111. package/lib/guards/initialization.guard.d.ts +20 -0
  112. package/lib/interceptors/audit.interceptor.d.ts +13 -0
  113. package/lib/interceptors/auth.interceptor.d.ts +14 -0
  114. package/lib/interceptors/body.interceptor.d.ts +11 -0
  115. package/lib/interceptors/error.interceptor.d.ts +9 -0
  116. package/lib/interceptors/index.d.ts +5 -0
  117. package/lib/interceptors/toast.interceptor.d.ts +13 -0
  118. package/lib/models/aggregation.d.ts +12 -0
  119. package/lib/models/article-metadata.d.ts +5 -0
  120. package/lib/models/autocomplete.d.ts +5 -0
  121. package/lib/models/custom-json.d.ts +69 -0
  122. package/lib/models/filter-dropdown.d.ts +10 -0
  123. package/lib/models/index.d.ts +6 -0
  124. package/lib/models/user-settings.d.ts +38 -0
  125. package/lib/pipes/highlight-word.pipe.d.ts +22 -0
  126. package/lib/pipes/index.d.ts +2 -0
  127. package/lib/pipes/source-icon.pipe.d.ts +51 -0
  128. package/lib/public-api.d.ts +14 -0
  129. package/lib/resolvers/index.d.ts +1 -0
  130. package/lib/resolvers/query-name-resolver.d.ts +9 -0
  131. package/lib/resources/index.d.ts +1 -0
  132. package/lib/resources/themes.d.ts +51 -0
  133. package/lib/services/application.service.d.ts +183 -0
  134. package/lib/services/autocomplete.service.d.ts +96 -0
  135. package/lib/services/drawer/backdrop.service.d.ts +9 -0
  136. package/lib/services/drawer/drawer-stack.service.d.ts +70 -0
  137. package/lib/services/drawer/drawer.service.d.ts +15 -0
  138. package/lib/services/index.d.ts +11 -0
  139. package/lib/services/label.service.d.ts +114 -0
  140. package/lib/services/navigation.service.d.ts +33 -0
  141. package/lib/services/saved-searches.service.d.ts +149 -0
  142. package/lib/services/search.service.d.ts +159 -0
  143. package/lib/services/selection-history.service.d.ts +50 -0
  144. package/lib/services/selection.service.d.ts +123 -0
  145. package/lib/stores/aggregations.store.d.ts +25 -0
  146. package/lib/stores/app.store.d.ts +110 -0
  147. package/lib/stores/application.store.d.ts +83 -0
  148. package/lib/stores/index.d.ts +8 -0
  149. package/lib/stores/principal.store.d.ts +47 -0
  150. package/lib/stores/query-params.store.d.ts +128 -0
  151. package/lib/stores/selection.store.d.ts +52 -0
  152. package/lib/stores/theme.store.d.ts +66 -0
  153. package/lib/stores/user-settings.store.d.ts +111 -0
  154. package/lib/tokens/highlights.d.ts +8 -0
  155. package/lib/tokens/index.d.ts +1 -0
  156. package/lib/utils/debounced-signal.d.ts +25 -0
  157. package/lib/utils/index.d.ts +7 -0
  158. package/lib/utils/inline-worker.d.ts +11 -0
  159. package/lib/utils/query.d.ts +26 -0
  160. package/lib/utils/routes.d.ts +16 -0
  161. package/lib/utils/tailwind-utils.d.ts +2 -0
  162. package/lib/utils/theme-body-hook.d.ts +6 -0
  163. package/lib/utils/theme-registry.d.ts +3 -0
  164. package/lib/web-services/aggregations.service.d.ts +57 -0
  165. package/lib/web-services/app.service.d.ts +30 -0
  166. package/lib/web-services/audit.service.d.ts +72 -0
  167. package/lib/web-services/index.d.ts +9 -0
  168. package/lib/web-services/json-method-plugin.service.d.ts +41 -0
  169. package/lib/web-services/preview.service.d.ts +283 -0
  170. package/lib/web-services/principal.service.d.ts +28 -0
  171. package/lib/web-services/query.service.d.ts +29 -0
  172. package/lib/web-services/text-chunck.service.d.ts +22 -0
  173. package/package.json +28 -0
  174. package/public-api.d.ts +1 -0
@@ -0,0 +1,391 @@
1
+ import { withDevtools } from '@angular-architects/ngrx-toolkit';
2
+ import { patchState, signalStore, signalStoreFeature, withMethods, withState } from '@ngrx/signals';
3
+ import { deleteUserSettings, fetchUserSettings, patchUserSettings } from '@sinequa/atomic';
4
+ export const UserSettingsStore = signalStore({ providedIn: 'root' }, withDevtools('UserSettings'), withBookmarkFeatures(), withRecentSearchFeatures(), withSavedSearchFeatures(), withBasketsFeatures(), withAssistantFeatures(), withUserSettingsFeatures());
5
+ export function withUserSettingsFeatures() {
6
+ return signalStoreFeature(withState({ language: undefined }), withMethods((store) => ({
7
+ /**
8
+ * Initializes the user settings store by fetching the user settings from the backend API
9
+ * and patching the store with the retrieved settings.
10
+ *
11
+ * @returns {Promise<void>} A promise that resolves when the initialization is complete.
12
+ */
13
+ async initialize() {
14
+ // Fetch the user settings from the backend API and patch the store with the result
15
+ const settings = await fetchUserSettings();
16
+ patchState(store, settings);
17
+ },
18
+ /**
19
+ * Resets the user settings to the initial state.
20
+ *
21
+ * This method performs the following actions:
22
+ * 1. Deletes the current user settings.
23
+ * 2. Patches the state with the initial state.
24
+ *
25
+ * @returns {Promise<void>} A promise that resolves when the reset operation is complete.
26
+ */
27
+ async reset() {
28
+ // Reset the user settings to the initial state
29
+ await deleteUserSettings();
30
+ patchState(store, {
31
+ bookmarks: [],
32
+ recentSearches: [],
33
+ savedSearches: [],
34
+ baskets: [],
35
+ assistants: {},
36
+ language: undefined,
37
+ });
38
+ },
39
+ })));
40
+ }
41
+ export function withBookmarkFeatures() {
42
+ return signalStoreFeature(withState({ bookmarks: [] }), withMethods((store) => ({
43
+ /**
44
+ * Updates the user's bookmarks in the store and optionally logs audit events.
45
+ *
46
+ * @param bookmarks - An array of bookmarks to update in the user settings.
47
+ * @param auditEvents - Optional audit events to log during the update.
48
+ * @returns A promise that resolves when the update is complete.
49
+ */
50
+ async updateBookmarks(bookmarks, auditEvents) {
51
+ await patchUserSettings({ bookmarks }, auditEvents);
52
+ patchState(store, (state) => {
53
+ return { ...state, bookmarks: [...bookmarks] };
54
+ });
55
+ },
56
+ /**
57
+ * Adds an article to the bookmarks if it is not already bookmarked.
58
+ *
59
+ * @param article - The article to be bookmarked.
60
+ * @param queryName - Optional name of the query associated with the bookmark.
61
+ * @returns A promise that resolves when the bookmark has been added.
62
+ */
63
+ async bookmark(article, queryName) {
64
+ if (!article.id)
65
+ return;
66
+ if (this.isBookmarked(article))
67
+ return;
68
+ const bookmark = {
69
+ id: article.id,
70
+ label: article.title,
71
+ source: article.collection[0],
72
+ author: article.authors?.[0],
73
+ queryName,
74
+ };
75
+ await this.updateBookmarks([...store.bookmarks(), bookmark], {
76
+ type: "Basket_AddDoc",
77
+ detail: {
78
+ docid: article.id
79
+ }
80
+ });
81
+ },
82
+ /**
83
+ * Removes a bookmark by its ID.
84
+ *
85
+ * @param id - The ID of the bookmark to remove.
86
+ * @returns A promise that resolves when the bookmark has been removed and the bookmarks have been updated.
87
+ *
88
+ * @remarks
89
+ * - If the provided ID is falsy, the function will return immediately.
90
+ * - If the bookmark with the given ID is not found, the function will return immediately.
91
+ * - The function updates the bookmarks and logs the removal action with a type of "Basket_RemoveDoc".
92
+ */
93
+ async unbookmark(id) {
94
+ if (!id)
95
+ return;
96
+ const bookmarks = store.bookmarks();
97
+ const index = bookmarks?.findIndex((bookmark) => bookmark.id === id);
98
+ if (index === -1)
99
+ return;
100
+ bookmarks.splice(index, 1);
101
+ await this.updateBookmarks([...bookmarks], {
102
+ type: "Basket_RemoveDoc",
103
+ detail: {
104
+ docid: id
105
+ }
106
+ });
107
+ },
108
+ /**
109
+ * Checks if the given article is bookmarked.
110
+ *
111
+ * @param article - An optional partial article object to check.
112
+ * @returns `true` if the article is bookmarked, `false` otherwise.
113
+ */
114
+ isBookmarked(article) {
115
+ if (!article || !article.id)
116
+ return false;
117
+ const bookmarks = store.bookmarks();
118
+ return !!bookmarks?.find((bookmark) => bookmark.id === article.id);
119
+ },
120
+ /**
121
+ * Toggles the bookmark status of a given article.
122
+ *
123
+ * This method checks if the article is currently bookmarked. If it is,
124
+ * it removes the bookmark. If it is not, it adds a bookmark.
125
+ *
126
+ * @param article - The article to toggle the bookmark status for.
127
+ * @returns A promise that resolves when the bookmark status has been toggled.
128
+ */
129
+ async toggleBookmark(article) {
130
+ const isBookmarked = await this.isBookmarked(article);
131
+ if (isBookmarked)
132
+ this.unbookmark(article.id);
133
+ else
134
+ this.bookmark(article);
135
+ },
136
+ })));
137
+ }
138
+ export function withRecentSearchFeatures() {
139
+ return signalStoreFeature(withState({ recentSearches: [] }), withMethods((store) => ({
140
+ /**
141
+ * Deletes a recent search entry from the user's recent searches list.
142
+ *
143
+ * @param {number} index - The index of the recent search to delete.
144
+ * @returns {Promise<void>} A promise that resolves when the recent search has been deleted and the state has been updated.
145
+ */
146
+ async deleteRecentSearch(index) {
147
+ const recentSearches = store.recentSearches();
148
+ if (recentSearches) {
149
+ const recentSearchToDelete = recentSearches.splice(index, 1)[0];
150
+ await patchUserSettings({ recentSearches }, {
151
+ type: "RecentQuery_Delete",
152
+ detail: {
153
+ recentQuery: recentSearchToDelete.queryParams?.text
154
+ }
155
+ });
156
+ patchState(store, (state) => {
157
+ return { ...state, recentSearches: [...recentSearches] };
158
+ });
159
+ }
160
+ },
161
+ /**
162
+ * Updates the recent searches in the user settings.
163
+ *
164
+ * @param recentSearches - An array of recent searches to be updated in the user settings.
165
+ * @param auditEvents - Optional audit events to be logged during the update.
166
+ * @returns A promise that resolves when the recent searches have been updated.
167
+ */
168
+ async updateRecentSearches(recentSearches, auditEvents) {
169
+ await patchUserSettings({ recentSearches }, auditEvents);
170
+ patchState(store, (state) => {
171
+ return { ...state, recentSearches: [...recentSearches] };
172
+ });
173
+ },
174
+ /**
175
+ * Adds the current search to the recent searches list.
176
+ *
177
+ * This method checks if a search with the same label already exists in the recent searches.
178
+ * If it does, it updates the existing search with the new query parameters and date.
179
+ * If it does not, it adds a new search to the recent searches list.
180
+ *
181
+ * @param queryParams - The parameters of the current search.
182
+ * @returns A promise that resolves when the recent searches have been updated.
183
+ */
184
+ async addCurrentSearch(queryParams) {
185
+ // fist search if the search is already in the recent searches with the same label
186
+ const recentSearches = store.recentSearches();
187
+ const existingSearch = recentSearches.find((search) => search.label === queryParams.text);
188
+ const url = window.location.hash.substring(1);
189
+ const path = url.split('?')[0];
190
+ if (existingSearch) {
191
+ await this.updateRecentSearches([
192
+ {
193
+ ...existingSearch,
194
+ date: new Date().toISOString(),
195
+ url,
196
+ path,
197
+ queryParams,
198
+ filterCount: queryParams.filters?.length
199
+ },
200
+ ...recentSearches.filter((search) => search.label !== queryParams.text),
201
+ ], {
202
+ type: "RecentQuery_Update",
203
+ detail: {
204
+ recentQuery: queryParams.text
205
+ }
206
+ });
207
+ }
208
+ else {
209
+ const recentSearch = {
210
+ url,
211
+ path,
212
+ display: queryParams.text,
213
+ label: queryParams.text,
214
+ filterCount: queryParams.filters?.length,
215
+ date: new Date().toISOString(),
216
+ queryParams
217
+ };
218
+ await this.updateRecentSearches([recentSearch, ...store.recentSearches()], {
219
+ type: "RecentQuery_Add",
220
+ detail: {
221
+ recentQuery: queryParams.text
222
+ }
223
+ });
224
+ }
225
+ },
226
+ })));
227
+ }
228
+ export function withSavedSearchFeatures() {
229
+ return signalStoreFeature(withState({ savedSearches: [] }), withMethods((store) => ({
230
+ async deleteSavedSearch(index) {
231
+ const savedSearches = store.savedSearches();
232
+ if (savedSearches) {
233
+ const savedSearchToDelete = savedSearches.splice(index, 1)[0];
234
+ await patchUserSettings({ savedSearches }, {
235
+ type: "SavedQuery_Delete",
236
+ detail: {
237
+ savedQuery: savedSearchToDelete.display
238
+ }
239
+ });
240
+ patchState(store, (state) => {
241
+ return { ...state, savedSearches: [...savedSearches] };
242
+ });
243
+ }
244
+ },
245
+ async updateSavedSearches(savedSearches) {
246
+ await patchUserSettings({ savedSearches }, {
247
+ type: "SavedQuery_Add",
248
+ detail: {
249
+ savedQuery: savedSearches[0].display
250
+ }
251
+ });
252
+ patchState(store, (state) => {
253
+ return { ...state, savedSearches: [...savedSearches] };
254
+ });
255
+ },
256
+ })));
257
+ }
258
+ function basketIndex(name, baskets) {
259
+ if (baskets?.length) {
260
+ for (let i = 0, ic = baskets.length; i < ic; i++) {
261
+ const basket = baskets[i];
262
+ if (basket && basket.name === name) {
263
+ return i;
264
+ }
265
+ }
266
+ }
267
+ return -1;
268
+ }
269
+ export function withBasketsFeatures() {
270
+ return signalStoreFeature(withState({ baskets: [] }), withMethods((store) => ({
271
+ async deleteBasket(index) {
272
+ const baskets = store.baskets();
273
+ if (baskets) {
274
+ const basketToDelete = baskets.splice(index, 1)[0];
275
+ await patchUserSettings({ baskets }, {
276
+ type: "Basket_Delete",
277
+ detail: {
278
+ savedQuery: basketToDelete.name
279
+ }
280
+ });
281
+ patchState(store, (state) => {
282
+ return { ...state, baskets: [...baskets] };
283
+ });
284
+ }
285
+ },
286
+ async createBasket(basket) {
287
+ const baskets = store.baskets();
288
+ if (basketIndex(basket.name) >= 0)
289
+ return;
290
+ baskets.unshift(basket);
291
+ await patchUserSettings({ baskets }, {
292
+ type: "Basket_Add",
293
+ detail: {
294
+ basket: basket.name
295
+ }
296
+ });
297
+ patchState(store, (state) => {
298
+ return { ...state, baskets: [...baskets] };
299
+ });
300
+ },
301
+ async updateBaskets(baskets) {
302
+ await patchUserSettings({ baskets }, {
303
+ type: "Basket_Update"
304
+ });
305
+ patchState(store, (state) => {
306
+ return { ...state, baskets: [...baskets] };
307
+ });
308
+ },
309
+ async updateBasket(basket, index) {
310
+ const baskets = store.baskets();
311
+ const prevIndex = basketIndex(basket.name, baskets);
312
+ if ((prevIndex !== -1 && index !== prevIndex) // A basket with the same name exists at a different index
313
+ || index < 0 || index >= baskets.length) // index out of bounds
314
+ return;
315
+ baskets.splice(index, 1, basket);
316
+ await patchUserSettings({ baskets }, {
317
+ type: "Basket_Update",
318
+ detail: {
319
+ basket: basket.name
320
+ }
321
+ });
322
+ patchState(store, (state) => {
323
+ return { ...state, baskets: [...baskets] };
324
+ });
325
+ },
326
+ async addToBasket(name, ids) {
327
+ const baskets = store.baskets();
328
+ const basket = baskets.find(b => b.name === name);
329
+ if (!ids || !basket)
330
+ return;
331
+ if (!basket.ids)
332
+ basket.ids = [];
333
+ ids = Array.isArray(ids) ? ids : [ids];
334
+ for (let id of ids) {
335
+ if (!basket.ids.some(i => i === id)) {
336
+ basket.ids.push(id);
337
+ }
338
+ }
339
+ await patchUserSettings({ baskets }, {
340
+ type: "Basket_AddDoc",
341
+ detail: {
342
+ basket: basket.name,
343
+ docid: ids[0]
344
+ }
345
+ });
346
+ patchState(store, (state) => {
347
+ return { ...state, baskets: [...baskets] };
348
+ });
349
+ },
350
+ async removeFromBasket(name, ids) {
351
+ const baskets = store.baskets();
352
+ const basket = baskets.find(b => b.name === name);
353
+ if (!ids || !basket)
354
+ return;
355
+ if (!basket.ids)
356
+ basket.ids = [];
357
+ ids = Array.isArray(ids) ? ids : [ids];
358
+ for (let id of ids) {
359
+ if (!basket.ids.some(i => i === id)) {
360
+ basket.ids.push(id);
361
+ }
362
+ }
363
+ await patchUserSettings({ baskets }, {
364
+ type: "Basket_AddDoc",
365
+ detail: {
366
+ basket: basket.name,
367
+ docid: ids[0]
368
+ }
369
+ });
370
+ patchState(store, (state) => {
371
+ return { ...state, baskets: [...baskets] };
372
+ });
373
+ },
374
+ })));
375
+ }
376
+ export function withAssistantFeatures() {
377
+ return signalStoreFeature(withState({ assistants: {} }), withMethods((store) => ({
378
+ async updateAssistantSettings(assistantSettings) {
379
+ patchState(store, (state) => {
380
+ return { ...state, assistants: assistantSettings };
381
+ });
382
+ },
383
+ async updateLanguage(language, auditEvents) {
384
+ await patchUserSettings({ language }, auditEvents);
385
+ patchState(store, (state) => {
386
+ return { ...state, language };
387
+ });
388
+ },
389
+ })));
390
+ }
391
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1zZXR0aW5ncy5zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F0b21pYy1hbmd1bGFyL3NyYy9saWIvc3RvcmVzL3VzZXItc2V0dGluZ3Muc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFcEcsT0FBTyxFQUF3QixrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBZSxNQUFNLGlCQUFpQixDQUFDO0FBTTlILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLFdBQVcsQ0FDMUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQ3RCLFlBQVksQ0FBQyxjQUFjLENBQUMsRUFFNUIsb0JBQW9CLEVBQUUsRUFDdEIsd0JBQXdCLEVBQUUsRUFDMUIsdUJBQXVCLEVBQUUsRUFDekIsbUJBQW1CLEVBQUUsRUFDckIscUJBQXFCLEVBQUUsRUFDdkIsd0JBQXdCLEVBQUUsQ0FDM0IsQ0FBQTtBQUVELE1BQU0sVUFBVSx3QkFBd0I7SUFDdEMsT0FBTyxrQkFBa0IsQ0FDdkIsU0FBUyxDQUFDLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBa0IsQ0FBQyxFQUVsRCxXQUFXLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEI7Ozs7O1dBS0c7UUFDSCxLQUFLLENBQUMsVUFBVTtZQUNkLG1GQUFtRjtZQUNuRixNQUFNLFFBQVEsR0FBRyxNQUFNLGlCQUFpQixFQUFnQixDQUFDO1lBQ3pELFVBQVUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUNEOzs7Ozs7OztXQVFHO1FBQ0gsS0FBSyxDQUFDLEtBQUs7WUFDVCwrQ0FBK0M7WUFDL0MsTUFBTSxrQkFBa0IsRUFBRSxDQUFDO1lBQzNCLFVBQVUsQ0FBQyxLQUFLLEVBQUU7Z0JBQ2hCLFNBQVMsRUFBRSxFQUFFO2dCQUNiLGNBQWMsRUFBRSxFQUFFO2dCQUNsQixhQUFhLEVBQUUsRUFBRTtnQkFDakIsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsVUFBVSxFQUFFLEVBQUU7Z0JBQ2QsUUFBUSxFQUFFLFNBQVM7YUFDSixDQUFDLENBQUM7UUFDckIsQ0FBQztLQUNGLENBQUMsQ0FBQyxDQUNKLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLG9CQUFvQjtJQUNsQyxPQUFPLGtCQUFrQixDQUN2QixTQUFTLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBK0IsRUFBRSxDQUFDLEVBRXpELFdBQVcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0Qjs7Ozs7O1dBTUc7UUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQW9DLEVBQUUsV0FBeUI7WUFDbkYsTUFBTSxpQkFBaUIsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3BELFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDMUIsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNqRCxDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUM7UUFDRDs7Ozs7O1dBTUc7UUFDSCxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQWdCLEVBQUUsU0FBa0I7WUFDakQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUFFLE9BQU87WUFFeEIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztnQkFBRSxPQUFPO1lBRXZDLE1BQU0sUUFBUSxHQUFHO2dCQUNmLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTtnQkFDZCxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7Z0JBQ3BCLE1BQU0sRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDN0IsTUFBTSxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzVCLFNBQVM7YUFDVixDQUFDO1lBQ0YsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUU7Z0JBQzNELElBQUksRUFBRSxlQUFlO2dCQUNyQixNQUFNLEVBQUU7b0JBQ04sS0FBSyxFQUFFLE9BQU8sQ0FBQyxFQUFFO2lCQUNsQjthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRDs7Ozs7Ozs7OztXQVVHO1FBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFVO1lBQ3pCLElBQUksQ0FBQyxFQUFFO2dCQUFFLE9BQU87WUFFaEIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sS0FBSyxHQUFHLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFFckUsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDO2dCQUFFLE9BQU87WUFFekIsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0IsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsRUFBRTtnQkFDekMsSUFBSSxFQUFFLGtCQUFrQjtnQkFDeEIsTUFBTSxFQUFFO29CQUNOLEtBQUssRUFBRSxFQUFFO2lCQUNWO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNEOzs7OztXQUtHO1FBQ0gsWUFBWSxDQUFDLE9BQXlCO1lBQ3BDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUMxQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFFcEMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUNEOzs7Ozs7OztXQVFHO1FBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFnQjtZQUNuQyxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFdEQsSUFBSSxZQUFZO2dCQUNkLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDOztnQkFFNUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQixDQUFDO0tBQ0YsQ0FBQyxDQUFDLENBQ0osQ0FBQTtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsd0JBQXdCO0lBQ3RDLE9BQU8sa0JBQWtCLENBQ3ZCLFNBQVMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxFQUFvQyxFQUFFLENBQUMsRUFFbkUsV0FBVyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCOzs7OztXQUtHO1FBQ0gsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQWE7WUFDcEMsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzlDLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sb0JBQW9CLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hFLE1BQU0saUJBQWlCLENBQUMsRUFBRSxjQUFjLEVBQUUsRUFBRTtvQkFDMUMsSUFBSSxFQUFFLG9CQUFvQjtvQkFDMUIsTUFBTSxFQUFFO3dCQUNOLFdBQVcsRUFBRSxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsSUFBSTtxQkFDcEQ7aUJBQ0YsQ0FBQyxDQUFDO2dCQUVILFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDMUIsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLGNBQWMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLEVBQUUsQ0FBQztnQkFDM0QsQ0FBQyxDQUFDLENBQUE7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUNEOzs7Ozs7V0FNRztRQUNILEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxjQUE4QyxFQUFFLFdBQXlCO1lBQ2xHLE1BQU0saUJBQWlCLENBQUMsRUFBRSxjQUFjLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUN6RCxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQzFCLE9BQU8sRUFBRSxHQUFHLEtBQUssRUFBRSxjQUFjLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDM0QsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDO1FBQ0Q7Ozs7Ozs7OztXQVNHO1FBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFdBQXdCO1lBQzdDLGtGQUFrRjtZQUNsRixNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDOUMsTUFBTSxjQUFjLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFMUYsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDbkIsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUM7b0JBQzlCO3dCQUNFLEdBQUcsY0FBYzt3QkFDakIsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO3dCQUM5QixHQUFHO3dCQUNILElBQUk7d0JBQ0osV0FBVzt3QkFDWCxXQUFXLEVBQUUsV0FBVyxDQUFDLE9BQU8sRUFBRSxNQUFNO3FCQUN6QztvQkFDRCxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssV0FBVyxDQUFDLElBQUksQ0FBQztpQkFDeEUsRUFBRTtvQkFDRCxJQUFJLEVBQUUsb0JBQW9CO29CQUMxQixNQUFNLEVBQUU7d0JBQ04sV0FBVyxFQUFFLFdBQVcsQ0FBQyxJQUFJO3FCQUM5QjtpQkFDRixDQUFDLENBQUM7WUFDTCxDQUFDO2lCQUNJLENBQUM7Z0JBQ0osTUFBTSxZQUFZLEdBQUc7b0JBQ25CLEdBQUc7b0JBQ0gsSUFBSTtvQkFDSixPQUFPLEVBQUUsV0FBVyxDQUFDLElBQUk7b0JBQ3pCLEtBQUssRUFBRSxXQUFXLENBQUMsSUFBSTtvQkFDdkIsV0FBVyxFQUFFLFdBQVcsQ0FBQyxPQUFPLEVBQUUsTUFBTTtvQkFDeEMsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO29CQUM5QixXQUFXO2lCQUNJLENBQUM7Z0JBRWxCLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsWUFBWSxFQUFFLEdBQUcsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLEVBQUU7b0JBQ3pFLElBQUksRUFBRSxpQkFBaUI7b0JBQ3ZCLE1BQU0sRUFBRTt3QkFDTixXQUFXLEVBQUUsV0FBVyxDQUFDLElBQUk7cUJBQzlCO2lCQUNGLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO0tBQ0YsQ0FBQyxDQUFDLENBQ0osQ0FBQTtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsdUJBQXVCO0lBQ3JDLE9BQU8sa0JBQWtCLENBQ3ZCLFNBQVMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxFQUFtQyxFQUFFLENBQUMsRUFFakUsV0FBVyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUFhO1lBQ25DLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM1QyxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUNsQixNQUFNLG1CQUFtQixHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLGlCQUFpQixDQUFDLEVBQUUsYUFBYSxFQUFFLEVBQUU7b0JBQ3pDLElBQUksRUFBRSxtQkFBbUI7b0JBQ3pCLE1BQU0sRUFBRTt3QkFDTixVQUFVLEVBQUUsbUJBQW1CLENBQUMsT0FBTztxQkFDeEM7aUJBQ0YsQ0FBQyxDQUFDO2dCQUVILFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDMUIsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDekQsQ0FBQyxDQUFDLENBQUE7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUNELEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxhQUE0QztZQUNwRSxNQUFNLGlCQUFpQixDQUFDLEVBQUUsYUFBYSxFQUFFLEVBQUU7Z0JBQ3pDLElBQUksRUFBRSxnQkFBZ0I7Z0JBQ3RCLE1BQU0sRUFBRTtvQkFDTixVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU87aUJBQ3JDO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUMxQixPQUFPLEVBQUUsR0FBRyxLQUFLLEVBQUUsYUFBYSxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQ3pELENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztLQUNGLENBQUMsQ0FBQyxDQUNKLENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsSUFBWSxFQUFFLE9BQWtCO0lBQ25ELElBQUksT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQ3BCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDbkMsT0FBTyxDQUFDLENBQUM7WUFDWCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ1osQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUI7SUFDakMsT0FBTyxrQkFBa0IsQ0FDdkIsU0FBUyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQTZCLEVBQUUsQ0FBQyxFQUNyRCxXQUFXLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEIsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFhO1lBQzlCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNoQyxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuRCxNQUFNLGlCQUFpQixDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUU7b0JBQ25DLElBQUksRUFBRSxlQUFlO29CQUNyQixNQUFNLEVBQUU7d0JBQ04sVUFBVSxFQUFFLGNBQWMsQ0FBQyxJQUFJO3FCQUNoQztpQkFDRixDQUFDLENBQUM7Z0JBQ0gsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUMxQixPQUFPLEVBQUUsR0FBRyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUM7UUFDSCxDQUFDO1FBQ0QsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFjO1lBQy9CLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNoQyxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFBRSxPQUFPO1lBQzFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEIsTUFBTSxpQkFBaUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFO2dCQUNuQyxJQUFJLEVBQUUsWUFBWTtnQkFDbEIsTUFBTSxFQUFFO29CQUNOLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSTtpQkFDcEI7YUFDRixDQUFDLENBQUM7WUFDSCxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQzFCLE9BQU8sRUFBRSxHQUFHLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDN0MsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDO1FBQ0QsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFnQztZQUNsRCxNQUFNLGlCQUFpQixDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUU7Z0JBQ25DLElBQUksRUFBRSxlQUFlO2FBQ3RCLENBQUMsQ0FBQztZQUNILFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDMUIsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM3QyxDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUM7UUFDRCxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQWMsRUFBRSxLQUFhO1lBQzlDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNoQyxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBRSwwREFBMEQ7bUJBQ3BHLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsc0JBQXNCO2dCQUMvRCxPQUFPO1lBRVQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRWpDLE1BQU0saUJBQWlCLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRTtnQkFDbkMsSUFBSSxFQUFFLGVBQWU7Z0JBQ3JCLE1BQU0sRUFBRTtvQkFDTixNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUk7aUJBQ3BCO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUMxQixPQUFPLEVBQUUsR0FBRyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzdDLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUNELEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBWSxFQUFFLEdBQXNCO1lBQ3BELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNoQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTTtnQkFBRSxPQUFPO1lBRTVCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRztnQkFBRSxNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUVqQyxHQUFHLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLEtBQUssSUFBSSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO29CQUNwQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdEIsQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLGlCQUFpQixDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUU7Z0JBQ25DLElBQUksRUFBRSxlQUFlO2dCQUNyQixNQUFNLEVBQUU7b0JBQ0osTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJO29CQUNuQixLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztpQkFDaEI7YUFDRixDQUFDLENBQUM7WUFDSCxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQzFCLE9BQU8sRUFBRSxHQUFHLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDN0MsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDO1FBQ0QsS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQVksRUFBRSxHQUFzQjtZQUN6RCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDaEMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU07Z0JBQUUsT0FBTztZQUU1QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUc7Z0JBQUUsTUFBTSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFFakMsR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QyxLQUFLLElBQUksRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztvQkFDcEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3RCLENBQUM7WUFDSCxDQUFDO1lBRUQsTUFBTSxpQkFBaUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFO2dCQUNuQyxJQUFJLEVBQUUsZUFBZTtnQkFDckIsTUFBTSxFQUFFO29CQUNKLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSTtvQkFDbkIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQ2hCO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUMxQixPQUFPLEVBQUUsR0FBRyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzdDLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztLQUNGLENBQUMsQ0FBQyxDQUNKLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQjtJQUNuQyxPQUFPLGtCQUFrQixDQUN2QixTQUFTLENBQUMsRUFBRSxVQUFVLEVBQUUsRUFBZ0MsRUFBRSxDQUFDLEVBQzNELFdBQVcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0QixLQUFLLENBQUMsdUJBQXVCLENBQUMsaUJBQTZDO1lBQ3pFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDMUIsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3JELENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUVELEtBQUssQ0FBQyxjQUFjLENBQUMsUUFBa0MsRUFBRSxXQUF5QjtZQUNoRixNQUFNLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDbkQsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUMxQixPQUFPLEVBQUUsR0FBRyxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDO0tBQ0YsQ0FBQyxDQUFDLENBQ0osQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB3aXRoRGV2dG9vbHMgfSBmcm9tICdAYW5ndWxhci1hcmNoaXRlY3RzL25ncngtdG9vbGtpdCc7XG5pbXBvcnQgeyBwYXRjaFN0YXRlLCBzaWduYWxTdG9yZSwgc2lnbmFsU3RvcmVGZWF0dXJlLCB3aXRoTWV0aG9kcywgd2l0aFN0YXRlIH0gZnJvbSAnQG5ncngvc2lnbmFscyc7XG5cbmltcG9ydCB7IEFydGljbGUsIEF1ZGl0RXZlbnRzLCBkZWxldGVVc2VyU2V0dGluZ3MsIGZldGNoVXNlclNldHRpbmdzLCBwYXRjaFVzZXJTZXR0aW5ncywgUXVlcnlQYXJhbXMgfSBmcm9tICdAc2luZXF1YS9hdG9taWMnO1xuXG5pbXBvcnQgeyBCYXNrZXQsIFJlY2VudFNlYXJjaCwgVXNlclNldHRpbmdzIH0gZnJvbSAnLi4vbW9kZWxzL3VzZXItc2V0dGluZ3MnO1xuXG5leHBvcnQgdHlwZSBVc2VyU2V0dGluZ3NTdGF0ZSA9IFVzZXJTZXR0aW5ncztcblxuZXhwb3J0IGNvbnN0IFVzZXJTZXR0aW5nc1N0b3JlID0gc2lnbmFsU3RvcmUoXG4gIHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0sXG4gIHdpdGhEZXZ0b29scygnVXNlclNldHRpbmdzJyksXG5cbiAgd2l0aEJvb2ttYXJrRmVhdHVyZXMoKSxcbiAgd2l0aFJlY2VudFNlYXJjaEZlYXR1cmVzKCksXG4gIHdpdGhTYXZlZFNlYXJjaEZlYXR1cmVzKCksXG4gIHdpdGhCYXNrZXRzRmVhdHVyZXMoKSxcbiAgd2l0aEFzc2lzdGFudEZlYXR1cmVzKCksXG4gIHdpdGhVc2VyU2V0dGluZ3NGZWF0dXJlcygpLFxuKVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFVzZXJTZXR0aW5nc0ZlYXR1cmVzKCkge1xuICByZXR1cm4gc2lnbmFsU3RvcmVGZWF0dXJlKFxuICAgIHdpdGhTdGF0ZSh7IGxhbmd1YWdlOiB1bmRlZmluZWQgfSBhcyBVc2VyU2V0dGluZ3MpLFxuXG4gICAgd2l0aE1ldGhvZHMoKHN0b3JlKSA9PiAoe1xuICAgICAgLyoqXG4gICAgICAgKiBJbml0aWFsaXplcyB0aGUgdXNlciBzZXR0aW5ncyBzdG9yZSBieSBmZXRjaGluZyB0aGUgdXNlciBzZXR0aW5ncyBmcm9tIHRoZSBiYWNrZW5kIEFQSVxuICAgICAgICogYW5kIHBhdGNoaW5nIHRoZSBzdG9yZSB3aXRoIHRoZSByZXRyaWV2ZWQgc2V0dGluZ3MuXG4gICAgICAgKlxuICAgICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlLlxuICAgICAgICovXG4gICAgICBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBGZXRjaCB0aGUgdXNlciBzZXR0aW5ncyBmcm9tIHRoZSBiYWNrZW5kIEFQSSBhbmQgcGF0Y2ggdGhlIHN0b3JlIHdpdGggdGhlIHJlc3VsdFxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGF3YWl0IGZldGNoVXNlclNldHRpbmdzPFVzZXJTZXR0aW5ncz4oKTtcbiAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0dGluZ3MpO1xuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogUmVzZXRzIHRoZSB1c2VyIHNldHRpbmdzIHRvIHRoZSBpbml0aWFsIHN0YXRlLlxuICAgICAgICpcbiAgICAgICAqIFRoaXMgbWV0aG9kIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgYWN0aW9uczpcbiAgICAgICAqIDEuIERlbGV0ZXMgdGhlIGN1cnJlbnQgdXNlciBzZXR0aW5ncy5cbiAgICAgICAqIDIuIFBhdGNoZXMgdGhlIHN0YXRlIHdpdGggdGhlIGluaXRpYWwgc3RhdGUuXG4gICAgICAgKlxuICAgICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHJlc2V0IG9wZXJhdGlvbiBpcyBjb21wbGV0ZS5cbiAgICAgICAqL1xuICAgICAgYXN5bmMgcmVzZXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIFJlc2V0IHRoZSB1c2VyIHNldHRpbmdzIHRvIHRoZSBpbml0aWFsIHN0YXRlXG4gICAgICAgIGF3YWl0IGRlbGV0ZVVzZXJTZXR0aW5ncygpO1xuICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCB7XG4gICAgICAgICAgYm9va21hcmtzOiBbXSxcbiAgICAgICAgICByZWNlbnRTZWFyY2hlczogW10sXG4gICAgICAgICAgc2F2ZWRTZWFyY2hlczogW10sXG4gICAgICAgICAgYmFza2V0czogW10sXG4gICAgICAgICAgYXNzaXN0YW50czoge30sXG4gICAgICAgICAgbGFuZ3VhZ2U6IHVuZGVmaW5lZCxcbiAgICAgICAgfSBhcyBVc2VyU2V0dGluZ3MpO1xuICAgICAgfSxcbiAgICB9KSksXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhCb29rbWFya0ZlYXR1cmVzKCkge1xuICByZXR1cm4gc2lnbmFsU3RvcmVGZWF0dXJlKFxuICAgIHdpdGhTdGF0ZSh7IGJvb2ttYXJrczogW10gYXMgVXNlclNldHRpbmdzWydib29rbWFya3MnXSB9KSxcblxuICAgIHdpdGhNZXRob2RzKChzdG9yZSkgPT4gKHtcbiAgICAgIC8qKlxuICAgICAgICogVXBkYXRlcyB0aGUgdXNlcidzIGJvb2ttYXJrcyBpbiB0aGUgc3RvcmUgYW5kIG9wdGlvbmFsbHkgbG9ncyBhdWRpdCBldmVudHMuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGJvb2ttYXJrcyAtIEFuIGFycmF5IG9mIGJvb2ttYXJrcyB0byB1cGRhdGUgaW4gdGhlIHVzZXIgc2V0dGluZ3MuXG4gICAgICAgKiBAcGFyYW0gYXVkaXRFdmVudHMgLSBPcHRpb25hbCBhdWRpdCBldmVudHMgdG8gbG9nIGR1cmluZyB0aGUgdXBkYXRlLlxuICAgICAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdXBkYXRlIGlzIGNvbXBsZXRlLlxuICAgICAgICovXG4gICAgICBhc3luYyB1cGRhdGVCb29rbWFya3MoYm9va21hcmtzOiBVc2VyU2V0dGluZ3NbJ2Jvb2ttYXJrcyddLCBhdWRpdEV2ZW50cz86IEF1ZGl0RXZlbnRzKSB7XG4gICAgICAgIGF3YWl0IHBhdGNoVXNlclNldHRpbmdzKHsgYm9va21hcmtzIH0sIGF1ZGl0RXZlbnRzKTtcbiAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgKHN0YXRlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIGJvb2ttYXJrczogWy4uLmJvb2ttYXJrc10gfTtcbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIEFkZHMgYW4gYXJ0aWNsZSB0byB0aGUgYm9va21hcmtzIGlmIGl0IGlzIG5vdCBhbHJlYWR5IGJvb2ttYXJrZWQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGFydGljbGUgLSBUaGUgYXJ0aWNsZSB0byBiZSBib29rbWFya2VkLlxuICAgICAgICogQHBhcmFtIHF1ZXJ5TmFtZSAtIE9wdGlvbmFsIG5hbWUgb2YgdGhlIHF1ZXJ5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYm9va21hcmsuXG4gICAgICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBib29rbWFyayBoYXMgYmVlbiBhZGRlZC5cbiAgICAgICAqL1xuICAgICAgYXN5bmMgYm9va21hcmsoYXJ0aWNsZTogQXJ0aWNsZSwgcXVlcnlOYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIGlmICghYXJ0aWNsZS5pZCkgcmV0dXJuO1xuXG4gICAgICAgIGlmICh0aGlzLmlzQm9va21hcmtlZChhcnRpY2xlKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGJvb2ttYXJrID0ge1xuICAgICAgICAgIGlkOiBhcnRpY2xlLmlkLFxuICAgICAgICAgIGxhYmVsOiBhcnRpY2xlLnRpdGxlLFxuICAgICAgICAgIHNvdXJjZTogYXJ0aWNsZS5jb2xsZWN0aW9uWzBdLFxuICAgICAgICAgIGF1dGhvcjogYXJ0aWNsZS5hdXRob3JzPy5bMF0sXG4gICAgICAgICAgcXVlcnlOYW1lLFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZUJvb2ttYXJrcyhbLi4uc3RvcmUuYm9va21hcmtzKCksIGJvb2ttYXJrXSwge1xuICAgICAgICAgIHR5cGU6IFwiQmFza2V0X0FkZERvY1wiLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgZG9jaWQ6IGFydGljbGUuaWRcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlcyBhIGJvb2ttYXJrIGJ5IGl0cyBJRC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIGJvb2ttYXJrIHRvIHJlbW92ZS5cbiAgICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJvb2ttYXJrIGhhcyBiZWVuIHJlbW92ZWQgYW5kIHRoZSBib29rbWFya3MgaGF2ZSBiZWVuIHVwZGF0ZWQuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIC0gSWYgdGhlIHByb3ZpZGVkIElEIGlzIGZhbHN5LCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkuXG4gICAgICAgKiAtIElmIHRoZSBib29rbWFyayB3aXRoIHRoZSBnaXZlbiBJRCBpcyBub3QgZm91bmQsIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBpbW1lZGlhdGVseS5cbiAgICAgICAqIC0gVGhlIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIGJvb2ttYXJrcyBhbmQgbG9ncyB0aGUgcmVtb3ZhbCBhY3Rpb24gd2l0aCBhIHR5cGUgb2YgXCJCYXNrZXRfUmVtb3ZlRG9jXCIuXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIHVuYm9va21hcmsoaWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIWlkKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgYm9va21hcmtzID0gc3RvcmUuYm9va21hcmtzKCk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gYm9va21hcmtzPy5maW5kSW5kZXgoKGJvb2ttYXJrKSA9PiBib29rbWFyay5pZCA9PT0gaWQpO1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHJldHVybjtcblxuICAgICAgICBib29rbWFya3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVCb29rbWFya3MoWy4uLmJvb2ttYXJrc10sIHtcbiAgICAgICAgICB0eXBlOiBcIkJhc2tldF9SZW1vdmVEb2NcIixcbiAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgIGRvY2lkOiBpZFxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGFydGljbGUgaXMgYm9va21hcmtlZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gYXJ0aWNsZSAtIEFuIG9wdGlvbmFsIHBhcnRpYWwgYXJ0aWNsZSBvYmplY3QgdG8gY2hlY2suXG4gICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFydGljbGUgaXMgYm9va21hcmtlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICAgKi9cbiAgICAgIGlzQm9va21hcmtlZChhcnRpY2xlOiBQYXJ0aWFsPEFydGljbGU+KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghYXJ0aWNsZSB8fCAhYXJ0aWNsZS5pZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBib29rbWFya3MgPSBzdG9yZS5ib29rbWFya3MoKTtcblxuICAgICAgICByZXR1cm4gISFib29rbWFya3M/LmZpbmQoKGJvb2ttYXJrKSA9PiBib29rbWFyay5pZCA9PT0gYXJ0aWNsZS5pZCk7XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBUb2dnbGVzIHRoZSBib29rbWFyayBzdGF0dXMgb2YgYSBnaXZlbiBhcnRpY2xlLlxuICAgICAgICpcbiAgICAgICAqIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiB0aGUgYXJ0aWNsZSBpcyBjdXJyZW50bHkgYm9va21hcmtlZC4gSWYgaXQgaXMsXG4gICAgICAgKiBpdCByZW1vdmVzIHRoZSBib29rbWFyay4gSWYgaXQgaXMgbm90LCBpdCBhZGRzIGEgYm9va21hcmsuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGFydGljbGUgLSBUaGUgYXJ0aWNsZSB0byB0b2dnbGUgdGhlIGJvb2ttYXJrIHN0YXR1cyBmb3IuXG4gICAgICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBib29rbWFyayBzdGF0dXMgaGFzIGJlZW4gdG9nZ2xlZC5cbiAgICAgICAqL1xuICAgICAgYXN5bmMgdG9nZ2xlQm9va21hcmsoYXJ0aWNsZTogQXJ0aWNsZSkge1xuICAgICAgICBjb25zdCBpc0Jvb2ttYXJrZWQgPSBhd2FpdCB0aGlzLmlzQm9va21hcmtlZChhcnRpY2xlKTtcblxuICAgICAgICBpZiAoaXNCb29rbWFya2VkKVxuICAgICAgICAgIHRoaXMudW5ib29rbWFyayhhcnRpY2xlLmlkKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHRoaXMuYm9va21hcmsoYXJ0aWNsZSk7XG4gICAgICB9LFxuICAgIH0pKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUmVjZW50U2VhcmNoRmVhdHVyZXMoKSB7XG4gIHJldHVybiBzaWduYWxTdG9yZUZlYXR1cmUoXG4gICAgd2l0aFN0YXRlKHsgcmVjZW50U2VhcmNoZXM6IFtdIGFzIFVzZXJTZXR0aW5nc1sncmVjZW50U2VhcmNoZXMnXSB9KSxcblxuICAgIHdpdGhNZXRob2RzKChzdG9yZSkgPT4gKHtcbiAgICAgIC8qKlxuICAgICAgICogRGVsZXRlcyBhIHJlY2VudCBzZWFyY2ggZW50cnkgZnJvbSB0aGUgdXNlcidzIHJlY2VudCBzZWFyY2hlcyBsaXN0LlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgcmVjZW50IHNlYXJjaCB0byBkZWxldGUuXG4gICAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVjZW50IHNlYXJjaCBoYXMgYmVlbiBkZWxldGVkIGFuZCB0aGUgc3RhdGUgaGFzIGJlZW4gdXBkYXRlZC5cbiAgICAgICAqL1xuICAgICAgYXN5bmMgZGVsZXRlUmVjZW50U2VhcmNoKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcmVjZW50U2VhcmNoZXMgPSBzdG9yZS5yZWNlbnRTZWFyY2hlcygpO1xuICAgICAgICBpZiAocmVjZW50U2VhcmNoZXMpIHtcbiAgICAgICAgICBjb25zdCByZWNlbnRTZWFyY2hUb0RlbGV0ZSA9IHJlY2VudFNlYXJjaGVzLnNwbGljZShpbmRleCwgMSlbMF07XG4gICAgICAgICAgYXdhaXQgcGF0Y2hVc2VyU2V0dGluZ3MoeyByZWNlbnRTZWFyY2hlcyB9LCB7XG4gICAgICAgICAgICB0eXBlOiBcIlJlY2VudFF1ZXJ5X0RlbGV0ZVwiLFxuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgIHJlY2VudFF1ZXJ5OiByZWNlbnRTZWFyY2hUb0RlbGV0ZS5xdWVyeVBhcmFtcz8udGV4dFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgKHN0YXRlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgcmVjZW50U2VhcmNoZXM6IFsuLi5yZWNlbnRTZWFyY2hlc10gfTtcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBVcGRhdGVzIHRoZSByZWNlbnQgc2VhcmNoZXMgaW4gdGhlIHVzZXIgc2V0dGluZ3MuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHJlY2VudFNlYXJjaGVzIC0gQW4gYXJyYXkgb2YgcmVjZW50IHNlYXJjaGVzIHRvIGJlIHVwZGF0ZWQgaW4gdGhlIHVzZXIgc2V0dGluZ3MuXG4gICAgICAgKiBAcGFyYW0gYXVkaXRFdmVudHMgLSBPcHRpb25hbCBhdWRpdCBldmVudHMgdG8gYmUgbG9nZ2VkIGR1cmluZyB0aGUgdXBkYXRlLlxuICAgICAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVjZW50IHNlYXJjaGVzIGhhdmUgYmVlbiB1cGRhdGVkLlxuICAgICAgICovXG4gICAgICBhc3luYyB1cGRhdGVSZWNlbnRTZWFyY2hlcyhyZWNlbnRTZWFyY2hlczogVXNlclNldHRpbmdzWydyZWNlbnRTZWFyY2hlcyddLCBhdWRpdEV2ZW50cz86IEF1ZGl0RXZlbnRzKSB7XG4gICAgICAgIGF3YWl0IHBhdGNoVXNlclNldHRpbmdzKHsgcmVjZW50U2VhcmNoZXMgfSwgYXVkaXRFdmVudHMpO1xuICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCAoc3RhdGUpID0+IHtcbiAgICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgcmVjZW50U2VhcmNoZXM6IFsuLi5yZWNlbnRTZWFyY2hlc10gfTtcbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIEFkZHMgdGhlIGN1cnJlbnQgc2VhcmNoIHRvIHRoZSByZWNlbnQgc2VhcmNoZXMgbGlzdC5cbiAgICAgICAqXG4gICAgICAgKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgYSBzZWFyY2ggd2l0aCB0aGUgc2FtZSBsYWJlbCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgcmVjZW50IHNlYXJjaGVzLlxuICAgICAgICogSWYgaXQgZG9lcywgaXQgdXBkYXRlcyB0aGUgZXhpc3Rpbmcgc2VhcmNoIHdpdGggdGhlIG5ldyBxdWVyeSBwYXJhbWV0ZXJzIGFuZCBkYXRlLlxuICAgICAgICogSWYgaXQgZG9lcyBub3QsIGl0IGFkZHMgYSBuZXcgc2VhcmNoIHRvIHRoZSByZWNlbnQgc2VhcmNoZXMgbGlzdC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gcXVlcnlQYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBvZiB0aGUgY3VycmVudCBzZWFyY2guXG4gICAgICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByZWNlbnQgc2VhcmNoZXMgaGF2ZSBiZWVuIHVwZGF0ZWQuXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIGFkZEN1cnJlbnRTZWFyY2gocXVlcnlQYXJhbXM6IFF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIC8vIGZpc3Qgc2VhcmNoIGlmIHRoZSBzZWFyY2ggaXMgYWxyZWFkeSBpbiB0aGUgcmVjZW50IHNlYXJjaGVzIHdpdGggdGhlIHNhbWUgbGFiZWxcbiAgICAgICAgY29uc3QgcmVjZW50U2VhcmNoZXMgPSBzdG9yZS5yZWNlbnRTZWFyY2hlcygpO1xuICAgICAgICBjb25zdCBleGlzdGluZ1NlYXJjaCA9IHJlY2VudFNlYXJjaGVzLmZpbmQoKHNlYXJjaCkgPT4gc2VhcmNoLmxhYmVsID09PSBxdWVyeVBhcmFtcy50ZXh0KTtcblxuICAgICAgICBjb25zdCB1cmwgPSB3aW5kb3cubG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSk7XG4gICAgICAgIGNvbnN0IHBhdGggPSB1cmwuc3BsaXQoJz8nKVswXTtcbiAgICAgICAgaWYgKGV4aXN0aW5nU2VhcmNoKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVSZWNlbnRTZWFyY2hlcyhbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLmV4aXN0aW5nU2VhcmNoLFxuICAgICAgICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgcXVlcnlQYXJhbXMsXG4gICAgICAgICAgICAgIGZpbHRlckNvdW50OiBxdWVyeVBhcmFtcy5maWx0ZXJzPy5sZW5ndGhcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi5yZWNlbnRTZWFyY2hlcy5maWx0ZXIoKHNlYXJjaCkgPT4gc2VhcmNoLmxhYmVsICE9PSBxdWVyeVBhcmFtcy50ZXh0KSxcbiAgICAgICAgICBdLCB7XG4gICAgICAgICAgICB0eXBlOiBcIlJlY2VudFF1ZXJ5X1VwZGF0ZVwiLFxuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgIHJlY2VudFF1ZXJ5OiBxdWVyeVBhcmFtcy50ZXh0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29uc3QgcmVjZW50U2VhcmNoID0ge1xuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIGRpc3BsYXk6IHF1ZXJ5UGFyYW1zLnRleHQsXG4gICAgICAgICAgICBsYWJlbDogcXVlcnlQYXJhbXMudGV4dCxcbiAgICAgICAgICAgIGZpbHRlckNvdW50OiBxdWVyeVBhcmFtcy5maWx0ZXJzPy5sZW5ndGgsXG4gICAgICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICBxdWVyeVBhcmFtc1xuICAgICAgICAgIH0gYXMgUmVjZW50U2VhcmNoO1xuXG4gICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVSZWNlbnRTZWFyY2hlcyhbcmVjZW50U2VhcmNoLCAuLi5zdG9yZS5yZWNlbnRTZWFyY2hlcygpXSwge1xuICAgICAgICAgICAgdHlwZTogXCJSZWNlbnRRdWVyeV9BZGRcIixcbiAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICByZWNlbnRRdWVyeTogcXVlcnlQYXJhbXMudGV4dFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoU2F2ZWRTZWFyY2hGZWF0dXJlcygpIHtcbiAgcmV0dXJuIHNpZ25hbFN0b3JlRmVhdHVyZShcbiAgICB3aXRoU3RhdGUoeyBzYXZlZFNlYXJjaGVzOiBbXSBhcyBVc2VyU2V0dGluZ3NbJ3NhdmVkU2VhcmNoZXMnXSB9KSxcblxuICAgIHdpdGhNZXRob2RzKChzdG9yZSkgPT4gKHtcbiAgICAgIGFzeW5jIGRlbGV0ZVNhdmVkU2VhcmNoKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3Qgc2F2ZWRTZWFyY2hlcyA9IHN0b3JlLnNhdmVkU2VhcmNoZXMoKTtcbiAgICAgICAgaWYgKHNhdmVkU2VhcmNoZXMpIHtcbiAgICAgICAgICBjb25zdCBzYXZlZFNlYXJjaFRvRGVsZXRlID0gc2F2ZWRTZWFyY2hlcy5zcGxpY2UoaW5kZXgsIDEpWzBdO1xuICAgICAgICAgIGF3YWl0IHBhdGNoVXNlclNldHRpbmdzKHsgc2F2ZWRTZWFyY2hlcyB9LCB7XG4gICAgICAgICAgICB0eXBlOiBcIlNhdmVkUXVlcnlfRGVsZXRlXCIsXG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgc2F2ZWRRdWVyeTogc2F2ZWRTZWFyY2hUb0RlbGV0ZS5kaXNwbGF5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCAoc3RhdGUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IC4uLnN0YXRlLCBzYXZlZFNlYXJjaGVzOiBbLi4uc2F2ZWRTZWFyY2hlc10gfTtcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXN5bmMgdXBkYXRlU2F2ZWRTZWFyY2hlcyhzYXZlZFNlYXJjaGVzOiBVc2VyU2V0dGluZ3NbJ3NhdmVkU2VhcmNoZXMnXSkge1xuICAgICAgICBhd2FpdCBwYXRjaFVzZXJTZXR0aW5ncyh7IHNhdmVkU2VhcmNoZXMgfSwge1xuICAgICAgICAgIHR5cGU6IFwiU2F2ZWRRdWVyeV9BZGRcIixcbiAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgIHNhdmVkUXVlcnk6IHNhdmVkU2VhcmNoZXNbMF0uZGlzcGxheVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIChzdGF0ZSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7IC4uLnN0YXRlLCBzYXZlZFNlYXJjaGVzOiBbLi4uc2F2ZWRTZWFyY2hlc10gfTtcbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgfSkpXG4gIClcbn1cblxuZnVuY3Rpb24gYmFza2V0SW5kZXgobmFtZTogc3RyaW5nLCBiYXNrZXRzPzogQmFza2V0W10pOiBudW1iZXIge1xuICBpZiAoYmFza2V0cz8ubGVuZ3RoKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIGljID0gYmFza2V0cy5sZW5ndGg7IGkgPCBpYzsgaSsrKSB7XG4gICAgICBjb25zdCBiYXNrZXQgPSBiYXNrZXRzW2ldO1xuICAgICAgaWYgKGJhc2tldCAmJiBiYXNrZXQubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aEJhc2tldHNGZWF0dXJlcygpIHtcbiAgcmV0dXJuIHNpZ25hbFN0b3JlRmVhdHVyZShcbiAgICB3aXRoU3RhdGUoeyBiYXNrZXRzOiBbXSBhcyBVc2VyU2V0dGluZ3NbJ2Jhc2tldHMnXSB9KSxcbiAgICB3aXRoTWV0aG9kcygoc3RvcmUpID0+ICh7XG4gICAgICBhc3luYyBkZWxldGVCYXNrZXQoaW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCBiYXNrZXRzID0gc3RvcmUuYmFza2V0cygpO1xuICAgICAgICBpZiAoYmFza2V0cykge1xuICAgICAgICAgIGNvbnN0IGJhc2tldFRvRGVsZXRlID0gYmFza2V0cy5zcGxpY2UoaW5kZXgsIDEpWzBdO1xuICAgICAgICAgIGF3YWl0IHBhdGNoVXNlclNldHRpbmdzKHsgYmFza2V0cyB9LCB7XG4gICAgICAgICAgICB0eXBlOiBcIkJhc2tldF9EZWxldGVcIixcbiAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICBzYXZlZFF1ZXJ5OiBiYXNrZXRUb0RlbGV0ZS5uYW1lXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgKHN0YXRlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgYmFza2V0czogWy4uLmJhc2tldHNdIH07XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFzeW5jIGNyZWF0ZUJhc2tldChiYXNrZXQ6IEJhc2tldCkge1xuICAgICAgICBjb25zdCBiYXNrZXRzID0gc3RvcmUuYmFza2V0cygpO1xuICAgICAgICBpZiAoYmFza2V0SW5kZXgoYmFza2V0Lm5hbWUpID49IDApIHJldHVybjtcbiAgICAgICAgYmFza2V0cy51bnNoaWZ0KGJhc2tldCk7XG4gICAgICAgIGF3YWl0IHBhdGNoVXNlclNldHRpbmdzKHsgYmFza2V0cyB9LCB7XG4gICAgICAgICAgdHlwZTogXCJCYXNrZXRfQWRkXCIsXG4gICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICBiYXNrZXQ6IGJhc2tldC5uYW1lXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgKHN0YXRlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIGJhc2tldHM6IFsuLi5iYXNrZXRzXSB9O1xuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIGFzeW5jIHVwZGF0ZUJhc2tldHMoYmFza2V0czogVXNlclNldHRpbmdzWydiYXNrZXRzJ10pIHtcbiAgICAgICAgYXdhaXQgcGF0Y2hVc2VyU2V0dGluZ3MoeyBiYXNrZXRzIH0sIHtcbiAgICAgICAgICB0eXBlOiBcIkJhc2tldF9VcGRhdGVcIlxuICAgICAgICB9KTtcbiAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgKHN0YXRlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIGJhc2tldHM6IFsuLi5iYXNrZXRzXSB9O1xuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIGFzeW5jIHVwZGF0ZUJhc2tldChiYXNrZXQ6IEJhc2tldCwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCBiYXNrZXRzID0gc3RvcmUuYmFza2V0cygpO1xuICAgICAgICBjb25zdCBwcmV2SW5kZXggPSBiYXNrZXRJbmRleChiYXNrZXQubmFtZSwgYmFza2V0cyk7XG4gICAgICAgIGlmICgocHJldkluZGV4ICE9PSAtMSAmJiBpbmRleCAhPT0gcHJldkluZGV4KSAgLy8gQSBiYXNrZXQgd2l0aCB0aGUgc2FtZSBuYW1lIGV4aXN0cyBhdCBhIGRpZmZlcmVudCBpbmRleFxuICAgICAgICAgIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+PSBiYXNrZXRzLmxlbmd0aCkgLy8gaW5kZXggb3V0IG9mIGJvdW5kc1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBiYXNrZXRzLnNwbGljZShpbmRleCwgMSwgYmFza2V0KTtcblxuICAgICAgICBhd2FpdCBwYXRjaFVzZXJTZXR0aW5ncyh7IGJhc2tldHMgfSwge1xuICAgICAgICAgIHR5cGU6IFwiQmFza2V0X1VwZGF0ZVwiLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgYmFza2V0OiBiYXNrZXQubmFtZVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIChzdGF0ZSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7IC4uLnN0YXRlLCBiYXNrZXRzOiBbLi4uYmFza2V0c10gfTtcbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICBhc3luYyBhZGRUb0Jhc2tldChuYW1lOiBzdHJpbmcsIGlkczogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3QgYmFza2V0cyA9IHN0b3JlLmJhc2tldHMoKTtcbiAgICAgICAgY29uc3QgYmFza2V0ID0gYmFza2V0cy5maW5kKGIgPT4gYi5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgaWYgKCFpZHMgfHwgIWJhc2tldCkgcmV0dXJuO1xuXG4gICAgICAgIGlmICghYmFza2V0LmlkcykgYmFza2V0LmlkcyA9IFtdO1xuXG4gICAgICAgIGlkcyA9IEFycmF5LmlzQXJyYXkoaWRzKT8gaWRzIDogW2lkc107XG4gICAgICAgIGZvciAobGV0IGlkIG9mIGlkcykge1xuICAgICAgICAgIGlmICghYmFza2V0Lmlkcy5zb21lKGkgPT4gaSA9PT0gaWQpKSB7XG4gICAgICAgICAgICBiYXNrZXQuaWRzLnB1c2goaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHBhdGNoVXNlclNldHRpbmdzKHsgYmFza2V0cyB9LCB7XG4gICAgICAgICAgdHlwZTogXCJCYXNrZXRfQWRkRG9jXCIsXG4gICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgIGJhc2tldDogYmFza2V0Lm5hbWUsXG4gICAgICAgICAgICAgIGRvY2lkOiBpZHNbMF1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCAoc3RhdGUpID0+IHtcbiAgICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgYmFza2V0czogWy4uLmJhc2tldHNdIH07XG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgYXN5bmMgcmVtb3ZlRnJvbUJhc2tldChuYW1lOiBzdHJpbmcsIGlkczogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3QgYmFza2V0cyA9IHN0b3JlLmJhc2tldHMoKTtcbiAgICAgICAgY29uc3QgYmFza2V0ID0gYmFza2V0cy5maW5kKGIgPT4gYi5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgaWYgKCFpZHMgfHwgIWJhc2tldCkgcmV0dXJuO1xuXG4gICAgICAgIGlmICghYmFza2V0LmlkcykgYmFza2V0LmlkcyA9IFtdO1xuXG4gICAgICAgIGlkcyA9IEFycmF5LmlzQXJyYXkoaWRzKT8gaWRzIDogW2lkc107XG4gICAgICAgIGZvciAobGV0IGlkIG9mIGlkcykge1xuICAgICAgICAgIGlmICghYmFza2V0Lmlkcy5zb21lKGkgPT4gaSA9PT0gaWQpKSB7XG4gICAgICAgICAgICBiYXNrZXQuaWRzLnB1c2goaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHBhdGNoVXNlclNldHRpbmdzKHsgYmFza2V0cyB9LCB7XG4gICAgICAgICAgdHlwZTogXCJCYXNrZXRfQWRkRG9jXCIsXG4gICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgIGJhc2tldDogYmFza2V0Lm5hbWUsXG4gICAgICAgICAgICAgIGRvY2lkOiBpZHNbMF1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCAoc3RhdGUpID0+IHtcbiAgICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgYmFza2V0czogWy4uLmJhc2tldHNdIH07XG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgIH0pKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoQXNzaXN0YW50RmVhdHVyZXMoKSB7XG4gIHJldHVybiBzaWduYWxTdG9yZUZlYXR1cmUoXG4gICAgd2l0aFN0YXRlKHsgYXNzaXN0YW50czoge30gYXMgVXNlclNldHRpbmdzWydhc3Npc3RhbnRzJ10gfSksXG4gICAgd2l0aE1ldGhvZHMoKHN0b3JlKSA9PiAoe1xuICAgICAgYXN5bmMgdXBkYXRlQXNzaXN0YW50U2V0dGluZ3MoYXNzaXN0YW50U2V0dGluZ3M6IFVzZXJTZXR0aW5nc1snYXNzaXN0YW50cyddKSB7XG4gICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIChzdGF0ZSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7IC4uLnN0YXRlLCBhc3Npc3RhbnRzOiBhc3Npc3RhbnRTZXR0aW5ncyB9O1xuICAgICAgICB9KVxuICAgICAgfSxcblxuICAgICAgYXN5bmMgdXBkYXRlTGFuZ3VhZ2UobGFuZ3VhZ2U6IFVzZXJTZXR0aW5nc1snbGFuZ3VhZ2UnXSwgYXVkaXRFdmVudHM/OiBBdWRpdEV2ZW50cykge1xuICAgICAgICBhd2FpdCBwYXRjaFVzZXJTZXR0aW5ncyh7IGxhbmd1YWdlIH0sIGF1ZGl0RXZlbnRzKTtcbiAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgKHN0YXRlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIGxhbmd1YWdlIH07XG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgIH0pKVxuICApXG59Il19
@@ -0,0 +1,32 @@
1
+ import { InjectionToken } from "@angular/core";
2
+ // pre-configured highlights's colors
3
+ export const HIGHLIGHTS = new InjectionToken('highlights', {
4
+ factory: () => [
5
+ {
6
+ name: 'company',
7
+ color: 'white',
8
+ bgColor: '#FF7675'
9
+ },
10
+ {
11
+ name: 'geo',
12
+ color: 'white',
13
+ bgColor: '#74B9FF'
14
+ },
15
+ {
16
+ name: 'person',
17
+ color: 'white',
18
+ bgColor: '#00ABB5'
19
+ },
20
+ {
21
+ name: 'extractslocations',
22
+ color: 'black',
23
+ bgColor: '#fffacd'
24
+ },
25
+ {
26
+ name: 'matchlocations',
27
+ color: 'black',
28
+ bgColor: '#ff0'
29
+ }
30
+ ],
31
+ });
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlnaGxpZ2h0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F0b21pYy1hbmd1bGFyL3NyYy9saWIvdG9rZW5zL2hpZ2hsaWdodHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVMvQyxxQ0FBcUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLElBQUksY0FBYyxDQUFxQixZQUFZLEVBQUU7SUFDN0UsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ2I7WUFDRSxJQUFJLEVBQUUsU0FBUztZQUNmLEtBQUssRUFBRSxPQUFPO1lBQ2QsT0FBTyxFQUFFLFNBQVM7U0FDbkI7UUFDRDtZQUNFLElBQUksRUFBRSxLQUFLO1lBQ1gsS0FBSyxFQUFFLE9BQU87WUFDZCxPQUFPLEVBQUUsU0FBUztTQUNuQjtRQUNEO1lBQ0UsSUFBSSxFQUFFLFFBQVE7WUFDZCxLQUFLLEVBQUUsT0FBTztZQUNkLE9BQU8sRUFBRSxTQUFTO1NBQ25CO1FBQ0Q7WUFDRSxJQUFJLEVBQUUsbUJBQW1CO1lBQ3pCLEtBQUssRUFBRSxPQUFPO1lBQ2QsT0FBTyxFQUFFLFNBQVM7U0FDbkI7UUFDRDtZQUNFLElBQUksRUFBRSxnQkFBZ0I7WUFDdEIsS0FBSyxFQUFFLE9BQU87WUFDZCxPQUFPLEVBQUUsTUFBTTtTQUNoQjtLQUNGO0NBQ0YsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG5leHBvcnQgdHlwZSBQcmV2aWV3SGlnaGxpZ2h0TmFtZSA9ICdjb21wYW55JyB8ICdnZW8nIHwgJ3BlcnNvbicgfCAnZXh0cmFjdHNsb2NhdGlvbnMnIHwgJ21hdGNobG9jYXRpb25zJztcbmV4cG9ydCB0eXBlIFByZXZpZXdIaWdobGlnaHQgPSB7XG4gIG5hbWU6IFByZXZpZXdIaWdobGlnaHROYW1lLFxuICBjb2xvcjogc3RyaW5nLFxuICBiZ0NvbG9yOiBzdHJpbmdcbn07XG5cbi8vIHByZS1jb25maWd1cmVkIGhpZ2hsaWdodHMncyBjb2xvcnNcbmV4cG9ydCBjb25zdCBISUdITElHSFRTID0gbmV3IEluamVjdGlvblRva2VuPFByZXZpZXdIaWdobGlnaHRbXT4oJ2hpZ2hsaWdodHMnLCB7XG4gIGZhY3Rvcnk6ICgpID0+IFtcbiAgICB7XG4gICAgICBuYW1lOiAnY29tcGFueScsXG4gICAgICBjb2xvcjogJ3doaXRlJyxcbiAgICAgIGJnQ29sb3I6ICcjRkY3Njc1J1xuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ2dlbycsXG4gICAgICBjb2xvcjogJ3doaXRlJyxcbiAgICAgIGJnQ29sb3I6ICcjNzRCOUZGJ1xuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ3BlcnNvbicsXG4gICAgICBjb2xvcjogJ3doaXRlJyxcbiAgICAgIGJnQ29sb3I6ICcjMDBBQkI1J1xuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ2V4dHJhY3RzbG9jYXRpb25zJyxcbiAgICAgIGNvbG9yOiAnYmxhY2snLFxuICAgICAgYmdDb2xvcjogJyNmZmZhY2QnXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnbWF0Y2hsb2NhdGlvbnMnLFxuICAgICAgY29sb3I6ICdibGFjaycsXG4gICAgICBiZ0NvbG9yOiAnI2ZmMCdcbiAgICB9XG4gIF0sXG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export * from "./highlights";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hdG9taWMtYW5ndWxhci9zcmMvbGliL3Rva2Vucy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2hpZ2hsaWdodHNcIjtcclxuIl19
@@ -0,0 +1,38 @@
1
+ import { effect, signal } from "@angular/core";
2
+ /**
3
+ * Creates a debounced signal that updates its value after a specified timeout.
4
+ *
5
+ * @template T - The type of the signal value.
6
+ * @param Signal<T> input - The input signal whose value will be debounced.
7
+ * @param number [timeOutMs=0] - The debounce timeout in milliseconds. Defaults to 0.
8
+ * @returns Signal<T> - A new signal that updates its value after the specified debounce timeout.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const input = signal('');
13
+ * const debounced = debouncedSignal(input, 1000);
14
+ *
15
+ * contructor() {
16
+ * effect(() => {
17
+ * console.log(debounced());
18
+ * // will log the input value after 1 second of inactivity.
19
+ * });
20
+ * }
21
+ * ...
22
+ * <input [ngModel]="input()" (ngModelChange)="input.set($event)">
23
+ * ```
24
+ */
25
+ export function debouncedSignal(input, timeOutMs = 0) {
26
+ const debounceSignal = signal(input());
27
+ let timeout;
28
+ effect((onCleanUp) => {
29
+ const value = input();
30
+ clearTimeout(timeout);
31
+ timeout = setTimeout(() => {
32
+ debounceSignal.set(value);
33
+ }, timeOutMs);
34
+ onCleanUp(() => clearTimeout(timeout));
35
+ });
36
+ return debounceSignal;
37
+ }
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVib3VuY2VkLXNpZ25hbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F0b21pYy1hbmd1bGFyL3NyYy9saWIvdXRpbHMvZGVib3VuY2VkLXNpZ25hbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUV2RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUksS0FBZ0IsRUFBRSxTQUFTLEdBQUcsQ0FBQztJQUNoRSxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN2QyxJQUFJLE9BQVksQ0FBQztJQUNqQixNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtRQUNuQixNQUFNLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQztRQUN0QixZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEIsT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDeEIsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDZCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7SUFDeEMsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLGNBQWMsQ0FBQztBQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZWZmZWN0LCBzaWduYWwsIFNpZ25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIGRlYm91bmNlZCBzaWduYWwgdGhhdCB1cGRhdGVzIGl0cyB2YWx1ZSBhZnRlciBhIHNwZWNpZmllZCB0aW1lb3V0LlxyXG4gKlxyXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIHRoZSBzaWduYWwgdmFsdWUuXHJcbiAqIEBwYXJhbSBTaWduYWw8VD4gaW5wdXQgLSBUaGUgaW5wdXQgc2lnbmFsIHdob3NlIHZhbHVlIHdpbGwgYmUgZGVib3VuY2VkLlxyXG4gKiBAcGFyYW0gbnVtYmVyIFt0aW1lT3V0TXM9MF0gLSBUaGUgZGVib3VuY2UgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIDAuXHJcbiAqIEByZXR1cm5zIFNpZ25hbDxUPiAtIEEgbmV3IHNpZ25hbCB0aGF0IHVwZGF0ZXMgaXRzIHZhbHVlIGFmdGVyIHRoZSBzcGVjaWZpZWQgZGVib3VuY2UgdGltZW91dC5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgdHNcclxuICogY29uc3QgaW5wdXQgPSBzaWduYWwoJycpO1xyXG4gKiBjb25zdCBkZWJvdW5jZWQgPSBkZWJvdW5jZWRTaWduYWwoaW5wdXQsIDEwMDApO1xyXG4gKlxyXG4gKiBjb250cnVjdG9yKCkge1xyXG4gKiAgZWZmZWN0KCgpID0+IHtcclxuICogICBjb25zb2xlLmxvZyhkZWJvdW5jZWQoKSk7XHJcbiAqICAgLy8gd2lsbCBsb2cgdGhlIGlucHV0IHZhbHVlIGFmdGVyIDEgc2Vjb25kIG9mIGluYWN0aXZpdHkuXHJcbiAqICB9KTtcclxuICogfVxyXG4gKiAuLi5cclxuICogPGlucHV0IFtuZ01vZGVsXT1cImlucHV0KClcIiAobmdNb2RlbENoYW5nZSk9XCJpbnB1dC5zZXQoJGV2ZW50KVwiPlxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWJvdW5jZWRTaWduYWw8VD4oaW5wdXQ6IFNpZ25hbDxUPiwgdGltZU91dE1zID0gMCk6IFNpZ25hbDxUPiB7XHJcbiAgY29uc3QgZGVib3VuY2VTaWduYWwgPSBzaWduYWwoaW5wdXQoKSk7XHJcbiAgbGV0IHRpbWVvdXQ6IGFueTtcclxuICBlZmZlY3QoKG9uQ2xlYW5VcCkgPT4ge1xyXG4gICAgY29uc3QgdmFsdWUgPSBpbnB1dCgpO1xyXG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xyXG4gICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBkZWJvdW5jZVNpZ25hbC5zZXQodmFsdWUpO1xyXG4gICAgfSwgdGltZU91dE1zKTtcclxuICAgIG9uQ2xlYW5VcCgoKSA9PiBjbGVhclRpbWVvdXQodGltZW91dCkpXHJcbiAgfSk7XHJcbiAgcmV0dXJuIGRlYm91bmNlU2lnbmFsO1xyXG59Il19
@@ -0,0 +1,8 @@
1
+ export * from './inline-worker';
2
+ export * from './query';
3
+ export * from './routes';
4
+ export * from './tailwind-utils';
5
+ export * from './theme-body-hook';
6
+ export * from './theme-registry';
7
+ export * from './debounced-signal';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hdG9taWMtYW5ndWxhci9zcmMvbGliL3V0aWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vaW5saW5lLXdvcmtlcic7XG5leHBvcnQgKiBmcm9tICcuL3F1ZXJ5JztcbmV4cG9ydCAqIGZyb20gJy4vcm91dGVzJztcbmV4cG9ydCAqIGZyb20gJy4vdGFpbHdpbmQtdXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi90aGVtZS1ib2R5LWhvb2snO1xuZXhwb3J0ICogZnJvbSAnLi90aGVtZS1yZWdpc3RyeSc7XG5leHBvcnQgKiBmcm9tICcuL2RlYm91bmNlZC1zaWduYWwnOyJdfQ==
@@ -0,0 +1,40 @@
1
+ import { Subject } from 'rxjs';
2
+ export class InlineWorker {
3
+ constructor(func) {
4
+ this.onMessage = new Subject();
5
+ this.onError = new Subject();
6
+ const WORKER_ENABLED = !!(Worker);
7
+ if (WORKER_ENABLED) {
8
+ const functionBody = func.toString().replace(/^[^{]*{\s*/, '').replace(/\s*}[^}]*$/, '');
9
+ try {
10
+ this.worker = new Worker(URL.createObjectURL(new Blob([functionBody], { type: 'text/javascript' })));
11
+ this.worker.onmessage = (data) => {
12
+ this.onMessage.next(data);
13
+ };
14
+ this.worker.onerror = (data) => {
15
+ this.onError.next(data);
16
+ };
17
+ }
18
+ catch (e) {
19
+ throw new Error('WebWorker is not enabled');
20
+ }
21
+ }
22
+ else {
23
+ throw new Error('WebWorker is not enabled');
24
+ }
25
+ }
26
+ postMessage(data) {
27
+ this.worker.postMessage(data);
28
+ }
29
+ onmessage() {
30
+ return this.onMessage.asObservable();
31
+ }
32
+ onerror() {
33
+ return this.onError.asObservable();
34
+ }
35
+ terminate() {
36
+ if (this.worker)
37
+ this.worker.terminate();
38
+ }
39
+ }
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5saW5lLXdvcmtlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F0b21pYy1hbmd1bGFyL3NyYy9saWIvdXRpbHMvaW5saW5lLXdvcmtlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE1BQU0sT0FBTyxZQUFZO0lBTXZCLFlBQVksSUFBZ0I7UUFIcEIsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFnQixDQUFDO1FBQ3hDLFlBQU8sR0FBRyxJQUFJLE9BQU8sRUFBYyxDQUFDO1FBRzFDLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWxDLElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUV6RixJQUFJLENBQUM7Z0JBRUgsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUMxQyxJQUFJLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FDdEQsQ0FBQyxDQUFDO2dCQUVILElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM1QixDQUFDLENBQUM7Z0JBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFCLENBQUMsQ0FBQztZQUNKLENBQUM7WUFBQyxPQUFNLENBQUMsRUFBQyxDQUFDO2dCQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztZQUM5QyxDQUFDO1FBRUgsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDOUMsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsSUFBYTtRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzNDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuZXhwb3J0IGNsYXNzIElubGluZVdvcmtlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgd29ya2VyOiBXb3JrZXI7XG5cbiAgcHJpdmF0ZSBvbk1lc3NhZ2UgPSBuZXcgU3ViamVjdDxNZXNzYWdlRXZlbnQ+KCk7XG4gIHByaXZhdGUgb25FcnJvciA9IG5ldyBTdWJqZWN0PEVycm9yRXZlbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IoZnVuYzogKCkgPT4gdm9pZCkge1xuICAgIGNvbnN0IFdPUktFUl9FTkFCTEVEID0gISEoV29ya2VyKTtcblxuICAgIGlmIChXT1JLRVJfRU5BQkxFRCkge1xuICAgICAgY29uc3QgZnVuY3Rpb25Cb2R5ID0gZnVuYy50b1N0cmluZygpLnJlcGxhY2UoL15bXntdKntcXHMqLywgJycpLnJlcGxhY2UoL1xccyp9W159XSokLywgJycpO1xuXG4gICAgICB0cnkge1xuXG4gICAgICAgIHRoaXMud29ya2VyID0gbmV3IFdvcmtlcihVUkwuY3JlYXRlT2JqZWN0VVJMKFxuICAgICAgICAgIG5ldyBCbG9iKFtmdW5jdGlvbkJvZHldLCB7IHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnIH0pXG4gICAgICAgICkpO1xuXG4gICAgICAgIHRoaXMud29ya2VyLm9ubWVzc2FnZSA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgdGhpcy5vbk1lc3NhZ2UubmV4dChkYXRhKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLndvcmtlci5vbmVycm9yID0gKGRhdGEpID0+IHtcbiAgICAgICAgICB0aGlzLm9uRXJyb3IubmV4dChkYXRhKTtcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignV2ViV29ya2VyIGlzIG5vdCBlbmFibGVkJyk7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZWJXb3JrZXIgaXMgbm90IGVuYWJsZWQnKTtcbiAgICB9XG4gIH1cblxuICBwb3N0TWVzc2FnZShkYXRhOiB1bmtub3duKSB7XG4gICAgdGhpcy53b3JrZXIucG9zdE1lc3NhZ2UoZGF0YSk7XG4gIH1cblxuICBvbm1lc3NhZ2UoKTogT2JzZXJ2YWJsZTxNZXNzYWdlRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5vbk1lc3NhZ2UuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBvbmVycm9yKCk6IE9ic2VydmFibGU8RXJyb3JFdmVudD4ge1xuICAgIHJldHVybiB0aGlzLm9uRXJyb3IuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICB0ZXJtaW5hdGUoKSB7XG4gICAgaWYgKHRoaXMud29ya2VyKSB0aGlzLndvcmtlci50ZXJtaW5hdGUoKTtcbiAgfVxufSJdfQ==