/ components / permissions / SkillPermissionRequest / SkillPermissionRequest.tsx
SkillPermissionRequest.tsx
  1  import { c as _c } from "react/compiler-runtime";
  2  import React, { useCallback, useMemo } from 'react';
  3  import { logError } from 'src/utils/log.js';
  4  import { getOriginalCwd } from '../../../bootstrap/state.js';
  5  import { Box, Text } from '../../../ink.js';
  6  import { sanitizeToolNameForAnalytics } from '../../../services/analytics/metadata.js';
  7  import { SKILL_TOOL_NAME } from '../../../tools/SkillTool/constants.js';
  8  import { SkillTool } from '../../../tools/SkillTool/SkillTool.js';
  9  import { env } from '../../../utils/env.js';
 10  import { shouldShowAlwaysAllowOptions } from '../../../utils/permissions/permissionsLoader.js';
 11  import { logUnaryEvent } from '../../../utils/unaryLogging.js';
 12  import { type UnaryEvent, usePermissionRequestLogging } from '../hooks.js';
 13  import { PermissionDialog } from '../PermissionDialog.js';
 14  import { PermissionPrompt, type PermissionPromptOption, type ToolAnalyticsContext } from '../PermissionPrompt.js';
 15  import type { PermissionRequestProps } from '../PermissionRequest.js';
 16  import { PermissionRuleExplanation } from '../PermissionRuleExplanation.js';
 17  type SkillOptionValue = 'yes' | 'yes-exact' | 'yes-prefix' | 'no';
 18  export function SkillPermissionRequest(props) {
 19    const $ = _c(51);
 20    const {
 21      toolUseConfirm,
 22      onDone,
 23      onReject,
 24      workerBadge
 25    } = props;
 26    const parseInput = _temp;
 27    let t0;
 28    if ($[0] !== toolUseConfirm.input) {
 29      t0 = parseInput(toolUseConfirm.input);
 30      $[0] = toolUseConfirm.input;
 31      $[1] = t0;
 32    } else {
 33      t0 = $[1];
 34    }
 35    const skill = t0;
 36    const commandObj = toolUseConfirm.permissionResult.behavior === "ask" && toolUseConfirm.permissionResult.metadata && "command" in toolUseConfirm.permissionResult.metadata ? toolUseConfirm.permissionResult.metadata.command : undefined;
 37    let t1;
 38    if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
 39      t1 = {
 40        completion_type: "tool_use_single",
 41        language_name: "none"
 42      };
 43      $[2] = t1;
 44    } else {
 45      t1 = $[2];
 46    }
 47    const unaryEvent = t1;
 48    usePermissionRequestLogging(toolUseConfirm, unaryEvent);
 49    let t2;
 50    if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
 51      t2 = getOriginalCwd();
 52      $[3] = t2;
 53    } else {
 54      t2 = $[3];
 55    }
 56    const originalCwd = t2;
 57    let t3;
 58    if ($[4] === Symbol.for("react.memo_cache_sentinel")) {
 59      t3 = shouldShowAlwaysAllowOptions();
 60      $[4] = t3;
 61    } else {
 62      t3 = $[4];
 63    }
 64    const showAlwaysAllowOptions = t3;
 65    let t4;
 66    if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
 67      t4 = [{
 68        label: "Yes",
 69        value: "yes",
 70        feedbackConfig: {
 71          type: "accept"
 72        }
 73      }];
 74      $[5] = t4;
 75    } else {
 76      t4 = $[5];
 77    }
 78    const baseOptions = t4;
 79    let alwaysAllowOptions;
 80    if ($[6] !== skill) {
 81      alwaysAllowOptions = [];
 82      if (showAlwaysAllowOptions) {
 83        const t5 = <Text bold={true}>{skill}</Text>;
 84        let t6;
 85        if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
 86          t6 = <Text bold={true}>{originalCwd}</Text>;
 87          $[8] = t6;
 88        } else {
 89          t6 = $[8];
 90        }
 91        let t7;
 92        if ($[9] !== t5) {
 93          t7 = {
 94            label: <Text>Yes, and don't ask again for {t5} in{" "}{t6}</Text>,
 95            value: "yes-exact"
 96          };
 97          $[9] = t5;
 98          $[10] = t7;
 99        } else {
100          t7 = $[10];
101        }
102        alwaysAllowOptions.push(t7);
103        const spaceIndex = skill.indexOf(" ");
104        if (spaceIndex > 0) {
105          const commandPrefix = skill.substring(0, spaceIndex);
106          const t8 = commandPrefix + ":*";
107          let t9;
108          if ($[11] !== t8) {
109            t9 = <Text bold={true}>{t8}</Text>;
110            $[11] = t8;
111            $[12] = t9;
112          } else {
113            t9 = $[12];
114          }
115          let t10;
116          if ($[13] === Symbol.for("react.memo_cache_sentinel")) {
117            t10 = <Text bold={true}>{originalCwd}</Text>;
118            $[13] = t10;
119          } else {
120            t10 = $[13];
121          }
122          let t11;
123          if ($[14] !== t9) {
124            t11 = {
125              label: <Text>Yes, and don't ask again for{" "}{t9} commands in{" "}{t10}</Text>,
126              value: "yes-prefix"
127            };
128            $[14] = t9;
129            $[15] = t11;
130          } else {
131            t11 = $[15];
132          }
133          alwaysAllowOptions.push(t11);
134        }
135      }
136      $[6] = skill;
137      $[7] = alwaysAllowOptions;
138    } else {
139      alwaysAllowOptions = $[7];
140    }
141    let t5;
142    if ($[16] === Symbol.for("react.memo_cache_sentinel")) {
143      t5 = {
144        label: "No",
145        value: "no",
146        feedbackConfig: {
147          type: "reject"
148        }
149      };
150      $[16] = t5;
151    } else {
152      t5 = $[16];
153    }
154    const noOption = t5;
155    let t6;
156    if ($[17] !== alwaysAllowOptions) {
157      t6 = [...baseOptions, ...alwaysAllowOptions, noOption];
158      $[17] = alwaysAllowOptions;
159      $[18] = t6;
160    } else {
161      t6 = $[18];
162    }
163    const options = t6;
164    let t7;
165    if ($[19] !== toolUseConfirm.tool.name) {
166      t7 = sanitizeToolNameForAnalytics(toolUseConfirm.tool.name);
167      $[19] = toolUseConfirm.tool.name;
168      $[20] = t7;
169    } else {
170      t7 = $[20];
171    }
172    const t8 = toolUseConfirm.tool.isMcp ?? false;
173    let t9;
174    if ($[21] !== t7 || $[22] !== t8) {
175      t9 = {
176        toolName: t7,
177        isMcp: t8
178      };
179      $[21] = t7;
180      $[22] = t8;
181      $[23] = t9;
182    } else {
183      t9 = $[23];
184    }
185    const toolAnalyticsContext = t9;
186    let t10;
187    if ($[24] !== onDone || $[25] !== onReject || $[26] !== skill || $[27] !== toolUseConfirm) {
188      t10 = (value, feedback) => {
189        bb33: switch (value) {
190          case "yes":
191            {
192              logUnaryEvent({
193                completion_type: "tool_use_single",
194                event: "accept",
195                metadata: {
196                  language_name: "none",
197                  message_id: toolUseConfirm.assistantMessage.message.id,
198                  platform: env.platform
199                }
200              });
201              toolUseConfirm.onAllow(toolUseConfirm.input, [], feedback);
202              onDone();
203              break bb33;
204            }
205          case "yes-exact":
206            {
207              logUnaryEvent({
208                completion_type: "tool_use_single",
209                event: "accept",
210                metadata: {
211                  language_name: "none",
212                  message_id: toolUseConfirm.assistantMessage.message.id,
213                  platform: env.platform
214                }
215              });
216              toolUseConfirm.onAllow(toolUseConfirm.input, [{
217                type: "addRules",
218                rules: [{
219                  toolName: SKILL_TOOL_NAME,
220                  ruleContent: skill
221                }],
222                behavior: "allow",
223                destination: "localSettings"
224              }]);
225              onDone();
226              break bb33;
227            }
228          case "yes-prefix":
229            {
230              logUnaryEvent({
231                completion_type: "tool_use_single",
232                event: "accept",
233                metadata: {
234                  language_name: "none",
235                  message_id: toolUseConfirm.assistantMessage.message.id,
236                  platform: env.platform
237                }
238              });
239              const spaceIndex_0 = skill.indexOf(" ");
240              const commandPrefix_0 = spaceIndex_0 > 0 ? skill.substring(0, spaceIndex_0) : skill;
241              toolUseConfirm.onAllow(toolUseConfirm.input, [{
242                type: "addRules",
243                rules: [{
244                  toolName: SKILL_TOOL_NAME,
245                  ruleContent: `${commandPrefix_0}:*`
246                }],
247                behavior: "allow",
248                destination: "localSettings"
249              }]);
250              onDone();
251              break bb33;
252            }
253          case "no":
254            {
255              logUnaryEvent({
256                completion_type: "tool_use_single",
257                event: "reject",
258                metadata: {
259                  language_name: "none",
260                  message_id: toolUseConfirm.assistantMessage.message.id,
261                  platform: env.platform
262                }
263              });
264              toolUseConfirm.onReject(feedback);
265              onReject();
266              onDone();
267            }
268        }
269      };
270      $[24] = onDone;
271      $[25] = onReject;
272      $[26] = skill;
273      $[27] = toolUseConfirm;
274      $[28] = t10;
275    } else {
276      t10 = $[28];
277    }
278    const handleSelect = t10;
279    let t11;
280    if ($[29] !== onDone || $[30] !== onReject || $[31] !== toolUseConfirm) {
281      t11 = () => {
282        logUnaryEvent({
283          completion_type: "tool_use_single",
284          event: "reject",
285          metadata: {
286            language_name: "none",
287            message_id: toolUseConfirm.assistantMessage.message.id,
288            platform: env.platform
289          }
290        });
291        toolUseConfirm.onReject();
292        onReject();
293        onDone();
294      };
295      $[29] = onDone;
296      $[30] = onReject;
297      $[31] = toolUseConfirm;
298      $[32] = t11;
299    } else {
300      t11 = $[32];
301    }
302    const handleCancel = t11;
303    const t12 = `Use skill "${skill}"?`;
304    let t13;
305    if ($[33] === Symbol.for("react.memo_cache_sentinel")) {
306      t13 = <Text>Claude may use instructions, code, or files from this Skill.</Text>;
307      $[33] = t13;
308    } else {
309      t13 = $[33];
310    }
311    const t14 = commandObj?.description;
312    let t15;
313    if ($[34] !== t14) {
314      t15 = <Box flexDirection="column" paddingX={2} paddingY={1}><Text dimColor={true}>{t14}</Text></Box>;
315      $[34] = t14;
316      $[35] = t15;
317    } else {
318      t15 = $[35];
319    }
320    let t16;
321    if ($[36] !== toolUseConfirm.permissionResult) {
322      t16 = <PermissionRuleExplanation permissionResult={toolUseConfirm.permissionResult} toolType="tool" />;
323      $[36] = toolUseConfirm.permissionResult;
324      $[37] = t16;
325    } else {
326      t16 = $[37];
327    }
328    let t17;
329    if ($[38] !== handleCancel || $[39] !== handleSelect || $[40] !== options || $[41] !== toolAnalyticsContext) {
330      t17 = <PermissionPrompt options={options} onSelect={handleSelect} onCancel={handleCancel} toolAnalyticsContext={toolAnalyticsContext} />;
331      $[38] = handleCancel;
332      $[39] = handleSelect;
333      $[40] = options;
334      $[41] = toolAnalyticsContext;
335      $[42] = t17;
336    } else {
337      t17 = $[42];
338    }
339    let t18;
340    if ($[43] !== t16 || $[44] !== t17) {
341      t18 = <Box flexDirection="column">{t16}{t17}</Box>;
342      $[43] = t16;
343      $[44] = t17;
344      $[45] = t18;
345    } else {
346      t18 = $[45];
347    }
348    let t19;
349    if ($[46] !== t12 || $[47] !== t15 || $[48] !== t18 || $[49] !== workerBadge) {
350      t19 = <PermissionDialog title={t12} workerBadge={workerBadge}>{t13}{t15}{t18}</PermissionDialog>;
351      $[46] = t12;
352      $[47] = t15;
353      $[48] = t18;
354      $[49] = workerBadge;
355      $[50] = t19;
356    } else {
357      t19 = $[50];
358    }
359    return t19;
360  }
361  function _temp(input) {
362    const result = SkillTool.inputSchema.safeParse(input);
363    if (!result.success) {
364      logError(new Error(`Failed to parse skill tool input: ${result.error.message}`));
365      return "";
366    }
367    return result.data.skill;
368  }
369  //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUNhbGxiYWNrIiwidXNlTWVtbyIsImxvZ0Vycm9yIiwiZ2V0T3JpZ2luYWxDd2QiLCJCb3giLCJUZXh0Iiwic2FuaXRpemVUb29sTmFtZUZvckFuYWx5dGljcyIsIlNLSUxMX1RPT0xfTkFNRSIsIlNraWxsVG9vbCIsImVudiIsInNob3VsZFNob3dBbHdheXNBbGxvd09wdGlvbnMiLCJsb2dVbmFyeUV2ZW50IiwiVW5hcnlFdmVudCIsInVzZVBlcm1pc3Npb25SZXF1ZXN0TG9nZ2luZyIsIlBlcm1pc3Npb25EaWFsb2ciLCJQZXJtaXNzaW9uUHJvbXB0IiwiUGVybWlzc2lvblByb21wdE9wdGlvbiIsIlRvb2xBbmFseXRpY3NDb250ZXh0IiwiUGVybWlzc2lvblJlcXVlc3RQcm9wcyIsIlBlcm1pc3Npb25SdWxlRXhwbGFuYXRpb24iLCJTa2lsbE9wdGlvblZhbHVlIiwiU2tpbGxQZXJtaXNzaW9uUmVxdWVzdCIsInByb3BzIiwiJCIsIl9jIiwidG9vbFVzZUNvbmZpcm0iLCJvbkRvbmUiLCJvblJlamVjdCIsIndvcmtlckJhZGdlIiwicGFyc2VJbnB1dCIsIl90ZW1wIiwidDAiLCJpbnB1dCIsInNraWxsIiwiY29tbWFuZE9iaiIsInBlcm1pc3Npb25SZXN1bHQiLCJiZWhhdmlvciIsIm1ldGFkYXRhIiwiY29tbWFuZCIsInVuZGVmaW5lZCIsInQxIiwiU3ltYm9sIiwiZm9yIiwiY29tcGxldGlvbl90eXBlIiwibGFuZ3VhZ2VfbmFtZSIsInVuYXJ5RXZlbnQiLCJ0MiIsIm9yaWdpbmFsQ3dkIiwidDMiLCJzaG93QWx3YXlzQWxsb3dPcHRpb25zIiwidDQiLCJsYWJlbCIsInZhbHVlIiwiZmVlZGJhY2tDb25maWciLCJ0eXBlIiwiYmFzZU9wdGlvbnMiLCJhbHdheXNBbGxvd09wdGlvbnMiLCJ0NSIsInQ2IiwidDciLCJwdXNoIiwic3BhY2VJbmRleCIsImluZGV4T2YiLCJjb21tYW5kUHJlZml4Iiwic3Vic3RyaW5nIiwidDgiLCJ0OSIsInQxMCIsInQxMSIsIm5vT3B0aW9uIiwib3B0aW9ucyIsInRvb2wiLCJuYW1lIiwiaXNNY3AiLCJ0b29sTmFtZSIsInRvb2xBbmFseXRpY3NDb250ZXh0IiwiZmVlZGJhY2siLCJiYjMzIiwiZXZlbnQiLCJtZXNzYWdlX2lkIiwiYXNzaXN0YW50TWVzc2FnZSIsIm1lc3NhZ2UiLCJpZCIsInBsYXRmb3JtIiwib25BbGxvdyIsInJ1bGVzIiwicnVsZUNvbnRlbnQiLCJkZXN0aW5hdGlvbiIsInNwYWNlSW5kZXhfMCIsImNvbW1hbmRQcmVmaXhfMCIsImhhbmRsZVNlbGVjdCIsImhhbmRsZUNhbmNlbCIsInQxMiIsInQxMyIsInQxNCIsImRlc2NyaXB0aW9uIiwidDE1IiwidDE2IiwidDE3IiwidDE4IiwidDE5IiwicmVzdWx0IiwiaW5wdXRTY2hlbWEiLCJzYWZlUGFyc2UiLCJzdWNjZXNzIiwiRXJyb3IiLCJlcnJvciIsImRhdGEiXSwic291cmNlcyI6WyJTa2lsbFBlcm1pc3Npb25SZXF1ZXN0LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZU1lbW8gfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGxvZ0Vycm9yIH0gZnJvbSAnc3JjL3V0aWxzL2xvZy5qcydcbmltcG9ydCB7IGdldE9yaWdpbmFsQ3dkIH0gZnJvbSAnLi4vLi4vLi4vYm9vdHN0cmFwL3N0YXRlLmpzJ1xuaW1wb3J0IHsgQm94LCBUZXh0IH0gZnJvbSAnLi4vLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHsgc2FuaXRpemVUb29sTmFtZUZvckFuYWx5dGljcyB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2FuYWx5dGljcy9tZXRhZGF0YS5qcydcbmltcG9ydCB7IFNLSUxMX1RPT0xfTkFNRSB9IGZyb20gJy4uLy4uLy4uL3Rvb2xzL1NraWxsVG9vbC9jb25zdGFudHMuanMnXG5pbXBvcnQgeyBTa2lsbFRvb2wgfSBmcm9tICcuLi8uLi8uLi90b29scy9Ta2lsbFRvb2wvU2tpbGxUb29sLmpzJ1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvZW52LmpzJ1xuaW1wb3J0IHsgc2hvdWxkU2hvd0Fsd2F5c0FsbG93T3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3Blcm1pc3Npb25zL3Blcm1pc3Npb25zTG9hZGVyLmpzJ1xuaW1wb3J0IHsgbG9nVW5hcnlFdmVudCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3VuYXJ5TG9nZ2luZy5qcydcbmltcG9ydCB7IHR5cGUgVW5hcnlFdmVudCwgdXNlUGVybWlzc2lvblJlcXVlc3RMb2dnaW5nIH0gZnJvbSAnLi4vaG9va3MuanMnXG5pbXBvcnQgeyBQZXJtaXNzaW9uRGlhbG9nIH0gZnJvbSAnLi4vUGVybWlzc2lvbkRpYWxvZy5qcydcbmltcG9ydCB7XG4gIFBlcm1pc3Npb25Qcm9tcHQsXG4gIHR5cGUgUGVybWlzc2lvblByb21wdE9wdGlvbixcbiAgdHlwZSBUb29sQW5hbHl0aWNzQ29udGV4dCxcbn0gZnJvbSAnLi4vUGVybWlzc2lvblByb21wdC5qcydcbmltcG9ydCB0eXBlIHsgUGVybWlzc2lvblJlcXVlc3RQcm9wcyB9IGZyb20gJy4uL1Blcm1pc3Npb25SZXF1ZXN0LmpzJ1xuaW1wb3J0IHsgUGVybWlzc2lvblJ1bGVFeHBsYW5hdGlvbiB9IGZyb20gJy4uL1Blcm1pc3Npb25SdWxlRXhwbGFuYXRpb24uanMnXG5cbnR5cGUgU2tpbGxPcHRpb25WYWx1ZSA9ICd5ZXMnIHwgJ3llcy1leGFjdCcgfCAneWVzLXByZWZpeCcgfCAnbm8nXG5cbmV4cG9ydCBmdW5jdGlvbiBTa2lsbFBlcm1pc3Npb25SZXF1ZXN0KFxuICBwcm9wczogUGVybWlzc2lvblJlcXVlc3RQcm9wcyxcbik6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IHtcbiAgICB0b29sVXNlQ29uZmlybSxcbiAgICBvbkRvbmUsXG4gICAgb25SZWplY3QsXG4gICAgdmVyYm9zZTogX3ZlcmJvc2UsXG4gICAgd29ya2VyQmFkZ2UsXG4gIH0gPSBwcm9wc1xuICBjb25zdCBwYXJzZUlucHV0ID0gKGlucHV0OiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBTa2lsbFRvb2wuaW5wdXRTY2hlbWEuc2FmZVBhcnNlKGlucHV0KVxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIGxvZ0Vycm9yKFxuICAgICAgICBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSBza2lsbCB0b29sIGlucHV0OiAke3Jlc3VsdC5lcnJvci5tZXNzYWdlfWApLFxuICAgICAgKVxuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuZGF0YS5za2lsbFxuICB9XG5cbiAgY29uc3Qgc2tpbGwgPSBwYXJzZUlucHV0KHRvb2xVc2VDb25maXJtLmlucHV0KVxuXG4gIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBjb21tYW5kIHVzaW5nIG1ldGFkYXRhIGZyb20gY2hlY2tQZXJtaXNzaW9uc1xuICBjb25zdCBjb21tYW5kT2JqID1cbiAgICB0b29sVXNlQ29uZmlybS5wZXJtaXNzaW9uUmVzdWx0LmJlaGF2aW9yID09PSAnYXNrJyAmJlxuICAgIHRvb2xVc2VDb25maXJtLnBlcm1pc3Npb25SZXN1bHQubWV0YWRhdGEgJiZcbiAgICAnY29tbWFuZCcgaW4gdG9vbFVzZUNvbmZpcm0ucGVybWlzc2lvblJlc3VsdC5tZXRhZGF0YVxuICAgICAgPyB0b29sVXNlQ29uZmlybS5wZXJtaXNzaW9uUmVzdWx0Lm1ldGFkYXRhLmNvbW1hbmRcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgY29uc3QgdW5hcnlFdmVudCA9IHVzZU1lbW88VW5hcnlFdmVudD4oXG4gICAgKCkgPT4gKHtcbiAgICAgIGNvbXBsZXRpb25fdHlwZTogJ3Rvb2xfdXNlX3NpbmdsZScsXG4gICAgICBsYW5ndWFnZV9uYW1lOiAnbm9uZScsXG4gICAgfSksXG4gICAgW10sXG4gIClcblxuICB1c2VQZXJtaXNzaW9uUmVxdWVzdExvZ2dpbmcodG9vbFVzZUNvbmZpcm0sIHVuYXJ5RXZlbnQpXG5cbiAgY29uc3Qgb3JpZ2luYWxDd2QgPSBnZXRPcmlnaW5hbEN3ZCgpXG4gIGNvbnN0IHNob3dBbHdheXNBbGxvd09wdGlvbnMgPSBzaG91bGRTaG93QWx3YXlzQWxsb3dPcHRpb25zKClcbiAgY29uc3Qgb3B0aW9ucyA9IHVzZU1lbW8oKCk6IFBlcm1pc3Npb25Qcm9tcHRPcHRpb248U2tpbGxPcHRpb25WYWx1ZT5bXSA9PiB7XG4gICAgY29uc3QgYmFzZU9wdGlvbnM6IFBlcm1pc3Npb25Qcm9tcHRPcHRpb248U2tpbGxPcHRpb25WYWx1ZT5bXSA9IFtcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdZZXMnLFxuICAgICAgICB2YWx1ZTogJ3llcycsXG4gICAgICAgIGZlZWRiYWNrQ29uZmlnOiB7IHR5cGU6ICdhY2NlcHQnIH0sXG4gICAgICB9LFxuICAgIF1cblxuICAgIC8vIE9ubHkgYWRkIFwiYWx3YXlzIGFsbG93XCIgb3B0aW9ucyB3aGVuIG5vdCByZXN0cmljdGVkIGJ5IGFsbG93TWFuYWdlZFBlcm1pc3Npb25SdWxlc09ubHlcbiAgICBjb25zdCBhbHdheXNBbGxvd09wdGlvbnM6IFBlcm1pc3Npb25Qcm9tcHRPcHRpb248U2tpbGxPcHRpb25WYWx1ZT5bXSA9IFtdXG4gICAgaWYgKHNob3dBbHdheXNBbGxvd09wdGlvbnMpIHtcbiAgICAgIC8vIEFkZCBleGFjdCBtYXRjaCBvcHRpb25cbiAgICAgIGFsd2F5c0FsbG93T3B0aW9ucy5wdXNoKHtcbiAgICAgICAgbGFiZWw6IChcbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIFllcywgYW5kIGRvbiZhcG9zO3QgYXNrIGFnYWluIGZvciA8VGV4dCBib2xkPntza2lsbH08L1RleHQ+IGlueycgJ31cbiAgICAgICAgICAgIDxUZXh0IGJvbGQ+e29yaWdpbmFsQ3dkfTwvVGV4dD5cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICksXG4gICAgICAgIHZhbHVlOiAneWVzLWV4YWN0JyxcbiAgICAgIH0pXG5cbiAgICAgIC8vIEFkZCBwcmVmaXggb3B0aW9uIGlmIHRoZSBza2lsbCBoYXMgYXJndW1lbnRzXG4gICAgICBjb25zdCBzcGFjZUluZGV4ID0gc2tpbGwuaW5kZXhPZignICcpXG4gICAgICBpZiAoc3BhY2VJbmRleCA+IDApIHtcbiAgICAgICAgY29uc3QgY29tbWFuZFByZWZpeCA9IHNraWxsLnN1YnN0cmluZygwLCBzcGFjZUluZGV4KVxuICAgICAgICBhbHdheXNBbGxvd09wdGlvbnMucHVzaCh7XG4gICAgICAgICAgbGFiZWw6IChcbiAgICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgICBZZXMsIGFuZCBkb24mYXBvczt0IGFzayBhZ2FpbiBmb3J7JyAnfVxuICAgICAgICAgICAgICA8VGV4dCBib2xkPntjb21tYW5kUHJlZml4ICsgJzoqJ308L1RleHQ+IGNvbW1hbmRzIGlueycgJ31cbiAgICAgICAgICAgICAgPFRleHQgYm9sZD57b3JpZ2luYWxDd2R9PC9UZXh0PlxuICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICksXG4gICAgICAgICAgdmFsdWU6ICd5ZXMtcHJlZml4JyxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBub09wdGlvbjogUGVybWlzc2lvblByb21wdE9wdGlvbjxTa2lsbE9wdGlvblZhbHVlPiA9IHtcbiAgICAgIGxhYmVsOiAnTm8nLFxuICAgICAgdmFsdWU6ICdubycsXG4gICAgICBmZWVkYmFja0NvbmZpZzogeyB0eXBlOiAncmVqZWN0JyB9LFxuICAgIH1cblxuICAgIHJldHVybiBbLi4uYmFzZU9wdGlvbnMsIC4uLmFsd2F5c0FsbG93T3B0aW9ucywgbm9PcHRpb25dXG4gIH0sIFtza2lsbCwgb3JpZ2luYWxDd2QsIHNob3dBbHdheXNBbGxvd09wdGlvbnNdKVxuXG4gIGNvbnN0IHRvb2xBbmFseXRpY3NDb250ZXh0ID0gdXNlTWVtbyhcbiAgICAoKTogVG9vbEFuYWx5dGljc0NvbnRleHQgPT4gKHtcbiAgICAgIHRvb2xOYW1lOiBzYW5pdGl6ZVRvb2xOYW1lRm9yQW5hbHl0aWNzKHRvb2xVc2VDb25maXJtLnRvb2wubmFtZSksXG4gICAgICBpc01jcDogdG9vbFVzZUNvbmZpcm0udG9vbC5pc01jcCA/PyBmYWxzZSxcbiAgICB9KSxcbiAgICBbdG9vbFVzZUNvbmZpcm0udG9vbC5uYW1lLCB0b29sVXNlQ29uZmlybS50b29sLmlzTWNwXSxcbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdCA9IHVzZUNhbGxiYWNrKFxuICAgICh2YWx1ZTogU2tpbGxPcHRpb25WYWx1ZSwgZmVlZGJhY2s/OiBzdHJpbmcpID0+IHtcbiAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgY2FzZSAneWVzJzpcbiAgICAgICAgICB2b2lkIGxvZ1VuYXJ5RXZlbnQoe1xuICAgICAgICAgICAgY29tcGxldGlvbl90eXBlOiAndG9vbF91c2Vfc2luZ2xlJyxcbiAgICAgICAgICAgIGV2ZW50OiAnYWNjZXB0JyxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIGxhbmd1YWdlX25hbWU6ICdub25lJyxcbiAgICAgICAgICAgICAgbWVzc2FnZV9pZDogdG9vbFVzZUNvbmZpcm0uYXNzaXN0YW50TWVzc2FnZS5tZXNzYWdlLmlkLFxuICAgICAgICAgICAgICBwbGF0Zm9ybTogZW52LnBsYXRmb3JtLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHRvb2xVc2VDb25maXJtLm9uQWxsb3codG9vbFVzZUNvbmZpcm0uaW5wdXQsIFtdLCBmZWVkYmFjaylcbiAgICAgICAgICBvbkRvbmUoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3llcy1leGFjdCc6IHtcbiAgICAgICAgICB2b2lkIGxvZ1VuYXJ5RXZlbnQoe1xuICAgICAgICAgICAgY29tcGxldGlvbl90eXBlOiAndG9vbF91c2Vfc2luZ2xlJyxcbiAgICAgICAgICAgIGV2ZW50OiAnYWNjZXB0JyxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIGxhbmd1YWdlX25hbWU6ICdub25lJyxcbiAgICAgICAgICAgICAgbWVzc2FnZV9pZDogdG9vbFVzZUNvbmZpcm0uYXNzaXN0YW50TWVzc2FnZS5tZXNzYWdlLmlkLFxuICAgICAgICAgICAgICBwbGF0Zm9ybTogZW52LnBsYXRmb3JtLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgdG9vbFVzZUNvbmZpcm0ub25BbGxvdyh0b29sVXNlQ29uZmlybS5pbnB1dCwgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiAnYWRkUnVsZXMnLFxuICAgICAgICAgICAgICBydWxlczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiBTS0lMTF9UT09MX05BTUUsXG4gICAgICAgICAgICAgICAgICBydWxlQ29udGVudDogc2tpbGwsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgYmVoYXZpb3I6ICdhbGxvdycsXG4gICAgICAgICAgICAgIGRlc3RpbmF0aW9uOiAnbG9jYWxTZXR0aW5ncycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0pXG4gICAgICAgICAgb25Eb25lKClcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3llcy1wcmVmaXgnOiB7XG4gICAgICAgICAgdm9pZCBsb2dVbmFyeUV2ZW50KHtcbiAgICAgICAgICAgIGNvbXBsZXRpb25fdHlwZTogJ3Rvb2xfdXNlX3NpbmdsZScsXG4gICAgICAgICAgICBldmVudDogJ2FjY2VwdCcsXG4gICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICBsYW5ndWFnZV9uYW1lOiAnbm9uZScsXG4gICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IHRvb2xVc2VDb25maXJtLmFzc2lzdGFudE1lc3NhZ2UubWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgcGxhdGZvcm06IGVudi5wbGF0Zm9ybSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHNraWxsIHByZWZpeCAoZXZlcnl0aGluZyBiZWZvcmUgdGhlIGZpcnN0IHNwYWNlKVxuICAgICAgICAgIGNvbnN0IHNwYWNlSW5kZXggPSBza2lsbC5pbmRleE9mKCcgJylcbiAgICAgICAgICBjb25zdCBjb21tYW5kUHJlZml4ID1cbiAgICAgICAgICAgIHNwYWNlSW5kZXggPiAwID8gc2tpbGwuc3Vic3RyaW5nKDAsIHNwYWNlSW5kZXgpIDogc2tpbGxcblxuICAgICAgICAgIHRvb2xVc2VDb25maXJtLm9uQWxsb3codG9vbFVzZUNvbmZpcm0uaW5wdXQsIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogJ2FkZFJ1bGVzJyxcbiAgICAgICAgICAgICAgcnVsZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogU0tJTExfVE9PTF9OQU1FLFxuICAgICAgICAgICAgICAgICAgcnVsZUNvbnRlbnQ6IGAke2NvbW1hbmRQcmVmaXh9OipgLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIGJlaGF2aW9yOiAnYWxsb3cnLFxuICAgICAgICAgICAgICBkZXN0aW5hdGlvbjogJ2xvY2FsU2V0dGluZ3MnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdKVxuICAgICAgICAgIG9uRG9uZSgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdubyc6XG4gICAgICAgICAgdm9pZCBsb2dVbmFyeUV2ZW50KHtcbiAgICAgICAgICAgIGNvbXBsZXRpb25fdHlwZTogJ3Rvb2xfdXNlX3NpbmdsZScsXG4gICAgICAgICAgICBldmVudDogJ3JlamVjdCcsXG4gICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICBsYW5ndWFnZV9uYW1lOiAnbm9uZScsXG4gICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IHRvb2xVc2VDb25maXJtLmFzc2lzdGFudE1lc3NhZ2UubWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgcGxhdGZvcm06IGVudi5wbGF0Zm9ybSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICB0b29sVXNlQ29uZmlybS5vblJlamVjdChmZWVkYmFjaylcbiAgICAgICAgICBvblJlamVjdCgpXG4gICAgICAgICAgb25Eb25lKClcbiAgICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH0sXG4gICAgW3Rvb2xVc2VDb25maXJtLCBvbkRvbmUsIG9uUmVqZWN0LCBza2lsbF0sXG4gIClcblxuICBjb25zdCBoYW5kbGVDYW5jZWwgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgdm9pZCBsb2dVbmFyeUV2ZW50KHtcbiAgICAgIGNvbXBsZXRpb25fdHlwZTogJ3Rvb2xfdXNlX3NpbmdsZScsXG4gICAgICBldmVudDogJ3JlamVjdCcsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBsYW5ndWFnZV9uYW1lOiAnbm9uZScsXG4gICAgICAgIG1lc3NhZ2VfaWQ6IHRvb2xVc2VDb25maXJtLmFzc2lzdGFudE1lc3NhZ2UubWVzc2FnZS5pZCxcbiAgICAgICAgcGxhdGZvcm06IGVudi5wbGF0Zm9ybSxcbiAgICAgIH0sXG4gICAgfSlcbiAgICB0b29sVXNlQ29uZmlybS5vblJlamVjdCgpXG4gICAgb25SZWplY3QoKVxuICAgIG9uRG9uZSgpXG4gIH0sIFt0b29sVXNlQ29uZmlybSwgb25Eb25lLCBvblJlamVjdF0pXG5cbiAgcmV0dXJuIChcbiAgICA8UGVybWlzc2lvbkRpYWxvZyB0aXRsZT17YFVzZSBza2lsbCBcIiR7c2tpbGx9XCI/YH0gd29ya2VyQmFkZ2U9e3dvcmtlckJhZGdlfT5cbiAgICAgIDxUZXh0PkNsYXVkZSBtYXkgdXNlIGluc3RydWN0aW9ucywgY29kZSwgb3IgZmlsZXMgZnJvbSB0aGlzIFNraWxsLjwvVGV4dD5cbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIHBhZGRpbmdYPXsyfSBwYWRkaW5nWT17MX0+XG4gICAgICAgIDxUZXh0IGRpbUNvbG9yPntjb21tYW5kT2JqPy5kZXNjcmlwdGlvbn08L1RleHQ+XG4gICAgICA8L0JveD5cblxuICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICAgIDxQZXJtaXNzaW9uUnVsZUV4cGxhbmF0aW9uXG4gICAgICAgICAgcGVybWlzc2lvblJlc3VsdD17dG9vbFVzZUNvbmZpcm0ucGVybWlzc2lvblJlc3VsdH1cbiAgICAgICAgICB0b29sVHlwZT1cInRvb2xcIlxuICAgICAgICAvPlxuICAgICAgICA8UGVybWlzc2lvblByb21wdFxuICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICAgICAgb25TZWxlY3Q9e2hhbmRsZVNlbGVjdH1cbiAgICAgICAgICBvbkNhbmNlbD17aGFuZGxlQ2FuY2VsfVxuICAgICAgICAgIHRvb2xBbmFseXRpY3NDb250ZXh0PXt0b29sQW5hbHl0aWNzQ29udGV4dH1cbiAgICAgICAgLz5cbiAgICAgIDwvQm94PlxuICAgIDwvUGVybWlzc2lvbkRpYWxvZz5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUEsT0FBT0EsS0FBSyxJQUFJQyxXQUFXLEVBQUVDLE9BQU8sUUFBUSxPQUFPO0FBQ25ELFNBQVNDLFFBQVEsUUFBUSxrQkFBa0I7QUFDM0MsU0FBU0MsY0FBYyxRQUFRLDZCQUE2QjtBQUM1RCxTQUFTQyxHQUFHLEVBQUVDLElBQUksUUFBUSxpQkFBaUI7QUFDM0MsU0FBU0MsNEJBQTRCLFFBQVEseUNBQXlDO0FBQ3RGLFNBQVNDLGVBQWUsUUFBUSx1Q0FBdUM7QUFDdkUsU0FBU0MsU0FBUyxRQUFRLHVDQUF1QztBQUNqRSxTQUFTQyxHQUFHLFFBQVEsdUJBQXVCO0FBQzNDLFNBQVNDLDRCQUE0QixRQUFRLGlEQUFpRDtB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