@dollhousemcp/mcp-server 2.0.32 → 2.0.34

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.
@@ -19,6 +19,14 @@ const PERMISSION_ROUTE_RATE_LIMIT_WINDOW_MS = 60_000;
19
19
  const DECISION_BUFFER_SIZE = 200;
20
20
  const CLAUDE_COMPATIBLE_HOOK_PLATFORMS = new Set(['claude_code', 'vscode']);
21
21
  const NORMALIZABLE_PERMISSION_DECISIONS = new Set(['allow', 'deny', 'ask']);
22
+ const CONTEXT_DETAIL_FIELDS = [
23
+ { key: 'session_id', label: 'Session', monospace: true },
24
+ { key: 'turn_id', label: 'Turn', monospace: true },
25
+ { key: 'tool_use_id', label: 'Tool Use', monospace: true },
26
+ { key: 'transcript_path', label: 'Transcript', monospace: true },
27
+ { key: 'cwd', label: 'Workspace', monospace: true },
28
+ { key: 'model', label: 'Model', monospace: true },
29
+ ];
22
30
  /** Extract a string field from a record, trying multiple keys in order */
23
31
  function extractString(obj, keys, fallback) {
24
32
  for (const key of keys) {
@@ -28,7 +36,10 @@ function extractString(obj, keys, fallback) {
28
36
  }
29
37
  return fallback;
30
38
  }
31
- function extractDecision(result) {
39
+ function isEmptyObject(value) {
40
+ return Object.keys(value).length === 0;
41
+ }
42
+ function extractDecision(result, platform) {
32
43
  const nested = result.hookSpecificOutput;
33
44
  if (nested && typeof nested === 'object' && !Array.isArray(nested)) {
34
45
  const nestedDecision = nested.permissionDecision;
@@ -43,8 +54,16 @@ function extractDecision(result) {
43
54
  return result.behavior;
44
55
  if (typeof result.allowed === 'boolean')
45
56
  return result.allowed ? 'allow' : 'deny';
57
+ if (platform === 'codex' && isEmptyObject(result))
58
+ return 'allow';
46
59
  return 'unknown';
47
60
  }
61
+ function normalizeOptionalRequestString(value) {
62
+ if (typeof value !== 'string')
63
+ return undefined;
64
+ const normalized = value.normalize('NFC');
65
+ return normalized === '' ? undefined : normalized;
66
+ }
48
67
  function extractReason(result) {
49
68
  const nested = result.hookSpecificOutput;
50
69
  if (nested && typeof nested === 'object' && !Array.isArray(nested)) {
@@ -74,7 +93,7 @@ function normalizePermissionResponseForPlatform(platform, input, result) {
74
93
  }
75
94
  return formatPermissionResponse('allow', platform, input);
76
95
  }
77
- function buildDecisionDetails(toolName, input, result, platform) {
96
+ function buildDecisionDetails(toolName, input, result, platform, context) {
78
97
  const details = [];
79
98
  if (platform) {
80
99
  details.push({ label: 'Platform', value: platform, monospace: true });
@@ -82,6 +101,12 @@ function buildDecisionDetails(toolName, input, result, platform) {
82
101
  if (toolName === 'Bash' && typeof input.command === 'string' && input.command !== '') {
83
102
  details.push({ label: 'Command', value: input.command, monospace: true });
84
103
  }
104
+ for (const descriptor of CONTEXT_DETAIL_FIELDS) {
105
+ const value = context[descriptor.key];
106
+ if (typeof value === 'string') {
107
+ details.push({ label: descriptor.label, value, monospace: descriptor.monospace });
108
+ }
109
+ }
85
110
  const targetDescriptors = [
86
111
  { key: 'file_path', label: 'File', monospace: true },
87
112
  { key: 'path', label: 'Path', monospace: true },
@@ -117,15 +142,20 @@ function createPermissionDecisionTracker(bufferSize = DECISION_BUFFER_SIZE) {
117
142
  const recentDecisions = [];
118
143
  let decisionCounter = 0;
119
144
  return {
120
- trackDecision(sessionId, toolName, input, result, platform) {
121
- const detailState = buildDecisionDetails(toolName, input, result, platform);
145
+ trackDecision(context, toolName, input, result, platform) {
146
+ const detailState = buildDecisionDetails(toolName, input, result, platform, context);
122
147
  const entry = {
123
148
  id: `d-${++decisionCounter}`,
124
149
  timestamp: new Date().toISOString(),
125
- ...(sessionId ? { session_id: sessionId } : {}),
150
+ ...(context.session_id ? { session_id: context.session_id } : {}),
151
+ ...(context.turn_id ? { turn_id: context.turn_id } : {}),
152
+ ...(context.tool_use_id ? { tool_use_id: context.tool_use_id } : {}),
153
+ ...(context.transcript_path ? { transcript_path: context.transcript_path } : {}),
154
+ ...(context.cwd ? { cwd: context.cwd } : {}),
155
+ ...(context.model ? { model: context.model } : {}),
126
156
  tool_name: toolName,
127
157
  command: toolName === 'Bash' && typeof input?.command === 'string' ? input.command : undefined,
128
- decision: extractDecision(result),
158
+ decision: extractDecision(result, platform),
129
159
  reason: extractReason(result),
130
160
  platform,
131
161
  target: detailState.target,
@@ -244,7 +274,14 @@ export function registerPermissionRoutes(router, handler, options = {}) {
244
274
  }
245
275
  // Unicode normalization (NFC) on string inputs to prevent homograph attacks
246
276
  const tool_name = typeof body.tool_name === 'string' ? body.tool_name.normalize('NFC') : undefined;
247
- const session_id = typeof body.session_id === 'string' ? body.session_id.normalize('NFC') : undefined;
277
+ const context = {
278
+ session_id: normalizeOptionalRequestString(body.session_id),
279
+ turn_id: normalizeOptionalRequestString(body.turn_id),
280
+ tool_use_id: normalizeOptionalRequestString(body.tool_use_id),
281
+ transcript_path: normalizeOptionalRequestString(body.transcript_path),
282
+ cwd: normalizeOptionalRequestString(body.cwd),
283
+ model: normalizeOptionalRequestString(body.model),
284
+ };
248
285
  const input = body.input;
249
286
  if (!tool_name) {
250
287
  res.json(formatPermissionResponse('allow', platform, input || {})); // fail open on bad input
@@ -258,7 +295,7 @@ export function registerPermissionRoutes(router, handler, options = {}) {
258
295
  tool_name,
259
296
  input: input || {},
260
297
  platform,
261
- ...(session_id ? { session_id } : {}),
298
+ ...(context.session_id ? { session_id: context.session_id } : {}),
262
299
  },
263
300
  }));
264
301
  const elapsedMs = Date.now() - startMs;
@@ -270,10 +307,10 @@ export function registerPermissionRoutes(router, handler, options = {}) {
270
307
  const rawResult = opResult.data;
271
308
  const responseData = normalizePermissionResponseForPlatform(platform, input || {}, rawResult);
272
309
  const trackedResult = { ...rawResult, ...responseData };
273
- const decision = extractDecision(responseData);
310
+ const decision = extractDecision(trackedResult, platform);
274
311
  logger.debug(`[WebUI/Gateway] evaluate_permission: ${tool_name} → ${decision} (${elapsedMs}ms)`);
275
312
  // Track decision for live dashboard feed
276
- decisionTracker.trackDecision(session_id, tool_name, input || {}, trackedResult, platform);
313
+ decisionTracker.trackDecision(context, tool_name, input || {}, trackedResult, platform);
277
314
  res.json(responseData);
278
315
  }
279
316
  catch (err) {
@@ -454,4 +491,4 @@ function normalizeAuthorityMode(value) {
454
491
  function asStringArray(value) {
455
492
  return Array.isArray(value) ? value.filter((entry) => typeof entry === 'string') : [];
456
493
  }
457
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvblJvdXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93ZWIvcm91dGVzL3Blcm1pc3Npb25Sb3V0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILE9BQU8sT0FBbUIsTUFBTSxTQUFTLENBQUM7QUFDMUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFL0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDeEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0QsT0FBTyxFQUNMLHlDQUF5QyxFQUN6QyxnQ0FBZ0MsRUFDaEMsNEJBQTRCLEVBQzVCLGdDQUFnQyxFQUNoQyw2QkFBNkIsRUFDN0IsNkJBQTZCLEdBQzlCLE1BQU0sZ0NBQWdDLENBQUM7QUFFeEMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDbkYsT0FBTyxFQUdMLDBCQUEwQixFQUMxQiwwQkFBMEIsRUFDMUIsNEJBQTRCLEVBQzVCLDBCQUEwQixHQUMzQixNQUFNLG9DQUFvQyxDQUFDO0FBeUQ1QyxNQUFNLG9DQUFvQyxHQUFHLEdBQUcsQ0FBQztBQUNqRCxNQUFNLHFDQUFxQyxHQUFHLE1BQU0sQ0FBQztBQUNyRCxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQztBQWFqQyxNQUFNLGdDQUFnQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDNUUsTUFBTSxpQ0FBaUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUc1RSwwRUFBMEU7QUFDMUUsU0FBUyxhQUFhLENBQUMsR0FBNEIsRUFB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QyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3pHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBlcm1pc3Npb24gZXZhbHVhdGlvbiBIVFRQIHJvdXRlcyBhbmQgZGVjaXNpb24gdHJhY2tpbmcuXG4gKlxuICogUHJvdmlkZXM6XG4gKiAtIFBPU1QgL2V2YWx1YXRlX3Blcm1pc3Npb24g4oCUIGV2YWx1YXRlcyB0b29sIHBlcm1pc3Npb25zIHZpYSBNQ1AtQVFMXG4gKiAtIEdFVCAvcGVybWlzc2lvbnMvc3RhdHVzIOKAlCByZXR1cm5zIGN1cnJlbnQgcG9saWNpZXMgYW5kIHJlY2VudCBkZWNpc2lvbnNcbiAqIC0gRGVjaXNpb24gdHJhY2tpbmcgcmluZyBidWZmZXIgZm9yIHRoZSBsaXZlIGRhc2hib2FyZCBmZWVkXG4gKi9cblxuaW1wb3J0IGV4cHJlc3MsIHsgUm91dGVyIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBNQ1BBUUxIYW5kbGVyIH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9NQ1BBUUxIYW5kbGVyLmpzJztcbmltcG9ydCB7IGZvcm1hdFBlcm1pc3Npb25SZXNwb25zZSB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL21jcC1hcWwvZXZhbHVhdGVQZXJtaXNzaW9uLmpzJztcbmltcG9ydCB7IGVuc3VyZUxhdGVzdFBvcnRGaWxlIH0gZnJvbSAnLi4vcG9ydERpc2NvdmVyeS5qcyc7XG5pbXBvcnQge1xuICBnZXRMYXN0UGVybWlzc2lvbkhvb2tTdGFydHVwUmVwYWlyU3VtbWFyeSxcbiAgZ2V0UGVybWlzc2lvbkhvb2tEaWFnbm9zdGljc1BhdGgsXG4gIGdldFBlcm1pc3Npb25Ib29rU3RhdHVzQXN5bmMsXG4gIHJlYWRMYXN0UGVybWlzc2lvbkhvb2tEaWFnbm9zdGljLFxuICByZWNvbmNpbGVQZXJtaXNzaW9uSG9va1N0YXR1cyxcbiAgc3VtbWFyaXplUGVybWlzc2lvbkhvb2tIZWFsdGgsXG59IGZyb20gJy4uLy4uL3V0aWxzL3Blcm1pc3Npb25Ib29rcy5qcyc7XG5cbmltcG9ydCB7IFNsaWRpbmdXaW5kb3dSYXRlTGltaXRlciB9IGZyb20gJy4uLy4uL3V0aWxzL1NsaWRpbmdXaW5kb3dSYXRlTGltaXRlci5qcyc7XG5pbXBvcnQge1xuICB0eXBlIFBlcm1pc3Npb25BdXRob3JpdHlIb3N0LFxuICB0eXBlIFBlcm1pc3Npb25BdXRob3JpdHlNb2RlLFxuICBQRVJNSVNTSU9OX0FVVEhPUklUWV9IT1NUUyxcbiAgUEVSTUlTU0lPTl9BVVRIT1JJVFlfTU9ERVMsXG4gIHJlYWRQZXJtaXNzaW9uQXV0aG9yaXR5U3RhdGUsXG4gIHNldFBlcm1pc3Npb25BdXRob3JpdHlNb2RlLFxufSBmcm9tICcuLi8uLi91dGlscy9wZXJtaXNzaW9uQXV0aG9yaXR5LmpzJztcblxuLy8g4pSA4pSAIFBlcm1pc3Npb24gRGVjaXNpb24gVHJhY2tpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBSaW5nIGJ1ZmZlciBvZiByZWNlbnQgcGVybWlzc2lvbiBkZWNpc2lvbnMgZm9yIHRoZSBsaXZlIGRhc2hib2FyZCBmZWVkLlxuXG5pbnRlcmZhY2UgUGVybWlzc2lvbkRlY2lzaW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgdGltZXN0YW1wOiBzdHJpbmc7XG4gIHNlc3Npb25faWQ/OiBzdHJpbmc7XG4gIHRvb2xfbmFtZTogc3RyaW5nO1xuICBjb21tYW5kPzogc3RyaW5nO1xuICBkZWNpc2lvbjogc3RyaW5nO1xuICByZWFzb24/OiBzdHJpbmc7XG4gIHBsYXRmb3JtPzogc3RyaW5nO1xuICB0YXJnZXQ/OiBzdHJpbmc7XG4gIHRhcmdldExhYmVsPzogc3RyaW5nO1xuICBkZXRhaWxzPzogUGVybWlzc2lvbkRlY2lzaW9uRGV0YWlsW107XG59XG5cbmludGVyZmFjZSBQZXJtaXNzaW9uRGVjaXNpb25EZXRhaWwge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBtb25vc3BhY2U/OiBib29sZWFuO1xufVxuXG50eXBlIFBlcm1pc3Npb25EZWNpc2lvblRhcmdldEtleSA9XG4gIHwgJ2ZpbGVfcGF0aCdcbiAgfCAncGF0aCdcbiAgfCAndXJsJ1xuICB8ICdwYXR0ZXJuJ1xuICB8ICdxdWVyeSdcbiAgfCAnZWxlbWVudF9uYW1lJ1xuICB8ICdyZXF1ZXN0X2lkJztcblxuaW50ZXJmYWNlIFBlcm1pc3Npb25EZWNpc2lvbklucHV0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb21tYW5kPzogc3RyaW5nO1xuICBmaWxlX3BhdGg/OiBzdHJpbmc7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcbiAgcGF0dGVybj86IHN0cmluZztcbiAgcXVlcnk/OiBzdHJpbmc7XG4gIGVsZW1lbnRfbmFtZT86IHN0cmluZztcbiAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBlcm1pc3Npb25EZWNpc2lvblRhcmdldERlc2NyaXB0b3Ige1xuICBrZXk6IFBlcm1pc3Npb25EZWNpc2lvblRhcmdldEtleTtcbiAgbGFiZWw6IHN0cmluZztcbiAgbW9ub3NwYWNlPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEtub3duUG9saWN5U2Vzc2lvbiB7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBkaXNwbGF5TmFtZTogc3RyaW5nO1xuICBzb3VyY2U6ICdwb2xpY3knO1xufVxuXG5jb25zdCBQRVJNSVNTSU9OX1JPVVRFX1JBVEVfTElNSVRfUkVRVUVTVFMgPSAxMjA7XG5jb25zdCBQRVJNSVNTSU9OX1JPVVRFX1JBVEVfTElNSVRfV0lORE9XX01TID0gNjBfMDAwO1xuY29uc3QgREVDSVNJT05fQlVGRkVSX1NJWkUgPSAyMDA7XG5cbmludGVyZmFjZSBQZXJtaXNzaW9uRGVjaXNpb25UcmFja2VyIHtcbiAgdHJhY2tEZWNpc2lvbihcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB0b29sTmFtZTogc3RyaW5nLFxuICAgIGlucHV0OiBQZXJtaXNzaW9uRGVjaXNpb25JbnB1dCxcbiAgICByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHBsYXRmb3JtOiBzdHJpbmcsXG4gICk6IHZvaWQ7XG4gIGdldFJlY2VudERlY2lzaW9ucygpOiBQZXJtaXNzaW9uRGVjaXNpb25bXTtcbn1cblxuY29uc3QgQ0xBVURFX0NPTVBBVElCTEVfSE9PS19QTEFURk9STVMgPSBuZXcgU2V0KFsnY2xhdWRlX2NvZGUnLCAndnNjb2RlJ10pO1xuY29uc3QgTk9STUFMSVpBQkxFX1BFUk1JU1NJT05fREVDSVNJT05TID0gbmV3IFNldChbJ2FsbG93JywgJ2RlbnknLCAnYXNrJ10pO1xudHlwZSBOb3JtYWxpemFibGVQZXJtaXNzaW9uRGVjaXNpb24gPSAnYWxsb3cnIHwgJ2RlbnknIHwgJ2Fzayc7XG5cbi8qKiBFeHRyYWN0IGEgc3RyaW5nIGZpZWxkIGZyb20gYSByZWNvcmQsIHRyeWluZyBtdWx0aXBsZSBrZXlzIGluIG9yZGVyICovXG5mdW5jdGlvbiBleHRyYWN0U3RyaW5nKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGtleXM6IHN0cmluZ1tdLCBmYWxsYmFjazogc3RyaW5nKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IHZhbCA9IG9iaj8uW2tleV07XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsO1xuICB9XG4gIHJldHVybiBmYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gZXh0cmFjdERlY2lzaW9uKHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcge1xuICBjb25zdCBuZXN0ZWQgPSByZXN1bHQuaG9va1NwZWNpZmljT3V0cHV0O1xuICBpZiAobmVzdGVkICYmIHR5cGVvZiBuZXN0ZWQgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KG5lc3RlZCkpIHtcbiAgICBjb25zdCBuZXN0ZWREZWNpc2lvbiA9IChuZXN0ZWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnBlcm1pc3Npb25EZWNpc2lvbjtcbiAgICBpZiAodHlwZW9mIG5lc3RlZERlY2lzaW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG5lc3RlZERlY2lzaW9uO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZXN1bHQucGVybWlzc2lvbiA9PT0gJ3N0cmluZycpIHJldHVybiByZXN1bHQucGVybWlzc2lvbjtcbiAgaWYgKHR5cGVvZiByZXN1bHQuZGVjaXNpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gcmVzdWx0LmRlY2lzaW9uO1xuICBpZiAodHlwZW9mIHJlc3VsdC5iZWhhdmlvciA9PT0gJ3N0cmluZycpIHJldHVybiByZXN1bHQuYmVoYXZpb3I7XG4gIGlmICh0eXBlb2YgcmVzdWx0LmFsbG93ZWQgPT09ICdib29sZWFuJykgcmV0dXJuIHJlc3VsdC5hbGxvd2VkID8gJ2FsbG93JyA6ICdkZW55JztcbiAgcmV0dXJuICd1bmtub3duJztcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFJlYXNvbihyZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgY29uc3QgbmVzdGVkID0gcmVzdWx0Lmhvb2tTcGVjaWZpY091dHB1dDtcbiAgaWYgKG5lc3RlZCAmJiB0eXBlb2YgbmVzdGVkID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShuZXN0ZWQpKSB7XG4gICAgY29uc3QgbmVzdGVkUmVhc29uID0gKG5lc3RlZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikucGVybWlzc2lvbkRlY2lzaW9uUmVhc29uO1xuICAgIGlmICh0eXBlb2YgbmVzdGVkUmVhc29uID09PSAnc3RyaW5nJykgcmV0dXJuIG5lc3RlZFJlYXNvbjtcbiAgfVxuXG4gIHJldHVybiBleHRyYWN0U3RyaW5nKHJlc3VsdCwgWydyZWFzb24nLCAnbWVzc2FnZSddLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZE5vcm1hbGl6ZUNsYXVkZUhvb2socGxhdGZvcm06IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGxhdGZvcm0gIT09IHVuZGVmaW5lZCAmJiBDTEFVREVfQ09NUEFUSUJMRV9IT09LX1BMQVRGT1JNUy5oYXMocGxhdGZvcm0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQZXJtaXNzaW9uUmVzcG9uc2VGb3JQbGF0Zm9ybShcbiAgcGxhdGZvcm06IHN0cmluZyxcbiAgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBpZiAoIXNob3VsZE5vcm1hbGl6ZUNsYXVkZUhvb2socGxhdGZvcm0pKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGNvbnN0IG5lc3RlZCA9IHJlc3VsdC5ob29rU3BlY2lmaWNPdXRwdXQ7XG4gIGlmIChuZXN0ZWQgJiYgdHlwZW9mIG5lc3RlZCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkobmVzdGVkKSkge1xuICAgIGNvbnN0IG5lc3RlZERlY2lzaW9uID0gKG5lc3RlZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikucGVybWlzc2lvbkRlY2lzaW9uO1xuICAgIGlmICh0eXBlb2YgbmVzdGVkRGVjaXNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRlY2lzaW9uID0gZXh0cmFjdERlY2lzaW9uKHJlc3VsdCk7XG4gIGlmIChOT1JNQUxJWkFCTEVfUEVSTUlTU0lPTl9ERUNJU0lPTlMuaGFzKGRlY2lzaW9uKSkge1xuICAgIHJldHVybiBmb3JtYXRQZXJtaXNzaW9uUmVzcG9uc2UoXG4gICAgICBkZWNpc2lvbiBhcyBOb3JtYWxpemFibGVQZXJtaXNzaW9uRGVjaXNpb24sXG4gICAgICBwbGF0Zm9ybSxcbiAgICAgIGlucHV0LFxuICAgICAgZXh0cmFjdFJlYXNvbihyZXN1bHQpLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKCdhbGxvdycsIHBsYXRmb3JtLCBpbnB1dCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRGVjaXNpb25EZXRhaWxzKFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBpbnB1dDogUGVybWlzc2lvbkRlY2lzaW9uSW5wdXQsXG4gIHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHBsYXRmb3JtOiBzdHJpbmcsXG4pOiB7IHRhcmdldD86IHN0cmluZzsgdGFyZ2V0TGFiZWw/OiBzdHJpbmc7IGRldGFpbHM6IFBlcm1pc3Npb25EZWNpc2lvbkRldGFpbFtdIH0ge1xuICBjb25zdCBkZXRhaWxzOiBQZXJtaXNzaW9uRGVjaXNpb25EZXRhaWxbXSA9IFtdO1xuXG4gIGlmIChwbGF0Zm9ybSkge1xuICAgIGRldGFpbHMucHVzaCh7IGxhYmVsOiAnUGxhdGZvcm0nLCB2YWx1ZTogcGxhdGZvcm0sIG1vbm9zcGFjZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGlmICh0b29sTmFtZSA9PT0gJ0Jhc2gnICYmIHR5cGVvZiBpbnB1dC5jb21tYW5kID09PSAnc3RyaW5nJyAmJiBpbnB1dC5jb21tYW5kICE9PSAnJykge1xuICAgIGRldGFpbHMucHVzaCh7IGxhYmVsOiAnQ29tbWFuZCcsIHZhbHVlOiBpbnB1dC5jb21tYW5kLCBtb25vc3BhY2U6IHRydWUgfSk7XG4gIH1cblxuICBjb25zdCB0YXJnZXREZXNjcmlwdG9yczogUGVybWlzc2lvbkRlY2lzaW9uVGFyZ2V0RGVzY3JpcHRvcltdID0gW1xuICAgIHsga2V5OiAnZmlsZV9wYXRoJywgbGFiZWw6ICdGaWxlJywgbW9ub3NwYWNlOiB0cnVlIH0sXG4gICAgeyBrZXk6ICdwYXRoJywgbGFiZWw6ICdQYXRoJywgbW9ub3NwYWNlOiB0cnVlIH0sXG4gICAgeyBrZXk6ICd1cmwnLCBsYWJlbDogJ1VSTCcgfSxcbiAgICB7IGtleTogJ3BhdHRlcm4nLCBsYWJlbDogJ1BhdHRlcm4nLCBtb25vc3BhY2U6IHRydWUgfSxcbiAgICB7IGtleTogJ3F1ZXJ5JywgbGFiZWw6ICdRdWVyeScgfSxcbiAgICB7IGtleTogJ2VsZW1lbnRfbmFtZScsIGxhYmVsOiAnRWxlbWVudCcsIG1vbm9zcGFjZTogdHJ1ZSB9LFxuICAgIHsga2V5OiAncmVxdWVzdF9pZCcsIGxhYmVsOiAnUmVxdWVzdCcsIG1vbm9zcGFjZTogdHJ1ZSB9LFxuICBdO1xuXG4gIGxldCB0YXJnZXQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHRhcmdldExhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBkZXNjcmlwdG9yIG9mIHRhcmdldERlc2NyaXB0b3JzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBpbnB1dFtkZXNjcmlwdG9yLmtleV07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0YXJnZXQgPSB2YWx1ZTtcbiAgICB0YXJnZXRMYWJlbCA9IGRlc2NyaXB0b3IubGFiZWw7XG4gICAgZGV0YWlscy5wdXNoKHsgbGFiZWw6IGRlc2NyaXB0b3IubGFiZWwsIHZhbHVlLCBtb25vc3BhY2U6IGRlc2NyaXB0b3IubW9ub3NwYWNlIH0pO1xuICAgIGJyZWFrO1xuICB9XG5cbiAgY29uc3QgbWF0Y2hlZFBhdHRlcm4gPSBleHRyYWN0U3RyaW5nKHJlc3VsdCwgWydtYXRjaGVkX3BhdHRlcm4nLCAnbWF0Y2hlZFBhdHRlcm4nXSwgJycpO1xuICBpZiAobWF0Y2hlZFBhdHRlcm4gIT09ICcnKSB7XG4gICAgZGV0YWlscy5wdXNoKHsgbGFiZWw6ICdNYXRjaGVkIFBhdHRlcm4nLCB2YWx1ZTogbWF0Y2hlZFBhdHRlcm4sIG1vbm9zcGFjZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGNvbnN0IHBvbGljeVNvdXJjZSA9IGV4dHJhY3RTdHJpbmcocmVzdWx0LCBbJ3BvbGljeV9zb3VyY2UnLCAncG9saWN5U291cmNlJ10sICcnKTtcbiAgaWYgKHBvbGljeVNvdXJjZSAhPT0gJycpIHtcbiAgICBkZXRhaWxzLnB1c2goeyBsYWJlbDogJ1BvbGljeSBTb3VyY2UnLCB2YWx1ZTogcG9saWN5U291cmNlLCBtb25vc3BhY2U6IHRydWUgfSk7XG4gIH1cblxuICByZXR1cm4geyB0YXJnZXQsIHRhcmdldExhYmVsLCBkZXRhaWxzIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBlcm1pc3Npb25EZWNpc2lvblRyYWNrZXIoYnVmZmVyU2l6ZSA9IERFQ0lTSU9OX0JVRkZFUl9TSVpFKTogUGVybWlzc2lvbkRlY2lzaW9uVHJhY2tlciB7XG4gIGNvbnN0IHJlY2VudERlY2lzaW9uczogUGVybWlzc2lvbkRlY2lzaW9uW10gPSBbXTtcbiAgbGV0IGRlY2lzaW9uQ291bnRlciA9IDA7XG5cbiAgcmV0dXJuIHtcbiAgICB0cmFja0RlY2lzaW9uKFxuICAgICAgc2Vzc2lvbklkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICB0b29sTmFtZTogc3RyaW5nLFxuICAgICAgaW5wdXQ6IFBlcm1pc3Npb25EZWNpc2lvbklucHV0LFxuICAgICAgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgIHBsYXRmb3JtOiBzdHJpbmcsXG4gICAgKTogdm9pZCB7XG4gICAgICBjb25zdCBkZXRhaWxTdGF0ZSA9IGJ1aWxkRGVjaXNpb25EZXRhaWxzKHRvb2xOYW1lLCBpbnB1dCwgcmVzdWx0LCBwbGF0Zm9ybSk7XG4gICAgICBjb25zdCBlbnRyeTogUGVybWlzc2lvbkRlY2lzaW9uID0ge1xuICAgICAgICBpZDogYGQtJHsrK2RlY2lzaW9uQ291bnRlcn1gLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgLi4uKHNlc3Npb25JZCA/IHsgc2Vzc2lvbl9pZDogc2Vzc2lvbklkIH0gOiB7fSksXG4gICAgICAgIHRvb2xfbmFtZTogdG9vbE5hbWUsXG4gICAgICAgIGNvbW1hbmQ6IHRvb2xOYW1lID09PSAnQmFzaCcgJiYgdHlwZW9mIGlucHV0Py5jb21tYW5kID09PSAnc3RyaW5nJyA/IGlucHV0LmNvbW1hbmQgOiB1bmRlZmluZWQsXG4gICAgICAgIGRlY2lzaW9uOiBleHRyYWN0RGVjaXNpb24ocmVzdWx0KSxcbiAgICAgICAgcmVhc29uOiBleHRyYWN0UmVhc29uKHJlc3VsdCksXG4gICAgICAgIHBsYXRmb3JtLFxuICAgICAgICB0YXJnZXQ6IGRldGFpbFN0YXRlLnRhcmdldCxcbiAgICAgICAgdGFyZ2V0TGFiZWw6IGRldGFpbFN0YXRlLnRhcmdldExhYmVsLFxuICAgICAgICBkZXRhaWxzOiBkZXRhaWxTdGF0ZS5kZXRhaWxzLFxuICAgICAgfTtcbiAgICAgIHJlY2VudERlY2lzaW9ucy51bnNoaWZ0KGVudHJ5KTtcbiAgICAgIGlmIChyZWNlbnREZWNpc2lvbnMubGVuZ3RoID4gYnVmZmVyU2l6ZSkge1xuICAgICAgICByZWNlbnREZWNpc2lvbnMubGVuZ3RoID0gYnVmZmVyU2l6ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGdldFJlY2VudERlY2lzaW9ucygpOiBQZXJtaXNzaW9uRGVjaXNpb25bXSB7XG4gICAgICByZXR1cm4gcmVjZW50RGVjaXNpb25zO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1lcmdlUnVsZUFycmF5cyguLi5zb3VyY2VzOiB1bmtub3duW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG1lcmdlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNvdXJjZSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygc291cmNlKSB7XG4gICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJyAmJiBlbnRyeSAhPT0gJycpIHtcbiAgICAgICAgbWVyZ2VkLmFkZChlbnRyeSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBBcnJheS5mcm9tKG1lcmdlZCk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBvbGljeUVsZW1lbnRzKGVsZW1lbnRzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICByZXR1cm4gZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiAoe1xuICAgIC4uLmVsZW1lbnQsXG4gICAgZWxlbWVudF9uYW1lOiByZXNvbHZlRWxlbWVudE5hbWUoZWxlbWVudCksXG4gICAgYWxsb3dSdWxlczogbWVyZ2VSdWxlQXJyYXlzKGVsZW1lbnQuYWxsb3dQYXR0ZXJucywgZWxlbWVudC5hbGxvd09wZXJhdGlvbnMpLFxuICAgIGNvbmZpcm1SdWxlczogbWVyZ2VSdWxlQXJyYXlzKGVsZW1lbnQuY29uZmlybVBhdHRlcm5zLCBlbGVtZW50LmNvbmZpcm1PcGVyYXRpb25zKSxcbiAgICBkZW55UnVsZXM6IG1lcmdlUnVsZUFycmF5cyhlbGVtZW50LmRlbnlQYXR0ZXJucywgZWxlbWVudC5kZW55T3BlcmF0aW9ucyksXG4gICAgaW52YWxpZEdhdGVrZWVwZXJQb2xpY3k6ICEhZWxlbWVudC5pbnZhbGlkR2F0ZWtlZXBlclBvbGljeSxcbiAgICBpbnZhbGlkR2F0ZWtlZXBlck1lc3NhZ2U6IHR5cGVvZiBlbGVtZW50LmludmFsaWRHYXRla2VlcGVyTWVzc2FnZSA9PT0gJ3N0cmluZycgPyBlbGVtZW50LmludmFsaWRHYXRla2VlcGVyTWVzc2FnZSA6IHVuZGVmaW5lZCxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRWxlbWVudE5hbWUoZWxlbWVudDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGVsZW1lbnQuZWxlbWVudF9uYW1lID09PSAnc3RyaW5nJykgcmV0dXJuIGVsZW1lbnQuZWxlbWVudF9uYW1lO1xuICBpZiAodHlwZW9mIGVsZW1lbnQubmFtZSA9PT0gJ3N0cmluZycpIHJldHVybiBlbGVtZW50Lm5hbWU7XG4gIHJldHVybiAnJztcbn1cblxuLyoqIEhlbHBlciB0byBleHRyYWN0IHNpbmdsZSByZXN1bHQgZnJvbSBNQ1AtQVFMIGJhdGNoIHJlc3BvbnNlICovXG5mdW5jdGlvbiBhc1NpbmdsZVJlc3VsdChyZXN1bHRzOiB1bmtub3duKTogeyBzdWNjZXNzOiBib29sZWFuOyBkYXRhPzogdW5rbm93bjsgZXJyb3I/OiBzdHJpbmcgfSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdHMpKSByZXR1cm4gcmVzdWx0c1swXSB8fCB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0VtcHR5IHJlc3VsdCcgfTtcbiAgcmV0dXJuIHJlc3VsdHMgYXMgeyBzdWNjZXNzOiBib29sZWFuOyBkYXRhPzogdW5rbm93bjsgZXJyb3I/OiBzdHJpbmcgfTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEtub3duUG9saWN5U2Vzc2lvbnMoZWxlbWVudHM6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pik6IEtub3duUG9saWN5U2Vzc2lvbltdIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBrbm93blNlc3Npb25zOiBLbm93blBvbGljeVNlc3Npb25bXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgIGNvbnN0IHNlc3Npb25JZHMgPSBBcnJheS5pc0FycmF5KGVsZW1lbnQuc2Vzc2lvbklkcykgPyBlbGVtZW50LnNlc3Npb25JZHMgOiBbXTtcbiAgICBmb3IgKGNvbnN0IHNlc3Npb25JZCBvZiBzZXNzaW9uSWRzKSB7XG4gICAgICBpZiAodHlwZW9mIHNlc3Npb25JZCAhPT0gJ3N0cmluZycgfHwgc2Vzc2lvbklkID09PSAnJyB8fCBzZWVuLmhhcyhzZXNzaW9uSWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBzZWVuLmFkZChzZXNzaW9uSWQpO1xuICAgICAga25vd25TZXNzaW9ucy5wdXNoKHtcbiAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICBkaXNwbGF5TmFtZTogc2Vzc2lvbklkLFxuICAgICAgICBzb3VyY2U6ICdwb2xpY3knLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGtub3duU2Vzc2lvbnMuc29ydCgoYSwgYikgPT4gYS5zZXNzaW9uSWQubG9jYWxlQ29tcGFyZShiLnNlc3Npb25JZCkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZWxmSGVhbExhdGVzdFBlcm1pc3Npb25Qb3J0RmlsZShwb3J0OiBudW1iZXIgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHR5cGVvZiBwb3J0ICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzSW50ZWdlcihwb3J0KSB8fCBwb3J0IDw9IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IGVuc3VyZUxhdGVzdFBvcnRGaWxlKHBvcnQpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZGVidWcoJ1tXZWJVSS9HYXRld2F5XSBDb3VsZCBub3QgcmVmcmVzaCBwZXJtaXNzaW9uLXNlcnZlci5wb3J0Jywge1xuICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgIHBvcnQsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUluc3RhbGxlZFBlcm1pc3Npb25BdXRob3JpdHlIb3N0cyhcbiAgaG9tZURpcjogc3RyaW5nLFxuICBhdXRob3JpdHlTdGF0ZTogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiByZWFkUGVybWlzc2lvbkF1dGhvcml0eVN0YXRlPj4sXG4gIGF1dG9SZXBhaXJIb29rQXNzZXRzOiBib29sZWFuLFxuKTogUHJvbWlzZTxQZXJtaXNzaW9uQXV0aG9yaXR5SG9zdFtdPiB7XG4gIGNvbnN0IGluc3RhbGxlZFN0YXR1c2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgUEVSTUlTU0lPTl9BVVRIT1JJVFlfSE9TVFMubWFwKGFzeW5jIChob3N0KSA9PiAoe1xuICAgICAgaG9zdCxcbiAgICAgIHN0YXR1czogYXdhaXQgcmVjb25jaWxlUGVybWlzc2lvbkhvb2tTdGF0dXMoaG9zdCwgeyBob21lRGlyLCBhdXRvUmVwYWlyOiBhdXRvUmVwYWlySG9va0Fzc2V0cyB9KSxcbiAgICB9KSksXG4gICk7XG5cbiAgY29uc3QgaW5zdGFsbGVkSG9zdHMgPSBpbnN0YWxsZWRTdGF0dXNlc1xuICAgIC5maWx0ZXIoKHsgc3RhdHVzIH0pID0+IHN0YXR1cy5pbnN0YWxsZWQpXG4gICAgLm1hcCgoeyBob3N0IH0pID0+IGhvc3QpO1xuXG4gIGNvbnN0IHBlcnNpc3RlZEhvc3RzID0gT2JqZWN0LmtleXMoYXV0aG9yaXR5U3RhdGUuaG9zdHMgfHwge30pLmZpbHRlcigoaG9zdCk6IGhvc3QgaXMgUGVybWlzc2lvbkF1dGhvcml0eUhvc3QgPT5cbiAgICAoUEVSTUlTU0lPTl9BVVRIT1JJVFlfSE9TVFMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKGhvc3QpLFxuICApO1xuXG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoaW5zdGFsbGVkSG9zdHMuY29uY2F0KHBlcnNpc3RlZEhvc3RzKSkpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIHBlcm1pc3Npb24tcmVsYXRlZCByb3V0ZXMgb24gYSBnYXRld2F5IHJvdXRlci5cbiAqIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIE1DUC1BUUwgaGFuZGxlciBmb3IgcG9saWN5IGV2YWx1YXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJQZXJtaXNzaW9uUm91dGVzT3B0aW9ucyB7XG4gIGhvbWVEaXI/OiBzdHJpbmc7XG4gIGF1dG9SZXBhaXJIb29rQXNzZXRzPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUGVybWlzc2lvblJvdXRlcyhcbiAgcm91dGVyOiBSb3V0ZXIsXG4gIGhhbmRsZXI6IE1DUEFRTEhhbmRsZXIsXG4gIG9wdGlvbnM6IFJlZ2lzdGVyUGVybWlzc2lvblJvdXRlc09wdGlvbnMgPSB7fSxcbik6IHZvaWQge1xuICBjb25zdCBhdXRob3JpdHlIb21lRGlyID0gb3B0aW9ucy5ob21lRGlyID8/IGhvbWVkaXIoKTtcbiAgY29uc3QgYXV0b1JlcGFpckhvb2tBc3NldHMgPSBvcHRpb25zLmF1dG9SZXBhaXJIb29rQXNzZXRzID8/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCc7XG4gIGNvbnN0IGRlY2lzaW9uVHJhY2tlciA9IGNyZWF0ZVBlcm1pc3Npb25EZWNpc2lvblRyYWNrZXIoKTtcbiAgLyoqXG4gICAqIFBPU1QgL2FwaS9ldmFsdWF0ZV9wZXJtaXNzaW9uXG4gICAqIFBlcm1pc3Npb24gZXZhbHVhdGlvbiBlbmRwb2ludCBmb3IgUHJlVG9vbFVzZSBob29rcy5cbiAgICogUm91dGVzIHRocm91Z2ggZXZhbHVhdGVfcGVybWlzc2lvbiBNQ1AtQVFMIFJFQUQgb3BlcmF0aW9uLlxuICAgKiBGYWlsLW9wZW46IHJldHVybnMgYWxsb3cgb24gYW55IGVycm9yIHRvIGF2b2lkIGJsb2NraW5nIHRoZSB1c2VyLlxuICAgKi9cbiAgY29uc3QgcGVybWlzc2lvbkxpbWl0ZXIgPSBuZXcgU2xpZGluZ1dpbmRvd1JhdGVMaW1pdGVyKFxuICAgIFBFUk1JU1NJT05fUk9VVEVfUkFURV9MSU1JVF9SRVFVRVNUUyxcbiAgICBQRVJNSVNTSU9OX1JPVVRFX1JBVEVfTElNSVRfV0lORE9XX01TLFxuICApO1xuICByb3V0ZXIucG9zdCgnL2V2YWx1YXRlX3Blcm1pc3Npb24nLCBleHByZXNzLmpzb24oKSwgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgYXdhaXQgc2VsZkhlYWxMYXRlc3RQZXJtaXNzaW9uUG9ydEZpbGUocmVxLnNvY2tldC5sb2NhbFBvcnQpO1xuXG4gICAgY29uc3QgYm9keSA9IHJlcS5ib2R5IGFzIHtcbiAgICAgIHRvb2xfbmFtZT86IHN0cmluZztcbiAgICAgIGlucHV0PzogUGVybWlzc2lvbkRlY2lzaW9uSW5wdXQ7XG4gICAgICBwbGF0Zm9ybT86IHN0cmluZztcbiAgICAgIHNlc3Npb25faWQ/OiBzdHJpbmc7XG4gICAgfTtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IHR5cGVvZiBib2R5LnBsYXRmb3JtID09PSAnc3RyaW5nJyA/IGJvZHkucGxhdGZvcm0ubm9ybWFsaXplKCdORkMnKSA6ICdjbGF1ZGVfY29kZSc7XG5cbiAgICBpZiAoIXBlcm1pc3Npb25MaW1pdGVyLnRyeUFjcXVpcmUoKSkge1xuICAgICAgcmVzLmpzb24oZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKCdhbGxvdycsIHBsYXRmb3JtLCB7fSkpOyAvLyBmYWlsIG9wZW4gb24gcmF0ZSBsaW1pdFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVuaWNvZGUgbm9ybWFsaXphdGlvbiAoTkZDKSBvbiBzdHJpbmcgaW5wdXRzIHRvIHByZXZlbnQgaG9tb2dyYXBoIGF0dGFja3NcbiAgICBjb25zdCB0b29sX25hbWUgPSB0eXBlb2YgYm9keS50b29sX25hbWUgPT09ICdzdHJpbmcnID8gYm9keS50b29sX25hbWUubm9ybWFsaXplKCdORkMnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzZXNzaW9uX2lkID0gdHlwZW9mIGJvZHkuc2Vzc2lvbl9pZCA9PT0gJ3N0cmluZycgPyBib2R5LnNlc3Npb25faWQubm9ybWFsaXplKCdORkMnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBpbnB1dCA9IGJvZHkuaW5wdXQ7XG5cbiAgICBpZiAoIXRvb2xfbmFtZSkge1xuICAgICAgcmVzLmpzb24oZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKCdhbGxvdycsIHBsYXRmb3JtLCBpbnB1dCB8fCB7fSkpOyAvLyBmYWlsIG9wZW4gb24gYmFkIGlucHV0XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRNcyA9IERhdGUubm93KCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9wUmVzdWx0ID0gYXNTaW5nbGVSZXN1bHQoYXdhaXQgaGFuZGxlci5oYW5kbGVSZWFkKHtcbiAgICAgICAgb3BlcmF0aW9uOiAnZXZhbHVhdGVfcGVybWlzc2lvbicsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHRvb2xfbmFtZSxcbiAgICAgICAgICBpbnB1dDogaW5wdXQgfHwge30sXG4gICAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgICAgLi4uKHNlc3Npb25faWQgPyB7IHNlc3Npb25faWQgfSA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IGVsYXBzZWRNcyA9IERhdGUubm93KCkgLSBzdGFydE1zO1xuXG4gICAgICBpZiAoIW9wUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtXZWJVSS9HYXRld2F5XSBldmFsdWF0ZV9wZXJtaXNzaW9uIGZhaWxlZCAoJHtlbGFwc2VkTXN9bXMpOiAke29wUmVzdWx0LmVycm9yfWApO1xuICAgICAgICByZXMuanNvbihmb3JtYXRQZXJtaXNzaW9uUmVzcG9uc2UoJ2FsbG93JywgcGxhdGZvcm0sIGlucHV0IHx8IHt9KSk7IC8vIGZhaWwgb3BlblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJhd1Jlc3VsdCA9IG9wUmVzdWx0LmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSBub3JtYWxpemVQZXJtaXNzaW9uUmVzcG9uc2VGb3JQbGF0Zm9ybShcbiAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgIGlucHV0IHx8IHt9LFxuICAgICAgICByYXdSZXN1bHQsXG4gICAgICApO1xuICAgICAgY29uc3QgdHJhY2tlZFJlc3VsdCA9IHsgLi4ucmF3UmVzdWx0LCAuLi5yZXNwb25zZURhdGEgfTtcbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZXh0cmFjdERlY2lzaW9uKHJlc3BvbnNlRGF0YSk7XG4gICAgICBsb2dnZXIuZGVidWcoYFtXZWJVSS9HYXRld2F5XSBldmFsdWF0ZV9wZXJtaXNzaW9uOiAke3Rvb2xfbmFtZX0g4oaSICR7ZGVjaXNpb259ICgke2VsYXBzZWRNc31tcylgKTtcblxuICAgICAgLy8gVHJhY2sgZGVjaXNpb24gZm9yIGxpdmUgZGFzaGJvYXJkIGZlZWRcbiAgICAgIGRlY2lzaW9uVHJhY2tlci50cmFja0RlY2lzaW9uKHNlc3Npb25faWQsIHRvb2xfbmFtZSwgaW5wdXQgfHwge30sIHRyYWNrZWRSZXN1bHQsIHBsYXRmb3JtKTtcblxuICAgICAgcmVzLmpzb24ocmVzcG9uc2VEYXRhKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRNcyA9IERhdGUubm93KCkgLSBzdGFydE1zO1xuICAgICAgbG9nZ2VyLmVycm9yKGBbV2ViVUkvR2F0ZXdheV0gZXZhbHVhdGVfcGVybWlzc2lvbiBlcnJvciAoJHtlbGFwc2VkTXN9bXMpOmAsIGVycik7XG4gICAgICByZXMuanNvbihmb3JtYXRQZXJtaXNzaW9uUmVzcG9uc2UoJ2FsbG93JywgcGxhdGZvcm0sIGlucHV0IHx8IHt9KSk7IC8vIGZhaWwgb3BlblxuICAgIH1cbiAgfSk7XG5cbiAgLyoqXG4gICAqIEdFVCAvYXBpL3Blcm1pc3Npb25zL3N0YXR1c1xuICAgKiBSZXR1cm5zIGN1cnJlbnQgcGVybWlzc2lvbiBwb2xpY2llcyBhbmQgcmVjZW50IGRlY2lzaW9uc1xuICAgKiBmb3IgdGhlIGxpdmUgcGVybWlzc2lvbnMgZGFzaGJvYXJkLlxuICAgKi9cbiAgcm91dGVyLmdldCgnL3Blcm1pc3Npb25zL3N0YXR1cycsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZWxmSGVhbExhdGVzdFBlcm1pc3Npb25Qb3J0RmlsZShyZXEuc29ja2V0LmxvY2FsUG9ydCk7XG5cbiAgICAgIGNvbnN0IHNlc3Npb25JZCA9IHR5cGVvZiByZXEucXVlcnlbJ3Nlc3Npb25JZCddID09PSAnc3RyaW5nJyAmJiByZXEucXVlcnlbJ3Nlc3Npb25JZCddXG4gICAgICAgID8gcmVxLnF1ZXJ5WydzZXNzaW9uSWQnXVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3Qgb3BSZXN1bHQgPSBhc1NpbmdsZVJlc3VsdChhd2FpdCBoYW5kbGVyLmhhbmRsZVJlYWQoe1xuICAgICAgICBvcGVyYXRpb246ICdnZXRfZWZmZWN0aXZlX2NsaV9wb2xpY2llcycsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHJlcG9ydGluZ19zY29wZTogJ2Rhc2hib2FyZCcsXG4gICAgICAgICAgLi4uKHNlc3Npb25JZCA/IHsgc2Vzc2lvbl9pZDogc2Vzc2lvbklkIH0gOiB7fSksXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIGlmICghb3BSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IGVycm9yOiBvcFJlc3VsdC5lcnJvciB8fCAnRmFpbGVkIHRvIGdldCBwb2xpY2llcycgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YSA9IG9wUmVzdWx0LmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCBhdXRob3JpdHlTdGF0ZSA9IGF3YWl0IHJlYWRQZXJtaXNzaW9uQXV0aG9yaXR5U3RhdGUoYXV0aG9yaXR5SG9tZURpcik7XG4gICAgICBjb25zdCBpbnN0YWxsZWRBdXRob3JpdHlIb3N0cyA9IGF3YWl0IHJlc29sdmVJbnN0YWxsZWRQZXJtaXNzaW9uQXV0aG9yaXR5SG9zdHMoXG4gICAgICAgIGF1dGhvcml0eUhvbWVEaXIsXG4gICAgICAgIGF1dGhvcml0eVN0YXRlLFxuICAgICAgICBhdXRvUmVwYWlySG9va0Fzc2V0cyxcbiAgICAgICk7XG4gICAgICBjb25zdCBob29rSG9zdCA9IHR5cGVvZiBkYXRhLmhvb2tIb3N0ID09PSAnc3RyaW5nJyA/IGRhdGEuaG9va0hvc3QgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBob29rU3RhdHVzID0gaG9va0hvc3RcbiAgICAgICAgPyBhd2FpdCByZWNvbmNpbGVQZXJtaXNzaW9uSG9va1N0YXR1cyhob29rSG9zdCwgeyBob21lRGlyOiBhdXRob3JpdHlIb21lRGlyLCBhdXRvUmVwYWlyOiBhdXRvUmVwYWlySG9va0Fzc2V0cyB9KVxuICAgICAgICA6IGF3YWl0IGdldFBlcm1pc3Npb25Ib29rU3RhdHVzQXN5bmMoYXV0aG9yaXR5SG9tZURpcik7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IG5vcm1hbGl6ZVBvbGljeUVsZW1lbnRzKChkYXRhLmVsZW1lbnRzIHx8IFtdKSBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pO1xuXG4gICAgICBjb25zdCBkZW55UGF0dGVybnMgPSAoZGF0YS5jb21iaW5lZERlbnlQYXR0ZXJucyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICBjb25zdCBhbGxvd1BhdHRlcm5zID0gKGRhdGEuY29tYmluZWRBbGxvd1BhdHRlcm5zIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKSA/PyBbXTtcbiAgICAgIGNvbnN0IGNvbmZpcm1QYXR0ZXJucyA9IChkYXRhLmNvbWJpbmVkQ29uZmlybVBhdHRlcm5zIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKSA/PyBbXTtcbiAgICAgIGNvbnN0IGRlbnlPcGVyYXRpb25zID0gKGRhdGEuY29tYmluZWREZW55T3BlcmF0aW9ucyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICBjb25zdCBhbGxvd09wZXJhdGlvbnMgPSAoZGF0YS5jb21iaW5lZEFsbG93T3BlcmF0aW9ucyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICBjb25zdCBjb25maXJtT3BlcmF0aW9ucyA9IChkYXRhLmNvbWJpbmVkQ29uZmlybU9wZXJhdGlvbnMgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQpID8/IFtdO1xuXG4gICAgICBjb25zdCBob29rU3RhcnR1cFJlcGFpciA9IGdldExhc3RQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJTdW1tYXJ5KCk7XG4gICAgICBjb25zdCBob29rRGlhZ25vc3RpY3NQYXRoID0gZ2V0UGVybWlzc2lvbkhvb2tEaWFnbm9zdGljc1BhdGgoYXV0aG9yaXR5SG9tZURpcik7XG4gICAgICBjb25zdCBob29rTGFzdERpYWdub3N0aWMgPSBhd2FpdCByZWFkTGFzdFBlcm1pc3Npb25Ib29rRGlhZ25vc3RpYyhhdXRob3JpdHlIb21lRGlyKTtcbiAgICAgIGNvbnN0IGhvb2tIZWFsdGhIb3N0ID0gaG9va1N0YXR1cy5ob3N0ID8/IGhvb2tIb3N0ID8/ICdtYW5hZ2VkLWhvc3QnO1xuICAgICAgY29uc3QgaG9va0hlYWx0aCA9IHN1bW1hcml6ZVBlcm1pc3Npb25Ib29rSGVhbHRoKHtcbiAgICAgICAgaW5zdGFsbGVkSG9zdHM6IGhvb2tTdGF0dXMuaW5zdGFsbGVkIHx8IGhvb2tTdGF0dXMuYXNzZXRzUHJlcGFyZWQgPyBbaG9va0hlYWx0aEhvc3RdIDogW10sXG4gICAgICAgIGN1cnJlbnRIb3N0czogaG9va1N0YXR1cy5hc3NldHNDdXJyZW50ID8gW2hvb2tIZWFsdGhIb3N0XSA6IFtdLFxuICAgICAgICByZXBhaXJlZEhvc3RzOiBob29rU3RhdHVzLmF1dG9SZXBhaXJlZCA/IFtob29rSGVhbHRoSG9zdF0gOiBbXSxcbiAgICAgICAgbmVlZHNSZXBhaXJIb3N0czogaG9va1N0YXR1cy5uZWVkc1JlcGFpciA/IFtob29rSGVhbHRoSG9zdF0gOiBbXSxcbiAgICAgICAgZGlhZ25vc3RpY3NQYXRoOiBob29rRGlhZ25vc3RpY3NQYXRoLFxuICAgICAgICBsYXN0RGlhZ25vc3RpYzogaG9va0xhc3REaWFnbm9zdGljLFxuICAgICAgICBsYXN0U3RhcnR1cFJlcGFpcjogaG9va1N0YXJ0dXBSZXBhaXIsXG4gICAgICB9KTtcblxuICAgICAgcmVzLmpzb24oe1xuICAgICAgICAuLi4oc2Vzc2lvbklkID8geyBzZXNzaW9uSWQgfSA6IHt9KSxcbiAgICAgICAgYWN0aXZlRWxlbWVudENvdW50OiBkYXRhLmFjdGl2ZUVsZW1lbnRDb3VudCxcbiAgICAgICAgaGFzQWxsb3dsaXN0OiBkYXRhLmhhc0FsbG93bGlzdCxcbiAgICAgICAgZGVueVBhdHRlcm5zLFxuICAgICAgICBhbGxvd1BhdHRlcm5zLFxuICAgICAgICBjb25maXJtUGF0dGVybnMsXG4gICAgICAgIGRlbnlPcGVyYXRpb25zLFxuICAgICAgICBhbGxvd09wZXJhdGlvbnMsXG4gICAgICAgIGNvbmZpcm1PcGVyYXRpb25zLFxuICAgICAgICBkZW55UnVsZXM6IG1lcmdlUnVsZUFycmF5cyhkZW55UGF0dGVybnMsIGRlbnlPcGVyYXRpb25zKSxcbiAgICAgICAgYWxsb3dSdWxlczogbWVyZ2VSdWxlQXJyYXlzKGFsbG93UGF0dGVybnMsIGFsbG93T3BlcmF0aW9ucyksXG4gICAgICAgIGNvbmZpcm1SdWxlczogbWVyZ2VSdWxlQXJyYXlzKGNvbmZpcm1QYXR0ZXJucywgY29uZmlybU9wZXJhdGlvbnMpLFxuICAgICAgICBlbGVtZW50cyxcbiAgICAgICAga25vd25TZXNzaW9uczogZXh0cmFjdEtub3duUG9saWN5U2Vzc2lvbnMoZWxlbWVudHMpLFxuICAgICAgICBwZXJtaXNzaW9uUHJvbXB0QWN0aXZlOiBkYXRhLnBlcm1pc3Npb25Qcm9tcHRBY3RpdmUsXG4gICAgICAgIGhvb2tJbnN0YWxsZWQ6IGhvb2tTdGF0dXMuaW5zdGFsbGVkLFxuICAgICAgICBob29rSG9zdDogZGF0YS5ob29rSG9zdCxcbiAgICAgICAgaG9va0Fzc2V0c1ByZXBhcmVkOiBob29rU3RhdHVzLmFzc2V0c1ByZXBhcmVkLFxuICAgICAgICBob29rQXNzZXRzQ3VycmVudDogaG9va1N0YXR1cy5hc3NldHNDdXJyZW50LFxuICAgICAgICBob29rQXV0b1JlcGFpcmVkOiBob29rU3RhdHVzLmF1dG9SZXBhaXJlZCxcbiAgICAgICAgaG9va05lZWRzUmVwYWlyOiBob29rU3RhdHVzLm5lZWRzUmVwYWlyLFxuICAgICAgICBob29rUmVwYWlyRXJyb3I6IGhvb2tTdGF0dXMucmVwYWlyRXJyb3IsXG4gICAgICAgIGhvb2tIZWFsdGgsXG4gICAgICAgIGhvb2tTdGFydHVwUmVwYWlyLFxuICAgICAgICBob29rRGlhZ25vc3RpY3M6IHtcbiAgICAgICAgICBsb2dQYXRoOiBob29rRGlhZ25vc3RpY3NQYXRoLFxuICAgICAgICAgIGxhc3RFdmVudDogaG9va0xhc3REaWFnbm9zdGljLFxuICAgICAgICB9LFxuICAgICAgICBhdXRob3JpdHk6IGF1dGhvcml0eVN0YXRlLFxuICAgICAgICBhdXRob3JpdHlTdXBwb3J0ZWRIb3N0czogaW5zdGFsbGVkQXV0aG9yaXR5SG9zdHMsXG4gICAgICAgIGF1dGhvcml0eVN1cHBvcnRlZE1vZGVzOiBbLi4uUEVSTUlTU0lPTl9BVVRIT1JJVFlfTU9ERVNdLFxuICAgICAgICBhdXRob3JpdHlBaU11dGFibGU6IGZhbHNlLFxuICAgICAgICBlbmZvcmNlbWVudFJlYWR5OiBkYXRhLmVuZm9yY2VtZW50UmVhZHksXG4gICAgICAgIGludmFsaWRQb2xpY3lFbGVtZW50Q291bnQ6IGRhdGEuaW52YWxpZFBvbGljeUVsZW1lbnRDb3VudCA/PyAwLFxuICAgICAgICBhZHZpc29yeTogZGF0YS5hZHZpc29yeSxcbiAgICAgICAgcmVjZW50RGVjaXNpb25zOiBkZWNpc2lvblRyYWNrZXIuZ2V0UmVjZW50RGVjaXNpb25zKCksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignW1dlYlVJL0dhdGV3YXldIHBlcm1pc3Npb25zL3N0YXR1cyBlcnJvcjonLCBlcnIpO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBlcnJvcjogJ0ZhaWxlZCB0byBnZXQgcGVybWlzc2lvbiBzdGF0dXMnIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcm91dGVyLmdldCgnL3Blcm1pc3Npb25zL2F1dGhvcml0eScsIGFzeW5jIChfcmVxLCByZXMpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYXV0aG9yaXR5U3RhdGUgPSBhd2FpdCByZWFkUGVybWlzc2lvbkF1dGhvcml0eVN0YXRlKGF1dGhvcml0eUhvbWVEaXIpO1xuICAgICAgY29uc3QgaW5zdGFsbGVkQXV0aG9yaXR5SG9zdHMgPSBhd2FpdCByZXNvbHZlSW5zdGFsbGVkUGVybWlzc2lvbkF1dGhvcml0eUhvc3RzKFxuICAgICAgICBhdXRob3JpdHlIb21lRGlyLFxuICAgICAgICBhdXRob3JpdHlTdGF0ZSxcbiAgICAgICAgYXV0b1JlcGFpckhvb2tBc3NldHMsXG4gICAgICApO1xuICAgICAgcmVzLmpzb24oe1xuICAgICAgICAuLi5hdXRob3JpdHlTdGF0ZSxcbiAgICAgICAgc3VwcG9ydGVkSG9zdHM6IGluc3RhbGxlZEF1dGhvcml0eUhvc3RzLFxuICAgICAgICBzdXBwb3J0ZWRNb2RlczogWy4uLlBFUk1JU1NJT05fQVVUSE9SSVRZX01PREVTXSxcbiAgICAgICAgYWlNdXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdbV2ViVUkvR2F0ZXdheV0gcGVybWlzc2lvbnMvYXV0aG9yaXR5IGVycm9yOicsIGVycik7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IGVycm9yOiAnRmFpbGVkIHRvIGdldCBwZXJtaXNzaW9uIGF1dGhvcml0eScgfSk7XG4gICAgfVxuICB9KTtcblxuICByb3V0ZXIucG9zdCgnL3Blcm1pc3Npb25zL2F1dGhvcml0eScsIGV4cHJlc3MuanNvbigpLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaG9zdCA9IG5vcm1hbGl6ZUF1dGhvcml0eUhvc3QocmVxLmJvZHk/Lmhvc3QpO1xuICAgICAgY29uc3QgbW9kZSA9IG5vcm1hbGl6ZUF1dGhvcml0eU1vZGUocmVxLmJvZHk/Lm1vZGUpO1xuICAgICAgY29uc3QgcmVhc29uID0gdHlwZW9mIHJlcS5ib2R5Py5yZWFzb24gPT09ICdzdHJpbmcnICYmIHJlcS5ib2R5LnJlYXNvbi50cmltKCkgIT09ICcnXG4gICAgICAgID8gcmVxLmJvZHkucmVhc29uLnRyaW0oKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKCFob3N0IHx8ICFtb2RlKSB7XG4gICAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtcbiAgICAgICAgICBlcnJvcjogJ2hvc3QgYW5kIG1vZGUgYXJlIHJlcXVpcmVkJyxcbiAgICAgICAgICBzdXBwb3J0ZWRIb3N0czogWy4uLlBFUk1JU1NJT05fQVVUSE9SSVRZX0hPU1RTXSxcbiAgICAgICAgICBzdXBwb3J0ZWRNb2RlczogWy4uLlBFUk1JU1NJT05fQVVUSE9SSVRZX01PREVTXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IHBvbGljaWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChtb2RlID09PSAnYXV0aG9yaXRhdGl2ZScpIHtcbiAgICAgICAgY29uc3QgcG9saWN5UmVzdWx0ID0gYXNTaW5nbGVSZXN1bHQoYXdhaXQgaGFuZGxlci5oYW5kbGVSZWFkKHtcbiAgICAgICAgICBvcGVyYXRpb246ICdnZXRfZWZmZWN0aXZlX2NsaV9wb2xpY2llcycsXG4gICAgICAgICAgcGFyYW1zOiB7IHJlcG9ydGluZ19zY29wZTogJ2Rhc2hib2FyZCcgfSxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGlmICghcG9saWN5UmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IGVycm9yOiBwb2xpY3lSZXN1bHQuZXJyb3IgfHwgJ0ZhaWxlZCB0byBmZXRjaCBlZmZlY3RpdmUgcG9saWNpZXMnIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHBvbGljaWVzID0gcG9saWN5UmVzdWx0LmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGF1dGhvcml0eVN0YXRlID0gYXdhaXQgc2V0UGVybWlzc2lvbkF1dGhvcml0eU1vZGUoe1xuICAgICAgICBob3N0LFxuICAgICAgICBtb2RlLFxuICAgICAgICByZWFzb24sXG4gICAgICAgIGhvbWVEaXI6IGF1dGhvcml0eUhvbWVEaXIsXG4gICAgICAgIHBvbGljaWVzOiBtb2RlID09PSAnYXV0aG9yaXRhdGl2ZSdcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgIGNvbWJpbmVkQWxsb3dQYXR0ZXJuczogYXNTdHJpbmdBcnJheShwb2xpY2llcz8uY29tYmluZWRBbGxvd1BhdHRlcm5zKSxcbiAgICAgICAgICAgIGNvbWJpbmVkQ29uZmlybVBhdHRlcm5zOiBhc1N0cmluZ0FycmF5KHBvbGljaWVzPy5jb21iaW5lZENvbmZpcm1QYXR0ZXJucyksXG4gICAgICAgICAgICBjb21iaW5lZERlbnlQYXR0ZXJuczogYXNTdHJpbmdBcnJheShwb2xpY2llcz8uY29tYmluZWREZW55UGF0dGVybnMpLFxuICAgICAgICAgIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuXG4gICAgICByZXMuanNvbih7IHN1Y2Nlc3M6IHRydWUsIGF1dGhvcml0eTogYXV0aG9yaXR5U3RhdGUgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgIGBbV2ViVUkvR2F0ZXdheV0gcGVybWlzc2lvbnMvYXV0aG9yaXR5IHVwZGF0ZSBlcnJvciAoaG9zdD0ke1N0cmluZyhyZXEuYm9keT8uaG9zdCA/PyAnJyl9LCBtb2RlPSR7U3RyaW5nKHJlcS5ib2R5Py5tb2RlID8/ICcnKX0pOmAsXG4gICAgICAgIGVycixcbiAgICAgICk7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ0ZhaWxlZCB0byB1cGRhdGUgcGVybWlzc2lvbiBhdXRob3JpdHknLFxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQXV0aG9yaXR5SG9zdCh2YWx1ZTogdW5rbm93bik6IFBlcm1pc3Npb25BdXRob3JpdHlIb3N0IHwgbnVsbCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIFBFUk1JU1NJT05fQVVUSE9SSVRZX0hPU1RTLmluY2x1ZGVzKHZhbHVlIGFzIFBlcm1pc3Npb25BdXRob3JpdHlIb3N0KVxuICAgID8gdmFsdWUgYXMgUGVybWlzc2lvbkF1dGhvcml0eUhvc3RcbiAgICA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUF1dGhvcml0eU1vZGUodmFsdWU6IHVua25vd24pOiBQZXJtaXNzaW9uQXV0aG9yaXR5TW9kZSB8IG51bGwge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBQRVJNSVNTSU9OX0FVVEhPUklUWV9NT0RFUy5pbmNsdWRlcyh2YWx1ZSBhcyBQZXJtaXNzaW9uQXV0aG9yaXR5TW9kZSlcbiAgICA/IHZhbHVlIGFzIFBlcm1pc3Npb25BdXRob3JpdHlNb2RlXG4gICAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBhc1N0cmluZ0FycmF5KHZhbHVlOiB1bmtub3duKTogc3RyaW5nW10ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgc3RyaW5nID0+IHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIDogW107XG59XG4iXX0=
494
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvblJvdXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93ZWIvcm91dGVzL3Blcm1pc3Npb25Sb3V0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILE9BQU8sT0FBbUIsTUFBTSxTQUFTLENBQUM7QUFDMUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFL0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDeEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0QsT0FBTyxFQUNMLHlDQUF5QyxFQUN6QyxnQ0FBZ0MsRUFDaEMsNEJBQTRCLEVBQzVCLGdDQUFnQyxFQUNoQyw2QkFBNkIsRUFDN0IsNkJBQTZCLEdBQzlCLE1BQU0sZ0NBQWdDLENBQUM7QUFFeEMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDbkYsT0FBTyxFQUdMLDBCQUEwQixFQUMxQiwwQkFBMEIsRUFDMUIsNEJBQTRCLEVBQzVCLDBCQUEwQixHQUMzQixNQUFNLG9DQUFvQyxDQUFDO0FBdUU1QyxNQUFNLG9DQUFvQyxHQUFHLEdBQUcsQ0FBQztBQUNqRCxNQUFNLHFDQUFxQyxHQUFHLE1BQU0sQ0FBQztBQUNyRCxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQztBQWFqQyxNQUFNLGdDQUFnQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDNUUsTUFBTSxpQ0FBaUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUU1RSxNQUFNLHFCQUFxQixHQUl0QjtJQUNILEVBQUUsR0FBRyxFQUFF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QUFTLGFBQWEsQ0FBQyxLQUFjO0lBQ25DLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBbUIsRUFBRSxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDekcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGVybWlzc2lvbiBldmFsdWF0aW9uIEhUVFAgcm91dGVzIGFuZCBkZWNpc2lvbiB0cmFja2luZy5cbiAqXG4gKiBQcm92aWRlczpcbiAqIC0gUE9TVCAvZXZhbHVhdGVfcGVybWlzc2lvbiDigJQgZXZhbHVhdGVzIHRvb2wgcGVybWlzc2lvbnMgdmlhIE1DUC1BUUxcbiAqIC0gR0VUIC9wZXJtaXNzaW9ucy9zdGF0dXMg4oCUIHJldHVybnMgY3VycmVudCBwb2xpY2llcyBhbmQgcmVjZW50IGRlY2lzaW9uc1xuICogLSBEZWNpc2lvbiB0cmFja2luZyByaW5nIGJ1ZmZlciBmb3IgdGhlIGxpdmUgZGFzaGJvYXJkIGZlZWRcbiAqL1xuXG5pbXBvcnQgZXhwcmVzcywgeyBSb3V0ZXIgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IE1DUEFRTEhhbmRsZXIgfSBmcm9tICcuLi8uLi9oYW5kbGVycy9tY3AtYXFsL01DUEFRTEhhbmRsZXIuanMnO1xuaW1wb3J0IHsgZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9ldmFsdWF0ZVBlcm1pc3Npb24uanMnO1xuaW1wb3J0IHsgZW5zdXJlTGF0ZXN0UG9ydEZpbGUgfSBmcm9tICcuLi9wb3J0RGlzY292ZXJ5LmpzJztcbmltcG9ydCB7XG4gIGdldExhc3RQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJTdW1tYXJ5LFxuICBnZXRQZXJtaXNzaW9uSG9va0RpYWdub3N0aWNzUGF0aCxcbiAgZ2V0UGVybWlzc2lvbkhvb2tTdGF0dXNBc3luYyxcbiAgcmVhZExhc3RQZXJtaXNzaW9uSG9va0RpYWdub3N0aWMsXG4gIHJlY29uY2lsZVBlcm1pc3Npb25Ib29rU3RhdHVzLFxuICBzdW1tYXJpemVQZXJtaXNzaW9uSG9va0hlYWx0aCxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvcGVybWlzc2lvbkhvb2tzLmpzJztcblxuaW1wb3J0IHsgU2xpZGluZ1dpbmRvd1JhdGVMaW1pdGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvU2xpZGluZ1dpbmRvd1JhdGVMaW1pdGVyLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgUGVybWlzc2lvbkF1dGhvcml0eUhvc3QsXG4gIHR5cGUgUGVybWlzc2lvbkF1dGhvcml0eU1vZGUsXG4gIFBFUk1JU1NJT05fQVVUSE9SSVRZX0hPU1RTLFxuICBQRVJNSVNTSU9OX0FVVEhPUklUWV9NT0RFUyxcbiAgcmVhZFBlcm1pc3Npb25BdXRob3JpdHlTdGF0ZSxcbiAgc2V0UGVybWlzc2lvbkF1dGhvcml0eU1vZGUsXG59IGZyb20gJy4uLy4uL3V0aWxzL3Blcm1pc3Npb25BdXRob3JpdHkuanMnO1xuXG4vLyDilIDilIAgUGVybWlzc2lvbiBEZWNpc2lvbiBUcmFja2luZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFJpbmcgYnVmZmVyIG9mIHJlY2VudCBwZXJtaXNzaW9uIGRlY2lzaW9ucyBmb3IgdGhlIGxpdmUgZGFzaGJvYXJkIGZlZWQuXG5cbmludGVyZmFjZSBQZXJtaXNzaW9uRGVjaXNpb24ge1xuICBpZDogc3RyaW5nO1xuICB0aW1lc3RhbXA6IHN0cmluZztcbiAgc2Vzc2lvbl9pZD86IHN0cmluZztcbiAgdHVybl9pZD86IHN0cmluZztcbiAgdG9vbF91c2VfaWQ/OiBzdHJpbmc7XG4gIHRyYW5zY3JpcHRfcGF0aD86IHN0cmluZztcbiAgY3dkPzogc3RyaW5nO1xuICBtb2RlbD86IHN0cmluZztcbiAgdG9vbF9uYW1lOiBzdHJpbmc7XG4gIGNvbW1hbmQ/OiBzdHJpbmc7XG4gIGRlY2lzaW9uOiBzdHJpbmc7XG4gIHJlYXNvbj86IHN0cmluZztcbiAgcGxhdGZvcm0/OiBzdHJpbmc7XG4gIHRhcmdldD86IHN0cmluZztcbiAgdGFyZ2V0TGFiZWw/OiBzdHJpbmc7XG4gIGRldGFpbHM/OiBQZXJtaXNzaW9uRGVjaXNpb25EZXRhaWxbXTtcbn1cblxuaW50ZXJmYWNlIFBlcm1pc3Npb25EZWNpc2lvbkRldGFpbCB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIG1vbm9zcGFjZT86IGJvb2xlYW47XG59XG5cbnR5cGUgUGVybWlzc2lvbkRlY2lzaW9uVGFyZ2V0S2V5ID1cbiAgfCAnZmlsZV9wYXRoJ1xuICB8ICdwYXRoJ1xuICB8ICd1cmwnXG4gIHwgJ3BhdHRlcm4nXG4gIHwgJ3F1ZXJ5J1xuICB8ICdlbGVtZW50X25hbWUnXG4gIHwgJ3JlcXVlc3RfaWQnO1xuXG5pbnRlcmZhY2UgUGVybWlzc2lvbkRlY2lzaW9uSW5wdXQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbW1hbmQ/OiBzdHJpbmc7XG4gIGZpbGVfcGF0aD86IHN0cmluZztcbiAgcGF0aD86IHN0cmluZztcbiAgdXJsPzogc3RyaW5nO1xuICBwYXR0ZXJuPzogc3RyaW5nO1xuICBxdWVyeT86IHN0cmluZztcbiAgZWxlbWVudF9uYW1lPzogc3RyaW5nO1xuICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUGVybWlzc2lvbkRlY2lzaW9uVGFyZ2V0RGVzY3JpcHRvciB7XG4gIGtleTogUGVybWlzc2lvbkRlY2lzaW9uVGFyZ2V0S2V5O1xuICBsYWJlbDogc3RyaW5nO1xuICBtb25vc3BhY2U/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgS25vd25Qb2xpY3lTZXNzaW9uIHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gIHNvdXJjZTogJ3BvbGljeSc7XG59XG5cbmludGVyZmFjZSBQZXJtaXNzaW9uRGVjaXNpb25Db250ZXh0IHtcbiAgc2Vzc2lvbl9pZD86IHN0cmluZztcbiAgdHVybl9pZD86IHN0cmluZztcbiAgdG9vbF91c2VfaWQ/OiBzdHJpbmc7XG4gIHRyYW5zY3JpcHRfcGF0aD86IHN0cmluZztcbiAgY3dkPzogc3RyaW5nO1xuICBtb2RlbD86IHN0cmluZztcbn1cblxuY29uc3QgUEVSTUlTU0lPTl9ST1VURV9SQVRFX0xJTUlUX1JFUVVFU1RTID0gMTIwO1xuY29uc3QgUEVSTUlTU0lPTl9ST1VURV9SQVRFX0xJTUlUX1dJTkRPV19NUyA9IDYwXzAwMDtcbmNvbnN0IERFQ0lTSU9OX0JVRkZFUl9TSVpFID0gMjAwO1xuXG5pbnRlcmZhY2UgUGVybWlzc2lvbkRlY2lzaW9uVHJhY2tlciB7XG4gIHRyYWNrRGVjaXNpb24oXG4gICAgY29udGV4dDogUGVybWlzc2lvbkRlY2lzaW9uQ29udGV4dCxcbiAgICB0b29sTmFtZTogc3RyaW5nLFxuICAgIGlucHV0OiBQZXJtaXNzaW9uRGVjaXNpb25JbnB1dCxcbiAgICByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHBsYXRmb3JtOiBzdHJpbmcsXG4gICk6IHZvaWQ7XG4gIGdldFJlY2VudERlY2lzaW9ucygpOiBQZXJtaXNzaW9uRGVjaXNpb25bXTtcbn1cblxuY29uc3QgQ0xBVURFX0NPTVBBVElCTEVfSE9PS19QTEFURk9STVMgPSBuZXcgU2V0KFsnY2xhdWRlX2NvZGUnLCAndnNjb2RlJ10pO1xuY29uc3QgTk9STUFMSVpBQkxFX1BFUk1JU1NJT05fREVDSVNJT05TID0gbmV3IFNldChbJ2FsbG93JywgJ2RlbnknLCAnYXNrJ10pO1xudHlwZSBOb3JtYWxpemFibGVQZXJtaXNzaW9uRGVjaXNpb24gPSAnYWxsb3cnIHwgJ2RlbnknIHwgJ2Fzayc7XG5jb25zdCBDT05URVhUX0RFVEFJTF9GSUVMRFM6IEFycmF5PHtcbiAga2V5OiBrZXlvZiBQZXJtaXNzaW9uRGVjaXNpb25Db250ZXh0O1xuICBsYWJlbDogc3RyaW5nO1xuICBtb25vc3BhY2U/OiBib29sZWFuO1xufT4gPSBbXG4gIHsga2V5OiAnc2Vzc2lvbl9pZCcsIGxhYmVsOiAnU2Vzc2lvbicsIG1vbm9zcGFjZTogdHJ1ZSB9LFxuICB7IGtleTogJ3R1cm5faWQnLCBsYWJlbDogJ1R1cm4nLCBtb25vc3BhY2U6IHRydWUgfSxcbiAgeyBrZXk6ICd0b29sX3VzZV9pZCcsIGxhYmVsOiAnVG9vbCBVc2UnLCBtb25vc3BhY2U6IHRydWUgfSxcbiAgeyBrZXk6ICd0cmFuc2NyaXB0X3BhdGgnLCBsYWJlbDogJ1RyYW5zY3JpcHQnLCBtb25vc3BhY2U6IHRydWUgfSxcbiAgeyBrZXk6ICdjd2QnLCBsYWJlbDogJ1dvcmtzcGFjZScsIG1vbm9zcGFjZTogdHJ1ZSB9LFxuICB7IGtleTogJ21vZGVsJywgbGFiZWw6ICdNb2RlbCcsIG1vbm9zcGFjZTogdHJ1ZSB9LFxuXTtcblxuLyoqIEV4dHJhY3QgYSBzdHJpbmcgZmllbGQgZnJvbSBhIHJlY29yZCwgdHJ5aW5nIG11bHRpcGxlIGtleXMgaW4gb3JkZXIgKi9cbmZ1bmN0aW9uIGV4dHJhY3RTdHJpbmcob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga2V5czogc3RyaW5nW10sIGZhbGxiYWNrOiBzdHJpbmcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY29uc3QgdmFsID0gb2JqPy5ba2V5XTtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHJldHVybiB2YWw7XG4gIH1cbiAgcmV0dXJuIGZhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiBpc0VtcHR5T2JqZWN0KHZhbHVlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdERlY2lzaW9uKHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHBsYXRmb3JtPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbmVzdGVkID0gcmVzdWx0Lmhvb2tTcGVjaWZpY091dHB1dDtcbiAgaWYgKG5lc3RlZCAmJiB0eXBlb2YgbmVzdGVkID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShuZXN0ZWQpKSB7XG4gICAgY29uc3QgbmVzdGVkRGVjaXNpb24gPSAobmVzdGVkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5wZXJtaXNzaW9uRGVjaXNpb247XG4gICAgaWYgKHR5cGVvZiBuZXN0ZWREZWNpc2lvbiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXN0ZWREZWNpc2lvbjtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcmVzdWx0LnBlcm1pc3Npb24gPT09ICdzdHJpbmcnKSByZXR1cm4gcmVzdWx0LnBlcm1pc3Npb247XG4gIGlmICh0eXBlb2YgcmVzdWx0LmRlY2lzaW9uID09PSAnc3RyaW5nJykgcmV0dXJuIHJlc3VsdC5kZWNpc2lvbjtcbiAgaWYgKHR5cGVvZiByZXN1bHQuYmVoYXZpb3IgPT09ICdzdHJpbmcnKSByZXR1cm4gcmVzdWx0LmJlaGF2aW9yO1xuICBpZiAodHlwZW9mIHJlc3VsdC5hbGxvd2VkID09PSAnYm9vbGVhbicpIHJldHVybiByZXN1bHQuYWxsb3dlZCA/ICdhbGxvdycgOiAnZGVueSc7XG4gIGlmIChwbGF0Zm9ybSA9PT0gJ2NvZGV4JyAmJiBpc0VtcHR5T2JqZWN0KHJlc3VsdCkpIHJldHVybiAnYWxsb3cnO1xuICByZXR1cm4gJ3Vua25vd24nO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVPcHRpb25hbFJlcXVlc3RTdHJpbmcodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBub3JtYWxpemVkID0gdmFsdWUubm9ybWFsaXplKCdORkMnKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQgPT09ICcnID8gdW5kZWZpbmVkIDogbm9ybWFsaXplZDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFJlYXNvbihyZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgY29uc3QgbmVzdGVkID0gcmVzdWx0Lmhvb2tTcGVjaWZpY091dHB1dDtcbiAgaWYgKG5lc3RlZCAmJiB0eXBlb2YgbmVzdGVkID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShuZXN0ZWQpKSB7XG4gICAgY29uc3QgbmVzdGVkUmVhc29uID0gKG5lc3RlZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikucGVybWlzc2lvbkRlY2lzaW9uUmVhc29uO1xuICAgIGlmICh0eXBlb2YgbmVzdGVkUmVhc29uID09PSAnc3RyaW5nJykgcmV0dXJuIG5lc3RlZFJlYXNvbjtcbiAgfVxuXG4gIHJldHVybiBleHRyYWN0U3RyaW5nKHJlc3VsdCwgWydyZWFzb24nLCAnbWVzc2FnZSddLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZE5vcm1hbGl6ZUNsYXVkZUhvb2socGxhdGZvcm06IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGxhdGZvcm0gIT09IHVuZGVmaW5lZCAmJiBDTEFVREVfQ09NUEFUSUJMRV9IT09LX1BMQVRGT1JNUy5oYXMocGxhdGZvcm0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQZXJtaXNzaW9uUmVzcG9uc2VGb3JQbGF0Zm9ybShcbiAgcGxhdGZvcm06IHN0cmluZyxcbiAgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBpZiAoIXNob3VsZE5vcm1hbGl6ZUNsYXVkZUhvb2socGxhdGZvcm0pKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGNvbnN0IG5lc3RlZCA9IHJlc3VsdC5ob29rU3BlY2lmaWNPdXRwdXQ7XG4gIGlmIChuZXN0ZWQgJiYgdHlwZW9mIG5lc3RlZCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkobmVzdGVkKSkge1xuICAgIGNvbnN0IG5lc3RlZERlY2lzaW9uID0gKG5lc3RlZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikucGVybWlzc2lvbkRlY2lzaW9uO1xuICAgIGlmICh0eXBlb2YgbmVzdGVkRGVjaXNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRlY2lzaW9uID0gZXh0cmFjdERlY2lzaW9uKHJlc3VsdCk7XG4gIGlmIChOT1JNQUxJWkFCTEVfUEVSTUlTU0lPTl9ERUNJU0lPTlMuaGFzKGRlY2lzaW9uKSkge1xuICAgIHJldHVybiBmb3JtYXRQZXJtaXNzaW9uUmVzcG9uc2UoXG4gICAgICBkZWNpc2lvbiBhcyBOb3JtYWxpemFibGVQZXJtaXNzaW9uRGVjaXNpb24sXG4gICAgICBwbGF0Zm9ybSxcbiAgICAgIGlucHV0LFxuICAgICAgZXh0cmFjdFJlYXNvbihyZXN1bHQpLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKCdhbGxvdycsIHBsYXRmb3JtLCBpbnB1dCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRGVjaXNpb25EZXRhaWxzKFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBpbnB1dDogUGVybWlzc2lvbkRlY2lzaW9uSW5wdXQsXG4gIHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHBsYXRmb3JtOiBzdHJpbmcsXG4gIGNvbnRleHQ6IFBlcm1pc3Npb25EZWNpc2lvbkNvbnRleHQsXG4pOiB7IHRhcmdldD86IHN0cmluZzsgdGFyZ2V0TGFiZWw/OiBzdHJpbmc7IGRldGFpbHM6IFBlcm1pc3Npb25EZWNpc2lvbkRldGFpbFtdIH0ge1xuICBjb25zdCBkZXRhaWxzOiBQZXJtaXNzaW9uRGVjaXNpb25EZXRhaWxbXSA9IFtdO1xuXG4gIGlmIChwbGF0Zm9ybSkge1xuICAgIGRldGFpbHMucHVzaCh7IGxhYmVsOiAnUGxhdGZvcm0nLCB2YWx1ZTogcGxhdGZvcm0sIG1vbm9zcGFjZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGlmICh0b29sTmFtZSA9PT0gJ0Jhc2gnICYmIHR5cGVvZiBpbnB1dC5jb21tYW5kID09PSAnc3RyaW5nJyAmJiBpbnB1dC5jb21tYW5kICE9PSAnJykge1xuICAgIGRldGFpbHMucHVzaCh7IGxhYmVsOiAnQ29tbWFuZCcsIHZhbHVlOiBpbnB1dC5jb21tYW5kLCBtb25vc3BhY2U6IHRydWUgfSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGRlc2NyaXB0b3Igb2YgQ09OVEVYVF9ERVRBSUxfRklFTERTKSB7XG4gICAgY29uc3QgdmFsdWUgPSBjb250ZXh0W2Rlc2NyaXB0b3Iua2V5XTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgZGV0YWlscy5wdXNoKHsgbGFiZWw6IGRlc2NyaXB0b3IubGFiZWwsIHZhbHVlLCBtb25vc3BhY2U6IGRlc2NyaXB0b3IubW9ub3NwYWNlIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRhcmdldERlc2NyaXB0b3JzOiBQZXJtaXNzaW9uRGVjaXNpb25UYXJnZXREZXNjcmlwdG9yW10gPSBbXG4gICAgeyBrZXk6ICdmaWxlX3BhdGgnLCBsYWJlbDogJ0ZpbGUnLCBtb25vc3BhY2U6IHRydWUgfSxcbiAgICB7IGtleTogJ3BhdGgnLCBsYWJlbDogJ1BhdGgnLCBtb25vc3BhY2U6IHRydWUgfSxcbiAgICB7IGtleTogJ3VybCcsIGxhYmVsOiAnVVJMJyB9LFxuICAgIHsga2V5OiAncGF0dGVybicsIGxhYmVsOiAnUGF0dGVybicsIG1vbm9zcGFjZTogdHJ1ZSB9LFxuICAgIHsga2V5OiAncXVlcnknLCBsYWJlbDogJ1F1ZXJ5JyB9LFxuICAgIHsga2V5OiAnZWxlbWVudF9uYW1lJywgbGFiZWw6ICdFbGVtZW50JywgbW9ub3NwYWNlOiB0cnVlIH0sXG4gICAgeyBrZXk6ICdyZXF1ZXN0X2lkJywgbGFiZWw6ICdSZXF1ZXN0JywgbW9ub3NwYWNlOiB0cnVlIH0sXG4gIF07XG5cbiAgbGV0IHRhcmdldDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgdGFyZ2V0TGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IGRlc2NyaXB0b3Igb2YgdGFyZ2V0RGVzY3JpcHRvcnMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGlucHV0W2Rlc2NyaXB0b3Iua2V5XTtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHRhcmdldCA9IHZhbHVlO1xuICAgIHRhcmdldExhYmVsID0gZGVzY3JpcHRvci5sYWJlbDtcbiAgICBkZXRhaWxzLnB1c2goeyBsYWJlbDogZGVzY3JpcHRvci5sYWJlbCwgdmFsdWUsIG1vbm9zcGFjZTogZGVzY3JpcHRvci5tb25vc3BhY2UgfSk7XG4gICAgYnJlYWs7XG4gIH1cblxuICBjb25zdCBtYXRjaGVkUGF0dGVybiA9IGV4dHJhY3RTdHJpbmcocmVzdWx0LCBbJ21hdGNoZWRfcGF0dGVybicsICdtYXRjaGVkUGF0dGVybiddLCAnJyk7XG4gIGlmIChtYXRjaGVkUGF0dGVybiAhPT0gJycpIHtcbiAgICBkZXRhaWxzLnB1c2goeyBsYWJlbDogJ01hdGNoZWQgUGF0dGVybicsIHZhbHVlOiBtYXRjaGVkUGF0dGVybiwgbW9ub3NwYWNlOiB0cnVlIH0pO1xuICB9XG5cbiAgY29uc3QgcG9saWN5U291cmNlID0gZXh0cmFjdFN0cmluZyhyZXN1bHQsIFsncG9saWN5X3NvdXJjZScsICdwb2xpY3lTb3VyY2UnXSwgJycpO1xuICBpZiAocG9saWN5U291cmNlICE9PSAnJykge1xuICAgIGRldGFpbHMucHVzaCh7IGxhYmVsOiAnUG9saWN5IFNvdXJjZScsIHZhbHVlOiBwb2xpY3lTb3VyY2UsIG1vbm9zcGFjZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHJldHVybiB7IHRhcmdldCwgdGFyZ2V0TGFiZWwsIGRldGFpbHMgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUGVybWlzc2lvbkRlY2lzaW9uVHJhY2tlcihidWZmZXJTaXplID0gREVDSVNJT05fQlVGRkVSX1NJWkUpOiBQZXJtaXNzaW9uRGVjaXNpb25UcmFja2VyIHtcbiAgY29uc3QgcmVjZW50RGVjaXNpb25zOiBQZXJtaXNzaW9uRGVjaXNpb25bXSA9IFtdO1xuICBsZXQgZGVjaXNpb25Db3VudGVyID0gMDtcblxuICByZXR1cm4ge1xuICAgIHRyYWNrRGVjaXNpb24oXG4gICAgICBjb250ZXh0OiBQZXJtaXNzaW9uRGVjaXNpb25Db250ZXh0LFxuICAgICAgdG9vbE5hbWU6IHN0cmluZyxcbiAgICAgIGlucHV0OiBQZXJtaXNzaW9uRGVjaXNpb25JbnB1dCxcbiAgICAgIHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICBwbGF0Zm9ybTogc3RyaW5nLFxuICAgICk6IHZvaWQge1xuICAgICAgY29uc3QgZGV0YWlsU3RhdGUgPSBidWlsZERlY2lzaW9uRGV0YWlscyh0b29sTmFtZSwgaW5wdXQsIHJlc3VsdCwgcGxhdGZvcm0sIGNvbnRleHQpO1xuICAgICAgY29uc3QgZW50cnk6IFBlcm1pc3Npb25EZWNpc2lvbiA9IHtcbiAgICAgICAgaWQ6IGBkLSR7KytkZWNpc2lvbkNvdW50ZXJ9YCxcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIC4uLihjb250ZXh0LnNlc3Npb25faWQgPyB7IHNlc3Npb25faWQ6IGNvbnRleHQuc2Vzc2lvbl9pZCB9IDoge30pLFxuICAgICAgICAuLi4oY29udGV4dC50dXJuX2lkID8geyB0dXJuX2lkOiBjb250ZXh0LnR1cm5faWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKGNvbnRleHQudG9vbF91c2VfaWQgPyB7IHRvb2xfdXNlX2lkOiBjb250ZXh0LnRvb2xfdXNlX2lkIH0gOiB7fSksXG4gICAgICAgIC4uLihjb250ZXh0LnRyYW5zY3JpcHRfcGF0aCA/IHsgdHJhbnNjcmlwdF9wYXRoOiBjb250ZXh0LnRyYW5zY3JpcHRfcGF0aCB9IDoge30pLFxuICAgICAgICAuLi4oY29udGV4dC5jd2QgPyB7IGN3ZDogY29udGV4dC5jd2QgfSA6IHt9KSxcbiAgICAgICAgLi4uKGNvbnRleHQubW9kZWwgPyB7IG1vZGVsOiBjb250ZXh0Lm1vZGVsIH0gOiB7fSksXG4gICAgICAgIHRvb2xfbmFtZTogdG9vbE5hbWUsXG4gICAgICAgIGNvbW1hbmQ6IHRvb2xOYW1lID09PSAnQmFzaCcgJiYgdHlwZW9mIGlucHV0Py5jb21tYW5kID09PSAnc3RyaW5nJyA/IGlucHV0LmNvbW1hbmQgOiB1bmRlZmluZWQsXG4gICAgICAgIGRlY2lzaW9uOiBleHRyYWN0RGVjaXNpb24ocmVzdWx0LCBwbGF0Zm9ybSksXG4gICAgICAgIHJlYXNvbjogZXh0cmFjdFJlYXNvbihyZXN1bHQpLFxuICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgdGFyZ2V0OiBkZXRhaWxTdGF0ZS50YXJnZXQsXG4gICAgICAgIHRhcmdldExhYmVsOiBkZXRhaWxTdGF0ZS50YXJnZXRMYWJlbCxcbiAgICAgICAgZGV0YWlsczogZGV0YWlsU3RhdGUuZGV0YWlscyxcbiAgICAgIH07XG4gICAgICByZWNlbnREZWNpc2lvbnMudW5zaGlmdChlbnRyeSk7XG4gICAgICBpZiAocmVjZW50RGVjaXNpb25zLmxlbmd0aCA+IGJ1ZmZlclNpemUpIHtcbiAgICAgICAgcmVjZW50RGVjaXNpb25zLmxlbmd0aCA9IGJ1ZmZlclNpemU7XG4gICAgICB9XG4gICAgfSxcbiAgICBnZXRSZWNlbnREZWNpc2lvbnMoKTogUGVybWlzc2lvbkRlY2lzaW9uW10ge1xuICAgICAgcmV0dXJuIHJlY2VudERlY2lzaW9ucztcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBtZXJnZVJ1bGVBcnJheXMoLi4uc291cmNlczogdW5rbm93bltdKTogc3RyaW5nW10ge1xuICBjb25zdCBtZXJnZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzb3VyY2UpKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNvdXJjZSkge1xuICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycgJiYgZW50cnkgIT09ICcnKSB7XG4gICAgICAgIG1lcmdlZC5hZGQoZW50cnkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gQXJyYXkuZnJvbShtZXJnZWQpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQb2xpY3lFbGVtZW50cyhlbGVtZW50czogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KTogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgcmV0dXJuIGVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gKHtcbiAgICAuLi5lbGVtZW50LFxuICAgIGVsZW1lbnRfbmFtZTogcmVzb2x2ZUVsZW1lbnROYW1lKGVsZW1lbnQpLFxuICAgIGFsbG93UnVsZXM6IG1lcmdlUnVsZUFycmF5cyhlbGVtZW50LmFsbG93UGF0dGVybnMsIGVsZW1lbnQuYWxsb3dPcGVyYXRpb25zKSxcbiAgICBjb25maXJtUnVsZXM6IG1lcmdlUnVsZUFycmF5cyhlbGVtZW50LmNvbmZpcm1QYXR0ZXJucywgZWxlbWVudC5jb25maXJtT3BlcmF0aW9ucyksXG4gICAgZGVueVJ1bGVzOiBtZXJnZVJ1bGVBcnJheXMoZWxlbWVudC5kZW55UGF0dGVybnMsIGVsZW1lbnQuZGVueU9wZXJhdGlvbnMpLFxuICAgIGludmFsaWRHYXRla2VlcGVyUG9saWN5OiAhIWVsZW1lbnQuaW52YWxpZEdhdGVrZWVwZXJQb2xpY3ksXG4gICAgaW52YWxpZEdhdGVrZWVwZXJNZXNzYWdlOiB0eXBlb2YgZWxlbWVudC5pbnZhbGlkR2F0ZWtlZXBlck1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZWxlbWVudC5pbnZhbGlkR2F0ZWtlZXBlck1lc3NhZ2UgOiB1bmRlZmluZWQsXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUVsZW1lbnROYW1lKGVsZW1lbnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBlbGVtZW50LmVsZW1lbnRfbmFtZSA9PT0gJ3N0cmluZycpIHJldHVybiBlbGVtZW50LmVsZW1lbnRfbmFtZTtcbiAgaWYgKHR5cGVvZiBlbGVtZW50Lm5hbWUgPT09ICdzdHJpbmcnKSByZXR1cm4gZWxlbWVudC5uYW1lO1xuICByZXR1cm4gJyc7XG59XG5cbi8qKiBIZWxwZXIgdG8gZXh0cmFjdCBzaW5nbGUgcmVzdWx0IGZyb20gTUNQLUFRTCBiYXRjaCByZXNwb25zZSAqL1xuZnVuY3Rpb24gYXNTaW5nbGVSZXN1bHQocmVzdWx0czogdW5rbm93bik6IHsgc3VjY2VzczogYm9vbGVhbjsgZGF0YT86IHVua25vd247IGVycm9yPzogc3RyaW5nIH0ge1xuICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHRzKSkgcmV0dXJuIHJlc3VsdHNbMF0gfHwgeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdFbXB0eSByZXN1bHQnIH07XG4gIHJldHVybiByZXN1bHRzIGFzIHsgc3VjY2VzczogYm9vbGVhbjsgZGF0YT86IHVua25vd247IGVycm9yPzogc3RyaW5nIH07XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RLbm93blBvbGljeVNlc3Npb25zKGVsZW1lbnRzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pOiBLbm93blBvbGljeVNlc3Npb25bXSB7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3Qga25vd25TZXNzaW9uczogS25vd25Qb2xpY3lTZXNzaW9uW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICBjb25zdCBzZXNzaW9uSWRzID0gQXJyYXkuaXNBcnJheShlbGVtZW50LnNlc3Npb25JZHMpID8gZWxlbWVudC5zZXNzaW9uSWRzIDogW107XG4gICAgZm9yIChjb25zdCBzZXNzaW9uSWQgb2Ygc2Vzc2lvbklkcykge1xuICAgICAgaWYgKHR5cGVvZiBzZXNzaW9uSWQgIT09ICdzdHJpbmcnIHx8IHNlc3Npb25JZCA9PT0gJycgfHwgc2Vlbi5oYXMoc2Vzc2lvbklkKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgc2Vlbi5hZGQoc2Vzc2lvbklkKTtcbiAgICAgIGtub3duU2Vzc2lvbnMucHVzaCh7XG4gICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgZGlzcGxheU5hbWU6IHNlc3Npb25JZCxcbiAgICAgICAgc291cmNlOiAncG9saWN5JyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBrbm93blNlc3Npb25zLnNvcnQoKGEsIGIpID0+IGEuc2Vzc2lvbklkLmxvY2FsZUNvbXBhcmUoYi5zZXNzaW9uSWQpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VsZkhlYWxMYXRlc3RQZXJtaXNzaW9uUG9ydEZpbGUocG9ydDogbnVtYmVyIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICh0eXBlb2YgcG9ydCAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0ludGVnZXIocG9ydCkgfHwgcG9ydCA8PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBlbnN1cmVMYXRlc3RQb3J0RmlsZShwb3J0KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdbV2ViVUkvR2F0ZXdheV0gQ291bGQgbm90IHJlZnJlc2ggcGVybWlzc2lvbi1zZXJ2ZXIucG9ydCcsIHtcbiAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICBwb3J0LFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVJbnN0YWxsZWRQZXJtaXNzaW9uQXV0aG9yaXR5SG9zdHMoXG4gIGhvbWVEaXI6IHN0cmluZyxcbiAgYXV0aG9yaXR5U3RhdGU6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgcmVhZFBlcm1pc3Npb25BdXRob3JpdHlTdGF0ZT4+LFxuICBhdXRvUmVwYWlySG9va0Fzc2V0czogYm9vbGVhbixcbik6IFByb21pc2U8UGVybWlzc2lvbkF1dGhvcml0eUhvc3RbXT4ge1xuICBjb25zdCBpbnN0YWxsZWRTdGF0dXNlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIFBFUk1JU1NJT05fQVVUSE9SSVRZX0hPU1RTLm1hcChhc3luYyAoaG9zdCkgPT4gKHtcbiAgICAgIGhvc3QsXG4gICAgICBzdGF0dXM6IGF3YWl0IHJlY29uY2lsZVBlcm1pc3Npb25Ib29rU3RhdHVzKGhvc3QsIHsgaG9tZURpciwgYXV0b1JlcGFpcjogYXV0b1JlcGFpckhvb2tBc3NldHMgfSksXG4gICAgfSkpLFxuICApO1xuXG4gIGNvbnN0IGluc3RhbGxlZEhvc3RzID0gaW5zdGFsbGVkU3RhdHVzZXNcbiAgICAuZmlsdGVyKCh7IHN0YXR1cyB9KSA9PiBzdGF0dXMuaW5zdGFsbGVkKVxuICAgIC5tYXAoKHsgaG9zdCB9KSA9PiBob3N0KTtcblxuICBjb25zdCBwZXJzaXN0ZWRIb3N0cyA9IE9iamVjdC5rZXlzKGF1dGhvcml0eVN0YXRlLmhvc3RzIHx8IHt9KS5maWx0ZXIoKGhvc3QpOiBob3N0IGlzIFBlcm1pc3Npb25BdXRob3JpdHlIb3N0ID0+XG4gICAgKFBFUk1JU1NJT05fQVVUSE9SSVRZX0hPU1RTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyhob3N0KSxcbiAgKTtcblxuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGluc3RhbGxlZEhvc3RzLmNvbmNhdChwZXJzaXN0ZWRIb3N0cykpKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBwZXJtaXNzaW9uLXJlbGF0ZWQgcm91dGVzIG9uIGEgZ2F0ZXdheSByb3V0ZXIuXG4gKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBNQ1AtQVFMIGhhbmRsZXIgZm9yIHBvbGljeSBldmFsdWF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdGVyUGVybWlzc2lvblJvdXRlc09wdGlvbnMge1xuICBob21lRGlyPzogc3RyaW5nO1xuICBhdXRvUmVwYWlySG9va0Fzc2V0cz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclBlcm1pc3Npb25Sb3V0ZXMoXG4gIHJvdXRlcjogUm91dGVyLFxuICBoYW5kbGVyOiBNQ1BBUUxIYW5kbGVyLFxuICBvcHRpb25zOiBSZWdpc3RlclBlcm1pc3Npb25Sb3V0ZXNPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgY29uc3QgYXV0aG9yaXR5SG9tZURpciA9IG9wdGlvbnMuaG9tZURpciA/PyBob21lZGlyKCk7XG4gIGNvbnN0IGF1dG9SZXBhaXJIb29rQXNzZXRzID0gb3B0aW9ucy5hdXRvUmVwYWlySG9va0Fzc2V0cyA/PyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Rlc3QnO1xuICBjb25zdCBkZWNpc2lvblRyYWNrZXIgPSBjcmVhdGVQZXJtaXNzaW9uRGVjaXNpb25UcmFja2VyKCk7XG4gIC8qKlxuICAgKiBQT1NUIC9hcGkvZXZhbHVhdGVfcGVybWlzc2lvblxuICAgKiBQZXJtaXNzaW9uIGV2YWx1YXRpb24gZW5kcG9pbnQgZm9yIFByZVRvb2xVc2UgaG9va3MuXG4gICAqIFJvdXRlcyB0aHJvdWdoIGV2YWx1YXRlX3Blcm1pc3Npb24gTUNQLUFRTCBSRUFEIG9wZXJhdGlvbi5cbiAgICogRmFpbC1vcGVuOiByZXR1cm5zIGFsbG93IG9uIGFueSBlcnJvciB0byBhdm9pZCBibG9ja2luZyB0aGUgdXNlci5cbiAgICovXG4gIGNvbnN0IHBlcm1pc3Npb25MaW1pdGVyID0gbmV3IFNsaWRpbmdXaW5kb3dSYXRlTGltaXRlcihcbiAgICBQRVJNSVNTSU9OX1JPVVRFX1JBVEVfTElNSVRfUkVRVUVTVFMsXG4gICAgUEVSTUlTU0lPTl9ST1VURV9SQVRFX0xJTUlUX1dJTkRPV19NUyxcbiAgKTtcbiAgcm91dGVyLnBvc3QoJy9ldmFsdWF0ZV9wZXJtaXNzaW9uJywgZXhwcmVzcy5qc29uKCksIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIGF3YWl0IHNlbGZIZWFsTGF0ZXN0UGVybWlzc2lvblBvcnRGaWxlKHJlcS5zb2NrZXQubG9jYWxQb3J0KTtcblxuICAgIGNvbnN0IGJvZHkgPSByZXEuYm9keSBhcyB7XG4gICAgICB0b29sX25hbWU/OiBzdHJpbmc7XG4gICAgICBpbnB1dD86IFBlcm1pc3Npb25EZWNpc2lvbklucHV0O1xuICAgICAgcGxhdGZvcm0/OiBzdHJpbmc7XG4gICAgICBzZXNzaW9uX2lkPzogc3RyaW5nO1xuICAgICAgdHVybl9pZD86IHN0cmluZztcbiAgICAgIHRvb2xfdXNlX2lkPzogc3RyaW5nO1xuICAgICAgdHJhbnNjcmlwdF9wYXRoPzogc3RyaW5nO1xuICAgICAgY3dkPzogc3RyaW5nO1xuICAgICAgbW9kZWw/OiBzdHJpbmc7XG4gICAgfTtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IHR5cGVvZiBib2R5LnBsYXRmb3JtID09PSAnc3RyaW5nJyA/IGJvZHkucGxhdGZvcm0ubm9ybWFsaXplKCdORkMnKSA6ICdjbGF1ZGVfY29kZSc7XG5cbiAgICBpZiAoIXBlcm1pc3Npb25MaW1pdGVyLnRyeUFjcXVpcmUoKSkge1xuICAgICAgcmVzLmpzb24oZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKCdhbGxvdycsIHBsYXRmb3JtLCB7fSkpOyAvLyBmYWlsIG9wZW4gb24gcmF0ZSBsaW1pdFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVuaWNvZGUgbm9ybWFsaXphdGlvbiAoTkZDKSBvbiBzdHJpbmcgaW5wdXRzIHRvIHByZXZlbnQgaG9tb2dyYXBoIGF0dGFja3NcbiAgICBjb25zdCB0b29sX25hbWUgPSB0eXBlb2YgYm9keS50b29sX25hbWUgPT09ICdzdHJpbmcnID8gYm9keS50b29sX25hbWUubm9ybWFsaXplKCdORkMnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb250ZXh0OiBQZXJtaXNzaW9uRGVjaXNpb25Db250ZXh0ID0ge1xuICAgICAgc2Vzc2lvbl9pZDogbm9ybWFsaXplT3B0aW9uYWxSZXF1ZXN0U3RyaW5nKGJvZHkuc2Vzc2lvbl9pZCksXG4gICAgICB0dXJuX2lkOiBub3JtYWxpemVPcHRpb25hbFJlcXVlc3RTdHJpbmcoYm9keS50dXJuX2lkKSxcbiAgICAgIHRvb2xfdXNlX2lkOiBub3JtYWxpemVPcHRpb25hbFJlcXVlc3RTdHJpbmcoYm9keS50b29sX3VzZV9pZCksXG4gICAgICB0cmFuc2NyaXB0X3BhdGg6IG5vcm1hbGl6ZU9wdGlvbmFsUmVxdWVzdFN0cmluZyhib2R5LnRyYW5zY3JpcHRfcGF0aCksXG4gICAgICBjd2Q6IG5vcm1hbGl6ZU9wdGlvbmFsUmVxdWVzdFN0cmluZyhib2R5LmN3ZCksXG4gICAgICBtb2RlbDogbm9ybWFsaXplT3B0aW9uYWxSZXF1ZXN0U3RyaW5nKGJvZHkubW9kZWwpLFxuICAgIH07XG4gICAgY29uc3QgaW5wdXQgPSBib2R5LmlucHV0O1xuXG4gICAgaWYgKCF0b29sX25hbWUpIHtcbiAgICAgIHJlcy5qc29uKGZvcm1hdFBlcm1pc3Npb25SZXNwb25zZSgnYWxsb3cnLCBwbGF0Zm9ybSwgaW5wdXQgfHwge30pKTsgLy8gZmFpbCBvcGVuIG9uIGJhZCBpbnB1dFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0TXMgPSBEYXRlLm5vdygpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvcFJlc3VsdCA9IGFzU2luZ2xlUmVzdWx0KGF3YWl0IGhhbmRsZXIuaGFuZGxlUmVhZCh7XG4gICAgICAgIG9wZXJhdGlvbjogJ2V2YWx1YXRlX3Blcm1pc3Npb24nLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICB0b29sX25hbWUsXG4gICAgICAgICAgaW5wdXQ6IGlucHV0IHx8IHt9LFxuICAgICAgICAgIHBsYXRmb3JtLFxuICAgICAgICAgIC4uLihjb250ZXh0LnNlc3Npb25faWQgPyB7IHNlc3Npb25faWQ6IGNvbnRleHQuc2Vzc2lvbl9pZCB9IDoge30pLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgICAgY29uc3QgZWxhcHNlZE1zID0gRGF0ZS5ub3coKSAtIHN0YXJ0TXM7XG5cbiAgICAgIGlmICghb3BSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBsb2dnZXIud2FybihgW1dlYlVJL0dhdGV3YXldIGV2YWx1YXRlX3Blcm1pc3Npb24gZmFpbGVkICgke2VsYXBzZWRNc31tcyk6ICR7b3BSZXN1bHQuZXJyb3J9YCk7XG4gICAgICAgIHJlcy5qc29uKGZvcm1hdFBlcm1pc3Npb25SZXNwb25zZSgnYWxsb3cnLCBwbGF0Zm9ybSwgaW5wdXQgfHwge30pKTsgLy8gZmFpbCBvcGVuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmF3UmVzdWx0ID0gb3BSZXN1bHQuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IG5vcm1hbGl6ZVBlcm1pc3Npb25SZXNwb25zZUZvclBsYXRmb3JtKFxuICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgaW5wdXQgfHwge30sXG4gICAgICAgIHJhd1Jlc3VsdCxcbiAgICAgICk7XG4gICAgICBjb25zdCB0cmFja2VkUmVzdWx0ID0geyAuLi5yYXdSZXN1bHQsIC4uLnJlc3BvbnNlRGF0YSB9O1xuICAgICAgY29uc3QgZGVjaXNpb24gPSBleHRyYWN0RGVjaXNpb24odHJhY2tlZFJlc3VsdCwgcGxhdGZvcm0pO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBbV2ViVUkvR2F0ZXdheV0gZXZhbHVhdGVfcGVybWlzc2lvbjogJHt0b29sX25hbWV9IOKGkiAke2RlY2lzaW9ufSAoJHtlbGFwc2VkTXN9bXMpYCk7XG5cbiAgICAgIC8vIFRyYWNrIGRlY2lzaW9uIGZvciBsaXZlIGRhc2hib2FyZCBmZWVkXG4gICAgICBkZWNpc2lvblRyYWNrZXIudHJhY2tEZWNpc2lvbihjb250ZXh0LCB0b29sX25hbWUsIGlucHV0IHx8IHt9LCB0cmFja2VkUmVzdWx0LCBwbGF0Zm9ybSk7XG5cbiAgICAgIHJlcy5qc29uKHJlc3BvbnNlRGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBlbGFwc2VkTXMgPSBEYXRlLm5vdygpIC0gc3RhcnRNcztcbiAgICAgIGxvZ2dlci5lcnJvcihgW1dlYlVJL0dhdGV3YXldIGV2YWx1YXRlX3Blcm1pc3Npb24gZXJyb3IgKCR7ZWxhcHNlZE1zfW1zKTpgLCBlcnIpO1xuICAgICAgcmVzLmpzb24oZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKCdhbGxvdycsIHBsYXRmb3JtLCBpbnB1dCB8fCB7fSkpOyAvLyBmYWlsIG9wZW5cbiAgICB9XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBHRVQgL2FwaS9wZXJtaXNzaW9ucy9zdGF0dXNcbiAgICogUmV0dXJucyBjdXJyZW50IHBlcm1pc3Npb24gcG9saWNpZXMgYW5kIHJlY2VudCBkZWNpc2lvbnNcbiAgICogZm9yIHRoZSBsaXZlIHBlcm1pc3Npb25zIGRhc2hib2FyZC5cbiAgICovXG4gIHJvdXRlci5nZXQoJy9wZXJtaXNzaW9ucy9zdGF0dXMnLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2VsZkhlYWxMYXRlc3RQZXJtaXNzaW9uUG9ydEZpbGUocmVxLnNvY2tldC5sb2NhbFBvcnQpO1xuXG4gICAgICBjb25zdCBzZXNzaW9uSWQgPSB0eXBlb2YgcmVxLnF1ZXJ5WydzZXNzaW9uSWQnXSA9PT0gJ3N0cmluZycgJiYgcmVxLnF1ZXJ5WydzZXNzaW9uSWQnXVxuICAgICAgICA/IHJlcS5xdWVyeVsnc2Vzc2lvbklkJ11cbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IG9wUmVzdWx0ID0gYXNTaW5nbGVSZXN1bHQoYXdhaXQgaGFuZGxlci5oYW5kbGVSZWFkKHtcbiAgICAgICAgb3BlcmF0aW9uOiAnZ2V0X2VmZmVjdGl2ZV9jbGlfcG9saWNpZXMnLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICByZXBvcnRpbmdfc2NvcGU6ICdkYXNoYm9hcmQnLFxuICAgICAgICAgIC4uLihzZXNzaW9uSWQgPyB7IHNlc3Npb25faWQ6IHNlc3Npb25JZCB9IDoge30pLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBpZiAoIW9wUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBlcnJvcjogb3BSZXN1bHQuZXJyb3IgfHwgJ0ZhaWxlZCB0byBnZXQgcG9saWNpZXMnIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBvcFJlc3VsdC5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgY29uc3QgYXV0aG9yaXR5U3RhdGUgPSBhd2FpdCByZWFkUGVybWlzc2lvbkF1dGhvcml0eVN0YXRlKGF1dGhvcml0eUhvbWVEaXIpO1xuICAgICAgY29uc3QgaW5zdGFsbGVkQXV0aG9yaXR5SG9zdHMgPSBhd2FpdCByZXNvbHZlSW5zdGFsbGVkUGVybWlzc2lvbkF1dGhvcml0eUhvc3RzKFxuICAgICAgICBhdXRob3JpdHlIb21lRGlyLFxuICAgICAgICBhdXRob3JpdHlTdGF0ZSxcbiAgICAgICAgYXV0b1JlcGFpckhvb2tBc3NldHMsXG4gICAgICApO1xuICAgICAgY29uc3QgaG9va0hvc3QgPSB0eXBlb2YgZGF0YS5ob29rSG9zdCA9PT0gJ3N0cmluZycgPyBkYXRhLmhvb2tIb3N0IDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaG9va1N0YXR1cyA9IGhvb2tIb3N0XG4gICAgICAgID8gYXdhaXQgcmVjb25jaWxlUGVybWlzc2lvbkhvb2tTdGF0dXMoaG9va0hvc3QsIHsgaG9tZURpcjogYXV0aG9yaXR5SG9tZURpciwgYXV0b1JlcGFpcjogYXV0b1JlcGFpckhvb2tBc3NldHMgfSlcbiAgICAgICAgOiBhd2FpdCBnZXRQZXJtaXNzaW9uSG9va1N0YXR1c0FzeW5jKGF1dGhvcml0eUhvbWVEaXIpO1xuICAgICAgY29uc3QgZWxlbWVudHMgPSBub3JtYWxpemVQb2xpY3lFbGVtZW50cygoZGF0YS5lbGVtZW50cyB8fCBbXSkgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KTtcblxuICAgICAgY29uc3QgZGVueVBhdHRlcm5zID0gKGRhdGEuY29tYmluZWREZW55UGF0dGVybnMgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQpID8/IFtdO1xuICAgICAgY29uc3QgYWxsb3dQYXR0ZXJucyA9IChkYXRhLmNvbWJpbmVkQWxsb3dQYXR0ZXJucyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICBjb25zdCBjb25maXJtUGF0dGVybnMgPSAoZGF0YS5jb21iaW5lZENvbmZpcm1QYXR0ZXJucyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICBjb25zdCBkZW55T3BlcmF0aW9ucyA9IChkYXRhLmNvbWJpbmVkRGVueU9wZXJhdGlvbnMgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQpID8/IFtdO1xuICAgICAgY29uc3QgYWxsb3dPcGVyYXRpb25zID0gKGRhdGEuY29tYmluZWRBbGxvd09wZXJhdGlvbnMgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQpID8/IFtdO1xuICAgICAgY29uc3QgY29uZmlybU9wZXJhdGlvbnMgPSAoZGF0YS5jb21iaW5lZENvbmZpcm1PcGVyYXRpb25zIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKSA/PyBbXTtcblxuICAgICAgY29uc3QgaG9va1N0YXJ0dXBSZXBhaXIgPSBnZXRMYXN0UGVybWlzc2lvbkhvb2tTdGFydHVwUmVwYWlyU3VtbWFyeSgpO1xuICAgICAgY29uc3QgaG9va0RpYWdub3N0aWNzUGF0aCA9IGdldFBlcm1pc3Npb25Ib29rRGlhZ25vc3RpY3NQYXRoKGF1dGhvcml0eUhvbWVEaXIpO1xuICAgICAgY29uc3QgaG9va0xhc3REaWFnbm9zdGljID0gYXdhaXQgcmVhZExhc3RQZXJtaXNzaW9uSG9va0RpYWdub3N0aWMoYXV0aG9yaXR5SG9tZURpcik7XG4gICAgICBjb25zdCBob29rSGVhbHRoSG9zdCA9IGhvb2tTdGF0dXMuaG9zdCA/PyBob29rSG9zdCA/PyAnbWFuYWdlZC1ob3N0JztcbiAgICAgIGNvbnN0IGhvb2tIZWFsdGggPSBzdW1tYXJpemVQZXJtaXNzaW9uSG9va0hlYWx0aCh7XG4gICAgICAgIGluc3RhbGxlZEhvc3RzOiBob29rU3RhdHVzLmluc3RhbGxlZCB8fCBob29rU3RhdHVzLmFzc2V0c1ByZXBhcmVkID8gW2hvb2tIZWFsdGhIb3N0XSA6IFtdLFxuICAgICAgICBjdXJyZW50SG9zdHM6IGhvb2tTdGF0dXMuYXNzZXRzQ3VycmVudCA/IFtob29rSGVhbHRoSG9zdF0gOiBbXSxcbiAgICAgICAgcmVwYWlyZWRIb3N0czogaG9va1N0YXR1cy5hdXRvUmVwYWlyZWQgPyBbaG9va0hlYWx0aEhvc3RdIDogW10sXG4gICAgICAgIG5lZWRzUmVwYWlySG9zdHM6IGhvb2tTdGF0dXMubmVlZHNSZXBhaXIgPyBbaG9va0hlYWx0aEhvc3RdIDogW10sXG4gICAgICAgIGRpYWdub3N0aWNzUGF0aDogaG9va0RpYWdub3N0aWNzUGF0aCxcbiAgICAgICAgbGFzdERpYWdub3N0aWM6IGhvb2tMYXN0RGlhZ25vc3RpYyxcbiAgICAgICAgbGFzdFN0YXJ0dXBSZXBhaXI6IGhvb2tTdGFydHVwUmVwYWlyLFxuICAgICAgfSk7XG5cbiAgICAgIHJlcy5qc29uKHtcbiAgICAgICAgLi4uKHNlc3Npb25JZCA/IHsgc2Vzc2lvbklkIH0gOiB7fSksXG4gICAgICAgIGFjdGl2ZUVsZW1lbnRDb3VudDogZGF0YS5hY3RpdmVFbGVtZW50Q291bnQsXG4gICAgICAgIGhhc0FsbG93bGlzdDogZGF0YS5oYXNBbGxvd2xpc3QsXG4gICAgICAgIGRlbnlQYXR0ZXJucyxcbiAgICAgICAgYWxsb3dQYXR0ZXJucyxcbiAgICAgICAgY29uZmlybVBhdHRlcm5zLFxuICAgICAgICBkZW55T3BlcmF0aW9ucyxcbiAgICAgICAgYWxsb3dPcGVyYXRpb25zLFxuICAgICAgICBjb25maXJtT3BlcmF0aW9ucyxcbiAgICAgICAgZGVueVJ1bGVzOiBtZXJnZVJ1bGVBcnJheXMoZGVueVBhdHRlcm5zLCBkZW55T3BlcmF0aW9ucyksXG4gICAgICAgIGFsbG93UnVsZXM6IG1lcmdlUnVsZUFycmF5cyhhbGxvd1BhdHRlcm5zLCBhbGxvd09wZXJhdGlvbnMpLFxuICAgICAgICBjb25maXJtUnVsZXM6IG1lcmdlUnVsZUFycmF5cyhjb25maXJtUGF0dGVybnMsIGNvbmZpcm1PcGVyYXRpb25zKSxcbiAgICAgICAgZWxlbWVudHMsXG4gICAgICAgIGtub3duU2Vzc2lvbnM6IGV4dHJhY3RLbm93blBvbGljeVNlc3Npb25zKGVsZW1lbnRzKSxcbiAgICAgICAgcGVybWlzc2lvblByb21wdEFjdGl2ZTogZGF0YS5wZXJtaXNzaW9uUHJvbXB0QWN0aXZlLFxuICAgICAgICBob29rSW5zdGFsbGVkOiBob29rU3RhdHVzLmluc3RhbGxlZCxcbiAgICAgICAgaG9va0hvc3Q6IGRhdGEuaG9va0hvc3QsXG4gICAgICAgIGhvb2tBc3NldHNQcmVwYXJlZDogaG9va1N0YXR1cy5hc3NldHNQcmVwYXJlZCxcbiAgICAgICAgaG9va0Fzc2V0c0N1cnJlbnQ6IGhvb2tTdGF0dXMuYXNzZXRzQ3VycmVudCxcbiAgICAgICAgaG9va0F1dG9SZXBhaXJlZDogaG9va1N0YXR1cy5hdXRvUmVwYWlyZWQsXG4gICAgICAgIGhvb2tOZWVkc1JlcGFpcjogaG9va1N0YXR1cy5uZWVkc1JlcGFpcixcbiAgICAgICAgaG9va1JlcGFpckVycm9yOiBob29rU3RhdHVzLnJlcGFpckVycm9yLFxuICAgICAgICBob29rSGVhbHRoLFxuICAgICAgICBob29rU3RhcnR1cFJlcGFpcixcbiAgICAgICAgaG9va0RpYWdub3N0aWNzOiB7XG4gICAgICAgICAgbG9nUGF0aDogaG9va0RpYWdub3N0aWNzUGF0aCxcbiAgICAgICAgICBsYXN0RXZlbnQ6IGhvb2tMYXN0RGlhZ25vc3RpYyxcbiAgICAgICAgfSxcbiAgICAgICAgYXV0aG9yaXR5OiBhdXRob3JpdHlTdGF0ZSxcbiAgICAgICAgYXV0aG9yaXR5U3VwcG9ydGVkSG9zdHM6IGluc3RhbGxlZEF1dGhvcml0eUhvc3RzLFxuICAgICAgICBhdXRob3JpdHlTdXBwb3J0ZWRNb2RlczogWy4uLlBFUk1JU1NJT05fQVVUSE9SSVRZX01PREVTXSxcbiAgICAgICAgYXV0aG9yaXR5QWlNdXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZW5mb3JjZW1lbnRSZWFkeTogZGF0YS5lbmZvcmNlbWVudFJlYWR5LFxuICAgICAgICBpbnZhbGlkUG9saWN5RWxlbWVudENvdW50OiBkYXRhLmludmFsaWRQb2xpY3lFbGVtZW50Q291bnQgPz8gMCxcbiAgICAgICAgYWR2aXNvcnk6IGRhdGEuYWR2aXNvcnksXG4gICAgICAgIHJlY2VudERlY2lzaW9uczogZGVjaXNpb25UcmFja2VyLmdldFJlY2VudERlY2lzaW9ucygpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1tXZWJVSS9HYXRld2F5XSBwZXJtaXNzaW9ucy9zdGF0dXMgZXJyb3I6JywgZXJyKTtcbiAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHsgZXJyb3I6ICdGYWlsZWQgdG8gZ2V0IHBlcm1pc3Npb24gc3RhdHVzJyB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJvdXRlci5nZXQoJy9wZXJtaXNzaW9ucy9hdXRob3JpdHknLCBhc3luYyAoX3JlcSwgcmVzKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGF1dGhvcml0eVN0YXRlID0gYXdhaXQgcmVhZFBlcm1pc3Npb25BdXRob3JpdHlTdGF0ZShhdXRob3JpdHlIb21lRGlyKTtcbiAgICAgIGNvbnN0IGluc3RhbGxlZEF1dGhvcml0eUhvc3RzID0gYXdhaXQgcmVzb2x2ZUluc3RhbGxlZFBlcm1pc3Npb25BdXRob3JpdHlIb3N0cyhcbiAgICAgICAgYXV0aG9yaXR5SG9tZURpcixcbiAgICAgICAgYXV0aG9yaXR5U3RhdGUsXG4gICAgICAgIGF1dG9SZXBhaXJIb29rQXNzZXRzLFxuICAgICAgKTtcbiAgICAgIHJlcy5qc29uKHtcbiAgICAgICAgLi4uYXV0aG9yaXR5U3RhdGUsXG4gICAgICAgIHN1cHBvcnRlZEhvc3RzOiBpbnN0YWxsZWRBdXRob3JpdHlIb3N0cyxcbiAgICAgICAgc3VwcG9ydGVkTW9kZXM6IFsuLi5QRVJNSVNTSU9OX0FVVEhPUklUWV9NT0RFU10sXG4gICAgICAgIGFpTXV0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignW1dlYlVJL0dhdGV3YXldIHBlcm1pc3Npb25zL2F1dGhvcml0eSBlcnJvcjonLCBlcnIpO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBlcnJvcjogJ0ZhaWxlZCB0byBnZXQgcGVybWlzc2lvbiBhdXRob3JpdHknIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcm91dGVyLnBvc3QoJy9wZXJtaXNzaW9ucy9hdXRob3JpdHknLCBleHByZXNzLmpzb24oKSwgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhvc3QgPSBub3JtYWxpemVBdXRob3JpdHlIb3N0KHJlcS5ib2R5Py5ob3N0KTtcbiAgICAgIGNvbnN0IG1vZGUgPSBub3JtYWxpemVBdXRob3JpdHlNb2RlKHJlcS5ib2R5Py5tb2RlKTtcbiAgICAgIGNvbnN0IHJlYXNvbiA9IHR5cGVvZiByZXEuYm9keT8ucmVhc29uID09PSAnc3RyaW5nJyAmJiByZXEuYm9keS5yZWFzb24udHJpbSgpICE9PSAnJ1xuICAgICAgICA/IHJlcS5ib2R5LnJlYXNvbi50cmltKClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICghaG9zdCB8fCAhbW9kZSkge1xuICAgICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7XG4gICAgICAgICAgZXJyb3I6ICdob3N0IGFuZCBtb2RlIGFyZSByZXF1aXJlZCcsXG4gICAgICAgICAgc3VwcG9ydGVkSG9zdHM6IFsuLi5QRVJNSVNTSU9OX0FVVEhPUklUWV9IT1NUU10sXG4gICAgICAgICAgc3VwcG9ydGVkTW9kZXM6IFsuLi5QRVJNSVNTSU9OX0FVVEhPUklUWV9NT0RFU10sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBwb2xpY2llczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAobW9kZSA9PT0gJ2F1dGhvcml0YXRpdmUnKSB7XG4gICAgICAgIGNvbnN0IHBvbGljeVJlc3VsdCA9IGFzU2luZ2xlUmVzdWx0KGF3YWl0IGhhbmRsZXIuaGFuZGxlUmVhZCh7XG4gICAgICAgICAgb3BlcmF0aW9uOiAnZ2V0X2VmZmVjdGl2ZV9jbGlfcG9saWNpZXMnLFxuICAgICAgICAgIHBhcmFtczogeyByZXBvcnRpbmdfc2NvcGU6ICdkYXNoYm9hcmQnIH0sXG4gICAgICAgIH0pKTtcblxuICAgICAgICBpZiAoIXBvbGljeVJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBlcnJvcjogcG9saWN5UmVzdWx0LmVycm9yIHx8ICdGYWlsZWQgdG8gZmV0Y2ggZWZmZWN0aXZlIHBvbGljaWVzJyB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBwb2xpY2llcyA9IHBvbGljeVJlc3VsdC5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhdXRob3JpdHlTdGF0ZSA9IGF3YWl0IHNldFBlcm1pc3Npb25BdXRob3JpdHlNb2RlKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgbW9kZSxcbiAgICAgICAgcmVhc29uLFxuICAgICAgICBob21lRGlyOiBhdXRob3JpdHlIb21lRGlyLFxuICAgICAgICBwb2xpY2llczogbW9kZSA9PT0gJ2F1dGhvcml0YXRpdmUnXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICBjb21iaW5lZEFsbG93UGF0dGVybnM6IGFzU3RyaW5nQXJyYXkocG9saWNpZXM/LmNvbWJpbmVkQWxsb3dQYXR0ZXJucyksXG4gICAgICAgICAgICBjb21iaW5lZENvbmZpcm1QYXR0ZXJuczogYXNTdHJpbmdBcnJheShwb2xpY2llcz8uY29tYmluZWRDb25maXJtUGF0dGVybnMpLFxuICAgICAgICAgICAgY29tYmluZWREZW55UGF0dGVybnM6IGFzU3RyaW5nQXJyYXkocG9saWNpZXM/LmNvbWJpbmVkRGVueVBhdHRlcm5zKSxcbiAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcblxuICAgICAgcmVzLmpzb24oeyBzdWNjZXNzOiB0cnVlLCBhdXRob3JpdHk6IGF1dGhvcml0eVN0YXRlIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICBgW1dlYlVJL0dhdGV3YXldIHBlcm1pc3Npb25zL2F1dGhvcml0eSB1cGRhdGUgZXJyb3IgKGhvc3Q9JHtTdHJpbmcocmVxLmJvZHk/Lmhvc3QgPz8gJycpfSwgbW9kZT0ke1N0cmluZyhyZXEuYm9keT8ubW9kZSA/PyAnJyl9KTpgLFxuICAgICAgICBlcnIsXG4gICAgICApO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6ICdGYWlsZWQgdG8gdXBkYXRlIHBlcm1pc3Npb24gYXV0aG9yaXR5JyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUF1dGhvcml0eUhvc3QodmFsdWU6IHVua25vd24pOiBQZXJtaXNzaW9uQXV0aG9yaXR5SG9zdCB8IG51bGwge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBQRVJNSVNTSU9OX0FVVEhPUklUWV9IT1NUUy5pbmNsdWRlcyh2YWx1ZSBhcyBQZXJtaXNzaW9uQXV0aG9yaXR5SG9zdClcbiAgICA/IHZhbHVlIGFzIFBlcm1pc3Npb25BdXRob3JpdHlIb3N0XG4gICAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVBdXRob3JpdHlNb2RlKHZhbHVlOiB1bmtub3duKTogUGVybWlzc2lvbkF1dGhvcml0eU1vZGUgfCBudWxsIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgUEVSTUlTU0lPTl9BVVRIT1JJVFlfTU9ERVMuaW5jbHVkZXModmFsdWUgYXMgUGVybWlzc2lvbkF1dGhvcml0eU1vZGUpXG4gICAgPyB2YWx1ZSBhcyBQZXJtaXNzaW9uQXV0aG9yaXR5TW9kZVxuICAgIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gYXNTdHJpbmdBcnJheSh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUuZmlsdGVyKChlbnRyeSk6IGVudHJ5IGlzIHN0cmluZyA9PiB0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSA6IFtdO1xufVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dollhousemcp/mcp-server",
3
- "version": "2.0.32",
3
+ "version": "2.0.34",
4
4
  "description": "DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -178,7 +178,7 @@
178
178
  "@dollhousemcp/safety": "^1.0.0",
179
179
  "@modelcontextprotocol/sdk": "^1.25.1",
180
180
  "chalk": "^5.6.2",
181
- "dompurify": "^3.4.0",
181
+ "dompurify": "^3.4.11",
182
182
  "dotenv": "^17.2.3",
183
183
  "express": "^5.2.1",
184
184
  "extract-zip": "^2.0.1",
@@ -193,7 +193,7 @@
193
193
  "posthog-node": "^5.24.17",
194
194
  "qrcode": "^1.5.4",
195
195
  "smol-toml": "^1.6.1",
196
- "uuid": "^11.1.0",
196
+ "uuid": "^11.1.1",
197
197
  "zod": "^4.3.6"
198
198
  },
199
199
  "devDependencies": {
@@ -239,7 +239,23 @@
239
239
  "@istanbuljs/load-nyc-config": {
240
240
  "js-yaml": "3.14.2"
241
241
  },
242
- "hono": "4.12.14",
243
- "@hono/node-server": "1.19.13"
242
+ "hono": "4.12.27",
243
+ "@hono/node-server": "1.19.13",
244
+ "fast-uri": "3.1.2",
245
+ "ip-address": "10.1.1",
246
+ "lodash": "4.18.1",
247
+ "picomatch@<2.3.2": "2.3.2",
248
+ "picomatch@>=4.0.0 <4.0.4": "4.0.4",
249
+ "brace-expansion@<1.1.13": "1.1.13",
250
+ "brace-expansion@>=2.0.0 <2.0.3": "2.0.3",
251
+ "express": {
252
+ "path-to-regexp": "8.4.2"
253
+ },
254
+ "giget": {
255
+ "tar": "7.5.16"
256
+ },
257
+ "form-data": "4.0.6",
258
+ "qs": "6.15.2",
259
+ "ws": "8.21.0"
244
260
  }
245
261
  }
@@ -300,6 +300,12 @@ append_diagnostic_record "received_input" "received_input"
300
300
  # Extract tool_name and tool_input from the hook payload
301
301
  TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // .toolName // .tool // .name // empty' 2>/dev/null)
302
302
  TOOL_INPUT=$(echo "$INPUT" | jq -c '.tool_input // .toolInput // .input // {}' 2>/dev/null)
303
+ HOOK_SESSION_ID=$(echo "$INPUT" | jq -r '.session_id // .sessionId // empty' 2>/dev/null)
304
+ TURN_ID=$(echo "$INPUT" | jq -r '.turn_id // .turnId // empty' 2>/dev/null)
305
+ TOOL_USE_ID=$(echo "$INPUT" | jq -r '.tool_use_id // .toolUseId // empty' 2>/dev/null)
306
+ TRANSCRIPT_PATH=$(echo "$INPUT" | jq -r '.transcript_path // .transcriptPath // empty' 2>/dev/null)
307
+ CWD=$(echo "$INPUT" | jq -r '.cwd // empty' 2>/dev/null)
308
+ MODEL=$(echo "$INPUT" | jq -r '.model // empty' 2>/dev/null)
303
309
 
304
310
  # If we can't parse the input, fail open
305
311
  if [[ -z "$TOOL_NAME" ]]; then
@@ -328,20 +334,33 @@ if [[ "$AUTHORITY_MODE" == "off" ]]; then
328
334
  exit 0
329
335
  fi
330
336
 
331
- if [[ -n "${DOLLHOUSE_SESSION_ID:-}" ]]; then
332
- debug "Using DOLLHOUSE_SESSION_ID=${DOLLHOUSE_SESSION_ID}"
337
+ SESSION_ID="${DOLLHOUSE_SESSION_ID:-$HOOK_SESSION_ID}"
338
+
339
+ if [[ -n "$SESSION_ID" ]]; then
340
+ debug "Using DOLLHOUSE_SESSION_ID=$SESSION_ID"
333
341
  fi
334
342
 
335
343
  PAYLOAD=$(jq -cn \
336
344
  --arg tool_name "$TOOL_NAME" \
337
345
  --arg platform "$HOOK_PLATFORM" \
338
- --arg session_id "${DOLLHOUSE_SESSION_ID:-}" \
346
+ --arg session_id "$SESSION_ID" \
347
+ --arg turn_id "$TURN_ID" \
348
+ --arg tool_use_id "$TOOL_USE_ID" \
349
+ --arg transcript_path "$TRANSCRIPT_PATH" \
350
+ --arg cwd "$CWD" \
351
+ --arg model "$MODEL" \
339
352
  --argjson input "$TOOL_INPUT" \
340
353
  '{
341
354
  tool_name: $tool_name,
342
355
  input: $input,
343
356
  platform: $platform
344
- } + (if ($session_id | length) > 0 then { session_id: $session_id } else {} end)')
357
+ }
358
+ + (if ($session_id | length) > 0 then { session_id: $session_id } else {} end)
359
+ + (if ($turn_id | length) > 0 then { turn_id: $turn_id } else {} end)
360
+ + (if ($tool_use_id | length) > 0 then { tool_use_id: $tool_use_id } else {} end)
361
+ + (if ($transcript_path | length) > 0 then { transcript_path: $transcript_path } else {} end)
362
+ + (if ($cwd | length) > 0 then { cwd: $cwd } else {} end)
363
+ + (if ($model | length) > 0 then { model: $model } else {} end)')
345
364
 
346
365
  # Call the DollhouseMCP permission evaluation endpoint with exponential backoff.
347
366
  # Retry on transient failures (connection refused, timeout) but not on HTTP errors.
package/server.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "name": "io.github.DollhouseMCP/mcp-server",
4
4
  "title": "DollhouseMCP",
5
5
  "description": "OSS to create Personas, Skills, Templates, Agents, and Memories to customize your AI experience.",
6
- "version": "2.0.32",
6
+ "version": "2.0.34",
7
7
  "homepage": "https://dollhousemcp.com",
8
8
  "repository": {
9
9
  "type": "git",
@@ -29,7 +29,7 @@
29
29
  {
30
30
  "registryType": "npm",
31
31
  "identifier": "@dollhousemcp/mcp-server",
32
- "version": "2.0.32",
32
+ "version": "2.0.34",
33
33
  "transport": {
34
34
  "type": "stdio"
35
35
  }