@projectcor/maia-components 2.11.63-2 → 2.11.63-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 (93) hide show
  1. package/lib/App.js +6 -2
  2. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.styles.js +7 -3
  3. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +4 -2
  4. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +29 -2
  5. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +33 -24
  6. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +40 -7
  7. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +2 -2
  8. package/lib/components/atoms/icons/RocketIcon.js +31 -0
  9. package/lib/components/atoms/icons/SkillIcon.js +30 -0
  10. package/lib/components/atoms/icons/SkillsNavIcon.js +27 -0
  11. package/lib/components/atoms/icons/WrenchIcon.js +42 -0
  12. package/lib/components/atoms/icons/index.js +4 -1
  13. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.styles.js +2 -2
  14. package/lib/components/molecules/AbmSection/AbmActionsSectionV2/AbmActionsSectionV2.js +522 -0
  15. package/lib/components/molecules/AbmSection/AbmActionsSectionV2/AbmActionsSectionV2.styles.js +234 -0
  16. package/lib/components/molecules/AbmSection/AbmActionsSectionV2/catalog.js +437 -0
  17. package/lib/components/molecules/AbmSection/AbmActionsSectionV2/index.js +3 -0
  18. package/lib/components/molecules/AbmSection/AbmGeneralSection.styles.js +3 -3
  19. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.styles.js +2 -2
  20. package/lib/components/molecules/AbmSection/AbmSkillsSection.styles.js +80 -0
  21. package/lib/components/molecules/AbmSection/AbmTriggersSection/AbmTriggersSection.interface.js +2 -0
  22. package/lib/components/molecules/AbmSection/AbmTriggersSection/AbmTriggersSection.js +722 -0
  23. package/lib/components/molecules/AbmSection/AbmTriggersSection/AbmTriggersSection.styles.js +165 -0
  24. package/lib/components/molecules/AbmSection/AbmTriggersSection/index.js +2 -0
  25. package/lib/components/molecules/AbmSection/index.js +2 -1
  26. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +21 -2
  27. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +60 -16
  28. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +2 -2
  29. package/lib/components/molecules/ChatAIModal/constants.js +10 -2
  30. package/lib/components/molecules/ChatAIMyRoutines/ChatAIMyRoutines.js +486 -0
  31. package/lib/components/molecules/ChatAIMyRoutines/ChatAIMyRoutines.styles.js +184 -0
  32. package/lib/components/molecules/ChatAIMyRoutines/index.js +2 -0
  33. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +357 -0
  34. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.styles.js +145 -0
  35. package/lib/components/molecules/ChatAIMySkills/index.js +2 -0
  36. package/lib/components/molecules/ChatFooter/ChatFooter.js +1 -1
  37. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +3 -1
  38. package/lib/components/molecules/SchedulesPage/SchedulesPage.js +610 -0
  39. package/lib/components/molecules/SchedulesPage/index.js +2 -0
  40. package/lib/components/molecules/Sidebar/Sidebar.js +61 -28
  41. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +15 -11
  42. package/lib/components/molecules/SkillsPage/SkillsPage.js +708 -0
  43. package/lib/components/molecules/SkillsPage/index.js +2 -0
  44. package/lib/components/molecules/maiaSectionModalStyles.js +91 -0
  45. package/lib/components/molecules/maiaSectionUiTokens.js +31 -0
  46. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +269 -56
  47. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.styles.js +4 -4
  48. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.js +160 -0
  49. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.styles.js +34 -0
  50. package/lib/components/organisms/AbmSkillGenerateModal/index.js +2 -0
  51. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +446 -0
  52. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.styles.js +98 -0
  53. package/lib/components/organisms/AbmSkillModal/index.js +2 -0
  54. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.js +17 -2
  55. package/lib/constants/config.js +4 -1
  56. package/lib/dev/DevAbmAgentModal.js +114 -0
  57. package/lib/dev/mocks/abmModalMocks.js +193 -0
  58. package/lib/hooks/useAgentModel/useCreateAgent.js +11 -10
  59. package/lib/hooks/useAgentModel/useUpdateAgent.js +12 -11
  60. package/lib/hooks/useContextMentions.js +61 -13
  61. package/lib/hooks/useEntitySearch.js +277 -91
  62. package/lib/hooks/useMentionAllowedTypes.js +46 -11
  63. package/lib/hooks/useMentionPopover.js +64 -30
  64. package/lib/lang/br/index.js +572 -3
  65. package/lib/lang/en/index.js +572 -3
  66. package/lib/lang/es/index.js +572 -3
  67. package/lib/lang/fr/index.js +304 -4
  68. package/lib/services/maia/Agents/connectors.js +110 -0
  69. package/lib/services/maia/Agents/createAgent.js +1 -1
  70. package/lib/services/maia/Agents/getAgentById.js +3 -2
  71. package/lib/services/maia/Agents/skills.js +164 -0
  72. package/lib/services/maia/Agents/updateAgent.js +1 -1
  73. package/lib/services/maia/Orchestrator/orchestrator.js +1 -2
  74. package/lib/services/maia/Schedules/createSchedule.js +39 -0
  75. package/lib/services/maia/Schedules/deleteSchedule.js +36 -0
  76. package/lib/services/maia/Schedules/getMySchedules.js +55 -0
  77. package/lib/services/maia/Schedules/getSchedules.js +58 -0
  78. package/lib/services/maia/Schedules/index.js +5 -0
  79. package/lib/services/maia/Skills/createSkill.js +39 -0
  80. package/lib/services/maia/Skills/deleteSkill.js +38 -0
  81. package/lib/services/maia/Skills/generateSkill.js +41 -0
  82. package/lib/services/maia/Skills/getSkills.js +90 -0
  83. package/lib/services/maia/Skills/updateSkill.js +39 -0
  84. package/lib/types/Chat.js +1 -1
  85. package/lib/types/agent.js +1 -1
  86. package/lib/types/agentModal.js +1 -1
  87. package/lib/types/agentSkill.js +2 -0
  88. package/lib/types/attachment.js +2 -0
  89. package/lib/types/contextMention.js +1 -1
  90. package/lib/types/skill.js +2 -0
  91. package/lib/utils/contextMentionIcons.js +29 -1
  92. package/lib/utils/renderContextMentions.js +9 -4
  93. package/package.json +1 -1
