@projectcor/maia-components 2.11.36-6 → 2.11.36
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.
- package/lib/App.js +11 -24
- package/lib/components/atoms/MAIAInput/MAIAInput.js +191 -61
- package/lib/components/atoms/icons/index.js +1 -3
- package/lib/components/index.js +1 -2
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.styles.js +2 -2
- package/lib/components/molecules/AbmSection/AbmGeneralSection.styles.js +3 -3
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.styles.js +2 -2
- package/lib/components/molecules/AbmSection/index.js +1 -2
- package/lib/components/molecules/ChatAIContent/ChatAIContent.js +1 -15
- package/lib/components/molecules/ChatAIHistory/ChatAIHistory.js +4 -8
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +2 -21
- package/lib/components/molecules/ChatAIMessages/newStyles.js +2 -2
- package/lib/components/molecules/ChatAIModal/ChatAIModal.js +88 -90
- package/lib/components/molecules/ChatAIModal/constants.js +2 -10
- package/lib/components/molecules/ChatFooter/ChatFooter.js +4 -5
- package/lib/components/molecules/Sidebar/Sidebar.js +31 -68
- package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +2 -6
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +50 -235
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.styles.js +4 -4
- package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.js +3 -13
- package/lib/components/organisms/EditQuestionModal/EditQuestionModal.js +3 -6
- package/lib/dev/Providers.js +6 -11
- package/lib/hooks/useAgentModel/useCreateAgent.js +10 -11
- package/lib/hooks/useAgentModel/useUpdateAgent.js +11 -12
- package/lib/hooks/useChatManager/useChatManager.interface.js +1 -1
- package/lib/hooks/useChatManager/useChatManager.js +11 -21
- package/lib/hooks/useChatMessages/useChatMessages.interface.js +1 -1
- package/lib/hooks/useChatMessages/useChatMessages.js +14 -30
- package/lib/hooks/useEvent.js +1 -5
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +4 -6
- package/lib/lang/br/index.js +1 -267
- package/lib/lang/en/index.js +1 -267
- package/lib/lang/es/index.js +1 -267
- package/lib/lang/fr/index.js +2 -269
- package/lib/services/maia/Agents/createAgent.js +1 -1
- package/lib/services/maia/Agents/getAgentById.js +2 -3
- package/lib/services/maia/Agents/updateAgent.js +1 -1
- package/lib/services/maia/Chats/getChatMessages.js +4 -29
- package/lib/services/maia/Orchestrator/orchestrator.js +9 -11
- package/lib/services/maia/RecentProjects/getRecentProjects.js +4 -12
- package/lib/services/utils/mapChatMessages.js +5 -12
- package/lib/types/Chat.js +1 -1
- package/lib/types/agent.js +1 -1
- package/lib/types/agentModal.js +1 -1
- package/package.json +1 -1
- package/lib/components/atoms/ContextMentionChip/ContextMentionChip.js +0 -28
- package/lib/components/atoms/ContextMentionChip/ContextMentionChip.styles.js +0 -84
- package/lib/components/atoms/ContextMentionChip/buildChipElement.js +0 -123
- package/lib/components/atoms/ContextMentionChip/index.js +0 -4
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +0 -85
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.styles.js +0 -6
- package/lib/components/atoms/ContextMentionEditor/index.js +0 -2
- package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +0 -188
- package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +0 -98
- package/lib/components/atoms/ContextMentionItem/index.js +0 -2
- package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +0 -131
- package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +0 -63
- package/lib/components/atoms/ContextMentionPopover/index.js +0 -3
- package/lib/components/atoms/icons/NotionIcon.js +0 -36
- package/lib/components/atoms/icons/RocketIcon.js +0 -31
- package/lib/components/atoms/icons/WrenchIcon.js +0 -42
- package/lib/components/molecules/AbmSection/AbmActionsSectionV2/AbmActionsSectionV2.js +0 -483
- package/lib/components/molecules/AbmSection/AbmActionsSectionV2/AbmActionsSectionV2.styles.js +0 -238
- package/lib/components/molecules/AbmSection/AbmActionsSectionV2/catalog.js +0 -437
- package/lib/components/molecules/AbmSection/AbmActionsSectionV2/index.js +0 -3
- package/lib/components/molecules/AbmSection/AbmSkillsSection.styles.js +0 -80
- package/lib/components/molecules/AbmSection/AbmTriggersSection/AbmTriggersSection.interface.js +0 -2
- package/lib/components/molecules/AbmSection/AbmTriggersSection/AbmTriggersSection.js +0 -722
- package/lib/components/molecules/AbmSection/AbmTriggersSection/AbmTriggersSection.styles.js +0 -165
- package/lib/components/molecules/AbmSection/AbmTriggersSection/index.js +0 -2
- package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +0 -55
- package/lib/components/molecules/ContextMentionInput/ContextMentionInput.styles.js +0 -6
- package/lib/components/molecules/ContextMentionInput/index.js +0 -2
- package/lib/components/molecules/SchedulesPage/SchedulesPage.js +0 -625
- package/lib/components/molecules/SchedulesPage/index.js +0 -2
- package/lib/components/molecules/SkillsPage/SkillsPage.js +0 -708
- package/lib/components/molecules/SkillsPage/index.js +0 -2
- package/lib/components/molecules/maiaSectionModalStyles.js +0 -91
- package/lib/components/molecules/maiaSectionUiTokens.js +0 -31
- package/lib/constants/taskLinkIcon.js +0 -6
- package/lib/dev/DevAbmAgentModal.js +0 -114
- package/lib/dev/DevContextMentionInput.js +0 -65
- package/lib/dev/mocks/abmModalMocks.js +0 -193
- package/lib/hooks/useCaretPosition.js +0 -35
- package/lib/hooks/useContextMentions.js +0 -204
- package/lib/hooks/useEntitySearch.js +0 -405
- package/lib/hooks/useMentionAllowedTypes.js +0 -86
- package/lib/hooks/useMentionPopover.js +0 -284
- package/lib/services/maia/Agents/connectors.js +0 -89
- package/lib/services/maia/Agents/skills.js +0 -164
- package/lib/services/maia/Schedules/createSchedule.js +0 -39
- package/lib/services/maia/Schedules/deleteSchedule.js +0 -36
- package/lib/services/maia/Schedules/getMySchedules.js +0 -55
- package/lib/services/maia/Schedules/getSchedules.js +0 -58
- package/lib/services/maia/Schedules/index.js +0 -5
- package/lib/services/query/entitySearchQuery.js +0 -16
- package/lib/services/query/usersDirectoryQuery.js +0 -19
- package/lib/types/agentSkill.js +0 -2
- package/lib/types/attachment.js +0 -2
- package/lib/types/contextMention.js +0 -37
- package/lib/utils/contextMentionIcons.js +0 -115
- package/lib/utils/contextMentionLabel.js +0 -4
- package/lib/utils/contextMentionTypeLabel.js +0 -17
- package/lib/utils/renderContextMentions.js +0 -216
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
|
-
import styled from 'styled-components';
|
|
3
|
-
import { Tooltip } from '@projectcor/tooltipv2/lib/components/Tooltip';
|
|
4
|
-
import { CONTEXT_MENTION_CHIP_CLASS } from '../types/contextMention';
|
|
5
|
-
import { MENTION_CHIP_COLORS } from '../components/atoms/ContextMentionChip/ContextMentionChip.styles';
|
|
6
|
-
import { getContextMentionIcon } from './contextMentionIcons';
|
|
7
|
-
import { normalizeContextMentionLabel } from './contextMentionLabel';
|
|
8
|
-
import { getContextMentionTypeLabel } from './contextMentionTypeLabel';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Formato del marcador que viaja en el texto del mensaje:
|
|
12
|
-
* [[mention:<type>:<id>|<label>]]
|
|
13
|
-
*
|
|
14
|
-
* El editor lo emite cuando serializa el contenteditable, el backend lo
|
|
15
|
-
* persiste tal cual y al renderizar se transforma en un link markdown con
|
|
16
|
-
* un protocolo propio que `CustomLink` intercepta y dibuja como span
|
|
17
|
-
* estilado.
|
|
18
|
-
*
|
|
19
|
-
* Por separado, la metadata `context_message` lleva los valores limpios
|
|
20
|
-
* (id + name) para que el backend pueda interpretar las entidades sin
|
|
21
|
-
* tener que parsear el texto.
|
|
22
|
-
*/
|
|
23
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
24
|
-
export var MENTION_MARKER_REGEX = /\[\[mention:(client|project|task|user|mcp):([^|\]]+)\|([^\]]+)\]\]/g;
|
|
25
|
-
export var MAIA_MENTION_PROTOCOL = 'maia-mention://';
|
|
26
|
-
var ALLOWED_TYPES = ['client', 'project', 'task', 'user', 'mcp'];
|
|
27
|
-
var parseMentionProtocolHref = function parseMentionProtocolHref(href) {
|
|
28
|
-
var rest = href.slice(MAIA_MENTION_PROTOCOL.length);
|
|
29
|
-
var slashIdx = rest.indexOf('/');
|
|
30
|
-
var rawType = slashIdx >= 0 ? rest.slice(0, slashIdx) : rest;
|
|
31
|
-
var rawId = slashIdx >= 0 ? rest.slice(slashIdx + 1) : '';
|
|
32
|
-
var id = '';
|
|
33
|
-
try {
|
|
34
|
-
id = rawId ? decodeURIComponent(rawId) : '';
|
|
35
|
-
} catch (_unused) {
|
|
36
|
-
id = rawId;
|
|
37
|
-
}
|
|
38
|
-
var type = ALLOWED_TYPES.includes(rawType) ? rawType : 'user';
|
|
39
|
-
return {
|
|
40
|
-
type: type,
|
|
41
|
-
id: id
|
|
42
|
-
};
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
/** Genera el marcador para un mention dado. Lo usa el editor al serializar. */
|
|
46
|
-
export var serializeMention = function serializeMention(mention) {
|
|
47
|
-
return "[[mention:".concat(mention.type, ":").concat(mention.id, "|").concat(mention.label, "]]");
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Convierte cada `[[mention:...]]` en un link markdown con protocolo propio
|
|
52
|
-
* para que Streamdown lo emita como `<a>` y `CustomLink` lo intercepte.
|
|
53
|
-
*/
|
|
54
|
-
export var transformMentionMarkers = function transformMentionMarkers(text) {
|
|
55
|
-
if (!text) return text;
|
|
56
|
-
return text.replace(MENTION_MARKER_REGEX, function (_m, type, id, label) {
|
|
57
|
-
var safeLabel = String(label).replace(/[\\\]]/g, '\\$&');
|
|
58
|
-
return "[".concat(safeLabel, "](").concat(MAIA_MENTION_PROTOCOL).concat(type, "/").concat(encodeURIComponent(String(id)), ")");
|
|
59
|
-
});
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
/** Span inline estilado por tipo (sin lógica del chip atom). */
|
|
63
|
-
var SCInlineMention = styled.span.withConfig({
|
|
64
|
-
displayName: "renderContextMentions__SCInlineMention",
|
|
65
|
-
componentId: "sc-f3uz3m-0"
|
|
66
|
-
})(["display:inline-flex;align-items:center;gap:4px;padding:1px 6px;margin:0 1px;border-radius:4px;font-weight:500;background:", ";color:", ";white-space:nowrap;cursor:", ";text-decoration:none;&:hover{opacity:", ";}"], function (_ref) {
|
|
67
|
-
var _MENTION_CHIP_COLORS$;
|
|
68
|
-
var $type = _ref.$type;
|
|
69
|
-
return ((_MENTION_CHIP_COLORS$ = MENTION_CHIP_COLORS[$type]) !== null && _MENTION_CHIP_COLORS$ !== void 0 ? _MENTION_CHIP_COLORS$ : MENTION_CHIP_COLORS.user).bg;
|
|
70
|
-
}, function (_ref2) {
|
|
71
|
-
var _MENTION_CHIP_COLORS$2;
|
|
72
|
-
var $type = _ref2.$type;
|
|
73
|
-
return ((_MENTION_CHIP_COLORS$2 = MENTION_CHIP_COLORS[$type]) !== null && _MENTION_CHIP_COLORS$2 !== void 0 ? _MENTION_CHIP_COLORS$2 : MENTION_CHIP_COLORS.user).fg;
|
|
74
|
-
}, function (_ref3) {
|
|
75
|
-
var $isClickable = _ref3.$isClickable;
|
|
76
|
-
return $isClickable ? 'pointer' : 'default';
|
|
77
|
-
}, function (_ref4) {
|
|
78
|
-
var $isClickable = _ref4.$isClickable;
|
|
79
|
-
return $isClickable ? 0.8 : 1;
|
|
80
|
-
});
|
|
81
|
-
var SCInlineMentionIcon = styled.span.withConfig({
|
|
82
|
-
displayName: "renderContextMentions__SCInlineMentionIcon",
|
|
83
|
-
componentId: "sc-f3uz3m-1"
|
|
84
|
-
})(["display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;flex:0 0 14px;"]);
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Si el href corresponde al protocolo de mention, devuelve un span inline
|
|
88
|
-
* estilado por tipo. Caso contrario devuelve null para que el caller
|
|
89
|
-
* delegue al render por defecto.
|
|
90
|
-
*/
|
|
91
|
-
export var renderMentionLink = function renderMentionLink(href, children) {
|
|
92
|
-
if (!href || !href.startsWith(MAIA_MENTION_PROTOCOL)) return null;
|
|
93
|
-
var _parseMentionProtocol = parseMentionProtocolHref(href),
|
|
94
|
-
type = _parseMentionProtocol.type,
|
|
95
|
-
id = _parseMentionProtocol.id;
|
|
96
|
-
var label = typeof children === 'string' ? normalizeContextMentionLabel(children) : '';
|
|
97
|
-
return /*#__PURE__*/_jsxs(SCInlineMention, {
|
|
98
|
-
$type: type,
|
|
99
|
-
className: CONTEXT_MENTION_CHIP_CLASS,
|
|
100
|
-
"data-mention-type": type,
|
|
101
|
-
children: [/*#__PURE__*/_jsx(SCInlineMentionIcon, {
|
|
102
|
-
children: getContextMentionIcon(type, MENTION_CHIP_COLORS[type].fg, id, 14)
|
|
103
|
-
}), label]
|
|
104
|
-
});
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
/** Quita los markers del texto, dejando solo `label`. Útil para fallback plano. */
|
|
108
|
-
export var stripMentionMarkers = function stripMentionMarkers(text) {
|
|
109
|
-
return text.replace(MENTION_MARKER_REGEX, function (_m, _type, _id, label) {
|
|
110
|
-
return normalizeContextMentionLabel(String(label));
|
|
111
|
-
});
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Títulos de conversación (p. ej. `last_question` derivado del primer mensaje) pueden
|
|
116
|
-
* incluir el texto serializado `[[mention:type:id|label]]`. Para sidebar y listados,
|
|
117
|
-
* reemplaza cada bloque por `@label` en texto plano, sin el marcador crudo.
|
|
118
|
-
*/
|
|
119
|
-
export var formatChatListTitleMentions = function formatChatListTitleMentions(text) {
|
|
120
|
-
if (text == null || text === '') return text !== null && text !== void 0 ? text : '';
|
|
121
|
-
return text.replace(MENTION_MARKER_REGEX, function (_m, _type, _id, label) {
|
|
122
|
-
var clean = normalizeContextMentionLabel(String(label).trim());
|
|
123
|
-
return clean ? "@".concat(clean) : '';
|
|
124
|
-
});
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
/** Genera la URL de navegación para un mention según su tipo. */
|
|
128
|
-
var getMentionUrl = function getMentionUrl(type, id) {
|
|
129
|
-
switch (type) {
|
|
130
|
-
case 'client':
|
|
131
|
-
return "/clients/".concat(id);
|
|
132
|
-
case 'project':
|
|
133
|
-
return "/project/".concat(id, "/dashboard");
|
|
134
|
-
case 'task':
|
|
135
|
-
return "/tasks/".concat(id, "/detail");
|
|
136
|
-
case 'user':
|
|
137
|
-
return null;
|
|
138
|
-
// Los users no son clickeables
|
|
139
|
-
case 'mcp':
|
|
140
|
-
return null;
|
|
141
|
-
default:
|
|
142
|
-
return null;
|
|
143
|
-
}
|
|
144
|
-
};
|
|
145
|
-
|
|
146
|
-
/** Etiqueta de tooltip para cada tipo de mention. */
|
|
147
|
-
/** Componente reutilizable para renderizar un mention con navegación. */
|
|
148
|
-
var MentionChip = function MentionChip(_ref5) {
|
|
149
|
-
var type = _ref5.type,
|
|
150
|
-
id = _ref5.id,
|
|
151
|
-
label = _ref5.label;
|
|
152
|
-
var normalizedLabel = normalizeContextMentionLabel(label);
|
|
153
|
-
var url = getMentionUrl(type, id);
|
|
154
|
-
var isClickable = !!url;
|
|
155
|
-
var typeLabel = getContextMentionTypeLabel(type);
|
|
156
|
-
var handleClick = function handleClick(e) {
|
|
157
|
-
if (isClickable && url) {
|
|
158
|
-
e.preventDefault();
|
|
159
|
-
window.open(url, '_blank');
|
|
160
|
-
}
|
|
161
|
-
};
|
|
162
|
-
return /*#__PURE__*/_jsx(Tooltip, {
|
|
163
|
-
title: typeLabel,
|
|
164
|
-
children: /*#__PURE__*/_jsx("span", {
|
|
165
|
-
style: {
|
|
166
|
-
display: 'inline'
|
|
167
|
-
},
|
|
168
|
-
children: /*#__PURE__*/_jsxs(SCInlineMention, {
|
|
169
|
-
$type: type,
|
|
170
|
-
$isClickable: isClickable,
|
|
171
|
-
className: CONTEXT_MENTION_CHIP_CLASS,
|
|
172
|
-
"data-mention-type": type,
|
|
173
|
-
onClick: handleClick,
|
|
174
|
-
role: isClickable ? 'button' : undefined,
|
|
175
|
-
tabIndex: isClickable ? 0 : undefined,
|
|
176
|
-
children: [/*#__PURE__*/_jsx(SCInlineMentionIcon, {
|
|
177
|
-
children: getContextMentionIcon(type, MENTION_CHIP_COLORS[type].fg, id, 14)
|
|
178
|
-
}), normalizedLabel]
|
|
179
|
-
})
|
|
180
|
-
})
|
|
181
|
-
});
|
|
182
|
-
};
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* Splitea el texto por markers y devuelve un array de ReactNodes:
|
|
186
|
-
* texto plano + spans estilados para cada mention. Renderiza directamente
|
|
187
|
-
* sin pasar por Streamdown (no soporta markdown en este modo).
|
|
188
|
-
*/
|
|
189
|
-
export var renderTextWithMentions = function renderTextWithMentions(text) {
|
|
190
|
-
if (!text) return [text];
|
|
191
|
-
var out = [];
|
|
192
|
-
var lastIdx = 0;
|
|
193
|
-
MENTION_MARKER_REGEX.lastIndex = 0;
|
|
194
|
-
var match = MENTION_MARKER_REGEX.exec(text);
|
|
195
|
-
var keyIdx = 0;
|
|
196
|
-
while (match) {
|
|
197
|
-
if (match.index > lastIdx) out.push(text.slice(lastIdx, match.index));
|
|
198
|
-
var _match = match,
|
|
199
|
-
_match2 = _slicedToArray(_match, 4),
|
|
200
|
-
rawType = _match2[1],
|
|
201
|
-
id = _match2[2],
|
|
202
|
-
label = _match2[3];
|
|
203
|
-
var type = ALLOWED_TYPES.includes(rawType) ? rawType : 'user';
|
|
204
|
-
out.push(/*#__PURE__*/_jsx(MentionChip, {
|
|
205
|
-
type: type,
|
|
206
|
-
id: id,
|
|
207
|
-
label: label
|
|
208
|
-
}, "mention-".concat(keyIdx, "-").concat(match.index)));
|
|
209
|
-
lastIdx = match.index + match[0].length;
|
|
210
|
-
keyIdx += 1;
|
|
211
|
-
match = MENTION_MARKER_REGEX.exec(text);
|
|
212
|
-
}
|
|
213
|
-
if (lastIdx < text.length) out.push(text.slice(lastIdx));
|
|
214
|
-
return out;
|
|
215
|
-
};
|
|
216
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzdHlsZWQiLCJUb29sdGlwIiwiQ09OVEVYVF9NRU5USU9OX0NISVBfQ0xBU1MiLCJNRU5USU9OX0NISVBfQ09MT1JTIiwiZ2V0Q29udGV4dE1lbnRpb25JY29uIiwibm9ybWFsaXplQ29udGV4dE1lbnRpb25MYWJlbCIsImdldENvbnRleHRNZW50aW9uVHlwZUxhYmVsIiwianN4IiwiX2pzeCIsImpzeHMiLCJfanN4cyIsIk1FTlRJT05fTUFSS0VSX1JFR0VYIiwiTUFJQV9NRU5USU9OX1BST1RPQ09MIiwiQUxMT1dFRF9UWVBFUyIsInBhcnNlTWVudGlvblByb3RvY29sSHJlZiIsImhyZWYiLCJyZXN0Iiwic2xpY2UiLCJsZW5ndGgiLCJzbGFzaElkeCIsImluZGV4T2YiLCJyYXdUeXBlIiwicmF3SWQiLCJpZCIsImRlY29kZVVSSUNvbXBvbmVudCIsIl91bnVzZWQiLCJ0eXBlIiwiaW5jbHVkZXMiLCJzZXJpYWxpemVNZW50aW9uIiwibWVudGlvbiIsImNvbmNhdCIsImxhYmVsIiwidHJhbnNmb3JtTWVudGlvbk1hcmtlcnMiLCJ0ZXh0IiwicmVwbGFjZSIsIl9tIiwic2FmZUxhYmVsIiwiU3RyaW5nIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiU0NJbmxpbmVNZW50aW9uIiwic3BhbiIsIndpdGhDb25maWciLCJkaXNwbGF5TmFtZSIsImNvbXBvbmVudElkIiwiX3JlZiIsIl9NRU5USU9OX0NISVBfQ09MT1JTJCIsIiR0eXBlIiwidXNlciIsImJnIiwiX3JlZjIiLCJfTUVOVElPTl9DSElQX0NPTE9SUyQyIiwiZmciLCJfcmVmMyIsIiRpc0NsaWNrYWJsZSIsIl9yZWY0IiwiU0NJbmxpbmVNZW50aW9uSWNvbiIsInJlbmRlck1lbnRpb25MaW5rIiwiY2hpbGRyZW4iLCJzdGFydHNXaXRoIiwiX3BhcnNlTWVudGlvblByb3RvY29sIiwiY2xhc3NOYW1lIiwic3RyaXBNZW50aW9uTWFya2VycyIsIl90eXBlIiwiX2lkIiwiZm9ybWF0Q2hhdExpc3RUaXRsZU1lbnRpb25zIiwiY2xlYW4iLCJ0cmltIiwiZ2V0TWVudGlvblVybCIsIk1lbnRpb25DaGlwIiwiX3JlZjUiLCJub3JtYWxpemVkTGFiZWwiLCJ1cmwiLCJpc0NsaWNrYWJsZSIsInR5cGVMYWJlbCIsImhhbmRsZUNsaWNrIiwiZSIsInByZXZlbnREZWZhdWx0Iiwid2luZG93Iiwib3BlbiIsInRpdGxlIiwic3R5bGUiLCJkaXNwbGF5Iiwib25DbGljayIsInJvbGUiLCJ1bmRlZmluZWQiLCJ0YWJJbmRleCIsInJlbmRlclRleHRXaXRoTWVudGlvbnMiLCJvdXQiLCJsYXN0SWR4IiwibGFzdEluZGV4IiwibWF0Y2giLCJleGVjIiwia2V5SWR4IiwiaW5kZXgiLCJwdXNoIiwiX21hdGNoIiwiX21hdGNoMiIsIl9zbGljZWRUb0FycmF5Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3JlbmRlckNvbnRleHRNZW50aW9ucy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVhY3ROb2RlLCBSZWFjdEVsZW1lbnQsIE1vdXNlRXZlbnQgfSBmcm9tICdyZWFjdCdcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnXG5pbXBvcnQgeyBUb29sdGlwIH0gZnJvbSAnQHByb2plY3Rjb3IvdG9vbHRpcHYyL2xpYi9jb21wb25lbnRzL1Rvb2x0aXAnXG5pbXBvcnQgeyBDb250ZXh0RW50aXR5VHlwZSwgQ29udGV4dE1lbnRpb24sIENPTlRFWFRfTUVOVElPTl9DSElQX0NMQVNTIH0gZnJvbSAnLi4vdHlwZXMvY29udGV4dE1lbnRpb24nXG5pbXBvcnQgeyBNRU5USU9OX0NISVBfQ09MT1JTIH0gZnJvbSAnLi4vY29tcG9uZW50cy9hdG9tcy9Db250ZXh0TWVudGlvbkNoaXAvQ29udGV4dE1lbnRpb25DaGlwLnN0eWxlcydcbmltcG9ydCB7IGdldENvbnRleHRNZW50aW9uSWNvbiB9IGZyb20gJy4vY29udGV4dE1lbnRpb25JY29ucydcbmltcG9ydCB7IG5vcm1hbGl6ZUNvbnRleHRNZW50aW9uTGFiZWwgfSBmcm9tICcuL2NvbnRleHRNZW50aW9uTGFiZWwnXG5pbXBvcnQgeyBnZXRDb250ZXh0TWVudGlvblR5cGVMYWJlbCB9IGZyb20gJy4vY29udGV4dE1lbnRpb25UeXBlTGFiZWwnXG5cbi8qKlxuICogRm9ybWF0byBkZWwgbWFyY2Fkb3IgcXVlIHZpYWphIGVuIGVsIHRleHRvIGRlbCBtZW5zYWplOlxuICogICBbW21lbnRpb246PHR5cGU+OjxpZD58PGxhYmVsPl1dXG4gKlxuICogRWwgZWRpdG9yIGxvIGVtaXRlIGN1YW5kbyBzZXJpYWxpemEgZWwgY29udGVudGVkaXRhYmxlLCBlbCBiYWNrZW5kIGxvXG4gKiBwZXJzaXN0ZSB0YWwgY3VhbCB5IGFsIHJlbmRlcml6YXIgc2UgdHJhbnNmb3JtYSBlbiB1biBsaW5rIG1hcmtkb3duIGNvblxuICogdW4gcHJvdG9jb2xvIHByb3BpbyBxdWUgYEN1c3RvbUxpbmtgIGludGVyY2VwdGEgeSBkaWJ1amEgY29tbyBzcGFuXG4gKiBlc3RpbGFkby5cbiAqXG4gKiBQb3Igc2VwYXJhZG8sIGxhIG1ldGFkYXRhIGBjb250ZXh0X21lc3NhZ2VgIGxsZXZhIGxvcyB2YWxvcmVzIGxpbXBpb3NcbiAqIChpZCArIG5hbWUpIHBhcmEgcXVlIGVsIGJhY2tlbmQgcHVlZGEgaW50ZXJwcmV0YXIgbGFzIGVudGlkYWRlcyBzaW5cbiAqIHRlbmVyIHF1ZSBwYXJzZWFyIGVsIHRleHRvLlxuICovXG5leHBvcnQgY29uc3QgTUVOVElPTl9NQVJLRVJfUkVHRVggPSAvXFxbXFxbbWVudGlvbjooY2xpZW50fHByb2plY3R8dGFza3x1c2VyfG1jcCk6KFtefFxcXV0rKVxcfChbXlxcXV0rKVxcXVxcXS9nXG5leHBvcnQgY29uc3QgTUFJQV9NRU5USU9OX1BST1RPQ09MID0gJ21haWEtbWVudGlvbjovLydcblxuY29uc3QgQUxMT1dFRF9UWVBFUzogQ29udGV4dEVudGl0eVR5cGVbXSA9IFsnY2xpZW50JywgJ3Byb2plY3QnLCAndGFzaycsICd1c2VyJywgJ21jcCddXG5cbmNvbnN0IHBhcnNlTWVudGlvblByb3RvY29sSHJlZiA9IChocmVmOiBzdHJpbmcpOiB7IHR5cGU6IENvbnRleHRFbnRpdHlUeXBlOyBpZDogc3RyaW5nIH0gPT4ge1xuICBjb25zdCByZXN0ID0gaHJlZi5zbGljZShNQUlBX01FTlRJT05fUFJPVE9DT0wubGVuZ3RoKVxuICBjb25zdCBzbGFzaElkeCA9IHJlc3QuaW5kZXhPZignLycpXG4gIGNvbnN0IHJhd1R5cGUgPSBzbGFzaElkeCA+PSAwID8gcmVzdC5zbGljZSgwLCBzbGFzaElkeCkgOiByZXN0XG4gIGNvbnN0IHJhd0lkID0gc2xhc2hJZHggPj0gMCA/IHJlc3Quc2xpY2Uoc2xhc2hJZHggKyAxKSA6ICcnXG4gIGxldCBpZCA9ICcnXG4gIHRyeSB7XG4gICAgaWQgPSByYXdJZCA/IGRlY29kZVVSSUNvbXBvbmVudChyYXdJZCkgOiAnJ1xuICB9IGNhdGNoIHtcbiAgICBpZCA9IHJhd0lkXG4gIH1cbiAgY29uc3QgdHlwZSA9IEFMTE9XRURfVFlQRVMuaW5jbHVkZXMocmF3VHlwZSBhcyBDb250ZXh0RW50aXR5VHlwZSkgPyAocmF3VHlwZSBhcyBDb250ZXh0RW50aXR5VHlwZSkgOiAndXNlcidcbiAgcmV0dXJuIHsgdHlwZSwgaWQgfVxufVxuXG4vKiogR2VuZXJhIGVsIG1hcmNhZG9yIHBhcmEgdW4gbWVudGlvbiBkYWRvLiBMbyB1c2EgZWwgZWRpdG9yIGFsIHNlcmlhbGl6YXIuICovXG5leHBvcnQgY29uc3Qgc2VyaWFsaXplTWVudGlvbiA9IChtZW50aW9uOiBDb250ZXh0TWVudGlvbik6IHN0cmluZyA9PlxuICBgW1ttZW50aW9uOiR7bWVudGlvbi50eXBlfToke21lbnRpb24uaWR9fCR7bWVudGlvbi5sYWJlbH1dXWBcblxuLyoqXG4gKiBDb252aWVydGUgY2FkYSBgW1ttZW50aW9uOi4uLl1dYCBlbiB1biBsaW5rIG1hcmtkb3duIGNvbiBwcm90b2NvbG8gcHJvcGlvXG4gKiBwYXJhIHF1ZSBTdHJlYW1kb3duIGxvIGVtaXRhIGNvbW8gYDxhPmAgeSBgQ3VzdG9tTGlua2AgbG8gaW50ZXJjZXB0ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybU1lbnRpb25NYXJrZXJzID0gKHRleHQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGlmICghdGV4dCkgcmV0dXJuIHRleHRcbiAgcmV0dXJuIHRleHQucmVwbGFjZShNRU5USU9OX01BUktFUl9SRUdFWCwgKF9tLCB0eXBlLCBpZCwgbGFiZWwpID0+IHtcbiAgICBjb25zdCBzYWZlTGFiZWwgPSBTdHJpbmcobGFiZWwpLnJlcGxhY2UoL1tcXFxcXFxdXS9nLCAnXFxcXCQmJylcbiAgICByZXR1cm4gYFske3NhZmVMYWJlbH1dKCR7TUFJQV9NRU5USU9OX1BST1RPQ09MfSR7dHlwZX0vJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGlkKSl9KWBcbiAgfSlcbn1cblxuLyoqIFNwYW4gaW5saW5lIGVzdGlsYWRvIHBvciB0aXBvIChzaW4gbMOzZ2ljYSBkZWwgY2hpcCBhdG9tKS4gKi9cbmNvbnN0IFNDSW5saW5lTWVudGlvbiA9IHN0eWxlZC5zcGFuPHsgJHR5cGU6IENvbnRleHRFbnRpdHlUeXBlOyAkaXNDbGlja2FibGU/OiBib29sZWFuIH0+YFxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA0cHg7XG4gIHBhZGRpbmc6IDFweCA2cHg7XG4gIG1hcmdpbjogMCAxcHg7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgYmFja2dyb3VuZDogJHsoeyAkdHlwZSB9KSA9PiAoTUVOVElPTl9DSElQX0NPTE9SU1skdHlwZV0gPz8gTUVOVElPTl9DSElQX0NPTE9SUy51c2VyKS5iZ307XG4gIGNvbG9yOiAkeyh7ICR0eXBlIH0pID0+IChNRU5USU9OX0NISVBfQ09MT1JTWyR0eXBlXSA/PyBNRU5USU9OX0NISVBfQ09MT1JTLnVzZXIpLmZnfTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgY3Vyc29yOiAkeyh7ICRpc0NsaWNrYWJsZSB9KSA9PiAoJGlzQ2xpY2thYmxlID8gJ3BvaW50ZXInIDogJ2RlZmF1bHQnKX07XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcblxuICAmOmhvdmVyIHtcbiAgICBvcGFjaXR5OiAkeyh7ICRpc0NsaWNrYWJsZSB9KSA9PiAoJGlzQ2xpY2thYmxlID8gMC44IDogMSl9O1xuICB9XG5gXG5cbmNvbnN0IFNDSW5saW5lTWVudGlvbkljb24gPSBzdHlsZWQuc3BhbmBcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICB3aWR0aDogMTRweDtcbiAgaGVpZ2h0OiAxNHB4O1xuICBmbGV4OiAwIDAgMTRweDtcbmBcblxuLyoqXG4gKiBTaSBlbCBocmVmIGNvcnJlc3BvbmRlIGFsIHByb3RvY29sbyBkZSBtZW50aW9uLCBkZXZ1ZWx2ZSB1biBzcGFuIGlubGluZVxuICogZXN0aWxhZG8gcG9yIHRpcG8uIENhc28gY29udHJhcmlvIGRldnVlbHZlIG51bGwgcGFyYSBxdWUgZWwgY2FsbGVyXG4gKiBkZWxlZ3VlIGFsIHJlbmRlciBwb3IgZGVmZWN0by5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlbmRlck1lbnRpb25MaW5rID0gKGhyZWY6IHN0cmluZyB8IHVuZGVmaW5lZCwgY2hpbGRyZW46IFJlYWN0Tm9kZSk6IFJlYWN0Tm9kZSB8IG51bGwgPT4ge1xuICBpZiAoIWhyZWYgfHwgIWhyZWYuc3RhcnRzV2l0aChNQUlBX01FTlRJT05fUFJPVE9DT0wpKSByZXR1cm4gbnVsbFxuICBjb25zdCB7IHR5cGUsIGlkIH0gPSBwYXJzZU1lbnRpb25Qcm90b2NvbEhyZWYoaHJlZilcbiAgY29uc3QgbGFiZWwgPSB0eXBlb2YgY2hpbGRyZW4gPT09ICdzdHJpbmcnID8gbm9ybWFsaXplQ29udGV4dE1lbnRpb25MYWJlbChjaGlsZHJlbikgOiAnJ1xuICByZXR1cm4gKFxuICAgIDxTQ0lubGluZU1lbnRpb24gJHR5cGU9e3R5cGV9IGNsYXNzTmFtZT17Q09OVEVYVF9NRU5USU9OX0NISVBfQ0xBU1N9IGRhdGEtbWVudGlvbi10eXBlPXt0eXBlfT5cbiAgICAgIDxTQ0lubGluZU1lbnRpb25JY29uPntnZXRDb250ZXh0TWVudGlvbkljb24odHlwZSwgTUVOVElPTl9DSElQX0NPTE9SU1t0eXBlXS5mZywgaWQsIDE0KX08L1NDSW5saW5lTWVudGlvbkljb24+XG4gICAgICB7bGFiZWx9XG4gICAgPC9TQ0lubGluZU1lbnRpb24+XG4gIClcbn1cblxuLyoqIFF1aXRhIGxvcyBtYXJrZXJzIGRlbCB0ZXh0bywgZGVqYW5kbyBzb2xvIGBsYWJlbGAuIMOadGlsIHBhcmEgZmFsbGJhY2sgcGxhbm8uICovXG5leHBvcnQgY29uc3Qgc3RyaXBNZW50aW9uTWFya2VycyA9ICh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgdGV4dC5yZXBsYWNlKE1FTlRJT05fTUFSS0VSX1JFR0VYLCAoX20sIF90eXBlLCBfaWQsIGxhYmVsKSA9PiBub3JtYWxpemVDb250ZXh0TWVudGlvbkxhYmVsKFN0cmluZyhsYWJlbCkpKVxuXG4vKipcbiAqIFTDrXR1bG9zIGRlIGNvbnZlcnNhY2nDs24gKHAuIGVqLiBgbGFzdF9xdWVzdGlvbmAgZGVyaXZhZG8gZGVsIHByaW1lciBtZW5zYWplKSBwdWVkZW5cbiAqIGluY2x1aXIgZWwgdGV4dG8gc2VyaWFsaXphZG8gYFtbbWVudGlvbjp0eXBlOmlkfGxhYmVsXV1gLiBQYXJhIHNpZGViYXIgeSBsaXN0YWRvcyxcbiAqIHJlZW1wbGF6YSBjYWRhIGJsb3F1ZSBwb3IgYEBsYWJlbGAgZW4gdGV4dG8gcGxhbm8sIHNpbiBlbCBtYXJjYWRvciBjcnVkby5cbiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1hdENoYXRMaXN0VGl0bGVNZW50aW9ucyA9ICh0ZXh0OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+IHtcbiAgaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0ID09PSAnJykgcmV0dXJuIHRleHQgPz8gJydcbiAgcmV0dXJuIHRleHQucmVwbGFjZShNRU5USU9OX01BUktFUl9SRUdFWCwgKF9tLCBfdHlwZSwgX2lkLCBsYWJlbCkgPT4ge1xuICAgIGNvbnN0IGNsZWFuID0gbm9ybWFsaXplQ29udGV4dE1lbnRpb25MYWJlbChTdHJpbmcobGFiZWwpLnRyaW0oKSlcbiAgICByZXR1cm4gY2xlYW4gPyBgQCR7Y2xlYW59YCA6ICcnXG4gIH0pXG59XG5cbi8qKiBHZW5lcmEgbGEgVVJMIGRlIG5hdmVnYWNpw7NuIHBhcmEgdW4gbWVudGlvbiBzZWfDum4gc3UgdGlwby4gKi9cbmNvbnN0IGdldE1lbnRpb25VcmwgPSAodHlwZTogQ29udGV4dEVudGl0eVR5cGUsIGlkOiBzdHJpbmcgfCBudW1iZXIpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnY2xpZW50JzpcbiAgICAgIHJldHVybiBgL2NsaWVudHMvJHtpZH1gXG4gICAgY2FzZSAncHJvamVjdCc6XG4gICAgICByZXR1cm4gYC9wcm9qZWN0LyR7aWR9L2Rhc2hib2FyZGBcbiAgICBjYXNlICd0YXNrJzpcbiAgICAgIHJldHVybiBgL3Rhc2tzLyR7aWR9L2RldGFpbGBcbiAgICBjYXNlICd1c2VyJzpcbiAgICAgIHJldHVybiBudWxsIC8vIExvcyB1c2VycyBubyBzb24gY2xpY2tlYWJsZXNcbiAgICBjYXNlICdtY3AnOlxuICAgICAgcmV0dXJuIG51bGxcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG4vKiogRXRpcXVldGEgZGUgdG9vbHRpcCBwYXJhIGNhZGEgdGlwbyBkZSBtZW50aW9uLiAqL1xuLyoqIENvbXBvbmVudGUgcmV1dGlsaXphYmxlIHBhcmEgcmVuZGVyaXphciB1biBtZW50aW9uIGNvbiBuYXZlZ2FjacOzbi4gKi9cbmNvbnN0IE1lbnRpb25DaGlwID0gKHsgdHlwZSwgaWQsIGxhYmVsIH06IHsgdHlwZTogQ29udGV4dEVudGl0eVR5cGU7IGlkOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfSkgPT4ge1xuICBjb25zdCBub3JtYWxpemVkTGFiZWwgPSBub3JtYWxpemVDb250ZXh0TWVudGlvbkxhYmVsKGxhYmVsKVxuICBjb25zdCB1cmwgPSBnZXRNZW50aW9uVXJsKHR5cGUsIGlkKVxuICBjb25zdCBpc0NsaWNrYWJsZSA9ICEhdXJsXG4gIGNvbnN0IHR5cGVMYWJlbCA9IGdldENvbnRleHRNZW50aW9uVHlwZUxhYmVsKHR5cGUpXG5cbiAgY29uc3QgaGFuZGxlQ2xpY2sgPSAoZTogTW91c2VFdmVudDxIVE1MU3BhbkVsZW1lbnQ+KSA9PiB7XG4gICAgaWYgKGlzQ2xpY2thYmxlICYmIHVybCkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFRvb2x0aXAgdGl0bGU9e3R5cGVMYWJlbH0+XG4gICAgICA8c3BhbiBzdHlsZT17eyBkaXNwbGF5OiAnaW5saW5lJyB9fT5cbiAgICAgICAgPFNDSW5saW5lTWVudGlvblxuICAgICAgICAgICR0eXBlPXt0eXBlfVxuICAgICAgICAgICRpc0NsaWNrYWJsZT17aXNDbGlja2FibGV9XG4gICAgICAgICAgY2xhc3NOYW1lPXtDT05URVhUX01FTlRJT05fQ0hJUF9DTEFTU31cbiAgICAgICAgICBkYXRhLW1lbnRpb24tdHlwZT17dHlwZX1cbiAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVDbGlja31cbiAgICAgICAgICByb2xlPXtpc0NsaWNrYWJsZSA/ICdidXR0b24nIDogdW5kZWZpbmVkfVxuICAgICAgICAgIHRhYkluZGV4PXtpc0NsaWNrYWJsZSA/IDAgOiB1bmRlZmluZWR9XG4gICAgICAgID5cbiAgICAgICAgICA8U0NJbmxpbmVNZW50aW9uSWNvbj57Z2V0Q29udGV4dE1lbnRpb25JY29uKHR5cGUsIE1FTlRJT05fQ0hJUF9DT0xPUlNbdHlwZV0uZmcsIGlkLCAxNCl9PC9TQ0lubGluZU1lbnRpb25JY29uPlxuICAgICAgICAgIHtub3JtYWxpemVkTGFiZWx9XG4gICAgICAgIDwvU0NJbmxpbmVNZW50aW9uPlxuICAgICAgPC9zcGFuPlxuICAgIDwvVG9vbHRpcD5cbiAgKVxufVxuXG4vKipcbiAqIFNwbGl0ZWEgZWwgdGV4dG8gcG9yIG1hcmtlcnMgeSBkZXZ1ZWx2ZSB1biBhcnJheSBkZSBSZWFjdE5vZGVzOlxuICogdGV4dG8gcGxhbm8gKyBzcGFucyBlc3RpbGFkb3MgcGFyYSBjYWRhIG1lbnRpb24uIFJlbmRlcml6YSBkaXJlY3RhbWVudGVcbiAqIHNpbiBwYXNhciBwb3IgU3RyZWFtZG93biAobm8gc29wb3J0YSBtYXJrZG93biBlbiBlc3RlIG1vZG8pLlxuICovXG5leHBvcnQgY29uc3QgcmVuZGVyVGV4dFdpdGhNZW50aW9ucyA9ICh0ZXh0OiBzdHJpbmcpOiBBcnJheTxzdHJpbmcgfCBSZWFjdEVsZW1lbnQ+ID0+IHtcbiAgaWYgKCF0ZXh0KSByZXR1cm4gW3RleHRdXG4gIGNvbnN0IG91dDogQXJyYXk8c3RyaW5nIHwgUmVhY3RFbGVtZW50PiA9IFtdXG4gIGxldCBsYXN0SWR4ID0gMFxuICBNRU5USU9OX01BUktFUl9SRUdFWC5sYXN0SW5kZXggPSAwXG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbCA9IE1FTlRJT05fTUFSS0VSX1JFR0VYLmV4ZWModGV4dClcbiAgbGV0IGtleUlkeCA9IDBcbiAgd2hpbGUgKG1hdGNoKSB7XG4gICAgaWYgKG1hdGNoLmluZGV4ID4gbGFzdElkeCkgb3V0LnB1c2godGV4dC5zbGljZShsYXN0SWR4LCBtYXRjaC5pbmRleCkpXG4gICAgY29uc3QgWywgcmF3VHlwZSwgaWQsIGxhYmVsXSA9IG1hdGNoXG4gICAgY29uc3QgdHlwZSA9IEFMTE9XRURfVFlQRVMuaW5jbHVkZXMocmF3VHlwZSBhcyBDb250ZXh0RW50aXR5VHlwZSkgPyAocmF3VHlwZSBhcyBDb250ZXh0RW50aXR5VHlwZSkgOiAndXNlcidcblxuICAgIG91dC5wdXNoKDxNZW50aW9uQ2hpcCBrZXk9e2BtZW50aW9uLSR7a2V5SWR4fS0ke21hdGNoLmluZGV4fWB9IHR5cGU9e3R5cGV9IGlkPXtpZH0gbGFiZWw9e2xhYmVsfSAvPilcblxuICAgIGxhc3RJZHggPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aFxuICAgIGtleUlkeCArPSAxXG4gICAgbWF0Y2ggPSBNRU5USU9OX01BUktFUl9SRUdFWC5leGVjKHRleHQpXG4gIH1cbiAgaWYgKGxhc3RJZHggPCB0ZXh0Lmxlbmd0aCkgb3V0LnB1c2godGV4dC5zbGljZShsYXN0SWR4KSlcbiAgcmV0dXJuIG91dFxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBT0EsTUFBTSxNQUFNLG1CQUFtQjtBQUN0QyxTQUFTQyxPQUFPLFFBQVEsOENBQThDO0FBQ3RFLFNBQTRDQywwQkFBMEIsUUFBUSx5QkFBeUI7QUFDdkcsU0FBU0MsbUJBQW1CLFFBQVEsa0VBQWtFO0FBQ3RHLFNBQVNDLHFCQUFxQixRQUFRLHVCQUF1QjtBQUM3RCxTQUFTQyw0QkFBNEIsUUFBUSx1QkFBdUI7QUFDcEUsU0FBU0MsMEJBQTBCLFFBQVEsMkJBQTJCOztBQUV0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVpBLFNBQUFDLEdBQUEsSUFBQUMsSUFBQSxFQUFBQyxJQUFBLElBQUFDLEtBQUE7QUFhQSxPQUFPLElBQU1DLG9CQUFvQixHQUFHLHFFQUFxRTtBQUN6RyxPQUFPLElBQU1DLHFCQUFxQixHQUFHLGlCQUFpQjtBQUV0RCxJQUFNQyxhQUFrQyxHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQztBQUV2RixJQUFNQyx3QkFBd0IsR0FBRyxTQUEzQkEsd0JBQXdCQSxDQUFJQyxJQUFZLEVBQThDO0VBQzFGLElBQU1DLElBQUksR0FBR0QsSUFBSSxD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
|