@projectcor/maia-components 2.11.41-10 → 2.11.41-2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/lib/App.js +22 -11
  2. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.js +38 -0
  3. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.styles.js +184 -0
  4. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.js +39 -0
  5. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +390 -0
  6. package/lib/components/atoms/ContextMentionChip/index.js +4 -0
  7. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +195 -0
  8. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.styles.js +6 -0
  9. package/lib/components/atoms/ContextMentionEditor/index.js +2 -0
  10. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +282 -0
  11. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +145 -0
  12. package/lib/components/atoms/ContextMentionItem/index.js +2 -0
  13. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +168 -0
  14. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +79 -0
  15. package/lib/components/atoms/ContextMentionPopover/index.js +3 -0
  16. package/lib/components/atoms/MAIAInput/MAIAInput.js +238 -321
  17. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +269 -0
  18. package/lib/components/atoms/MAIAInput/styles.js +75 -46
  19. package/lib/components/atoms/icons/NotionIcon.js +36 -0
  20. package/lib/components/atoms/icons/SubtaskIcon.js +36 -0
  21. package/lib/components/atoms/icons/index.js +2 -1
  22. package/lib/components/index.js +2 -1
  23. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.js +8 -4
  24. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +31 -3
  25. package/lib/components/molecules/ChatAIMessages/newStyles.js +5 -2
  26. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +9 -30
  27. package/lib/components/molecules/ChatFooter/ChatFooter.js +5 -4
  28. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +68 -0
  29. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.styles.js +6 -0
  30. package/lib/components/molecules/ContextMentionInput/index.js +2 -0
  31. package/lib/components/molecules/Sidebar/Sidebar.js +9 -5
  32. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +6 -2
  33. package/lib/components/organisms/ChatAI/ChatAI.js +4 -20
  34. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.js +5 -2
  35. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.js +6 -3
  36. package/lib/constants/config.js +3 -1
  37. package/lib/constants/taskLinkIcon.js +6 -0
  38. package/lib/context/cor-user.js +1 -1
  39. package/lib/context/global-context.js +1 -5
  40. package/lib/dev/DevContextMentionInput.js +65 -0
  41. package/lib/dev/Providers.js +11 -6
  42. package/lib/hooks/useCaretPosition.js +35 -0
  43. package/lib/hooks/useChatManager/useChatManager.interface.js +1 -1
  44. package/lib/hooks/useChatManager/useChatManager.js +21 -11
  45. package/lib/hooks/useChatMessages/useChatMessages.interface.js +1 -1
  46. package/lib/hooks/useChatMessages/useChatMessages.js +30 -14
  47. package/lib/hooks/useClientSearch.js +3 -2
  48. package/lib/hooks/useContextMentions.js +270 -0
  49. package/lib/hooks/useEntitySearch.js +1119 -0
  50. package/lib/hooks/useEvent.js +6 -1
  51. package/lib/hooks/useMentionAllowedTypes.js +103 -0
  52. package/lib/hooks/useMentionPopover.js +334 -0
  53. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +6 -4
  54. package/lib/hooks/useProjectSearch.js +3 -2
  55. package/lib/hooks/useRecentClientsSearch.js +3 -2
  56. package/lib/hooks/useTaskPanel.js +3 -10
  57. package/lib/hooks/useTextOverflowEllipsisTooltip.js +34 -0
  58. package/lib/lang/br/index.js +24 -1
  59. package/lib/lang/en/index.js +24 -1
  60. package/lib/lang/es/index.js +24 -1
  61. package/lib/lang/fr/index.js +23 -1
  62. package/lib/services/maia/Chats/getChatMessages.js +29 -4
  63. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.js +4 -8
  64. package/lib/services/maia/Orchestrator/orchestrator.js +8 -5
  65. package/lib/services/maia/RecentProjects/getRecentProjects.js +12 -4
  66. package/lib/services/maia/RecentTasks/getRecentTasks.js +54 -0
  67. package/lib/services/maia/RecentTasks/index.js +6 -0
  68. package/lib/services/maia/RecentUsers/getRecentUsers.js +59 -0
  69. package/lib/services/maia/RecentUsers/index.js +6 -0
  70. package/lib/services/query/entitySearchQuery.js +18 -0
  71. package/lib/services/query/usersDirectoryQuery.js +19 -0
  72. package/lib/services/utils/mapChatMessages.js +12 -5
  73. package/lib/types/Chat.js +1 -1
  74. package/lib/types/agent.js +1 -1
  75. package/lib/types/contextMention.js +37 -0
  76. package/lib/utils/contextMentionIcons.js +115 -0
  77. package/lib/utils/contextMentionLabel.js +4 -0
  78. package/lib/utils/contextMentionTypeLabel.js +17 -0
  79. package/lib/utils/maiaStreamdownRehypePlugins.js +27 -0
  80. package/lib/utils/openTaskInCorPanel.js +18 -0
  81. package/lib/utils/renderContextMentions.js +299 -0
  82. package/package.json +2 -1
