@projectcor/maia-components 2.11.53-2 → 2.11.53-3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/lib/App.js +1 -1
  2. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.js +4 -9
  3. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.styles.js +2 -2
  4. package/lib/components/atoms/MAIAInput/MAIAInput.js +4 -2
  5. package/lib/components/atoms/MAIAInput/styles.js +3 -2
  6. package/lib/components/atoms/icons/FaqChevronIcon.js +39 -0
  7. package/lib/components/atoms/icons/index.js +2 -1
  8. package/lib/components/atoms/index.js +1 -2
  9. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +2 -28
  10. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +9 -18
  11. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +28 -5
  12. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +6 -4
  13. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +22 -4
  14. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.styles.js +21 -17
  15. package/lib/components/molecules/ChatFooter/ChatFooter.js +5 -3
  16. package/lib/hooks/useChatManager/useChatManager.js +39 -122
  17. package/lib/hooks/useEvent.js +3 -2
  18. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +80 -179
  19. package/lib/lang/br/index.js +5 -57
  20. package/lib/lang/en/index.js +5 -57
  21. package/lib/lang/es/index.js +5 -57
  22. package/lib/lang/fr/index.js +4 -56
  23. package/package.json +1 -1
  24. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.js +0 -83
  25. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.styles.js +0 -21
  26. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.js +0 -7
  27. package/lib/components/atoms/AgentActivityIndicator/index.js +0 -2
  28. package/lib/types/streamActivity.js +0 -2
  29. package/lib/utils/debugMaiaSseLog.js +0 -27
  30. package/lib/utils/sseStreamContent.js +0 -17
  31. package/lib/utils/streamActivityMessages.js +0 -368