@@ -0,0 +1,522 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
+ 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; }
5
+ 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; }
6
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
7
+ import { useTranslation } from 'react-i18next';
8
+ import { Category } from '@projectcor/icons/lib/components/Category';
9
+ import { ChevronDown } from '@projectcor/icons/lib/components/ChevronDown';
10
+ import { Tooltip } from '@projectcor/tooltipv2/lib/components/Tooltip';
11
+ import { NotionIcon } from '../../../atoms/icons/NotionIcon';
12
+ import { useResizeListener } from '../../../../hooks/useResize';
13
+ import { ACTION_LABEL_KEYS, COR_TOOL_GROUPS, ENTITY_ACTION_ORDER, ENTITY_ORDER, NOTION_CONNECTOR_CATALOG, NOTION_CONNECTOR_SLUG } from './catalog';
14
+ import { SCActionHeader, SCActionLabel, SCActionLabelGroup, SCActionRow, SCCategoryAccordion, SCCategoryDescription, SCCategoryHeader, SCCategoryTextGroup, SCCategoryTitle, SCChevronButton, SCComingSoonBadge, SCConnectorCard, SCConnectorHeader, SCConnectorHint, SCConnectorIcon, SCConnectorIdentity, SCConnectorRightGroup, SCConnectorTagline, SCConnectorTextGroup, SCConnectorTitle, SCCounter, SCDeleteBadge, SCExpandableBlockBody, SCEmptyTools, SCEntityCard, SCEntityHeader, SCEntityList, SCEntityTitle, SCHeader, SCRoot, SCSectionLabel, SCStatusPill, SCSubtitle, SCTitle, SCToggle, SCToggleThumb, SCToolDescription, SCToolItem, SCToolKindBadge, SCToolName, SCToolText, SCToolsList } from './AbmActionsSectionV2.styles';
15
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
16
+ var HIERARCHICAL_ACTIONS = ['read', 'edit', 'delete'];
17
+ var buildToolGroupMap = function buildToolGroupMap(groups) {
18
+ var map = {};
19
+ ENTITY_ORDER.forEach(function (entity) {
20
+ map[entity] = {};
21
+ });
22
+ groups.forEach(function (group) {
23
+ map[group.entity][group.action] = group;
24
+ });
25
+ return map;
26
+ };
27
+ var TOOL_GROUP_MAP = buildToolGroupMap(COR_TOOL_GROUPS);
28
+ var TruncationTooltip = function TruncationTooltip(_ref) {
29
+ var title = _ref.title,
30
+ _ref$layoutKey = _ref.layoutKey,
31
+ layoutKey = _ref$layoutKey === void 0 ? '' : _ref$layoutKey,
32
+ children = _ref.children;
33
+ var textRef = useRef(null);
34
+ var _useResizeListener = useResizeListener(textRef, [title, layoutKey]),
35
+ showTooltip = _useResizeListener.showTooltip;
36
+ return /*#__PURE__*/_jsx(Tooltip, {
37
+ title: showTooltip ? title : '',
38
+ children: children(textRef)
39
+ });
40
+ };
41
+ export var AbmActionsSectionV2 = function AbmActionsSectionV2(_ref2) {
42
+ var _values$actions, _values$actions2, _values$actions4;
43
+ var values = _ref2.values,
44
+ handleSetAgentValues = _ref2.handleSetAgentValues;
45
+ var _useTranslation = useTranslation('abm_agent_section'),
46
+ t = _useTranslation.t;
47
+ var selectedToolGroups = ((_values$actions = values.actions) === null || _values$actions === void 0 ? void 0 : _values$actions.selectedToolGroups) || [];
48
+ var selectedConnectors = ((_values$actions2 = values.actions) === null || _values$actions2 === void 0 ? void 0 : _values$actions2.selectedConnectors) || [];
49
+ var selectedToolGroupsSet = useMemo(function () {
50
+ return new Set(selectedToolGroups);
51
+ }, [selectedToolGroups]);
52
+ var selectedConnectorsSet = useMemo(function () {
53
+ return new Set(selectedConnectors);
54
+ }, [selectedConnectors]);
55
+ var _useState = useState(false),
56
+ _useState2 = _slicedToArray(_useState, 2),
57
+ corBlockExpanded = _useState2[0],
58
+ setCorBlockExpanded = _useState2[1];
59
+ var _useState3 = useState(new Set()),
60
+ _useState4 = _slicedToArray(_useState3, 2),
61
+ expandedActions = _useState4[0],
62
+ setExpandedActions = _useState4[1];
63
+ var _useState5 = useState(new Set()),
64
+ _useState6 = _slicedToArray(_useState5, 2),
65
+ expandedNotionCategories = _useState6[0],
66
+ setExpandedNotionCategories = _useState6[1];
67
+ /** Evita reabrir el bloque si el usuario lo cerró con la misma cantidad de tool groups seleccionados. */
68
+ var prevCorToolGroupCountRef = useRef(null);
69
+ /** Para distinguir cierre manual del bloque (destildar COR) del montaje inicial colapsado. */
70
+ var prevCorBlockExpandedRef = useRef(null);
71
+ useEffect(function () {
72
+ var n = selectedToolGroups.length;
73
+ var prev = prevCorToolGroupCountRef.current;
74
+ prevCorToolGroupCountRef.current = n;
75
+ if (n === 0) {
76
+ return;
77
+ }
78
+ if (prev === null && n > 0) {
79
+ setCorBlockExpanded(true);
80
+ return;
81
+ }
82
+ if (prev === 0 && n > 0) {
83
+ setCorBlockExpanded(true);
84
+ }
85
+ }, [selectedToolGroups.length]);
86
+ useEffect(function () {
87
+ var wasExpanded = prevCorBlockExpandedRef.current === true;
88
+ if (!corBlockExpanded) {
89
+ setExpandedActions(new Set());
90
+ if (wasExpanded && selectedToolGroups.length > 0) {
91
+ handleSetAgentValues({
92
+ key: 'actions',
93
+ value: _objectSpread(_objectSpread({}, values.actions), {}, {
94
+ selectedToolGroups: [],
95
+ selectedConnectors: selectedConnectors
96
+ })
97
+ });
98
+ }
99
+ }
100
+ prevCorBlockExpandedRef.current = corBlockExpanded;
101
+ }, [corBlockExpanded, handleSetAgentValues, selectedConnectors, selectedToolGroups.length, values.actions]);
102
+ var isActionActive = useCallback(function (entity, action) {
103
+ var _TOOL_GROUP_MAP$entit;
104
+ var group = (_TOOL_GROUP_MAP$entit = TOOL_GROUP_MAP[entity]) === null || _TOOL_GROUP_MAP$entit === void 0 ? void 0 : _TOOL_GROUP_MAP$entit[action];
105
+ return !!group && selectedToolGroupsSet.has(group.slug);
106
+ }, [selectedToolGroupsSet]);
107
+ var toggleEntityAction = useCallback(function (entity, action) {
108
+ var _TOOL_GROUP_MAP$entit2;
109
+ var targetGroup = (_TOOL_GROUP_MAP$entit2 = TOOL_GROUP_MAP[entity]) === null || _TOOL_GROUP_MAP$entit2 === void 0 ? void 0 : _TOOL_GROUP_MAP$entit2[action];
110
+ if (!targetGroup || !targetGroup.available) return;
111
+ var next = new Set(selectedToolGroups);
112
+ var entityIndex = ENTITY_ORDER.indexOf(entity);
113
+ var previousEntities = ENTITY_ORDER.slice(0, entityIndex + 1);
114
+ var nextEntities = ENTITY_ORDER.slice(entityIndex);
115
+ var actionIndex = HIERARCHICAL_ACTIONS.indexOf(action);
116
+ var isCurrentlyActive = next.has(targetGroup.slug);
117
+ if (isCurrentlyActive) {
118
+ nextEntities.forEach(function (currentEntity) {
119
+ HIERARCHICAL_ACTIONS.slice(actionIndex).forEach(function (currentAction) {
120
+ var _TOOL_GROUP_MAP$curre;
121
+ var group = (_TOOL_GROUP_MAP$curre = TOOL_GROUP_MAP[currentEntity]) === null || _TOOL_GROUP_MAP$curre === void 0 ? void 0 : _TOOL_GROUP_MAP$curre[currentAction];
122
+ if (group !== null && group !== void 0 && group.available) next["delete"](group.slug);
123
+ });
124
+ });
125
+ } else {
126
+ previousEntities.forEach(function (currentEntity) {
127
+ HIERARCHICAL_ACTIONS.slice(0, actionIndex + 1).forEach(function (currentAction) {
128
+ var _TOOL_GROUP_MAP$curre2;
129
+ var group = (_TOOL_GROUP_MAP$curre2 = TOOL_GROUP_MAP[currentEntity]) === null || _TOOL_GROUP_MAP$curre2 === void 0 ? void 0 : _TOOL_GROUP_MAP$curre2[currentAction];
130
+ if (group !== null && group !== void 0 && group.available) next.add(group.slug);
131
+ });
132
+ });
133
+ }
134
+ handleSetAgentValues({
135
+ key: 'actions',
136
+ value: _objectSpread(_objectSpread({}, values.actions), {}, {
137
+ selectedToolGroups: Array.from(next),
138
+ selectedConnectors: selectedConnectors
139
+ })
140
+ });
141
+ }, [handleSetAgentValues, selectedConnectors, selectedToolGroups, values.actions]);
142
+ var toggleConnector = useCallback(function (connectorSlug) {
143
+ var next = new Set(selectedConnectors);
144
+ if (next.has(connectorSlug)) {
145
+ next["delete"](connectorSlug);
146
+ } else {
147
+ next.add(connectorSlug);
148
+ }
149
+ handleSetAgentValues({
150
+ key: 'actions',
151
+ value: _objectSpread(_objectSpread({}, values.actions), {}, {
152
+ selectedToolGroups: selectedToolGroups,
153
+ selectedConnectors: Array.from(next)
154
+ })
155
+ });
156
+ }, [handleSetAgentValues, selectedConnectors, selectedToolGroups, values.actions]);
157
+ var toggleActionExpanded = useCallback(function (slug) {
158
+ setExpandedActions(function (prev) {
159
+ var next = new Set(prev);
160
+ if (next.has(slug)) next["delete"](slug);else next.add(slug);
161
+ return next;
162
+ });
163
+ }, []);
164
+ var toggleNotionCategory = useCallback(function (categoryKey) {
165
+ setExpandedNotionCategories(function (prev) {
166
+ var next = new Set(prev);
167
+ if (next.has(categoryKey)) next["delete"](categoryKey);else next.add(categoryKey);
168
+ return next;
169
+ });
170
+ }, []);
171
+ var isNotionEnabled = selectedConnectorsSet.has(NOTION_CONNECTOR_SLUG);
172
+ var notionConnectorState = useMemo(function () {
173
+ var _values$actions3;
174
+ return (_values$actions3 = values.actions) === null || _values$actions3 === void 0 || (_values$actions3 = _values$actions3.connectorStates) === null || _values$actions3 === void 0 ? void 0 : _values$actions3.find(function (s) {
175
+ return s.slug === NOTION_CONNECTOR_SLUG;
176
+ });
177
+ }, [(_values$actions4 = values.actions) === null || _values$actions4 === void 0 ? void 0 : _values$actions4.connectorStates]);
178
+ var notionConnectorBadge = useMemo(function () {
179
+ if (!isNotionEnabled) {
180
+ return {
181
+ tone: 'neutral',
182
+ label: t('actionsSection.v2.connectorStatus.inactive')
183
+ };
184
+ }
185
+ if (notionConnectorState) {
186
+ if (notionConnectorState.enabled_for_agent) {
187
+ return {
188
+ tone: 'success',
189
+ label: t('actionsSection.v2.connectorStatus.enabled')
190
+ };
191
+ }
192
+ return {
193
+ tone: 'pending',
194
+ label: t('actionsSection.v2.connectorStatus.enabledPendingAuth')
195
+ };
196
+ }
197
+ return {
198
+ tone: 'pending',
199
+ label: t('actionsSection.v2.connectorStatus.enabledPendingAuth')
200
+ };
201
+ }, [isNotionEnabled, notionConnectorState, t]);
202
+ useEffect(function () {
203
+ if (!isNotionEnabled) {
204
+ setExpandedNotionCategories(new Set());
205
+ }
206
+ }, [isNotionEnabled]);
207
+ var corActiveToolsCount = useMemo(function () {
208
+ return COR_TOOL_GROUPS.reduce(function (acc, g) {
209
+ return acc + (selectedToolGroupsSet.has(g.slug) ? g.tools.length : 0);
210
+ }, 0);
211
+ }, [selectedToolGroupsSet]);
212
+ var truncationMeasureKey = useMemo(function () {
213
+ return "".concat(corBlockExpanded ? '1' : '0', "#").concat(_toConsumableArray(expandedActions).sort().join('|'), "#").concat(_toConsumableArray(expandedNotionCategories).sort().join('|'));
214
+ }, [corBlockExpanded, expandedActions, expandedNotionCategories]);
215
+ var renderToolItem = function renderToolItem(tool) {
216
+ var name = t("actionsSection.v2.catalog.tools.".concat(tool.slug, ".name"), {
217
+ defaultValue: tool.name
218
+ });
219
+ var description = t("actionsSection.v2.catalog.tools.".concat(tool.slug, ".description"), {
220
+ defaultValue: tool.description
221
+ });
222
+ return /*#__PURE__*/_jsxs(SCToolItem, {
223
+ children: [/*#__PURE__*/_jsx(SCToolKindBadge, {
224
+ kind: tool.accessKind,
225
+ children: t("actionsSection.v2.accessKind.".concat(tool.accessKind))
226
+ }), /*#__PURE__*/_jsxs(SCToolText, {
227
+ children: [/*#__PURE__*/_jsx(SCToolName, {
228
+ children: name
229
+ }), /*#__PURE__*/_jsx(TruncationTooltip, {
230
+ title: description,
231
+ layoutKey: truncationMeasureKey,
232
+ children: function children(textRef) {
233
+ return /*#__PURE__*/_jsx(SCToolDescription, {
234
+ ref: textRef,
235
+ children: description
236
+ });
237
+ }
238
+ })]
239
+ })]
240
+ }, tool.slug);
241
+ };
242
+ var renderActionRow = function renderActionRow(entity, action) {
243
+ var _TOOL_GROUP_MAP$entit3;
244
+ var group = (_TOOL_GROUP_MAP$entit3 = TOOL_GROUP_MAP[entity]) === null || _TOOL_GROUP_MAP$entit3 === void 0 ? void 0 : _TOOL_GROUP_MAP$entit3[action];
245
+ if (!group) return null;
246
+ var isAvailable = group.available;
247
+ var active = isActionActive(entity, action);
248
+ var expanded = expandedActions.has(group.slug);
249
+ var toolsCount = group.tools.length;
250
+ var canExpand = isAvailable && toolsCount > 0;
251
+ var isDelete = action === 'delete' && active;
252
+ var onHeaderClick = function onHeaderClick() {
253
+ if (canExpand) toggleActionExpanded(group.slug);
254
+ };
255
+ var onToggleClick = function onToggleClick(e) {
256
+ e.stopPropagation();
257
+ if (isAvailable) toggleEntityAction(entity, action);
258
+ };
259
+ var headerContent = /*#__PURE__*/_jsxs(SCActionHeader, {
260
+ clickable: canExpand,
261
+ onClick: onHeaderClick,
262
+ children: [/*#__PURE__*/_jsx(SCChevronButton, {
263
+ type: "button",
264
+ open: expanded,
265
+ disabled: !canExpand,
266
+ onClick: function onClick(e) {
267
+ e.stopPropagation();
268
+ if (canExpand) toggleActionExpanded(group.slug);
269
+ },
270
+ "aria-expanded": expanded,
271
+ "aria-label": expanded ? t('actionsSection.v2.hideTools') : t('actionsSection.v2.viewTools'),
272
+ children: /*#__PURE__*/_jsx(ChevronDown, {
273
+ width: "12px",
274
+ height: "12px",
275
+ color: "currentColor"
276
+ })
277
+ }), /*#__PURE__*/_jsxs(SCActionLabelGroup, {
278
+ children: [/*#__PURE__*/_jsx(SCActionLabel, {
279
+ children: t(ACTION_LABEL_KEYS[action])
280
+ }), !isAvailable && /*#__PURE__*/_jsx(SCComingSoonBadge, {
281
+ children: t('actionsSection.v2.comingSoon')
282
+ }), isAvailable && /*#__PURE__*/_jsx(SCCounter, {
283
+ active: active,
284
+ children: t('actionsSection.v2.toolsCount', {
285
+ count: toolsCount
286
+ })
287
+ }), isDelete && /*#__PURE__*/_jsx(SCDeleteBadge, {
288
+ children: t('actionsSection.v2.deleteWarningInline')
289
+ })]
290
+ }), /*#__PURE__*/_jsx(SCToggle, {
291
+ type: "button",
292
+ isActive: active,
293
+ disabled: !isAvailable,
294
+ onClick: onToggleClick,
295
+ "aria-pressed": active,
296
+ "aria-label": "".concat(t("actionsSection.entities.".concat(entity)), " \xB7 ").concat(t(ACTION_LABEL_KEYS[action])),
297
+ children: /*#__PURE__*/_jsx(SCToggleThumb, {})
298
+ })]
299
+ });
300
+ var row = /*#__PURE__*/_jsxs(SCActionRow, {
301
+ disabled: !isAvailable,
302
+ children: [headerContent, expanded && canExpand && /*#__PURE__*/_jsx(SCToolsList, {
303
+ children: group.tools.map(function (tool) {
304
+ return renderToolItem(tool);
305
+ })
306
+ })]
307
+ }, "".concat(entity, "-").concat(action));
308
+ if (!isAvailable) {
309
+ return /*#__PURE__*/_jsx(Tooltip, {
310
+ title: t('actionsSection.v2.comingSoonHint'),
311
+ children: /*#__PURE__*/_jsx("div", {
312
+ children: row
313
+ })
314
+ }, "".concat(entity, "-").concat(action));
315
+ }
316
+ return row;
317
+ };
318
+ var renderEntityCard = function renderEntityCard(entity) {
319
+ var groupsForEntity = ENTITY_ACTION_ORDER.map(function (action) {
320
+ var _TOOL_GROUP_MAP$entit4;
321
+ return (_TOOL_GROUP_MAP$entit4 = TOOL_GROUP_MAP[entity]) === null || _TOOL_GROUP_MAP$entit4 === void 0 ? void 0 : _TOOL_GROUP_MAP$entit4[action];
322
+ }).filter(function (group) {
323
+ return Boolean(group);
324
+ });
325
+ var enabledTools = groupsForEntity.reduce(function (acc, group) {
326
+ return acc + (selectedToolGroupsSet.has(group.slug) ? group.tools.length : 0);
327
+ }, 0);
328
+ var counterActive = enabledTools > 0;
329
+ return /*#__PURE__*/_jsxs(SCEntityCard, {
330
+ children: [/*#__PURE__*/_jsxs(SCEntityHeader, {
331
+ children: [/*#__PURE__*/_jsx(SCEntityTitle, {
332
+ children: t("actionsSection.entities.".concat(entity))
333
+ }), /*#__PURE__*/_jsx(SCCounter, {
334
+ active: counterActive,
335
+ children: t('actionsSection.v2.toolsCount', {
336
+ count: enabledTools
337
+ })
338
+ })]
339
+ }), ENTITY_ACTION_ORDER.map(function (action) {
340
+ return renderActionRow(entity, action);
341
+ })]
342
+ }, entity);
343
+ };
344
+ var renderNotionCategory = function renderNotionCategory(category) {
345
+ var isOpen = expandedNotionCategories.has(category.key);
346
+ var toolsCount = category.tools.length;
347
+ var label = t("actionsSection.v2.catalog.notionCategories.".concat(category.key, ".label"), {
348
+ defaultValue: category.label
349
+ });
350
+ var description = t("actionsSection.v2.catalog.notionCategories.".concat(category.key, ".description"), {
351
+ defaultValue: category.description
352
+ });
353
+ return /*#__PURE__*/_jsxs(SCCategoryAccordion, {
354
+ children: [/*#__PURE__*/_jsxs(SCCategoryHeader, {
355
+ type: "button",
356
+ onClick: function onClick() {
357
+ return toggleNotionCategory(category.key);
358
+ },
359
+ "aria-expanded": isOpen,
360
+ children: [/*#__PURE__*/_jsx(SCChevronButton, {
361
+ as: "span",
362
+ open: isOpen,
363
+ children: /*#__PURE__*/_jsx(ChevronDown, {
364
+ width: "12px",
365
+ height: "12px",
366
+ color: "currentColor"
367
+ })
368
+ }), /*#__PURE__*/_jsxs(SCCategoryTextGroup, {
369
+ children: [/*#__PURE__*/_jsx(SCCategoryTitle, {
370
+ children: label
371
+ }), /*#__PURE__*/_jsx(TruncationTooltip, {
372
+ title: description,
373
+ layoutKey: truncationMeasureKey,
374
+ children: function children(textRef) {
375
+ return /*#__PURE__*/_jsx(SCCategoryDescription, {
376
+ ref: textRef,
377
+ children: description
378
+ });
379
+ }
380
+ })]
381
+ }), /*#__PURE__*/_jsx(SCCounter, {
382
+ active: false,
383
+ children: t('actionsSection.v2.notion.categoryToolsCount', {
384
+ count: toolsCount
385
+ })
386
+ })]
387
+ }), isOpen && (toolsCount > 0 ? /*#__PURE__*/_jsx(SCToolsList, {
388
+ children: category.tools.map(function (tool) {
389
+ return renderToolItem(tool);
390
+ })
391
+ }) : /*#__PURE__*/_jsx(SCEmptyTools, {
392
+ children: t('actionsSection.v2.emptyTools')
393
+ }))]
394
+ }, category.key);
395
+ };
396
+ return /*#__PURE__*/_jsxs(SCRoot, {
397
+ children: [/*#__PURE__*/_jsxs(SCHeader, {
398
+ children: [/*#__PURE__*/_jsx(SCTitle, {
399
+ children: t('actionsSection.v2.sectionTitle')
400
+ }), /*#__PURE__*/_jsx(SCSubtitle, {
401
+ children: t('actionsSection.v2.sectionSubtitle')
402
+ })]
403
+ }), /*#__PURE__*/_jsx(SCSectionLabel, {
404
+ children: t('actionsSection.v2.internalBlockTitle')
405
+ }), /*#__PURE__*/_jsxs(SCConnectorCard, {
406
+ children: [/*#__PURE__*/_jsxs(SCConnectorHeader, {
407
+ children: [/*#__PURE__*/_jsxs(SCConnectorIdentity, {
408
+ children: [/*#__PURE__*/_jsx(SCConnectorIcon, {
409
+ "aria-hidden": true,
410
+ children: /*#__PURE__*/_jsx(Category, {
411
+ width: 18,
412
+ height: 18
413
+ })
414
+ }), /*#__PURE__*/_jsxs(SCConnectorTextGroup, {
415
+ children: [/*#__PURE__*/_jsx(TruncationTooltip, {
416
+ title: t('actionsSection.v2.internalBlockTitle'),
417
+ layoutKey: truncationMeasureKey,
418
+ children: function children(textRef) {
419
+ return /*#__PURE__*/_jsx(SCConnectorTitle, {
420
+ ref: textRef,
421
+ children: t('actionsSection.v2.internalBlockTitle')
422
+ });
423
+ }
424
+ }), /*#__PURE__*/_jsx(TruncationTooltip, {
425
+ title: t('actionsSection.v2.internalBlockSubtitle'),
426
+ layoutKey: truncationMeasureKey,
427
+ children: function children(textRef) {
428
+ return /*#__PURE__*/_jsx(SCConnectorTagline, {
429
+ ref: textRef,
430
+ children: t('actionsSection.v2.internalBlockSubtitle')
431
+ });
432
+ }
433
+ })]
434
+ })]
435
+ }), /*#__PURE__*/_jsxs(SCConnectorRightGroup, {
436
+ children: [/*#__PURE__*/_jsx(SCCounter, {
437
+ active: corActiveToolsCount > 0,
438
+ children: t('actionsSection.v2.toolsCount', {
439
+ count: corActiveToolsCount
440
+ })
441
+ }), /*#__PURE__*/_jsx(SCToggle, {
442
+ type: "button",
443
+ isActive: corBlockExpanded,
444
+ onClick: function onClick() {
445
+ return setCorBlockExpanded(function (v) {
446
+ return !v;
447
+ });
448
+ },
449
+ "aria-pressed": corBlockExpanded,
450
+ "aria-label": corBlockExpanded ? t('actionsSection.v2.expandCorDetailsAriaOff') : t('actionsSection.v2.expandCorDetailsAriaOn'),
451
+ children: /*#__PURE__*/_jsx(SCToggleThumb, {})
452
+ })]
453
+ })]
454
+ }), !corBlockExpanded && /*#__PURE__*/_jsx(SCConnectorHint, {
455
+ children: t('actionsSection.v2.corCollapsedHint')
456
+ }), corBlockExpanded && /*#__PURE__*/_jsx(SCExpandableBlockBody, {
457
+ children: /*#__PURE__*/_jsx(SCEntityList, {
458
+ children: ENTITY_ORDER.map(function (entity) {
459
+ return renderEntityCard(entity);
460
+ })
461
+ })
462
+ })]
463
+ }), /*#__PURE__*/_jsx(SCSectionLabel, {
464
+ children: t('actionsSection.v2.externalBlockTitle')
465
+ }), /*#__PURE__*/_jsxs(SCConnectorCard, {
466
+ children: [/*#__PURE__*/_jsxs(SCConnectorHeader, {
467
+ children: [/*#__PURE__*/_jsxs(SCConnectorIdentity, {
468
+ children: [/*#__PURE__*/_jsx(SCConnectorIcon, {
469
+ "aria-hidden": true,
470
+ children: /*#__PURE__*/_jsx(NotionIcon, {
471
+ width: 18,
472
+ height: 18
473
+ })
474
+ }), /*#__PURE__*/_jsxs(SCConnectorTextGroup, {
475
+ children: [/*#__PURE__*/_jsx(TruncationTooltip, {
476
+ title: NOTION_CONNECTOR_CATALOG.name,
477
+ layoutKey: truncationMeasureKey,
478
+ children: function children(textRef) {
479
+ return /*#__PURE__*/_jsx(SCConnectorTitle, {
480
+ ref: textRef,
481
+ children: NOTION_CONNECTOR_CATALOG.name
482
+ });
483
+ }
484
+ }), /*#__PURE__*/_jsx(TruncationTooltip, {
485
+ title: t('actionsSection.v2.notion.tagline'),
486
+ layoutKey: truncationMeasureKey,
487
+ children: function children(textRef) {
488
+ return /*#__PURE__*/_jsx(SCConnectorTagline, {
489
+ ref: textRef,
490
+ children: t('actionsSection.v2.notion.tagline')
491
+ });
492
+ }
493
+ })]
494
+ })]
495
+ }), /*#__PURE__*/_jsxs(SCConnectorRightGroup, {
496
+ children: [/*#__PURE__*/_jsx(SCStatusPill, {
497
+ tone: notionConnectorBadge.tone,
498
+ children: notionConnectorBadge.label
499
+ }), /*#__PURE__*/_jsx(SCToggle, {
500
+ type: "button",
501
+ isActive: isNotionEnabled,
502
+ onClick: function onClick() {
503
+ return toggleConnector(NOTION_CONNECTOR_SLUG);
504
+ },
505
+ "aria-pressed": isNotionEnabled,
506
+ "aria-label": NOTION_CONNECTOR_CATALOG.name,
507
+ children: /*#__PURE__*/_jsx(SCToggleThumb, {})
508
+ })]
509
+ })]
510
+ }), !isNotionEnabled && /*#__PURE__*/_jsx(SCConnectorHint, {
511
+ children: t('actionsSection.v2.notion.disabledHint')
512
+ }), isNotionEnabled && /*#__PURE__*/_jsxs(_Fragment, {
513
+ children: [/*#__PURE__*/_jsx(SCConnectorHint, {
514
+ children: t('actionsSection.v2.notion.enabledHint')
515
+ }), NOTION_CONNECTOR_CATALOG.categories.map(function (category) {
516
+ return renderNotionCategory(category);
517
+ })]
518
+ })]
519
+ })]
520
+ });
521
+ };
522
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUNhbGxiYWNrIiwidXNlRWZmZWN0IiwidXNlTWVtbyIsInVzZVJlZiIsInVzZVN0YXRlIiwidXNlVHJhbnNsYXRpb24iLCJDYXRlZ29yeSIsIkNoZXZyb25Eb3duIiwiVG9vbHRpcCIsIk5vdGlvbkljb24iLCJ1c2VSZXNpemVMaXN0ZW5lciIsIkFDVElPTl9MQUJFTF9LRVlTIiwiQ09SX1RPT0xfR1JPVVBTIiwiRU5USVRZX0FDVElPTl9PUkRFUiIsIkVOVElUWV9PUkRFUiIsIk5PVElPTl9DT05ORUNUT1JfQ0FUQUxPRyIsIk5PVElPTl9DT05ORUNUT1JfU0xVRyIsIlNDQWN0aW9uSGVhZGVyIiwiU0NBY3Rpb25MYWJlbCIsIlNDQWN0aW9uTGFiZWxHcm91cCIsIlNDQWN0aW9uUm93IiwiU0NDYXRlZ29yeUFjY29yZGlvbiIsIlNDQ2F0ZWdvcnlEZXNjcmlwdGlvbiIsIlNDQ2F0ZWdvcnlIZWFkZXIiLCJTQ0NhdGVnb3J5VGV4dEdyb3VwIiwiU0NDYXRlZ29yeVRpdGxlIiwiU0NDaGV2cm9uQnV0dG9uIiwiU0NDb21pbmdTb29uQmFkZ2UiLCJTQ0Nvbm5lY3RvckNhcmQiLCJTQ0Nvbm5lY3RvckhlYWRlciIsIlNDQ29ubmVjdG9ySGludCIsIlNDQ29ubmVjdG9ySWNvbiIsIlNDQ29ubmVjdG9ySWRlbnRpdHkiLCJTQ0Nvbm5lY3RvclJpZ2h0R3JvdXAiLCJTQ0Nvbm5lY3RvclRhZ2xpbmUiLCJTQ0Nvbm5lY3RvclRleHRHcm91cCIsIlNDQ29ubmVjdG9yVGl0bGUiLCJTQ0NvdW50ZXIiLCJTQ0RlbGV0ZUJhZGdlIiwiU0NFeHBhbmRhYmxlQmxvY2tCb2R5IiwiU0NFbXB0eVRvb2xzIiwiU0NFbnRpdHlDYXJkIiwiU0NFbnRpdHlIZWFkZXIiLCJTQ0VudGl0eUxpc3QiLCJTQ0VudGl0eVRpdGxlIiwiU0NIZWFkZXIiLCJTQ1Jvb3QiLCJTQ1NlY3Rpb25MYWJlbCIsIlNDU3RhdHVzUGlsbCIsIlNDU3VidGl0bGUiLCJTQ1RpdGxlIiwiU0NUb2dnbGUiLCJTQ1RvZ2dsZVRodW1iIiwiU0NUb29sRGVzY3JpcHRpb24iLCJTQ1Rvb2xJdGVtIiwiU0NUb29sS2luZEJhZGdlIiwiU0NUb29sTmFtZSIsIlNDVG9vbFRleHQiLCJTQ1Rvb2xzTGlzdCIsImpzeCIsIl9qc3giLCJqc3hzIiwiX2pzeHMiLCJGcmFnbWVudCIsIl9GcmFnbWVudCIsIkhJRVJBUkNISUNBTF9BQ1RJT05TIiwiYnVpbGRUb29sR3JvdXBNYXAiLCJncm91cHMiLCJtYXAiLCJmb3JFYWNoIiwiZW50aXR5IiwiZ3JvdXAiLCJhY3Rpb24iLCJUT09MX0dST1VQX01BUCIsIlRydW5jYXRpb25Ub29sdGlwIiwiX3JlZiIsInRpdGxlIiwiX3JlZiRsYXlvdXRLZXkiLCJsYXlvdXRLZXkiLCJjaGlsZHJlbiIsInRleHRSZWYiLCJfdXNlUmVzaXplTGlzdGVuZXIiLCJzaG93VG9vbHRpcCIsIkFibUFjdGlvbnNTZWN0aW9uVjIiLCJfcmVmMiIsIl92YWx1ZXMkYWN0aW9ucyIsIl92YWx1ZXMkYWN0aW9uczIiLCJfdmFsdWVzJGFjdGlvbnM0IiwidmFsdWVzIiwiaGFuZGxlU2V0QWdlbnRWYWx1ZXMiLCJfdXNlVHJhbnNsYXRpb24iLCJ0Iiwic2VsZWN0ZWRUb29sR3JvdXBzIiwiYWN0aW9ucyIsInNlbGVjdGVkQ29ubmVjdG9ycyIsInNlbGVjdGVkVG9vbEdyb3Vwc1NldCIsIlNldCIsInNlbGVjdGVkQ29ubmVjdG9yc1NldCIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsImNvckJsb2NrRXhwYW5kZWQiLCJzZXRDb3JCbG9ja0V4cGFuZGVkIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJleHBhbmRlZEFjdGlvbnMiLCJzZXRFeHBhbmRlZEFjdGlvbnMiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImV4cGFuZGVkTm90aW9uQ2F0ZWdvcmllcyIsInNldEV4cGFuZGVkTm90aW9uQ2F0ZWdvcmllcyIsInByZXZDb3JUb29sR3JvdXBDb3VudFJlZiIsInByZXZDb3JCbG9ja0V4cGFuZGVkUmVmIiwibiIsImxlbmd0aCIsInByZXYiLCJjdXJyZW50Iiwid2FzRXhwYW5kZWQiLCJrZXkiLCJ2YWx1ZSIsIl9vYmplY3RTcHJlYWQiLCJpc0FjdGlvbkFjdGl2ZSIsIl9UT09MX0dST1VQX01BUCRlbnRpdCIsImhhcyIsInNsdWciLCJ0b2dnbGVFbnRpdHlBY3Rpb24iLCJfVE9PTF9HUk9VUF9NQVAkZW50aXQyIiwidGFyZ2V0R3JvdXAiLCJhdmFpbGFibGUiLCJuZXh0IiwiZW50aXR5SW5kZXgiLCJpbmRleE9mIiwicHJldmlvdXNFbnRpdGllcyIsInNsaWNlIiwibmV4dEVudGl0aWVzIiwiYWN0aW9uSW5kZXgiLCJpc0N1cnJlbnRseUFjdGl2ZSIsImN1cnJlbnRFbnRpdHkiLCJjdXJyZW50QWN0aW9uIiwiX1RPT0xfR1JPVVBfTUFQJGN1cnJlIiwiX1RPT0xfR1JPVVBfTUFQJGN1cnJlMiIsImFkZCIsIkFycmF5IiwiZnJvbSIsInRvZ2dsZUNvbm5lY3RvciIsImNvbm5lY3RvclNsdWciLCJ0b2dnbGVBY3Rpb25FeHBhbmRlZCIsInRvZ2dsZU5vdGlvbkNhdGVnb3J5IiwiY2F0ZWdvcnlLZXkiLCJpc05vdGlvbkVuYWJsZWQiLCJub3Rpb25Db25uZWN0b3JTdGF0ZSIsIl92YWx1ZXMkYWN0aW9uczMiLCJjb25uZWN0b3JTdGF0ZXMiLCJmaW5kIiwicyIsIm5vdGlvbkNvbm5lY3RvckJhZGdlIiwidG9uZSIsImxhYmVsIiwiZW5hYmxlZF9mb3JfYWdlbnQiLCJjb3JBY3RpdmVUb29sc0NvdW50IiwicmVkdWNlIiwiYWNjIiwiZyIsInRvb2xzIiwidHJ1bmNhdGlvbk1lYXN1cmVLZXkiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJzb3J0Iiwiam9pbiIsInJlbmRlclRvb2xJdGVtIiwidG9vbCIsIm5hbWUiLCJkZWZhdWx0VmFsdWUiLCJkZXNjcmlwdGlvbiIsImtpbmQiLCJhY2Nlc3NLaW5kIiwicmVmIiwicmVuZGVyQWN0aW9uUm93IiwiX1RPT0xfR1JPVVBfTUFQJGVudGl0MyIsImlzQXZhaWxhYmxlIiwiYWN0aXZlIiwiZXhwYW5kZWQiLCJ0b29sc0NvdW50IiwiY2FuRXhwYW5kIiwiaXNEZWxldGUiLCJvbkhlYWRlckNsaWNrIiwib25Ub2dnbGVDbGljayIsImUiLCJzdG9wUHJvcGFnYXRpb24iLCJoZWFkZXJDb250ZW50IiwiY2xpY2thYmxlIiwib25DbGljayIsInR5cGUiLCJvcGVuIiwiZGlzYWJsZWQiLCJ3aWR0aCIsImhlaWdodCIsImNvbG9yIiwiY291bnQiLCJpc0FjdGl2ZSIsInJvdyIsInJlbmRlckVudGl0eUNhcmQiLCJncm91cHNGb3JFbnRpdHkiLCJfVE9PTF9HUk9VUF9NQVAkZW50aXQ0IiwiZmlsdGVyIiwiQm9vbGVhbiIsImVuYWJsZWRUb29scyIsImNvdW50ZXJBY3RpdmUiLCJyZW5kZXJOb3Rpb25DYXRlZ29yeSIsImNhdGVnb3J5IiwiaXNPcGVuIiwiYXMiLCJ2IiwiY2F0ZWdvcmllcyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21vbGVjdWxlcy9BYm1TZWN0aW9uL0FibUFjdGlvbnNTZWN0aW9uVjIvQWJtQWN0aW9uc1NlY3Rpb25WMi50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7XG4gIHVzZUNhbGxiYWNrLFxuICB1c2VFZmZlY3QsXG4gIHVzZU1lbW8sXG4gIHVzZVJlZixcbiAgdXNlU3RhdGUsXG4gIE1vdXNlRXZlbnQsXG4gIHR5cGUgUmVhY3ROb2RlLFxuICB0eXBlIFJlZk9iamVjdCxcbn0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gJ3JlYWN0LWkxOG5leHQnXG5cbmltcG9ydCB7IENhdGVnb3J5IH0gZnJvbSAnQHByb2plY3Rjb3IvaWNvbnMvbGliL2NvbXBvbmVudHMvQ2F0ZWdvcnknXG5pbXBvcnQgeyBDaGV2cm9uRG93biB9IGZyb20gJ0Bwcm9qZWN0Y29yL2ljb25zL2xpYi9jb21wb25lbnRzL0NoZXZyb25Eb3duJ1xuaW1wb3J0IHsgVG9vbHRpcCB9IGZyb20gJ0Bwcm9qZWN0Y29yL3Rvb2x0aXB2Mi9saWIvY29tcG9uZW50cy9Ub29sdGlwJ1xuXG5pbXBvcnQgeyBOb3Rpb25JY29uIH0gZnJvbSAnLi4vLi4vLi4vYXRvbXMvaWNvbnMvTm90aW9uSWNvbidcblxuaW1wb3J0IHsgdXNlUmVzaXplTGlzdGVuZXIgfSBmcm9tICcuLi8uLi8uLi8uLi9ob29rcy91c2VSZXNpemUnXG5pbXBvcnQgeyBNb2RhbFZhbHVlcyB9IGZyb20gJy4uLy4uLy4uLy4uL3R5cGVzL2FnZW50TW9kYWwnXG5pbXBvcnQge1xuICBBQ1RJT05fTEFCRUxfS0VZUyxcbiAgQ29ubmVjdG9yVG9vbENhdGVnb3J5LFxuICBDT1JfVE9PTF9HUk9VUFMsXG4gIEVOVElUWV9BQ1RJT05fT1JERVIsXG4gIEVOVElUWV9PUkRFUixcbiAgRW50aXR5QWN0aW9uS2V5LFxuICBFbnRpdHlLZXksXG4gIEVudGl0eVRvb2xHcm91cCxcbiAgTk9USU9OX0NPTk5FQ1RPUl9DQVRBTE9HLFxuICBOT1RJT05fQ09OTkVDVE9SX1NMVUcsXG4gIFRvb2xEZXNjcmlwdG9yLFxufSBmcm9tICcuL2NhdGFsb2cnXG5pbXBvcnQge1xuICBTQ0FjdGlvbkhlYWRlcixcbiAgU0NBY3Rpb25MYWJlbCxcbiAgU0NBY3Rpb25MYWJlbEdyb3VwLFxuICBTQ0FjdGlvblJvdyxcbiAgU0NDYXRlZ29yeUFjY29yZGlvbixcbiAgU0NDYXRlZ29yeURlc2NyaXB0aW9uLFxuICBTQ0NhdGVnb3J5SGVhZGVyLFxuICBTQ0NhdGVnb3J5VGV4dEdyb3VwLFxuICBTQ0NhdGVnb3J5VGl0bGUsXG4gIFNDQ2hldnJvbkJ1dHRvbixcbiAgU0NDb21pbmdTb29uQmFkZ2UsXG4gIFNDQ29ubmVjdG9yQ2FyZCxcbiAgU0NDb25uZWN0b3JIZWFkZXIsXG4gIFNDQ29ubmVjdG9ySGludCxcbiAgU0NDb25uZWN0b3JJY29uLFxuICBTQ0Nvbm5lY3RvcklkZW50aXR5LFxuICBTQ0Nvbm5lY3RvclJpZ2h0R3JvdXAsXG4gIFNDQ29ubmVjdG9yVGFnbGluZSxcbiAgU0NDb25uZWN0b3JUZXh0R3JvdXAsXG4gIFNDQ29ubmVjdG9yVGl0bGUsXG4gIFNDQ291bnRlcixcbiAgU0NEZWxldGVCYWRnZSxcbiAgU0NFeHBhbmRhYmxlQmxvY2tCb2R5LFxuICBTQ0VtcHR5VG9vbHMsXG4gIFNDRW50aXR5Q2FyZCxcbiAgU0NFbnRpdHlIZWFkZXIsXG4gIFNDRW50aXR5TGlzdCxcbiAgU0NFbnRpdHlUaXRsZSxcbiAgU0NIZWFkZXIsXG4gIFNDUm9vdCxcbiAgU0NTZWN0aW9uTGFiZWwsXG4gIFNDU3RhdHVzUGlsbCxcbiAgU0NTdWJ0aXRsZSxcbiAgU0NUaXRsZSxcbiAgU0NUb2dnbGUsXG4gIFNDVG9nZ2xlVGh1bWIsXG4gIFNDVG9vbERlc2NyaXB0aW9uLFxuICBTQ1Rvb2xJdGVtLFxuICBTQ1Rvb2xLaW5kQmFkZ2UsXG4gIFNDVG9vbE5hbWUsXG4gIFNDVG9vbFRleHQsXG4gIFNDVG9vbHNMaXN0LFxufSBmcm9tICcuL0FibUFjdGlvbnNTZWN0aW9uVjIuc3R5bGVzJ1xuXG50eXBlIEFibUFjdGlvbnNTZWN0aW9uVjJQcm9wcyA9IHtcbiAgdmFsdWVzOiBNb2RhbFZhbHVlc1xuICBoYW5kbGVTZXRBZ2VudFZhbHVlczogKHsga2V5LCB2YWx1ZSB9OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9KSA9PiB2b2lkXG59XG5cbmNvbnN0IEhJRVJBUkNISUNBTF9BQ1RJT05TOiBFbnRpdHlBY3Rpb25LZXlbXSA9IFsncmVhZCcsICdlZGl0JywgJ2RlbGV0ZSddXG5cbmNvbnN0IGJ1aWxkVG9vbEdyb3VwTWFwID0gKGdyb3VwczogRW50aXR5VG9vbEdyb3VwW10pOiBSZWNvcmQ8RW50aXR5S2V5LCBSZWNvcmQ8RW50aXR5QWN0aW9uS2V5LCBFbnRpdHlUb29sR3JvdXA+PiA9PiB7XG4gIGNvbnN0IG1hcCA9IHt9IGFzIFJlY29yZDxFbnRpdHlLZXksIFJlY29yZDxFbnRpdHlBY3Rpb25LZXksIEVudGl0eVRvb2xHcm91cD4+XG4gIEVOVElUWV9PUkRFUi5mb3JFYWNoKGVudGl0eSA9PiB7XG4gICAgbWFwW2VudGl0eV0gPSB7fSBhcyBSZWNvcmQ8RW50aXR5QWN0aW9uS2V5LCBFbnRpdHlUb29sR3JvdXA+XG4gIH0pXG4gIGdyb3Vwcy5mb3JFYWNoKGdyb3VwID0+IHtcbiAgICBtYXBbZ3JvdXAuZW50aXR5XVtncm91cC5hY3Rpb25dID0gZ3JvdXBcbiAgfSlcbiAgcmV0dXJuIG1hcFxufVxuXG5jb25zdCBUT09MX0dST1VQX01BUCA9IGJ1aWxkVG9vbEdyb3VwTWFwKENPUl9UT09MX0dST1VQUylcblxudHlwZSBUcnVuY2F0aW9uVG9vbHRpcFByb3BzID0ge1xuICB0aXRsZTogc3RyaW5nXG4gIC8qKiBSZWNhbGN1bGEgb3ZlcmZsb3cgYWwgY2FtYmlhciBsYXlvdXQgKHAuIGVqLiBleHBhbmQvY29sbGFwc2UgZGUgZmlsYXMpLiAqL1xuICBsYXlvdXRLZXk/OiBzdHJpbmdcbiAgY2hpbGRyZW46ICh0ZXh0UmVmOiBSZWZPYmplY3Q8SFRNTFNwYW5FbGVtZW50PikgPT4gUmVhY3ROb2RlXG59XG5cbmNvbnN0IFRydW5jYXRpb25Ub29sdGlwID0gKHsgdGl0bGUsIGxheW91dEtleSA9ICcnLCBjaGlsZHJlbiB9OiBUcnVuY2F0aW9uVG9vbHRpcFByb3BzKSA9PiB7XG4gIGNvbnN0IHRleHRSZWYgPSB1c2VSZWY8SFRNTFNwYW5FbGVtZW50PihudWxsKVxuICBjb25zdCB7IHNob3dUb29sdGlwIH0gPSB1c2VSZXNpemVMaXN0ZW5lcih0ZXh0UmVmLCBbdGl0bGUsIGxheW91dEtleV0pXG4gIHJldHVybiA8VG9vbHRpcCB0aXRsZT17c2hvd1Rvb2x0aXAgPyB0aXRsZSA6ICcnfT57Y2hpbGRyZW4odGV4dFJlZil9PC9Ub29sdGlwPlxufVxuXG5leHBvcnQgY29uc3QgQWJtQWN0aW9uc1NlY3Rpb25WMiA9ICh7IHZhbHVlcywgaGFuZGxlU2V0QWdlbnRWYWx1ZXMgfTogQWJtQWN0aW9uc1NlY3Rpb25WMlByb3BzKSA9PiB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oJ2FibV9hZ2VudF9zZWN0aW9uJylcblxuICBjb25zdCBzZWxlY3RlZFRvb2xHcm91cHMgPSB2YWx1ZXMuYWN0aW9ucz8uc2VsZWN0ZWRUb29sR3JvdXBzIHx8IFtdXG4gIGNvbnN0IHNlbGVjdGVkQ29ubmVjdG9ycyA9IHZhbHVlcy5hY3Rpb25zPy5zZWxlY3RlZENvbm5lY3RvcnMgfHwgW11cblxuICBjb25zdCBzZWxlY3RlZFRvb2xHcm91cHNTZXQgPSB1c2VNZW1vKCgpID0+IG5ldyBTZXQoc2VsZWN0ZWRUb29sR3JvdXBzKSwgW3NlbGVjdGVkVG9vbEdyb3Vwc10pXG4gIGNvbnN0IHNlbGVjdGVkQ29ubmVjdG9yc1NldCA9IHVzZU1lbW8oKCkgPT4gbmV3IFNldChzZWxlY3RlZENvbm5lY3RvcnMpLCBbc2VsZWN0ZWRDb25uZWN0b3JzXSlcblxuICBjb25zdCBbY29yQmxvY2tFeHBhbmRlZCwgc2V0Q29yQmxvY2tFeHBhbmRlZF0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2V4cGFuZGVkQWN0aW9ucywgc2V0RXhwYW5kZWRBY3Rpb25zXSA9IHVzZVN0YXRlPFNldDxzdHJpbmc+PihuZXcgU2V0KCkpXG4gIGNvbnN0IFtleHBhbmRlZE5vdGlvbkNhdGVnb3JpZXMsIHNldEV4cGFuZGVkTm90aW9uQ2F0ZWdvcmllc10gPSB1c2VTdGF0ZTxTZXQ8c3RyaW5nPj4obmV3IFNldCgpKVxuICAvKiogRXZpdGEgcmVhYnJpciBlbCBibG9xdWUgc2kgZWwgdXN1YXJpbyBsbyBjZXJyw7MgY29uIGxhIG1pc21hIGNhbnRpZGFkIGRlIHRvb2wgZ3JvdXBzIHNlbGVjY2lvbmFkb3MuICovXG4gIGNvbnN0IHByZXZDb3JUb29sR3JvdXBDb3VudFJlZiA9IHVzZVJlZjxudW1iZXIgfCBudWxsPihudWxsKVxuICAvKiogUGFyYSBkaXN0aW5ndWlyIGNpZXJyZSBtYW51YWwgZGVsIGJsb3F1ZSAoZGVzdGlsZGFyIENPUikgZGVsIG1vbnRhamUgaW5pY2lhbCBjb2xhcHNhZG8uICovXG4gIGNvbnN0IHByZXZDb3JCbG9ja0V4cGFuZGVkUmVmID0gdXNlUmVmPGJvb2xlYW4gfCBudWxsPihudWxsKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgbiA9IHNlbGVjdGVkVG9vbEdyb3Vwcy5sZW5ndGhcbiAgICBjb25zdCBwcmV2ID0gcHJldkNvclRvb2xHcm91cENvdW50UmVmLmN1cnJlbnRcbiAgICBwcmV2Q29yVG9vbEdyb3VwQ291bnRSZWYuY3VycmVudCA9IG5cblxuICAgIGlmIChuID09PSAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKHByZXYgPT09IG51bGwgJiYgbiA+IDApIHtcbiAgICAgIHNldENvckJsb2NrRXhwYW5kZWQodHJ1ZSlcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAocHJldiA9PT0gMCAmJiBuID4gMCkge1xuICAgICAgc2V0Q29yQmxvY2tFeHBhbmRlZCh0cnVlKVxuICAgIH1cbiAgfSwgW3NlbGVjdGVkVG9vbEdyb3Vwcy5sZW5ndGhdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgd2FzRXhwYW5kZWQgPSBwcmV2Q29yQmxvY2tFeHBhbmRlZFJlZi5jdXJyZW50ID09PSB0cnVlXG5cbiAgICBpZiAoIWNvckJsb2NrRXhwYW5kZWQpIHtcbiAgICAgIHNldEV4cGFuZGVkQWN0aW9ucyhuZXcgU2V0KCkpXG4gICAgICBpZiAod2FzRXhwYW5kZWQgJiYgc2VsZWN0ZWRUb29sR3JvdXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaGFuZGxlU2V0QWdlbnRWYWx1ZXMoe1xuICAgICAgICAgIGtleTogJ2FjdGlvbnMnLFxuICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAuLi52YWx1ZXMuYWN0aW9ucyxcbiAgICAgICAgICAgIHNlbGVjdGVkVG9vbEdyb3VwczogW10sXG4gICAgICAgICAgICBzZWxlY3RlZENvbm5lY3RvcnMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcmV2Q29yQmxvY2tFeHBhbmRlZFJlZi5jdXJyZW50ID0gY29yQmxvY2tFeHBhbmRlZFxuICB9LCBbY29yQmxvY2tFeHBhbmRlZCwgaGFuZGxlU2V0QWdlbnRWYWx1ZXMsIHNlbGVjdGVkQ29ubmVjdG9ycywgc2VsZWN0ZWRUb29sR3JvdXBzLmxlbmd0aCwgdmFsdWVzLmFjdGlvbnNdKVxuXG4gIGNvbnN0IGlzQWN0aW9uQWN0aXZlID0gdXNlQ2FsbGJhY2soXG4gICAgKGVudGl0eTogRW50aXR5S2V5LCBhY3Rpb246IEVudGl0eUFjdGlvbktleSkgPT4ge1xuICAgICAgY29uc3QgZ3JvdXAgPSBUT09MX0dST1VQX01BUFtlbnRpdHldPy5bYWN0aW9uXVxuICAgICAgcmV0dXJuICEhZ3JvdXAgJiYgc2VsZWN0ZWRUb29sR3JvdXBzU2V0Lmhhcyhncm91cC5zbHVnKVxuICAgIH0sXG4gICAgW3NlbGVjdGVkVG9vbEdyb3Vwc1NldF1cbiAgKVxuXG4gIGNvbnN0IHRvZ2dsZUVudGl0eUFjdGlvbiA9IHVzZUNhbGxiYWNrKFxuICAgIChlbnRpdHk6IEVudGl0eUtleSwgYWN0aW9uOiBFbnRpdHlBY3Rpb25LZXkpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldEdyb3VwID0gVE9PTF9HUk9VUF9NQVBbZW50aXR5XT8uW2FjdGlvbl1cbiAgICAgIGlmICghdGFyZ2V0R3JvdXAgfHwgIXRhcmdldEdyb3VwLmF2YWlsYWJsZSkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IG5leHQgPSBuZXcgU2V0KHNlbGVjdGVkVG9vbEdyb3VwcylcbiAgICAgIGNvbnN0IGVudGl0eUluZGV4ID0gRU5USVRZX09SREVSLmluZGV4T2YoZW50aXR5KVxuICAgICAgY29uc3QgcHJldmlvdXNFbnRpdGllcyA9IEVOVElUWV9PUkRFUi5zbGljZSgwLCBlbnRpdHlJbmRleCArIDEpXG4gICAgICBjb25zdCBuZXh0RW50aXRpZXMgPSBFTlRJVFlfT1JERVIuc2xpY2UoZW50aXR5SW5kZXgpXG4gICAgICBjb25zdCBhY3Rpb25JbmRleCA9IEhJRVJBUkNISUNBTF9BQ1RJT05TLmluZGV4T2YoYWN0aW9uKVxuICAgICAgY29uc3QgaXNDdXJyZW50bHlBY3RpdmUgPSBuZXh0Lmhhcyh0YXJnZXRHcm91cC5zbHVnKVxuXG4gICAgICBpZiAoaXNDdXJyZW50bHlBY3RpdmUpIHtcbiAgICAgICAgbmV4dEVudGl0aWVzLmZvckVhY2goY3VycmVudEVudGl0eSA9PiB7XG4gICAgICAgICAgSElFUkFSQ0hJQ0FMX0FDVElPTlMuc2xpY2UoYWN0aW9uSW5kZXgpLmZvckVhY2goY3VycmVudEFjdGlvbiA9PiB7XG4gICAgICAgICAgICBjb25zdCBncm91cCA9IFRPT0xfR1JPVVBfTUFQW2N1cnJlbnRFbnRpdHldPy5bY3VycmVudEFjdGlvbl1cbiAgICAgICAgICAgIGlmIChncm91cD8uYXZhaWxhYmxlKSBuZXh0LmRlbGV0ZShncm91cC5zbHVnKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmV2aW91c0VudGl0aWVzLmZvckVhY2goY3VycmVudEVudGl0eSA9PiB7XG4gICAgICAgICAgSElFUkFSQ0hJQ0FMX0FDVElPTlMuc2xpY2UoMCwgYWN0aW9uSW5kZXggKyAxKS5mb3JFYWNoKGN1cnJlbnRBY3Rpb24gPT4ge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBUT09MX0dST1VQX01BUFtjdXJyZW50RW50aXR5XT8uW2N1cnJlbnRBY3Rpb25dXG4gICAgICAgICAgICBpZiAoZ3JvdXA/LmF2YWlsYWJsZSkgbmV4dC5hZGQoZ3JvdXAuc2x1ZylcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBoYW5kbGVTZXRBZ2VudFZhbHVlcyh7XG4gICAgICAgIGtleTogJ2FjdGlvbnMnLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIC4uLnZhbHVlcy5hY3Rpb25zLFxuICAgICAgICAgIHNlbGVjdGVkVG9vbEdyb3VwczogQXJyYXkuZnJvbShuZXh0KSxcbiAgICAgICAgICBzZWxlY3RlZENvbm5lY3RvcnMsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0sXG4gICAgW2hhbmRsZVNldEFnZW50VmFsdWVzLCBzZWxlY3RlZENvbm5lY3RvcnMsIHNlbGVjdGVkVG9vbEdyb3VwcywgdmFsdWVzLmFjdGlvbnNdXG4gIClcblxuICBjb25zdCB0b2dnbGVDb25uZWN0b3IgPSB1c2VDYWxsYmFjayhcbiAgICAoY29ubmVjdG9yU2x1Zzogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBuZXh0ID0gbmV3IFNldChzZWxlY3RlZENvbm5lY3RvcnMpXG4gICAgICBpZiAobmV4dC5oYXMoY29ubmVjdG9yU2x1ZykpIHtcbiAgICAgICAgbmV4dC5kZWxldGUoY29ubmVjdG9yU2x1ZylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHQuYWRkKGNvbm5lY3RvclNsdWcpXG4gICAgICB9XG4gICAgICBoYW5kbGVTZXRBZ2VudFZhbHVlcyh7XG4gICAgICAgIGtleTogJ2FjdGlvbnMnLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIC4uLnZhbHVlcy5hY3Rpb25zLFxuICAgICAgICAgIHNlbGVjdGVkVG9vbEdyb3VwcyxcbiAgICAgICAgICBzZWxlY3RlZENvbm5lY3RvcnM6IEFycmF5LmZyb20obmV4dCksXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0sXG4gICAgW2hhbmRsZVNldEFnZW50VmFsdWVzLCBzZWxlY3RlZENvbm5lY3RvcnMsIHNlbGVjdGVkVG9vbEdyb3VwcywgdmFsdWVzLmFjdGlvbnNdXG4gIClcblxuICBjb25zdCB0b2dnbGVBY3Rpb25FeHBhbmRlZCA9IHVzZUNhbGxiYWNrKChzbHVnOiBzdHJpbmcpID0+IHtcbiAgICBzZXRFeHBhbmRlZEFjdGlvbnMocHJldiA9PiB7XG4gICAgICBjb25zdCBuZXh0ID0gbmV3IFNldChwcmV2KVxuICAgICAgaWYgKG5leHQuaGFzKHNsdWcpKSBuZXh0LmRlbGV0ZShzbHVnKVxuICAgICAgZWxzZSBuZXh0LmFkZChzbHVnKVxuICAgICAgcmV0dXJuIG5leHRcbiAgICB9KVxuICB9LCBbXSlcblxuICBjb25zdCB0b2dnbGVOb3Rpb25DYXRlZ29yeSA9IHVzZUNhbGxiYWNrKChjYXRlZ29yeUtleTogc3RyaW5nKSA9PiB7XG4gICAgc2V0RXhwYW5kZWROb3Rpb25DYXRlZ29yaWVzKHByZXYgPT4ge1xuICAgICAgY29uc3QgbmV4dCA9IG5ldyBTZXQocHJldilcbiAgICAgIGlmIChuZXh0LmhhcyhjYXRlZ29yeUtleSkpIG5leHQuZGVsZXRlKGNhdGVnb3J5S2V5KVxuICAgICAgZWxzZSBuZXh0LmFkZChjYXRlZ29yeUtleSlcbiAgICAgIHJldHVybiBuZXh0XG4gICAgfSlcbiAgfSwgW10pXG5cbiAgY29uc3QgaXNOb3Rpb25FbmFibGVkID0gc2VsZWN0ZWRDb25uZWN0b3JzU2V0LmhhcyhOT1RJT05fQ09OTkVDVE9SX1NMVUcpXG5cbiAgY29uc3Qgbm90aW9uQ29ubmVjdG9yU3RhdGUgPSB1c2VNZW1vKFxuICAgICgpID0+IHZhbHVlcy5hY3Rpb25zPy5jb25uZWN0b3JTdGF0ZXM/LmZpbmQocyA9PiBzLnNsdWcgPT09IE5PVElPTl9DT05ORUNUT1JfU0xVRyksXG4gICAgW3ZhbHVlcy5hY3Rpb25zPy5jb25uZWN0b3JTdGF0ZXNdXG4gIClcblxuICBjb25zdCBub3Rpb25Db25uZWN0b3JCYWRnZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghaXNOb3Rpb25FbmFibGVkKSB7XG4gICAgICByZXR1cm4geyB0b25lOiAnbmV1dHJhbCcgYXMgY29uc3QsIGxhYmVsOiB0KCdhY3Rpb25zU2VjdGlvbi52Mi5jb25uZWN0b3JTdGF0dXMuaW5hY3RpdmUnKSB9XG4gICAgfVxuICAgIGlmIChub3Rpb25Db25uZWN0b3JTdGF0ZSkge1xuICAgICAgaWYgKG5vdGlvbkNvbm5lY3RvclN0YXRlLmVuYWJsZWRfZm9yX2FnZW50KSB7XG4gICAgICAgIHJldHVybiB7IHRvbmU6ICdzdWNjZXNzJyBhcyBjb25zdCwgbGFiZWw6IHQoJ2FjdGlvbnNTZWN0aW9uLnYyLmNvbm5lY3RvclN0YXR1cy5lbmFibGVkJykgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgdG9uZTogJ3BlbmRpbmcnIGFzIGNvbnN0LCBsYWJlbDogdCgnYWN0aW9uc1NlY3Rpb24udjIuY29ubmVjdG9yU3RhdHVzLmVuYWJsZWRQZW5kaW5nQXV0aCcpIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgdG9uZTogJ3BlbmRpbmcnIGFzIGNvbnN0LCBsYWJlbDogdCgnYWN0aW9uc1NlY3Rpb24udjIuY29ubmVjdG9yU3RhdHVzLmVuYWJsZWRQZW5kaW5nQXV0aCcpIH1cbiAgfSwgW2lzTm90aW9uRW5hYmxlZCwgbm90aW9uQ29ubmVjdG9yU3RhdGUsIHRdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFpc05vdGlvbkVuYWJsZWQpIHtcbiAgICAgIHNldEV4cGFuZGVkTm90aW9uQ2F0ZWdvcmllcyhuZXcgU2V0KCkpXG4gICAgfVxuICB9LCBbaXNOb3Rpb25FbmFibGVkXSlcblxuICBjb25zdCBjb3JBY3RpdmVUb29sc0NvdW50ID0gdXNlTWVtbyhcbiAgICAoKSA9PiBDT1JfVE9PTF9HUk9VUFMucmVkdWNlKChhY2MsIGcpID0+IGFjYyArIChzZWxlY3RlZFRvb2xHcm91cHNTZXQuaGFzKGcuc2x1ZykgPyBnLnRvb2xzLmxlbmd0aCA6IDApLCAwKSxcbiAgICBbc2VsZWN0ZWRUb29sR3JvdXBzU2V0XVxuICApXG5cbiAgY29uc3QgdHJ1bmNhdGlvbk1lYXN1cmVLZXkgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBgJHtjb3JCbG9ja0V4cGFuZGVkID8gJzEnIDogJzAnfSMke1suLi5leHBhbmRlZEFjdGlvbnNdLnNvcnQoKS5qb2luKCd8Jyl9IyR7Wy4uLmV4cGFuZGVkTm90aW9uQ2F0ZWdvcmllc10uc29ydCgpLmpvaW4oJ3wnKX1gLFxuICAgIFtjb3JCbG9ja0V4cGFuZGVkLCBleHBhbmRlZEFjdGlvbnMsIGV4cGFuZGVkTm90aW9uQ2F0ZWdvcmllc11cbiAgKVxuXG4gIGNvbnN0IHJlbmRlclRvb2xJdGVtID0gKHRvb2w6IFRvb2xEZXNjcmlwdG9yKSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IHQoYGFjdGlvbnNTZWN0aW9uLnYyLmNhdGFsb2cudG9vbHMuJHt0b29sLnNsdWd9Lm5hbWVgLCB7IGRlZmF1bHRWYWx1ZTogdG9vbC5uYW1lIH0pXG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSB0KGBhY3Rpb25zU2VjdGlvbi52Mi5jYXRhbG9nLnRvb2xzLiR7dG9vbC5zbHVnfS5kZXNjcmlwdGlvbmAsIHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogdG9vbC5kZXNjcmlwdGlvbixcbiAgICB9KVxuICAgIHJldHVybiAoXG4gICAgICA8U0NUb29sSXRlbSBrZXk9e3Rvb2wuc2x1Z30+XG4gICAgICAgIDxTQ1Rvb2xLaW5kQmFkZ2Uga2luZD17dG9vbC5hY2Nlc3NLaW5kfT57dChgYWN0aW9uc1NlY3Rpb24udjIuYWNjZXNzS2luZC4ke3Rvb2wuYWNjZXNzS2luZH1gKX08L1NDVG9vbEtpbmRCYWRnZT5cbiAgICAgICAgPFNDVG9vbFRleHQ+XG4gICAgICAgICAgPFNDVG9vbE5hbWU+e25hbWV9PC9TQ1Rvb2xOYW1lPlxuICAgICAgICAgIDxUcnVuY2F0aW9uVG9vbHRpcCB0aXRsZT17ZGVzY3JpcHRpb259IGxheW91dEtleT17dHJ1bmNhdGlvbk1lYXN1cmVLZXl9PlxuICAgICAgICAgICAge3RleHRSZWYgPT4gPFNDVG9vbERlc2NyaXB0aW9uIHJlZj17dGV4dFJlZn0+e2Rlc2NyaXB0aW9ufTwvU0NUb29sRGVzY3JpcHRpb24+fVxuICAgICAgICAgIDwvVHJ1bmNhdGlvblRvb2x0aXA+XG4gICAgICAgIDwvU0NUb29sVGV4dD5cbiAgICAgIDwvU0NUb29sSXRlbT5cbiAgICApXG4gIH1cblxuICBjb25zdCByZW5kZXJBY3Rpb25Sb3cgPSAoZW50aXR5OiBFbnRpdHlLZXksIGFjdGlvbjogRW50aXR5QWN0aW9uS2V5KSA9PiB7XG4gICAgY29uc3QgZ3JvdXAgPSBUT09MX0dST1VQX01BUFtlbnRpdHldPy5bYWN0aW9uXVxuICAgIGlmICghZ3JvdXApIHJldHVybiBudWxsXG4gICAgY29uc3QgaXNBdmFpbGFibGUgPSBncm91cC5hdmFpbGFibGVcbiAgICBjb25zdCBhY3RpdmUgPSBpc0FjdGlvbkFjdGl2ZShlbnRpdHksIGFjdGlvbilcbiAgICBjb25zdCBleHBhbmRlZCA9IGV4cGFuZGVkQWN0aW9ucy5oYXMoZ3JvdXAuc2x1ZylcbiAgICBjb25zdCB0b29sc0NvdW50ID0gZ3JvdXAudG9vbHMubGVuZ3RoXG4gICAgY29uc3QgY2FuRXhwYW5kID0gaXNBdmFpbGFibGUgJiYgdG9vbHNDb3VudCA+IDBcbiAgICBjb25zdCBpc0RlbGV0ZSA9IGFjdGlvbiA9PT0gJ2RlbGV0ZScgJiYgYWN0aXZlXG5cbiAgICBjb25zdCBvbkhlYWRlckNsaWNrID0gKCkgPT4ge1xuICAgICAgaWYgKGNhbkV4cGFuZCkgdG9nZ2xlQWN0aW9uRXhwYW5kZWQoZ3JvdXAuc2x1ZylcbiAgICB9XG5cbiAgICBjb25zdCBvblRvZ2dsZUNsaWNrID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgIGlmIChpc0F2YWlsYWJsZSkgdG9nZ2xlRW50aXR5QWN0aW9uKGVudGl0eSwgYWN0aW9uKVxuICAgIH1cblxuICAgIGNvbnN0IGhlYWRlckNvbnRlbnQgPSAoXG4gICAgICA8U0NBY3Rpb25IZWFkZXIgY2xpY2thYmxlPXtjYW5FeHBhbmR9IG9uQ2xpY2s9e29uSGVhZGVyQ2xpY2t9PlxuICAgICAgICA8U0NDaGV2cm9uQnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgb3Blbj17ZXhwYW5kZWR9XG4gICAgICAgICAgZGlzYWJsZWQ9eyFjYW5FeHBhbmR9XG4gICAgICAgICAgb25DbGljaz17ZSA9PiB7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgICBpZiAoY2FuRXhwYW5kKSB0b2dnbGVBY3Rpb25FeHBhbmRlZChncm91cC5zbHVnKVxuICAgICAgICAgIH19XG4gICAgICAgICAgYXJpYS1leHBhbmRlZD17ZXhwYW5kZWR9XG4gICAgICAgICAgYXJpYS1sYWJlbD17ZXhwYW5kZWQgPyB0KCdhY3Rpb25zU2VjdGlvbi52Mi5oaWRlVG9vbHMnKSA6IHQoJ2FjdGlvbnNTZWN0aW9uLnYyLnZpZXdUb29scycpfVxuICAgICAgICA+XG4gICAgICAgICAgPENoZXZyb25Eb3duIHdpZHRoPVwiMTJweFwiIGhlaWdodD1cIjEycHhcIiBjb2xvcj1cImN1cnJlbnRDb2xvclwiIC8+XG4gICAgICAgIDwvU0NDaGV2cm9uQnV0dG9uPlxuXG4gICAgICAgIDxTQ0FjdGlvbkxhYmVsR3JvdXA+XG4gICAgICAgICAgPFNDQWN0aW9uTGFiZWw+e3QoQUNUSU9OX0xBQkVMX0tFWVNbYWN0aW9uXSl9PC9TQ0FjdGlvbkxhYmVsPlxuICAgICAgICAgIHshaXNBdmFpbGFibGUgJiYgPFNDQ29taW5nU29vbkJhZGdlPnt0KCdhY3Rpb25zU2VjdGlvbi52Mi5jb21pbmdTb29uJyl9PC9TQ0NvbWluZ1Nvb25CYWRnZT59XG4gICAgICAgICAge2lzQXZhaWxhYmxlICYmIChcbiAgICAgICAgICAgIDxTQ0NvdW50ZXIgYWN0aXZlPXthY3RpdmV9Pnt0KCdhY3Rpb25zU2VjdGlvbi52Mi50b29sc0NvdW50JywgeyBjb3VudDogdG9vbHNDb3VudCB9KX08L1NDQ291bnRlcj5cbiAgICAgICAgICApfVxuICAgICAgICAgIHtpc0RlbGV0ZSAmJiA8U0NEZWxldGVCYWRnZT57dCgnYWN0aW9uc1NlY3Rpb24udjIuZGVsZXRlV2FybmluZ0lubGluZScpfTwvU0NEZWxldGVCYWRnZT59XG4gICAgICAgIDwvU0NBY3Rpb25MYWJlbEdyb3VwPlxuXG4gICAgICAgIDxTQ1RvZ2dsZVxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGlzQWN0aXZlPXthY3RpdmV9XG4gICAgICAgICAgZGlzYWJsZWQ9eyFpc0F2YWlsYWJsZX1cbiAgICAgICAgICBvbkNsaWNrPXtvblRvZ2dsZUNsaWNrfVxuICAgICAgICAgIGFyaWEtcHJlc3NlZD17YWN0aXZlfVxuICAgICAgICAgIGFyaWEtbGFiZWw9e2Ake3QoYGFjdGlvbnNTZWN0aW9uLmVudGl0aWVzLiR7ZW50aXR5fWApfSDCtyAke3QoQUNUSU9OX0xBQkVMX0tFWVNbYWN0aW9uXSl9YH1cbiAgICAgICAgPlxuICAgICAgICAgIDxTQ1RvZ2dsZVRodW1iIC8+XG4gICAgICAgIDwvU0NUb2dnbGU+XG4gICAgICA8L1NDQWN0aW9uSGVhZGVyPlxuICAgIClcblxuICAgIGNvbnN0IHJvdyA9IChcbiAgICAgIDxTQ0FjdGlvblJvdyBrZXk9e2Ake2VudGl0eX0tJHthY3Rpb259YH0gZGlzYWJsZWQ9eyFpc0F2YWlsYWJsZX0+XG4gICAgICAgIHtoZWFkZXJDb250ZW50fVxuICAgICAgICB7ZXhwYW5kZWQgJiYgY2FuRXhwYW5kICYmIDxTQ1Rvb2xzTGlzdD57Z3JvdXAudG9vbHMubWFwKHRvb2wgPT4gcmVuZGVyVG9vbEl0ZW0odG9vbCkpfTwvU0NUb29sc0xpc3Q+fVxuICAgICAgPC9TQ0FjdGlvblJvdz5cbiAgICApXG5cbiAgICBpZiAoIWlzQXZhaWxhYmxlKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8VG9vbHRpcCBrZXk9e2Ake2VudGl0eX0tJHthY3Rpb259YH0gdGl0bGU9e3QoJ2FjdGlvbnNTZWN0aW9uLnYyLmNvbWluZ1Nvb25IaW50Jyl9PlxuICAgICAgICAgIDxkaXY+e3Jvd308L2Rpdj5cbiAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiByb3dcbiAgfVxuXG4gIGNvbnN0IHJlbmRlckVudGl0eUNhcmQgPSAoZW50aXR5OiBFbnRpdHlLZXkpID0+IHtcbiAgICBjb25zdCBncm91cHNGb3JFbnRpdHkgPSBFTlRJVFlfQUNUSU9OX09SREVSLm1hcChhY3Rpb24gPT4gVE9PTF9HUk9VUF9NQVBbZW50aXR5XT8uW2FjdGlvbl0pLmZpbHRlcihcbiAgICAgIChncm91cCk6IGdyb3VwIGlzIEVudGl0eVRvb2xHcm91cCA9PiBCb29sZWFuKGdyb3VwKVxuICAgIClcbiAgICBjb25zdCBlbmFibGVkVG9vbHMgPSBncm91cHNGb3JFbnRpdHkucmVkdWNlKFxuICAgICAgKGFjYywgZ3JvdXApID0+IGFjYyArIChzZWxlY3RlZFRvb2xHcm91cHNTZXQuaGFzKGdyb3VwLnNsdWcpID8gZ3JvdXAudG9vbHMubGVuZ3RoIDogMCksXG4gICAgICAwXG4gICAgKVxuICAgIGNvbnN0IGNvdW50ZXJBY3RpdmUgPSBlbmFibGVkVG9vbHMgPiAwXG5cbiAgICByZXR1cm4gKFxuICAgICAgPFNDRW50aXR5Q2FyZCBrZXk9e2VudGl0eX0+XG4gICAgICAgIDxTQ0VudGl0eUhlYWRlcj5cbiAgICAgICAgICA8U0NFbnRpdHlUaXRsZT57dChgYWN0aW9uc1NlY3Rpb24uZW50aXRpZXMuJHtlbnRpdHl9YCl9PC9TQ0VudGl0eVRpdGxlPlxuICAgICAgICAgIDxTQ0NvdW50ZXIgYWN0aXZlPXtjb3VudGVyQWN0aXZlfT57dCgnYWN0aW9uc1NlY3Rpb24udjIudG9vbHNDb3VudCcsIHsgY291bnQ6IGVuYWJsZWRUb29scyB9KX08L1NDQ291bnRlcj5cbiAgICAgICAgPC9TQ0VudGl0eUhlYWRlcj5cbiAgICAgICAge0VOVElUWV9BQ1RJT05fT1JERVIubWFwKGFjdGlvbiA9PiByZW5kZXJBY3Rpb25Sb3coZW50aXR5LCBhY3Rpb24pKX1cbiAgICAgIDwvU0NFbnRpdHlDYXJkPlxuICAgIClcbiAgfVxuXG4gIGNvbnN0IHJlbmRlck5vdGlvbkNhdGVnb3J5ID0gKGNhdGVnb3J5OiBDb25uZWN0b3JUb29sQ2F0ZWdvcnkpID0+IHtcbiAgICBjb25zdCBpc09wZW4gPSBleHBhbmRlZE5vdGlvbkNhdGVnb3JpZXMuaGFzKGNhdGVnb3J5LmtleSlcbiAgICBjb25zdCB0b29sc0NvdW50ID0gY2F0ZWdvcnkudG9vbHMubGVuZ3RoXG4gICAgY29uc3QgbGFiZWwgPSB0KGBhY3Rpb25zU2VjdGlvbi52Mi5jYXRhbG9nLm5vdGlvbkNhdGVnb3JpZXMuJHtjYXRlZ29yeS5rZXl9LmxhYmVsYCwge1xuICAgICAgZGVmYXVsdFZhbHVlOiBjYXRlZ29yeS5sYWJlbCxcbiAgICB9KVxuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gdChgYWN0aW9uc1NlY3Rpb24udjIuY2F0YWxvZy5ub3Rpb25DYXRlZ29yaWVzLiR7Y2F0ZWdvcnkua2V5fS5kZXNjcmlwdGlvbmAsIHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogY2F0ZWdvcnkuZGVzY3JpcHRpb24sXG4gICAgfSlcbiAgICByZXR1cm4gKFxuICAgICAgPFNDQ2F0ZWdvcnlBY2NvcmRpb24ga2V5PXtjYXRlZ29yeS5rZXl9PlxuICAgICAgICA8U0NDYXRlZ29yeUhlYWRlciB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17KCkgPT4gdG9nZ2xlTm90aW9uQ2F0ZWdvcnkoY2F0ZWdvcnkua2V5KX0gYXJpYS1leHBhbmRlZD17aXNPcGVufT5cbiAgICAgICAgICA8U0NDaGV2cm9uQnV0dG9uIGFzPVwic3BhblwiIG9wZW49e2lzT3Blbn0+XG4gICAgICAgICAgICA8Q2hldnJvbkRvd24gd2lkdGg9XCIxMnB4XCIgaGVpZ2h0PVwiMTJweFwiIGNvbG9yPVwiY3VycmVudENvbG9yXCIgLz5cbiAgICAgICAgICA8L1NDQ2hldnJvbkJ1dHRvbj5cbiAgICAgICAgICA8U0NDYXRlZ29yeVRleHRHcm91cD5cbiAgICAgICAgICAgIDxTQ0NhdGVnb3J5VGl0bGU+e2xhYmVsfTwvU0NDYXRlZ29yeVRpdGxlPlxuICAgICAgICAgICAgPFRydW5jYXRpb25Ub29sdGlwIHRpdGxlPXtkZXNjcmlwdGlvbn0gbGF5b3V0S2V5PXt0cnVuY2F0aW9uTWVhc3VyZUtleX0+XG4gICAgICAgICAgICAgIHt0ZXh0UmVmID0+IDxTQ0NhdGVnb3J5RGVzY3JpcHRpb24gcmVmPXt0ZXh0UmVmfT57ZGVzY3JpcHRpb259PC9TQ0NhdGVnb3J5RGVzY3JpcHRpb24+fVxuICAgICAgICAgICAgPC9UcnVuY2F0aW9uVG9vbHRpcD5cbiAgICAgICAgICA8L1NDQ2F0ZWdvcnlUZXh0R3JvdXA+XG4gICAgICAgICAgPFNDQ291bnRlciBhY3RpdmU9e2ZhbHNlfT5cbiAgICAgICAgICAgIHt0KCdhY3Rpb25zU2VjdGlvbi52Mi5ub3Rpb24uY2F0ZWdvcnlUb29sc0NvdW50JywgeyBjb3VudDogdG9vbHNDb3VudCB9KX1cbiAgICAgICAgICA8L1NDQ291bnRlcj5cbiAgICAgICAgPC9TQ0NhdGVnb3J5SGVhZGVyPlxuICAgICAgICB7aXNPcGVuICYmXG4gICAgICAgICAgKHRvb2xzQ291bnQgPiAwID8gKFxuICAgICAgICAgICAgPFNDVG9vbHNMaXN0PntjYXRlZ29yeS50b29scy5tYXAodG9vbCA9PiByZW5kZXJUb29sSXRlbSh0b29sKSl9PC9TQ1Rvb2xzTGlzdD5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPFNDRW1wdHlUb29scz57dCgnYWN0aW9uc1NlY3Rpb24udjIuZW1wdHlUb29scycpfTwvU0NFbXB0eVRvb2xzPlxuICAgICAgICAgICkpfVxuICAgICAgPC9TQ0NhdGVnb3J5QWNjb3JkaW9uPlxuICAgIClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFNDUm9vdD5cbiAgICAgIDxTQ0hlYWRlcj5cbiAgICAgICAgPFNDVGl0bGU+e3QoJ2FjdGlvbnNTZWN0aW9uLnYyLnNlY3Rpb25UaXRsZScpfTwvU0NUaXRsZT5cbiAgICAgICAgPFNDU3VidGl0bGU+e3QoJ2FjdGlvbnNTZWN0aW9uLnYyLnNlY3Rpb25TdWJ0aXRsZScpfTwvU0NTdWJ0aXRsZT5cbiAgICAgIDwvU0NIZWFkZXI+XG5cbiAgICAgIDxTQ1NlY3Rpb25MYWJlbD57dCgnYWN0aW9uc1NlY3Rpb24udjIuaW50ZXJuYWxCbG9ja1RpdGxlJyl9PC9TQ1NlY3Rpb25MYWJlbD5cblxuICAgICAgPFNDQ29ubmVjdG9yQ2FyZD5cbiAgICAgICAgPFNDQ29ubmVjdG9ySGVhZGVyPlxuICAgICAgICAgIDxTQ0Nvbm5lY3RvcklkZW50aXR5PlxuICAgICAgICAgICAgPFNDQ29ubmVjdG9ySWNvbiBhcmlhLWhpZGRlbj5cbiAgICAgICAgICAgICAgPENhdGVnb3J5IHdpZHRoPXsxOH0gaGVpZ2h0PXsxOH0gLz5cbiAgICAgICAgICAgIDwvU0NDb25uZWN0b3JJY29uPlxuICAgICAgICAgICAgPFNDQ29ubmVjdG9yVGV4dEdyb3VwPlxuICAgICAgICAgICAgICA8VHJ1bmNhdGlvblRvb2x0aXAgdGl0bGU9e3QoJ2FjdGlvbnNTZWN0aW9uLnYyLmludGVybmFsQmxvY2tUaXRsZScpfSBsYXlvdXRLZXk9e3RydW5jYXRpb25NZWFzdXJlS2V5fT5cbiAgICAgICAgICAgICAgICB7dGV4dFJlZiA9PiAoXG4gICAgICAgICAgICAgICAgICA8U0NDb25uZWN0b3JUaXRsZSByZWY9e3RleHRSZWZ9Pnt0KCdhY3Rpb25zU2VjdGlvbi52Mi5pbnRlcm5hbEJsb2NrVGl0bGUnKX08L1NDQ29ubmVjdG9yVGl0bGU+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9UcnVuY2F0aW9uVG9vbHRpcD5cbiAgICAgICAgICAgICAgPFRydW5jYXRpb25Ub29sdGlwIHRpdGxlPXt0KCdhY3Rpb25zU2VjdGlvbi52Mi5pbnRlcm5hbEJsb2NrU3VidGl0bGUnKX0gbGF5b3V0S2V5PXt0cnVuY2F0aW9uTWVhc3VyZUtleX0+XG4gICAgICAgICAgICAgICAge3RleHRSZWYgPT4gKFxuICAgICAgICAgICAgICAgICAgPFNDQ29ubmVjdG9yVGFnbGluZSByZWY9e3RleHRSZWZ9Pnt0KCdhY3Rpb25zU2VjdGlvbi52Mi5pbnRlcm5hbEJsb2NrU3VidGl0bGUnKX08L1NDQ29ubmVjdG9yVGFnbGluZT5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L1RydW5jYXRpb25Ub29sdGlwPlxuICAgICAgICAgICAgPC9TQ0Nvbm5lY3RvclRleHRHcm91cD5cbiAgICAgICAgICA8L1NDQ29ubmVjdG9ySWRlbnRpdHk+XG4gICAgICAgICAgPFNDQ29ubmVjdG9yUmlnaHRHcm91cD5cbiAgICAgICAgICAgIDxTQ0NvdW50ZXIgYWN0aXZlPXtjb3JBY3RpdmVUb29sc0NvdW50ID4gMH0+XG4gICAgICAgICAgICAgIHt0KCdhY3Rpb25zU2VjdGlvbi52Mi50b29sc0NvdW50JywgeyBjb3VudDogY29yQWN0aXZlVG9vbHNDb3VudCB9KX1cbiAgICAgICAgICAgIDwvU0NDb3VudGVyPlxuICAgICAgICAgICAgPFNDVG9nZ2xlXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBpc0FjdGl2ZT17Y29yQmxvY2tFeHBhbmRlZH1cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Q29yQmxvY2tFeHBhbmRlZCh2ID0+ICF2KX1cbiAgICAgICAgICAgICAgYXJpYS1wcmVzc2VkPXtjb3JCbG9ja0V4cGFuZGVkfVxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtcbiAgICAgICAgICAgICAgICBjb3JCbG9ja0V4cGFuZGVkXG4gICAgICAgICAgICAgICAgICA/IHQoJ2FjdGlvbnNTZWN0aW9uLnYyLmV4cGFuZENvckRldGFpbHNBcmlhT2ZmJylcbiAgICAgICAgICAgICAgICAgIDogdCgnYWN0aW9uc1NlY3Rpb24udjIuZXhwYW5kQ29yRGV0YWlsc0FyaWFPbicpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPFNDVG9nZ2xlVGh1bWIgLz5cbiAgICAgICAgICAgIDwvU0NUb2dnbGU+XG4gICAgICAgICAgPC9TQ0Nvbm5lY3RvclJpZ2h0R3JvdXA+XG4gICAgICAgIDwvU0NDb25uZWN0b3JIZWFkZXI+XG4gICAgICAgIHshY29yQmxvY2tFeHBhbmRlZCAmJiA8U0NDb25uZWN0b3JIaW50Pnt0KCdhY3Rpb25zU2VjdGlvbi52Mi5jb3JDb2xsYXBzZWRIaW50Jyl9PC9TQ0Nvbm5lY3RvckhpbnQ+fVxuICAgICAgICB7Y29yQmxvY2tFeHBhbmRlZCAmJiAoXG4gICAgICAgICAgPFNDRXhwYW5kYWJsZUJsb2NrQm9keT5cbiAgICAgICAgICAgIDxTQ0VudGl0eUxpc3Q+e0VOVElUWV9PUkRFUi5tYXAoZW50aXR5ID0+IHJlbmRlckVudGl0eUNhcmQoZW50aXR5KSl9PC9TQ0VudGl0eUxpc3Q+XG4gICAgICAgICAgPC9TQ0V4cGFuZGFibGVCbG9ja0JvZHk+XG4gICAgICAgICl9XG4gICAgICA8L1NDQ29ubmVjdG9yQ2FyZD5cblxuICAgICAgPFNDU2VjdGlvbkxhYmVsPnt0KCdhY3Rpb25zU2VjdGlvbi52Mi5leHRlcm5hbEJsb2NrVGl0bGUnKX08L1NDU2VjdGlvbkxhYmVsPlxuXG4gICAgICA8U0NDb25uZWN0b3JDYXJkPlxuICAgICAgICA8U0NDb25uZWN0b3JIZWFkZXI+XG4gICAgICAgICAgPFNDQ29ubmVjdG9ySWRlbnRpdHk+XG4gICAgICAgICAgICA8U0NDb25uZWN0b3JJY29uIGFyaWEtaGlkZGVuPlxuICAgICAgICAgICAgICA8Tm90aW9uSWNvbiB3aWR0aD17MTh9IGhlaWdodD17MTh9IC8+XG4gICAgICAgICAgICA8L1NDQ29ubmVjdG9ySWNvbj5cbiAgICAgICAgICAgIDxTQ0Nvbm5lY3RvclRleHRHcm91cD5cbiAgICAgICAgICAgICAgPFRydW5jYXRpb25Ub29sdGlwIHRpdGxlPXtOT1RJT05fQ09OTkVDVE9SX0NBVEFMT0cubmFtZX0gbGF5b3V0S2V5PXt0cnVuY2F0aW9uTWVhc3VyZUtleX0+XG4gICAgICAgICAgICAgICAge3RleHRSZWYgPT4gPFNDQ29ubmVjdG9yVGl0bGUgcmVmPXt0ZXh0UmVmfT57Tk9USU9OX0NPTk5FQ1RPUl9DQVRBTE9HLm5hbWV9PC9TQ0Nvbm5lY3RvclRpdGxlPn1cbiAgICAgICAgICAgICAgPC9UcnVuY2F0aW9uVG9vbHRpcD5cbiAgICAgICAgICAgICAgPFRydW5jYXRpb25Ub29sdGlwIHRpdGxlPXt0KCdhY3Rpb25zU2VjdGlvbi52Mi5ub3Rpb24udGFnbGluZScpfSBsYXlvdXRLZXk9e3RydW5jYXRpb25NZWFzdXJlS2V5fT5cbiAgICAgICAgICAgICAgICB7dGV4dFJlZiA9PiAoXG4gICAgICAgICAgICAgICAgICA8U0NDb25uZWN0b3JUYWdsaW5lIHJlZj17dGV4dFJlZn0+e3QoJ2FjdGlvbnNTZWN0aW9uLnYyLm5vdGlvbi50YWdsaW5lJyl9PC9TQ0Nvbm5lY3RvclRhZ2xpbmU+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9UcnVuY2F0aW9uVG9vbHRpcD5cbiAgICAgICAgICAgIDwvU0NDb25uZWN0b3JUZXh0R3JvdXA+XG4gICAgICAgICAgPC9TQ0Nvbm5lY3RvcklkZW50aXR5PlxuICAgICAgICAgIDxTQ0Nvbm5lY3RvclJpZ2h0R3JvdXA+XG4gICAgICAgICAgICA8U0NTdGF0dXNQaWxsIHRvbmU9e25vdGlvbkNvbm5lY3RvckJhZGdlLnRvbmV9Pntub3Rpb25Db25uZWN0b3JCYWRnZS5sYWJlbH08L1NDU3RhdHVzUGlsbD5cbiAgICAgICAgICAgIDxTQ1RvZ2dsZVxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgaXNBY3RpdmU9e2lzTm90aW9uRW5hYmxlZH1cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gdG9nZ2xlQ29ubmVjdG9yKE5PVElPTl9DT05ORUNUT1JfU0xVRyl9XG4gICAgICAgICAgICAgIGFyaWEtcHJlc3NlZD17aXNOb3Rpb25FbmFibGVkfVxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtOT1RJT05fQ09OTkVDVE9SX0NBVEFMT0cubmFtZX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPFNDVG9nZ2xlVGh1bWIgLz5cbiAgICAgICAgICAgIDwvU0NUb2dnbGU+XG4gICAgICAgICAgPC9TQ0Nvbm5lY3RvclJpZ2h0R3JvdXA+XG4gICAgICAgIDwvU0NDb25uZWN0b3JIZWFkZXI+XG5cbiAgICAgICAgeyFpc05vdGlvbkVuYWJsZWQgJiYgPFNDQ29ubmVjdG9ySGludD57dCgnYWN0aW9uc1NlY3Rpb24udjIubm90aW9uLmRpc2FibGVkSGludCcpfTwvU0NDb25uZWN0b3JIaW50Pn1cblxuICAgICAgICB7aXNOb3Rpb25FbmFibGVkICYmIChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgPFNDQ29ubmVjdG9ySGludD57dCgnYWN0aW9uc1NlY3Rpb24udjIubm90aW9uLmVuYWJsZWRIaW50Jyl9PC9TQ0Nvbm5lY3RvckhpbnQ+XG4gICAgICAgICAgICB7Tk9USU9OX0NPTk5FQ1RPUl9DQVRBTE9HLmNhdGVnb3JpZXMubWFwKGNhdGVnb3J5ID0+IHJlbmRlck5vdGlvbkNhdGVnb3J5KGNhdGVnb3J5KSl9XG4gICAgICAgICAgPC8+XG4gICAgICAgICl9XG4gICAgICA8L1NDQ29ubmVjdG9yQ2FyZD5cbiAgICA8L1NDUm9vdD5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU9BLEtBQUssSUFDVkMsV0FBVyxFQUNYQyxTQUFTLEVBQ1RDLE9BQU8sRUFDUEMsTUFBTSxFQUNOQyxRQUFRLFFBSUgsT0FBTztBQUNkLFNBQVNDLGNBQWMsUUFBUSxlQUFlO0FBRTlDLFNBQVNDLFFBQVEsUUFBUSwyQ0FBMkM7QUFDcEUsU0FBU0MsV0FBVyxRQUFRLDhDQUE4QztBQUMxRSxTQUFTQyxPQUFPLFFBQVEsOENBQThDO0FBRXRFLFNBQVNDLFVBQVUsUUFBUSxpQ0FBaUM7QUFFNUQsU0FBU0MsaUJBQWlCLFFBQVEsNkJBQTZCO0FBRS9ELFNBQ0VDLGlCQUFpQixFQUVqQkMsZUFBZSxFQUNmQyxtQkFBbUIsRUFDbkJDLFlBQVksRUFJWkMsd0JBQXdCLEVBQ3hCQyxxQkFBcUIsUUFFaEIsV0FBVztBQUNsQixTQUNFQyxjQUFjLEVBQ2RDLGFBQWEsRUFDYkMsa0JBQWtCLEVBQ2xCQyxXQUFXLEVBQ1hDLG1CQUFtQixFQUNuQkMscUJBQXFCLEVBQ3JCQyxnQkFBZ0IsRUFDaEJDLG1CQUFtQixFQUNuQkMsZUFBZSxF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