@@ -0,0 +1,1119 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
4
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
5
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
6
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
7
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
8
+ import { useLazyQuery } from '@apollo/client';
9
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
10
+ import { getRecentClients } from '../services/maia/RecentClients/getRecentClients';
11
+ import { getRecentProjects } from '../services/maia/RecentProjects/getRecentProjects';
12
+ import { getRecentTasks } from '../services/maia/RecentTasks/getRecentTasks';
13
+ import { useUser } from '../context/cor-user';
14
+ import { PROJECTS_FALLBACK, SEARCH_ENTITIES, TASK_FAMILY_FALLBACK } from '../services/query/entitySearchQuery';
15
+ import { SEARCH_CLIENTS } from '../services/query/ClientSearchQuery';
16
+ import { USERS_DIRECTORY } from '../services/query/usersDirectoryQuery';
17
+ import { SEARCH_QUERY_DEBOUNCE_MS } from '../constants/config';
18
+ import { useDebounce } from './useDebounce';
19
+ import { useT } from './useT';
20
+ var normalizePositiveInt = function normalizePositiveInt(value, fallback) {
21
+ var parsed = Number(value);
22
+ if (!Number.isFinite(parsed)) return fallback;
23
+ var normalized = Math.floor(parsed);
24
+ return normalized > 0 ? normalized : fallback;
25
+ };
26
+
27
+ /**
28
+ * Restringe los resultados al `clientId`/`projectId` del agente activo.
29
+ * Cuando el agente está scopeado a un client/project, tanto los recents como
30
+ * el search deben filtrar por ese contexto. Si el backend no entiende algún
31
+ * campo lo ignora y se cae al comportamiento global.
32
+ */
33
+
34
+ var BASE_FILTERS_BY_TYPE = {
35
+ project: {
36
+ project: 'true',
37
+ archived: 'all'
38
+ },
39
+ task: {
40
+ task: 'true',
41
+ archived: 'false'
42
+ }
43
+ };
44
+
45
+ /**
46
+ * Entradas para el argumento GraphQL `extra` (JSON string de array) al buscar tareas con contexto.
47
+ * Ej.: [{"projectId":"881552"}]
48
+ */
49
+ var buildTaskSearchExtraEntries = function buildTaskSearchExtraEntries(scope) {
50
+ var rawClient = (scope === null || scope === void 0 ? void 0 : scope.clientId) !== undefined && (scope === null || scope === void 0 ? void 0 : scope.clientId) !== null && (scope === null || scope === void 0 ? void 0 : scope.clientId) !== '' ? String(scope.clientId) : null;
51
+ var rawProject = (scope === null || scope === void 0 ? void 0 : scope.projectId) !== undefined && (scope === null || scope === void 0 ? void 0 : scope.projectId) !== null && (scope === null || scope === void 0 ? void 0 : scope.projectId) !== '' ? String(scope.projectId) : null;
52
+ var agentEntity = scope === null || scope === void 0 ? void 0 : scope.agentEntity;
53
+ var entries = [];
54
+ var pushClient = function pushClient() {
55
+ if (rawClient) entries.push({
56
+ clientId: rawClient
57
+ });
58
+ };
59
+ var pushProject = function pushProject() {
60
+ if (rawProject) entries.push({
61
+ projectId: rawProject
62
+ });
63
+ };
64
+ if (agentEntity === 'project') {
65
+ if (rawProject) {
66
+ pushProject();
67
+ } else if (rawClient) {
68
+ pushClient();
69
+ }
70
+ } else if (agentEntity === 'client') {
71
+ pushClient();
72
+ pushProject();
73
+ } else {
74
+ pushClient();
75
+ pushProject();
76
+ }
77
+ return entries;
78
+ };
79
+ var buildTaskSearchExtra = function buildTaskSearchExtra(scope) {
80
+ var entries = buildTaskSearchExtraEntries(scope);
81
+ if (entries.length === 0) return undefined;
82
+ return JSON.stringify(entries);
83
+ };
84
+
85
+ /**
86
+ * Tab proyecto: con `clientId` en el scope, `extra` acota la búsqueda a proyectos de ese cliente.
87
+ * Ej.: `[{"clientId":"47105"}]` junto a `filters` `{"project":"true","archived":"all"}`.
88
+ */
89
+ var buildProjectSearchExtra = function buildProjectSearchExtra(scope) {
90
+ var rawClient = (scope === null || scope === void 0 ? void 0 : scope.clientId) !== undefined && (scope === null || scope === void 0 ? void 0 : scope.clientId) !== null && (scope === null || scope === void 0 ? void 0 : scope.clientId) !== '' ? String(scope.clientId) : null;
91
+ if (!rawClient) return undefined;
92
+ return JSON.stringify([{
93
+ clientId: rawClient
94
+ }]);
95
+ };
96
+ var buildSearchEntitiesExtra = function buildSearchEntitiesExtra(type, scope) {
97
+ if (type === 'task') return buildTaskSearchExtra(scope);
98
+ if (type === 'project') return buildProjectSearchExtra(scope);
99
+ return undefined;
100
+ };
101
+
102
+ /**
103
+ * Tab `task` / `project`: `filters` sólo tipo + archived (tareas: no archivadas); scope (clientId / projectId en tareas) en `extra`.
104
+ */
105
+ var buildFiltersForType = function buildFiltersForType(type) {
106
+ if (type === 'project') {
107
+ return JSON.stringify(BASE_FILTERS_BY_TYPE.project);
108
+ }
109
+ return JSON.stringify(BASE_FILTERS_BY_TYPE.task);
110
+ };
111
+
112
+ /**
113
+ * Filtros para usersDirectory. El backend espera un JSON string con
114
+ * withPosition, withTeams y searchInput. Le agregamos clientId/projectId
115
+ * del scope en caso de que el backend los aproveche para filtrar por
116
+ * contexto (si no los entiende los ignora).
117
+ */
118
+ var buildUsersDirectoryFilters = function buildUsersDirectoryFilters(q) {
119
+ var base = {
120
+ withPosition: true,
121
+ withTeams: true
122
+ };
123
+ var trimmedQ = q.trim();
124
+ if (trimmedQ) {
125
+ base.searchInput = trimmedQ;
126
+ }
127
+ return JSON.stringify(base);
128
+ };
129
+ var highlightRange = function highlightRange(text, searchValue) {
130
+ if (!searchValue) return undefined;
131
+ var idx = text.toLowerCase().indexOf(searchValue.toLowerCase());
132
+ if (idx < 0) return undefined;
133
+ return {
134
+ start: idx,
135
+ length: searchValue.length
136
+ };
137
+ };
138
+ var firstDefined = function firstDefined() {
139
+ for (var _len = arguments.length, values = new Array(_len), _key = 0; _key < _len; _key++) {
140
+ values[_key] = arguments[_key];
141
+ }
142
+ return values.find(function (value) {
143
+ return value !== undefined && value !== null;
144
+ });
145
+ };
146
+ var mapClientToItem = function mapClientToItem(c, searchValue) {
147
+ var _c$totalProyectos, _c$totalProyectos2;
148
+ return {
149
+ id: c.id,
150
+ type: 'client',
151
+ primary: c.name,
152
+ primaryHighlight: highlightRange(c.name, searchValue),
153
+ breadcrumb: {
154
+ count: (_c$totalProyectos = c.totalProyectos) !== null && _c$totalProyectos !== void 0 ? _c$totalProyectos : undefined,
155
+ countLabel: 'projects'
156
+ },
157
+ raw: {
158
+ id: c.id,
159
+ name: c.name,
160
+ totalProyectos: (_c$totalProyectos2 = c.totalProyectos) !== null && _c$totalProyectos2 !== void 0 ? _c$totalProyectos2 : null
161
+ }
162
+ };
163
+ };
164
+ var mapUserToItem = function mapUserToItem(u, searchValue) {
165
+ var _u$firstName, _u$lastName, _u$picture, _u$positionName, _u$email;
166
+ var fullName = "".concat((_u$firstName = u.firstName) !== null && _u$firstName !== void 0 ? _u$firstName : '', " ").concat((_u$lastName = u.lastName) !== null && _u$lastName !== void 0 ? _u$lastName : '').trim();
167
+ var primary = fullName || u.email || String(u.id);
168
+ return {
169
+ id: u.id,
170
+ type: 'user',
171
+ primary: primary,
172
+ primaryHighlight: highlightRange(primary, searchValue),
173
+ raw: {
174
+ id: u.id,
175
+ name: primary,
176
+ picture: (_u$picture = u.picture) !== null && _u$picture !== void 0 ? _u$picture : null,
177
+ positionName: (_u$positionName = u.positionName) !== null && _u$positionName !== void 0 ? _u$positionName : null,
178
+ email: (_u$email = u.email) !== null && _u$email !== void 0 ? _u$email : null
179
+ }
180
+ };
181
+ };
182
+ var mapCorUserToUserItem = function mapCorUserToUserItem(user, searchValue, meLabel) {
183
+ var _user$firstName, _user$lastName, _user$user_position, _user$email;
184
+ var fullName = "".concat((_user$firstName = user.firstName) !== null && _user$firstName !== void 0 ? _user$firstName : '', " ").concat((_user$lastName = user.lastName) !== null && _user$lastName !== void 0 ? _user$lastName : '').trim();
185
+ /** Solo cargo real; sin fallback a `role` (la UI muestra “Sin posición” si falta). */
186
+ var positionLine = ((_user$user_position = user.user_position) === null || _user$user_position === void 0 ? void 0 : _user$user_position.trim()) || null;
187
+ return {
188
+ id: user.id,
189
+ type: 'user',
190
+ primary: meLabel,
191
+ primaryHighlight: highlightRange(meLabel, searchValue),
192
+ raw: {
193
+ id: user.id,
194
+ name: fullName || String(user.id),
195
+ picture: user.picture || null,
196
+ positionName: positionLine,
197
+ email: ((_user$email = user.email) === null || _user$email === void 0 ? void 0 : _user$email.trim()) || null
198
+ }
199
+ };
200
+ };
201
+ var mapRecentTaskToItem = function mapRecentTaskToItem(task, searchValue) {
202
+ var _task$projectName;
203
+ var showProjectNameInTaskRow = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
204
+ var primary = task.title && task.title.trim() || String(task.id);
205
+ var projectName = showProjectNameInTaskRow ? (_task$projectName = task.projectName) !== null && _task$projectName !== void 0 ? _task$projectName : null : null;
206
+ return {
207
+ id: task.id,
208
+ type: 'task',
209
+ primary: primary,
210
+ primaryHighlight: highlightRange(primary, searchValue),
211
+ breadcrumb: projectName ? {
212
+ parent: projectName
213
+ } : undefined,
214
+ raw: {
215
+ id: task.id,
216
+ name: primary,
217
+ projectName: projectName
218
+ }
219
+ };
220
+ };
221
+ var normalizeTaskFamilyRecord = function normalizeTaskFamilyRecord(record) {
222
+ var _record$title, _firstDefined, _record$project, _record$father, _record$father2;
223
+ var taskFamilyId = record._id;
224
+ var id = taskFamilyId;
225
+ if (id === undefined || id === null || String(id) === '') return null;
226
+ var title = ((_record$title = record.title) !== null && _record$title !== void 0 ? _record$title : '').trim() || String(id);
227
+ var projectName = (_firstDefined = firstDefined((_record$project = record.project) === null || _record$project === void 0 ? void 0 : _record$project.name, (_record$father = record.father) === null || _record$father === void 0 ? void 0 : _record$father.title)) !== null && _firstDefined !== void 0 ? _firstDefined : null;
228
+ var hasFather = !!firstDefined(record.taskFather, (_record$father2 = record.father) === null || _record$father2 === void 0 ? void 0 : _record$father2.id);
229
+ return {
230
+ id: id,
231
+ title: title,
232
+ type: hasFather ? 'subtask' : 'task',
233
+ projectName: projectName
234
+ };
235
+ };
236
+ var normalizeProjectsFallbackRecord = function normalizeProjectsFallbackRecord(record) {
237
+ var _record$name, _firstDefined2, _record$client, _record$client$name, _record$client2;
238
+ var id = record.id;
239
+ if (id === undefined || id === null || String(id) === '') return null;
240
+ var title = (_record$name = record.name) !== null && _record$name !== void 0 ? _record$name : '';
241
+ var clientId = (_firstDefined2 = firstDefined(record.clientId, (_record$client = record.client) === null || _record$client === void 0 ? void 0 : _record$client.id)) !== null && _firstDefined2 !== void 0 ? _firstDefined2 : null;
242
+ var clientName = (_record$client$name = (_record$client2 = record.client) === null || _record$client2 === void 0 ? void 0 : _record$client2.name) !== null && _record$client$name !== void 0 ? _record$client$name : null;
243
+ return {
244
+ id: id,
245
+ title: title,
246
+ type: 'project',
247
+ clientId: clientId,
248
+ clientName: clientName
249
+ };
250
+ };
251
+ var mapSearchToItem = function mapSearchToItem(r, type, searchValue) {
252
+ var _r$projectName, _r$projectName2, _r$clientId, _r$clientName, _r$feeId, _father$title;
253
+ var showProjectNameInTaskRow = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
254
+ var primary = r.title || r.projectName || '';
255
+ var parent;
256
+ if (type === 'project') parent = r.clientName;else if (type === 'task') parent = undefined;else parent = (_r$projectName = r.projectName) !== null && _r$projectName !== void 0 ? _r$projectName : r.clientName;
257
+ var father = type === 'task' ? r.father : null;
258
+ var hasFather = type === 'task' && father != null && father.id != null && String(father.id).length > 0;
259
+ var taskProjectName = type === 'task' && !showProjectNameInTaskRow ? null : (_r$projectName2 = r.projectName) !== null && _r$projectName2 !== void 0 ? _r$projectName2 : null;
260
+ return {
261
+ id: r.id,
262
+ type: type,
263
+ primary: primary,
264
+ primaryHighlight: highlightRange(primary, searchValue),
265
+ breadcrumb: parent ? {
266
+ parent: parent
267
+ } : undefined,
268
+ raw: {
269
+ id: r.id,
270
+ name: primary,
271
+ clientId: (_r$clientId = r.clientId) !== null && _r$clientId !== void 0 ? _r$clientId : null,
272
+ clientName: (_r$clientName = r.clientName) !== null && _r$clientName !== void 0 ? _r$clientName : null,
273
+ projectName: taskProjectName,
274
+ feeId: (_r$feeId = r.feeId) !== null && _r$feeId !== void 0 ? _r$feeId : null,
275
+ fatherId: hasFather ? father.id : null,
276
+ fatherTitle: hasFather ? ((_father$title = father.title) === null || _father$title === void 0 ? void 0 : _father$title.trim()) || null : null
277
+ }
278
+ };
279
+ };
280
+ var formatMcpPrimaryLabel = function formatMcpPrimaryLabel(slug) {
281
+ return slug.replace(/_/g, ' ').replace(/\b\w/g, function (_char) {
282
+ return _char.toUpperCase();
283
+ });
284
+ };
285
+ var mapMcpSlugsToItems = function mapMcpSlugsToItems(slugs, searchValue) {
286
+ var q = searchValue.trim().toLowerCase();
287
+ var filtered = slugs;
288
+ if (q) {
289
+ filtered = slugs.filter(function (s) {
290
+ var primary = formatMcpPrimaryLabel(s);
291
+ return s.toLowerCase().includes(q) || primary.toLowerCase().includes(q);
292
+ });
293
+ }
294
+ return filtered.map(function (slug) {
295
+ var primary = formatMcpPrimaryLabel(slug);
296
+ return {
297
+ id: slug,
298
+ type: 'mcp',
299
+ primary: primary,
300
+ primaryHighlight: highlightRange(primary, searchValue),
301
+ raw: {
302
+ id: slug,
303
+ name: primary
304
+ }
305
+ };
306
+ });
307
+ };
308
+ export var useEntitySearch = function useEntitySearch(type, scope) {
309
+ var _scope$mcpSlugs;
310
+ var corUser = useUser();
311
+ var _useT = useT(),
312
+ t = _useT.t;
313
+ /** Evita aplicar resultados de un `fetchRecent` viejo cuando el usuario ya cambió de tab (race async). */
314
+ var recentsFetchGenerationRef = useRef(0);
315
+ var _useState = useState(''),
316
+ _useState2 = _slicedToArray(_useState, 2),
317
+ searchValue = _useState2[0],
318
+ setSearchValue = _useState2[1];
319
+ var debouncedSearchValue = useDebounce(searchValue, SEARCH_QUERY_DEBOUNCE_MS);
320
+ var _useState3 = useState([]),
321
+ _useState4 = _slicedToArray(_useState3, 2),
322
+ items = _useState4[0],
323
+ setItems = _useState4[1];
324
+ var _useState5 = useState(false),
325
+ _useState6 = _slicedToArray(_useState5, 2),
326
+ loading = _useState6[0],
327
+ setLoading = _useState6[1];
328
+ var _useState7 = useState(false),
329
+ _useState8 = _slicedToArray(_useState7, 2),
330
+ error = _useState8[0],
331
+ setError = _useState8[1];
332
+ var _useState9 = useState(false),
333
+ _useState0 = _slicedToArray(_useState9, 2),
334
+ hideRecentsLabel = _useState0[0],
335
+ setHideRecentsLabel = _useState0[1];
336
+ var _useState1 = useState(false),
337
+ _useState10 = _slicedToArray(_useState1, 2),
338
+ hasMore = _useState10[0],
339
+ setHasMore = _useState10[1];
340
+ var _useState11 = useState(false),
341
+ _useState12 = _slicedToArray(_useState11, 2),
342
+ isLoadingMore = _useState12[0],
343
+ setIsLoadingMore = _useState12[1];
344
+ var _useState13 = useState(1),
345
+ _useState14 = _slicedToArray(_useState13, 2),
346
+ currentPage = _useState14[0],
347
+ setCurrentPage = _useState14[1];
348
+ var _useState15 = useState('none'),
349
+ _useState16 = _slicedToArray(_useState15, 2),
350
+ activePaginationSource = _useState16[0],
351
+ setActivePaginationSource = _useState16[1];
352
+ var mcpSlugsKey = ((_scope$mcpSlugs = scope === null || scope === void 0 ? void 0 : scope.mcpSlugs) !== null && _scope$mcpSlugs !== void 0 ? _scope$mcpSlugs : []).join('|');
353
+ var showProjectNameInTaskRow = (scope === null || scope === void 0 ? void 0 : scope.agentEntity) !== 'project';
354
+
355
+ // Estabilizamos el scope para no disparar fetchs por cambios de identidad de objeto.
356
+ var stableScope = useMemo(function () {
357
+ var _scope$clientId, _scope$projectId, _scope$mcpSlugs2, _scope$agentEntity;
358
+ return {
359
+ clientId: (_scope$clientId = scope === null || scope === void 0 ? void 0 : scope.clientId) !== null && _scope$clientId !== void 0 ? _scope$clientId : null,
360
+ projectId: (_scope$projectId = scope === null || scope === void 0 ? void 0 : scope.projectId) !== null && _scope$projectId !== void 0 ? _scope$projectId : null,
361
+ mcpSlugs: (_scope$mcpSlugs2 = scope === null || scope === void 0 ? void 0 : scope.mcpSlugs) !== null && _scope$mcpSlugs2 !== void 0 ? _scope$mcpSlugs2 : [],
362
+ agentEntity: (_scope$agentEntity = scope === null || scope === void 0 ? void 0 : scope.agentEntity) !== null && _scope$agentEntity !== void 0 ? _scope$agentEntity : null
363
+ };
364
+ }, [scope === null || scope === void 0 ? void 0 : scope.clientId, scope === null || scope === void 0 ? void 0 : scope.projectId, mcpSlugsKey, scope === null || scope === void 0 ? void 0 : scope.agentEntity]);
365
+
366
+ // --- Search: project | task (GraphQL: search) ---
367
+ var _useLazyQuery = useLazyQuery(SEARCH_ENTITIES, {
368
+ variables: {
369
+ limit: 20
370
+ },
371
+ fetchPolicy: 'network-only'
372
+ }),
373
+ _useLazyQuery2 = _slicedToArray(_useLazyQuery, 2),
374
+ fetchSearchEntities = _useLazyQuery2[0],
375
+ _useLazyQuery2$ = _useLazyQuery2[1],
376
+ searchData = _useLazyQuery2$.data,
377
+ searchLoading = _useLazyQuery2$.loading,
378
+ searchError = _useLazyQuery2$.error;
379
+
380
+ // --- Search: client (GraphQL) ---
381
+ var _useLazyQuery3 = useLazyQuery(SEARCH_CLIENTS, {
382
+ fetchPolicy: 'network-only'
383
+ }),
384
+ _useLazyQuery4 = _slicedToArray(_useLazyQuery3, 2),
385
+ fetchSearchClients = _useLazyQuery4[0],
386
+ _useLazyQuery4$ = _useLazyQuery4[1],
387
+ clientsData = _useLazyQuery4$.data,
388
+ clientsLoading = _useLazyQuery4$.loading,
389
+ clientsError = _useLazyQuery4$.error;
390
+
391
+ // --- Search: user (GraphQL: usersDirectory) ---
392
+ var _useLazyQuery5 = useLazyQuery(USERS_DIRECTORY, {
393
+ fetchPolicy: 'network-only'
394
+ }),
395
+ _useLazyQuery6 = _slicedToArray(_useLazyQuery5, 2),
396
+ fetchUsersDirectory = _useLazyQuery6[0],
397
+ _useLazyQuery6$ = _useLazyQuery6[1],
398
+ usersData = _useLazyQuery6$.data,
399
+ usersLoading = _useLazyQuery6$.loading,
400
+ usersError = _useLazyQuery6$.error;
401
+ var syncUsersPagination = useCallback(function (payload) {
402
+ var _payload$usersDirecto, _payload$usersDirecto2;
403
+ var page = normalizePositiveInt(payload === null || payload === void 0 || (_payload$usersDirecto = payload.usersDirectory) === null || _payload$usersDirecto === void 0 ? void 0 : _payload$usersDirecto.page, 1);
404
+ var lastPage = normalizePositiveInt(payload === null || payload === void 0 || (_payload$usersDirecto2 = payload.usersDirectory) === null || _payload$usersDirecto2 === void 0 ? void 0 : _payload$usersDirecto2.lastPage, page);
405
+ setCurrentPage(page);
406
+ setHasMore(page < lastPage);
407
+ }, []);
408
+ var syncClientsPagination = useCallback(function (payload) {
409
+ var _payload$clients, _payload$clients2;
410
+ var page = normalizePositiveInt(payload === null || payload === void 0 || (_payload$clients = payload.clients) === null || _payload$clients === void 0 ? void 0 : _payload$clients.page, 1);
411
+ var lastPage = normalizePositiveInt(payload === null || payload === void 0 || (_payload$clients2 = payload.clients) === null || _payload$clients2 === void 0 ? void 0 : _payload$clients2.lastPage, page);
412
+ setCurrentPage(page);
413
+ setHasMore(page < lastPage);
414
+ }, []);
415
+ var syncTaskFallbackPagination = useCallback(function (payload) {
416
+ var _payload$taskFamily, _payload$taskFamily2;
417
+ var rawPage = Number(payload === null || payload === void 0 || (_payload$taskFamily = payload.taskFamily) === null || _payload$taskFamily === void 0 ? void 0 : _payload$taskFamily.page);
418
+ // taskFamily usa páginas 0-based; convertimos a 1-based para consistencia con el resto
419
+ var page = Number.isFinite(rawPage) && rawPage >= 0 ? Math.floor(rawPage) + 1 : 1;
420
+ var lastPage = normalizePositiveInt(payload === null || payload === void 0 || (_payload$taskFamily2 = payload.taskFamily) === null || _payload$taskFamily2 === void 0 ? void 0 : _payload$taskFamily2.lastPage, page);
421
+ setCurrentPage(page);
422
+ setHasMore(page < lastPage);
423
+ }, []);
424
+ var syncProjectFallbackPagination = useCallback(function (payload) {
425
+ var _payload$projects, _payload$projects2;
426
+ var page = normalizePositiveInt(payload === null || payload === void 0 || (_payload$projects = payload.projects) === null || _payload$projects === void 0 ? void 0 : _payload$projects.page, 1);
427
+ var lastPage = normalizePositiveInt(payload === null || payload === void 0 || (_payload$projects2 = payload.projects) === null || _payload$projects2 === void 0 ? void 0 : _payload$projects2.lastPage, page);
428
+ setCurrentPage(page);
429
+ setHasMore(page < lastPage);
430
+ }, []);
431
+ var _useLazyQuery7 = useLazyQuery(TASK_FAMILY_FALLBACK, {
432
+ fetchPolicy: 'network-only'
433
+ }),
434
+ _useLazyQuery8 = _slicedToArray(_useLazyQuery7, 1),
435
+ fetchTaskFamilyFallback = _useLazyQuery8[0];
436
+ var _useLazyQuery9 = useLazyQuery(PROJECTS_FALLBACK, {
437
+ fetchPolicy: 'network-only'
438
+ }),
439
+ _useLazyQuery0 = _slicedToArray(_useLazyQuery9, 1),
440
+ fetchProjectsFallback = _useLazyQuery0[0];
441
+ var fetchRecent = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
442
+ var generation, _stableScope$mcpSlugs, slugs, data, mapped, _data, _mapped, _fallbackData$project, _fallbackData$project2, argumentsFilter, _yield$fetchProjectsF, fallbackData, fallbackMapped, recentTaskFilters, _data2, taskItems, _fallbackData$taskFam, _fallbackData$taskFam2, filter, _yield$fetchTaskFamil, _fallbackData, _data3$usersDirectory, _data3$usersDirectory2, _yield$fetchUsersDire, _data3, _mapped2, meItem, withoutMe, _t;
443
+ return _regeneratorRuntime.wrap(function (_context) {
444
+ while (1) switch (_context.prev = _context.next) {
445
+ case 0:
446
+ recentsFetchGenerationRef.current += 1;
447
+ generation = recentsFetchGenerationRef.current;
448
+ if (!(type === 'mcp')) {
449
+ _context.next = 1;
450
+ break;
451
+ }
452
+ slugs = (_stableScope$mcpSlugs = stableScope.mcpSlugs) !== null && _stableScope$mcpSlugs !== void 0 ? _stableScope$mcpSlugs : [];
453
+ setLoading(false);
454
+ setError(false);
455
+ setItems(mapMcpSlugsToItems(slugs, ''));
456
+ setHideRecentsLabel(false);
457
+ setActivePaginationSource('none');
458
+ setHasMore(false);
459
+ return _context.abrupt("return");
460
+ case 1:
461
+ setLoading(true);
462
+ setError(false);
463
+ _context.prev = 2;
464
+ if (!(type === 'client')) {
465
+ _context.next = 6;
466
+ break;
467
+ }
468
+ _context.next = 3;
469
+ return getRecentClients();
470
+ case 3:
471
+ data = _context.sent;
472
+ if (!(generation !== recentsFetchGenerationRef.current)) {
473
+ _context.next = 4;
474
+ break;
475
+ }
476
+ return _context.abrupt("return");
477
+ case 4:
478
+ mapped = (data !== null && data !== void 0 ? data : []).map(function (c) {
479
+ return mapClientToItem(c, '');
480
+ });
481
+ if (!(generation !== recentsFetchGenerationRef.current)) {
482
+ _context.next = 5;
483
+ break;
484
+ }
485
+ return _context.abrupt("return");
486
+ case 5:
487
+ setItems(mapped);
488
+ setHideRecentsLabel(false);
489
+ setActivePaginationSource('none');
490
+ setHasMore(false);
491
+ _context.next = 28;
492
+ break;
493
+ case 6:
494
+ if (!(type === 'project')) {
495
+ _context.next = 14;
496
+ break;
497
+ }
498
+ _context.next = 7;
499
+ return getRecentProjects(stableScope.clientId ? {
500
+ clientId: stableScope.clientId
501
+ } : undefined);
502
+ case 7:
503
+ _data = _context.sent;
504
+ if (!(generation !== recentsFetchGenerationRef.current)) {
505
+ _context.next = 8;
506
+ break;
507
+ }
508
+ return _context.abrupt("return");
509
+ case 8:
510
+ _mapped = (Array.isArray(_data) ? _data : []).map(function (p) {
511
+ return mapSearchToItem({
512
+ id: p.id,
513
+ title: p.title,
514
+ type: 'project',
515
+ clientId: p.clientId,
516
+ feeId: p.feeId,
517
+ clientName: p.clientName
518
+ }, 'project', '');
519
+ });
520
+ if (!(_mapped.length === 0)) {
521
+ _context.next = 11;
522
+ break;
523
+ }
524
+ argumentsFilter = stableScope.clientId !== null && stableScope.clientId !== undefined && stableScope.clientId !== '' ? {
525
+ client_id: [String(stableScope.clientId)]
526
+ } : undefined;
527
+ _context.next = 9;
528
+ return fetchProjectsFallback({
529
+ variables: _objectSpread(_objectSpread({}, argumentsFilter ? {
530
+ arguments: argumentsFilter
531
+ } : {}), {}, {
532
+ page: 1,
533
+ perPage: 20
534
+ })
535
+ });
536
+ case 9:
537
+ _yield$fetchProjectsF = _context.sent;
538
+ fallbackData = _yield$fetchProjectsF.data;
539
+ if (!(generation !== recentsFetchGenerationRef.current)) {
540
+ _context.next = 10;
541
+ break;
542
+ }
543
+ return _context.abrupt("return");
544
+ case 10:
545
+ fallbackMapped = ((_fallbackData$project = fallbackData === null || fallbackData === void 0 || (_fallbackData$project2 = fallbackData.projects) === null || _fallbackData$project2 === void 0 ? void 0 : _fallbackData$project2.data) !== null && _fallbackData$project !== void 0 ? _fallbackData$project : []).map(normalizeProjectsFallbackRecord).filter(function (item) {
546
+ return item !== null;
547
+ }).map(function (item) {
548
+ return mapSearchToItem(item, 'project', '');
549
+ });
550
+ _mapped = fallbackMapped;
551
+ setHideRecentsLabel(fallbackMapped.length > 0);
552
+ setActivePaginationSource('project-fallback');
553
+ syncProjectFallbackPagination(fallbackData);
554
+ _context.next = 12;
555
+ break;
556
+ case 11:
557
+ setHideRecentsLabel(false);
558
+ setActivePaginationSource('none');
559
+ setHasMore(false);
560
+ case 12:
561
+ if (!(generation !== recentsFetchGenerationRef.current)) {
562
+ _context.next = 13;
563
+ break;
564
+ }
565
+ return _context.abrupt("return");
566
+ case 13:
567
+ setItems(_mapped);
568
+ _context.next = 28;
569
+ break;
570
+ case 14:
571
+ if (!(type === 'task')) {
572
+ _context.next = 22;
573
+ break;
574
+ }
575
+ if (stableScope.agentEntity === 'project') {
576
+ recentTaskFilters = {
577
+ projectId: stableScope.projectId
578
+ };
579
+ } else if (stableScope.agentEntity === 'client') {
580
+ recentTaskFilters = {
581
+ clientId: stableScope.clientId
582
+ };
583
+ }
584
+ _context.next = 15;
585
+ return getRecentTasks(recentTaskFilters);
586
+ case 15:
587
+ _data2 = _context.sent;
588
+ if (!(generation !== recentsFetchGenerationRef.current)) {
589
+ _context.next = 16;
590
+ break;
591
+ }
592
+ return _context.abrupt("return");
593
+ case 16:
594
+ taskItems = (_data2 !== null && _data2 !== void 0 ? _data2 : []).map(function (task) {
595
+ return mapRecentTaskToItem(task, '', showProjectNameInTaskRow);
596
+ });
597
+ if (!(taskItems.length === 0)) {
598
+ _context.next = 19;
599
+ break;
600
+ }
601
+ filter = {};
602
+ if (stableScope.projectId !== null && stableScope.projectId !== undefined && stableScope.projectId !== '') {
603
+ filter.projectIds = [String(stableScope.projectId)];
604
+ }
605
+ if (stableScope.clientId !== null && stableScope.clientId !== undefined && stableScope.clientId !== '') {
606
+ filter.clientIds = [String(stableScope.clientId)];
607
+ }
608
+ _context.next = 17;
609
+ return fetchTaskFamilyFallback({
610
+ variables: {
611
+ filter: _objectSpread({
612
+ archived: false
613
+ }, filter),
614
+ pagination: {
615
+ offset: 0,
616
+ size: 20
617
+ }
618
+ }
619
+ });
620
+ case 17:
621
+ _yield$fetchTaskFamil = _context.sent;
622
+ _fallbackData = _yield$fetchTaskFamil.data;
623
+ if (!(generation !== recentsFetchGenerationRef.current)) {
624
+ _context.next = 18;
625
+ break;
626
+ }
627
+ return _context.abrupt("return");
628
+ case 18:
629
+ taskItems = ((_fallbackData$taskFam = _fallbackData === null || _fallbackData === void 0 || (_fallbackData$taskFam2 = _fallbackData.taskFamily) === null || _fallbackData$taskFam2 === void 0 ? void 0 : _fallbackData$taskFam2.data) !== null && _fallbackData$taskFam !== void 0 ? _fallbackData$taskFam : []).map(normalizeTaskFamilyRecord).filter(function (item) {
630
+ return item !== null;
631
+ }).map(function (task) {
632
+ return mapRecentTaskToItem(task, '', showProjectNameInTaskRow);
633
+ });
634
+ setHideRecentsLabel(taskItems.length > 0);
635
+ setActivePaginationSource('task-fallback');
636
+ syncTaskFallbackPagination(_fallbackData);
637
+ _context.next = 20;
638
+ break;
639
+ case 19:
640
+ setHideRecentsLabel(false);
641
+ setActivePaginationSource('none');
642
+ setHasMore(false);
643
+ case 20:
644
+ if (!(generation !== recentsFetchGenerationRef.current)) {
645
+ _context.next = 21;
646
+ break;
647
+ }
648
+ return _context.abrupt("return");
649
+ case 21:
650
+ setItems(taskItems);
651
+ _context.next = 28;
652
+ break;
653
+ case 22:
654
+ if (!(type === 'user')) {
655
+ _context.next = 26;
656
+ break;
657
+ }
658
+ _context.next = 23;
659
+ return fetchUsersDirectory({
660
+ variables: {
661
+ filters: buildUsersDirectoryFilters(''),
662
+ page: 1
663
+ }
664
+ });
665
+ case 23:
666
+ _yield$fetchUsersDire = _context.sent;
667
+ _data3 = _yield$fetchUsersDire.data;
668
+ if (!(generation !== recentsFetchGenerationRef.current)) {
669
+ _context.next = 24;
670
+ break;
671
+ }
672
+ return _context.abrupt("return");
673
+ case 24:
674
+ _mapped2 = ((_data3$usersDirectory = _data3 === null || _data3 === void 0 || (_data3$usersDirectory2 = _data3.usersDirectory) === null || _data3$usersDirectory2 === void 0 ? void 0 : _data3$usersDirectory2.data) !== null && _data3$usersDirectory !== void 0 ? _data3$usersDirectory : []).map(function (u) {
675
+ return mapUserToItem(u, '');
676
+ });
677
+ if (!(generation !== recentsFetchGenerationRef.current)) {
678
+ _context.next = 25;
679
+ break;
680
+ }
681
+ return _context.abrupt("return");
682
+ case 25:
683
+ meItem = mapCorUserToUserItem(corUser, '', t('contextMention.me'));
684
+ withoutMe = _mapped2.filter(function (item) {
685
+ return String(item.id) !== String(meItem.id);
686
+ });
687
+ setItems([meItem].concat(_toConsumableArray(withoutMe)));
688
+ syncUsersPagination(_data3);
689
+ setHideRecentsLabel(false);
690
+ setActivePaginationSource('users');
691
+ _context.next = 28;
692
+ break;
693
+ case 26:
694
+ if (!(generation !== recentsFetchGenerationRef.current)) {
695
+ _context.next = 27;
696
+ break;
697
+ }
698
+ return _context.abrupt("return");
699
+ case 27:
700
+ setItems([]);
701
+ setHideRecentsLabel(false);
702
+ setActivePaginationSource('none');
703
+ setHasMore(false);
704
+ setCurrentPage(1);
705
+ case 28:
706
+ _context.next = 31;
707
+ break;
708
+ case 29:
709
+ _context.prev = 29;
710
+ _t = _context["catch"](2);
711
+ if (!(generation !== recentsFetchGenerationRef.current)) {
712
+ _context.next = 30;
713
+ break;
714
+ }
715
+ return _context.abrupt("return");
716
+ case 30:
717
+ setError(true);
718
+ setItems([]);
719
+ setHideRecentsLabel(false);
720
+ case 31:
721
+ _context.prev = 31;
722
+ if (generation === recentsFetchGenerationRef.current) {
723
+ setLoading(false);
724
+ }
725
+ return _context.finish(31);
726
+ case 32:
727
+ case "end":
728
+ return _context.stop();
729
+ }
730
+ }, _callee, null, [[2, 29, 31, 32]]);
731
+ })), [type, stableScope, fetchUsersDirectory, fetchTaskFamilyFallback, fetchProjectsFallback, syncUsersPagination, syncTaskFallbackPagination, syncProjectFallbackPagination, showProjectNameInTaskRow, corUser, t]);
732
+
733
+ // Disparar search al cambiar debounced value
734
+ useEffect(function () {
735
+ var q = debouncedSearchValue.trim();
736
+ if (type === 'mcp') {
737
+ var _stableScope$mcpSlugs2;
738
+ var slugs = (_stableScope$mcpSlugs2 = stableScope.mcpSlugs) !== null && _stableScope$mcpSlugs2 !== void 0 ? _stableScope$mcpSlugs2 : [];
739
+ setLoading(false);
740
+ setError(false);
741
+ setItems(mapMcpSlugsToItems(slugs, q));
742
+ return;
743
+ }
744
+ if (!q) return;
745
+ if (type === 'client') {
746
+ fetchSearchClients({
747
+ variables: {
748
+ filter: {
749
+ name: q
750
+ },
751
+ page: 1,
752
+ perPage: 20
753
+ }
754
+ });
755
+ setActivePaginationSource('clients-search');
756
+ } else if (type === 'user') {
757
+ fetchUsersDirectory({
758
+ variables: {
759
+ filters: buildUsersDirectoryFilters(q),
760
+ page: 1
761
+ }
762
+ });
763
+ setActivePaginationSource('users');
764
+ } else {
765
+ var filters = buildFiltersForType(type);
766
+ var extra = buildSearchEntitiesExtra(type, stableScope);
767
+ fetchSearchEntities({
768
+ variables: _objectSpread({
769
+ q: q,
770
+ filters: filters
771
+ }, extra !== undefined ? {
772
+ extra: extra
773
+ } : {})
774
+ });
775
+ setActivePaginationSource('none');
776
+ setHasMore(false);
777
+ }
778
+ }, [debouncedSearchValue, type, stableScope, fetchSearchEntities, fetchSearchClients, fetchUsersDirectory]);
779
+
780
+ // Sincronizar resultados de search
781
+ useEffect(function () {
782
+ if (type === 'mcp') return;
783
+ var q = debouncedSearchValue.trim();
784
+ if (!q) return;
785
+ setHideRecentsLabel(false);
786
+ if (type === 'client') {
787
+ var _clientsData$clients;
788
+ setLoading(clientsLoading);
789
+ if (clientsError) {
790
+ setError(true);
791
+ return;
792
+ }
793
+ if (clientsData !== null && clientsData !== void 0 && (_clientsData$clients = clientsData.clients) !== null && _clientsData$clients !== void 0 && _clientsData$clients.data) {
794
+ setItems(clientsData.clients.data.map(function (c) {
795
+ return mapClientToItem(c, q);
796
+ }));
797
+ syncClientsPagination(clientsData);
798
+ setError(false);
799
+ }
800
+ } else if (type === 'user') {
801
+ var _usersData$usersDirec;
802
+ setLoading(usersLoading);
803
+ if (usersError) {
804
+ setError(true);
805
+ return;
806
+ }
807
+ if (usersData !== null && usersData !== void 0 && (_usersData$usersDirec = usersData.usersDirectory) !== null && _usersData$usersDirec !== void 0 && _usersData$usersDirec.data) {
808
+ var mapped = usersData.usersDirectory.data.map(function (u) {
809
+ return mapUserToItem(u, q);
810
+ });
811
+ var meId = String(corUser.id);
812
+ var hasMeInResults = mapped.some(function (item) {
813
+ return String(item.id) === meId;
814
+ });
815
+ var withoutMe = mapped.filter(function (item) {
816
+ return String(item.id) !== meId;
817
+ });
818
+ var meItem = mapCorUserToUserItem(corUser, q, t('contextMention.me'));
819
+ setItems(hasMeInResults ? [meItem].concat(_toConsumableArray(withoutMe)) : mapped);
820
+ syncUsersPagination(usersData);
821
+ setError(false);
822
+ }
823
+ } else {
824
+ setLoading(searchLoading);
825
+ if (searchError) {
826
+ setError(true);
827
+ return;
828
+ }
829
+ if (searchData !== null && searchData !== void 0 && searchData.search) {
830
+ setItems(searchData.search.map(function (r) {
831
+ return mapSearchToItem(r, type, q, showProjectNameInTaskRow);
832
+ }));
833
+ setHasMore(false);
834
+ setError(false);
835
+ }
836
+ }
837
+ }, [searchData, clientsData, usersData, searchLoading, clientsLoading, usersLoading, searchError, clientsError, usersError, debouncedSearchValue, type, syncClientsPagination, syncUsersPagination, showProjectNameInTaskRow, corUser, t]);
838
+ var loadMore = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
839
+ var safeCurrentPage, nextPage, q, loadMoreBaselineGen, _data$usersDirectory, _data$usersDirectory2, _data$usersDirectory$, _data$usersDirectory3, _data$usersDirectory$2, _data$usersDirectory4, _yield$fetchUsersDire2, data, nextItems, _data4$clients, _data4$clients2, _data4$clients$data$l, _data4$clients3, _data4$clients$data, _data4$clients4, _yield$fetchSearchCli, _data4, _nextItems, _data5$taskFamily, _data5$taskFamily2, _data5$taskFamily$dat, _data5$taskFamily3, _data5$taskFamily$dat2, _data5$taskFamily4, filter, _yield$fetchTaskFamil2, _data5, _nextItems2, _data6$projects, _data6$projects2, _data6$projects$data$, _data6$projects3, _data6$projects$data, _data6$projects4, argumentsFilter, _yield$fetchProjectsF2, _data6, _nextItems3, _t2;
840
+ return _regeneratorRuntime.wrap(function (_context2) {
841
+ while (1) switch (_context2.prev = _context2.next) {
842
+ case 0:
843
+ if (!(isLoadingMore || !hasMore || activePaginationSource === 'none')) {
844
+ _context2.next = 1;
845
+ break;
846
+ }
847
+ console.info('[useEntitySearch] loadMore skipped', {
848
+ isLoadingMore: isLoadingMore,
849
+ hasMore: hasMore,
850
+ activePaginationSource: activePaginationSource
851
+ });
852
+ return _context2.abrupt("return");
853
+ case 1:
854
+ safeCurrentPage = normalizePositiveInt(currentPage, 1);
855
+ nextPage = safeCurrentPage + 1;
856
+ q = debouncedSearchValue.trim();
857
+ console.info('[useEntitySearch] loadMore start', {
858
+ source: activePaginationSource,
859
+ currentPage: currentPage,
860
+ nextPage: nextPage,
861
+ query: q
862
+ });
863
+ loadMoreBaselineGen = recentsFetchGenerationRef.current;
864
+ setIsLoadingMore(true);
865
+ _context2.prev = 2;
866
+ if (!(activePaginationSource === 'users')) {
867
+ _context2.next = 5;
868
+ break;
869
+ }
870
+ _context2.next = 3;
871
+ return fetchUsersDirectory({
872
+ variables: {
873
+ filters: buildUsersDirectoryFilters(q),
874
+ page: nextPage
875
+ }
876
+ });
877
+ case 3:
878
+ _yield$fetchUsersDire2 = _context2.sent;
879
+ data = _yield$fetchUsersDire2.data;
880
+ if (!(loadMoreBaselineGen !== recentsFetchGenerationRef.current)) {
881
+ _context2.next = 4;
882
+ break;
883
+ }
884
+ return _context2.abrupt("return");
885
+ case 4:
886
+ console.info('[useEntitySearch] users loadMore response', {
887
+ page: data === null || data === void 0 || (_data$usersDirectory = data.usersDirectory) === null || _data$usersDirectory === void 0 ? void 0 : _data$usersDirectory.page,
888
+ lastPage: data === null || data === void 0 || (_data$usersDirectory2 = data.usersDirectory) === null || _data$usersDirectory2 === void 0 ? void 0 : _data$usersDirectory2.lastPage,
889
+ count: (_data$usersDirectory$ = data === null || data === void 0 || (_data$usersDirectory3 = data.usersDirectory) === null || _data$usersDirectory3 === void 0 || (_data$usersDirectory3 = _data$usersDirectory3.data) === null || _data$usersDirectory3 === void 0 ? void 0 : _data$usersDirectory3.length) !== null && _data$usersDirectory$ !== void 0 ? _data$usersDirectory$ : 0
890
+ });
891
+ nextItems = ((_data$usersDirectory$2 = data === null || data === void 0 || (_data$usersDirectory4 = data.usersDirectory) === null || _data$usersDirectory4 === void 0 ? void 0 : _data$usersDirectory4.data) !== null && _data$usersDirectory$2 !== void 0 ? _data$usersDirectory$2 : []).map(function (u) {
892
+ return mapUserToItem(u, q);
893
+ });
894
+ setItems(function (prev) {
895
+ if (!q) {
896
+ var _prev$;
897
+ var meItem = ((_prev$ = prev[0]) === null || _prev$ === void 0 ? void 0 : _prev$.type) === 'user' ? prev[0] : mapCorUserToUserItem(corUser, '', t('contextMention.me'));
898
+ var _existingIds = new Set(prev.map(function (item) {
899
+ return String(item.id);
900
+ }));
901
+ var _appended = nextItems.filter(function (item) {
902
+ return !_existingIds.has(String(item.id));
903
+ });
904
+ var withoutMe = prev.filter(function (item) {
905
+ return String(item.id) !== String(meItem.id);
906
+ });
907
+ return [meItem].concat(_toConsumableArray(withoutMe), _toConsumableArray(_appended));
908
+ }
909
+ var existingIds = new Set(prev.map(function (item) {
910
+ return "".concat(item.type, "-").concat(item.id);
911
+ }));
912
+ var appended = nextItems.filter(function (item) {
913
+ return !existingIds.has("".concat(item.type, "-").concat(item.id));
914
+ });
915
+ return [].concat(_toConsumableArray(prev), _toConsumableArray(appended));
916
+ });
917
+ syncUsersPagination(data);
918
+ _context2.next = 14;
919
+ break;
920
+ case 5:
921
+ if (!(activePaginationSource === 'clients-search')) {
922
+ _context2.next = 8;
923
+ break;
924
+ }
925
+ _context2.next = 6;
926
+ return fetchSearchClients({
927
+ variables: {
928
+ filter: {
929
+ name: q
930
+ },
931
+ page: nextPage,
932
+ perPage: 20
933
+ }
934
+ });
935
+ case 6:
936
+ _yield$fetchSearchCli = _context2.sent;
937
+ _data4 = _yield$fetchSearchCli.data;
938
+ if (!(loadMoreBaselineGen !== recentsFetchGenerationRef.current)) {
939
+ _context2.next = 7;
940
+ break;
941
+ }
942
+ return _context2.abrupt("return");
943
+ case 7:
944
+ console.info('[useEntitySearch] clients loadMore response', {
945
+ page: _data4 === null || _data4 === void 0 || (_data4$clients = _data4.clients) === null || _data4$clients === void 0 ? void 0 : _data4$clients.page,
946
+ lastPage: _data4 === null || _data4 === void 0 || (_data4$clients2 = _data4.clients) === null || _data4$clients2 === void 0 ? void 0 : _data4$clients2.lastPage,
947
+ count: (_data4$clients$data$l = _data4 === null || _data4 === void 0 || (_data4$clients3 = _data4.clients) === null || _data4$clients3 === void 0 || (_data4$clients3 = _data4$clients3.data) === null || _data4$clients3 === void 0 ? void 0 : _data4$clients3.length) !== null && _data4$clients$data$l !== void 0 ? _data4$clients$data$l : 0
948
+ });
949
+ _nextItems = ((_data4$clients$data = _data4 === null || _data4 === void 0 || (_data4$clients4 = _data4.clients) === null || _data4$clients4 === void 0 ? void 0 : _data4$clients4.data) !== null && _data4$clients$data !== void 0 ? _data4$clients$data : []).map(function (c) {
950
+ return mapClientToItem(c, q);
951
+ });
952
+ setItems(function (prev) {
953
+ var existingIds = new Set(prev.map(function (item) {
954
+ return "".concat(item.type, "-").concat(item.id);
955
+ }));
956
+ var appended = _nextItems.filter(function (item) {
957
+ return !existingIds.has("".concat(item.type, "-").concat(item.id));
958
+ });
959
+ return [].concat(_toConsumableArray(prev), _toConsumableArray(appended));
960
+ });
961
+ syncClientsPagination(_data4);
962
+ _context2.next = 14;
963
+ break;
964
+ case 8:
965
+ if (!(activePaginationSource === 'task-fallback')) {
966
+ _context2.next = 11;
967
+ break;
968
+ }
969
+ filter = {};
970
+ if (stableScope.projectId !== null && stableScope.projectId !== undefined && stableScope.projectId !== '') {
971
+ filter.projectIds = [String(stableScope.projectId)];
972
+ }
973
+ if (stableScope.clientId !== null && stableScope.clientId !== undefined && stableScope.clientId !== '') {
974
+ filter.clientIds = [String(stableScope.clientId)];
975
+ }
976
+ _context2.next = 9;
977
+ return fetchTaskFamilyFallback({
978
+ variables: {
979
+ filter: _objectSpread({
980
+ archived: false
981
+ }, filter),
982
+ pagination: {
983
+ offset: (nextPage - 1) * 20,
984
+ size: 20
985
+ }
986
+ }
987
+ });
988
+ case 9:
989
+ _yield$fetchTaskFamil2 = _context2.sent;
990
+ _data5 = _yield$fetchTaskFamil2.data;
991
+ if (!(loadMoreBaselineGen !== recentsFetchGenerationRef.current)) {
992
+ _context2.next = 10;
993
+ break;
994
+ }
995
+ return _context2.abrupt("return");
996
+ case 10:
997
+ console.info('[useEntitySearch] task fallback loadMore response', {
998
+ page: _data5 === null || _data5 === void 0 || (_data5$taskFamily = _data5.taskFamily) === null || _data5$taskFamily === void 0 ? void 0 : _data5$taskFamily.page,
999
+ lastPage: _data5 === null || _data5 === void 0 || (_data5$taskFamily2 = _data5.taskFamily) === null || _data5$taskFamily2 === void 0 ? void 0 : _data5$taskFamily2.lastPage,
1000
+ count: (_data5$taskFamily$dat = _data5 === null || _data5 === void 0 || (_data5$taskFamily3 = _data5.taskFamily) === null || _data5$taskFamily3 === void 0 || (_data5$taskFamily3 = _data5$taskFamily3.data) === null || _data5$taskFamily3 === void 0 ? void 0 : _data5$taskFamily3.length) !== null && _data5$taskFamily$dat !== void 0 ? _data5$taskFamily$dat : 0
1001
+ });
1002
+ _nextItems2 = ((_data5$taskFamily$dat2 = _data5 === null || _data5 === void 0 || (_data5$taskFamily4 = _data5.taskFamily) === null || _data5$taskFamily4 === void 0 ? void 0 : _data5$taskFamily4.data) !== null && _data5$taskFamily$dat2 !== void 0 ? _data5$taskFamily$dat2 : []).map(normalizeTaskFamilyRecord).filter(function (item) {
1003
+ return item !== null;
1004
+ }).map(function (task) {
1005
+ return mapRecentTaskToItem(task, '', showProjectNameInTaskRow);
1006
+ });
1007
+ setItems(function (prev) {
1008
+ var existingIds = new Set(prev.map(function (item) {
1009
+ return "".concat(item.type, "-").concat(item.id);
1010
+ }));
1011
+ var appended = _nextItems2.filter(function (item) {
1012
+ return !existingIds.has("".concat(item.type, "-").concat(item.id));
1013
+ });
1014
+ return [].concat(_toConsumableArray(prev), _toConsumableArray(appended));
1015
+ });
1016
+ syncTaskFallbackPagination(_data5);
1017
+ _context2.next = 14;
1018
+ break;
1019
+ case 11:
1020
+ if (!(activePaginationSource === 'project-fallback')) {
1021
+ _context2.next = 14;
1022
+ break;
1023
+ }
1024
+ argumentsFilter = stableScope.clientId !== null && stableScope.clientId !== undefined && stableScope.clientId !== '' ? {
1025
+ client_id: [String(stableScope.clientId)]
1026
+ } : undefined;
1027
+ _context2.next = 12;
1028
+ return fetchProjectsFallback({
1029
+ variables: _objectSpread(_objectSpread({}, argumentsFilter ? {
1030
+ arguments: argumentsFilter
1031
+ } : {}), {}, {
1032
+ page: nextPage,
1033
+ perPage: 20
1034
+ })
1035
+ });
1036
+ case 12:
1037
+ _yield$fetchProjectsF2 = _context2.sent;
1038
+ _data6 = _yield$fetchProjectsF2.data;
1039
+ if (!(loadMoreBaselineGen !== recentsFetchGenerationRef.current)) {
1040
+ _context2.next = 13;
1041
+ break;
1042
+ }
1043
+ return _context2.abrupt("return");
1044
+ case 13:
1045
+ console.info('[useEntitySearch] project fallback loadMore response', {
1046
+ page: _data6 === null || _data6 === void 0 || (_data6$projects = _data6.projects) === null || _data6$projects === void 0 ? void 0 : _data6$projects.page,
1047
+ lastPage: _data6 === null || _data6 === void 0 || (_data6$projects2 = _data6.projects) === null || _data6$projects2 === void 0 ? void 0 : _data6$projects2.lastPage,
1048
+ count: (_data6$projects$data$ = _data6 === null || _data6 === void 0 || (_data6$projects3 = _data6.projects) === null || _data6$projects3 === void 0 || (_data6$projects3 = _data6$projects3.data) === null || _data6$projects3 === void 0 ? void 0 : _data6$projects3.length) !== null && _data6$projects$data$ !== void 0 ? _data6$projects$data$ : 0
1049
+ });
1050
+ _nextItems3 = ((_data6$projects$data = _data6 === null || _data6 === void 0 || (_data6$projects4 = _data6.projects) === null || _data6$projects4 === void 0 ? void 0 : _data6$projects4.data) !== null && _data6$projects$data !== void 0 ? _data6$projects$data : []).map(normalizeProjectsFallbackRecord).filter(function (item) {
1051
+ return item !== null;
1052
+ }).map(function (item) {
1053
+ return mapSearchToItem(item, 'project', '');
1054
+ });
1055
+ setItems(function (prev) {
1056
+ var existingIds = new Set(prev.map(function (item) {
1057
+ return "".concat(item.type, "-").concat(item.id);
1058
+ }));
1059
+ var appended = _nextItems3.filter(function (item) {
1060
+ return !existingIds.has("".concat(item.type, "-").concat(item.id));
1061
+ });
1062
+ return [].concat(_toConsumableArray(prev), _toConsumableArray(appended));
1063
+ });
1064
+ syncProjectFallbackPagination(_data6);
1065
+ case 14:
1066
+ _context2.next = 17;
1067
+ break;
1068
+ case 15:
1069
+ _context2.prev = 15;
1070
+ _t2 = _context2["catch"](2);
1071
+ if (!(loadMoreBaselineGen !== recentsFetchGenerationRef.current)) {
1072
+ _context2.next = 16;
1073
+ break;
1074
+ }
1075
+ return _context2.abrupt("return");
1076
+ case 16:
1077
+ console.error('[useEntitySearch] loadMore failed', {
1078
+ source: activePaginationSource,
1079
+ nextPage: nextPage,
1080
+ error: _t2
1081
+ });
1082
+ // Evita loop de reintentos automáticos por scroll cuando backend está caído (ej. 503).
1083
+ setError(true);
1084
+ setHasMore(false);
1085
+ case 17:
1086
+ _context2.prev = 17;
1087
+ setIsLoadingMore(false);
1088
+ console.info('[useEntitySearch] loadMore finished', {
1089
+ source: activePaginationSource,
1090
+ nextPage: nextPage
1091
+ });
1092
+ return _context2.finish(17);
1093
+ case 18:
1094
+ case "end":
1095
+ return _context2.stop();
1096
+ }
1097
+ }, _callee2, null, [[2, 15, 17, 18]]);
1098
+ })), [isLoadingMore, hasMore, currentPage, activePaginationSource, debouncedSearchValue, fetchUsersDirectory, fetchSearchClients, fetchTaskFamilyFallback, fetchProjectsFallback, stableScope.projectId, stableScope.clientId, showProjectNameInTaskRow, corUser, t, syncClientsPagination, syncUsersPagination, syncTaskFallbackPagination, syncProjectFallbackPagination]);
1099
+
1100
+ // Cuando se limpia el search, volver a recents
1101
+ useEffect(function () {
1102
+ if (!debouncedSearchValue.trim()) {
1103
+ fetchRecent();
1104
+ }
1105
+ }, [debouncedSearchValue, fetchRecent]);
1106
+ return {
1107
+ items: items,
1108
+ loading: loading,
1109
+ error: error,
1110
+ hideRecentsLabel: hideRecentsLabel,
1111
+ hasMore: hasMore,
1112
+ isLoadingMore: isLoadingMore,
1113
+ loadMore: loadMore,
1114
+ searchValue: searchValue,
1115
+ updateSearchValue: setSearchValue,
1116
+ fetchRecent: fetchRecent
1117
+ };
1118
+ };
1119
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VMYXp5UXVlcnkiLCJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsImdldFJlY2VudENsaWVudHMiLCJnZXRSZWNlbnRQcm9qZWN0cyIsImdldFJlY2VudFRhc2tzIiwidXNlVXNlciIsIlBST0pFQ1RTX0ZBTExCQUNLIiwiU0VBUkNIX0VOVElUSUVTIiwiVEFTS19GQU1JTFlfRkFMTEJBQ0siLCJTRUFSQ0hfQ0xJRU5UUyIsIlVTRVJTX0RJUkVDVE9SWSIsIlNFQVJDSF9RVUVSWV9ERUJPVU5DRV9NUyIsInVzZURlYm91bmNlIiwidXNlVCIsIm5vcm1hbGl6ZVBvc2l0aXZlSW50IiwidmFsdWUiLCJmYWxsYmFjayIsInBhcnNlZCIsIk51bWJlciIsImlzRmluaXRlIiwibm9ybWFsaXplZCIsIk1hdGgiLCJmbG9vciIsIkJBU0VfRklMVEVSU19CWV9UWVBFIiwicHJvamVjdCIsImFyY2hpdmVkIiwidGFzayIsImJ1aWxkVGFza1NlYXJjaEV4dHJhRW50cmllcyIsInNjb3BlIiwicmF3Q2xpZW50IiwiY2xpZW50SWQiLCJ1bmRlZmluZWQiLCJTdHJpbmciLCJyYXdQcm9qZWN0IiwicHJvamVjdElkIiwiYWdlbnRFbnRpdHkiLCJlbnRyaWVzIiwicHVzaENsaWVudCIsInB1c2giLCJwdXNoUHJvamVjdCIsImJ1aWxkVGFza1NlYXJjaEV4dHJhIiwibGVuZ3RoIiwiSlNPTiIsInN0cmluZ2lmeSIsImJ1aWxkUHJvamVjdFNlYXJjaEV4dHJhIiwiYnVpbGRTZWFyY2hFbnRpdGllc0V4dHJhIiwidHlwZSIsImJ1aWxkRmlsdGVyc0ZvclR5cGUiLCJidWlsZFVzZXJzRGlyZWN0b3J5RmlsdGVycyIsInEiLCJiYXNlIiwid2l0aFBvc2l0aW9uIiwid2l0aFRlYW1zIiwidHJpbW1lZFEiLCJ0cmltIiwic2VhcmNoSW5wdXQiLCJoaWdobGlnaHRSYW5nZSIsInRleHQiLCJzZWFyY2hWYWx1ZSIsImlkeCIsInRvTG93ZXJDYXNlIiwiaW5kZXhPZiIsInN0YXJ0IiwiZmlyc3REZWZpbmVkIiwiX2xlbiIsImFyZ3VtZW50cyIsInZhbHVlcyIsIkFycmF5IiwiX2tleSIsImZpbmQiLCJtYXBDbGllbnRUb0l0ZW0iLCJjIiwiX2MkdG90YWxQcm95ZWN0b3MiLCJfYyR0b3RhbFByb3llY3RvczIiLCJpZCIsInByaW1hcnkiLCJuYW1lIiwicHJpbWFyeUhpZ2hsaWdodCIsImJyZWFkY3J1bWIiLCJjb3VudCIsInRvdGFsUHJveWVjdG9zIiwiY291bnRMYWJlbCIsInJhdyIsIm1hcFVzZXJUb0l0ZW0iLCJ1IiwiX3UkZmlyc3ROYW1lIiwiX3UkbGFzdE5hbWUiLCJfdSRwaWN0dXJlIiwiX3UkcG9zaXRpb25OYW1lIiwiX3UkZW1haWwiLCJmdWxsTmFtZSIsImNvbmNhdCIsImZpcnN0TmFtZSIsImxhc3ROYW1lIiwiZW1haWwiLCJwaWN0dXJlIiwicG9zaXRpb25OYW1lIiwibWFwQ29yVXNlclRvVXNlckl0ZW0iLCJ1c2VyIiwibWVMYWJlbCIsIl91c2VyJGZpcnN0TmFtZSIsIl91c2VyJGxhc3ROYW1lIiwiX3VzZXIkdXNlcl9wb3NpdGlvbiIsIl91c2VyJGVtYWlsIiwicG9zaXRpb25MaW5lIiwidXNlcl9wb3NpdGlvbiIsIm1hcFJlY2VudFRhc2tUb0l0ZW0iLCJfdGFzayRwcm9qZWN0TmFtZSIsInNob3dQcm9qZWN0TmFtZUluVGFza1JvdyIsInRpdGxlIiwicHJvamVjdE5hbWUiLCJwYXJlbnQiLCJub3JtYWxpemVUYXNrRmFtaWx5UmVjb3JkIiwicmVjb3JkIiwiX3JlY29yZCR0aXRsZSIsIl9maXJzdERlZmluZWQiLCJfcmVjb3JkJHByb2plY3QiLCJfcmVjb3JkJGZhdGhlciIsIl9yZWNvcmQkZmF0aGVyMiIsInRhc2tGYW1pbHlJZCIsIl9pZCIsImZhdGhlciIsImhhc0ZhdGhlciIsInRhc2tGYXRoZXIiLCJub3JtYWxpemVQcm9qZWN0c0ZhbGxiYWNrUmVjb3JkIiwiX3JlY29yZCRuYW1lIiwiX2ZpcnN0RGVmaW5lZDIiLCJfcmVjb3JkJGNsaWVudCIsIl9yZWNvcmQkY2xpZW50JG5hbWUiLCJfcmVjb3JkJGNsaWVudDIiLCJjbGllbnQiLCJjbGllbnROYW1lIiwibWFwU2VhcmNoVG9JdGVtIiwiciIsIl9yJHByb2plY3ROYW1lIiwiX3IkcHJvamVjdE5hbWUyIiwiX3IkY2xpZW50SWQiLCJfciRjbGllbnROYW1lIiwiX3IkZmVlSWQiLCJfZmF0aGVyJHRpdGxlIiwidGFza1Byb2plY3ROYW1lIiwiZmVlSWQiLCJmYXRoZXJJZCIsImZhdGhlclRpdGxlIiwiZm9ybWF0TWNwUHJpbWFyeUxhYmVsIiwic2x1ZyIsInJlcGxhY2UiLCJjaGFyIiwidG9VcHBlckNhc2UiLCJtYXBNY3BTbHVnc1RvSXRlbXMiLCJzbHVncyIsImZpbHRlcmVkIiwiZmlsdGVyIiwicyIsImluY2x1ZGVzIiwibWFwIiwidXNlRW50aXR5U2VhcmNoIiwiX3Njb3BlJG1jcFNsdWdzIiwiY29yVXNlciIsIl91c2VUIiwidCIsInJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJzZXRTZWFyY2hWYWx1ZSIsImRlYm91bmNlZFNlYXJjaFZhbHVlIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJpdGVtcyIsInNldEl0ZW1zIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJsb2FkaW5nIiwic2V0TG9hZGluZyIsIl91c2VTdGF0ZTciLCJfdXNlU3RhdGU4IiwiZXJyb3IiLCJzZXRFcnJvciIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUwIiwiaGlkZVJlY2VudHNMYWJlbCIsInNldEhpZGVSZWNlbnRzTGFiZWwiLCJfdXNlU3RhdGUxIiwiX3VzZVN0YXRlMTAiLCJoYXNNb3JlIiwic2V0SGFzTW9yZSIsIl91c2VTdGF0ZTExIiwiX3VzZVN0YXRlMTIiLCJpc0xvYWRpbmdNb3JlIiwic2V0SXNMb2FkaW5nTW9yZSIsIl91c2VTdGF0ZTEzIiwiX3VzZVN0YXRlMTQiLCJjdXJyZW50UGFnZSIsInNldEN1cnJlbnRQYWdlIiwiX3VzZVN0YXRlMTUiLCJfdXNlU3RhdGUxNiIsImFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UiLCJzZXRBY3RpdmVQYWdpbmF0aW9uU291cmNlIiwibWNwU2x1Z3NLZXkiLCJtY3BTbHVncyIsImpvaW4iLCJzdGFibGVTY29wZSIsIl9zY29wZSRjbGllbnRJZCIsIl9zY29wZSRwcm9qZWN0SWQiLCJfc2NvcGUkbWNwU2x1Z3MyIiwiX3Njb3BlJGFnZW50RW50aXR5IiwiX3VzZUxhenlRdWVyeSIsInZhcmlhYmxlcyIsImxpbWl0IiwiZmV0Y2hQb2xpY3kiLCJfdXNlTGF6eVF1ZXJ5MiIsImZldGNoU2VhcmNoRW50aXRpZXMiLCJfdXNlTGF6eVF1ZXJ5MiQiLCJzZWFyY2hEYXRhIiwiZGF0YSIsInNlYXJjaExvYWRpbmciLCJzZWFyY2hFcnJvciIsIl91c2VMYXp5UXVlcnkzIiwiX3VzZUxhenlRdWVyeTQiLCJmZXRjaFNlYXJjaENsaWVudHMiLCJfdXNlTGF6eVF1ZXJ5NCQiLCJjbGllbnRzRGF0YSIsImNsaWVudHNMb2FkaW5nIiwiY2xpZW50c0Vycm9yIiwiX3VzZUxhenlRdWVyeTUiLCJfdXNlTGF6eVF1ZXJ5NiIsImZldGNoVXNlcnNEaXJlY3RvcnkiLCJfdXNlTGF6eVF1ZXJ5NiQiLCJ1c2Vyc0RhdGEiLCJ1c2Vyc0xvYWRpbmciLCJ1c2Vyc0Vycm9yIiwic3luY1VzZXJzUGFnaW5hdGlvbiIsInBheWxvYWQiLCJfcGF5bG9hZCR1c2Vyc0RpcmVjdG8iLCJfcGF5bG9hZCR1c2Vyc0RpcmVjdG8yIiwicGFnZSIsInVzZXJzRGlyZWN0b3J5IiwibGFzdFBhZ2UiLCJzeW5jQ2xpZW50c1BhZ2luYXRpb24iLCJfcGF5bG9hZCRjbGllbnRzIiwiX3BheWxvYWQkY2xpZW50czIiLCJjbGllbnRzIiwic3luY1Rhc2tGYWxsYmFja1BhZ2luYXRpb24iLCJfcGF5bG9hZCR0YXNrRmFtaWx5IiwiX3BheWxvYWQkdGFza0ZhbWlseTIiLCJyYXdQYWdlIiwidGFza0ZhbWlseSIsInN5bmNQcm9qZWN0RmFsbGJhY2tQYWdpbmF0aW9uIiwiX3BheWxvYWQkcHJvamVjdHMiLCJfcGF5bG9hZCRwcm9qZWN0czIiLCJwcm9qZWN0cyIsIl91c2VMYXp5UXVlcnk3IiwiX3VzZUxhenlRdWVyeTgiLCJmZXRjaFRhc2tGYW1pbHlGYWxsYmFjayIsIl91c2VMYXp5UXVlcnk5IiwiX3VzZUxhenlRdWVyeTAiLCJmZXRjaFByb2plY3RzRmFsbGJhY2siLCJmZXRjaFJlY2VudCIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwiZ2VuZXJhdGlvbiIsIl9zdGFibGVTY29wZSRtY3BTbHVncyIsIm1hcHBlZCIsIl9kYXRhIiwiX21hcHBlZCIsIl9mYWxsYmFja0RhdGEkcHJvamVjdCIsIl9mYWxsYmFja0RhdGEkcHJvamVjdDIiLCJhcmd1bWVudHNGaWx0ZXIiLCJfeWllbGQkZmV0Y2hQcm9qZWN0c0YiLCJmYWxsYmFja0RhdGEiLCJmYWxsYmFja01hcHBlZCIsInJlY2VudFRhc2tGaWx0ZXJzIiwiX2RhdGEyIiwidGFza0l0ZW1zIiwiX2ZhbGxiYWNrRGF0YSR0YXNrRmFtIiwiX2ZhbGxiYWNrRGF0YSR0YXNrRmFtMiIsIl95aWVsZCRmZXRjaFRhc2tGYW1pbCIsIl9mYWxsYmFja0RhdGEiLCJfZGF0YTMkdXNlcnNEaXJlY3RvcnkiLCJfZGF0YTMkdXNlcnNEaXJlY3RvcnkyIiwiX3lpZWxkJGZldGNoVXNlcnNEaXJlIiwiX2RhdGEzIiwiX21hcHBlZDIiLCJtZUl0ZW0iLCJ3aXRob3V0TWUiLCJfdCIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiY3VycmVudCIsImFicnVwdCIsInNlbnQiLCJpc0FycmF5IiwicCIsImNsaWVudF9pZCIsIl9vYmplY3RTcHJlYWQiLCJwZXJQYWdlIiwiaXRlbSIsInByb2plY3RJZHMiLCJjbGllbnRJZHMiLCJwYWdpbmF0aW9uIiwib2Zmc2V0Iiwic2l6ZSIsImZpbHRlcnMiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJmaW5pc2giLCJzdG9wIiwiX3N0YWJsZVNjb3BlJG1jcFNsdWdzMiIsImV4dHJhIiwiX2NsaWVudHNEYXRhJGNsaWVudHMiLCJfdXNlcnNEYXRhJHVzZXJzRGlyZWMiLCJtZUlkIiwiaGFzTWVJblJlc3VsdHMiLCJzb21lIiwic2VhcmNoIiwibG9hZE1vcmUiLCJfY2FsbGVlMiIsInNhZmVDdXJyZW50UGFnZSIsIm5leHRQYWdlIiwibG9hZE1vcmVCYXNlbGluZUdlbiIsIl9kYXRhJHVzZXJzRGlyZWN0b3J5IiwiX2RhdGEkdXNlcnNEaXJlY3RvcnkyIiwiX2RhdGEkdXNlcnNEaXJlY3RvcnkkIiwiX2RhdGEkdXNlcnNEaXJlY3RvcnkzIiwiX2RhdGEkdXNlcnNEaXJlY3RvcnkkMiIsIl9kYXRhJHVzZXJzRGlyZWN0b3J5NCIsIl95aWVsZCRmZXRjaFVzZXJzRGlyZTIiLCJuZXh0SXRlbXMiLCJfZGF0YTQkY2xpZW50cyIsIl9kYXRhNCRjbGllbnRzMiIsIl9kYXRhNCRjbGllbnRzJGRhdGEkbCIsIl9kYXRhNCRjbGllbnRzMyIsIl9kYXRhNCRjbGllbnRzJGRhdGEiLCJfZGF0YTQkY2xpZW50czQiLCJfeWllbGQkZmV0Y2hTZWFyY2hDbGkiLCJfZGF0YTQiLCJfbmV4dEl0ZW1zIiwiX2RhdGE1JHRhc2tGYW1pbHkiLCJfZGF0YTUkdGFza0ZhbWlseTIiLCJfZGF0YTUkdGFza0ZhbWlseSRkYXQiLCJfZGF0YTUkdGFza0ZhbWlseTMiLCJfZGF0YTUkdGFza0ZhbWlseSRkYXQyIiwiX2RhdGE1JHRhc2tGYW1pbHk0IiwiX3lpZWxkJGZldGNoVGFza0ZhbWlsMiIsIl9kYXRhNSIsIl9uZXh0SXRlbXMyIiwiX2RhdGE2JHByb2plY3RzIiwiX2RhdGE2JHByb2plY3RzMiIsIl9kYXRhNiRwcm9qZWN0cyRkYXRhJCIsIl9kYXRhNiRwcm9qZWN0czMiLCJfZGF0YTYkcHJvamVjdHMkZGF0YSIsIl9kYXRhNiRwcm9qZWN0czQiLCJfeWllbGQkZmV0Y2hQcm9qZWN0c0YyIiwiX2RhdGE2IiwiX25leHRJdGVtczMiLCJfdDIiLCJfY29udGV4dDIiLCJjb25zb2xlIiwiaW5mbyIsInNvdXJjZSIsInF1ZXJ5IiwiX3ByZXYkIiwiZXhpc3RpbmdJZHMiLCJTZXQiLCJhcHBlbmRlZCIsImhhcyIsInVwZGF0ZVNlYXJjaFZhbHVlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hvb2tzL3VzZUVudGl0eVNlYXJjaC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VMYXp5UXVlcnkgfSBmcm9tICdAYXBvbGxvL2NsaWVudCdcbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGdldFJlY2VudENsaWVudHMgfSBmcm9tICcuLi9zZXJ2aWNlcy9tYWlhL1JlY2VudENsaWVudHMvZ2V0UmVjZW50Q2xpZW50cydcbmltcG9ydCB7IGdldFJlY2VudFByb2plY3RzIH0gZnJvbSAnLi4vc2VydmljZXMvbWFpYS9SZWNlbnRQcm9qZWN0cy9nZXRSZWNlbnRQcm9qZWN0cydcbmltcG9ydCB7IGdldFJlY2VudFRhc2tzIH0gZnJvbSAnLi4vc2VydmljZXMvbWFpYS9SZWNlbnRUYXNrcy9nZXRSZWNlbnRUYXNrcydcbmltcG9ydCB0eXBlIHsgUmVjZW50VGFza0l0ZW0gfSBmcm9tICcuLi9zZXJ2aWNlcy9tYWlhL1JlY2VudFRhc2tzL2dldFJlY2VudFRhc2tzJ1xuaW1wb3J0IHsgdXNlVXNlciB9IGZyb20gJy4uL2NvbnRleHQvY29yLXVzZXInXG5pbXBvcnQgeyBQUk9KRUNUU19GQUxMQkFDSywgU0VBUkNIX0VOVElUSUVTLCBUQVNLX0ZBTUlMWV9GQUxMQkFDSyB9IGZyb20gJy4uL3NlcnZpY2VzL3F1ZXJ5L2VudGl0eVNlYXJjaFF1ZXJ5J1xuaW1wb3J0IHsgU0VBUkNIX0NMSUVOVFMgfSBmcm9tICcuLi9zZXJ2aWNlcy9xdWVyeS9DbGllbnRTZWFyY2hRdWVyeSdcbmltcG9ydCB7IFVTRVJTX0RJUkVDVE9SWSB9IGZyb20gJy4uL3NlcnZpY2VzL3F1ZXJ5L3VzZXJzRGlyZWN0b3J5UXVlcnknXG5pbXBvcnQgeyBTRUFSQ0hfUVVFUllfREVCT1VOQ0VfTVMgfSBmcm9tICcuLi9jb25zdGFudHMvY29uZmlnJ1xuaW1wb3J0IHsgdXNlRGVib3VuY2UgfSBmcm9tICcuL3VzZURlYm91bmNlJ1xuaW1wb3J0IHsgdXNlVCB9IGZyb20gJy4vdXNlVCdcbmltcG9ydCB7IENvbnRleHRFbnRpdHlUeXBlLCBDb250ZXh0TWVudGlvbkl0ZW0gfSBmcm9tICcuLi90eXBlcy9jb250ZXh0TWVudGlvbidcbmltcG9ydCB0eXBlIHsgQWdlbnRFbnRpdHkgfSBmcm9tICcuLi90eXBlcy9hZ2VudCdcblxudHlwZSBSYXdTZWFyY2hSZXN1bHQgPSB7XG4gIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgdGl0bGU6IHN0cmluZ1xuICB0eXBlPzogc3RyaW5nXG4gIGNsaWVudElkPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbFxuICBmZWVJZD86IG51bWJlciB8IHN0cmluZyB8IG51bGxcbiAgY2xpZW50TmFtZT86IHN0cmluZyB8IG51bGxcbiAgcHJvamVjdE5hbWU/OiBzdHJpbmcgfCBudWxsXG4gIGZhdGhlcj86IHsgaWQ6IHN0cmluZyB8IG51bWJlcjsgdGl0bGU/OiBzdHJpbmcgfCBudWxsIH0gfCBudWxsXG59XG5cbnR5cGUgUmF3Q2xpZW50ID0ge1xuICBpZDogbnVtYmVyIHwgc3RyaW5nXG4gIG5hbWU6IHN0cmluZ1xuICB0b3RhbFByb3llY3Rvcz86IG51bWJlciB8IG51bGxcbn1cblxudHlwZSBSYXdEaXJlY3RvcnlVc2VyID0ge1xuICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gIGZpcnN0TmFtZT86IHN0cmluZyB8IG51bGxcbiAgbGFzdE5hbWU/OiBzdHJpbmcgfCBudWxsXG4gIGVtYWlsPzogc3RyaW5nIHwgbnVsbFxuICBwaWN0dXJlPzogc3RyaW5nIHwgbnVsbFxuICBwb3NpdGlvbk5hbWU/OiBzdHJpbmcgfCBudWxsXG59XG5cbnR5cGUgU2VhcmNoRW50aXRpZXNEYXRhID0geyBzZWFyY2g6IFJhd1NlYXJjaFJlc3VsdFtdIHwgbnVsbCB9XG50eXBlIFNlYXJjaENsaWVudHNEYXRhID0ge1xuICBjbGllbnRzOiB7XG4gICAgdG90YWw/OiBudW1iZXIgfCBudWxsXG4gICAgcGVyUGFnZT86IG51bWJlciB8IG51bGxcbiAgICBwYWdlPzogbnVtYmVyIHwgbnVsbFxuICAgIGxhc3RQYWdlPzogbnVtYmVyIHwgbnVsbFxuICAgIGRhdGE6IFJhd0NsaWVudFtdXG4gIH0gfCBudWxsXG59XG50eXBlIFVzZXJzRGlyZWN0b3J5RGF0YSA9IHtcbiAgdXNlcnNEaXJlY3Rvcnk6IHtcbiAgICB0b3RhbD86IG51bWJlciB8IG51bGxcbiAgICBwZXJQYWdlPzogbnVtYmVyIHwgbnVsbFxuICAgIHBhZ2U/OiBudW1iZXIgfCBudWxsXG4gICAgbGFzdFBhZ2U/OiBudW1iZXIgfCBudWxsXG4gICAgZGF0YTogUmF3RGlyZWN0b3J5VXNlcltdIHwgbnVsbFxuICB9IHwgbnVsbFxufVxuXG50eXBlIFRhc2tGYW1pbHlSZWNvcmQgPSB7XG4gIF9pZD86IHN0cmluZyB8IG51bWJlciB8IG51bGxcbiAgdGl0bGU/OiBzdHJpbmcgfCBudWxsXG4gIHByb2plY3RJZD86IHN0cmluZyB8IG51bWJlciB8IG51bGxcbiAgdGFza0ZhdGhlcj86IHN0cmluZyB8IG51bWJlciB8IG51bGxcbiAgZmF0aGVyPzogeyBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGw7IHRpdGxlPzogc3RyaW5nIHwgbnVsbCB9IHwgbnVsbFxuICBwcm9qZWN0PzogeyBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGw7IG5hbWU/OiBzdHJpbmcgfCBudWxsIH0gfCBudWxsXG59XG5cbnR5cGUgVGFza0ZhbWlseURhdGEgPSB7XG4gIHRhc2tGYW1pbHk/OiB7XG4gICAgdG90YWw/OiBudW1iZXIgfCBudWxsXG4gICAgcGVyUGFnZT86IG51bWJlciB8IG51bGxcbiAgICBwYWdlPzogbnVtYmVyIHwgbnVsbFxuICAgIGxhc3RQYWdlPzogbnVtYmVyIHwgbnVsbFxuICAgIGRhdGE/OiBUYXNrRmFtaWx5UmVjb3JkW10gfCBudWxsXG4gIH0gfCBudWxsXG59XG5cbnR5cGUgRmFsbGJhY2tQcm9qZWN0UmVjb3JkID0ge1xuICBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGxcbiAgbmFtZT86IHN0cmluZyB8IG51bGxcbiAgY2xpZW50SWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsXG4gIGNsaWVudD86IHsgaWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsOyBuYW1lPzogc3RyaW5nIHwgbnVsbCB9IHwgbnVsbFxufVxuXG50eXBlIFByb2plY3RzRmFsbGJhY2tEYXRhID0ge1xuICBwcm9qZWN0cz86IHtcbiAgICB0b3RhbD86IG51bWJlciB8IG51bGxcbiAgICBwZXJQYWdlPzogbnVtYmVyIHwgbnVsbFxuICAgIHBhZ2U/OiBudW1iZXIgfCBudWxsXG4gICAgbGFzdFBhZ2U/OiBudW1iZXIgfCBudWxsXG4gICAgZGF0YT86IEZhbGxiYWNrUHJvamVjdFJlY29yZFtdIHwgbnVsbFxuICB9IHwgbnVsbFxufVxuXG50eXBlIFBhZ2luYXRpb25Tb3VyY2UgPSAnbm9uZScgfCAndXNlcnMnIHwgJ2NsaWVudHMtc2VhcmNoJyB8ICd0YXNrLWZhbGxiYWNrJyB8ICdwcm9qZWN0LWZhbGxiYWNrJ1xuXG5jb25zdCBub3JtYWxpemVQb3NpdGl2ZUludCA9ICh2YWx1ZTogdW5rbm93biwgZmFsbGJhY2s6IG51bWJlcik6IG51bWJlciA9PiB7XG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSlcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSkgcmV0dXJuIGZhbGxiYWNrXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBNYXRoLmZsb29yKHBhcnNlZClcbiAgcmV0dXJuIG5vcm1hbGl6ZWQgPiAwID8gbm9ybWFsaXplZCA6IGZhbGxiYWNrXG59XG5cbi8qKlxuICogUmVzdHJpbmdlIGxvcyByZXN1bHRhZG9zIGFsIGBjbGllbnRJZGAvYHByb2plY3RJZGAgZGVsIGFnZW50ZSBhY3Rpdm8uXG4gKiBDdWFuZG8gZWwgYWdlbnRlIGVzdMOhIHNjb3BlYWRvIGEgdW4gY2xpZW50L3Byb2plY3QsIHRhbnRvIGxvcyByZWNlbnRzIGNvbW9cbiAqIGVsIHNlYXJjaCBkZWJlbiBmaWx0cmFyIHBvciBlc2UgY29udGV4dG8uIFNpIGVsIGJhY2tlbmQgbm8gZW50aWVuZGUgYWxnw7puXG4gKiBjYW1wbyBsbyBpZ25vcmEgeSBzZSBjYWUgYWwgY29tcG9ydGFtaWVudG8gZ2xvYmFsLlxuICovXG5leHBvcnQgdHlwZSBFbnRpdHlTZWFyY2hTY29wZSA9IHtcbiAgY2xpZW50SWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsXG4gIHByb2plY3RJZD86IHN0cmluZyB8IG51bWJlciB8IG51bGxcbiAgLyoqIFNsdWdzIGRlbCBjb25lY3RvciBNQ1AgZGVsIGFnZW50ZSAobGlzdGFkbyBsb2NhbCwgc2luIEdyYXBoUUwpLiAqL1xuICBtY3BTbHVncz86IHN0cmluZ1tdXG4gIC8qKlxuICAgKiBgZW50aXR5YCBkZWwgYWdlbnRlIGFjdGl2by4gUGFyYSBlc3BlY2lhbGlzdGFzOlxuICAgKiAtIGBwcm9qZWN0YDogYsO6c3F1ZWRhIGRlIHRhcmVhcyBmdWVyemEgZmlsdHJvIHBvciBgcHJvamVjdElkYCBkZWwgY29udGV4dG8uXG4gICAqIC0gYGNsaWVudGA6IGLDunNxdWVkYSBkZSBwcm95ZWN0b3MgcG9yIGBjbGllbnRJZGA7IHRhcmVhcyBwb3IgY2xpZW50ZSAoeSBwcm95ZWN0byBzaSBhcGxpY2EpLlxuICAgKi9cbiAgYWdlbnRFbnRpdHk/OiBBZ2VudEVudGl0eSB8IG51bGxcbn1cblxudHlwZSBTZWFyY2hGaWx0ZXJhYmxlVHlwZSA9ICdwcm9qZWN0JyB8ICd0YXNrJ1xuXG5jb25zdCBCQVNFX0ZJTFRFUlNfQllfVFlQRTogUmVjb3JkPFNlYXJjaEZpbHRlcmFibGVUeXBlLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHtcbiAgcHJvamVjdDogeyBwcm9qZWN0OiAndHJ1ZScsIGFyY2hpdmVkOiAnYWxsJyB9LFxuICB0YXNrOiB7IHRhc2s6ICd0cnVlJywgYXJjaGl2ZWQ6ICdmYWxzZScgfSxcbn1cblxuLyoqXG4gKiBFbnRyYWRhcyBwYXJhIGVsIGFyZ3VtZW50byBHcmFwaFFMIGBleHRyYWAgKEpTT04gc3RyaW5nIGRlIGFycmF5KSBhbCBidXNjYXIgdGFyZWFzIGNvbiBjb250ZXh0by5cbiAqIEVqLjogW3tcInByb2plY3RJZFwiOlwiODgxNTUyXCJ9XVxuICovXG5jb25zdCBidWlsZFRhc2tTZWFyY2hFeHRyYUVudHJpZXMgPSAoc2NvcGU/OiBFbnRpdHlTZWFyY2hTY29wZSk6IEFycmF5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0+IHtcbiAgY29uc3QgcmF3Q2xpZW50ID1cbiAgICBzY29wZT8uY2xpZW50SWQgIT09IHVuZGVmaW5lZCAmJiBzY29wZT8uY2xpZW50SWQgIT09IG51bGwgJiYgc2NvcGU/LmNsaWVudElkICE9PSAnJyA/IFN0cmluZyhzY29wZS5jbGllbnRJZCkgOiBudWxsXG4gIGNvbnN0IHJhd1Byb2plY3QgPVxuICAgIHNjb3BlPy5wcm9qZWN0SWQgIT09IHVuZGVmaW5lZCAmJiBzY29wZT8ucHJvamVjdElkICE9PSBudWxsICYmIHNjb3BlPy5wcm9qZWN0SWQgIT09ICcnXG4gICAgICA/IFN0cmluZyhzY29wZS5wcm9qZWN0SWQpXG4gICAgICA6IG51bGxcblxuICBjb25zdCBhZ2VudEVudGl0eSA9IHNjb3BlPy5hZ2VudEVudGl0eVxuICBjb25zdCBlbnRyaWVzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IFtdXG5cbiAgY29uc3QgcHVzaENsaWVudCA9ICgpID0+IHtcbiAgICBpZiAocmF3Q2xpZW50KSBlbnRyaWVzLnB1c2goeyBjbGllbnRJZDogcmF3Q2xpZW50IH0pXG4gIH1cbiAgY29uc3QgcHVzaFByb2plY3QgPSAoKSA9PiB7XG4gICAgaWYgKHJhd1Byb2plY3QpIGVudHJpZXMucHVzaCh7IHByb2plY3RJZDogcmF3UHJvamVjdCB9KVxuICB9XG5cbiAgaWYgKGFnZW50RW50aXR5ID09PSAncHJvamVjdCcpIHtcbiAgICBpZiAocmF3UHJvamVjdCkge1xuICAgICAgcHVzaFByb2plY3QoKVxuICAgIH0gZWxzZSBpZiAocmF3Q2xpZW50KSB7XG4gICAgICBwdXNoQ2xpZW50KClcbiAgICB9XG4gIH0gZWxzZSBpZiAoYWdlbnRFbnRpdHkgPT09ICdjbGllbnQnKSB7XG4gICAgcHVzaENsaWVudCgpXG4gICAgcHVzaFByb2plY3QoKVxuICB9IGVsc2Uge1xuICAgIHB1c2hDbGllbnQoKVxuICAgIHB1c2hQcm9qZWN0KClcbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzXG59XG5cbmNvbnN0IGJ1aWxkVGFza1NlYXJjaEV4dHJhID0gKHNjb3BlPzogRW50aXR5U2VhcmNoU2NvcGUpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBlbnRyaWVzID0gYnVpbGRUYXNrU2VhcmNoRXh0cmFFbnRyaWVzKHNjb3BlKVxuICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGVudHJpZXMpXG59XG5cbi8qKlxuICogVGFiIHByb3llY3RvOiBjb24gYGNsaWVudElkYCBlbiBlbCBzY29wZSwgYGV4dHJhYCBhY290YSBsYSBiw7pzcXVlZGEgYSBwcm95ZWN0b3MgZGUgZXNlIGNsaWVudGUuXG4gKiBFai46IGBbe1wiY2xpZW50SWRcIjpcIjQ3MTA1XCJ9XWAganVudG8gYSBgZmlsdGVyc2AgYHtcInByb2plY3RcIjpcInRydWVcIixcImFyY2hpdmVkXCI6XCJhbGxcIn1gLlxuICovXG5jb25zdCBidWlsZFByb2plY3RTZWFyY2hFeHRyYSA9IChzY29wZT86IEVudGl0eVNlYXJjaFNjb3BlKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgcmF3Q2xpZW50ID1cbiAgICBzY29wZT8uY2xpZW50SWQgIT09IHVuZGVmaW5lZCAmJiBzY29wZT8uY2xpZW50SWQgIT09IG51bGwgJiYgc2NvcGU/LmNsaWVudElkICE9PSAnJyA/IFN0cmluZyhzY29wZS5jbGllbnRJZCkgOiBudWxsXG4gIGlmICghcmF3Q2xpZW50KSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbeyBjbGllbnRJZDogcmF3Q2xpZW50IH1dKVxufVxuXG5jb25zdCBidWlsZFNlYXJjaEVudGl0aWVzRXh0cmEgPSAodHlwZTogU2VhcmNoRmlsdGVyYWJsZVR5cGUsIHNjb3BlPzogRW50aXR5U2VhcmNoU2NvcGUpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAodHlwZSA9PT0gJ3Rhc2snKSByZXR1cm4gYnVpbGRUYXNrU2VhcmNoRXh0cmEoc2NvcGUpXG4gIGlmICh0eXBlID09PSAncHJvamVjdCcpIHJldHVybiBidWlsZFByb2plY3RTZWFyY2hFeHRyYShzY29wZSlcbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIFRhYiBgdGFza2AgLyBgcHJvamVjdGA6IGBmaWx0ZXJzYCBzw7NsbyB0aXBvICsgYXJjaGl2ZWQgKHRhcmVhczogbm8gYXJjaGl2YWRhcyk7IHNjb3BlIChjbGllbnRJZCAvIHByb2plY3RJZCBlbiB0YXJlYXMpIGVuIGBleHRyYWAuXG4gKi9cbmNvbnN0IGJ1aWxkRmlsdGVyc0ZvclR5cGUgPSAodHlwZTogU2VhcmNoRmlsdGVyYWJsZVR5cGUpOiBzdHJpbmcgPT4ge1xuICBpZiAodHlwZSA9PT0gJ3Byb2plY3QnKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KEJBU0VfRklMVEVSU19CWV9UWVBFLnByb2plY3QpXG4gIH1cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KEJBU0VfRklMVEVSU19CWV9UWVBFLnRhc2spXG59XG5cbi8qKlxuICogRmlsdHJvcyBwYXJhIHVzZXJzRGlyZWN0b3J5LiBFbCBiYWNrZW5kIGVzcGVyYSB1biBKU09OIHN0cmluZyBjb25cbiAqIHdpdGhQb3NpdGlvbiwgd2l0aFRlYW1zIHkgc2VhcmNoSW5wdXQuIExlIGFncmVnYW1vcyBjbGllbnRJZC9wcm9qZWN0SWRcbiAqIGRlbCBzY29wZSBlbiBjYXNvIGRlIHF1ZSBlbCBiYWNrZW5kIGxvcyBhcHJvdmVjaGUgcGFyYSBmaWx0cmFyIHBvclxuICogY29udGV4dG8gKHNpIG5vIGxvcyBlbnRpZW5kZSBsb3MgaWdub3JhKS5cbiAqL1xuY29uc3QgYnVpbGRVc2Vyc0RpcmVjdG9yeUZpbHRlcnMgPSAocTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgYmFzZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgd2l0aFBvc2l0aW9uOiB0cnVlLFxuICAgIHdpdGhUZWFtczogdHJ1ZSxcbiAgfVxuICBjb25zdCB0cmltbWVkUSA9IHEudHJpbSgpXG4gIGlmICh0cmltbWVkUSkge1xuICAgIGJhc2Uuc2VhcmNoSW5wdXQgPSB0cmltbWVkUVxuICB9XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShiYXNlKVxufVxuXG5jb25zdCBoaWdobGlnaHRSYW5nZSA9ICh0ZXh0OiBzdHJpbmcsIHNlYXJjaFZhbHVlOiBzdHJpbmcpID0+IHtcbiAgaWYgKCFzZWFyY2hWYWx1ZSkgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBpZHggPSB0ZXh0LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzZWFyY2hWYWx1ZS50b0xvd2VyQ2FzZSgpKVxuICBpZiAoaWR4IDwgMCkgcmV0dXJuIHVuZGVmaW5lZFxuICByZXR1cm4geyBzdGFydDogaWR4LCBsZW5ndGg6IHNlYXJjaFZhbHVlLmxlbmd0aCB9XG59XG5cbmNvbnN0IGZpcnN0RGVmaW5lZCA9IDxUPiguLi52YWx1ZXM6IEFycmF5PFQgfCBudWxsIHwgdW5kZWZpbmVkPik6IFQgfCB1bmRlZmluZWQgPT5cbiAgdmFsdWVzLmZpbmQodmFsdWUgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbClcblxuY29uc3QgbWFwQ2xpZW50VG9JdGVtID0gKGM6IFJhd0NsaWVudCwgc2VhcmNoVmFsdWU6IHN0cmluZyk6IENvbnRleHRNZW50aW9uSXRlbSA9PiAoe1xuICBpZDogYy5pZCxcbiAgdHlwZTogJ2NsaWVudCcsXG4gIHByaW1hcnk6IGMubmFtZSxcbiAgcHJpbWFyeUhpZ2hsaWdodDogaGlnaGxpZ2h0UmFuZ2UoYy5uYW1lLCBzZWFyY2hWYWx1ZSksXG4gIGJyZWFkY3J1bWI6IHtcbiAgICBjb3VudDogYy50b3RhbFByb3llY3RvcyA/PyB1bmRlZmluZWQsXG4gICAgY291bnRMYWJlbDogJ3Byb2plY3RzJyxcbiAgfSxcbiAgcmF3OiB7XG4gICAgaWQ6IGMuaWQsXG4gICAgbmFtZTogYy5uYW1lLFxuICAgIHRvdGFsUHJveWVjdG9zOiBjLnRvdGFsUHJveWVjdG9zID8/IG51bGwsXG4gIH0sXG59KVxuXG5jb25zdCBtYXBVc2VyVG9JdGVtID0gKHU6IFJhd0RpcmVjdG9yeVVzZXIsIHNlYXJjaFZhbHVlOiBzdHJpbmcpOiBDb250ZXh0TWVudGlvbkl0ZW0gPT4ge1xuICBjb25zdCBmdWxsTmFtZSA9IGAke3UuZmlyc3ROYW1lID8/ICcnfSAke3UubGFzdE5hbWUgPz8gJyd9YC50cmltKClcbiAgY29uc3QgcHJpbWFyeSA9IGZ1bGxOYW1lIHx8IHUuZW1haWwgfHwgU3RyaW5nKHUuaWQpXG5cbiAgcmV0dXJuIHtcbiAgICBpZDogdS5pZCxcbiAgICB0eXBlOiAndXNlcicsXG4gICAgcHJpbWFyeSxcbiAgICBwcmltYXJ5SGlnaGxpZ2h0OiBoaWdobGlnaHRSYW5nZShwcmltYXJ5LCBzZWFyY2hWYWx1ZSksXG4gICAgcmF3OiB7XG4gICAgICBpZDogdS5pZCxcbiAgICAgIG5hbWU6IHByaW1hcnksXG4gICAgICBwaWN0dXJlOiB1LnBpY3R1cmUgPz8gbnVsbCxcbiAgICAgIHBvc2l0aW9uTmFtZTogdS5wb3NpdGlvbk5hbWUgPz8gbnVsbCxcbiAgICAgIGVtYWlsOiB1LmVtYWlsID8/IG51bGwsXG4gICAgfSxcbiAgfVxufVxuXG5jb25zdCBtYXBDb3JVc2VyVG9Vc2VySXRlbSA9IChcbiAgdXNlcjogUmV0dXJuVHlwZTx0eXBlb2YgdXNlVXNlcj4sXG4gIHNlYXJjaFZhbHVlOiBzdHJpbmcsXG4gIG1lTGFiZWw6IHN0cmluZ1xuKTogQ29udGV4dE1lbnRpb25JdGVtID0+IHtcbiAgY29uc3QgZnVsbE5hbWUgPSBgJHt1c2VyLmZpcnN0TmFtZSA/PyAnJ30gJHt1c2VyLmxhc3ROYW1lID8/ICcnfWAudHJpbSgpXG4gIC8qKiBTb2xvIGNhcmdvIHJlYWw7IHNpbiBmYWxsYmFjayBhIGByb2xlYCAobGEgVUkgbXVlc3RyYSDigJxTaW4gcG9zaWNpw7Nu4oCdIHNpIGZhbHRhKS4gKi9cbiAgY29uc3QgcG9zaXRpb25MaW5lID0gdXNlci51c2VyX3Bvc2l0aW9uPy50cmltKCkgfHwgbnVsbFxuXG4gIHJldHVybiB7XG4gICAgaWQ6IHVzZXIuaWQsXG4gICAgdHlwZTogJ3VzZXInLFxuICAgIHByaW1hcnk6IG1lTGFiZWwsXG4gICAgcHJpbWFyeUhpZ2hsaWdodDogaGlnaGxpZ2h0UmFuZ2UobWVMYWJlbCwgc2VhcmNoVmFsdWUpLFxuICAgIHJhdzoge1xuICAgICAgaWQ6IHVzZXIuaWQsXG4gICAgICBuYW1lOiBmdWxsTmFtZSB8fCBTdHJpbmcodXNlci5pZCksXG4gICAgICBwaWN0dXJlOiB1c2VyLnBpY3R1cmUgfHwgbnVsbCxcbiAgICAgIHBvc2l0aW9uTmFtZTogcG9zaXRpb25MaW5lLFxuICAgICAgZW1haWw6IHVzZXIuZW1haWw/LnRyaW0oKSB8fCBudWxsLFxuICAgIH0sXG4gIH1cbn1cblxuY29uc3QgbWFwUmVjZW50VGFza1RvSXRlbSA9IChcbiAgdGFzazogUmVjZW50VGFza0l0ZW0sXG4gIHNlYXJjaFZhbHVlOiBzdHJpbmcsXG4gIHNob3dQcm9qZWN0TmFtZUluVGFza1JvdyA9IHRydWVcbik6IENvbnRleHRNZW50aW9uSXRlbSA9PiB7XG4gIGNvbnN0IHByaW1hcnkgPSAodGFzay50aXRsZSAmJiB0YXNrLnRpdGxlLnRyaW0oKSkgfHwgU3RyaW5nKHRhc2suaWQpXG4gIGNvbnN0IHByb2plY3ROYW1lID0gc2hvd1Byb2plY3ROYW1lSW5UYXNrUm93ID8gKHRhc2sucHJvamVjdE5hbWUgPz8gbnVsbCkgOiBudWxsXG4gIHJldHVybiB7XG4gICAgaWQ6IHRhc2suaWQsXG4gICAgdHlwZTogJ3Rhc2snLFxuICAgIHByaW1hcnksXG4gICAgcHJpbWFyeUhpZ2hsaWdodDogaGlnaGxpZ2h0UmFuZ2UocHJpbWFyeSwgc2VhcmNoVmFsdWUpLFxuICAgIGJyZWFkY3J1bWI6IHByb2plY3ROYW1lID8geyBwYXJlbnQ6IHByb2plY3ROYW1lIH0gOiB1bmRlZmluZWQsXG4gICAgcmF3OiB7XG4gICAgICBpZDogdGFzay5pZCxcbiAgICAgIG5hbWU6IHByaW1hcnksXG4gICAgICBwcm9qZWN0TmFtZSxcbiAgICB9LFxuICB9XG59XG5cbmNvbnN0IG5vcm1hbGl6ZVRhc2tGYW1pbHlSZWNvcmQgPSAocmVjb3JkOiBUYXNrRmFtaWx5UmVjb3JkKTogUmVjZW50VGFza0l0ZW0gfCBudWxsID0+IHtcbiAgY29uc3QgeyBfaWQ6IHRhc2tGYW1pbHlJZCB9ID0gcmVjb3JkXG4gIGNvbnN0IGlkID0gdGFza0ZhbWlseUlkXG4gIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsIHx8IFN0cmluZyhpZCkgPT09ICcnKSByZXR1cm4gbnVsbFxuICBjb25zdCB0aXRsZSA9IChyZWNvcmQudGl0bGUgPz8gJycpLnRyaW0oKSB8fCBTdHJpbmcoaWQpXG4gIGNvbnN0IHByb2plY3ROYW1lID0gZmlyc3REZWZpbmVkKHJlY29yZC5wcm9qZWN0Py5uYW1lLCByZWNvcmQuZmF0aGVyPy50aXRsZSkgPz8gbnVsbFxuICBjb25zdCBoYXNGYXRoZXIgPSAhIWZpcnN0RGVmaW5lZChyZWNvcmQudGFza0ZhdGhlciwgcmVjb3JkLmZhdGhlcj8uaWQpXG4gIHJldHVybiB7XG4gICAgaWQsXG4gICAgdGl0bGUsXG4gICAgdHlwZTogaGFzRmF0aGVyID8gJ3N1YnRhc2snIDogJ3Rhc2snLFxuICAgIHByb2plY3ROYW1lLFxuICB9XG59XG5cbmNvbnN0IG5vcm1hbGl6ZVByb2plY3RzRmFsbGJhY2tSZWNvcmQgPSAocmVjb3JkOiBGYWxsYmFja1Byb2plY3RSZWNvcmQpOiBSYXdTZWFyY2hSZXN1bHQgfCBudWxsID0+IHtcbiAgY29uc3QgeyBpZCB9ID0gcmVjb3JkXG4gIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsIHx8IFN0cmluZyhpZCkgPT09ICcnKSByZXR1cm4gbnVsbFxuICBjb25zdCB0aXRsZSA9IHJlY29yZC5uYW1lID8/ICcnXG4gIGNvbnN0IGNsaWVudElkID0gZmlyc3REZWZpbmVkKHJlY29yZC5jbGllbnRJZCwgcmVjb3JkLmNsaWVudD8uaWQpID8/IG51bGxcbiAgY29uc3QgY2xpZW50TmFtZSA9IHJlY29yZC5jbGllbnQ/Lm5hbWUgPz8gbnVsbFxuICByZXR1cm4ge1xuICAgIGlkLFxuICAgIHRpdGxlLFxuICAgIHR5cGU6ICdwcm9qZWN0JyxcbiAgICBjbGllbnRJZCxcbiAgICBjbGllbnROYW1lLFxuICB9XG59XG5cbmNvbnN0IG1hcFNlYXJjaFRvSXRlbSA9IChcbiAgcjogUmF3U2VhcmNoUmVzdWx0LFxuICB0eXBlOiBDb250ZXh0RW50aXR5VHlwZSxcbiAgc2VhcmNoVmFsdWU6IHN0cmluZyxcbiAgc2hvd1Byb2plY3ROYW1lSW5UYXNrUm93ID0gdHJ1ZVxuKTogQ29udGV4dE1lbnRpb25JdGVtID0+IHtcbiAgY29uc3QgcHJpbWFyeSA9IHIudGl0bGUgfHwgci5wcm9qZWN0TmFtZSB8fCAnJ1xuICBsZXQgcGFyZW50OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG4gIGlmICh0eXBlID09PSAncHJvamVjdCcpIHBhcmVudCA9IHIuY2xpZW50TmFtZVxuICBlbHNlIGlmICh0eXBlID09PSAndGFzaycpIHBhcmVudCA9IHVuZGVmaW5lZFxuICBlbHNlIHBhcmVudCA9IHIucHJvamVjdE5hbWUgPz8gci5jbGllbnROYW1lXG5cbiAgY29uc3QgZmF0aGVyID0gdHlwZSA9PT0gJ3Rhc2snID8gci5mYXRoZXIgOiBudWxsXG4gIGNvbnN0IGhhc0ZhdGhlciA9IHR5cGUgPT09ICd0YXNrJyAmJiBmYXRoZXIgIT0gbnVsbCAmJiBmYXRoZXIuaWQgIT0gbnVsbCAmJiBTdHJpbmcoZmF0aGVyLmlkKS5sZW5ndGggPiAwXG5cbiAgY29uc3QgdGFza1Byb2plY3ROYW1lID0gdHlwZSA9PT0gJ3Rhc2snICYmICFzaG93UHJvamVjdE5hbWVJblRhc2tSb3cgPyBudWxsIDogKHIucHJvamVjdE5hbWUgPz8gbnVsbClcblxuICByZXR1cm4ge1xuICAgIGlkOiByLmlkLFxuICAgIHR5cGUsXG4gICAgcHJpbWFyeSxcbiAgICBwcmltYXJ5SGlnaGxpZ2h0OiBoaWdobGlnaHRSYW5nZShwcmltYXJ5LCBzZWFyY2hWYWx1ZSksXG4gICAgYnJlYWRjcnVtYjogcGFyZW50ID8geyBwYXJlbnQgfSA6IHVuZGVmaW5lZCxcbiAgICByYXc6IHtcbiAgICAgIGlkOiByLmlkLFxuICAgICAgbmFtZTogcHJpbWFyeSxcbiAgICAgIGNsaWVudElkOiByLmNsaWVudElkID8/IG51bGwsXG4gICAgICBjbGllbnROYW1lOiByLmNsaWVudE5hbWUgPz8gbnVsbCxcbiAgICAgIHByb2plY3ROYW1lOiB0YXNrUHJvamVjdE5hbWUsXG4gICAgICBmZWVJZDogci5mZWVJZCA/PyBudWxsLFxuICAgICAgZmF0aGVySWQ6IGhhc0ZhdGhlciA/IGZhdGhlci5pZCA6IG51bGwsXG4gICAgICBmYXRoZXJUaXRsZTogaGFzRmF0aGVyID8gZmF0aGVyLnRpdGxlPy50cmltKCkgfHwgbnVsbCA6IG51bGwsXG4gICAgfSxcbiAgfVxufVxuXG5jb25zdCBmb3JtYXRNY3BQcmltYXJ5TGFiZWwgPSAoc2x1Zzogc3RyaW5nKTogc3RyaW5nID0+XG4gIHNsdWcucmVwbGFjZSgvXy9nLCAnICcpLnJlcGxhY2UoL1xcYlxcdy9nLCBjaGFyID0+IGNoYXIudG9VcHBlckNhc2UoKSlcblxuY29uc3QgbWFwTWNwU2x1Z3NUb0l0ZW1zID0gKHNsdWdzOiBzdHJpbmdbXSwgc2VhcmNoVmFsdWU6IHN0cmluZyk6IENvbnRleHRNZW50aW9uSXRlbVtdID0+IHtcbiAgY29uc3QgcSA9IHNlYXJjaFZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gIGxldCBmaWx0ZXJlZCA9IHNsdWdzXG4gIGlmIChxKSB7XG4gICAgZmlsdGVyZWQgPSBzbHVncy5maWx0ZXIocyA9PiB7XG4gICAgICBjb25zdCBwcmltYXJ5ID0gZm9ybWF0TWNwUHJpbWFyeUxhYmVsKHMpXG4gICAgICByZXR1cm4gcy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpIHx8IHByaW1hcnkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKVxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIGZpbHRlcmVkLm1hcChzbHVnID0+IHtcbiAgICBjb25zdCBwcmltYXJ5ID0gZm9ybWF0TWNwUHJpbWFyeUxhYmVsKHNsdWcpXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBzbHVnLFxuICAgICAgdHlwZTogJ21jcCcgYXMgY29uc3QsXG4gICAgICBwcmltYXJ5LFxuICAgICAgcHJpbWFyeUhpZ2hsaWdodDogaGlnaGxpZ2h0UmFuZ2UocHJpbWFyeSwgc2VhcmNoVmFsdWUpLFxuICAgICAgcmF3OiB7XG4gICAgICAgIGlkOiBzbHVnLFxuICAgICAgICBuYW1lOiBwcmltYXJ5LFxuICAgICAgfSxcbiAgICB9XG4gIH0pXG59XG5cbmV4cG9ydCBjb25zdCB1c2VFbnRpdHlTZWFyY2ggPSAodHlwZTogQ29udGV4dEVudGl0eVR5cGUsIHNjb3BlPzogRW50aXR5U2VhcmNoU2NvcGUpID0+IHtcbiAgY29uc3QgY29yVXNlciA9IHVzZVVzZXIoKVxuICBjb25zdCB7IHQgfSA9IHVzZVQoKVxuICAvKiogRXZpdGEgYXBsaWNhciByZXN1bHRhZG9zIGRlIHVuIGBmZXRjaFJlY2VudGAgdmllam8gY3VhbmRvIGVsIHVzdWFyaW8geWEgY2FtYmnDsyBkZSB0YWIgKHJhY2UgYXN5bmMpLiAqL1xuICBjb25zdCByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmID0gdXNlUmVmKDApXG4gIGNvbnN0IFtzZWFyY2hWYWx1ZSwgc2V0U2VhcmNoVmFsdWVdID0gdXNlU3RhdGUoJycpXG4gIGNvbnN0IGRlYm91bmNlZFNlYXJjaFZhbHVlID0gdXNlRGVib3VuY2Uoc2VhcmNoVmFsdWUsIFNFQVJDSF9RVUVSWV9ERUJPVU5DRV9NUylcblxuICBjb25zdCBbaXRlbXMsIHNldEl0ZW1zXSA9IHVzZVN0YXRlPENvbnRleHRNZW50aW9uSXRlbVtdPihbXSlcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtoaWRlUmVjZW50c0xhYmVsLCBzZXRIaWRlUmVjZW50c0xhYmVsXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbaGFzTW9yZSwgc2V0SGFzTW9yZV0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2lzTG9hZGluZ01vcmUsIHNldElzTG9hZGluZ01vcmVdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtjdXJyZW50UGFnZSwgc2V0Q3VycmVudFBhZ2VdID0gdXNlU3RhdGUoMSlcbiAgY29uc3QgW2FjdGl2ZVBhZ2luYXRpb25Tb3VyY2UsIHNldEFjdGl2ZVBhZ2luYXRpb25Tb3VyY2VdID0gdXNlU3RhdGU8UGFnaW5hdGlvblNvdXJjZT4oJ25vbmUnKVxuXG4gIGNvbnN0IG1jcFNsdWdzS2V5ID0gKHNjb3BlPy5tY3BTbHVncyA/PyBbXSkuam9pbignfCcpXG4gIGNvbnN0IHNob3dQcm9qZWN0TmFtZUluVGFza1JvdyA9IHNjb3BlPy5hZ2VudEVudGl0eSAhPT0gJ3Byb2plY3QnXG5cbiAgLy8gRXN0YWJpbGl6YW1vcyBlbCBzY29wZSBwYXJhIG5vIGRpc3BhcmFyIGZldGNocyBwb3IgY2FtYmlvcyBkZSBpZGVudGlkYWQgZGUgb2JqZXRvLlxuICBjb25zdCBzdGFibGVTY29wZSA9IHVzZU1lbW88RW50aXR5U2VhcmNoU2NvcGU+KFxuICAgICgpID0+ICh7XG4gICAgICBjbGllbnRJZDogc2NvcGU/LmNsaWVudElkID8/IG51bGwsXG4gICAgICBwcm9qZWN0SWQ6IHNjb3BlPy5wcm9qZWN0SWQgPz8gbnVsbCxcbiAgICAgIG1jcFNsdWdzOiBzY29wZT8ubWNwU2x1Z3MgPz8gW10sXG4gICAgICBhZ2VudEVudGl0eTogc2NvcGU/LmFnZW50RW50aXR5ID8/IG51bGwsXG4gICAgfSksXG4gICAgW3Njb3BlPy5jbGllbnRJZCwgc2NvcGU/LnByb2plY3RJZCwgbWNwU2x1Z3NLZXksIHNjb3BlPy5hZ2VudEVudGl0eV1cbiAgKVxuXG4gIC8vIC0tLSBTZWFyY2g6IHByb2plY3QgfCB0YXNrIChHcmFwaFFMOiBzZWFyY2gpIC0tLVxuICBjb25zdCBbZmV0Y2hTZWFyY2hFbnRpdGllcywgeyBkYXRhOiBzZWFyY2hEYXRhLCBsb2FkaW5nOiBzZWFyY2hMb2FkaW5nLCBlcnJvcjogc2VhcmNoRXJyb3IgfV0gPVxuICAgIHVzZUxhenlRdWVyeTxTZWFyY2hFbnRpdGllc0RhdGE+KFNFQVJDSF9FTlRJVElFUywge1xuICAgICAgdmFyaWFibGVzOiB7IGxpbWl0OiAyMCB9LFxuICAgICAgZmV0Y2hQb2xpY3k6ICduZXR3b3JrLW9ubHknLFxuICAgIH0pXG5cbiAgLy8gLS0tIFNlYXJjaDogY2xpZW50IChHcmFwaFFMKSAtLS1cbiAgY29uc3QgW2ZldGNoU2VhcmNoQ2xpZW50cywgeyBkYXRhOiBjbGllbnRzRGF0YSwgbG9hZGluZzogY2xpZW50c0xvYWRpbmcsIGVycm9yOiBjbGllbnRzRXJyb3IgfV0gPVxuICAgIHVzZUxhenlRdWVyeTxTZWFyY2hDbGllbnRzRGF0YT4oU0VBUkNIX0NMSUVOVFMsIHtcbiAgICAgIGZldGNoUG9saWN5OiAnbmV0d29yay1vbmx5JyxcbiAgICB9KVxuXG4gIC8vIC0tLSBTZWFyY2g6IHVzZXIgKEdyYXBoUUw6IHVzZXJzRGlyZWN0b3J5KSAtLS1cbiAgY29uc3QgW2ZldGNoVXNlcnNEaXJlY3RvcnksIHsgZGF0YTogdXNlcnNEYXRhLCBsb2FkaW5nOiB1c2Vyc0xvYWRpbmcsIGVycm9yOiB1c2Vyc0Vycm9yIH1dID1cbiAgICB1c2VMYXp5UXVlcnk8VXNlcnNEaXJlY3RvcnlEYXRhPihVU0VSU19ESVJFQ1RPUlksIHtcbiAgICAgIGZldGNoUG9saWN5OiAnbmV0d29yay1vbmx5JyxcbiAgICB9KVxuXG4gIGNvbnN0IHN5bmNVc2Vyc1BhZ2luYXRpb24gPSB1c2VDYWxsYmFjaygocGF5bG9hZD86IFVzZXJzRGlyZWN0b3J5RGF0YSB8IG51bGwpID0+IHtcbiAgICBjb25zdCBwYWdlID0gbm9ybWFsaXplUG9zaXRpdmVJbnQocGF5bG9hZD8udXNlcnNEaXJlY3Rvcnk/LnBhZ2UsIDEpXG4gICAgY29uc3QgbGFzdFBhZ2UgPSBub3JtYWxpemVQb3NpdGl2ZUludChwYXlsb2FkPy51c2Vyc0RpcmVjdG9yeT8ubGFzdFBhZ2UsIHBhZ2UpXG4gICAgc2V0Q3VycmVudFBhZ2UocGFnZSlcbiAgICBzZXRIYXNNb3JlKHBhZ2UgPCBsYXN0UGFnZSlcbiAgfSwgW10pXG5cbiAgY29uc3Qgc3luY0NsaWVudHNQYWdpbmF0aW9uID0gdXNlQ2FsbGJhY2soKHBheWxvYWQ/OiBTZWFyY2hDbGllbnRzRGF0YSB8IG51bGwpID0+IHtcbiAgICBjb25zdCBwYWdlID0gbm9ybWFsaXplUG9zaXRpdmVJbnQocGF5bG9hZD8uY2xpZW50cz8ucGFnZSwgMSlcbiAgICBjb25zdCBsYXN0UGFnZSA9IG5vcm1hbGl6ZVBvc2l0aXZlSW50KHBheWxvYWQ/LmNsaWVudHM/Lmxhc3RQYWdlLCBwYWdlKVxuICAgIHNldEN1cnJlbnRQYWdlKHBhZ2UpXG4gICAgc2V0SGFzTW9yZShwYWdlIDwgbGFzdFBhZ2UpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHN5bmNUYXNrRmFsbGJhY2tQYWdpbmF0aW9uID0gdXNlQ2FsbGJhY2soKHBheWxvYWQ/OiBUYXNrRmFtaWx5RGF0YSB8IG51bGwpID0+IHtcbiAgICBjb25zdCByYXdQYWdlID0gTnVtYmVyKHBheWxvYWQ/LnRhc2tGYW1pbHk/LnBhZ2UpXG4gICAgLy8gdGFza0ZhbWlseSB1c2EgcMOhZ2luYXMgMC1iYXNlZDsgY29udmVydGltb3MgYSAxLWJhc2VkIHBhcmEgY29uc2lzdGVuY2lhIGNvbiBlbCByZXN0b1xuICAgIGNvbnN0IHBhZ2UgPSBOdW1iZXIuaXNGaW5pdGUocmF3UGFnZSkgJiYgcmF3UGFnZSA+PSAwID8gTWF0aC5mbG9vcihyYXdQYWdlKSArIDEgOiAxXG4gICAgY29uc3QgbGFzdFBhZ2UgPSBub3JtYWxpemVQb3NpdGl2ZUludChwYXlsb2FkPy50YXNrRmFtaWx5Py5sYXN0UGFnZSwgcGFnZSlcbiAgICBzZXRDdXJyZW50UGFnZShwYWdlKVxuICAgIHNldEhhc01vcmUocGFnZSA8IGxhc3RQYWdlKVxuICB9LCBbXSlcblxuICBjb25zdCBzeW5jUHJvamVjdEZhbGxiYWNrUGFnaW5hdGlvbiA9IHVzZUNhbGxiYWNrKChwYXlsb2FkPzogUHJvamVjdHNGYWxsYmFja0RhdGEgfCBudWxsKSA9PiB7XG4gICAgY29uc3QgcGFnZSA9IG5vcm1hbGl6ZVBvc2l0aXZlSW50KHBheWxvYWQ/LnByb2plY3RzPy5wYWdlLCAxKVxuICAgIGNvbnN0IGxhc3RQYWdlID0gbm9ybWFsaXplUG9zaXRpdmVJbnQocGF5bG9hZD8ucHJvamVjdHM/Lmxhc3RQYWdlLCBwYWdlKVxuICAgIHNldEN1cnJlbnRQYWdlKHBhZ2UpXG4gICAgc2V0SGFzTW9yZShwYWdlIDwgbGFzdFBhZ2UpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IFtmZXRjaFRhc2tGYW1pbHlGYWxsYmFja10gPSB1c2VMYXp5UXVlcnk8VGFza0ZhbWlseURhdGE+KFRBU0tfRkFNSUxZX0ZBTExCQUNLLCB7XG4gICAgZmV0Y2hQb2xpY3k6ICduZXR3b3JrLW9ubHknLFxuICB9KVxuXG4gIGNvbnN0IFtmZXRjaFByb2plY3RzRmFsbGJhY2tdID0gdXNlTGF6eVF1ZXJ5PFByb2plY3RzRmFsbGJhY2tEYXRhPihQUk9KRUNUU19GQUxMQkFDSywge1xuICAgIGZldGNoUG9saWN5OiAnbmV0d29yay1vbmx5JyxcbiAgfSlcblxuICBjb25zdCBmZXRjaFJlY2VudCA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnQgKz0gMVxuICAgIGNvbnN0IGdlbmVyYXRpb24gPSByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnRcblxuICAgIGlmICh0eXBlID09PSAnbWNwJykge1xuICAgICAgY29uc3Qgc2x1Z3MgPSBzdGFibGVTY29wZS5tY3BTbHVncyA/PyBbXVxuICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICAgIHNldEVycm9yKGZhbHNlKVxuICAgICAgc2V0SXRlbXMobWFwTWNwU2x1Z3NUb0l0ZW1zKHNsdWdzLCAnJykpXG4gICAgICBzZXRIaWRlUmVjZW50c0xhYmVsKGZhbHNlKVxuICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZSgnbm9uZScpXG4gICAgICBzZXRIYXNNb3JlKGZhbHNlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc2V0TG9hZGluZyh0cnVlKVxuICAgIHNldEVycm9yKGZhbHNlKVxuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZSA9PT0gJ2NsaWVudCcpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldFJlY2VudENsaWVudHMoKVxuICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPT0gcmVjZW50c0ZldGNoR2VuZXJhdGlvblJlZi5jdXJyZW50KSByZXR1cm5cbiAgICAgICAgY29uc3QgbWFwcGVkID0gKGRhdGEgPz8gW10pLm1hcChjID0+IG1hcENsaWVudFRvSXRlbShjLCAnJykpXG4gICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuICAgICAgICBzZXRJdGVtcyhtYXBwZWQpXG4gICAgICAgIHNldEhpZGVSZWNlbnRzTGFiZWwoZmFsc2UpXG4gICAgICAgIHNldEFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UoJ25vbmUnKVxuICAgICAgICBzZXRIYXNNb3JlKGZhbHNlKVxuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAncHJvamVjdCcpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldFJlY2VudFByb2plY3RzKHN0YWJsZVNjb3BlLmNsaWVudElkID8geyBjbGllbnRJZDogc3RhYmxlU2NvcGUuY2xpZW50SWQgfSA6IHVuZGVmaW5lZClcbiAgICAgICAgaWYgKGdlbmVyYXRpb24gIT09IHJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYuY3VycmVudCkgcmV0dXJuXG4gICAgICAgIGxldCBtYXBwZWQgPSAoQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbXSkubWFwKHAgPT5cbiAgICAgICAgICBtYXBTZWFyY2hUb0l0ZW0oXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkOiBwLmlkLFxuICAgICAgICAgICAgICB0aXRsZTogcC50aXRsZSxcbiAgICAgICAgICAgICAgdHlwZTogJ3Byb2plY3QnLFxuICAgICAgICAgICAgICBjbGllbnRJZDogcC5jbGllbnRJZCxcbiAgICAgICAgICAgICAgZmVlSWQ6IHAuZmVlSWQsXG4gICAgICAgICAgICAgIGNsaWVudE5hbWU6IHAuY2xpZW50TmFtZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAncHJvamVjdCcsXG4gICAgICAgICAgICAnJ1xuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICBpZiAobWFwcGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnN0IGFyZ3VtZW50c0ZpbHRlciA9XG4gICAgICAgICAgICBzdGFibGVTY29wZS5jbGllbnRJZCAhPT0gbnVsbCAmJiBzdGFibGVTY29wZS5jbGllbnRJZCAhPT0gdW5kZWZpbmVkICYmIHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSAnJ1xuICAgICAgICAgICAgICA/IHsgY2xpZW50X2lkOiBbU3RyaW5nKHN0YWJsZVNjb3BlLmNsaWVudElkKV0gfVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgIGNvbnN0IHsgZGF0YTogZmFsbGJhY2tEYXRhIH0gPSBhd2FpdCBmZXRjaFByb2plY3RzRmFsbGJhY2soe1xuICAgICAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgICAgIC4uLihhcmd1bWVudHNGaWx0ZXIgPyB7IGFyZ3VtZW50czogYXJndW1lbnRzRmlsdGVyIH0gOiB7fSksXG4gICAgICAgICAgICAgIHBhZ2U6IDEsXG4gICAgICAgICAgICAgIHBlclBhZ2U6IDIwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuICAgICAgICAgIGNvbnN0IGZhbGxiYWNrTWFwcGVkID0gKGZhbGxiYWNrRGF0YT8ucHJvamVjdHM/LmRhdGEgPz8gW10pXG4gICAgICAgICAgICAubWFwKG5vcm1hbGl6ZVByb2plY3RzRmFsbGJhY2tSZWNvcmQpXG4gICAgICAgICAgICAuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBSYXdTZWFyY2hSZXN1bHQgPT4gaXRlbSAhPT0gbnVsbClcbiAgICAgICAgICAgIC5tYXAoaXRlbSA9PiBtYXBTZWFyY2hUb0l0ZW0oaXRlbSwgJ3Byb2plY3QnLCAnJykpXG4gICAgICAgICAgbWFwcGVkID0gZmFsbGJhY2tNYXBwZWRcbiAgICAgICAgICBzZXRIaWRlUmVjZW50c0xhYmVsKGZhbGxiYWNrTWFwcGVkLmxlbmd0aCA+IDApXG4gICAgICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZSgncHJvamVjdC1mYWxsYmFjaycpXG4gICAgICAgICAgc3luY1Byb2plY3RGYWxsYmFja1BhZ2luYXRpb24oZmFsbGJhY2tEYXRhKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldEhpZGVSZWNlbnRzTGFiZWwoZmFsc2UpXG4gICAgICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZSgnbm9uZScpXG4gICAgICAgICAgc2V0SGFzTW9yZShmYWxzZSlcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPT0gcmVjZW50c0ZldGNoR2VuZXJhdGlvblJlZi5jdXJyZW50KSByZXR1cm5cbiAgICAgICAgc2V0SXRlbXMobWFwcGVkKVxuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAndGFzaycpIHtcbiAgICAgICAgbGV0IHJlY2VudFRhc2tGaWx0ZXJzOiB7IHByb2plY3RJZD86IHN0cmluZyB8IG51bWJlciB8IG51bGw7IGNsaWVudElkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB9IHwgdW5kZWZpbmVkXG4gICAgICAgIGlmIChzdGFibGVTY29wZS5hZ2VudEVudGl0eSA9PT0gJ3Byb2plY3QnKSB7XG4gICAgICAgICAgcmVjZW50VGFza0ZpbHRlcnMgPSB7IHByb2plY3RJZDogc3RhYmxlU2NvcGUucHJvamVjdElkIH1cbiAgICAgICAgfSBlbHNlIGlmIChzdGFibGVTY29wZS5hZ2VudEVudGl0eSA9PT0gJ2NsaWVudCcpIHtcbiAgICAgICAgICByZWNlbnRUYXNrRmlsdGVycyA9IHsgY2xpZW50SWQ6IHN0YWJsZVNjb3BlLmNsaWVudElkIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgZ2V0UmVjZW50VGFza3MocmVjZW50VGFza0ZpbHRlcnMpXG4gICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuICAgICAgICBsZXQgdGFza0l0ZW1zID0gKGRhdGEgPz8gW10pLm1hcCh0YXNrID0+IG1hcFJlY2VudFRhc2tUb0l0ZW0odGFzaywgJycsIHNob3dQcm9qZWN0TmFtZUluVGFza1JvdykpXG4gICAgICAgIGlmICh0YXNrSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fVxuICAgICAgICAgIGlmIChzdGFibGVTY29wZS5wcm9qZWN0SWQgIT09IG51bGwgJiYgc3RhYmxlU2NvcGUucHJvamVjdElkICE9PSB1bmRlZmluZWQgJiYgc3RhYmxlU2NvcGUucHJvamVjdElkICE9PSAnJykge1xuICAgICAgICAgICAgZmlsdGVyLnByb2plY3RJZHMgPSBbU3RyaW5nKHN0YWJsZVNjb3BlLnByb2plY3RJZCldXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGFibGVTY29wZS5jbGllbnRJZCAhPT0gbnVsbCAmJiBzdGFibGVTY29wZS5jbGllbnRJZCAhPT0gdW5kZWZpbmVkICYmIHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSAnJykge1xuICAgICAgICAgICAgZmlsdGVyLmNsaWVudElkcyA9IFtTdHJpbmcoc3RhYmxlU2NvcGUuY2xpZW50SWQpXVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB7IGRhdGE6IGZhbGxiYWNrRGF0YSB9ID0gYXdhaXQgZmV0Y2hUYXNrRmFtaWx5RmFsbGJhY2soe1xuICAgICAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgICAgIGZpbHRlcjogeyBhcmNoaXZlZDogZmFsc2UsIC4uLmZpbHRlciB9LFxuICAgICAgICAgICAgICBwYWdpbmF0aW9uOiB7IG9mZnNldDogMCwgc2l6ZTogMjAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPT0gcmVjZW50c0ZldGNoR2VuZXJhdGlvblJlZi5jdXJyZW50KSByZXR1cm5cbiAgICAgICAgICB0YXNrSXRlbXMgPSAoZmFsbGJhY2tEYXRhPy50YXNrRmFtaWx5Py5kYXRhID8/IFtdKVxuICAgICAgICAgICAgLm1hcChub3JtYWxpemVUYXNrRmFtaWx5UmVjb3JkKVxuICAgICAgICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgUmVjZW50VGFza0l0ZW0gPT4gaXRlbSAhPT0gbnVsbClcbiAgICAgICAgICAgIC5tYXAodGFzayA9PiBtYXBSZWNlbnRUYXNrVG9JdGVtKHRhc2ssICcnLCBzaG93UHJvamVjdE5hbWVJblRhc2tSb3cpKVxuICAgICAgICAgIHNldEhpZGVSZWNlbnRzTGFiZWwodGFza0l0ZW1zLmxlbmd0aCA+IDApXG4gICAgICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZSgndGFzay1mYWxsYmFjaycpXG4gICAgICAgICAgc3luY1Rhc2tGYWxsYmFja1BhZ2luYXRpb24oZmFsbGJhY2tEYXRhKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldEhpZGVSZWNlbnRzTGFiZWwoZmFsc2UpXG4gICAgICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZSgnbm9uZScpXG4gICAgICAgICAgc2V0SGFzTW9yZShmYWxzZSlcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPT0gcmVjZW50c0ZldGNoR2VuZXJhdGlvblJlZi5jdXJyZW50KSByZXR1cm5cbiAgICAgICAgc2V0SXRlbXModGFza0l0ZW1zKVxuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAndXNlcicpIHtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBmZXRjaFVzZXJzRGlyZWN0b3J5KHtcbiAgICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICAgIGZpbHRlcnM6IGJ1aWxkVXNlcnNEaXJlY3RvcnlGaWx0ZXJzKCcnKSxcbiAgICAgICAgICAgIHBhZ2U6IDEsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKGdlbmVyYXRpb24gIT09IHJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYuY3VycmVudCkgcmV0dXJuXG4gICAgICAgIGNvbnN0IG1hcHBlZCA9IChkYXRhPy51c2Vyc0RpcmVjdG9yeT8uZGF0YSA/PyBbXSkubWFwKHUgPT4gbWFwVXNlclRvSXRlbSh1LCAnJykpXG4gICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuICAgICAgICBjb25zdCBtZUl0ZW0gPSBtYXBDb3JVc2VyVG9Vc2VySXRlbShjb3JVc2VyLCAnJywgdCgnY29udGV4dE1lbnRpb24ubWUnKSlcbiAgICAgICAgY29uc3Qgd2l0aG91dE1lID0gbWFwcGVkLmZpbHRlcihpdGVtID0+IFN0cmluZyhpdGVtLmlkKSAhPT0gU3RyaW5nKG1lSXRlbS5pZCkpXG4gICAgICAgIHNldEl0ZW1zKFttZUl0ZW0sIC4uLndpdGhvdXRNZV0pXG4gICAgICAgIHN5bmNVc2Vyc1BhZ2luYXRpb24oZGF0YSlcbiAgICAgICAgc2V0SGlkZVJlY2VudHNMYWJlbChmYWxzZSlcbiAgICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZSgndXNlcnMnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGdlbmVyYXRpb24gIT09IHJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYuY3VycmVudCkgcmV0dXJuXG4gICAgICAgIHNldEl0ZW1zKFtdKVxuICAgICAgICBzZXRIaWRlUmVjZW50c0xhYmVsKGZhbHNlKVxuICAgICAgICBzZXRBY3RpdmVQYWdpbmF0aW9uU291cmNlKCdub25lJylcbiAgICAgICAgc2V0SGFzTW9yZShmYWxzZSlcbiAgICAgICAgc2V0Q3VycmVudFBhZ2UoMSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIGlmIChnZW5lcmF0aW9uICE9PSByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuICAgICAgc2V0RXJyb3IodHJ1ZSlcbiAgICAgIHNldEl0ZW1zKFtdKVxuICAgICAgc2V0SGlkZVJlY2VudHNMYWJlbChmYWxzZSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGdlbmVyYXRpb24gPT09IHJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYuY3VycmVudCkge1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgfVxuICAgIH1cbiAgfSwgW1xuICAgIHR5cGUsXG4gICAgc3RhYmxlU2NvcGUsXG4gICAgZmV0Y2hVc2Vyc0RpcmVjdG9yeSxcbiAgICBmZXRjaFRhc2tGYW1pbHlGYWxsYmFjayxcbiAgICBmZXRjaFByb2plY3RzRmFsbGJhY2ssXG4gICAgc3luY1VzZXJzUGFnaW5hdGlvbixcbiAgICBzeW5jVGFza0ZhbGxiYWNrUGFnaW5hdGlvbixcbiAgICBzeW5jUHJvamVjdEZhbGxiYWNrUGFnaW5hdGlvbixcbiAgICBzaG93UHJvamVjdE5hbWVJblRhc2tSb3csXG4gICAgY29yVXNlcixcbiAgICB0LFxuICBdKVxuXG4gIC8vIERpc3BhcmFyIHNlYXJjaCBhbCBjYW1iaWFyIGRlYm91bmNlZCB2YWx1ZVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHEgPSBkZWJvdW5jZWRTZWFyY2hWYWx1ZS50cmltKClcblxuICAgIGlmICh0eXBlID09PSAnbWNwJykge1xuICAgICAgY29uc3Qgc2x1Z3MgPSBzdGFibGVTY29wZS5tY3BTbHVncyA/PyBbXVxuICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICAgIHNldEVycm9yKGZhbHNlKVxuICAgICAgc2V0SXRlbXMobWFwTWNwU2x1Z3NUb0l0ZW1zKHNsdWdzLCBxKSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghcSkgcmV0dXJuXG5cbiAgICBpZiAodHlwZSA9PT0gJ2NsaWVudCcpIHtcbiAgICAgIGZldGNoU2VhcmNoQ2xpZW50cyh7XG4gICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgIGZpbHRlcjogeyBuYW1lOiBxIH0sXG4gICAgICAgICAgcGFnZTogMSxcbiAgICAgICAgICBwZXJQYWdlOiAyMCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICBzZXRBY3RpdmVQYWdpbmF0aW9uU291cmNlKCdjbGllbnRzLXNlYXJjaCcpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAndXNlcicpIHtcbiAgICAgIGZldGNoVXNlcnNEaXJlY3Rvcnkoe1xuICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICBmaWx0ZXJzOiBidWlsZFVzZXJzRGlyZWN0b3J5RmlsdGVycyhxKSxcbiAgICAgICAgICBwYWdlOiAxLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIHNldEFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UoJ3VzZXJzJylcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZmlsdGVycyA9IGJ1aWxkRmlsdGVyc0ZvclR5cGUodHlwZSlcbiAgICAgIGNvbnN0IGV4dHJhID0gYnVpbGRTZWFyY2hFbnRpdGllc0V4dHJhKHR5cGUsIHN0YWJsZVNjb3BlKVxuICAgICAgZmV0Y2hTZWFyY2hFbnRpdGllcyh7XG4gICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgIHEsXG4gICAgICAgICAgZmlsdGVycyxcbiAgICAgICAgICAuLi4oZXh0cmEgIT09IHVuZGVmaW5lZCA/IHsgZXh0cmEgfSA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICBzZXRBY3RpdmVQYWdpbmF0aW9uU291cmNlKCdub25lJylcbiAgICAgIHNldEhhc01vcmUoZmFsc2UpXG4gICAgfVxuICB9LCBbZGVib3VuY2VkU2VhcmNoVmFsdWUsIHR5cGUsIHN0YWJsZVNjb3BlLCBmZXRjaFNlYXJjaEVudGl0aWVzLCBmZXRjaFNlYXJjaENsaWVudHMsIGZldGNoVXNlcnNEaXJlY3RvcnldKVxuXG4gIC8vIFNpbmNyb25pemFyIHJlc3VsdGFkb3MgZGUgc2VhcmNoXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGUgPT09ICdtY3AnKSByZXR1cm5cblxuICAgIGNvbnN0IHEgPSBkZWJvdW5jZWRTZWFyY2hWYWx1ZS50cmltKClcbiAgICBpZiAoIXEpIHJldHVyblxuICAgIHNldEhpZGVSZWNlbnRzTGFiZWwoZmFsc2UpXG5cbiAgICBpZiAodHlwZSA9PT0gJ2NsaWVudCcpIHtcbiAgICAgIHNldExvYWRpbmcoY2xpZW50c0xvYWRpbmcpXG4gICAgICBpZiAoY2xpZW50c0Vycm9yKSB7XG4gICAgICAgIHNldEVycm9yKHRydWUpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGNsaWVudHNEYXRhPy5jbGllbnRzPy5kYXRhKSB7XG4gICAgICAgIHNldEl0ZW1zKGNsaWVudHNEYXRhLmNsaWVudHMuZGF0YS5tYXAoYyA9PiBtYXBDbGllbnRUb0l0ZW0oYywgcSkpKVxuICAgICAgICBzeW5jQ2xpZW50c1BhZ2luYXRpb24oY2xpZW50c0RhdGEpXG4gICAgICAgIHNldEVycm9yKGZhbHNlKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3VzZXInKSB7XG4gICAgICBzZXRMb2FkaW5nKHVzZXJzTG9hZGluZylcbiAgICAgIGlmICh1c2Vyc0Vycm9yKSB7XG4gICAgICAgIHNldEVycm9yKHRydWUpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKHVzZXJzRGF0YT8udXNlcnNEaXJlY3Rvcnk/LmRhdGEpIHtcbiAgICAgICAgY29uc3QgbWFwcGVkID0gdXNlcnNEYXRhLnVzZXJzRGlyZWN0b3J5LmRhdGEubWFwKHUgPT4gbWFwVXNlclRvSXRlbSh1LCBxKSlcbiAgICAgICAgY29uc3QgbWVJZCA9IFN0cmluZyhjb3JVc2VyLmlkKVxuICAgICAgICBjb25zdCBoYXNNZUluUmVzdWx0cyA9IG1hcHBlZC5zb21lKGl0ZW0gPT4gU3RyaW5nKGl0ZW0uaWQpID09PSBtZUlkKVxuICAgICAgICBjb25zdCB3aXRob3V0TWUgPSBtYXBwZWQuZmlsdGVyKGl0ZW0gPT4gU3RyaW5nKGl0ZW0uaWQpICE9PSBtZUlkKVxuICAgICAgICBjb25zdCBtZUl0ZW0gPSBtYXBDb3JVc2VyVG9Vc2VySXRlbShjb3JVc2VyLCBxLCB0KCdjb250ZXh0TWVudGlvbi5tZScpKVxuICAgICAgICBzZXRJdGVtcyhoYXNNZUluUmVzdWx0cyA/IFttZUl0ZW0sIC4uLndpdGhvdXRNZV0gOiBtYXBwZWQpXG4gICAgICAgIHN5bmNVc2Vyc1BhZ2luYXRpb24odXNlcnNEYXRhKVxuICAgICAgICBzZXRFcnJvcihmYWxzZSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2V0TG9hZGluZyhzZWFyY2hMb2FkaW5nKVxuICAgICAgaWYgKHNlYXJjaEVycm9yKSB7XG4gICAgICAgIHNldEVycm9yKHRydWUpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKHNlYXJjaERhdGE/LnNlYXJjaCkge1xuICAgICAgICBzZXRJdGVtcyhzZWFyY2hEYXRhLnNlYXJjaC5tYXAociA9PiBtYXBTZWFyY2hUb0l0ZW0ociwgdHlwZSwgcSwgc2hvd1Byb2plY3ROYW1lSW5UYXNrUm93KSkpXG4gICAgICAgIHNldEhhc01vcmUoZmFsc2UpXG4gICAgICAgIHNldEVycm9yKGZhbHNlKVxuICAgICAgfVxuICAgIH1cbiAgfSwgW1xuICAgIHNlYXJjaERhdGEsXG4gICAgY2xpZW50c0RhdGEsXG4gICAgdXNlcnNEYXRhLFxuICAgIHNlYXJjaExvYWRpbmcsXG4gICAgY2xpZW50c0xvYWRpbmcsXG4gICAgdXNlcnNMb2FkaW5nLFxuICAgIHNlYXJjaEVycm9yLFxuICAgIGNsaWVudHNFcnJvcixcbiAgICB1c2Vyc0Vycm9yLFxuICAgIGRlYm91bmNlZFNlYXJjaFZhbHVlLFxuICAgIHR5cGUsXG4gICAgc3luY0NsaWVudHNQYWdpbmF0aW9uLFxuICAgIHN5bmNVc2Vyc1BhZ2luYXRpb24sXG4gICAgc2hvd1Byb2plY3ROYW1lSW5UYXNrUm93LFxuICAgIGNvclVzZXIsXG4gICAgdCxcbiAgXSlcblxuICBjb25zdCBsb2FkTW9yZSA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNMb2FkaW5nTW9yZSB8fCAhaGFzTW9yZSB8fCBhY3RpdmVQYWdpbmF0aW9uU291cmNlID09PSAnbm9uZScpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnW3VzZUVudGl0eVNlYXJjaF0gbG9hZE1vcmUgc2tpcHBlZCcsIHtcbiAgICAgICAgaXNMb2FkaW5nTW9yZSxcbiAgICAgICAgaGFzTW9yZSxcbiAgICAgICAgYWN0aXZlUGFnaW5hdGlvblNvdXJjZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc2FmZUN1cnJlbnRQYWdlID0gbm9ybWFsaXplUG9zaXRpdmVJbnQoY3VycmVudFBhZ2UsIDEpXG4gICAgY29uc3QgbmV4dFBhZ2UgPSBzYWZlQ3VycmVudFBhZ2UgKyAxXG4gICAgY29uc3QgcSA9IGRlYm91bmNlZFNlYXJjaFZhbHVlLnRyaW0oKVxuICAgIGNvbnNvbGUuaW5mbygnW3VzZUVudGl0eVNlYXJjaF0gbG9hZE1vcmUgc3RhcnQnLCB7XG4gICAgICBzb3VyY2U6IGFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UsXG4gICAgICBjdXJyZW50UGFnZSxcbiAgICAgIG5leHRQYWdlLFxuICAgICAgcXVlcnk6IHEsXG4gICAgfSlcbiAgICBjb25zdCBsb2FkTW9yZUJhc2VsaW5lR2VuID0gcmVjZW50c0ZldGNoR2VuZXJhdGlvblJlZi5jdXJyZW50XG4gICAgc2V0SXNMb2FkaW5nTW9yZSh0cnVlKVxuICAgIHRyeSB7XG4gICAgICBpZiAoYWN0aXZlUGFnaW5hdGlvblNvdXJjZSA9PT0gJ3VzZXJzJykge1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGZldGNoVXNlcnNEaXJlY3Rvcnkoe1xuICAgICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgICAgZmlsdGVyczogYnVpbGRVc2Vyc0RpcmVjdG9yeUZpbHRlcnMocSksXG4gICAgICAgICAgICBwYWdlOiBuZXh0UGFnZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICBpZiAobG9hZE1vcmVCYXNlbGluZUdlbiAhPT0gcmVjZW50c0ZldGNoR2VuZXJhdGlvblJlZi5jdXJyZW50KSByZXR1cm5cbiAgICAgICAgY29uc29sZS5pbmZvKCdbdXNlRW50aXR5U2VhcmNoXSB1c2VycyBsb2FkTW9yZSByZXNwb25zZScsIHtcbiAgICAgICAgICBwYWdlOiBkYXRhPy51c2Vyc0RpcmVjdG9yeT8ucGFnZSxcbiAgICAgICAgICBsYXN0UGFnZTogZGF0YT8udXNlcnNEaXJlY3Rvcnk/Lmxhc3RQYWdlLFxuICAgICAgICAgIGNvdW50OiBkYXRhPy51c2Vyc0RpcmVjdG9yeT8uZGF0YT8ubGVuZ3RoID8/IDAsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IG5leHRJdGVtcyA9IChkYXRhPy51c2Vyc0RpcmVjdG9yeT8uZGF0YSA/PyBbXSkubWFwKHUgPT4gbWFwVXNlclRvSXRlbSh1LCBxKSlcbiAgICAgICAgc2V0SXRlbXMocHJldiA9PiB7XG4gICAgICAgICAgaWYgKCFxKSB7XG4gICAgICAgICAgICBjb25zdCBtZUl0ZW0gPVxuICAgICAgICAgICAgICBwcmV2WzBdPy50eXBlID09PSAndXNlcicgPyBwcmV2WzBdIDogbWFwQ29yVXNlclRvVXNlckl0ZW0oY29yVXNlciwgJycsIHQoJ2NvbnRleHRNZW50aW9uLm1lJykpXG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQocHJldi5tYXAoaXRlbSA9PiBTdHJpbmcoaXRlbS5pZCkpKVxuICAgICAgICAgICAgY29uc3QgYXBwZW5kZWQgPSBuZXh0SXRlbXMuZmlsdGVyKGl0ZW0gPT4gIWV4aXN0aW5nSWRzLmhhcyhTdHJpbmcoaXRlbS5pZCkpKVxuICAgICAgICAgICAgY29uc3Qgd2l0aG91dE1lID0gcHJldi5maWx0ZXIoaXRlbSA9PiBTdHJpbmcoaXRlbS5pZCkgIT09IFN0cmluZyhtZUl0ZW0uaWQpKVxuICAgICAgICAgICAgcmV0dXJuIFttZUl0ZW0sIC4uLndpdGhvdXRNZSwgLi4uYXBwZW5kZWRdXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChwcmV2Lm1hcChpdGVtID0+IGAke2l0ZW0udHlwZX0tJHtpdGVtLmlkfWApKVxuICAgICAgICAgIGNvbnN0IGFwcGVuZGVkID0gbmV4dEl0ZW1zLmZpbHRlcihpdGVtID0+ICFleGlzdGluZ0lkcy5oYXMoYCR7aXRlbS50eXBlfS0ke2l0ZW0uaWR9YCkpXG4gICAgICAgICAgcmV0dXJuIFsuLi5wcmV2LCAuLi5hcHBlbmRlZF1cbiAgICAgICAgfSlcbiAgICAgICAgc3luY1VzZXJzUGFnaW5hdGlvbihkYXRhKVxuICAgICAgfSBlbHNlIGlmIChhY3RpdmVQYWdpbmF0aW9uU291cmNlID09PSAnY2xpZW50cy1zZWFyY2gnKSB7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgZmV0Y2hTZWFyY2hDbGllbnRzKHtcbiAgICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICAgIGZpbHRlcjogeyBuYW1lOiBxIH0sXG4gICAgICAgICAgICBwYWdlOiBuZXh0UGFnZSxcbiAgICAgICAgICAgIHBlclBhZ2U6IDIwLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIGlmIChsb2FkTW9yZUJhc2VsaW5lR2VuICE9PSByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuICAgICAgICBjb25zb2xlLmluZm8oJ1t1c2VFbnRpdHlTZWFyY2hdIGNsaWVudHMgbG9hZE1vcmUgcmVzcG9uc2UnLCB7XG4gICAgICAgICAgcGFnZTogZGF0YT8uY2xpZW50cz8ucGFnZSxcbiAgICAgICAgICBsYXN0UGFnZTogZGF0YT8uY2xpZW50cz8ubGFzdFBhZ2UsXG4gICAgICAgICAgY291bnQ6IGRhdGE/LmNsaWVudHM/LmRhdGE/Lmxlbmd0aCA/PyAwLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBuZXh0SXRlbXMgPSAoZGF0YT8uY2xpZW50cz8uZGF0YSA/PyBbXSkubWFwKGMgPT4gbWFwQ2xpZW50VG9JdGVtKGMsIHEpKVxuICAgICAgICBzZXRJdGVtcyhwcmV2ID0+IHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQocHJldi5tYXAoaXRlbSA9PiBgJHtpdGVtLnR5cGV9LSR7aXRlbS5pZH1gKSlcbiAgICAgICAgICBjb25zdCBhcHBlbmRlZCA9IG5leHRJdGVtcy5maWx0ZXIoaXRlbSA9PiAhZXhpc3RpbmdJZHMuaGFzKGAke2l0ZW0udHlwZX0tJHtpdGVtLmlkfWApKVxuICAgICAgICAgIHJldHVybiBbLi4ucHJldiwgLi4uYXBwZW5kZWRdXG4gICAgICAgIH0pXG4gICAgICAgIHN5bmNDbGllbnRzUGFnaW5hdGlvbihkYXRhKVxuICAgICAgfSBlbHNlIGlmIChhY3RpdmVQYWdpbmF0aW9uU291cmNlID09PSAndGFzay1mYWxsYmFjaycpIHtcbiAgICAgICAgY29uc3QgZmlsdGVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fVxuICAgICAgICBpZiAoc3RhYmxlU2NvcGUucHJvamVjdElkICE9PSBudWxsICYmIHN0YWJsZVNjb3BlLnByb2plY3RJZCAhPT0gdW5kZWZpbmVkICYmIHN0YWJsZVNjb3BlLnByb2plY3RJZCAhPT0gJycpIHtcbiAgICAgICAgICBmaWx0ZXIucHJvamVjdElkcyA9IFtTdHJpbmcoc3RhYmxlU2NvcGUucHJvamVjdElkKV1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhYmxlU2NvcGUuY2xpZW50SWQgIT09IG51bGwgJiYgc3RhYmxlU2NvcGUuY2xpZW50SWQgIT09IHVuZGVmaW5lZCAmJiBzdGFibGVTY29wZS5jbGllbnRJZCAhPT0gJycpIHtcbiAgICAgICAgICBmaWx0ZXIuY2xpZW50SWRzID0gW1N0cmluZyhzdGFibGVTY29wZS5jbGllbnRJZCldXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBmZXRjaFRhc2tGYW1pbHlGYWxsYmFjayh7XG4gICAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgICBmaWx0ZXI6IHsgYXJjaGl2ZWQ6IGZhbHNlLCAuLi5maWx0ZXIgfSxcbiAgICAgICAgICAgIHBhZ2luYXRpb246IHsgb2Zmc2V0OiAobmV4dFBhZ2UgLSAxKSAqIDIwLCBzaXplOiAyMCB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIGlmIChsb2FkTW9yZUJhc2VsaW5lR2VuICE9PSByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuICAgICAgICBjb25zb2xlLmluZm8oJ1t1c2VFbnRpdHlTZWFyY2hdIHRhc2sgZmFsbGJhY2sgbG9hZE1vcmUgcmVzcG9uc2UnLCB7XG4gICAgICAgICAgcGFnZTogZGF0YT8udGFza0ZhbWlseT8ucGFnZSxcbiAgICAgICAgICBsYXN0UGFnZTogZGF0YT8udGFza0ZhbWlseT8ubGFzdFBhZ2UsXG4gICAgICAgICAgY291bnQ6IGRhdGE/LnRhc2tGYW1pbHk/LmRhdGE/Lmxlbmd0aCA/PyAwLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBuZXh0SXRlbXMgPSAoZGF0YT8udGFza0ZhbWlseT8uZGF0YSA/PyBbXSlcbiAgICAgICAgICAubWFwKG5vcm1hbGl6ZVRhc2tGYW1pbHlSZWNvcmQpXG4gICAgICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgUmVjZW50VGFza0l0ZW0gPT4gaXRlbSAhPT0gbnVsbClcbiAgICAgICAgICAubWFwKHRhc2sgPT4gbWFwUmVjZW50VGFza1RvSXRlbSh0YXNrLCAnJywgc2hvd1Byb2plY3ROYW1lSW5UYXNrUm93KSlcbiAgICAgICAgc2V0SXRlbXMocHJldiA9PiB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KHByZXYubWFwKGl0ZW0gPT4gYCR7aXRlbS50eXBlfS0ke2l0ZW0uaWR9YCkpXG4gICAgICAgICAgY29uc3QgYXBwZW5kZWQgPSBuZXh0SXRlbXMuZmlsdGVyKGl0ZW0gPT4gIWV4aXN0aW5nSWRzLmhhcyhgJHtpdGVtLnR5cGV9LSR7aXRlbS5pZH1gKSlcbiAgICAgICAgICByZXR1cm4gWy4uLnByZXYsIC4uLmFwcGVuZGVkXVxuICAgICAgICB9KVxuICAgICAgICBzeW5jVGFza0ZhbGxiYWNrUGFnaW5hdGlvbihkYXRhKVxuICAgICAgfSBlbHNlIGlmIChhY3RpdmVQYWdpbmF0aW9uU291cmNlID09PSAncHJvamVjdC1mYWxsYmFjaycpIHtcbiAgICAgICAgY29uc3QgYXJndW1lbnRzRmlsdGVyID1cbiAgICAgICAgICBzdGFibGVTY29wZS5jbGllbnRJZCAhPT0gbnVsbCAmJiBzdGFibGVTY29wZS5jbGllbnRJZCAhPT0gdW5kZWZpbmVkICYmIHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSAnJ1xuICAgICAgICAgICAgPyB7IGNsaWVudF9pZDogW1N0cmluZyhzdGFibGVTY29wZS5jbGllbnRJZCldIH1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgZmV0Y2hQcm9qZWN0c0ZhbGxiYWNrKHtcbiAgICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICAgIC4uLihhcmd1bWVudHNGaWx0ZXIgPyB7IGFyZ3VtZW50czogYXJndW1lbnRzRmlsdGVyIH0gOiB7fSksXG4gICAgICAgICAgICBwYWdlOiBuZXh0UGFnZSxcbiAgICAgICAgICAgIHBlclBhZ2U6IDIwLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIGlmIChsb2FkTW9yZUJhc2VsaW5lR2VuICE9PSByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuICAgICAgICBjb25zb2xlLmluZm8oJ1t1c2VFbnRpdHlTZWFyY2hdIHByb2plY3QgZmFsbGJhY2sgbG9hZE1vcmUgcmVzcG9uc2UnLCB7XG4gICAgICAgICAgcGFnZTogZGF0YT8ucHJvamVjdHM/LnBhZ2UsXG4gICAgICAgICAgbGFzdFBhZ2U6IGRhdGE/LnByb2plY3RzPy5sYXN0UGFnZSxcbiAgICAgICAgICBjb3VudDogZGF0YT8ucHJvamVjdHM/LmRhdGE/Lmxlbmd0aCA/PyAwLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBuZXh0SXRlbXMgPSAoZGF0YT8ucHJvamVjdHM/LmRhdGEgPz8gW10pXG4gICAgICAgICAgLm1hcChub3JtYWxpemVQcm9qZWN0c0ZhbGxiYWNrUmVjb3JkKVxuICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIFJhd1NlYXJjaFJlc3VsdCA9PiBpdGVtICE9PSBudWxsKVxuICAgICAgICAgIC5tYXAoaXRlbSA9PiBtYXBTZWFyY2hUb0l0ZW0oaXRlbSwgJ3Byb2plY3QnLCAnJykpXG4gICAgICAgIHNldEl0ZW1zKHByZXYgPT4ge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChwcmV2Lm1hcChpdGVtID0+IGAke2l0ZW0udHlwZX0tJHtpdGVtLmlkfWApKVxuICAgICAgICAgIGNvbnN0IGFwcGVuZGVkID0gbmV4dEl0ZW1zLmZpbHRlcihpdGVtID0+ICFleGlzdGluZ0lkcy5oYXMoYCR7aXRlbS50eXBlfS0ke2l0ZW0uaWR9YCkpXG4gICAgICAgICAgcmV0dXJuIFsuLi5wcmV2LCAuLi5hcHBlbmRlZF1cbiAgICAgICAgfSlcbiAgICAgICAgc3luY1Byb2plY3RGYWxsYmFja1BhZ2luYXRpb24oZGF0YSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChsb2FkTW9yZUJhc2VsaW5lR2VuICE9PSByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuICAgICAgY29uc29sZS5lcnJvcignW3VzZUVudGl0eVNlYXJjaF0gbG9hZE1vcmUgZmFpbGVkJywge1xuICAgICAgICBzb3VyY2U6IGFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UsXG4gICAgICAgIG5leHRQYWdlLFxuICAgICAgICBlcnJvcjogZXJyLFxuICAgICAgfSlcbiAgICAgIC8vIEV2aXRhIGxvb3AgZGUgcmVpbnRlbnRvcyBhdXRvbcOhdGljb3MgcG9yIHNjcm9sbCBjdWFuZG8gYmFja2VuZCBlc3TDoSBjYcOtZG8gKGVqLiA1MDMpLlxuICAgICAgc2V0RXJyb3IodHJ1ZSlcbiAgICAgIHNldEhhc01vcmUoZmFsc2UpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldElzTG9hZGluZ01vcmUoZmFsc2UpXG4gICAgICBjb25zb2xlLmluZm8oJ1t1c2VFbnRpdHlTZWFyY2hdIGxvYWRNb3JlIGZpbmlzaGVkJywgeyBzb3VyY2U6IGFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UsIG5leHRQYWdlIH0pXG4gICAgfVxuICB9LCBbXG4gICAgaXNMb2FkaW5nTW9yZSxcbiAgICBoYXNNb3JlLFxuICAgIGN1cnJlbnRQYWdlLFxuICAgIGFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UsXG4gICAgZGVib3VuY2VkU2VhcmNoVmFsdWUsXG4gICAgZmV0Y2hVc2Vyc0RpcmVjdG9yeSxcbiAgICBmZXRjaFNlYXJjaENsaWVudHMsXG4gICAgZmV0Y2hUYXNrRmFtaWx5RmFsbGJhY2ssXG4gICAgZmV0Y2hQcm9qZWN0c0ZhbGxiYWNrLFxuICAgIHN0YWJsZVNjb3BlLnByb2plY3RJZCxcbiAgICBzdGFibGVTY29wZS5jbGllbnRJZCxcbiAgICBzaG93UHJvamVjdE5hbWVJblRhc2tSb3csXG4gICAgY29yVXNlcixcbiAgICB0LFxuICAgIHN5bmNDbGllbnRzUGFnaW5hdGlvbixcbiAgICBzeW5jVXNlcnNQYWdpbmF0aW9uLFxuICAgIHN5bmNUYXNrRmFsbGJhY2tQYWdpbmF0aW9uLFxuICAgIHN5bmNQcm9qZWN0RmFsbGJhY2tQYWdpbmF0aW9uLFxuICBdKVxuXG4gIC8vIEN1YW5kbyBzZSBsaW1waWEgZWwgc2VhcmNoLCB2b2x2ZXIgYSByZWNlbnRzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFkZWJvdW5jZWRTZWFyY2hWYWx1ZS50cmltKCkpIHtcbiAgICAgIGZldGNoUmVjZW50KClcbiAgICB9XG4gIH0sIFtkZWJvdW5jZWRTZWFyY2hWYWx1ZSwgZmV0Y2hSZWNlbnRdKVxuXG4gIHJldHVybiB7XG4gICAgaXRlbXMsXG4gICAgbG9hZGluZyxcbiAgICBlcnJvcixcbiAgICBoaWRlUmVjZW50c0xhYmVsLFxuICAgIGhhc01vcmUsXG4gICAgaXNMb2FkaW5nTW9yZSxcbiAgICBsb2FkTW9yZSxcbiAgICBzZWFyY2hWYWx1ZSxcbiAgICB1cGRhdGVTZWFyY2hWYWx1ZTogc2V0U2VhcmNoVmFsdWUsXG4gICAgZmV0Y2hSZWNlbnQsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLFNBQVNBLFlBQVksUUFBUSxnQkFBZ0I7QUFDN0MsU0FBU0MsV0FBVyxFQUFFQyxTQUFTLEVBQUVDLE9BQU8sRUFBRUMsTUFBTSxFQUFFQyxRQUFRLFFBQVEsT0FBTztBQUN6RSxTQUFTQyxnQkFBZ0IsUUFBUSxpREFBaUQ7QUFDbEYsU0FBU0MsaUJBQWlCLFFBQVEsbURBQW1EO0FBQ3JGLFNBQVNDLGNBQWMsUUFBUSw2Q0FBNkM7QUFFNUUsU0FBU0MsT0FBTyxRQUFRLHFCQUFxQjtBQUM3QyxTQUFTQyxpQkFBaUIsRUFBRUMsZUFBZSxFQUFFQyxvQkFBb0IsUUFBUSxxQ0FBcUM7QUFDOUcsU0FBU0MsY0FBYyxRQUFRLHFDQUFxQztBQUNwRSxTQUFTQyxlQUFlLFFBQVEsdUNBQXVDO0FBQ3ZFLFNBQVNDLHdCQUF3QixRQUFRLHFCQUFxQjtBQUM5RCxTQUFTQyxXQUFXLFFBQVEsZUFBZTtBQUMzQyxTQUFTQyxJQUFJLFFBQVEsUUFBUTtBQXdGN0IsSUFBTUMsb0JBQW9CLEdBQUcsU0FBdkJBLG9CQUFvQkEsQ0FBSUMsS0FBYyxFQUFFQyxRQUFnQixFQUFhO0VBQ3pFLElBQU1DLE1BQU0sR0FBR0MsTUFBTSxDQUFDSCxLQUFLLENBQUM7RUFDNUIsSUFBSSxDQUFDRyxNQUFNLENBQUNDLFFBQVEsQ0FBQ0YsTUFBTSxDQUFDLEVBQUUsT0FBT0QsUUFBUTtFQUM3QyxJQUFNSSxVQUFVLEdBQUdDLElBQUksQ0FBQ0MsS0FBSyxDQUFDTCxNQUFNLENBQUM7RUFDckMsT0FBT0csVUFBVSxHQUFHLENBQUMsR0FBR0EsVUFBVSxHQUFHSixRQUFRO0FBQy9DLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQWdCQSxJQUFNTyxv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