@@ -1,368 +0,0 @@
1
- import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
- import { normalizeHitlToolName } from './hitlAnalytics';
3
- import { logHitlApprovalContext } from './debugMaiaSseLog';
4
- var THINKING_MESSAGE_KEYS = ['chat.activity.thinking.analyzing', 'chat.activity.thinking.reviewing', 'chat.activity.thinking.planning'];
5
- var GENERATING_MESSAGE_KEYS = ['chat.activity.generating.preparing', 'chat.activity.generating.considering', 'chat.activity.generating.almostReady'];
6
- var SEARCH_MESSAGE_KEYS = ['chat.activity.search.scanning', 'chat.activity.search.summarizing'];
7
- var DEEP_SEARCH_MESSAGE_KEYS = ['chat.activity.deepSearch.exploring', 'chat.activity.deepSearch.crossChecking'];
8
- var ATTACHMENT_MESSAGE_KEYS = ['chat.activity.attachment.reading', 'chat.activity.attachment.extracting'];
9
- export var WRITING_ACTIVITY_MESSAGE_KEY = 'chat.activity.writing.composing';
10
-
11
- /** Tools HITL / node SSE → key i18n del indicador de actividad (tiempo presente continuo). */
12
- var HITL_TOOL_ACTIVITY_KEYS = {
13
- create_task: 'chat.activity.creatingTask',
14
- clone_task: 'chat.activity.creatingTask',
15
- create_tasks_batch: 'chat.activity.creatingTasksBatch',
16
- create_agent: 'chat.activity.creatingAgent',
17
- edit_agent: 'chat.activity.editingAgent',
18
- edit_task: 'chat.activity.editingTask',
19
- edit_tasks_batch: 'chat.activity.editingTasksBatch',
20
- delete_task: 'chat.activity.deletingTask',
21
- delete_tasks_batch: 'chat.activity.deletingTasksBatch',
22
- task_assign: 'chat.activity.assigningUser',
23
- task_unassign: 'chat.activity.unassigningUser',
24
- assign_task_label: 'chat.activity.assigningLabel',
25
- update_task_type: 'chat.activity.updatingTaskType',
26
- update_estimated_hours: 'chat.activity.updatingEstimatedHours',
27
- update_deliverable: 'chat.activity.updatingDeliverable',
28
- create_hour: 'chat.activity.loggingHours',
29
- create_checklist: 'chat.activity.creatingChecklist',
30
- get_task_date_hours: 'chat.activity.queryingHours',
31
- configure_agent_access: 'chat.activity.configuringAgentAccess',
32
- send_task_message: 'chat.activity.sendingTaskMessage',
33
- delete_checklist_item: 'chat.activity.deletingChecklistItem',
34
- remove_task_type: 'chat.activity.removingTaskType',
35
- remove_task_label: 'chat.activity.removingLabel',
36
- count_deliverable: 'chat.activity.updatingDeliverableCount',
37
- create_rework: 'chat.activity.creatingRework',
38
- update_rework: 'chat.activity.updatingRework'
39
- };
40
- var HITL_TOOL_NAMES_BY_SPECIFICITY = Object.keys(HITL_TOOL_ACTIVITY_KEYS).sort(function (a, b) {
41
- return b.length - a.length;
42
- });
43
-
44
- /** Mensajes genéricos del backend cuando no hay detalle de tool (continue-thread). */
45
- var isGenericResumeNodeMessage = function isGenericResumeNodeMessage(message) {
46
- var normalized = message.trim().toLowerCase();
47
- return normalized.startsWith('ejecutando acción aprobada') || normalized.startsWith('executing approved action') || normalized.startsWith('executando ação aprovada');
48
- };
49
- export var mapHitlToolNameToStreamActivity = function mapHitlToolNameToStreamActivity(toolName, t, options) {
50
- var normalized = normalizeHitlToolName(toolName);
51
- var key = HITL_TOOL_ACTIVITY_KEYS[normalized];
52
- if (key) {
53
- return {
54
- phase: 'action',
55
- message: t(key)
56
- };
57
- }
58
- if (options !== null && options !== void 0 && options.useResumingFallback) {
59
- return {
60
- phase: 'action',
61
- message: t('chat.activity.resumingAction')
62
- };
63
- }
64
- return {
65
- phase: 'action',
66
- message: t('chat.executingAction')
67
- };
68
- };
69
- var resolveHitlToolFromNodeMessage = function resolveHitlToolFromNodeMessage(nodeMessage) {
70
- var normalized = nodeMessage.toLowerCase().trim();
71
- if (!normalized) return null;
72
- if (HITL_TOOL_ACTIVITY_KEYS[normalized]) {
73
- return normalized;
74
- }
75
- var asToolName = normalizeHitlToolName(normalized.replace(/\s+/g, '_'));
76
- if (HITL_TOOL_ACTIVITY_KEYS[asToolName]) {
77
- return asToolName;
78
- }
79
- var matchedTool = HITL_TOOL_NAMES_BY_SPECIFICITY.find(function (toolName) {
80
- return normalized.includes(toolName);
81
- });
82
- return matchedTool !== null && matchedTool !== void 0 ? matchedTool : null;
83
- };
84
- var resolvePendingActionsForThread = function resolvePendingActionsForThread(context, threadId) {
85
- var _ref, _context$pendingActio, _context$approval, _context$threadIds;
86
- var pending = (_ref = (_context$pendingActio = context === null || context === void 0 ? void 0 : context.pendingActions) !== null && _context$pendingActio !== void 0 ? _context$pendingActio : context === null || context === void 0 || (_context$approval = context.approval) === null || _context$approval === void 0 ? void 0 : _context$approval.pending_actions) !== null && _ref !== void 0 ? _ref : [];
87
- if (!pending.length) return [];
88
- if (threadId) {
89
- var forThread = pending.filter(function (action) {
90
- return action.thread_id === threadId;
91
- });
92
- if (forThread.length) return forThread;
93
- }
94
- if (context !== null && context !== void 0 && (_context$threadIds = context.threadIds) !== null && _context$threadIds !== void 0 && _context$threadIds.length) {
95
- return pending.filter(function (action) {
96
- var _context$threadIds2;
97
- return (_context$threadIds2 = context.threadIds) === null || _context$threadIds2 === void 0 ? void 0 : _context$threadIds2.includes(action.thread_id);
98
- });
99
- }
100
- return pending;
101
- };
102
- var detectToolsFromPendingActions = function detectToolsFromPendingActions(actions) {
103
- return _toConsumableArray(new Set(actions.map(function (action) {
104
- return normalizeHitlToolName(action.tool_name);
105
- }).filter(Boolean)));
106
- };
107
-
108
- /** Resuelve indicador HITL priorizando pending_actions del mensaje de aprobación anterior. */
109
- export var resolveHitlNodeStreamActivity = function resolveHitlNodeStreamActivity(nodeMessage, t, context, threadId, options) {
110
- var pendingForThread = resolvePendingActionsForThread(context, threadId);
111
- var detectedTools = detectToolsFromPendingActions(pendingForThread);
112
- if (options !== null && options !== void 0 && options.logSource) {
113
- logHitlApprovalContext(options.logSource, {
114
- messageId: context === null || context === void 0 ? void 0 : context.messageId,
115
- messageText: context === null || context === void 0 ? void 0 : context.messageText,
116
- threadId: threadId,
117
- threadIds: context === null || context === void 0 ? void 0 : context.threadIds,
118
- nodeMessage: nodeMessage,
119
- pendingActions: pendingForThread,
120
- detectedTools: detectedTools
121
- });
122
- }
123
- var trimmedNodeMessage = nodeMessage.trim();
124
- var activityFromNodeMessage = trimmedNodeMessage && !isGenericResumeNodeMessage(trimmedNodeMessage) ? {
125
- phase: 'action',
126
- message: trimmedNodeMessage
127
- } : null;
128
- var resolveAndLog = function resolveAndLog(activity) {
129
- if (options !== null && options !== void 0 && options.logSource) {
130
- logHitlApprovalContext("".concat(options.logSource, ":resolved"), {
131
- detectedTools: detectedTools,
132
- resolvedActivity: activity
133
- });
134
- }
135
- return activity;
136
- };
137
- if (detectedTools.length >= 1) {
138
- if (activityFromNodeMessage) {
139
- return resolveAndLog(activityFromNodeMessage);
140
- }
141
- return resolveAndLog(mapHitlToolNameToStreamActivity(detectedTools[0], t, options));
142
- }
143
- var activity = mapNodeMessageToStreamActivity(nodeMessage, t, options);
144
- if (options !== null && options !== void 0 && options.logSource) {
145
- logHitlApprovalContext("".concat(options.logSource, ":resolved"), {
146
- nodeMessage: nodeMessage,
147
- resolvedActivity: activity
148
- });
149
- }
150
- return activity;
151
- };
152
- export var resolveInitialHitlStreamActivity = function resolveInitialHitlStreamActivity(t, context, options) {
153
- var pendingActions = resolvePendingActionsForThread(context);
154
- var detectedTools = detectToolsFromPendingActions(pendingActions);
155
- if (options !== null && options !== void 0 && options.logSource) {
156
- logHitlApprovalContext(options.logSource, {
157
- messageId: context === null || context === void 0 ? void 0 : context.messageId,
158
- messageText: context === null || context === void 0 ? void 0 : context.messageText,
159
- threadIds: context === null || context === void 0 ? void 0 : context.threadIds,
160
- pendingActions: pendingActions,
161
- detectedTools: detectedTools
162
- });
163
- }
164
- if (detectedTools.length >= 1) {
165
- var activity = mapHitlToolNameToStreamActivity(detectedTools[0], t, {
166
- useResumingFallback: true
167
- });
168
- if (options !== null && options !== void 0 && options.logSource) {
169
- logHitlApprovalContext("".concat(options.logSource, ":resolved"), {
170
- detectedTools: detectedTools,
171
- resolvedActivity: activity
172
- });
173
- }
174
- return activity;
175
- }
176
- return {
177
- phase: 'processing',
178
- message: t('chat.processing')
179
- };
180
- };
181
- export var ACTIVITY_MESSAGE_ROTATE_MS = 3200;
182
- var ROTATABLE_PHASES = ['generating', 'thinking', 'search', 'deep_search', 'attachment'];
183
- var getMessageKeysForPhase = function getMessageKeysForPhase(phase) {
184
- switch (phase) {
185
- case 'generating':
186
- return GENERATING_MESSAGE_KEYS;
187
- case 'thinking':
188
- return THINKING_MESSAGE_KEYS;
189
- case 'search':
190
- return SEARCH_MESSAGE_KEYS;
191
- case 'deep_search':
192
- return DEEP_SEARCH_MESSAGE_KEYS;
193
- case 'attachment':
194
- return ATTACHMENT_MESSAGE_KEYS;
195
- default:
196
- return null;
197
- }
198
- };
199
- export var getStreamActivityMessageAtIndex = function getStreamActivityMessageAtIndex(phase, index, t) {
200
- if (phase === 'writing') {
201
- return t(WRITING_ACTIVITY_MESSAGE_KEY);
202
- }
203
- var keys = getMessageKeysForPhase(phase);
204
- if (!(keys !== null && keys !== void 0 && keys.length)) {
205
- return '';
206
- }
207
- var clampedIndex = Math.min(Math.max(0, index), keys.length - 1);
208
- return t(keys[clampedIndex]);
209
- };
210
- export var getThinkingLoadingMessage = function getThinkingLoadingMessage(index, t) {
211
- return getStreamActivityMessageAtIndex('thinking', index, t);
212
- };
213
- export var getGeneratingLoadingMessage = function getGeneratingLoadingMessage(index, t) {
214
- return getStreamActivityMessageAtIndex('generating', index, t);
215
- };
216
- export var canAdvanceStreamActivityMessage = function canAdvanceStreamActivityMessage(phase, currentIndex) {
217
- var keys = getMessageKeysForPhase(phase);
218
- if (!keys) {
219
- return false;
220
- }
221
- return currentIndex < keys.length - 1;
222
- };
223
- export var advanceStreamActivityMessage = function advanceStreamActivityMessage(activity, currentIndex, t) {
224
- if (!canAdvanceStreamActivityMessage(activity.phase, currentIndex)) {
225
- return null;
226
- }
227
- var nextIndex = currentIndex + 1;
228
- return {
229
- activity: {
230
- phase: activity.phase,
231
- message: getStreamActivityMessageAtIndex(activity.phase, nextIndex, t)
232
- },
233
- nextIndex: nextIndex
234
- };
235
- };
236
- export var canRotateStreamActivityPhase = function canRotateStreamActivityPhase(phase) {
237
- return ROTATABLE_PHASES.includes(phase);
238
- };
239
- export var getWritingStreamActivity = function getWritingStreamActivity(t) {
240
- return {
241
- phase: 'writing',
242
- message: t(WRITING_ACTIVITY_MESSAGE_KEY)
243
- };
244
- };
245
- export var getInitialStreamActivity = function getInitialStreamActivity(t, options) {
246
- if (options.isWebSearchActive) {
247
- return {
248
- phase: 'search',
249
- message: t(SEARCH_MESSAGE_KEYS[0])
250
- };
251
- }
252
- if (options.isDeepSearchActive) {
253
- return {
254
- phase: 'deep_search',
255
- message: t(DEEP_SEARCH_MESSAGE_KEYS[0])
256
- };
257
- }
258
- if (options.hasAttachments) {
259
- return {
260
- phase: 'attachment',
261
- message: t(ATTACHMENT_MESSAGE_KEYS[0])
262
- };
263
- }
264
- return {
265
- phase: 'generating',
266
- message: t(GENERATING_MESSAGE_KEYS[0])
267
- };
268
- };
269
- export var mapNodeMessageToStreamActivity = function mapNodeMessageToStreamActivity(nodeMessage, t, options) {
270
- var normalized = nodeMessage.toLowerCase();
271
- var hitlTool = resolveHitlToolFromNodeMessage(nodeMessage);
272
- if (hitlTool) {
273
- return mapHitlToolNameToStreamActivity(hitlTool, t, options);
274
- }
275
- if (normalized.includes('response_file_generation') || normalized.includes('generando archivo') || normalized.includes('generating file')) {
276
- return {
277
- phase: 'action',
278
- message: t('chat.activity.generatingFile')
279
- };
280
- }
281
- if (normalized.includes('tavily') || normalized.includes('search_web') || normalized.includes('buscando en la web') || normalized.includes('searching the web')) {
282
- return {
283
- phase: 'search',
284
- message: t(SEARCH_MESSAGE_KEYS[0])
285
- };
286
- }
287
- var trimmedMessage = nodeMessage.trim();
288
- if (trimmedMessage && !isGenericResumeNodeMessage(trimmedMessage)) {
289
- return {
290
- phase: 'action',
291
- message: trimmedMessage
292
- };
293
- }
294
- if (isGenericResumeNodeMessage(trimmedMessage) || options !== null && options !== void 0 && options.useResumingFallback) {
295
- return {
296
- phase: 'action',
297
- message: t('chat.activity.resumingAction')
298
- };
299
- }
300
- return {
301
- phase: 'action',
302
- message: t('chat.executingAction')
303
- };
304
- };
305
- export var resolveStreamLoadingDisplay = function resolveStreamLoadingDisplay(params) {
306
- if (params.streamActivity) {
307
- return params.streamActivity;
308
- }
309
- var activeKeys = Object.keys(params.activeLoadings);
310
- if (activeKeys.length > 0) {
311
- var firstKey = activeKeys[0];
312
- var raw = params.activeLoadings[firstKey];
313
- if (raw && raw !== params.t('chat.processing')) {
314
- var hitlTool = resolveHitlToolFromNodeMessage(raw);
315
- if (hitlTool) {
316
- return mapHitlToolNameToStreamActivity(hitlTool, params.t);
317
- }
318
- var trimmed = raw.trim();
319
- if (trimmed && !isGenericResumeNodeMessage(trimmed)) {
320
- return {
321
- phase: 'action',
322
- message: trimmed
323
- };
324
- }
325
- return mapNodeMessageToStreamActivity(raw, params.t, {
326
- useResumingFallback: true
327
- });
328
- }
329
- return {
330
- phase: 'processing',
331
- message: params.t('chat.processing')
332
- };
333
- }
334
- if (params.loadingMessage) {
335
- if (params.loadingMessage === params.t('chat.writing') || params.loadingMessage === params.t(WRITING_ACTIVITY_MESSAGE_KEY)) {
336
- return getWritingStreamActivity(params.t);
337
- }
338
- if (params.loadingMessage === params.t('chat.generating')) {
339
- return {
340
- phase: 'generating',
341
- message: params.loadingMessage
342
- };
343
- }
344
- if (params.loadingMessage === params.t('chat.generatingWebSearch') || params.loadingMessage === params.t('chat.generatingDeepSearch') || params.loadingMessage === params.t('chat.generatingAttachment')) {
345
- return getInitialStreamActivity(params.t, {
346
- isWebSearchActive: params.loadingMessage === params.t('chat.generatingWebSearch'),
347
- isDeepSearchActive: params.loadingMessage === params.t('chat.generatingDeepSearch'),
348
- hasAttachments: params.loadingMessage === params.t('chat.generatingAttachment')
349
- });
350
- }
351
- return {
352
- phase: 'action',
353
- message: params.loadingMessage
354
- };
355
- }
356
- if (params.waitingResponse) {
357
- return getInitialStreamActivity(params.t, {
358
- isWebSearchActive: params.isWebSearchActive,
359
- isDeepSearchActive: params.isDeepSearchActive,
360
- hasAttachments: params.hasAttachments
361
- });
362
- }
363
- return null;
364
- };
365
- export var isStreamingPlaceholderMessageId = function isStreamingPlaceholderMessageId(messageId) {
366
- return typeof messageId === 'string' && messageId.includes('-streaming');
367
- };
368
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJub3JtYWxpemVIaXRsVG9vbE5hbWUiLCJsb2dIaXRsQXBwcm92YWxDb250ZXh0IiwiVEhJTktJTkdfTUVTU0FHRV9LRVlTIiwiR0VORVJBVElOR19NRVNTQUdFX0tFWVMiLCJTRUFSQ0hfTUVTU0FHRV9LRVlTIiwiREVFUF9TRUFSQ0hfTUVTU0FHRV9LRVlTIiwiQVRUQUNITUVOVF9NRVNTQUdFX0tFWVMiLCJXUklUSU5HX0FDVElWSVRZX01FU1NBR0VfS0VZIiwiSElUTF9UT09MX0FDVElWSVRZX0tFWVMiLCJjcmVhdGVfdGFzayIsImNsb25lX3Rhc2siLCJjcmVhdGVfdGFza3NfYmF0Y2giLCJjcmVhdGVfYWdlbnQiLCJlZGl0X2FnZW50IiwiZWRpdF90YXNrIiwiZWRpdF90YXNrc19iYXRjaCIsImRlbGV0ZV90YXNrIiwiZGVsZXRlX3Rhc2tzX2JhdGNoIiwidGFza19hc3NpZ24iLCJ0YXNrX3VuYXNzaWduIiwiYXNzaWduX3Rhc2tfbGFiZWwiLCJ1cGRhdGVfdGFza190eXBlIiwidXBkYXRlX2VzdGltYXRlZF9ob3VycyIsInVwZGF0ZV9kZWxpdmVyYWJsZSIsImNyZWF0ZV9ob3VyIiwiY3JlYXRlX2NoZWNrbGlzdCIsImdldF90YXNrX2RhdGVfaG91cnMiLCJjb25maWd1cmVfYWdlbnRfYWNjZXNzIiwic2VuZF90YXNrX21lc3NhZ2UiLCJkZWxldGVfY2hlY2tsaXN0X2l0ZW0iLCJyZW1vdmVfdGFza190eXBlIiwicmVtb3ZlX3Rhc2tfbGFiZWwiLCJjb3VudF9kZWxpdmVyYWJsZSIsImNyZWF0ZV9yZXdvcmsiLCJ1cGRhdGVfcmV3b3JrIiwiSElUTF9UT09MX05BTUVTX0JZX1NQRUNJRklDSVRZIiwiT2JqZWN0Iiwia2V5cyIsInNvcnQiLCJhIiwiYiIsImxlbmd0aCIsImlzR2VuZXJpY1Jlc3VtZU5vZGVNZXNzYWdlIiwibWVzc2FnZSIsIm5vcm1hbGl6ZWQiLCJ0cmltIiwidG9Mb3dlckNhc2UiLCJzdGFydHNXaXRoIiwibWFwSGl0bFRvb2xOYW1lVG9TdHJlYW1BY3Rpdml0eSIsInRvb2xOYW1lIiwidCIsIm9wdGlvbnMiLCJrZXkiLCJwaGFzZSIsInVzZVJlc3VtaW5nRmFsbGJhY2siLCJyZXNvbHZlSGl0bFRvb2xGcm9tTm9kZU1lc3NhZ2UiLCJub2RlTWVzc2FnZSIsImFzVG9vbE5hbWUiLCJyZXBsYWNlIiwibWF0Y2hlZFRvb2wiLCJmaW5kIiwiaW5jbHVkZXMiLCJyZXNvbHZlUGVuZGluZ0FjdGlvbnNGb3JUaHJlYWQiLCJjb250ZXh0IiwidGhyZWFkSWQiLCJfcmVmIiwiX2NvbnRleHQkcGVuZGluZ0FjdGlvIiwiX2NvbnRleHQkYXBwcm92YWwiLCJfY29udGV4dCR0aHJlYWRJZHMiLCJwZW5kaW5nIiwicGVuZGluZ0FjdGlvbnMiLCJhcHByb3ZhbCIsInBlbmRpbmdfYWN0aW9ucyIsImZvclRocmVhZCIsImZpbHRlciIsImFjdGlvbiIsInRocmVhZF9pZCIsInRocmVhZElkcyIsIl9jb250ZXh0JHRocmVhZElkczIiLCJkZXRlY3RUb29sc0Zyb21QZW5kaW5nQWN0aW9ucyIsImFjdGlvbnMiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJTZXQiLCJtYXAiLCJ0b29sX25hbWUiLCJCb29sZWFuIiwicmVzb2x2ZUhpdGxOb2RlU3RyZWFtQWN0aXZpdHkiLCJwZW5kaW5nRm9yVGhyZWFkIiwiZGV0ZWN0ZWRUb29scyIsImxvZ1NvdXJjZSIsIm1lc3NhZ2VJZCIsIm1lc3NhZ2VUZXh0IiwidHJpbW1lZE5vZGVNZXNzYWdlIiwiYWN0aXZpdHlGcm9tTm9kZU1lc3NhZ2UiLCJyZXNvbHZlQW5kTG9nIiwiYWN0aXZpdHkiLCJjb25jYXQiLCJyZXNvbHZlZEFjdGl2aXR5IiwibWFwTm9kZU1lc3NhZ2VUb1N0cmVhbUFjdGl2aXR5IiwicmVzb2x2ZUluaXRpYWxIaXRsU3RyZWFtQWN0aXZpdHkiLCJBQ1RJVklUWV9NRVNTQUdFX1JPVEFURV9NUyIsIlJPVEFUQUJMRV9QSEFTRVMiLCJnZXRNZXNzYWdlS2V5c0ZvclBoYXNlIiwiZ2V0U3RyZWFtQWN0aXZpdHlNZXNzYWdlQXRJbmRleCIsImluZGV4IiwiY2xhbXBlZEluZGV4IiwiTWF0aCIsIm1pbiIsIm1heCIsImdldFRoaW5raW5nTG9hZGluZ01lc3NhZ2UiLCJnZXRHZW5lcmF0aW5nTG9hZGluZ01lc3NhZ2UiLCJjYW5BZHZhbmNlU3RyZWFtQWN0aXZpdHlNZXNzYWdlIiwiY3VycmVudEluZGV4IiwiYWR2YW5jZVN0cmVhbUFjdGl2aXR5TWVzc2FnZSIsIm5leHRJbmRleCIsImNhblJvdGF0ZVN0cmVhbUFjdGl2aXR5UGhhc2UiLCJnZXRXcml0aW5nU3RyZWFtQWN0aXZpdHkiLCJnZXRJbml0aWFsU3RyZWFtQWN0aXZpdHkiLCJpc1dlYlNlYXJjaEFjdGl2ZSIsImlzRGVlcFNlYXJjaEFjdGl2ZSIsImhhc0F0dGFjaG1lbnRzIiwiaGl0bFRvb2wiLCJ0cmltbWVkTWVzc2FnZSIsInJlc29sdmVTdHJlYW1Mb2FkaW5nRGlzcGxheSIsInBhcmFtcyIsInN0cmVhbUFjdGl2aXR5IiwiYWN0aXZlS2V5cyIsImFjdGl2ZUxvYWRpbmdzIiwiZmlyc3RLZXkiLCJyYXciLCJ0cmltbWVkIiwibG9hZGluZ01lc3NhZ2UiLCJ3YWl0aW5nUmVzcG9uc2UiLCJpc1N0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3N0cmVhbUFjdGl2aXR5TWVzc2FnZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTdHJlYW1BY3Rpdml0eSwgU3RyZWFtQWN0aXZpdHlQaGFzZSB9IGZyb20gJy4uL3R5cGVzL3N0cmVhbUFjdGl2aXR5J1xuaW1wb3J0IHR5cGUgeyBBcHByb3ZhbFJlcXVlc3QsIFBlbmRpbmdBY3Rpb24gfSBmcm9tICcuLi90eXBlcy9DaGF0J1xuaW1wb3J0IHsgbm9ybWFsaXplSGl0bFRvb2xOYW1lIH0gZnJvbSAnLi9oaXRsQW5hbHl0aWNzJ1xuaW1wb3J0IHsgbG9nSGl0bEFwcHJvdmFsQ29udGV4dCB9IGZyb20gJy4vZGVidWdNYWlhU3NlTG9nJ1xuXG50eXBlIFRyYW5zbGF0ZUZuID0gKGtleTogc3RyaW5nKSA9PiBzdHJpbmdcblxuY29uc3QgVEhJTktJTkdfTUVTU0FHRV9LRVlTID0gW1xuICAnY2hhdC5hY3Rpdml0eS50aGlua2luZy5hbmFseXppbmcnLFxuICAnY2hhdC5hY3Rpdml0eS50aGlua2luZy5yZXZpZXdpbmcnLFxuICAnY2hhdC5hY3Rpdml0eS50aGlua2luZy5wbGFubmluZycsXG5dIGFzIGNvbnN0XG5cbmNvbnN0IEdFTkVSQVRJTkdfTUVTU0FHRV9LRVlTID0gW1xuICAnY2hhdC5hY3Rpdml0eS5nZW5lcmF0aW5nLnByZXBhcmluZycsXG4gICdjaGF0LmFjdGl2aXR5LmdlbmVyYXRpbmcuY29uc2lkZXJpbmcnLFxuICAnY2hhdC5hY3Rpdml0eS5nZW5lcmF0aW5nLmFsbW9zdFJlYWR5Jyxcbl0gYXMgY29uc3RcblxuY29uc3QgU0VBUkNIX01FU1NBR0VfS0VZUyA9IFsnY2hhdC5hY3Rpdml0eS5zZWFyY2guc2Nhbm5pbmcnLCAnY2hhdC5hY3Rpdml0eS5zZWFyY2guc3VtbWFyaXppbmcnXSBhcyBjb25zdFxuXG5jb25zdCBERUVQX1NFQVJDSF9NRVNTQUdFX0tFWVMgPSBbXG4gICdjaGF0LmFjdGl2aXR5LmRlZXBTZWFyY2guZXhwbG9yaW5nJyxcbiAgJ2NoYXQuYWN0aXZpdHkuZGVlcFNlYXJjaC5jcm9zc0NoZWNraW5nJyxcbl0gYXMgY29uc3RcblxuY29uc3QgQVRUQUNITUVOVF9NRVNTQUdFX0tFWVMgPSBbJ2NoYXQuYWN0aXZpdHkuYXR0YWNobWVudC5yZWFkaW5nJywgJ2NoYXQuYWN0aXZpdHkuYXR0YWNobWVudC5leHRyYWN0aW5nJ10gYXMgY29uc3RcblxuZXhwb3J0IGNvbnN0IFdSSVRJTkdfQUNUSVZJVFlfTUVTU0FHRV9LRVkgPSAnY2hhdC5hY3Rpdml0eS53cml0aW5nLmNvbXBvc2luZycgYXMgY29uc3RcblxuLyoqIFRvb2xzIEhJVEwgLyBub2RlIFNTRSDihpIga2V5IGkxOG4gZGVsIGluZGljYWRvciBkZSBhY3RpdmlkYWQgKHRpZW1wbyBwcmVzZW50ZSBjb250aW51bykuICovXG5jb25zdCBISVRMX1RPT0xfQUNUSVZJVFlfS0VZUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgY3JlYXRlX3Rhc2s6ICdjaGF0LmFjdGl2aXR5LmNyZWF0aW5nVGFzaycsXG4gIGNsb25lX3Rhc2s6ICdjaGF0LmFjdGl2aXR5LmNyZWF0aW5nVGFzaycsXG4gIGNyZWF0ZV90YXNrc19iYXRjaDogJ2NoYXQuYWN0aXZpdHkuY3JlYXRpbmdUYXNrc0JhdGNoJyxcbiAgY3JlYXRlX2FnZW50OiAnY2hhdC5hY3Rpdml0eS5jcmVhdGluZ0FnZW50JyxcbiAgZWRpdF9hZ2VudDogJ2NoYXQuYWN0aXZpdHkuZWRpdGluZ0FnZW50JyxcbiAgZWRpdF90YXNrOiAnY2hhdC5hY3Rpdml0eS5lZGl0aW5nVGFzaycsXG4gIGVkaXRfdGFza3NfYmF0Y2g6ICdjaGF0LmFjdGl2aXR5LmVkaXRpbmdUYXNrc0JhdGNoJyxcbiAgZGVsZXRlX3Rhc2s6ICdjaGF0LmFjdGl2aXR5LmRlbGV0aW5nVGFzaycsXG4gIGRlbGV0ZV90YXNrc19iYXRjaDogJ2NoYXQuYWN0aXZpdHkuZGVsZXRpbmdUYXNrc0JhdGNoJyxcbiAgdGFza19hc3NpZ246ICdjaGF0LmFjdGl2aXR5LmFzc2lnbmluZ1VzZXInLFxuICB0YXNrX3VuYXNzaWduOiAnY2hhdC5hY3Rpdml0eS51bmFzc2lnbmluZ1VzZXInLFxuICBhc3NpZ25fdGFza19sYWJlbDogJ2NoYXQuYWN0aXZpdHkuYXNzaWduaW5nTGFiZWwnLFxuICB1cGRhdGVfdGFza190eXBlOiAnY2hhdC5hY3Rpdml0eS51cGRhdGluZ1Rhc2tUeXBlJyxcbiAgdXBkYXRlX2VzdGltYXRlZF9ob3VyczogJ2NoYXQuYWN0aXZpdHkudXBkYXRpbmdFc3RpbWF0ZWRIb3VycycsXG4gIHVwZGF0ZV9kZWxpdmVyYWJsZTogJ2NoYXQuYWN0aXZpdHkudXBkYXRpbmdEZWxpdmVyYWJsZScsXG4gIGNyZWF0ZV9ob3VyOiAnY2hhdC5hY3Rpdml0eS5sb2dnaW5nSG91cnMnLFxuICBjcmVhdGVfY2hlY2tsaXN0OiAnY2hhdC5hY3Rpdml0eS5jcmVhdGluZ0NoZWNrbGlzdCcsXG4gIGdldF90YXNrX2RhdGVfaG91cnM6ICdjaGF0LmFjdGl2aXR5LnF1ZXJ5aW5nSG91cnMnLFxuICBjb25maWd1cmVfYWdlbnRfYWNjZXNzOiAnY2hhdC5hY3Rpdml0eS5jb25maWd1cmluZ0FnZW50QWNjZXNzJyxcbiAgc2VuZF90YXNrX21lc3NhZ2U6ICdjaGF0LmFjdGl2aXR5LnNlbmRpbmdUYXNrTWVzc2FnZScsXG4gIGRlbGV0ZV9jaGVja2xpc3RfaXRlbTogJ2NoYXQuYWN0aXZpdHkuZGVsZXRpbmdDaGVja2xpc3RJdGVtJyxcbiAgcmVtb3ZlX3Rhc2tfdHlwZTogJ2NoYXQuYWN0aXZpdHkucmVtb3ZpbmdUYXNrVHlwZScsXG4gIHJlbW92ZV90YXNrX2xhYmVsOiAnY2hhdC5hY3Rpdml0eS5yZW1vdmluZ0xhYmVsJyxcbiAgY291bnRfZGVsaXZlcmFibGU6ICdjaGF0LmFjdGl2aXR5LnVwZGF0aW5nRGVsaXZlcmFibGVDb3VudCcsXG4gIGNyZWF0ZV9yZXdvcms6ICdjaGF0LmFjdGl2aXR5LmNyZWF0aW5nUmV3b3JrJyxcbiAgdXBkYXRlX3Jld29yazogJ2NoYXQuYWN0aXZpdHkudXBkYXRpbmdSZXdvcmsnLFxufVxuXG5jb25zdCBISVRMX1RPT0xfTkFNRVNfQllfU1BFQ0lGSUNJVFkgPSBPYmplY3Qua2V5cyhISVRMX1RPT0xfQUNUSVZJVFlfS0VZUykuc29ydCgoYSwgYikgPT4gYi5sZW5ndGggLSBhLmxlbmd0aClcblxuLyoqIE1lbnNhamVzIGdlbsOpcmljb3MgZGVsIGJhY2tlbmQgY3VhbmRvIG5vIGhheSBkZXRhbGxlIGRlIHRvb2wgKGNvbnRpbnVlLXRocmVhZCkuICovXG5jb25zdCBpc0dlbmVyaWNSZXN1bWVOb2RlTWVzc2FnZSA9IChtZXNzYWdlOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG1lc3NhZ2UudHJpbSgpLnRvTG93ZXJDYXNlKClcbiAgcmV0dXJuIChcbiAgICBub3JtYWxpemVkLnN0YXJ0c1dpdGgoJ2VqZWN1dGFuZG8gYWNjacOzbiBhcHJvYmFkYScpIHx8XG4gICAgbm9ybWFsaXplZC5zdGFydHNXaXRoKCdleGVjdXRpbmcgYXBwcm92ZWQgYWN0aW9uJykgfHxcbiAgICBub3JtYWxpemVkLnN0YXJ0c1dpdGgoJ2V4ZWN1dGFuZG8gYcOnw6NvIGFwcm92YWRhJylcbiAgKVxufVxuXG5leHBvcnQgY29uc3QgbWFwSGl0bFRvb2xOYW1lVG9TdHJlYW1BY3Rpdml0eSA9IChcbiAgdG9vbE5hbWU6IHN0cmluZyxcbiAgdDogVHJhbnNsYXRlRm4sXG4gIG9wdGlvbnM/OiB7IHVzZVJlc3VtaW5nRmFsbGJhY2s/OiBib29sZWFuIH1cbik6IFN0cmVhbUFjdGl2aXR5ID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZUhpdGxUb29sTmFtZSh0b29sTmFtZSlcbiAgY29uc3Qga2V5ID0gSElUTF9UT09MX0FDVElWSVRZX0tFWVNbbm9ybWFsaXplZF1cbiAgaWYgKGtleSkge1xuICAgIHJldHVybiB7IHBoYXNlOiAnYWN0aW9uJywgbWVzc2FnZTogdChrZXkpIH1cbiAgfVxuICBpZiAob3B0aW9ucz8udXNlUmVzdW1pbmdGYWxsYmFjaykge1xuICAgIHJldHVybiB7IHBoYXNlOiAnYWN0aW9uJywgbWVzc2FnZTogdCgnY2hhdC5hY3Rpdml0eS5yZXN1bWluZ0FjdGlvbicpIH1cbiAgfVxuICByZXR1cm4geyBwaGFzZTogJ2FjdGlvbicsIG1lc3NhZ2U6IHQoJ2NoYXQuZXhlY3V0aW5nQWN0aW9uJykgfVxufVxuXG5jb25zdCByZXNvbHZlSGl0bFRvb2xGcm9tTm9kZU1lc3NhZ2UgPSAobm9kZU1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB8IG51bGwgPT4ge1xuICBjb25zdCBub3JtYWxpemVkID0gbm9kZU1lc3NhZ2UudG9Mb3dlckNhc2UoKS50cmltKClcbiAgaWYgKCFub3JtYWxpemVkKSByZXR1cm4gbnVsbFxuXG4gIGlmIChISVRMX1RPT0xfQUNUSVZJVFlfS0VZU1tub3JtYWxpemVkXSkge1xuICAgIHJldHVybiBub3JtYWxpemVkXG4gIH1cblxuICBjb25zdCBhc1Rvb2xOYW1lID0gbm9ybWFsaXplSGl0bFRvb2xOYW1lKG5vcm1hbGl6ZWQucmVwbGFjZSgvXFxzKy9nLCAnXycpKVxuICBpZiAoSElUTF9UT09MX0FDVElWSVRZX0tFWVNbYXNUb29sTmFtZV0pIHtcbiAgICByZXR1cm4gYXNUb29sTmFtZVxuICB9XG5cbiAgY29uc3QgbWF0Y2hlZFRvb2wgPSBISVRMX1RPT0xfTkFNRVNfQllfU1BFQ0lGSUNJVFkuZmluZCh0b29sTmFtZSA9PiBub3JtYWxpemVkLmluY2x1ZGVzKHRvb2xOYW1lKSlcbiAgcmV0dXJuIG1hdGNoZWRUb29sID8/IG51bGxcbn1cblxuZXhwb3J0IHR5cGUgSGl0bEV4ZWN1dGlvbkNvbnRleHQgPSB7XG4gIG1lc3NhZ2VJZD86IHN0cmluZ1xuICBtZXNzYWdlVGV4dD86IHN0cmluZ1xuICBhcHByb3ZhbD86IEFwcHJvdmFsUmVxdWVzdFxuICBwZW5kaW5nQWN0aW9ucz86IFBlbmRpbmdBY3Rpb25bXVxuICB0aHJlYWRJZHM/OiBzdHJpbmdbXVxufVxuXG5jb25zdCByZXNvbHZlUGVuZGluZ0FjdGlvbnNGb3JUaHJlYWQgPSAoXG4gIGNvbnRleHQ6IEhpdGxFeGVjdXRpb25Db250ZXh0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgdGhyZWFkSWQ/OiBzdHJpbmdcbik6IFBlbmRpbmdBY3Rpb25bXSA9PiB7XG4gIGNvbnN0IHBlbmRpbmcgPSBjb250ZXh0Py5wZW5kaW5nQWN0aW9ucyA/PyBjb250ZXh0Py5hcHByb3ZhbD8ucGVuZGluZ19hY3Rpb25zID8/IFtdXG4gIGlmICghcGVuZGluZy5sZW5ndGgpIHJldHVybiBbXVxuXG4gIGlmICh0aHJlYWRJZCkge1xuICAgIGNvbnN0IGZvclRocmVhZCA9IHBlbmRpbmcuZmlsdGVyKGFjdGlvbiA9PiBhY3Rpb24udGhyZWFkX2lkID09PSB0aHJlYWRJZClcbiAgICBpZiAoZm9yVGhyZWFkLmxlbmd0aCkgcmV0dXJuIGZvclRocmVhZFxuICB9XG5cbiAgaWYgKGNvbnRleHQ/LnRocmVhZElkcz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHBlbmRpbmcuZmlsdGVyKGFjdGlvbiA9PiBjb250ZXh0LnRocmVhZElkcz8uaW5jbHVkZXMoYWN0aW9uLnRocmVhZF9pZCkpXG4gIH1cblxuICByZXR1cm4gcGVuZGluZ1xufVxuXG5jb25zdCBkZXRlY3RUb29sc0Zyb21QZW5kaW5nQWN0aW9ucyA9IChhY3Rpb25zOiBQZW5kaW5nQWN0aW9uW10pOiBzdHJpbmdbXSA9PiBbXG4gIC4uLm5ldyBTZXQoYWN0aW9ucy5tYXAoYWN0aW9uID0+IG5vcm1hbGl6ZUhpdGxUb29sTmFtZShhY3Rpb24udG9vbF9uYW1lKSkuZmlsdGVyKEJvb2xlYW4pKSxcbl1cblxuLyoqIFJlc3VlbHZlIGluZGljYWRvciBISVRMIHByaW9yaXphbmRvIHBlbmRpbmdfYWN0aW9ucyBkZWwgbWVuc2FqZSBkZSBhcHJvYmFjacOzbiBhbnRlcmlvci4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlSGl0bE5vZGVTdHJlYW1BY3Rpdml0eSA9IChcbiAgbm9kZU1lc3NhZ2U6IHN0cmluZyxcbiAgdDogVHJhbnNsYXRlRm4sXG4gIGNvbnRleHQ/OiBIaXRsRXhlY3V0aW9uQ29udGV4dCB8IG51bGwsXG4gIHRocmVhZElkPzogc3RyaW5nLFxuICBvcHRpb25zPzogeyB1c2VSZXN1bWluZ0ZhbGxiYWNrPzogYm9vbGVhbjsgbG9nU291cmNlPzogc3RyaW5nIH1cbik6IFN0cmVhbUFjdGl2aXR5ID0+IHtcbiAgY29uc3QgcGVuZGluZ0ZvclRocmVhZCA9IHJlc29sdmVQZW5kaW5nQWN0aW9uc0ZvclRocmVhZChjb250ZXh0LCB0aHJlYWRJZClcbiAgY29uc3QgZGV0ZWN0ZWRUb29scyA9IGRldGVjdFRvb2xzRnJvbVBlbmRpbmdBY3Rpb25zKHBlbmRpbmdGb3JUaHJlYWQpXG5cbiAgaWYgKG9wdGlvbnM/LmxvZ1NvdXJjZSkge1xuICAgIGxvZ0hpdGxBcHByb3ZhbENvbnRleHQob3B0aW9ucy5sb2dTb3VyY2UsIHtcbiAgICAgIG1lc3NhZ2VJZDogY29udGV4dD8ubWVzc2FnZUlkLFxuICAgICAgbWVzc2FnZVRleHQ6IGNvbnRleHQ/Lm1lc3NhZ2VUZXh0LFxuICAgICAgdGhyZWFkSWQsXG4gICAgICB0aHJlYWRJZHM6IGNvbnRleHQ/LnRocmVhZElkcyxcbiAgICAgIG5vZGVNZXNzYWdlLFxuICAgICAgcGVuZGluZ0FjdGlvbnM6IHBlbmRpbmdGb3JUaHJlYWQsXG4gICAgICBkZXRlY3RlZFRvb2xzLFxuICAgIH0pXG4gIH1cblxuICBjb25zdCB0cmltbWVkTm9kZU1lc3NhZ2UgPSBub2RlTWVzc2FnZS50cmltKClcbiAgY29uc3QgYWN0aXZpdHlGcm9tTm9kZU1lc3NhZ2UgPVxuICAgIHRyaW1tZWROb2RlTWVzc2FnZSAmJiAhaXNHZW5lcmljUmVzdW1lTm9kZU1lc3NhZ2UodHJpbW1lZE5vZGVNZXNzYWdlKVxuICAgICAgPyB7IHBoYXNlOiAnYWN0aW9uJyBhcyBjb25zdCwgbWVzc2FnZTogdHJpbW1lZE5vZGVNZXNzYWdlIH1cbiAgICAgIDogbnVsbFxuXG4gIGNvbnN0IHJlc29sdmVBbmRMb2cgPSAoYWN0aXZpdHk6IFN0cmVhbUFjdGl2aXR5KSA9PiB7XG4gICAgaWYgKG9wdGlvbnM/LmxvZ1NvdXJjZSkge1xuICAgICAgbG9nSGl0bEFwcHJvdmFsQ29udGV4dChgJHtvcHRpb25zLmxvZ1NvdXJjZX06cmVzb2x2ZWRgLCB7XG4gICAgICAgIGRldGVjdGVkVG9vbHMsXG4gICAgICAgIHJlc29sdmVkQWN0aXZpdHk6IGFjdGl2aXR5LFxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIGFjdGl2aXR5XG4gIH1cblxuICBpZiAoZGV0ZWN0ZWRUb29scy5sZW5ndGggPj0gMSkge1xuICAgIGlmIChhY3Rpdml0eUZyb21Ob2RlTWVzc2FnZSkge1xuICAgICAgcmV0dXJuIHJlc29sdmVBbmRMb2coYWN0aXZpdHlGcm9tTm9kZU1lc3NhZ2UpXG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlQW5kTG9nKG1hcEhpdGxUb29sTmFtZVRvU3RyZWFtQWN0aXZpdHkoZGV0ZWN0ZWRUb29sc1swXSwgdCwgb3B0aW9ucykpXG4gIH1cblxuICBjb25zdCBhY3Rpdml0eSA9IG1hcE5vZGVNZXNzYWdlVG9TdHJlYW1BY3Rpdml0eShub2RlTWVzc2FnZSwgdCwgb3B0aW9ucylcbiAgaWYgKG9wdGlvbnM/LmxvZ1NvdXJjZSkge1xuICAgIGxvZ0hpdGxBcHByb3ZhbENvbnRleHQoYCR7b3B0aW9ucy5sb2dTb3VyY2V9OnJlc29sdmVkYCwge1xuICAgICAgbm9kZU1lc3NhZ2UsXG4gICAgICByZXNvbHZlZEFjdGl2aXR5OiBhY3Rpdml0eSxcbiAgICB9KVxuICB9XG4gIHJldHVybiBhY3Rpdml0eVxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUluaXRpYWxIaXRsU3RyZWFtQWN0aXZpdHkgPSAoXG4gIHQ6IFRyYW5zbGF0ZUZuLFxuICBjb250ZXh0PzogSGl0bEV4ZWN1dGlvbkNvbnRleHQgfCBudWxsLFxuICBvcHRpb25zPzogeyBsb2dTb3VyY2U/OiBzdHJpbmcgfVxuKTogU3RyZWFtQWN0aXZpdHkgPT4ge1xuICBjb25zdCBwZW5kaW5nQWN0aW9ucyA9IHJlc29sdmVQZW5kaW5nQWN0aW9uc0ZvclRocmVhZChjb250ZXh0KVxuICBjb25zdCBkZXRlY3RlZFRvb2xzID0gZGV0ZWN0VG9vbHNGcm9tUGVuZGluZ0FjdGlvbnMocGVuZGluZ0FjdGlvbnMpXG5cbiAgaWYgKG9wdGlvbnM/LmxvZ1NvdXJjZSkge1xuICAgIGxvZ0hpdGxBcHByb3ZhbENvbnRleHQob3B0aW9ucy5sb2dTb3VyY2UsIHtcbiAgICAgIG1lc3NhZ2VJZDogY29udGV4dD8ubWVzc2FnZUlkLFxuICAgICAgbWVzc2FnZVRleHQ6IGNvbnRleHQ/Lm1lc3NhZ2VUZXh0LFxuICAgICAgdGhyZWFkSWRzOiBjb250ZXh0Py50aHJlYWRJZHMsXG4gICAgICBwZW5kaW5nQWN0aW9ucyxcbiAgICAgIGRldGVjdGVkVG9vbHMsXG4gICAgfSlcbiAgfVxuXG4gIGlmIChkZXRlY3RlZFRvb2xzLmxlbmd0aCA+PSAxKSB7XG4gICAgY29uc3QgYWN0aXZpdHkgPSBtYXBIaXRsVG9vbE5hbWVUb1N0cmVhbUFjdGl2aXR5KGRldGVjdGVkVG9vbHNbMF0sIHQsIHsgdXNlUmVzdW1pbmdGYWxsYmFjazogdHJ1ZSB9KVxuICAgIGlmIChvcHRpb25zPy5sb2dTb3VyY2UpIHtcbiAgICAgIGxvZ0hpdGxBcHByb3ZhbENvbnRleHQoYCR7b3B0aW9ucy5sb2dTb3VyY2V9OnJlc29sdmVkYCwge1xuICAgICAgICBkZXRlY3RlZFRvb2xzLFxuICAgICAgICByZXNvbHZlZEFjdGl2aXR5OiBhY3Rpdml0eSxcbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBhY3Rpdml0eVxuICB9XG5cbiAgcmV0dXJuIHsgcGhhc2U6ICdwcm9jZXNzaW5nJywgbWVzc2FnZTogdCgnY2hhdC5wcm9jZXNzaW5nJykgfVxufVxuXG5leHBvcnQgY29uc3QgQUNUSVZJVFlfTUVTU0FHRV9ST1RBVEVfTVMgPSAzMjAwXG5cbmNvbnN0IFJPVEFUQUJMRV9QSEFTRVM6IFN0cmVhbUFjdGl2aXR5UGhhc2VbXSA9IFsnZ2VuZXJhdGluZycsICd0aGlua2luZycsICdzZWFyY2gnLCAnZGVlcF9zZWFyY2gnLCAnYXR0YWNobWVudCddXG5cbmNvbnN0IGdldE1lc3NhZ2VLZXlzRm9yUGhhc2UgPSAocGhhc2U6IFN0cmVhbUFjdGl2aXR5UGhhc2UpOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGwgPT4ge1xuICBzd2l0Y2ggKHBoYXNlKSB7XG4gICAgY2FzZSAnZ2VuZXJhdGluZyc6XG4gICAgICByZXR1cm4gR0VORVJBVElOR19NRVNTQUdFX0tFWVNcbiAgICBjYXNlICd0aGlua2luZyc6XG4gICAgICByZXR1cm4gVEhJTktJTkdfTUVTU0FHRV9LRVlTXG4gICAgY2FzZSAnc2VhcmNoJzpcbiAgICAgIHJldHVybiBTRUFSQ0hfTUVTU0FHRV9LRVlTXG4gICAgY2FzZSAnZGVlcF9zZWFyY2gnOlxuICAgICAgcmV0dXJuIERFRVBfU0VBUkNIX01FU1NBR0VfS0VZU1xuICAgIGNhc2UgJ2F0dGFjaG1lbnQnOlxuICAgICAgcmV0dXJuIEFUVEFDSE1FTlRfTUVTU0FHRV9LRVlTXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldFN0cmVhbUFjdGl2aXR5TWVzc2FnZUF0SW5kZXggPSAocGhhc2U6IFN0cmVhbUFjdGl2aXR5UGhhc2UsIGluZGV4OiBudW1iZXIsIHQ6IFRyYW5zbGF0ZUZuKTogc3RyaW5nID0+IHtcbiAgaWYgKHBoYXNlID09PSAnd3JpdGluZycpIHtcbiAgICByZXR1cm4gdChXUklUSU5HX0FDVElWSVRZX01FU1NBR0VfS0VZKVxuICB9XG5cbiAgY29uc3Qga2V5cyA9IGdldE1lc3NhZ2VLZXlzRm9yUGhhc2UocGhhc2UpXG4gIGlmICgha2V5cz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBjb25zdCBjbGFtcGVkSW5kZXggPSBNYXRoLm1pbihNYXRoLm1heCgwLCBpbmRleCksIGtleXMubGVuZ3RoIC0gMSlcbiAgcmV0dXJuIHQoa2V5c1tjbGFtcGVkSW5kZXhdKVxufVxuXG5leHBvcnQgY29uc3QgZ2V0VGhpbmtpbmdMb2FkaW5nTWVzc2FnZSA9IChpbmRleDogbnVtYmVyLCB0OiBUcmFuc2xhdGVGbik6IHN0cmluZyA9PlxuICBnZXRTdHJlYW1BY3Rpdml0eU1lc3NhZ2VBdEluZGV4KCd0aGlua2luZycsIGluZGV4LCB0KVxuXG5leHBvcnQgY29uc3QgZ2V0R2VuZXJhdGluZ0xvYWRpbmdNZXNzYWdlID0gKGluZGV4OiBudW1iZXIsIHQ6IFRyYW5zbGF0ZUZuKTogc3RyaW5nID0+XG4gIGdldFN0cmVhbUFjdGl2aXR5TWVzc2FnZUF0SW5kZXgoJ2dlbmVyYXRpbmcnLCBpbmRleCwgdClcblxuZXhwb3J0IGNvbnN0IGNhbkFkdmFuY2VTdHJlYW1BY3Rpdml0eU1lc3NhZ2UgPSAocGhhc2U6IFN0cmVhbUFjdGl2aXR5UGhhc2UsIGN1cnJlbnRJbmRleDogbnVtYmVyKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGtleXMgPSBnZXRNZXNzYWdlS2V5c0ZvclBoYXNlKHBoYXNlKVxuICBpZiAoIWtleXMpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gY3VycmVudEluZGV4IDwga2V5cy5sZW5ndGggLSAxXG59XG5cbmV4cG9ydCBjb25zdCBhZHZhbmNlU3RyZWFtQWN0aXZpdHlNZXNzYWdlID0gKFxuICBhY3Rpdml0eTogU3RyZWFtQWN0aXZpdHksXG4gIGN1cnJlbnRJbmRleDogbnVtYmVyLFxuICB0OiBUcmFuc2xhdGVGblxuKTogeyBhY3Rpdml0eTogU3RyZWFtQWN0aXZpdHk7IG5leHRJbmRleDogbnVtYmVyIH0gfCBudWxsID0+IHtcbiAgaWYgKCFjYW5BZHZhbmNlU3RyZWFtQWN0aXZpdHlNZXNzYWdlKGFjdGl2aXR5LnBoYXNlLCBjdXJyZW50SW5kZXgpKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IG5leHRJbmRleCA9IGN1cnJlbnRJbmRleCArIDFcbiAgcmV0dXJuIHtcbiAgICBhY3Rpdml0eToge1xuICAgICAgcGhhc2U6IGFjdGl2aXR5LnBoYXNlLFxuICAgICAgbWVzc2FnZTogZ2V0U3RyZWFtQWN0aXZpdHlNZXNzYWdlQXRJbmRleChhY3Rpdml0eS5waGFzZSwgbmV4dEluZGV4LCB0KSxcbiAgICB9LFxuICAgIG5leHRJbmRleCxcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgY2FuUm90YXRlU3RyZWFtQWN0aXZpdHlQaGFzZSA9IChwaGFzZTogU3RyZWFtQWN0aXZpdHlQaGFzZSk6IGJvb2xlYW4gPT4gUk9UQVRBQkxFX1BIQVNFUy5pbmNsdWRlcyhwaGFzZSlcblxuZXhwb3J0IGNvbnN0IGdldFdyaXRpbmdTdHJlYW1BY3Rpdml0eSA9ICh0OiBUcmFuc2xhdGVGbik6IFN0cmVhbUFjdGl2aXR5ID0+ICh7XG4gIHBoYXNlOiAnd3JpdGluZycsXG4gIG1lc3NhZ2U6IHQoV1JJVElOR19BQ1RJVklUWV9NRVNTQUdFX0tFWSksXG59KVxuXG5leHBvcnQgY29uc3QgZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5ID0gKFxuICB0OiBUcmFuc2xhdGVGbixcbiAgb3B0aW9uczoge1xuICAgIGlzV2ViU2VhcmNoQWN0aXZlPzogYm9vbGVhblxuICAgIGlzRGVlcFNlYXJjaEFjdGl2ZT86IGJvb2xlYW5cbiAgICBoYXNBdHRhY2htZW50cz86IGJvb2xlYW5cbiAgfVxuKTogU3RyZWFtQWN0aXZpdHkgPT4ge1xuICBpZiAob3B0aW9ucy5pc1dlYlNlYXJjaEFjdGl2ZSkge1xuICAgIHJldHVybiB7IHBoYXNlOiAnc2VhcmNoJywgbWVzc2FnZTogdChTRUFSQ0hfTUVTU0FHRV9LRVlTWzBdKSB9XG4gIH1cbiAgaWYgKG9wdGlvbnMuaXNEZWVwU2VhcmNoQWN0aXZlKSB7XG4gICAgcmV0dXJuIHsgcGhhc2U6ICdkZWVwX3NlYXJjaCcsIG1lc3NhZ2U6IHQoREVFUF9TRUFSQ0hfTUVTU0FHRV9LRVlTWzBdKSB9XG4gIH1cbiAgaWYgKG9wdGlvbnMuaGFzQXR0YWNobWVudHMpIHtcbiAgICByZXR1cm4geyBwaGFzZTogJ2F0dGFjaG1lbnQnLCBtZXNzYWdlOiB0KEFUVEFDSE1FTlRfTUVTU0FHRV9LRVlTWzBdKSB9XG4gIH1cbiAgcmV0dXJuIHsgcGhhc2U6ICdnZW5lcmF0aW5nJywgbWVzc2FnZTogdChHRU5FUkFUSU5HX01FU1NBR0VfS0VZU1swXSkgfVxufVxuXG5leHBvcnQgY29uc3QgbWFwTm9kZU1lc3NhZ2VUb1N0cmVhbUFjdGl2aXR5ID0gKFxuICBub2RlTWVzc2FnZTogc3RyaW5nLFxuICB0OiBUcmFuc2xhdGVGbixcbiAgb3B0aW9ucz86IHsgdXNlUmVzdW1pbmdGYWxsYmFjaz86IGJvb2xlYW4gfVxuKTogU3RyZWFtQWN0aXZpdHkgPT4ge1xuICBjb25zdCBub3JtYWxpemVkID0gbm9kZU1lc3NhZ2UudG9Mb3dlckNhc2UoKVxuXG4gIGNvbnN0IGhpdGxUb29sID0gcmVzb2x2ZUhpdGxUb29sRnJvbU5vZGVNZXNzYWdlKG5vZGVNZXNzYWdlKVxuICBpZiAoaGl0bFRvb2wpIHtcbiAgICByZXR1cm4gbWFwSGl0bFRvb2xOYW1lVG9TdHJlYW1BY3Rpdml0eShoaXRsVG9vbCwgdCwgb3B0aW9ucylcbiAgfVxuXG4gIGlmIChcbiAgICBub3JtYWxpemVkLmluY2x1ZGVzKCdyZXNwb25zZV9maWxlX2dlbmVyYXRpb24nKSB8fFxuICAgIG5vcm1hbGl6ZWQuaW5jbHVkZXMoJ2dlbmVyYW5kbyBhcmNoaXZvJykgfHxcbiAgICBub3JtYWxpemVkLmluY2x1ZGVzKCdnZW5lcmF0aW5nIGZpbGUnKVxuICApIHtcbiAgICByZXR1cm4geyBwaGFzZTogJ2FjdGlvbicsIG1lc3NhZ2U6IHQoJ2NoYXQuYWN0aXZpdHkuZ2VuZXJhdGluZ0ZpbGUnKSB9XG4gIH1cbiAgaWYgKFxuICAgIG5vcm1hbGl6ZWQuaW5jbHVkZXMoJ3RhdmlseScpIHx8XG4gICAgbm9ybWFsaXplZC5pbmNsdWRlcygnc2VhcmNoX3dlYicpIHx8XG4gICAgbm9ybWFsaXplZC5pbmNsdWRlcygnYnVzY2FuZG8gZW4gbGEgd2ViJykgfHxcbiAgICBub3JtYWxpemVkLmluY2x1ZGVzKCdzZWFyY2hpbmcgdGhlIHdlYicpXG4gICkge1xuICAgIHJldHVybiB7IHBoYXNlOiAnc2VhcmNoJywgbWVzc2FnZTogdChTRUFSQ0hfTUVTU0FHRV9LRVlTWzBdKSB9XG4gIH1cblxuICBjb25zdCB0cmltbWVkTWVzc2FnZSA9IG5vZGVNZXNzYWdlLnRyaW0oKVxuICBpZiAodHJpbW1lZE1lc3NhZ2UgJiYgIWlzR2VuZXJpY1Jlc3VtZU5vZGVNZXNzYWdlKHRyaW1tZWRNZXNzYWdlKSkge1xuICAgIHJldHVybiB7IHBoYXNlOiAnYWN0aW9uJywgbWVzc2FnZTogdHJpbW1lZE1lc3NhZ2UgfVxuICB9XG5cbiAgaWYgKGlzR2VuZXJpY1Jlc3VtZU5vZGVNZXNzYWdlKHRyaW1tZWRNZXNzYWdlKSB8fCBvcHRpb25zPy51c2VSZXN1bWluZ0ZhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHsgcGhhc2U6ICdhY3Rpb24nLCBtZXNzYWdlOiB0KCdjaGF0LmFjdGl2aXR5LnJlc3VtaW5nQWN0aW9uJykgfVxuICB9XG4gIHJldHVybiB7IHBoYXNlOiAnYWN0aW9uJywgbWVzc2FnZTogdCgnY2hhdC5leGVjdXRpbmdBY3Rpb24nKSB9XG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU3RyZWFtTG9hZGluZ0Rpc3BsYXkgPSAocGFyYW1zOiB7XG4gIHN0cmVhbUFjdGl2aXR5OiBTdHJlYW1BY3Rpdml0eSB8IG51bGxcbiAgbG9hZGluZ01lc3NhZ2U6IHN0cmluZyB8IG51bGxcbiAgYWN0aXZlTG9hZGluZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgd2FpdGluZ1Jlc3BvbnNlOiBib29sZWFuXG4gIGlzV2ViU2VhcmNoQWN0aXZlOiBib29sZWFuXG4gIGlzRGVlcFNlYXJjaEFjdGl2ZTogYm9vbGVhblxuICBoYXNBdHRhY2htZW50czogYm9vbGVhblxuICB0OiBUcmFuc2xhdGVGblxufSk6IFN0cmVhbUFjdGl2aXR5IHwgbnVsbCA9PiB7XG4gIGlmIChwYXJhbXMuc3RyZWFtQWN0aXZpdHkpIHtcbiAgICByZXR1cm4gcGFyYW1zLnN0cmVhbUFjdGl2aXR5XG4gIH1cblxuICBjb25zdCBhY3RpdmVLZXlzID0gT2JqZWN0LmtleXMocGFyYW1zLmFjdGl2ZUxvYWRpbmdzKVxuICBpZiAoYWN0aXZlS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZmlyc3RLZXkgPSBhY3RpdmVLZXlzWzBdXG4gICAgY29uc3QgcmF3ID0gcGFyYW1zLmFjdGl2ZUxvYWRpbmdzW2ZpcnN0S2V5XVxuICAgIGlmIChyYXcgJiYgcmF3ICE9PSBwYXJhbXMudCgnY2hhdC5wcm9jZXNzaW5nJykpIHtcbiAgICAgIGNvbnN0IGhpdGxUb29sID0gcmVzb2x2ZUhpdGxUb29sRnJvbU5vZGVNZXNzYWdlKHJhdylcbiAgICAgIGlmIChoaXRsVG9vbCkge1xuICAgICAgICByZXR1cm4gbWFwSGl0bFRvb2xOYW1lVG9TdHJlYW1BY3Rpdml0eShoaXRsVG9vbCwgcGFyYW1zLnQpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyaW1tZWQgPSByYXcudHJpbSgpXG4gICAgICBpZiAodHJpbW1lZCAmJiAhaXNHZW5lcmljUmVzdW1lTm9kZU1lc3NhZ2UodHJpbW1lZCkpIHtcbiAgICAgICAgcmV0dXJuIHsgcGhhc2U6ICdhY3Rpb24nLCBtZXNzYWdlOiB0cmltbWVkIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1hcE5vZGVNZXNzYWdlVG9TdHJlYW1BY3Rpdml0eShyYXcsIHBhcmFtcy50LCB7IHVzZVJlc3VtaW5nRmFsbGJhY2s6IHRydWUgfSlcbiAgICB9XG4gICAgcmV0dXJuIHsgcGhhc2U6ICdwcm9jZXNzaW5nJywgbWVzc2FnZTogcGFyYW1zLnQoJ2NoYXQucHJvY2Vzc2luZycpIH1cbiAgfVxuXG4gIGlmIChwYXJhbXMubG9hZGluZ01lc3NhZ2UpIHtcbiAgICBpZiAoXG4gICAgICBwYXJhbXMubG9hZGluZ01lc3NhZ2UgPT09IHBhcmFtcy50KCdjaGF0LndyaXRpbmcnKSB8fFxuICAgICAgcGFyYW1zLmxvYWRpbmdNZXNzYWdlID09PSBwYXJhbXMudChXUklUSU5HX0FDVElWSVRZX01FU1NBR0VfS0VZKVxuICAgICkge1xuICAgICAgcmV0dXJuIGdldFdyaXRpbmdTdHJlYW1BY3Rpdml0eShwYXJhbXMudClcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5sb2FkaW5nTWVzc2FnZSA9PT0gcGFyYW1zLnQoJ2NoYXQuZ2VuZXJhdGluZycpKSB7XG4gICAgICByZXR1cm4geyBwaGFzZTogJ2dlbmVyYXRpbmcnLCBtZXNzYWdlOiBwYXJhbXMubG9hZGluZ01lc3NhZ2UgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBwYXJhbXMubG9hZGluZ01lc3NhZ2UgPT09IHBhcmFtcy50KCdjaGF0LmdlbmVyYXRpbmdXZWJTZWFyY2gnKSB8fFxuICAgICAgcGFyYW1zLmxvYWRpbmdNZXNzYWdlID09PSBwYXJhbXMudCgnY2hhdC5nZW5lcmF0aW5nRGVlcFNlYXJjaCcpIHx8XG4gICAgICBwYXJhbXMubG9hZGluZ01lc3NhZ2UgPT09IHBhcmFtcy50KCdjaGF0LmdlbmVyYXRpbmdBdHRhY2htZW50JylcbiAgICApIHtcbiAgICAgIHJldHVybiBnZXRJbml0aWFsU3RyZWFtQWN0aXZpdHkocGFyYW1zLnQsIHtcbiAgICAgICAgaXNXZWJTZWFyY2hBY3RpdmU6IHBhcmFtcy5sb2FkaW5nTWVzc2FnZSA9PT0gcGFyYW1zLnQoJ2NoYXQuZ2VuZXJhdGluZ1dlYlNlYXJjaCcpLFxuICAgICAgICBpc0RlZXBTZWFyY2hBY3RpdmU6IHBhcmFtcy5sb2FkaW5nTWVzc2FnZSA9PT0gcGFyYW1zLnQoJ2NoYXQuZ2VuZXJhdGluZ0RlZXBTZWFyY2gnKSxcbiAgICAgICAgaGFzQXR0YWNobWVudHM6IHBhcmFtcy5sb2FkaW5nTWVzc2FnZSA9PT0gcGFyYW1zLnQoJ2NoYXQuZ2VuZXJhdGluZ0F0dGFjaG1lbnQnKSxcbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiB7IHBoYXNlOiAnYWN0aW9uJywgbWVzc2FnZTogcGFyYW1zLmxvYWRpbmdNZXNzYWdlIH1cbiAgfVxuXG4gIGlmIChwYXJhbXMud2FpdGluZ1Jlc3BvbnNlKSB7XG4gICAgcmV0dXJuIGdldEluaXRpYWxTdHJlYW1BY3Rpdml0eShwYXJhbXMudCwge1xuICAgICAgaXNXZWJTZWFyY2hBY3RpdmU6IHBhcmFtcy5pc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICAgIGlzRGVlcFNlYXJjaEFjdGl2ZTogcGFyYW1zLmlzRGVlcFNlYXJjaEFjdGl2ZSxcbiAgICAgIGhhc0F0dGFjaG1lbnRzOiBwYXJhbXMuaGFzQXR0YWNobWVudHMsXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkID0gKG1lc3NhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PlxuICB0eXBlb2YgbWVzc2FnZUlkID09PSAnc3RyaW5nJyAmJiBtZXNzYWdlSWQuaW5jbHVkZXMoJy1zdHJlYW1pbmcnKVxuIl0sIm1hcHBpbmdzIjoiO0FBRUEsU0FBU0EscUJBQXFCLFFBQVEsaUJBQWlCO0FBQ3ZELFNBQVNDLHNCQUFzQixRQUFRLG1CQUFtQjtBQUkxRCxJQUFNQyxxQkFBcUIsR0FBRyxDQUM1QixrQ0FBa0MsRUFDbEMsa0NBQWtDLEVBQ2xDLGlDQUFpQyxDQUN6QjtBQUVWLElBQU1DLHVCQUF1QixHQUFHLENBQzlCLG9DQUFvQyxFQUNwQyxzQ0FBc0MsRUFDdEMsc0NBQXNDLENBQzlCO0FBRVYsSUFBTUMsbUJBQW1CLEdBQUcsQ0FBQywrQkFBK0IsRUFBRSxrQ0FBa0MsQ0FBVTtBQUUxRyxJQUFNQyx3QkFBd0IsR0FBRyxDQUMvQixvQ0FBb0MsRUFDcEMsd0NBQXdDLENBQ2hDO0FBRVYsSUFBTUMsdUJBQXVCLEdBQUcsQ0FBQyxrQ0FBa0MsRUFBRSxxQ0FBcUMsQ0FBVTtBQUVwSCxPQUFPLElBQU1DLDRCQUE0QixHQUFHLGlDQUEwQzs7QUFFdEY7QUFDQSxJQUFNQyx1QkFBK0MsR0FBRztFQUN0REMsV0FBVyxFQUFFLDRCQUE0QjtFQUN6Q0MsVUFBVSxFQUFFLDRCQUE0QjtFQUN4Q0Msa0JBQWtCLEVBQUUsa0NBQWtDO0VBQ3REQyxZQUFZLEVBQUUsNkJBQTZCO0VBQzNDQyxVQUFVLEVBQUUsNEJBQTRCO0VBQ3hDQyxTQUFTLEVBQUUsMkJBQTJCO0VBQ3RDQyxnQkFBZ0IsRUFBRSxpQ0FBaUM7RUFDbkRDLFdBQVcsRUFBRSw0QkFBNEI7RUFDekNDLGtCQUFrQixFQUFFLGtDQUFrQztFQUN0REMsV0FBVyxFQUFFLDZCQUE2QjtFQUMxQ0MsYUFBYSxFQUFFLCtCQUErQjtFQUM5Q0MsaUJBQWlCLEVBQUUsOEJBQThCO0VBQ2pEQyxnQkFBZ0IsRUFBRSxnQ0FBZ0M7RUFDbERDLHNCQUFzQixFQUFFLHNDQUFzQztFQUM5REMsa0JBQWtCLEVBQUUsbUNBQW1DO0VBQ3ZEQyxXQUFXLEVBQUUsNEJBQTRCO0VBQ3pDQyxnQkFBZ0IsRUFBRSxpQ0FBaUM7RUFDbkRDLG1CQUFtQixFQUFFLDZCQUE2QjtFQUNsREMsc0JBQXNCLEVBQUUsc0NBQXNDO0VBQzlEQyxpQkFBaUIsRUFBRSxrQ0FBa0M7RUFDckRDLHFCQUFxQixFQUFFLHFDQUFxQztFQUM1REMsZ0JBQWdCLEVBQUUsZ0NBQWdDO0VBQ2xEQyxpQkFBaUIsRUFBRSw2QkFBNkI7RUFDaERDLGlCQUFpQixFQUFFLHdDQUF3QztFQUMzREMsYUFBYSxFQUFFLDhCQUE4QjtFQUM3Q0MsYUFBYSxFQUFFO0FBQ2pCLENBQUM7QUFFRCxJQUFNQyw4QkFBOEIsR0FBR0MsTUFBTSxDQUFDQyxJQUFJLENBQUM3Qix1QkFBdUIsQ0FBQyxDQUFDOEIsSUFBSSxDQUFDLFVBQUNDLENBQUMsRUFBRUMsQ0FBQztFQUFBLE9BQUtBLENBQUMsQ0FBQ0MsTUFBTSxHQUFHRixDQUFDLENBQUNFLE1BQU07QUFBQSxFQUFDOztBQUUvRztBQUNBLElBQU1DLDBCQUEwQixHQUFHLFNBQTdCQSwwQkFBMEJBLENBQUlDLE9BQWUsRUFBYztFQUMvRCxJQUFNQyxVQUFVLEdBQUdELE9BQU8sQ0FBQ0UsSUFBSSxDQUFDLENBQUMsQ0FBQ0MsV0FBVyxDQUFDLENBQUM7RUFDL0MsT0FDRUYsVUFBVSxDQUFDRyxVQUFVLENBQUMsNEJBQTRCLENBQUMsSUFDbkRILFVBQVUsQ0FBQ0csVUFBVSxDQUFDLDJCQUEyQixDQUFDLElBQ2xESCxVQUFVLENBQUNHLFVBQVUsQ0FBQywwQkFBMEIsQ0FBQztBQUVyRCxDQUFDO0FBRUQsT0FBTyxJQUFNQywrQkFBK0IsR0FBRyxTQUFsQ0EsK0JBQStCQSxDQUMxQ0MsUUFBZ0IsRUFDaEJDLENBQWMsRUFDZEMsT0FBMkMsRUFDeEI7RUFDbkIsSUFBTVAsVUFBVSxHQUFHNUMscUJBQXFCLENBQUNpRCxRQUFRLENBQUM7RUFDbEQsSUFBTUcsR0FBRyxHQUFHNUMsdUJBQXVCLENBQUNvQyxVQUFVLENBQUM7RUFDL0MsSUFBSVEsR0FBRyxFQUFFO0lBQ1AsT0FBTztNQUFFQyxLQUFLLEVBQUUsUUFBUTtNQUFFVixPQUFPLEVBQUVPLENBQUMsQ0FBQ0UsR0FBRztJQUFFLENBQUM7RUFDN0M7RUFDQSxJQUFJRCxPQUFPLGFBQVBBLE9BQU8sZUFBUEEsT0FBTyxDQUFFRyxtQkFBbUIsRUFBRTtJQUNoQyxPQUFPO01BQUVELEtBQUssRUFBRSxRQUFRO01BQUVWLE9BQU8sRUFBRU8sQ0FBQyxDQUFDLDhCQUE4QjtJQUFFLENBQUM7RUFDeEU7RUFDQSxPQUFPO0lBQUVHLEtBQUssRUFBRSxRQUFRO0lBQUVWLE9BQU8sRUFBRU8sQ0FBQyxDQUFDLHNCQUFzQjtFQUFFLENBQUM7QUFDaEUsQ0FBQztBQUVELElBQU1LLDhCQUE4QixHQUFHLFNBQWpDQSw4QkFBOEJBLENBQUlDLFdBQW1CLEVBQW9CO0VBQzdFLElBQU1aLFVBQVUsR0FBR1ksV0FBVyxDQUFDVixXQUFXLENBQUMsQ0FBQyxDQUFDRCxJQUFJLENBQUMsQ0FBQztFQUNuRCxJQUFJLENBQUNELFVBQVUsRUFBRSxPQUFPLElBQUk7RUFFNUIsSUFBSXBDLHVCQUF1QixDQUFDb0MsVUFBVSxDQUFDLEVBQUU7SUFDdkMsT0FBT0EsVUFBVTtFQUNuQjtFQUVBLElBQU1hLFVBQVUsR0FBR3pELHFCQUFxQixDQUFDNEMsVUFBVSxDQUFDYyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ3pFLElBQUlsRCx1QkFBdUIsQ0FBQ2lELFVBQVUsQ0FBQyxFQUFFO0lBQ3ZDLE9BQU9BLFVBQVU7RUFDbkI7RUFFQSxJQUFNRSxXQUFXLEdBQUd4Qiw4QkFBOEIsQ0FBQ3lCLElBQUksQ0FBQyxVQUFBWCxRQUFRO0lBQUEsT0FBSUwsVUFBVSxDQUFDaUIsUUFBUSxDQUFDWixRQUFRLENBQUM7RUFBQSxFQUFDO0VBQ2xHLE9BQU9VLFdBQVcsYUFBWEEsV0FBVyxjQUFYQSxXQUFXLEdBQUksSUFBSTtBQUM1QixDQUFDO0FBVUQsSUFBTUcsOEJBQThCLEdBQUcsU0FBakNBLDhCQUE4QkEsQ0FDbENDLE9BQWdELEVBQ2hEQyxRQUFpQixFQUNHO0VBQUEsSUFBQUMsSUFBQSxFQUFBQyxxQkFBQSxFQUFBQyxpQkFBQSxFQUFBQyxrQkFBQTtFQUNwQixJQUFNQyxPQUFPLElBQUFKLElBQUEsSUFBQUMscUJBQUEsR0FBR0gsT0FBTyxhQUFQQSxPQUFPLHVCQUFQQSxPQUFPLENBQUVPLGNBQWMsY0FBQUoscUJBQUEsY0FBQUEscUJBQUEsR0FBSUgsT0FBTyxhQUFQQSxPQUFPLGdCQUFBSSxpQkFBQSxHQUFQSixPQUFPLENBQUVRLFFBQVEsY0FBQUosaUJBQUEsdUJBQWpCQSxpQkFBQSxDQUFtQkssZUFBZSxjQUFBUCxJQUFBLGNBQUFBLElBQUEsR0FBSSxFQUFFO0VBQ25GLElBQUksQ0FBQ0ksT0FBTyxDQUFDNUIsTUFBTSxFQUFFLE9BQU8sRUFBRTtFQUU5QixJQUFJdUIsUUFBUSxFQUFFO0lBQ1osSUFBTVMsU0FBUyxHQUFHSixPQUFPLENBQUNLLE1BQU0sQ0FBQyxVQUFBQyxNQUFNO01BQUEsT0FBSUEsTUFBTSxDQUFDQyxTQUFTLEtBQUtaLFFBQVE7SUFBQSxFQUFDO0lBQ3pFLElBQUlTLFNBQVMsQ0FBQ2hDLE1BQU0sRUFBRSxPQUFPZ0MsU0FBUztFQUN4QztFQUVBLElBQUlWLE9BQU8sYUFBUEEsT0FBTyxnQkFBQUssa0JBQUEsR0FBUEwsT0FBTyxDQUFFYyxTQUFTLGNBQUFULGtCQUFBLGVBQWxCQSxrQkFBQSxDQUFvQjNCLE1BQU0sRUFBRTtJQUM5QixPQUFPNEIsT0FBTyxDQUFDSyxNQUFNLENBQUMsVUFBQUMsTUFBTTtNQUFBLElBQUFHLG1CQUFBO01BQUEsUUFBQUEsbUJBQUEsR0FBSWYsT0FBTyxDQUFDYyxTQUFTLGNBQUFDLG1CQUFBLHVCQUFqQkEsbUJBQUEsQ0FBbUJqQixRQUFRLENBQUNjLE1BQU0sQ0FBQ0MsU0FBUyxDQUFDO0lBQUEsRUFBQztFQUNoRjtFQUVBLE9BQU9QLE9BQU87QUFDaEIsQ0FBQztBQUVELElBQU1VLDZCQUE2QixHQUFHLFNBQWhDQSw2QkFBNkJBLENBQUlDLE9BQXdCO0VBQUEsT0FBQUMsa0JBQUEsQ0FDMUQsSUFBSUMsR0FBRyxDQUFDRixPQUFPLENBQUNHLEdBQUcsQ0FBQyxVQUFBUixNQUFNO0lBQUEsT0FBSTNFLHFCQUFxQixDQUFDMkUsTUFBTSxDQUFDUyxTQUFTLENBQUM7RUFBQSxFQUFDLENBQUNWLE1BQU0sQ0FBQ1csT0FBTyxDQUFDLENBQUM7QUFBQSxDQUMzRjs7QUFFRDtBQUNBLE9BQU8sSUFBTUMsNkJBQTZCLEdBQUcsU0FBaENBLDZCQUE2QkEsQ0FDeEM5QixXQUFtQixFQUNuQk4sQ0FBYyxFQUNkYSxPQUFxQyxFQUNyQ0MsUUFBaUIsRUFDakJiLE9BQStELEVBQzVDO0VBQ25CLElBQU1vQyxnQkFBZ0IsR0FBR3pCLDhCQUE4QixDQUFDQyxPQUFPLEVBQUVDLFFBQVEsQ0FBQztFQUMxRSxJQUFNd0IsYUFBYSxHQUFHVCw2QkFBNkIsQ0FBQ1EsZ0JBQWdCLENBQUM7RUFFckUsSUFBSXBDLE9BQU8sYUFBUEEsT0FBTyxlQUFQQSxPQUFPLENBQUVzQyxTQUFTLEVBQUU7SUFDdEJ4RixzQkFBc0IsQ0FBQ2tELE9BQU8sQ0FBQ3NDLFNBQVMsRUFBRTtNQUN4Q0MsU0FBUyxFQUFFM0IsT0FBTyxhQUFQQSxPQUFPLHVCQUFQQSxPQUFPLENBQUUyQixTQUFTO01BQzdCQyxXQUFXLEVBQUU1QixPQUFPLGFBQVBBLE9BQU8sdUJBQVBBLE9BQU8sQ0FBRTRCLFdBQVc7TUFDakMzQixRQUFRLEVBQVJBLFFBQVE7TUFDUmEsU0FBUyxFQUFFZCxPQUFPLGFBQVBBLE9BQU8sdUJBQVBBLE9BQU8sQ0FBRWMsU0FBUztNQUM3QnJCLFdBQVcsRUFBWEEsV0FBVztNQUNYYyxjQUFjLEVBQUVpQixnQkFBZ0I7TUFDaENDLGFBQWEsRUFBYkE7SUFDRixDQUFDLENBQUM7RUFDSjtFQUVBLElBQU1JLGtCQUFrQixHQUFHcEMsV0FBVyxDQUFDWCxJQUFJLENBQUMsQ0FBQztFQUM3QyxJQUFNZ0QsdUJBQXVCLEdBQzNCRCxrQkFBa0IsSUFBSSxDQUFDbEQsMEJBQTBCLENBQUNrRCxrQkFBa0IsQ0FBQyxHQUNqRTtJQUFFdkMsS0FBSyxFQUFFLFFBQWlCO0lBQUVWLE9BQU8sRUFBRWlEO0VBQW1CLENBQUMsR0FDekQsSUFBSTtFQUVWLElBQU1FLGFBQWEsR0FBRyxTQUFoQkEsYUFBYUEsQ0FBSUMsUUFBd0IsRUFBSztJQUNsRCxJQUFJNUMsT0FBTyxhQUFQQSxPQUFPLGVBQVBBLE9BQU8sQ0FBRXNDLFNBQVMsRUFBRTtNQUN0QnhGLHNCQUFzQixJQUFBK0YsTUFBQSxDQUFJN0MsT0FBTyxDQUFDc0MsU0FBUyxnQkFBYTtRQUN0REQsYUFBYSxFQUFiQSxhQUFhO1FBQ2JTLGdCQUFnQixFQUFFRjtNQUNwQixDQUFDLENBQUM7SUFDSjtJQUNBLE9BQU9BLFFBQVE7RUFDakIsQ0FBQztFQUVELElBQUlQLGFBQWEsQ0FBQy9DLE1BQU0sSUFBSSxDQUFDLEVBQUU7SUFDN0IsSUFBSW9ELHVCQUF1QixFQUFFO01BQzNCLE9BQU9DLGFBQWEsQ0FBQ0QsdUJBQXVCLENBQUM7SUFDL0M7SUFDQSxPQUFPQyxhQUFhLENBQUM5QywrQkFBK0IsQ0FBQ3dDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRXRDLENBQUMsRUFBRUMsT0FBTyxDQUFDLENBQUM7RUFDckY7RUFFQSxJQUFNNEMsUUFBUSxHQUFHRyw4QkFBOEIsQ0FBQzFDLFdBQVcsRUFBRU4sQ0FBQyxFQUFFQyxPQUFPLENBQUM7RUFDeEUsSUFBSUEsT0FBTyxhQUFQQSxPQUFPLGVBQVBBLE9BQU8sQ0FBRXNDLFNBQVMsRUFBRTtJQUN0QnhGLHNCQUFzQixJQUFBK0YsTUFBQSxDQUFJN0MsT0FBTyxDQUFDc0MsU0FBUyxnQkFBYTtNQUN0RGpDLFdBQVcsRUFBWEEsV0FBVztNQUNYeUMsZ0JBQWdCLEVBQUVGO0lBQ3BCLENBQUMsQ0FBQztFQUNKO0VBQ0EsT0FBT0EsUUFBUTtBQUNqQixDQUFDO0FBRUQsT0FBTyxJQUFNSSxnQ0FBZ0MsR0FBRyxTQUFuQ0EsZ0NBQWdDQSxDQUMzQ2pELENBQWMsRUFDZGEsT0FBcUMsRUFDckNaLE9BQWdDLEVBQ2I7RUFDbkIsSUFBTW1CLGNBQWMsR0FBR1IsOEJBQThCLENBQUNDLE9BQU8sQ0FBQztFQUM5RCxJQUFNeUIsYUFBYSxHQUFHVCw2QkFBNkIsQ0FBQ1QsY0FBYyxDQUFDO0VBRW5FLElBQUluQixPQUFPLGFBQVBBLE9BQU8sZUFBUEEsT0FBTyxDQUFFc0MsU0FBUyxFQUFFO0lBQ3RCeEYsc0JBQXNCLENBQUNrRCxPQUFPLENBQUNzQyxTQUFTLEVBQUU7TUFDeENDLFNBQVMsRUFBRTNCLE9BQU8sYUFBUEEsT0FBTyx1QkFBUEEsT0FBTyxDQUFFMkIsU0FBUztNQUM3QkMsV0FBVyxFQUFFNUIsT0FBTyxhQUFQQSxPQUFPLHVCQUFQQSxPQUFPLENBQUU0QixXQUFXO01BQ2pDZCxTQUFTLEVBQUVkLE9BQU8sYUFBUEEsT0FBTyx1QkFBUEEsT0FBTyxDQUFFYyxTQUFTO01BQzdCUCxjQUFjLEVBQWRBLGNBQWM7TUFDZGtCLGFBQWEsRUFBYkE7SUFDRixDQUFDLENBQUM7RUFDSjtFQUVBLElBQUlBLGFBQWEsQ0FBQy9DLE1BQU0sSUFBSSxDQUFDLEVBQUU7SUFDN0IsSUFBTXNELFFBQVEsR0FBRy9DLCtCQUErQixDQUFDd0MsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFdEMsQ0FBQyxFQUFFO01BQUVJLG1CQUFtQixFQUFFO0lBQUssQ0FBQyxDQUFDO0lBQ3BHLElBQUlILE9BQU8sYUFBUEEsT0FBTyxlQUFQQSxPQUFPLENBQUVzQyxTQUFTLEVBQUU7TUFDdEJ4RixzQkFBc0IsSUFBQStGLE1BQUEsQ0FBSTdDLE9BQU8sQ0FBQ3NDLFNBQVMsZ0JBQWE7UUFDdERELGFBQWEsRUFBYkEsYUFBYTtRQUNiUyxnQkFBZ0IsRUFBRUY7TUFDcEIsQ0FBQyxDQUFDO0lBQ0o7SUFDQSxPQUFPQSxRQUFRO0VBQ2pCO0VBRUEsT0FBTztJQUFFMUMsS0FBSyxFQUFFLFlBQVk7SUFBRVYsT0FBTyxFQUFFTyxDQUFDLENBQUMsaUJBQWlCO0VBQUUsQ0FBQztBQUMvRCxDQUFDO0FBRUQsT0FBTyxJQUFNa0QsMEJBQTBCLEdBQUcsSUFBSTtBQUU5QyxJQUFNQyxnQkFBdUMsR0FBRyxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxZQUFZLENBQUM7QUFFakgsSUFBTUMsc0JBQXNCLEdBQUcsU0FBekJBLHNCQUFzQkEsQ0FBSWpELEtBQTBCLEVBQStCO0VBQ3ZGLFFBQVFBLEtBQUs7SUFDWCxLQUFLLFlBQVk7TUFDZixPQUFPbEQsdUJBQXVCO0lBQ2hDLEtBQUssVUFBVTtNQUNiLE9BQU9ELHFCQUFxQjtJQUM5QixLQUFLLFFBQVE7TUFDWCxPQUFPRSxtQkFBbUI7SUFDNUIsS0FBSyxhQUFhO01BQ2hCLE9BQU9DLHdCQUF3QjtJQUNqQyxLQUFLLFlBQVk7TUFDZixPQUFPQyx1QkFBdUI7SUFDaEM7TUFDRSxPQUFPLElBQUk7RUFDZjtBQUNGLENBQUM7QUFFRCxPQUFPLElBQU1pRywrQkFBK0IsR0FBRyxTQUFsQ0EsK0JBQStCQSxDQUFJbEQsS0FBMEIsRUFBRW1ELEtBQWEsRUFBRXRELENBQWMsRUFBYTtFQUNwSCxJQUFJRyxLQUFLLEtBQUssU0FBUyxFQUFFO0lBQ3ZCLE9BQU9ILENBQUMsQ0FBQzNDLDRCQUE0QixDQUFDO0VBQ3hDO0VBRUEsSUFBTThCLElBQUksR0FBR2lFLHNCQUFzQixDQUFDakQsS0FBSyxDQUFDO0VBQzFDLElBQUksRUFBQ2hCLElBQUksYUFBSkEsSUFBSSxlQUFKQSxJQUFJLENBQUVJLE1BQU0sR0FBRTtJQUNqQixPQUFPLEVBQUU7RUFDWDtFQUVBLElBQU1nRSxZQUFZLEdBQUdDLElBQUksQ0FBQ0MsR0FBRyxDQUFDRCxJQUFJLENBQUNFLEdBQUcsQ0FBQyxDQUFDLEVBQUVKLEtBQUssQ0FBQyxFQUFFbkUsSUFBSSxDQUFDSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0VBQ2xFLE9BQU9TLENBQUMsQ0FBQ2IsSUFBSSxDQUFDb0UsWUFBWSxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQUVELE9BQU8sSUFBTUkseUJBQXlCLEdBQUcsU0FBNUJBLHlCQUF5QkEsQ0FBSUwsS0FBYSxFQUFFdEQsQ0FBYztFQUFBLE9BQ3JFcUQsK0JBQStCLENBQUMsVUFBVSxFQUFFQyxLQUFLLEVBQUV0RCxDQUFDLENBQUM7QUFBQTtBQUV2RCxPQUFPLElBQU00RCwyQkFBMkIsR0FBRyxTQUE5QkEsMkJBQTJCQSxDQUFJTixLQUFhLEVBQUV0RCxDQUFjO0VBQUEsT0FDdkVxRCwrQkFBK0IsQ0FBQyxZQUFZLEVBQUVDLEtBQUssRUFBRXRELENBQUMsQ0FBQztBQUFBO0FBRXpELE9BQU8sSUFBTTZELCtCQUErQixHQUFHLFNBQWxDQSwrQkFBK0JBLENBQUkxRCxLQUEwQixFQUFFMkQsWUFBb0IsRUFBYztFQUM1RyxJQUFNM0UsSUFBSSxHQUFHaUUsc0JBQXNCLENBQUNqRCxLQUFLLENBQUM7RUFDMUMsSUFBSSxDQUFDaEIsSUFBSSxFQUFFO0lBQ1QsT0FBTyxLQUFLO0VBQ2Q7RUFDQSxPQUFPMkUsWUFBWSxHQUFHM0UsSUFBSSxDQUFDSSxNQUFNLEdBQUcsQ0FBQztBQUN2QyxDQUFDO0FBRUQsT0FBTyxJQUFNd0UsNEJBQTRCLEdBQUcsU0FBL0JBLDRCQUE0QkEsQ0FDdkNsQixRQUF3QixFQUN4QmlCLFlBQW9CLEVBQ3BCOUQsQ0FBYyxFQUM2QztFQUMzRCxJQUFJLENBQUM2RCwrQkFBK0IsQ0FBQ2hCLFFBQVEsQ0FBQzFDLEtBQUssRUFBRTJELFlBQVksQ0FBQyxFQUFFO0lBQ2xFLE9BQU8sSUFBSTtFQUNiO0VBRUEsSUFBTUUsU0FBUyxHQUFHRixZQUFZLEdBQUcsQ0FBQztFQUNsQyxPQUFPO0lBQ0xqQixRQUFRLEVBQUU7TUFDUjFDLEtBQUssRUFBRTBDLFFBQVEsQ0FBQzFDLEtBQUs7TUFDckJWLE9BQU8sRUFBRTRELCtCQUErQixDQUFDUixRQUFRLENBQUMxQyxLQUFLLEVBQUU2RCxTQUFTLEVBQUVoRSxDQUFDO0lBQ3ZFLENBQUM7SUFDRGdFLFNBQVMsRUFBVEE7RUFDRixDQUFDO0FBQ0gsQ0FBQztBQUVELE9BQU8sSUFBTUMsNEJBQTRCLEdBQUcsU0FBL0JBLDRCQUE0QkEsQ0FBSTlELEtBQTBCO0VBQUEsT0FBY2dELGdCQUFnQixDQUFDeEMsUUFBUSxDQUFDUixLQUFLLENBQUM7QUFBQTtBQUVySCxPQUFPLElBQU0rRCx3QkFBd0IsR0FBRyxTQUEzQkEsd0JBQXdCQSxDQUFJbEUsQ0FBYztFQUFBLE9BQXNCO0lBQzNFRyxLQUFLLEVBQUUsU0FBUztJQUNoQlYsT0FBTyxFQUFFTyxDQUFDLENBQUMzQyw0QkFBNEI7RUFDekMsQ0FBQztBQUFBLENBQUM7QUFFRixPQUFPLElBQU04Ryx3QkFBd0IsR0FBRyxTQUEzQkEsd0JBQXdCQSxDQUNuQ25FLENBQWMsRUFDZEMsT0FJQyxFQUNrQjtFQUNuQixJQUFJQSxPQUFPLENBQUNtRSxpQkFBaUIsRUFBRTtJQUM3QixPQUFPO01BQUVqRSxLQUFLLEVBQUUsUUFBUTtNQUFFVixPQUFPLEVBQUVPLENBQUMsQ0FBQzlDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUFFLENBQUM7RUFDaEU7RUFDQSxJQUFJK0MsT0FBTyxDQUFDb0Usa0JBQWtCLEVBQUU7SUFDOUIsT0FBTztNQUFFbEUsS0FBSyxFQUFFLGFBQWE7TUFBRVYsT0FBTyxFQUFFTyxDQUFDLENBQUM3Qyx3QkFBd0IsQ0FBQyxDQUFDLENBQUM7SUFBRSxDQUFDO0VBQzFFO0VBQ0EsSUFBSThDLE9BQU8sQ0FBQ3FFLGNBQWMsRUFBRTtJQUMxQixPQUFPO01BQUVuRSxLQUFLLEVBQUUsWUFBWTtNQUFFVixPQUFPLEVBQUVPLENBQUMsQ0FBQzVDLHVCQUF1QixDQUFDLENBQUMsQ0FBQztJQUFFLENBQUM7RUFDeEU7RUFDQSxPQUFPO0lBQUUrQyxLQUFLLEVBQUUsWUFBWTtJQUFFVixPQUFPLEVBQUVPLENBQUMsQ0FBQy9DLHVCQUF1QixDQUFDLENBQUMsQ0FBQztFQUFFLENBQUM7QUFDeEUsQ0FBQztBQUVELE9BQU8sSUFBTStGLDhCQUE4QixHQUFHLFNBQWpDQSw4QkFBOEJBLENBQ3pDMUMsV0FBbUIsRUFDbkJOLENBQWMsRUFDZEMsT0FBMkMsRUFDeEI7RUFDbkIsSUFBTVAsVUFBVSxHQUFHWSxXQUFXLENBQUNWLFdBQVcsQ0FBQyxDQUFDO0VBRTVDLElBQU0yRSxRQUFRLEdBQUdsRSw4QkFBOEIsQ0FBQ0MsV0FBVyxDQUFDO0VBQzVELElBQUlpRSxRQUFRLEVBQUU7SUFDWixPQUFPekUsK0JBQStCLENBQUN5RSxRQUFRLEVBQUV2RSxDQUFDLEVBQUVDLE9BQU8sQ0FBQztFQUM5RDtFQUVBLElBQ0VQLFVBQVUsQ0FBQ2lCLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxJQUMvQ2pCLFVBQVUsQ0FBQ2lCLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxJQUN4Q2pCLFVBQVUsQ0FBQ2lCLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUN0QztJQUNBLE9BQU87TUFBRVIsS0FBSyxFQUFFLFFBQVE7TUFBRVYsT0FBTyxFQUFFTyxDQUFDLENBQUMsOEJBQThCO0lBQUUsQ0FBQztFQUN4RTtFQUNBLElBQ0VOLFVBQVUsQ0FBQ2lCLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFDN0JqQixVQUFVLENBQUNpQixRQUFRLENBQUMsWUFBWSxDQUFDLElBQ2pDakIsVUFBVSxDQUFDaUIsUUFBUSxDQUFDLG9CQUFvQixDQUFDLElBQ3pDakIsVUFBVSxDQUFDaUIsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEVBQ3hDO0lBQ0EsT0FBTztNQUFFUixLQUFLLEVBQUUsUUFBUTtNQUFFVixPQUFPLEVBQUVPLENBQUMsQ0FBQzlDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUFFLENBQUM7RUFDaEU7RUFFQSxJQUFNc0gsY0FBYyxHQUFHbEUsV0FBVyxDQUFDWCxJQUFJLENBQUMsQ0FBQztFQUN6QyxJQUFJNkUsY0FBYyxJQUFJLENBQUNoRiwwQkFBMEIsQ0FBQ2dGLGNBQWMsQ0FBQyxFQUFFO0lBQ2pFLE9BQU87TUFBRXJFLEtBQUssRUFBRSxRQUFRO01BQUVWLE9BQU8sRUFBRStFO0lBQWUsQ0FBQztFQUNyRDtFQUVBLElBQUloRiwwQkFBMEIsQ0FBQ2dGLGNBQWMsQ0FBQyxJQUFJdkUsT0FBTyxhQUFQQSxPQUFPLGVBQVBBLE9BQU8sQ0FBRUcsbUJBQW1CLEVBQUU7SUFDOUUsT0FBTztNQUFFRCxLQUFLLEVBQUUsUUFBUTtNQUFFVixPQUFPLEVBQUVPLENBQUMsQ0FBQyw4QkFBOEI7SUFBRSxDQUFDO0VBQ3hFO0VBQ0EsT0FBTztJQUFFRyxLQUFLLEVBQUUsUUFBUTtJQUFFVixPQUFPLEVBQUVPLENBQUMsQ0FBQyxzQkFBc0I7RUFBRSxDQUFDO0FBQ2hFLENBQUM7QUFFRCxPQUFPLElBQU15RSwyQkFBMkIsR0FBRyxTQUE5QkEsMkJBQTJCQSxDQUFJQyxNQVMzQyxFQUE0QjtFQUMzQixJQUFJQSxNQUFNLENBQUNDLGNBQWMsRUFBRTtJQUN6QixPQUFPRCxNQUFNLENBQUNDLGNBQWM7RUFDOUI7RUFFQSxJQUFNQyxVQUFVLEdBQUcxRixNQUFNLENBQUNDLElBQUksQ0FBQ3VGLE1BQU0sQ0FBQ0csY0FBYyxDQUFDO0VBQ3JELElBQUlELFVBQVUsQ0FBQ3JGLE1BQU0sR0FBRyxDQUFDLEVBQUU7SUFDekIsSUFBTXVGLFFBQVEsR0FBR0YsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUM5QixJQUFNRyxHQUFHLEdBQUdMLE1BQU0sQ0FBQ0csY0FBYyxDQUFDQyxRQUFRLENBQUM7SUFDM0MsSUFBSUMsR0FBRyxJQUFJQSxHQUFHLEtBQUtMLE1BQU0sQ0FBQzFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO01BQzlDLElBQU11RSxRQUFRLEdBQUdsRSw4QkFBOEIsQ0FBQzBFLEdBQUcsQ0FBQztNQUNwRCxJQUFJUixRQUFRLEVBQUU7UUFDWixPQUFPekUsK0JBQStCLENBQUN5RSxRQUFRLEVBQUVHLE1BQU0sQ0FBQzFFLENBQUMsQ0FBQztNQUM1RDtNQUVBLElBQU1nRixPQUFPLEdBQUdELEdBQUcsQ0FBQ3BGLElBQUksQ0FBQyxDQUFDO01BQzFCLElBQUlxRixPQUFPLElBQUksQ0FBQ3hGLDBCQUEwQixDQUFDd0YsT0FBTyxDQUFDLEVBQUU7UUFDbkQsT0FBTztVQUFFN0UsS0FBSyxFQUFFLFFBQVE7VUFBRVYsT0FBTyxFQUFFdUY7UUFBUSxDQUFDO01BQzlDO01BRUEsT0FBT2hDLDhCQUE4QixDQUFDK0IsR0FBRyxFQUFFTCxNQUFNLENBQUMxRSxDQUFDLEVBQUU7UUFBRUksbUJBQW1CLEVBQUU7TUFBSyxDQUFDLENBQUM7SUFDckY7SUFDQSxPQUFPO01BQUVELEtBQUssRUFBRSxZQUFZO01BQUVWLE9BQU8sRUFBRWlGLE1BQU0sQ0FBQzFFLENBQUMsQ0FBQyxpQkFBaUI7SUFBRSxDQUFDO0VBQ3RFO0VBRUEsSUFBSTBFLE1BQU0sQ0FBQ08sY0FBYyxFQUFFO0lBQ3pCLElBQ0VQLE1BQU0sQ0FBQ08sY0FBYyxLQUFLUCxNQUFNLENBQUMxRSxDQUFDLENBQUMsY0FBYyxDQUFDLElBQ2xEMEUsTUFBTSxDQUFDTyxjQUFjLEtBQUtQLE1BQU0sQ0FBQzFFLENBQUMsQ0FBQzNDLDRCQUE0QixDQUFDLEVBQ2hFO01BQ0EsT0FBTzZHLHdCQUF3QixDQUFDUSxNQUFNLENBQUMxRSxDQUFDLENBQUM7SUFDM0M7SUFDQSxJQUFJMEUsTUFBTSxDQUFDTyxjQUFjLEtBQUtQLE1BQU0sQ0FBQzFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO01BQ3pELE9BQU87UUFBRUcsS0FBSyxFQUFFLFlBQVk7UUFBRVYsT0FBTyxFQUFFaUYsTUFBTSxDQUFDTztNQUFlLENBQUM7SUFDaEU7SUFDQSxJQUNFUCxNQUFNLENBQUNPLGNBQWMsS0FBS1AsTUFBTSxDQUFDMUUsQ0FBQyxDQUFDLDBCQUEwQixDQUFDLElBQzlEMEUsTUFBTSxDQUFDTyxjQUFjLEtBQUtQLE1BQU0sQ0FBQzFFLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxJQUMvRDBFLE1BQU0sQ0FBQ08sY0FBYyxLQUFLUCxNQUFNLENBQUMxRSxDQUFDLENBQUMsMkJBQTJCLENBQUMsRUFDL0Q7TUFDQSxPQUFPbUUsd0JBQXdCLENBQUNPLE1BQU0sQ0FBQzFFLENBQUMsRUFBRTtRQUN4Q29FLGlCQUFpQixFQUFFTSxNQUFNLENBQUNPLGNBQWMsS0FBS1AsTUFBTSxDQUFDMUUsQ0FBQyxDQUFDLDBCQUEwQixDQUFDO1FBQ2pGcUUsa0JBQWtCLEVBQUVLLE1BQU0sQ0FBQ08sY0FBYyxLQUFLUCxNQUFNLENBQUMxRSxDQUFDLENBQUMsMkJBQTJCLENBQUM7UUFDbkZzRSxjQUFjLEVBQUVJLE1BQU0sQ0FBQ08sY0FBYyxLQUFLUCxNQUFNLENBQUMxRSxDQUFDLENBQUMsMkJBQTJCO01BQ2hGLENBQUMsQ0FBQztJQUNKO0lBQ0EsT0FBTztNQUFFRyxLQUFLLEVBQUUsUUFBUTtNQUFFVixPQUFPLEVBQUVpRixNQUFNLENBQUNPO0lBQWUsQ0FBQztFQUM1RDtFQUVBLElBQUlQLE1BQU0sQ0FBQ1EsZUFBZSxFQUFFO0lBQzFCLE9BQU9mLHdCQUF3QixDQUFDTyxNQUFNLENBQUMxRSxDQUFDLEVBQUU7TUFDeENvRSxpQkFBaUIsRUFBRU0sTUFBTSxDQUFDTixpQkFBaUI7TUFDM0NDLGtCQUFrQixFQUFFSyxNQUFNLENBQUNMLGtCQUFrQjtNQUM3Q0MsY0FBYyxFQUFFSSxNQUFNLENBQUNKO0lBQ3pCLENBQUMsQ0FBQztFQUNKO0VBRUEsT0FBTyxJQUFJO0FBQ2IsQ0FBQztBQUVELE9BQU8sSUFBTWEsK0JBQStCLEdBQUcsU0FBbENBLCtCQUErQkEsQ0FBSTNDLFNBQTZCO0VBQUEsT0FDM0UsT0FBT0EsU0FBUyxLQUFLLFFBQVEsSUFBSUEsU0FBUyxDQUFDN0IsUUFBUSxDQUFDLFlBQVksQ0FBQztBQUFBIiwiaWdub3JlTGlzdCI6W119