ummaya 0.2.9 → 0.2.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/pyproject.toml +2 -2
- package/tui/package.json +1 -1
- package/tui/src/bridge/bridgeEnabled.ts +1 -1
- package/tui/src/commands/chrome/chrome.tsx +3 -4
- package/tui/src/commands/createMovedToPluginCommand.ts +1 -1
- package/tui/src/commands/extra-usage/extra-usage-core.ts +2 -4
- package/tui/src/commands/insights.ts +5 -4
- package/tui/src/commands/install-github-app/ApiKeyStep.tsx +1 -2
- package/tui/src/commands/install-github-app/CheckExistingSecretStep.tsx +3 -3
- package/tui/src/commands/install-github-app/ExistingWorkflowStep.tsx +3 -3
- package/tui/src/commands/install-github-app/InstallAppStep.tsx +1 -1
- package/tui/src/commands/install-github-app/SuccessStep.tsx +2 -10
- package/tui/src/commands/install-github-app/install-github-app.tsx +21 -22
- package/tui/src/commands/install-github-app/setupGitHubActions.ts +21 -27
- package/tui/src/commands/install-slack-app/install-slack-app.ts +1 -1
- package/tui/src/commands/mobile/mobile.tsx +3 -3
- package/tui/src/commands/stickers/stickers.ts +1 -1
- package/tui/src/commands/upgrade/upgrade.tsx +3 -4
- package/tui/src/components/ClaudeInChromeOnboarding.tsx +2 -3
- package/tui/src/components/Feedback.tsx +8 -2
- package/tui/src/components/FeedbackSurvey/submitTranscriptShare.ts +7 -2
- package/tui/src/components/Passes/Passes.tsx +1 -1
- package/tui/src/components/WorkflowMultiselectDialog.tsx +3 -3
- package/tui/src/components/messages/AssistantTextMessage.tsx +1 -2
- package/tui/src/constants/github-app.ts +26 -38
- package/tui/src/constants/oauth.ts +28 -59
- package/tui/src/constants/product.ts +6 -6
- package/tui/src/entrypoints/sdk/coreSchemas.ts +1 -1
- package/tui/src/services/analytics/firstPartyEventLogger.ts +0 -3
- package/tui/src/services/analytics/firstPartyEventLoggingExporter.ts +34 -12
- package/tui/src/services/analytics/growthbook.ts +17 -16
- package/tui/src/services/api/filesApi.ts +4 -14
- package/tui/src/services/api/metricsOptOut.ts +20 -1
- package/tui/src/services/mcp/channelNotification.ts +1 -1
- package/tui/src/services/mcp/officialRegistry.ts +5 -1
- package/tui/src/services/mcp/useManageMCPConnections.ts +1 -1
- package/tui/src/services/mcp/utils.ts +2 -2
- package/tui/src/services/tokenEstimation.ts +0 -1
- package/tui/src/tools/AgentTool/built-in/claudeCodeGuideAgent.ts +6 -6
- package/tui/src/tools/McpAuthTool/McpAuthTool.ts +1 -1
- package/tui/src/tools/RemoteTriggerTool/RemoteTriggerTool.ts +1 -1
- package/tui/src/tools/RemoteTriggerTool/prompt.ts +2 -2
- package/tui/src/tools/WebFetchTool/preapproved.ts +0 -4
- package/tui/src/tools/WebFetchTool/utils.ts +15 -11
- package/tui/src/upstreamproxy/upstreamproxy.ts +9 -15
- package/tui/src/utils/autoUpdater.ts +4 -1
- package/tui/src/utils/claudeInChrome/mcpServer.ts +1 -1
- package/tui/src/utils/claudeInChrome/setup.ts +1 -1
- package/tui/src/utils/claudeInChrome/toolRendering.tsx +1 -2
- package/tui/src/utils/desktopDeepLink.ts +18 -18
- package/tui/src/utils/fastMode.ts +1 -1
- package/tui/src/utils/http.ts +1 -6
- package/tui/src/utils/ide.ts +6 -5
- package/tui/src/utils/model/providers.ts +6 -10
- package/tui/src/utils/modelCost.ts +0 -2
- package/tui/src/utils/nativeInstaller/download.ts +15 -17
- package/tui/src/utils/plugins/installCounts.ts +4 -11
- package/tui/src/utils/plugins/officialMarketplaceGcs.ts +5 -18
- package/tui/src/utils/releaseNotes.ts +2 -2
- package/tui/src/utils/settings/types.ts +1 -1
- package/tui/src/utils/statusNoticeDefinitions.tsx +3 -3
- package/tui/src/utils/telemetry/bigqueryExporter.ts +20 -13
- package/uv.lock +1 -1
|
@@ -7,7 +7,7 @@ import { useExitOnCtrlCDWithKeybindings } from '../../hooks/useExitOnCtrlCDWithK
|
|
|
7
7
|
import type { KeyboardEvent } from '../../ink/events/keyboard-event.js';
|
|
8
8
|
import { Box } from '../../ink.js';
|
|
9
9
|
import type { LocalJSXCommandOnDone } from '../../types/command.js';
|
|
10
|
-
import { getAnthropicApiKey, isAnthropicAuthEnabled } from '../../utils/auth.js';
|
|
10
|
+
import { FRIENDLI_PRIMARY_ENV, getAnthropicApiKey, isAnthropicAuthEnabled } from '../../utils/auth.js';
|
|
11
11
|
import { openBrowser } from '../../utils/browser.js';
|
|
12
12
|
import { execFileNoThrow } from '../../utils/execFileNoThrow.js';
|
|
13
13
|
import { getGithubRepo } from '../../utils/git.js';
|
|
@@ -36,13 +36,17 @@ const INITIAL_STATE: State = {
|
|
|
36
36
|
currentWorkflowInstallStep: 0,
|
|
37
37
|
warnings: [],
|
|
38
38
|
secretExists: false,
|
|
39
|
-
secretName:
|
|
39
|
+
secretName: FRIENDLI_PRIMARY_ENV,
|
|
40
40
|
useExistingSecret: true,
|
|
41
41
|
workflowExists: false,
|
|
42
|
-
selectedWorkflows: ['
|
|
42
|
+
selectedWorkflows: ['ummaya', 'ummaya-review'] as Workflow[],
|
|
43
43
|
selectedApiKeyOption: 'new' as 'existing' | 'new' | 'oauth',
|
|
44
44
|
authType: 'api_key'
|
|
45
45
|
};
|
|
46
|
+
function secretListContains(lines: string[], secretName: string): boolean {
|
|
47
|
+
const escapedSecretName = secretName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
48
|
+
return lines.some((line: string) => new RegExp(`^${escapedSecretName}\\s+`).test(line));
|
|
49
|
+
}
|
|
46
50
|
function InstallGitHubApp(props: {
|
|
47
51
|
onDone: (message: string) => void;
|
|
48
52
|
}): React.ReactNode {
|
|
@@ -164,7 +168,7 @@ function InstallGitHubApp(props: {
|
|
|
164
168
|
step: 'error',
|
|
165
169
|
error: 'A UMMAYA workflow file already exists in this repository.',
|
|
166
170
|
errorReason: 'Workflow file conflict',
|
|
167
|
-
errorInstructions: ['The file .github/workflows/
|
|
171
|
+
errorInstructions: ['The file .github/workflows/ummaya.yml already exists', 'You can either:', ' 1. Delete the existing file and run this command again', ' 2. Update the existing file manually using the template from:', ` ${GITHUB_ACTION_SETUP_DOCS_URL}`]
|
|
168
172
|
}));
|
|
169
173
|
} else {
|
|
170
174
|
logEvent('tengu_install_github_app_error', {
|
|
@@ -181,7 +185,7 @@ function InstallGitHubApp(props: {
|
|
|
181
185
|
}
|
|
182
186
|
}, [state.selectedRepoName, state.workflowAction, state.selectedWorkflows, state.useCurrentRepo, state.workflowExists, state.secretExists, state.authType]);
|
|
183
187
|
async function openGitHubAppInstallation() {
|
|
184
|
-
const installUrl = 'https://
|
|
188
|
+
const installUrl = 'https://ummaya-docs.pages.dev/en/';
|
|
185
189
|
await openBrowser(installUrl);
|
|
186
190
|
}
|
|
187
191
|
async function checkRepositoryPermissions(repoName: string): Promise<{
|
|
@@ -212,17 +216,15 @@ function InstallGitHubApp(props: {
|
|
|
212
216
|
}
|
|
213
217
|
}
|
|
214
218
|
async function checkExistingWorkflowFile(repoName_0: string): Promise<boolean> {
|
|
215
|
-
const checkFileResult = await execFileNoThrow('gh', ['api', `repos/${repoName_0}/contents/.github/workflows/
|
|
219
|
+
const checkFileResult = await execFileNoThrow('gh', ['api', `repos/${repoName_0}/contents/.github/workflows/ummaya.yml`, '--jq', '.sha']);
|
|
216
220
|
return checkFileResult.code === 0;
|
|
217
221
|
}
|
|
218
222
|
async function checkExistingSecret() {
|
|
219
223
|
const checkSecretsResult = await execFileNoThrow('gh', ['secret', 'list', '--app', 'actions', '--repo', state.selectedRepoName]);
|
|
220
224
|
if (checkSecretsResult.code === 0) {
|
|
221
225
|
const lines = checkSecretsResult.stdout.split('\n');
|
|
222
|
-
const
|
|
223
|
-
|
|
224
|
-
});
|
|
225
|
-
if (hasAnthropicKey) {
|
|
226
|
+
const hasFriendliKey = secretListContains(lines, FRIENDLI_PRIMARY_ENV);
|
|
227
|
+
if (hasFriendliKey) {
|
|
226
228
|
setState(prev_6 => ({
|
|
227
229
|
...prev_6,
|
|
228
230
|
secretExists: true,
|
|
@@ -287,7 +289,7 @@ function InstallGitHubApp(props: {
|
|
|
287
289
|
repoWarnings.push({
|
|
288
290
|
title: 'Invalid GitHub URL format',
|
|
289
291
|
message: 'The repository URL format appears to be invalid.',
|
|
290
|
-
instructions: ['Use format: owner/repo or https://github.com/owner/repo', 'Example:
|
|
292
|
+
instructions: ['Use format: owner/repo or https://github.com/owner/repo', 'Example: umyunsang/UMMAYA']
|
|
291
293
|
});
|
|
292
294
|
} else {
|
|
293
295
|
repoName_1 = match[1]?.replace(/\.git$/, '') || '';
|
|
@@ -297,7 +299,7 @@ function InstallGitHubApp(props: {
|
|
|
297
299
|
repoWarnings.push({
|
|
298
300
|
title: 'Repository format warning',
|
|
299
301
|
message: 'Repository should be in format "owner/repo"',
|
|
300
|
-
instructions: ['Use format: owner/repo', 'Example:
|
|
302
|
+
instructions: ['Use format: owner/repo', 'Example: umyunsang/UMMAYA']
|
|
301
303
|
});
|
|
302
304
|
}
|
|
303
305
|
const permissionCheck = await checkRepositoryPermissions(repoName_1);
|
|
@@ -395,14 +397,11 @@ function InstallGitHubApp(props: {
|
|
|
395
397
|
useExistingKey: state.selectedApiKeyOption === 'existing'
|
|
396
398
|
}));
|
|
397
399
|
|
|
398
|
-
// Check if ANTHROPIC_API_KEY secret already exists
|
|
399
400
|
const checkSecretsResult_0 = await execFileNoThrow('gh', ['secret', 'list', '--app', 'actions', '--repo', state.selectedRepoName]);
|
|
400
401
|
if (checkSecretsResult_0.code === 0) {
|
|
401
402
|
const lines_0 = checkSecretsResult_0.stdout.split('\n');
|
|
402
|
-
const
|
|
403
|
-
|
|
404
|
-
});
|
|
405
|
-
if (hasAnthropicKey_0) {
|
|
403
|
+
const hasFriendliKey_0 = secretListContains(lines_0, FRIENDLI_PRIMARY_ENV);
|
|
404
|
+
if (hasFriendliKey_0) {
|
|
406
405
|
logEvent('tengu_install_github_app_step_completed', {
|
|
407
406
|
step: 'api-key' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
|
|
408
407
|
});
|
|
@@ -462,10 +461,10 @@ function InstallGitHubApp(props: {
|
|
|
462
461
|
...prev_23,
|
|
463
462
|
apiKeyOrOAuthToken: token,
|
|
464
463
|
useExistingKey: false,
|
|
465
|
-
secretName:
|
|
466
|
-
authType: '
|
|
464
|
+
secretName: FRIENDLI_PRIMARY_ENV,
|
|
465
|
+
authType: 'api_key'
|
|
467
466
|
}));
|
|
468
|
-
void runSetupGitHubActions(token,
|
|
467
|
+
void runSetupGitHubActions(token, FRIENDLI_PRIMARY_ENV);
|
|
469
468
|
}, [runSetupGitHubActions]);
|
|
470
469
|
const handleOAuthCancel = useCallback(() => {
|
|
471
470
|
setState(prev_24 => ({
|
|
@@ -497,7 +496,7 @@ function InstallGitHubApp(props: {
|
|
|
497
496
|
setState(prev_28 => ({
|
|
498
497
|
...prev_28,
|
|
499
498
|
useExistingSecret,
|
|
500
|
-
secretName: useExistingSecret ?
|
|
499
|
+
secretName: useExistingSecret ? FRIENDLI_PRIMARY_ENV : ''
|
|
501
500
|
}));
|
|
502
501
|
};
|
|
503
502
|
const handleWorkflowAction = async (action: 'update' | 'skip' | 'exit') => {
|
|
@@ -584,4 +583,4 @@ function InstallGitHubApp(props: {
|
|
|
584
583
|
export async function call(onDone: LocalJSXCommandOnDone): Promise<React.ReactNode> {
|
|
585
584
|
return <InstallGitHubApp onDone={onDone} />;
|
|
586
585
|
}
|
|
587
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleGVjYSIsIlJlYWN0IiwidXNlQ2FsbGJhY2siLCJ1c2VTdGF0ZSIsIkFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMiLCJsb2dFdmVudCIsIldvcmtmbG93TXVsdGlzZWxlY3REaWFsb2ciLCJHSVRIVUJfQUNUSU9OX1NFVFVQX0RPQ1NfVVJMIiwidXNlRXhpdE9uQ3RybENEV2l0aEtleWJpbmRpbmdzIiwiS2V5Ym9hcmRFdmVudCIsIkJveCIsIkxvY2FsSlNYQ29tbWFuZE9uRG9uZSIsImdldEFudGhyb3BpY0FwaUtleSIsImlzQW50aHJvcGljQXV0aEVuYWJsZWQiLCJvcGVuQnJvd3NlciIsImV4ZWNGaWxlTm9UaHJvdyIsImdldEdpdGh1YlJlcG8iLCJwbHVyYWwiLCJBcGlLZXlTdGVwIiwiQ2hlY2tFeGlzdGluZ1NlY3JldFN0ZXAiLCJDaGVja0dpdEh1YlN0ZXAiLCJDaG9vc2VSZXBvU3RlcCIsIkNyZWF0aW5nU3RlcCIsIkVycm9yU3RlcCIsIkV4aXN0aW5nV29ya2Zsb3dTdGVwIiwiSW5zdGFsbEFwcFN0ZXAiLCJPQXV0aEZsb3dTdGVwIiwiU3VjY2Vzc1N0ZXAiLCJzZXR1cEdpdEh1YkFjdGlvbnMiLCJTdGF0ZSIsIldhcm5pbmciLCJXb3JrZmxvdyIsIldhcm5pbmdzU3RlcCIsIklOSVRJQUxfU1RBVEUiLCJzdGVwIiwic2VsZWN0ZWRSZXBvTmFtZSIsImN1cnJlbnRSZXBvIiwidXNlQ3VycmVudFJlcG8iLCJhcGlLZXlPck9BdXRoVG9rZW4iLCJ1c2VFeGlzdGluZ0tleSIsImN1cnJlbnRXb3JrZmxvd0luc3RhbGxTdGVwIiwid2FybmluZ3MiLCJzZWNyZXRFeGlzdHMiLCJzZWNyZXROYW1lIiwidXNlRXhpc3RpbmdTZWNyZXQiLCJ3b3JrZmxvd0V4aXN0cyIsInNlbGVjdGVkV29ya2Zsb3dzIiwic2VsZWN0ZWRBcGlLZXlPcHRpb24iLCJhdXRoVHlwZSIsIkluc3RhbGxHaXRIdWJBcHAiLCJwcm9wcyIsIm9uRG9uZSIsIm1lc3NhZ2UiLCJSZWFjdE5vZGUiLCJleGlzdGluZ0FwaUtleSIsInN0YXRlIiwic2V0U3RhdGUiLCJ1c2VFZmZlY3QiLCJjaGVja0dpdEh1YkNMSSIsImdoVmVyc2lvblJlc3VsdCIsInNoZWxsIiwicmVqZWN0IiwiZXhpdENvZGUiLCJwdXNoIiwidGl0bGUiLCJpbnN0cnVjdGlvbnMiLCJhdXRoUmVzdWx0IiwidG9rZW5TY29wZXNNYXRjaCIsInN0ZG91dCIsIm1hdGNoIiwic2NvcGVzIiwibWlzc2luZ1Njb3BlcyIsImluY2x1ZGVzIiwibGVuZ3RoIiwicHJldiIsImVycm9yIiwiam9pbiIsImVycm9yUmVhc29uIiwiZXJyb3JJbnN0cnVjdGlvbnMiLCJydW5TZXR1cEdpdEh1YkFjdGlvbnMiLCJ3b3JrZmxvd0FjdGlvbiIsImVycm9yTWVzc2FnZSIsIkVycm9yIiwicmVhc29uIiwib3BlbkdpdEh1YkFwcEluc3RhbGxhdGlvbiIsImluc3RhbGxVcmwiLCJjaGVja1JlcG9zaXRvcnlQZXJtaXNzaW9ucyIsInJlcG9OYW1lIiwiUHJvbWlzZSIsImhhc0FjY2VzcyIsInJlc3VsdCIsImNvZGUiLCJoYXNBZG1pbiIsInRyaW0iLCJzdGRlcnIiLCJjaGVja0V4aXN0aW5nV29ya2Zsb3dGaWxlIiwiY2hlY2tGaWxlUmVzdWx0IiwiY2hlY2tFeGlzdGluZ1NlY3JldCIsImNoZWNrU2VjcmV0c1Jlc3VsdCIsImxpbmVzIiwic3BsaXQiLCJoYXNBbnRocm9waWNLZXkiLCJzb21lIiwibGluZSIsInRlc3QiLCJoYW5kbGVTdWJtaXQiLCJzZXRUaW1lb3V0IiwicmVwb1dhcm5pbmdzIiwicmVwbGFjZSIsInBlcm1pc3Npb25DaGVjayIsImFsbFdhcm5pbmdzIiwiYXBpS2V5VG9Vc2UiLCJoYW5kbGVSZXBvVXJsQ2hhbmdlIiwidmFsdWUiLCJoYW5kbGVBcGlLZXlDaGFuZ2UiLCJoYW5kbGVBcGlLZXlPcHRpb25DaGFuZ2UiLCJvcHRpb24iLCJoYW5kbGVDcmVhdGVPQXV0aFRva2VuIiwiaGFuZGxlT0F1dGhTdWNjZXNzIiwidG9rZW4iLCJoYW5kbGVPQXV0aENhbmNlbCIsImhhbmRsZVNlY3JldE5hbWVDaGFuZ2UiLCJoYW5kbGVUb2dnbGVVc2VDdXJyZW50UmVwbyIsImhhbmRsZVRvZ2dsZVVzZUV4aXN0aW5nS2V5IiwiaGFuZGxlVG9nZ2xlVXNlRXhpc3RpbmdTZWNyZXQiLCJoYW5kbGVXb3JrZmxvd0FjdGlvbiIsImFjdGlvbiIsImhhbmRsZURpc21pc3NLZXlEb3duIiwiZSIsInByZXZlbnREZWZhdWx0IiwidW5kZWZpbmVkIiwiY2FsbCJdLCJzb3VyY2VzIjpbImluc3RhbGwtZ2l0aHViLWFwcC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY2EgfSBmcm9tICdleGVjYSdcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7XG4gIHR5cGUgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgbG9nRXZlbnQsXG59IGZyb20gJ3NyYy9zZXJ2aWNlcy9hbmFseXRpY3MvaW5kZXguanMnXG5pbXBvcnQgeyBXb3JrZmxvd011bHRpc2VsZWN0RGlhbG9nIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9Xb3JrZmxvd011bHRpc2VsZWN0RGlhbG9nLmpzJ1xuaW1wb3J0IHsgR0lUSFVCX0FDVElPTl9TRVRVUF9ET0NTX1VSTCB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9naXRodWItYXBwLmpzJ1xuaW1wb3J0IHsgdXNlRXhpdE9uQ3RybENEV2l0aEtleWJpbmRpbmdzIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlRXhpdE9uQ3RybENEV2l0aEtleWJpbmRpbmdzLmpzJ1xuaW1wb3J0IHR5cGUgeyBLZXlib2FyZEV2ZW50IH0gZnJvbSAnLi4vLi4vaW5rL2V2ZW50cy9rZXlib2FyZC1ldmVudC5qcydcbmltcG9ydCB7IEJveCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB0eXBlIHsgTG9jYWxKU1hDb21tYW5kT25Eb25lIH0gZnJvbSAnLi4vLi4vdHlwZXMvY29tbWFuZC5qcydcbmltcG9ydCB7IGdldEFudGhyb3BpY0FwaUtleSwgaXNBbnRocm9waWNBdXRoRW5hYmxlZCB9IGZyb20gJy4uLy4uL3V0aWxzL2F1dGguanMnXG5pbXBvcnQgeyBvcGVuQnJvd3NlciB9IGZyb20gJy4uLy4uL3V0aWxzL2Jyb3dzZXIuanMnXG5pbXBvcnQgeyBleGVjRmlsZU5vVGhyb3cgfSBmcm9tICcuLi8uLi91dGlscy9leGVjRmlsZU5vVGhyb3cuanMnXG5pbXBvcnQgeyBnZXRHaXRodWJSZXBvIH0gZnJvbSAnLi4vLi4vdXRpbHMvZ2l0LmpzJ1xuaW1wb3J0IHsgcGx1cmFsIH0gZnJvbSAnLi4vLi4vdXRpbHMvc3RyaW5nVXRpbHMuanMnXG5pbXBvcnQgeyBBcGlLZXlTdGVwIH0gZnJvbSAnLi9BcGlLZXlTdGVwLmpzJ1xuaW1wb3J0IHsgQ2hlY2tFeGlzdGluZ1NlY3JldFN0ZXAgfSBmcm9tICcuL0NoZWNrRXhpc3RpbmdTZWNyZXRTdGVwLmpzJ1xuaW1wb3J0IHsgQ2hlY2tHaXRIdWJTdGVwIH0gZnJvbSAnLi9DaGVja0dpdEh1YlN0ZXAuanMnXG5pbXBvcnQgeyBDaG9vc2VSZXBvU3RlcCB9IGZyb20gJy4vQ2hvb3NlUmVwb1N0ZXAuanMnXG5pbXBvcnQgeyBDcmVhdGluZ1N0ZXAgfSBmcm9tICcuL0NyZWF0aW5nU3RlcC5qcydcbmltcG9ydCB7IEVycm9yU3RlcCB9IGZyb20gJy4vRXJyb3JTdGVwLmpzJ1xuaW1wb3J0IHsgRXhpc3RpbmdXb3JrZmxvd1N0ZXAgfSBmcm9tICcuL0V4aXN0aW5nV29ya2Zsb3dTdGVwLmpzJ1xuaW1wb3J0IHsgSW5zdGFsbEFwcFN0ZXAgfSBmcm9tICcuL0luc3RhbGxBcHBTdGVwLmpzJ1xuaW1wb3J0IHsgT0F1dGhGbG93U3RlcCB9IGZyb20gJy4vT0F1dGhGbG93U3RlcC5qcydcbmltcG9ydCB7IFN1Y2Nlc3NTdGVwIH0gZnJvbSAnLi9TdWNjZXNzU3RlcC5qcydcbmltcG9ydCB7IHNldHVwR2l0SHViQWN0aW9ucyB9IGZyb20gJy4vc2V0dXBHaXRIdWJBY3Rpb25zLmpzJ1xuaW1wb3J0IHR5cGUgeyBTdGF0ZSwgV2FybmluZywgV29ya2Zsb3cgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHsgV2FybmluZ3NTdGVwIH0gZnJvbSAnLi9XYXJuaW5nc1N0ZXAuanMnXG5cbmNvbnN0IElOSVRJQUxfU1RBVEU6IFN0YXRlID0ge1xuICBzdGVwOiAnY2hlY2stZ2gnLFxuICBzZWxlY3RlZFJlcG9OYW1lOiAnJyxcbiAgY3VycmVudFJlcG86ICcnLFxuICB1c2VDdXJyZW50UmVwbzogZmFsc2UsIC8vIERlZmF1bHQgdG8gZmFsc2UsIHdpbGwgYmUgc2V0IHRvIHRydWUgaWYgcmVwbyBkZXRlY3RlZFxuICBhcGlLZXlPck9BdXRoVG9rZW46ICcnLFxuICB1c2VFeGlzdGluZ0tleTogdHJ1ZSxcbiAgY3VycmVudFdvcmtmbG93SW5zdGFsbFN0ZXA6IDAsXG4gIHdhcm5pbmdzOiBbXSxcbiAgc2VjcmV0RXhpc3RzOiBmYWxzZSxcbiAgc2VjcmV0TmFtZTogJ0FOVEhST1BJQ19BUElfS0VZJyxcbiAgdXNlRXhpc3RpbmdTZWNyZXQ6IHRydWUsXG4gIHdvcmtmbG93RXhpc3RzOiBmYWxzZSxcbiAgc2VsZWN0ZWRXb3JrZmxvd3M6IFsnY2xhdWRlJywgJ2NsYXVkZS1yZXZpZXcnXSBhcyBXb3JrZmxvd1tdLFxuICBzZWxlY3RlZEFwaUtleU9wdGlvbjogJ25ldycgYXMgJ2V4aXN0aW5nJyB8ICduZXcnIHwgJ29hdXRoJyxcbiAgYXV0aFR5cGU6ICdhcGlfa2V5Jyxcbn1cblxuZnVuY3Rpb24gSW5zdGFsbEdpdEh1YkFwcChwcm9wczoge1xuICBvbkRvbmU6IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWRcbn0pOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBbZXhpc3RpbmdBcGlLZXldID0gdXNlU3RhdGUoKCkgPT4gZ2V0QW50aHJvcGljQXBpS2V5KCkpXG4gIGNvbnN0IFtzdGF0ZSwgc2V0U3RhdGVdID0gdXNlU3RhdGUoe1xuICAgIC4uLklOSVRJQUxfU1RBVEUsXG4gICAgdXNlRXhpc3RpbmdLZXk6ICEhZXhpc3RpbmdBcGlLZXksXG4gICAgc2VsZWN0ZWRBcGlLZXlPcHRpb246IChleGlzdGluZ0FwaUtleVxuICAgICAgPyAnZXhpc3RpbmcnXG4gICAgICA6IGlzQW50aHJvcGljQXV0aEVuYWJsZWQoKVxuICAgICAgICA/ICdvYXV0aCdcbiAgICAgICAgOiAnbmV3JykgYXMgJ2V4aXN0aW5nJyB8ICduZXcnIHwgJ29hdXRoJyxcbiAgfSlcbiAgdXNlRXhpdE9uQ3RybENEV2l0aEtleWJpbmRpbmdzKClcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxvZ0V2ZW50KCd0ZW5ndV9pbnN0YWxsX2dpdGh1Yl9hcHBfc3RhcnRlZCcsIHt9KVxuICB9LCBbXSlcblxuICBjb25zdCBjaGVja0dpdEh1YkNMSSA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB3YXJuaW5nczogV2FybmluZ1tdID0gW11cblxuICAgIC8vIENoZWNrIGlmIGdoIGlzIGluc3RhbGxlZFxuICAgIGNvbnN0IGdoVmVyc2lvblJlc3VsdCA9IGF3YWl0IGV4ZWNhKCdnaCAtLXZlcnNpb24nLCB7XG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHJlamVjdDogZmFsc2UsXG4gICAgfSlcbiAgICBpZiAoZ2hWZXJzaW9uUmVzdWx0LmV4aXRDb2RlICE9PSAwKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgdGl0bGU6ICdHaXRIdWIgQ0xJIG5vdCBmb3VuZCcsXG4gICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgJ0dpdEh1YiBDTEkgKGdoKSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgaW5zdGFsbGVkIG9yIGFjY2Vzc2libGUuJyxcbiAgICAgICAgaW5zdHJ1Y3Rpb25zOiBbXG4gICAgICAgICAgJ0luc3RhbGwgR2l0SHViIENMSSBmcm9tIGh0dHBzOi8vY2xpLmdpdGh1Yi5jb20vJyxcbiAgICAgICAgICAnbWFjT1M6IGJyZXcgaW5zdGFsbCBnaCcsXG4gICAgICAgICAgJ1dpbmRvd3M6IHdpbmdldCBpbnN0YWxsIC0taWQgR2l0SHViLmNsaScsXG4gICAgICAgICAgJ0xpbnV4OiBTZWUgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBhdCBodHRwczovL2dpdGh1Yi5jb20vY2xpL2NsaSNpbnN0YWxsYXRpb24nLFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBDaGVjayBhdXRoIHN0YXR1c1xuICAgIGNvbnN0IGF1dGhSZXN1bHQgPSBhd2FpdCBleGVjYSgnZ2ggYXV0aCBzdGF0dXMgLWEnLCB7XG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHJlamVjdDogZmFsc2UsXG4gICAgfSlcbiAgICBpZiAoYXV0aFJlc3VsdC5leGl0Q29kZSAhPT0gMCkge1xuICAgICAgd2FybmluZ3MucHVzaCh7XG4gICAgICAgIHRpdGxlOiAnR2l0SHViIENMSSBub3QgYXV0aGVudGljYXRlZCcsXG4gICAgICAgIG1lc3NhZ2U6ICdHaXRIdWIgQ0xJIGRvZXMgbm90IGFwcGVhciB0byBiZSBhdXRoZW50aWNhdGVkLicsXG4gICAgICAgIGluc3RydWN0aW9uczogW1xuICAgICAgICAgICdSdW46IGdoIGF1dGggbG9naW4nLFxuICAgICAgICAgICdGb2xsb3cgdGhlIHByb21wdHMgdG8gYXV0aGVudGljYXRlIHdpdGggR2l0SHViJyxcbiAgICAgICAgICAnT3Igc2V0IHVwIGF1dGhlbnRpY2F0aW9uIHVzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBvciBvdGhlciBtZXRob2RzJyxcbiAgICAgICAgXSxcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENoZWNrIGlmIHJlcXVpcmVkIHNjb3BlcyBhcmUgcHJlc2VudCBpbiB0aGUgVG9rZW4gc2NvcGVzIGxpbmVcbiAgICAgIGNvbnN0IHRva2VuU2NvcGVzTWF0Y2ggPSBhdXRoUmVzdWx0LnN0ZG91dC5tYXRjaCgvVG9rZW4gc2NvcGVzOi4qJC9tKVxuICAgICAgaWYgKHRva2VuU2NvcGVzTWF0Y2gpIHtcbiAgICAgICAgY29uc3Qgc2NvcGVzID0gdG9rZW5TY29wZXNNYXRjaFswXVxuICAgICAgICBjb25zdCBtaXNzaW5nU2NvcGVzOiBzdHJpbmdbXSA9IFtdXG5cbiAgICAgICAgaWYgKCFzY29wZXMuaW5jbHVkZXMoJ3JlcG8nKSkge1xuICAgICAgICAgIG1pc3NpbmdTY29wZXMucHVzaCgncmVwbycpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzY29wZXMuaW5jbHVkZXMoJ3dvcmtmbG93JykpIHtcbiAgICAgICAgICBtaXNzaW5nU2NvcGVzLnB1c2goJ3dvcmtmbG93JylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtaXNzaW5nU2NvcGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBNaXNzaW5nIHJlcXVpcmVkIHNjb3BlcyAtIGV4aXQgaW1tZWRpYXRlbHlcbiAgICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgc3RlcDogJ2Vycm9yJyxcbiAgICAgICAgICAgIGVycm9yOiBgR2l0SHViIENMSSBpcyBtaXNzaW5nIHJlcXVpcmVkIHBlcm1pc3Npb25zOiAke21pc3NpbmdTY29wZXMuam9pbignLCAnKX0uYCxcbiAgICAgICAgICAgIGVycm9yUmVhc29uOiAnTWlzc2luZyByZXF1aXJlZCBzY29wZXMnLFxuICAgICAgICAgICAgZXJyb3JJbnN0cnVjdGlvbnM6IFtcbiAgICAgICAgICAgICAgYFlvdXIgR2l0SHViIENMSSBhdXRoZW50aWNhdGlvbiBpcyBtaXNzaW5nIHRoZSBcIiR7bWlzc2luZ1Njb3Blcy5qb2luKCdcIiBhbmQgXCInKX1cIiAke3BsdXJhbChtaXNzaW5nU2NvcGVzLmxlbmd0aCwgJ3Njb3BlJyl9IG5lZWRlZCB0byBtYW5hZ2UgR2l0SHViIEFjdGlvbnMgYW5kIHNlY3JldHMuYCxcbiAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICdUbyBmaXggdGhpcywgcnVuOicsXG4gICAgICAgICAgICAgICcgIGdoIGF1dGggcmVmcmVzaCAtaCBnaXRodWIuY29tIC1zIHJlcG8sd29ya2Zsb3cnLFxuICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgJ1RoaXMgd2lsbCBhZGQgdGhlIG5lY2Vzc2FyeSBwZXJtaXNzaW9ucyB0byBtYW5hZ2Ugd29ya2Zsb3dzIGFuZCBzZWNyZXRzLicsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgaW4gYSBnaXQgcmVwbyBhbmQgZ2V0IHJlbW90ZSBVUkxcbiAgICBjb25zdCBjdXJyZW50UmVwbyA9IChhd2FpdCBnZXRHaXRodWJSZXBvKCkpID8/ICcnXG5cbiAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgc3RlcDogJ2NoZWNrLWdoJyBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgIH0pXG5cbiAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAuLi5wcmV2LFxuICAgICAgd2FybmluZ3MsXG4gICAgICBjdXJyZW50UmVwbyxcbiAgICAgIHNlbGVjdGVkUmVwb05hbWU6IGN1cnJlbnRSZXBvLFxuICAgICAgdXNlQ3VycmVudFJlcG86ICEhY3VycmVudFJlcG8sIC8vIFNldCB0byBmYWxzZSBpZiBubyByZXBvIGRldGVjdGVkXG4gICAgICBzdGVwOiB3YXJuaW5ncy5sZW5ndGggPiAwID8gJ3dhcm5pbmdzJyA6ICdjaG9vc2UtcmVwbycsXG4gICAgfSkpXG4gIH0sIFtdKVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHN0YXRlLnN0ZXAgPT09ICdjaGVjay1naCcpIHtcbiAgICAgIHZvaWQgY2hlY2tHaXRIdWJDTEkoKVxuICAgIH1cbiAgfSwgW3N0YXRlLnN0ZXAsIGNoZWNrR2l0SHViQ0xJXSlcblxuICBjb25zdCBydW5TZXR1cEdpdEh1YkFjdGlvbnMgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoYXBpS2V5T3JPQXV0aFRva2VuOiBzdHJpbmcgfCBudWxsLCBzZWNyZXROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgc3RlcDogJ2NyZWF0aW5nJyxcbiAgICAgICAgY3VycmVudFdvcmtmbG93SW5zdGFsbFN0ZXA6IDAsXG4gICAgICB9KSlcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2V0dXBHaXRIdWJBY3Rpb25zKFxuICAgICAgICAgIHN0YXRlLnNlbGVjdGVkUmVwb05hbWUsXG4gICAgICAgICAgYXBpS2V5T3JPQXV0aFRva2VuLFxuICAgICAgICAgIHNlY3JldE5hbWUsXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoe1xuICAgICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgICBjdXJyZW50V29ya2Zsb3dJbnN0YWxsU3RlcDogcHJldi5jdXJyZW50V29ya2Zsb3dJbnN0YWxsU3RlcCArIDEsXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXRlLndvcmtmbG93QWN0aW9uID09PSAnc2tpcCcsXG4gICAgICAgICAgc3RhdGUuc2VsZWN0ZWRXb3JrZmxvd3MsXG4gICAgICAgICAgc3RhdGUuYXV0aFR5cGUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdXNlQ3VycmVudFJlcG86IHN0YXRlLnVzZUN1cnJlbnRSZXBvLFxuICAgICAgICAgICAgd29ya2Zsb3dFeGlzdHM6IHN0YXRlLndvcmtmbG93RXhpc3RzLFxuICAgICAgICAgICAgc2VjcmV0RXhpc3RzOiBzdGF0ZS5zZWNyZXRFeGlzdHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgICAgIHN0ZXA6ICdjcmVhdGluZycgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgICAgfSlcbiAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzdGVwOiAnc3VjY2VzcycgfSkpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPVxuICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgID8gZXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgOiAnRmFpbGVkIHRvIHNldCB1cCBHaXRIdWIgQWN0aW9ucydcblxuICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCd3b3JrZmxvdyBmaWxlIGFscmVhZHkgZXhpc3RzJykpIHtcbiAgICAgICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX2Vycm9yJywge1xuICAgICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgICAnd29ya2Zsb3dfZmlsZV9leGlzdHMnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgc3RlcDogJ2Vycm9yJyxcbiAgICAgICAgICAgIGVycm9yOiAnQSBDbGF1ZGUgd29ya2Zsb3cgZmlsZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIHJlcG9zaXRvcnkuJyxcbiAgICAgICAgICAgIGVycm9yUmVhc29uOiAnV29ya2Zsb3cgZmlsZSBjb25mbGljdCcsXG4gICAgICAgICAgICBlcnJvckluc3RydWN0aW9uczogW1xuICAgICAgICAgICAgICAnVGhlIGZpbGUgLmdpdGh1Yi93b3JrZmxvd3MvY2xhdWRlLnltbCBhbHJlYWR5IGV4aXN0cycsXG4gICAgICAgICAgICAgICdZb3UgY2FuIGVpdGhlcjonLFxuICAgICAgICAgICAgICAnICAxLiBEZWxldGUgdGhlIGV4aXN0aW5nIGZpbGUgYW5kIHJ1biB0aGlzIGNvbW1hbmQgYWdhaW4nLFxuICAgICAgICAgICAgICAnICAyLiBVcGRhdGUgdGhlIGV4aXN0aW5nIGZpbGUgbWFudWFsbHkgdXNpbmcgdGhlIHRlbXBsYXRlIGZyb206JyxcbiAgICAgICAgICAgICAgYCAgICAgJHtHSVRIVUJfQUNUSU9OX1NFVFVQX0RPQ1NfVVJMfWAsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ0V2ZW50KCd0ZW5ndV9pbnN0YWxsX2dpdGh1Yl9hcHBfZXJyb3InLCB7XG4gICAgICAgICAgICByZWFzb246XG4gICAgICAgICAgICAgICdzZXR1cF9naXRodWJfYWN0aW9uc19mYWlsZWQnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgICBzdGVwOiAnZXJyb3InLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yTWVzc2FnZSxcbiAgICAgICAgICAgIGVycm9yUmVhc29uOiAnR2l0SHViIEFjdGlvbnMgc2V0dXAgZmFpbGVkJyxcbiAgICAgICAgICAgIGVycm9ySW5zdHJ1Y3Rpb25zOiBbXSxcbiAgICAgICAgICB9KSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgc3RhdGUuc2VsZWN0ZWRSZXBvTmFtZSxcbiAgICAgIHN0YXRlLndvcmtmbG93QWN0aW9uLFxuICAgICAgc3RhdGUuc2VsZWN0ZWRXb3JrZmxvd3MsXG4gICAgICBzdGF0ZS51c2VDdXJyZW50UmVwbyxcbiAgICAgIHN0YXRlLndvcmtmbG93RXhpc3RzLFxuICAgICAgc3RhdGUuc2VjcmV0RXhpc3RzLFxuICAgICAgc3RhdGUuYXV0aFR5cGUsXG4gICAgXSxcbiAgKVxuXG4gIGFzeW5jIGZ1bmN0aW9uIG9wZW5HaXRIdWJBcHBJbnN0YWxsYXRpb24oKSB7XG4gICAgY29uc3QgaW5zdGFsbFVybCA9ICdodHRwczovL2dpdGh1Yi5jb20vYXBwcy9jbGF1ZGUnXG4gICAgYXdhaXQgb3BlbkJyb3dzZXIoaW5zdGFsbFVybClcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNoZWNrUmVwb3NpdG9yeVBlcm1pc3Npb25zKFxuICAgIHJlcG9OYW1lOiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBoYXNBY2Nlc3M6IGJvb2xlYW47IGVycm9yPzogc3RyaW5nIH0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY0ZpbGVOb1Rocm93KCdnaCcsIFtcbiAgICAgICAgJ2FwaScsXG4gICAgICAgIGByZXBvcy8ke3JlcG9OYW1lfWAsXG4gICAgICAgICctLWpxJyxcbiAgICAgICAgJy5wZXJtaXNzaW9ucy5hZG1pbicsXG4gICAgICBdKVxuXG4gICAgICBpZiAocmVzdWx0LmNvZGUgPT09IDApIHtcbiAgICAgICAgY29uc3QgaGFzQWRtaW4gPSByZXN1bHQuc3Rkb3V0LnRyaW0oKSA9PT0gJ3RydWUnXG4gICAgICAgIHJldHVybiB7IGhhc0FjY2VzczogaGFzQWRtaW4gfVxuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHJlc3VsdC5zdGRlcnIuaW5jbHVkZXMoJzQwNCcpIHx8XG4gICAgICAgIHJlc3VsdC5zdGRlcnIuaW5jbHVkZXMoJ05vdCBGb3VuZCcpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBoYXNBY2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiAncmVwb3NpdG9yeV9ub3RfZm91bmQnLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGhhc0FjY2VzczogZmFsc2UgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHsgaGFzQWNjZXNzOiBmYWxzZSB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY2hlY2tFeGlzdGluZ1dvcmtmbG93RmlsZShyZXBvTmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY2hlY2tGaWxlUmVzdWx0ID0gYXdhaXQgZXhlY0ZpbGVOb1Rocm93KCdnaCcsIFtcbiAgICAgICdhcGknLFxuICAgICAgYHJlcG9zLyR7cmVwb05hbWV9L2NvbnRlbnRzLy5naXRodWIvd29ya2Zsb3dzL2NsYXVkZS55bWxgLFxuICAgICAgJy0tanEnLFxuICAgICAgJy5zaGEnLFxuICAgIF0pXG5cbiAgICByZXR1cm4gY2hlY2tGaWxlUmVzdWx0LmNvZGUgPT09IDBcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNoZWNrRXhpc3RpbmdTZWNyZXQoKSB7XG4gICAgY29uc3QgY2hlY2tTZWNyZXRzUmVzdWx0ID0gYXdhaXQgZXhlY0ZpbGVOb1Rocm93KCdnaCcsIFtcbiAgICAgICdzZWNyZXQnLFxuICAgICAgJ2xpc3QnLFxuICAgICAgJy0tYXBwJyxcbiAgICAgICdhY3Rpb25zJyxcbiAgICAgICctLXJlcG8nLFxuICAgICAgc3RhdGUuc2VsZWN0ZWRSZXBvTmFtZSxcbiAgICBdKVxuXG4gICAgaWYgKGNoZWNrU2VjcmV0c1Jlc3VsdC5jb2RlID09PSAwKSB7XG4gICAgICBjb25zdCBsaW5lcyA9IGNoZWNrU2VjcmV0c1Jlc3VsdC5zdGRvdXQuc3BsaXQoJ1xcbicpXG4gICAgICBjb25zdCBoYXNBbnRocm9waWNLZXkgPSBsaW5lcy5zb21lKChsaW5lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIC9eQU5USFJPUElDX0FQSV9LRVlcXHMrLy50ZXN0KGxpbmUpXG4gICAgICB9KVxuXG4gICAgICBpZiAoaGFzQW50aHJvcGljS2V5KSB7XG4gICAgICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgIHNlY3JldEV4aXN0czogdHJ1ZSxcbiAgICAgICAgICBzdGVwOiAnY2hlY2stZXhpc3Rpbmctc2VjcmV0JyxcbiAgICAgICAgfSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBObyBleGlzdGluZyBzZWNyZXQgZm91bmRcbiAgICAgICAgaWYgKGV4aXN0aW5nQXBpS2V5KSB7XG4gICAgICAgICAgLy8gVXNlciBoYXMgbG9jYWwga2V5LCBza2lwIHRvIGNyZWF0aW5nIHdpdGggaXRcbiAgICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgYXBpS2V5T3JPQXV0aFRva2VuOiBleGlzdGluZ0FwaUtleSxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nS2V5OiB0cnVlLFxuICAgICAgICAgIH0pKVxuICAgICAgICAgIGF3YWl0IHJ1blNldHVwR2l0SHViQWN0aW9ucyhleGlzdGluZ0FwaUtleSwgc3RhdGUuc2VjcmV0TmFtZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBObyBsb2NhbCBrZXksIGdvIHRvIEFQSSBrZXkgc3RlcFxuICAgICAgICAgIHNldFN0YXRlKHByZXYgPT4gKHsgLi4ucHJldiwgc3RlcDogJ2FwaS1rZXknIH0pKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEVycm9yIGNoZWNraW5nIHNlY3JldHNcbiAgICAgIGlmIChleGlzdGluZ0FwaUtleSkge1xuICAgICAgICAvLyBVc2VyIGhhcyBsb2NhbCBrZXksIHNraXAgdG8gY3JlYXRpbmcgd2l0aCBpdFxuICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICBhcGlLZXlPck9BdXRoVG9rZW46IGV4aXN0aW5nQXBpS2V5LFxuICAgICAgICAgIHVzZUV4aXN0aW5nS2V5OiB0cnVlLFxuICAgICAgICB9KSlcbiAgICAgICAgYXdhaXQgcnVuU2V0dXBHaXRIdWJBY3Rpb25zKGV4aXN0aW5nQXBpS2V5LCBzdGF0ZS5zZWNyZXROYW1lKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm8gbG9jYWwga2V5LCBnbyB0byBBUEkga2V5IHN0ZXBcbiAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzdGVwOiAnYXBpLWtleScgfSkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlU3VibWl0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmIChzdGF0ZS5zdGVwID09PSAnd2FybmluZ3MnKSB7XG4gICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgICBzdGVwOiAnd2FybmluZ3MnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICB9KVxuICAgICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzdGVwOiAnaW5zdGFsbC1hcHAnIH0pKVxuICAgICAgc2V0VGltZW91dChvcGVuR2l0SHViQXBwSW5zdGFsbGF0aW9uLCAwKVxuICAgIH0gZWxzZSBpZiAoc3RhdGUuc3RlcCA9PT0gJ2Nob29zZS1yZXBvJykge1xuICAgICAgbGV0IHJlcG9OYW1lID0gc3RhdGUudXNlQ3VycmVudFJlcG9cbiAgICAgICAgPyBzdGF0ZS5jdXJyZW50UmVwb1xuICAgICAgICA6IHN0YXRlLnNlbGVjdGVkUmVwb05hbWVcblxuICAgICAgaWYgKCFyZXBvTmFtZS50cmltKCkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcG9XYXJuaW5nczogV2FybmluZ1tdID0gW11cblxuICAgICAgaWYgKHJlcG9OYW1lLmluY2x1ZGVzKCdnaXRodWIuY29tJykpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSByZXBvTmFtZS5tYXRjaCgvZ2l0aHViXFwuY29tWzovXShbXi9dK1xcL1teL10rKShcXC5naXQpPyQvKVxuICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgcmVwb1dhcm5pbmdzLnB1c2goe1xuICAgICAgICAgICAgdGl0bGU6ICdJbnZhbGlkIEdpdEh1YiBVUkwgZm9ybWF0JyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdUaGUgcmVwb3NpdG9yeSBVUkwgZm9ybWF0IGFwcGVhcnMgdG8gYmUgaW52YWxpZC4nLFxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBbXG4gICAgICAgICAgICAgICdVc2UgZm9ybWF0OiBvd25lci9yZXBvIG9yIGh0dHBzOi8vZ2l0aHViLmNvbS9vd25lci9yZXBvJyxcbiAgICAgICAgICAgICAgJ0V4YW1wbGU6IGFudGhyb3BpY3MvY2xhdWRlLWNsaScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVwb05hbWUgPSBtYXRjaFsxXT8ucmVwbGFjZSgvXFwuZ2l0JC8sICcnKSB8fCAnJ1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghcmVwb05hbWUuaW5jbHVkZXMoJy8nKSkge1xuICAgICAgICByZXBvV2FybmluZ3MucHVzaCh7XG4gICAgICAgICAgdGl0bGU6ICdSZXBvc2l0b3J5IGZvcm1hdCB3YXJuaW5nJyxcbiAgICAgICAgICBtZXNzYWdlOiAnUmVwb3NpdG9yeSBzaG91bGQgYmUgaW4gZm9ybWF0IFwib3duZXIvcmVwb1wiJyxcbiAgICAgICAgICBpbnN0cnVjdGlvbnM6IFtcbiAgICAgICAgICAgICdVc2UgZm9ybWF0OiBvd25lci9yZXBvJyxcbiAgICAgICAgICAgICdFeGFtcGxlOiBhbnRocm9waWNzL2NsYXVkZS1jbGknLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBlcm1pc3Npb25DaGVjayA9IGF3YWl0IGNoZWNrUmVwb3NpdG9yeVBlcm1pc3Npb25zKHJlcG9OYW1lKVxuXG4gICAgICBpZiAocGVybWlzc2lvbkNoZWNrLmVycm9yID09PSAncmVwb3NpdG9yeV9ub3RfZm91bmQnKSB7XG4gICAgICAgIHJlcG9XYXJuaW5ncy5wdXNoKHtcbiAgICAgICAgICB0aXRsZTogJ1JlcG9zaXRvcnkgbm90IGZvdW5kJyxcbiAgICAgICAgICBtZXNzYWdlOiBgUmVwb3NpdG9yeSAke3JlcG9OYW1lfSB3YXMgbm90IGZvdW5kIG9yIHlvdSBkb24ndCBoYXZlIGFjY2Vzcy5gLFxuICAgICAgICAgIGluc3RydWN0aW9uczogW1xuICAgICAgICAgICAgYENoZWNrIHRoYXQgdGhlIHJlcG9zaXRvcnkgbmFtZSBpcyBjb3JyZWN0OiAke3JlcG9OYW1lfWAsXG4gICAgICAgICAgICAnRW5zdXJlIHlvdSBoYXZlIGFjY2VzcyB0byB0aGlzIHJlcG9zaXRvcnknLFxuICAgICAgICAgICAgJ0ZvciBwcml2YXRlIHJlcG9zaXRvcmllcywgbWFrZSBzdXJlIHlvdXIgR2l0SHViIHRva2VuIGhhcyB0aGUgXCJyZXBvXCIgc2NvcGUnLFxuICAgICAgICAgICAgJ1lvdSBjYW4gYWRkIHRoZSByZXBvIHNjb3BlIHdpdGg6IGdoIGF1dGggcmVmcmVzaCAtaCBnaXRodWIuY29tIC1zIHJlcG8sd29ya2Zsb3cnLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKCFwZXJtaXNzaW9uQ2hlY2suaGFzQWNjZXNzKSB7XG4gICAgICAgIHJlcG9XYXJuaW5ncy5wdXNoKHtcbiAgICAgICAgICB0aXRsZTogJ0FkbWluIHBlcm1pc3Npb25zIHJlcXVpcmVkJyxcbiAgICAgICAgICBtZXNzYWdlOiBgWW91IG1pZ2h0IG5lZWQgYWRtaW4gcGVybWlzc2lvbnMgb24gJHtyZXBvTmFtZX0gdG8gc2V0IHVwIEdpdEh1YiBBY3Rpb25zLmAsXG4gICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBbXG4gICAgICAgICAgICAnUmVwb3NpdG9yeSBhZG1pbnMgY2FuIGluc3RhbGwgR2l0SHViIEFwcHMgYW5kIHNldCBzZWNyZXRzJyxcbiAgICAgICAgICAgICdBc2sgYSByZXBvc2l0b3J5IGFkbWluIHRvIHJ1biB0aGlzIGNvbW1hbmQgaWYgc2V0dXAgZmFpbHMnLFxuICAgICAgICAgICAgJ0FsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIHRoZSBtYW51YWwgc2V0dXAgaW5zdHJ1Y3Rpb25zJyxcbiAgICAgICAgICBdLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCB3b3JrZmxvd0V4aXN0cyA9IGF3YWl0IGNoZWNrRXhpc3RpbmdXb3JrZmxvd0ZpbGUocmVwb05hbWUpXG5cbiAgICAgIGlmIChyZXBvV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBhbGxXYXJuaW5ncyA9IFsuLi5zdGF0ZS53YXJuaW5ncywgLi4ucmVwb1dhcm5pbmdzXVxuICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICBzZWxlY3RlZFJlcG9OYW1lOiByZXBvTmFtZSxcbiAgICAgICAgICB3b3JrZmxvd0V4aXN0cyxcbiAgICAgICAgICB3YXJuaW5nczogYWxsV2FybmluZ3MsXG4gICAgICAgICAgc3RlcDogJ3dhcm5pbmdzJyxcbiAgICAgICAgfSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgICAgIHN0ZXA6ICdjaG9vc2UtcmVwbycgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgICAgfSlcbiAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoe1xuICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgc2VsZWN0ZWRSZXBvTmFtZTogcmVwb05hbWUsXG4gICAgICAgICAgd29ya2Zsb3dFeGlzdHMsXG4gICAgICAgICAgc3RlcDogJ2luc3RhbGwtYXBwJyxcbiAgICAgICAgfSkpXG4gICAgICAgIHNldFRpbWVvdXQob3BlbkdpdEh1YkFwcEluc3RhbGxhdGlvbiwgMClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0YXRlLnN0ZXAgPT09ICdpbnN0YWxsLWFwcCcpIHtcbiAgICAgIGxvZ0V2ZW50KCd0ZW5ndV9pbnN0YWxsX2dpdGh1Yl9hcHBfc3RlcF9jb21wbGV0ZWQnLCB7XG4gICAgICAgIHN0ZXA6ICdpbnN0YWxsLWFwcCcgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgIH0pXG4gICAgICBpZiAoc3RhdGUud29ya2Zsb3dFeGlzdHMpIHtcbiAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzdGVwOiAnY2hlY2stZXhpc3Rpbmctd29ya2Zsb3cnIH0pKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzdGVwOiAnc2VsZWN0LXdvcmtmbG93cycgfSkpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5zdGVwID09PSAnY2hlY2stZXhpc3Rpbmctd29ya2Zsb3cnKSB7XG4gICAgICByZXR1cm5cbiAgICB9IGVsc2UgaWYgKHN0YXRlLnN0ZXAgPT09ICdzZWxlY3Qtd29ya2Zsb3dzJykge1xuICAgICAgLy8gSGFuZGxlZCBieSB0aGUgV29ya2Zsb3dNdWx0aXNlbGVjdERpYWxvZyBjb21wb25lbnRcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSBpZiAoc3RhdGUuc3RlcCA9PT0gJ2NoZWNrLWV4aXN0aW5nLXNlY3JldCcpIHtcbiAgICAgIGxvZ0V2ZW50KCd0ZW5ndV9pbnN0YWxsX2dpdGh1Yl9hcHBfc3RlcF9jb21wbGV0ZWQnLCB7XG4gICAgICAgIHN0ZXA6ICdjaGVjay1leGlzdGluZy1zZWNyZXQnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICB9KVxuICAgICAgaWYgKHN0YXRlLnVzZUV4aXN0aW5nU2VjcmV0KSB7XG4gICAgICAgIGF3YWl0IHJ1blNldHVwR2l0SHViQWN0aW9ucyhudWxsLCBzdGF0ZS5zZWNyZXROYW1lKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXNlciB3YW50cyB0byB1c2UgYSBuZXcgc2VjcmV0IG5hbWUgd2l0aCB0aGVpciBBUEkga2V5XG4gICAgICAgIGF3YWl0IHJ1blNldHVwR2l0SHViQWN0aW9ucyhzdGF0ZS5hcGlLZXlPck9BdXRoVG9rZW4sIHN0YXRlLnNlY3JldE5hbWUpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5zdGVwID09PSAnYXBpLWtleScpIHtcbiAgICAgIC8vIEluIHRoZSBuZXcgZmxvdywgYXBpLWtleSBzdGVwIG9ubHkgYXBwZWFycyB3aGVuIHVzZXIgaGFzIG5vIGV4aXN0aW5nIGtleVxuICAgICAgLy8gVGhleSBlaXRoZXIgZW50ZXJlZCBhIG5ldyBrZXkgb3Igd2lsbCBjcmVhdGUgT0F1dGggdG9rZW5cbiAgICAgIGlmIChzdGF0ZS5zZWxlY3RlZEFwaUtleU9wdGlvbiA9PT0gJ29hdXRoJykge1xuICAgICAgICAvLyBPQXV0aCBmbG93IGFscmVhZHkgaGFuZGxlZCBieSBoYW5kbGVDcmVhdGVPQXV0aFRva2VuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBJZiB1c2VyIHNlbGVjdGVkICdleGlzdGluZycgb3B0aW9uLCB1c2UgdGhlIGV4aXN0aW5nIEFQSSBrZXlcbiAgICAgIGNvbnN0IGFwaUtleVRvVXNlID1cbiAgICAgICAgc3RhdGUuc2VsZWN0ZWRBcGlLZXlPcHRpb24gPT09ICdleGlzdGluZydcbiAgICAgICAgICA/IGV4aXN0aW5nQXBpS2V5XG4gICAgICAgICAgOiBzdGF0ZS5hcGlLZXlPck9BdXRoVG9rZW5cblxuICAgICAgaWYgKCFhcGlLZXlUb1VzZSkge1xuICAgICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX2Vycm9yJywge1xuICAgICAgICAgIHJlYXNvbjpcbiAgICAgICAgICAgICdhcGlfa2V5X21pc3NpbmcnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgIH0pXG4gICAgICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgIHN0ZXA6ICdlcnJvcicsXG4gICAgICAgICAgZXJyb3I6ICdBUEkga2V5IGlzIHJlcXVpcmVkJyxcbiAgICAgICAgfSkpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSB0aGUgQVBJIGtleSBiZWluZyB1c2VkIChlaXRoZXIgZXhpc3Rpbmcgb3IgbmV3bHkgZW50ZXJlZClcbiAgICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgYXBpS2V5T3JPQXV0aFRva2VuOiBhcGlLZXlUb1VzZSxcbiAgICAgICAgdXNlRXhpc3RpbmdLZXk6IHN0YXRlLnNlbGVjdGVkQXBpS2V5T3B0aW9uID09PSAnZXhpc3RpbmcnLFxuICAgICAgfSkpXG5cbiAgICAgIC8vIENoZWNrIGlmIEFOVEhST1BJQ19BUElfS0VZIHNlY3JldCBhbHJlYWR5IGV4aXN0c1xuICAgICAgY29uc3QgY2hlY2tTZWNyZXRzUmVzdWx0ID0gYXdhaXQgZXhlY0ZpbGVOb1Rocm93KCdnaCcsIFtcbiAgICAgICAgJ3NlY3JldCcsXG4gICAgICAgICdsaXN0JyxcbiAgICAgICAgJy0tYXBwJyxcbiAgICAgICAgJ2FjdGlvbnMnLFxuICAgICAgICAnLS1yZXBvJyxcbiAgICAgICAgc3RhdGUuc2VsZWN0ZWRSZXBvTmFtZSxcbiAgICAgIF0pXG5cbiAgICAgIGlmIChjaGVja1NlY3JldHNSZXN1bHQuY29kZSA9PT0gMCkge1xuICAgICAgICBjb25zdCBsaW5lcyA9IGNoZWNrU2VjcmV0c1Jlc3VsdC5zdGRvdXQuc3BsaXQoJ1xcbicpXG4gICAgICAgIGNvbnN0IGhhc0FudGhyb3BpY0tleSA9IGxpbmVzLnNvbWUoKGxpbmU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHJldHVybiAvXkFOVEhST1BJQ19BUElfS0VZXFxzKy8udGVzdChsaW5lKVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChoYXNBbnRocm9waWNLZXkpIHtcbiAgICAgICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgICAgICAgc3RlcDogJ2FwaS1rZXknIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgc2VjcmV0RXhpc3RzOiB0cnVlLFxuICAgICAgICAgICAgc3RlcDogJ2NoZWNrLWV4aXN0aW5nLXNlY3JldCcsXG4gICAgICAgICAgfSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nRXZlbnQoJ3Rlbmd1X2luc3RhbGxfZ2l0aHViX2FwcF9zdGVwX2NvbXBsZXRlZCcsIHtcbiAgICAgICAgICAgIHN0ZXA6ICdhcGkta2V5JyBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLy8gTm8gZXhpc3Rpbmcgc2VjcmV0LCBwcm9jZWVkIHRvIGNyZWF0aW5nXG4gICAgICAgICAgYXdhaXQgcnVuU2V0dXBHaXRIdWJBY3Rpb25zKGFwaUtleVRvVXNlLCBzdGF0ZS5zZWNyZXROYW1lKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgICAgIHN0ZXA6ICdhcGkta2V5JyBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgICAgICB9KVxuICAgICAgICAvLyBFcnJvciBjaGVja2luZyBzZWNyZXRzLCBwcm9jZWVkIGFueXdheVxuICAgICAgICBhd2FpdCBydW5TZXR1cEdpdEh1YkFjdGlvbnMoYXBpS2V5VG9Vc2UsIHN0YXRlLnNlY3JldE5hbWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlUmVwb1VybENoYW5nZSA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzZWxlY3RlZFJlcG9OYW1lOiB2YWx1ZSB9KSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUFwaUtleUNoYW5nZSA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBhcGlLZXlPck9BdXRoVG9rZW46IHZhbHVlIH0pKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQXBpS2V5T3B0aW9uQ2hhbmdlID0gKG9wdGlvbjogJ2V4aXN0aW5nJyB8ICduZXcnIHwgJ29hdXRoJykgPT4ge1xuICAgIHNldFN0YXRlKHByZXYgPT4gKHsgLi4ucHJldiwgc2VsZWN0ZWRBcGlLZXlPcHRpb246IG9wdGlvbiB9KSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUNyZWF0ZU9BdXRoVG9rZW4gPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgbG9nRXZlbnQoJ3Rlbmd1X2luc3RhbGxfZ2l0aHViX2FwcF9zdGVwX2NvbXBsZXRlZCcsIHtcbiAgICAgIHN0ZXA6ICdhcGkta2V5JyBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgIH0pXG4gICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzdGVwOiAnb2F1dGgtZmxvdycgfSkpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IGhhbmRsZU9BdXRoU3VjY2VzcyA9IHVzZUNhbGxiYWNrKFxuICAgICh0b2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgICBzdGVwOiAnb2F1dGgtZmxvdycgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgIH0pXG4gICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIGFwaUtleU9yT0F1dGhUb2tlbjogdG9rZW4sXG4gICAgICAgIHVzZUV4aXN0aW5nS2V5OiBmYWxzZSxcbiAgICAgICAgc2VjcmV0TmFtZTogJ0NMQVVERV9DT0RFX09BVVRIX1RPS0VOJyxcbiAgICAgICAgYXV0aFR5cGU6ICdvYXV0aF90b2tlbicsXG4gICAgICB9KSlcbiAgICAgIHZvaWQgcnVuU2V0dXBHaXRIdWJBY3Rpb25zKHRva2VuLCAnQ0xBVURFX0NPREVfT0FVVEhfVE9LRU4nKVxuICAgIH0sXG4gICAgW3J1blNldHVwR2l0SHViQWN0aW9uc10sXG4gIClcblxuICBjb25zdCBoYW5kbGVPQXV0aENhbmNlbCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRTdGF0ZShwcmV2ID0+ICh7IC4uLnByZXYsIHN0ZXA6ICdhcGkta2V5JyB9KSlcbiAgfSwgW10pXG5cbiAgY29uc3QgaGFuZGxlU2VjcmV0TmFtZUNoYW5nZSA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKHZhbHVlICYmICEvXlthLXpBLVowLTlfXSskLy50ZXN0KHZhbHVlKSkgcmV0dXJuXG4gICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzZWNyZXROYW1lOiB2YWx1ZSB9KSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVRvZ2dsZVVzZUN1cnJlbnRSZXBvID0gKHVzZUN1cnJlbnRSZXBvOiBib29sZWFuKSA9PiB7XG4gICAgc2V0U3RhdGUocHJldiA9PiAoe1xuICAgICAgLi4ucHJldixcbiAgICAgIHVzZUN1cnJlbnRSZXBvLFxuICAgICAgc2VsZWN0ZWRSZXBvTmFtZTogdXNlQ3VycmVudFJlcG8gPyBwcmV2LmN1cnJlbnRSZXBvIDogJycsXG4gICAgfSkpXG4gIH1cblxuICBjb25zdCBoYW5kbGVUb2dnbGVVc2VFeGlzdGluZ0tleSA9ICh1c2VFeGlzdGluZ0tleTogYm9vbGVhbikgPT4ge1xuICAgIHNldFN0YXRlKHByZXYgPT4gKHsgLi4ucHJldiwgdXNlRXhpc3RpbmdLZXkgfSkpXG4gIH1cblxuICBjb25zdCBoYW5kbGVUb2dnbGVVc2VFeGlzdGluZ1NlY3JldCA9ICh1c2VFeGlzdGluZ1NlY3JldDogYm9vbGVhbikgPT4ge1xuICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgIC4uLnByZXYsXG4gICAgICB1c2VFeGlzdGluZ1NlY3JldCxcbiAgICAgIHNlY3JldE5hbWU6IHVzZUV4aXN0aW5nU2VjcmV0ID8gJ0FOVEhST1BJQ19BUElfS0VZJyA6ICcnLFxuICAgIH0pKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlV29ya2Zsb3dBY3Rpb24gPSBhc3luYyAoYWN0aW9uOiAndXBkYXRlJyB8ICdza2lwJyB8ICdleGl0JykgPT4ge1xuICAgIGlmIChhY3Rpb24gPT09ICdleGl0Jykge1xuICAgICAgcHJvcHMub25Eb25lKCdJbnN0YWxsYXRpb24gY2FuY2VsbGVkIGJ5IHVzZXInKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbG9nRXZlbnQoJ3Rlbmd1X2luc3RhbGxfZ2l0aHViX2FwcF9zdGVwX2NvbXBsZXRlZCcsIHtcbiAgICAgIHN0ZXA6ICdjaGVjay1leGlzdGluZy13b3JrZmxvdycgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICB9KVxuXG4gICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCB3b3JrZmxvd0FjdGlvbjogYWN0aW9uIH0pKVxuXG4gICAgaWYgKGFjdGlvbiA9PT0gJ3NraXAnIHx8IGFjdGlvbiA9PT0gJ3VwZGF0ZScpIHtcbiAgICAgIC8vIENoZWNrIGlmIHVzZXIgaGFzIGV4aXN0aW5nIGxvY2FsIEFQSSBrZXlcbiAgICAgIGlmIChleGlzdGluZ0FwaUtleSkge1xuICAgICAgICBhd2FpdCBjaGVja0V4aXN0aW5nU2VjcmV0KClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vIGxvY2FsIGtleSwgZ28gc3RyYWlnaHQgdG8gQVBJIGtleSBzdGVwXG4gICAgICAgIHNldFN0YXRlKHByZXYgPT4gKHsgLi4ucHJldiwgc3RlcDogJ2FwaS1rZXknIH0pKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZURpc21pc3NLZXlEb3duKGU6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICBpZiAoc3RhdGUuc3RlcCA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX2NvbXBsZXRlZCcsIHt9KVxuICAgIH1cbiAgICBwcm9wcy5vbkRvbmUoXG4gICAgICBzdGF0ZS5zdGVwID09PSAnc3VjY2VzcydcbiAgICAgICAgPyAnR2l0SHViIEFjdGlvbnMgc2V0dXAgY29tcGxldGUhJ1xuICAgICAgICA6IHN0YXRlLmVycm9yXG4gICAgICAgICAgPyBgQ291bGRuJ3QgaW5zdGFsbCBHaXRIdWIgQXBwOiAke3N0YXRlLmVycm9yfVxcbkZvciBtYW51YWwgc2V0dXAgaW5zdHJ1Y3Rpb25zLCBzZWU6ICR7R0lUSFVCX0FDVElPTl9TRVRVUF9ET0NTX1VSTH1gXG4gICAgICAgICAgOiBgR2l0SHViIEFwcCBpbnN0YWxsYXRpb24gZmFpbGVkXFxuRm9yIG1hbnVhbCBzZXR1cCBpbnN0cnVjdGlvbnMsIHNlZTogJHtHSVRIVUJfQUNUSU9OX1NFVFVQX0RPQ1NfVVJMfWAsXG4gICAgKVxuICB9XG5cbiAgc3dpdGNoIChzdGF0ZS5zdGVwKSB7XG4gICAgY2FzZSAnY2hlY2stZ2gnOlxuICAgICAgcmV0dXJuIDxDaGVja0dpdEh1YlN0ZXAgLz5cbiAgICBjYXNlICd3YXJuaW5ncyc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8V2FybmluZ3NTdGVwIHdhcm5pbmdzPXtzdGF0ZS53YXJuaW5nc30gb25Db250aW51ZT17aGFuZGxlU3VibWl0fSAvPlxuICAgICAgKVxuICAgIGNhc2UgJ2Nob29zZS1yZXBvJzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxDaG9vc2VSZXBvU3RlcFxuICAgICAgICAgIGN1cnJlbnRSZXBvPXtzdGF0ZS5jdXJyZW50UmVwb31cbiAgICAgICAgICB1c2VDdXJyZW50UmVwbz17c3RhdGUudXNlQ3VycmVudFJlcG99XG4gICAgICAgICAgcmVwb1VybD17c3RhdGUuc2VsZWN0ZWRSZXBvTmFtZX1cbiAgICAgICAgICBvblJlcG9VcmxDaGFuZ2U9e2hhbmRsZVJlcG9VcmxDaGFuZ2V9XG4gICAgICAgICAgb25Ub2dnbGVVc2VDdXJyZW50UmVwbz17aGFuZGxlVG9nZ2xlVXNlQ3VycmVudFJlcG99XG4gICAgICAgICAgb25TdWJtaXQ9e2hhbmRsZVN1Ym1pdH1cbiAgICAgICAgLz5cbiAgICAgIClcbiAgICBjYXNlICdpbnN0YWxsLWFwcCc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8SW5zdGFsbEFwcFN0ZXBcbiAgICAgICAgICByZXBvVXJsPXtzdGF0ZS5zZWxlY3RlZFJlcG9OYW1lfVxuICAgICAgICAgIG9uU3VibWl0PXtoYW5kbGVTdWJtaXR9XG4gICAgICAgIC8+XG4gICAgICApXG4gICAgY2FzZSAnY2hlY2stZXhpc3Rpbmctd29ya2Zsb3cnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPEV4aXN0aW5nV29ya2Zsb3dTdGVwXG4gICAgICAgICAgcmVwb05hbWU9e3N0YXRlLnNlbGVjdGVkUmVwb05hbWV9XG4gICAgICAgICAgb25TZWxlY3RBY3Rpb249e2hhbmRsZVdvcmtmbG93QWN0aW9ufVxuICAgICAgICAvPlxuICAgICAgKVxuICAgIGNhc2UgJ2NoZWNrLWV4aXN0aW5nLXNlY3JldCc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8Q2hlY2tFeGlzdGluZ1NlY3JldFN0ZXBcbiAgICAgICAgICB1c2VFeGlzdGluZ1NlY3JldD17c3RhdGUudXNlRXhpc3RpbmdTZWNyZXR9XG4gICAgICAgICAgc2VjcmV0TmFtZT17c3RhdGUuc2VjcmV0TmFtZX1cbiAgICAgICAgICBvblRvZ2dsZVVzZUV4aXN0aW5nU2VjcmV0PXtoYW5kbGVUb2dnbGVVc2VFeGlzdGluZ1NlY3JldH1cbiAgICAgICAgICBvblNlY3JldE5hbWVDaGFuZ2U9e2hhbmRsZVNlY3JldE5hbWVDaGFuZ2V9XG4gICAgICAgICAgb25TdWJtaXQ9e2hhbmRsZVN1Ym1pdH1cbiAgICAgICAgLz5cbiAgICAgIClcbiAgICBjYXNlICdhcGkta2V5JzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxBcGlLZXlTdGVwXG4gICAgICAgICAgZXhpc3RpbmdBcGlLZXk9e2V4aXN0aW5nQXBpS2V5fVxuICAgICAgICAgIHVzZUV4aXN0aW5nS2V5PXtzdGF0ZS51c2VFeGlzdGluZ0tleX1cbiAgICAgICAgICBhcGlLZXlPck9BdXRoVG9rZW49e3N0YXRlLmFwaUtleU9yT0F1dGhUb2tlbn1cbiAgICAgICAgICBvbkFwaUtleUNoYW5nZT17aGFuZGxlQXBpS2V5Q2hhbmdlfVxuICAgICAgICAgIG9uVG9nZ2xlVXNlRXhpc3RpbmdLZXk9e2hhbmRsZVRvZ2dsZVVzZUV4aXN0aW5nS2V5fVxuICAgICAgICAgIG9uU3VibWl0PXtoYW5kbGVTdWJtaXR9XG4gICAgICAgICAgb25DcmVhdGVPQXV0aFRva2VuPXtcbiAgICAgICAgICAgIGlzQW50aHJvcGljQXV0aEVuYWJsZWQoKSA/IGhhbmRsZUNyZWF0ZU9BdXRoVG9rZW4gOiB1bmRlZmluZWRcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZWN0ZWRPcHRpb249e3N0YXRlLnNlbGVjdGVkQXBpS2V5T3B0aW9ufVxuICAgICAgICAgIG9uU2VsZWN0T3B0aW9uPXtoYW5kbGVBcGlLZXlPcHRpb25DaGFuZ2V9XG4gICAgICAgIC8+XG4gICAgICApXG4gICAgY2FzZSAnY3JlYXRpbmcnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPENyZWF0aW5nU3RlcFxuICAgICAgICAgIGN1cnJlbnRXb3JrZmxvd0luc3RhbGxTdGVwPXtzdGF0ZS5jdXJyZW50V29ya2Zsb3dJbnN0YWxsU3RlcH1cbiAgICAgICAgICBzZWNyZXRFeGlzdHM9e3N0YXRlLnNlY3JldEV4aXN0c31cbiAgICAgICAgICB1c2VFeGlzdGluZ1NlY3JldD17c3RhdGUudXNlRXhpc3RpbmdTZWNyZXR9XG4gICAgICAgICAgc2VjcmV0TmFtZT17c3RhdGUuc2VjcmV0TmFtZX1cbiAgICAgICAgICBza2lwV29ya2Zsb3c9e3N0YXRlLndvcmtmbG93QWN0aW9uID09PSAnc2tpcCd9XG4gICAgICAgICAgc2VsZWN0ZWRXb3JrZmxvd3M9e3N0YXRlLnNlbGVjdGVkV29ya2Zsb3dzfVxuICAgICAgICAvPlxuICAgICAgKVxuICAgIGNhc2UgJ3N1Y2Nlc3MnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPEJveCB0YWJJbmRleD17MH0gYXV0b0ZvY3VzIG9uS2V5RG93bj17aGFuZGxlRGlzbWlzc0tleURvd259PlxuICAgICAgICAgIDxTdWNjZXNzU3RlcFxuICAgICAgICAgICAgc2VjcmV0RXhpc3RzPXtzdGF0ZS5zZWNyZXRFeGlzdHN9XG4gICAgICAgICAgICB1c2VFeGlzdGluZ1NlY3JldD17c3RhdGUudXNlRXhpc3RpbmdTZWNyZXR9XG4gICAgICAgICAgICBzZWNyZXROYW1lPXtzdGF0ZS5zZWNyZXROYW1lfVxuICAgICAgICAgICAgc2tpcFdvcmtmbG93PXtzdGF0ZS53b3JrZmxvd0FjdGlvbiA9PT0gJ3NraXAnfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvQm94PlxuICAgICAgKVxuICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxCb3ggdGFiSW5kZXg9ezB9IGF1dG9Gb2N1cyBvbktleURvd249e2hhbmRsZURpc21pc3NLZXlEb3dufT5cbiAgICAgICAgICA8RXJyb3JTdGVwXG4gICAgICAgICAgICBlcnJvcj17c3RhdGUuZXJyb3J9XG4gICAgICAgICAgICBlcnJvclJlYXNvbj17c3RhdGUuZXJyb3JSZWFzb259XG4gICAgICAgICAgICBlcnJvckluc3RydWN0aW9ucz17c3RhdGUuZXJyb3JJbnN0cnVjdGlvbnN9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9Cb3g+XG4gICAgICApXG4gICAgY2FzZSAnc2VsZWN0LXdvcmtmbG93cyc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8V29ya2Zsb3dNdWx0aXNlbGVjdERpYWxvZ1xuICAgICAgICAgIGRlZmF1bHRTZWxlY3Rpb25zPXtzdGF0ZS5zZWxlY3RlZFdvcmtmbG93c31cbiAgICAgICAgICBvblN1Ym1pdD17c2VsZWN0ZWRXb3JrZmxvd3MgPT4ge1xuICAgICAgICAgICAgbG9nRXZlbnQoJ3Rlbmd1X2luc3RhbGxfZ2l0aHViX2FwcF9zdGVwX2NvbXBsZXRlZCcsIHtcbiAgICAgICAgICAgICAgc3RlcDogJ3NlbGVjdC13b3JrZmxvd3MnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoe1xuICAgICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgICBzZWxlY3RlZFdvcmtmbG93cyxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdXNlciBoYXMgZXhpc3RpbmcgbG9jYWwgQVBJIGtleVxuICAgICAgICAgICAgaWYgKGV4aXN0aW5nQXBpS2V5KSB7XG4gICAgICAgICAgICAgIHZvaWQgY2hlY2tFeGlzdGluZ1NlY3JldCgpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBObyBsb2NhbCBrZXksIGdvIHN0cmFpZ2h0IHRvIEFQSSBrZXkgc3RlcFxuICAgICAgICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7IC4uLnByZXYsIHN0ZXA6ICdhcGkta2V5JyB9KSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9fVxuICAgICAgICAvPlxuICAgICAgKVxuICAgIGNhc2UgJ29hdXRoLWZsb3cnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPE9BdXRoRmxvd1N0ZXBcbiAgICAgICAgICBvblN1Y2Nlc3M9e2hhbmRsZU9BdXRoU3VjY2Vzc31cbiAgICAgICAgICBvbkNhbmNlbD17aGFuZGxlT0F1dGhDYW5jZWx9XG4gICAgICAgIC8+XG4gICAgICApXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhbGwoXG4gIG9uRG9uZTogTG9jYWxKU1hDb21tYW5kT25Eb25lLFxuKTogUHJvbWlzZTxSZWFjdC5SZWFjdE5vZGU+IHtcbiAgcmV0dXJuIDxJbnN0YWxsR2l0SHViQXBwIG9uRG9uZT17b25Eb25lfSAvPlxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxLQUFLLFFBQVEsT0FBTztBQUM3QixPQUFPQyxLQUFLLElBQUlDLFdBQVcsRUFBRUMsUUFBUSxRQUFRLE9BQU87QUFDcEQsU0FDRSxLQUFLQywwREFBMEQsRUFDL0RDLFFBQVEsUUFDSCxpQ0FBaUM7QUFDeEMsU0FBU0MseUJBQXlCLFFBQVEsK0NBQStDO0FBQ3pGLFNBQVNDLDRCQUE0QixRQUFRLCtCQUErQjtBQUM1RSxT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O0FBRTFELFFBQVEsRUFBRSxHQUFHLENBQUM7SUFFVixLQUFLLE9BQU87TUFDVixPQUNFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQytDLG9CQUFvQixDQUFDO0FBQ3BFLFVBQVUsQ0FBQyxTQUFTLENBQ1IsS0FBSyxDQUFDLENBQUN4RSxLQUFLLENBQUNvQixLQUFLLENBQUMsQ0FDbkIsV0FBVyxDQUFDLENBQUNwQixLQUFLLENBQUNzQixXQUFXLENBQUMsQ0FDL0IsaUJBQWlCLENBQUMsQ0FBQ3RCLEtBQUssQ0FBQ3VCLGlCQUFpQixDQUFDO0FBRXZELFFBQVEsRUFBRSxHQUFHLENBQUM7SUFFVixLQUFLLGtCQUFrQjtNQUNyQixPQUNFLENBQUMseUJBQXlCLENBQ3hCLGlCQUFpQixDQUFDLENBQUN2QixLQUFLLENBQUNULGlCQUFpQixDQUFDLENBQzNDLFFBQVEsQ0FBQyxDQUFDQSxpQkFBaUIsSUFBSTtRQUM3QnpDLFFBQVEsQ0FBQyx5Q0FBeUMsRUFBRTtVQUNsRDZCLElBQUksRUFBRSxrQkFBa0IsSUFBSTlCO1FBQzlCLENBQUMsQ0FBQztRQUNGb0QsUUFBUSxDQUFDa0IsT0FBSSxLQUFLO1VBQ2hCLEdBQUdBLE9BQUk7VUFDUDVCO1FBQ0YsQ0FBQyxDQUFDLENBQUM7UUFDSDtRQUNBLElBQUlRLGNBQWMsRUFBRTtVQUNsQixLQUFLMkMsbUJBQW1CLENBQUMsQ0FBQztRQUM1QixDQUFDLE1BQU07VUFDTDtVQUNBekMsUUFBUSxDQUFDa0IsT0FBSSxLQUFLO1lBQUUsR0FBR0EsT0FBSTtZQUFFeEMsSUFBSSxFQUFFO1VBQVUsQ0FBQyxDQUFDLENBQUM7UUFDbEQ7TUFDRixDQUFDLENBQUMsR0FDRjtJQUVOLEtBQUssWUFBWTtNQUNmLE9BQ0UsQ0FBQyxhQUFhLENBQ1osU0FBUyxDQUFDLENBQUNvRixrQkFBa0IsQ0FBQyxDQUM5QixRQUFRLENBQUMsQ0FBQ0UsaUJBQWlCLENBQUMsR0FDNUI7RUFFUjtBQUNGO0FBRUEsT0FBTyxlQUFlVyxJQUFJQSxDQUN4QmhGLE1BQU0sRUFBRXhDLHFCQUFxQixDQUM5QixFQUFFNkUsT0FBTyxDQUFDdkYsS0FBSyxDQUFDb0QsU0FBUyxDQUFDLENBQUM7RUFDMUIsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDRixNQUFNLENBQUMsR0FBRztBQUM3QyIsImlnbm9yZUxpc3QiOltdfQ==
|
|
586
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleGVjYSIsIlJlYWN0IiwidXNlQ2FsbGJhY2siLCJ1c2VTdGF0ZSIsIkFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMiLCJsb2dFdmVudCIsIldvcmtmbG93TXVsdGlzZWxlY3REaWFsb2ciLCJHSVRIVUJfQUNUSU9OX1NFVFVQX0RPQ1NfVVJMIiwidXNlRXhpdE9uQ3RybENEV2l0aEtleWJpbmRpbmdzIiwiS2V5Ym9hcmRFdmVudCIsIkJveCIsIkxvY2FsSlNYQ29tbWFuZE9uRG9uZSIsImdldEFudGhyb3BpY0FwaUtleSIsImlzQW50aHJvcGljQXV0aEVuYWJsZWQiLCJvcGVuQnJvd3NlciIsImV4ZWNGaWxlTm9UaHJvdyIsImdldEdpdGh1YlJlcG8iLCJwbHVyYWwiLCJBcGlLZXlTdGVwIiwiQ2hlY2tFeGlzdGluZ1NlY3JldFN0ZXAiLCJDaGVja0dpdEh1YlN0ZXAiLCJDaG9vc2VSZXBvU3RlcCIsIkNyZWF0aW5nU3RlcCIsIkVycm9yU3RlcCIsIkV4aXN0aW5nV29ya2Zsb3dTdGVwIiwiSW5zdGFsbEFwcFN0ZXAiLCJPQXV0aEZsb3dTdGVwIiwiU3VjY2Vzc1N0ZXAiLCJzZXR1cEdpdEh1YkFjdGlvbnMiLCJTdGF0ZSIsIldhcm5pbmciLCJXb3JrZmxvdyIsIldhcm5pbmdzU3RlcCIsIklOSVRJQUxfU1RBVEUiLCJzdGVwIiwic2VsZWN0ZWRSZXBvTmFtZSIsImN1cnJlbnRSZXBvIiwidXNlQ3VycmVudFJlcG8iLCJhcGlLZXlPck9BdXRoVG9rZW4iLCJ1c2VFeGlzdGluZ0tleSIsImN1cnJlbnRXb3JrZmxvd0luc3RhbGxTdGVwIiwid2FybmluZ3MiLCJzZWNyZXRFeGlzdHMiLCJzZWNyZXROYW1lIiwidXNlRXhpc3RpbmdTZWNyZXQiLCJ3b3JrZmxvd0V4aXN0cyIsInNlbGVjdGVkV29ya2Zsb3dzIiwic2VsZWN0ZWRBcGlLZXlPcHRpb24iLCJhdXRoVHlwZSIsIkluc3RhbGxHaXRIdWJBcHAiLCJwcm9wcyIsIm9uRG9uZSIsIm1lc3NhZ2UiLCJSZWFjdE5vZGUiLCJleGlzdGluZ0FwaUtleSIsInN0YXRlIiwic2V0U3RhdGUiLCJ1c2VFZmZlY3QiLCJjaGVja0dpdEh1YkNMSSIsImdoVmVyc2lvblJlc3VsdCIsInNoZWxsIiwicmVqZWN0IiwiZXhpdENvZGUiLCJwdXNoIiwidGl0bGUiLCJpbnN0cnVjdGlvbnMiLCJhdXRoUmVzdWx0IiwidG9rZW5TY29wZXNNYXRjaCIsInN0ZG91dCIsIm1hdGNoIiwic2NvcGVzIiwibWlzc2luZ1Njb3BlcyIsImluY2x1ZGVzIiwibGVuZ3RoIiwicHJldiIsImVycm9yIiwiam9pbiIsImVycm9yUmVhc29uIiwiZXJyb3JJbnN0cnVjdGlvbnMiLCJydW5TZXR1cEdpdEh1YkFjdGlvbnMiLCJ3b3JrZmxvd0FjdGlvbiIsImVycm9yTWVzc2FnZSIsIkVycm9yIiwicmVhc29uIiwib3BlbkdpdEh1YkFwcEluc3RhbGxhdGlvbiIsImluc3RhbGxVcmwiLCJjaGVja1JlcG9zaXRvcnlQZXJtaXNzaW9ucyIsInJlcG9OYW1lIiwiUHJvbWlzZSIsImhhc0FjY2VzcyIsInJlc3VsdCIsImNvZGUiLCJoYXNBZG1pbiIsInRyaW0iLCJzdGRlcnIiLCJjaGVja0V4aXN0aW5nV29ya2Zsb3dGaWxlIiwiY2hlY2tGaWxlUmVzdWx0IiwiY2hlY2tFeGlzdGluZ1NlY3JldCIsImNoZWNrU2VjcmV0c1Jlc3VsdCIsImxpbmVzIiwic3BsaXQiLCJoYXNBbnRocm9waWNLZXkiLCJzb21lIiwibGluZSIsInRlc3QiLCJoYW5kbGVTdWJtaXQiLCJzZXRUaW1lb3V0IiwicmVwb1dhcm5pbmdzIiwicmVwbGFjZSIsInBlcm1pc3Npb25DaGVjayIsImFsbFdhcm5pbmdzIiwiYXBpS2V5VG9Vc2UiLCJoYW5kbGVSZXBvVXJsQ2hhbmdlIiwidmFsdWUiLCJoYW5kbGVBcGlLZXlDaGFuZ2UiLCJoYW5kbGVBcGlLZXlPcHRpb25DaGFuZ2UiLCJvcHRpb24iLCJoYW5kbGVDcmVhdGVPQXV0aFRva2VuIiwiaGFuZGxlT0F1dGhTdWNjZXNzIiwidG9rZW4iLCJoYW5kbGVPQXV0aENhbmNlbCIsImhhbmRsZVNlY3JldE5hbWVDaGFuZ2UiLCJoYW5kbGVUb2dnbGVVc2VDdXJyZW50UmVwbyIsImhhbmRsZVRvZ2dsZVVzZUV4aXN0aW5nS2V5IiwiaGFuZGxlVG9nZ2xlVXNlRXhpc3RpbmdTZWNyZXQiLCJoYW5kbGVXb3JrZmxvd0FjdGlvbiIsImFjdGlvbiIsImhhbmRsZURpc21pc3NLZXlEb3duIiwiZSIsInByZXZlbnREZWZhdWx0IiwidW5kZWZpbmVkIiwiY2FsbCJdLCJzb3VyY2VzIjpbImluc3RhbGwtZ2l0aHViLWFwcC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY2EgfSBmcm9tICdleGVjYSdcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7XG4gIHR5cGUgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgbG9nRXZlbnQsXG59IGZyb20gJ3NyYy9zZXJ2aWNlcy9hbmFseXRpY3MvaW5kZXguanMnXG5pbXBvcnQgeyBXb3JrZmxvd011bHRpc2VsZWN0RGlhbG9nIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9Xb3JrZmxvd011bHRpc2VsZWN0RGlhbG9nLmpzJ1xuaW1wb3J0IHsgR0lUSFVCX0FDVElPTl9TRVRVUF9ET0NTX1VSTCB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9naXRodWItYXBwLmpzJ1xuaW1wb3J0IHsgdXNlRXhpdE9uQ3RybENEV2l0aEtleWJpbmRpbmdzIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlRXhpdE9uQ3RybENEV2l0aEtleWJpbmRpbmdzLmpzJ1xuaW1wb3J0IHR5cGUgeyBLZXlib2FyZEV2ZW50IH0gZnJvbSAnLi4vLi4vaW5rL2V2ZW50cy9rZXlib2FyZC1ldmVudC5qcydcbmltcG9ydCB7IEJveCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB0eXBlIHsgTG9jYWxKU1hDb21tYW5kT25Eb25lIH0gZnJvbSAnLi4vLi4vdHlwZXMvY29tbWFuZC5qcydcbmltcG9ydCB7IGdldEFudGhyb3BpY0FwaUtleSwgaXNBbnRocm9waWNBdXRoRW5hYmxlZCB9IGZyb20gJy4uLy4uL3V0aWxzL2F1dGguanMnXG5pbXBvcnQgeyBvcGVuQnJvd3NlciB9IGZyb20gJy4uLy4uL3V0aWxzL2Jyb3dzZXIuanMnXG5pbXBvcnQgeyBleGVjRmlsZU5vVGhyb3cgfSBmcm9tICcuLi8uLi91dGlscy9leGVjRmlsZU5vVGhyb3cuanMnXG5pbXBvcnQgeyBnZXRHaXRodWJSZXBvIH0gZnJvbSAnLi4vLi4vdXRpbHMvZ2l0LmpzJ1xuaW1wb3J0IHsgcGx1cmFsIH0gZnJvbSAnLi4vLi4vdXRpbHMvc3RyaW5nVXRpbHMuanMnXG5pbXBvcnQgeyBBcGlLZXlTdGVwIH0gZnJvbSAnLi9BcGlLZXlTdGVwLmpzJ1xuaW1wb3J0IHsgQ2hlY2tFeGlzdGluZ1NlY3JldFN0ZXAgfSBmcm9tICcuL0NoZWNrRXhpc3RpbmdTZWNyZXRTdGVwLmpzJ1xuaW1wb3J0IHsgQ2hlY2tHaXRIdWJTdGVwIH0gZnJvbSAnLi9DaGVja0dpdEh1YlN0ZXAuanMnXG5pbXBvcnQgeyBDaG9vc2VSZXBvU3RlcCB9IGZyb20gJy4vQ2hvb3NlUmVwb1N0ZXAuanMnXG5pbXBvcnQgeyBDcmVhdGluZ1N0ZXAgfSBmcm9tICcuL0NyZWF0aW5nU3RlcC5qcydcbmltcG9ydCB7IEVycm9yU3RlcCB9IGZyb20gJy4vRXJyb3JTdGVwLmpzJ1xuaW1wb3J0IHsgRXhpc3RpbmdXb3JrZmxvd1N0ZXAgfSBmcm9tICcuL0V4aXN0aW5nV29ya2Zsb3dTdGVwLmpzJ1xuaW1wb3J0IHsgSW5zdGFsbEFwcFN0ZXAgfSBmcm9tICcuL0luc3RhbGxBcHBTdGVwLmpzJ1xuaW1wb3J0IHsgT0F1dGhGbG93U3RlcCB9IGZyb20gJy4vT0F1dGhGbG93U3RlcC5qcydcbmltcG9ydCB7IFN1Y2Nlc3NTdGVwIH0gZnJvbSAnLi9TdWNjZXNzU3RlcC5qcydcbmltcG9ydCB7IHNldHVwR2l0SHViQWN0aW9ucyB9IGZyb20gJy4vc2V0dXBHaXRIdWJBY3Rpb25zLmpzJ1xuaW1wb3J0IHR5cGUgeyBTdGF0ZSwgV2FybmluZywgV29ya2Zsb3cgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHsgV2FybmluZ3NTdGVwIH0gZnJvbSAnLi9XYXJuaW5nc1N0ZXAuanMnXG5cbmNvbnN0IElOSVRJQUxfU1RBVEU6IFN0YXRlID0ge1xuICBzdGVwOiAnY2hlY2stZ2gnLFxuICBzZWxlY3RlZFJlcG9OYW1lOiAnJyxcbiAgY3VycmVudFJlcG86ICcnLFxuICB1c2VDdXJyZW50UmVwbzogZmFsc2UsIC8vIERlZmF1bHQgdG8gZmFsc2UsIHdpbGwgYmUgc2V0IHRvIHRydWUgaWYgcmVwbyBkZXRlY3RlZFxuICBhcGlLZXlPck9BdXRoVG9rZW46ICcnLFxuICB1c2VFeGlzdGluZ0tleTogdHJ1ZSxcbiAgY3VycmVudFdvcmtmbG93SW5zdGFsbFN0ZXA6IDAsXG4gIHdhcm5pbmdzOiBbXSxcbiAgc2VjcmV0RXhpc3RzOiBmYWxzZSxcbiAgc2VjcmV0TmFtZTogRlJJRU5ETElfUFJJTUFSWV9FTlYsXG4gIHVzZUV4aXN0aW5nU2VjcmV0OiB0cnVlLFxuICB3b3JrZmxvd0V4aXN0czogZmFsc2UsXG4gIHNlbGVjdGVkV29ya2Zsb3dzOiBbJ3VtbWF5YScsICd1bW1heWEtcmV2aWV3J10gYXMgV29ya2Zsb3dbXSxcbiAgc2VsZWN0ZWRBcGlLZXlPcHRpb246ICduZXcnIGFzICdleGlzdGluZycgfCAnbmV3JyB8ICdvYXV0aCcsXG4gIGF1dGhUeXBlOiAnYXBpX2tleScsXG59XG5cbmZ1bmN0aW9uIEluc3RhbGxHaXRIdWJBcHAocHJvcHM6IHtcbiAgb25Eb25lOiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkXG59KTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgW2V4aXN0aW5nQXBpS2V5XSA9IHVzZVN0YXRlKCgpID0+IGdldEFudGhyb3BpY0FwaUtleSgpKVxuICBjb25zdCBbc3RhdGUsIHNldFN0YXRlXSA9IHVzZVN0YXRlKHtcbiAgICAuLi5JTklUSUFMX1NUQVRFLFxuICAgIHVzZUV4aXN0aW5nS2V5OiAhIWV4aXN0aW5nQXBpS2V5LFxuICAgIHNlbGVjdGVkQXBpS2V5T3B0aW9uOiAoZXhpc3RpbmdBcGlLZXlcbiAgICAgID8gJ2V4aXN0aW5nJ1xuICAgICAgOiBpc0FudGhyb3BpY0F1dGhFbmFibGVkKClcbiAgICAgICAgPyAnb2F1dGgnXG4gICAgICAgIDogJ25ldycpIGFzICdleGlzdGluZycgfCAnbmV3JyB8ICdvYXV0aCcsXG4gIH0pXG4gIHVzZUV4aXRPbkN0cmxDRFdpdGhLZXliaW5kaW5ncygpXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0YXJ0ZWQnLCB7fSlcbiAgfSwgW10pXG5cbiAgY29uc3QgY2hlY2tHaXRIdWJDTEkgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgd2FybmluZ3M6IFdhcm5pbmdbXSA9IFtdXG5cbiAgICAvLyBDaGVjayBpZiBnaCBpcyBpbnN0YWxsZWRcbiAgICBjb25zdCBnaFZlcnNpb25SZXN1bHQgPSBhd2FpdCBleGVjYSgnZ2ggLS12ZXJzaW9uJywge1xuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICByZWplY3Q6IGZhbHNlLFxuICAgIH0pXG4gICAgaWYgKGdoVmVyc2lvblJlc3VsdC5leGl0Q29kZSAhPT0gMCkge1xuICAgICAgd2FybmluZ3MucHVzaCh7XG4gICAgICAgIHRpdGxlOiAnR2l0SHViIENMSSBub3QgZm91bmQnLFxuICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICdHaXRIdWIgQ0xJIChnaCkgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGluc3RhbGxlZCBvciBhY2Nlc3NpYmxlLicsXG4gICAgICAgIGluc3RydWN0aW9uczogW1xuICAgICAgICAgICdJbnN0YWxsIEdpdEh1YiBDTEkgZnJvbSBodHRwczovL2NsaS5naXRodWIuY29tLycsXG4gICAgICAgICAgJ21hY09TOiBicmV3IGluc3RhbGwgZ2gnLFxuICAgICAgICAgICdXaW5kb3dzOiB3aW5nZXQgaW5zdGFsbCAtLWlkIEdpdEh1Yi5jbGknLFxuICAgICAgICAgICdMaW51eDogU2VlIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYXQgaHR0cHM6Ly9naXRodWIuY29tL2NsaS9jbGkjaW5zdGFsbGF0aW9uJyxcbiAgICAgICAgXSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgYXV0aCBzdGF0dXNcbiAgICBjb25zdCBhdXRoUmVzdWx0ID0gYXdhaXQgZXhlY2EoJ2doIGF1dGggc3RhdHVzIC1hJywge1xuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICByZWplY3Q6IGZhbHNlLFxuICAgIH0pXG4gICAgaWYgKGF1dGhSZXN1bHQuZXhpdENvZGUgIT09IDApIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICB0aXRsZTogJ0dpdEh1YiBDTEkgbm90IGF1dGhlbnRpY2F0ZWQnLFxuICAgICAgICBtZXNzYWdlOiAnR2l0SHViIENMSSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYXV0aGVudGljYXRlZC4nLFxuICAgICAgICBpbnN0cnVjdGlvbnM6IFtcbiAgICAgICAgICAnUnVuOiBnaCBhdXRoIGxvZ2luJyxcbiAgICAgICAgICAnRm9sbG93IHRoZSBwcm9tcHRzIHRvIGF1dGhlbnRpY2F0ZSB3aXRoIEdpdEh1YicsXG4gICAgICAgICAgJ09yIHNldCB1cCBhdXRoZW50aWNhdGlvbiB1c2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb3Igb3RoZXIgbWV0aG9kcycsXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDaGVjayBpZiByZXF1aXJlZCBzY29wZXMgYXJlIHByZXNlbnQgaW4gdGhlIFRva2VuIHNjb3BlcyBsaW5lXG4gICAgICBjb25zdCB0b2tlblNjb3Blc01hdGNoID0gYXV0aFJlc3VsdC5zdGRvdXQubWF0Y2goL1Rva2VuIHNjb3BlczouKiQvbSlcbiAgICAgIGlmICh0b2tlblNjb3Blc01hdGNoKSB7XG4gICAgICAgIGNvbnN0IHNjb3BlcyA9IHRva2VuU2NvcGVzTWF0Y2hbMF1cbiAgICAgICAgY29uc3QgbWlzc2luZ1Njb3Blczogc3RyaW5nW10gPSBbXVxuXG4gICAgICAgIGlmICghc2NvcGVzLmluY2x1ZGVzKCdyZXBvJykpIHtcbiAgICAgICAgICBtaXNzaW5nU2NvcGVzLnB1c2goJ3JlcG8nKVxuICAgICAgICB9XG4gICAgICAgIGlmICghc2NvcGVzLmluY2x1ZGVzKCd3b3JrZmxvdycpKSB7XG4gICAgICAgICAgbWlzc2luZ1Njb3Blcy5wdXNoKCd3b3JrZmxvdycpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWlzc2luZ1Njb3Blcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gTWlzc2luZyByZXF1aXJlZCBzY29wZXMgLSBleGl0IGltbWVkaWF0ZWx5XG4gICAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoe1xuICAgICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICAgIHN0ZXA6ICdlcnJvcicsXG4gICAgICAgICAgICBlcnJvcjogYEdpdEh1YiBDTEkgaXMgbWlzc2luZyByZXF1aXJlZCBwZXJtaXNzaW9uczogJHttaXNzaW5nU2NvcGVzLmpvaW4oJywgJyl9LmAsXG4gICAgICAgICAgICBlcnJvclJlYXNvbjogJ01pc3NpbmcgcmVxdWlyZWQgc2NvcGVzJyxcbiAgICAgICAgICAgIGVycm9ySW5zdHJ1Y3Rpb25zOiBbXG4gICAgICAgICAgICAgIGBZb3VyIEdpdEh1YiBDTEkgYXV0aGVudGljYXRpb24gaXMgbWlzc2luZyB0aGUgXCIke21pc3NpbmdTY29wZXMuam9pbignXCIgYW5kIFwiJyl9XCIgJHtwbHVyYWwobWlzc2luZ1Njb3Blcy5sZW5ndGgsICdzY29wZScpfSBuZWVkZWQgdG8gbWFuYWdlIEdpdEh1YiBBY3Rpb25zIGFuZCBzZWNyZXRzLmAsXG4gICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAnVG8gZml4IHRoaXMsIHJ1bjonLFxuICAgICAgICAgICAgICAnICBnaCBhdXRoIHJlZnJlc2ggLWggZ2l0aHViLmNvbSAtcyByZXBvLHdvcmtmbG93JyxcbiAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICdUaGlzIHdpbGwgYWRkIHRoZSBuZWNlc3NhcnkgcGVybWlzc2lvbnMgdG8gbWFuYWdlIHdvcmtmbG93cyBhbmQgc2VjcmV0cy4nLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9KSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGluIGEgZ2l0IHJlcG8gYW5kIGdldCByZW1vdGUgVVJMXG4gICAgY29uc3QgY3VycmVudFJlcG8gPSAoYXdhaXQgZ2V0R2l0aHViUmVwbygpKSA/PyAnJ1xuXG4gICAgbG9nRXZlbnQoJ3Rlbmd1X2luc3RhbGxfZ2l0aHViX2FwcF9zdGVwX2NvbXBsZXRlZCcsIHtcbiAgICAgIHN0ZXA6ICdjaGVjay1naCcgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICB9KVxuXG4gICAgc2V0U3RhdGUocHJldiA9PiAoe1xuICAgICAgLi4ucHJldixcbiAgICAgIHdhcm5pbmdzLFxuICAgICAgY3VycmVudFJlcG8sXG4gICAgICBzZWxlY3RlZFJlcG9OYW1lOiBjdXJyZW50UmVwbyxcbiAgICAgIHVzZUN1cnJlbnRSZXBvOiAhIWN1cnJlbnRSZXBvLCAvLyBTZXQgdG8gZmFsc2UgaWYgbm8gcmVwbyBkZXRlY3RlZFxuICAgICAgc3RlcDogd2FybmluZ3MubGVuZ3RoID4gMCA/ICd3YXJuaW5ncycgOiAnY2hvb3NlLXJlcG8nLFxuICAgIH0pKVxuICB9LCBbXSlcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChzdGF0ZS5zdGVwID09PSAnY2hlY2stZ2gnKSB7XG4gICAgICB2b2lkIGNoZWNrR2l0SHViQ0xJKClcbiAgICB9XG4gIH0sIFtzdGF0ZS5zdGVwLCBjaGVja0dpdEh1YkNMSV0pXG5cbiAgY29uc3QgcnVuU2V0dXBHaXRIdWJBY3Rpb25zID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKGFwaUtleU9yT0F1dGhUb2tlbjogc3RyaW5nIHwgbnVsbCwgc2VjcmV0TmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIHN0ZXA6ICdjcmVhdGluZycsXG4gICAgICAgIGN1cnJlbnRXb3JrZmxvd0luc3RhbGxTdGVwOiAwLFxuICAgICAgfSkpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNldHVwR2l0SHViQWN0aW9ucyhcbiAgICAgICAgICBzdGF0ZS5zZWxlY3RlZFJlcG9OYW1lLFxuICAgICAgICAgIGFwaUtleU9yT0F1dGhUb2tlbixcbiAgICAgICAgICBzZWNyZXROYW1lLFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICAgICAgY3VycmVudFdvcmtmbG93SW5zdGFsbFN0ZXA6IHByZXYuY3VycmVudFdvcmtmbG93SW5zdGFsbFN0ZXAgKyAxLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0ZS53b3JrZmxvd0FjdGlvbiA9PT0gJ3NraXAnLFxuICAgICAgICAgIHN0YXRlLnNlbGVjdGVkV29ya2Zsb3dzLFxuICAgICAgICAgIHN0YXRlLmF1dGhUeXBlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHVzZUN1cnJlbnRSZXBvOiBzdGF0ZS51c2VDdXJyZW50UmVwbyxcbiAgICAgICAgICAgIHdvcmtmbG93RXhpc3RzOiBzdGF0ZS53b3JrZmxvd0V4aXN0cyxcbiAgICAgICAgICAgIHNlY3JldEV4aXN0czogc3RhdGUuc2VjcmV0RXhpc3RzLFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICAgbG9nRXZlbnQoJ3Rlbmd1X2luc3RhbGxfZ2l0aHViX2FwcF9zdGVwX2NvbXBsZXRlZCcsIHtcbiAgICAgICAgICBzdGVwOiAnY3JlYXRpbmcnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgIH0pXG4gICAgICAgIHNldFN0YXRlKHByZXYgPT4gKHsgLi4ucHJldiwgc3RlcDogJ3N1Y2Nlc3MnIH0pKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID1cbiAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICA/IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgIDogJ0ZhaWxlZCB0byBzZXQgdXAgR2l0SHViIEFjdGlvbnMnXG5cbiAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5pbmNsdWRlcygnd29ya2Zsb3cgZmlsZSBhbHJlYWR5IGV4aXN0cycpKSB7XG4gICAgICAgICAgbG9nRXZlbnQoJ3Rlbmd1X2luc3RhbGxfZ2l0aHViX2FwcF9lcnJvcicsIHtcbiAgICAgICAgICAgIHJlYXNvbjpcbiAgICAgICAgICAgICAgJ3dvcmtmbG93X2ZpbGVfZXhpc3RzJyBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoe1xuICAgICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICAgIHN0ZXA6ICdlcnJvcicsXG4gICAgICAgICAgICBlcnJvcjogJ0EgQ2xhdWRlIHdvcmtmbG93IGZpbGUgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyByZXBvc2l0b3J5LicsXG4gICAgICAgICAgICBlcnJvclJlYXNvbjogJ1dvcmtmbG93IGZpbGUgY29uZmxpY3QnLFxuICAgICAgICAgICAgZXJyb3JJbnN0cnVjdGlvbnM6IFtcbiAgICAgICAgICAgICAgJ1RoZSBmaWxlIC5naXRodWIvd29ya2Zsb3dzL3VtbWF5YS55bWwgYWxyZWFkeSBleGlzdHMnLFxuICAgICAgICAgICAgICAnWW91IGNhbiBlaXRoZXI6JyxcbiAgICAgICAgICAgICAgJyAgMS4gRGVsZXRlIHRoZSBleGlzdGluZyBmaWxlIGFuZCBydW4gdGhpcyBjb21tYW5kIGFnYWluJyxcbiAgICAgICAgICAgICAgJyAgMi4gVXBkYXRlIHRoZSBleGlzdGluZyBmaWxlIG1hbnVhbGx5IHVzaW5nIHRoZSB0ZW1wbGF0ZSBmcm9tOicsXG4gICAgICAgICAgICAgIGAgICAgICR7R0lUSFVCX0FDVElPTl9TRVRVUF9ET0NTX1VSTH1gLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9KSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX2Vycm9yJywge1xuICAgICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgICAnc2V0dXBfZ2l0aHViX2FjdGlvbnNfZmFpbGVkJyBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgc3RlcDogJ2Vycm9yJyxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UsXG4gICAgICAgICAgICBlcnJvclJlYXNvbjogJ0dpdEh1YiBBY3Rpb25zIHNldHVwIGZhaWxlZCcsXG4gICAgICAgICAgICBlcnJvckluc3RydWN0aW9uczogW10sXG4gICAgICAgICAgfSkpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIHN0YXRlLnNlbGVjdGVkUmVwb05hbWUsXG4gICAgICBzdGF0ZS53b3JrZmxvd0FjdGlvbixcbiAgICAgIHN0YXRlLnNlbGVjdGVkV29ya2Zsb3dzLFxuICAgICAgc3RhdGUudXNlQ3VycmVudFJlcG8sXG4gICAgICBzdGF0ZS53b3JrZmxvd0V4aXN0cyxcbiAgICAgIHN0YXRlLnNlY3JldEV4aXN0cyxcbiAgICAgIHN0YXRlLmF1dGhUeXBlLFxuICAgIF0sXG4gIClcblxuICBhc3luYyBmdW5jdGlvbiBvcGVuR2l0SHViQXBwSW5zdGFsbGF0aW9uKCkge1xuICAgIGNvbnN0IGluc3RhbGxVcmwgPSAnaHR0cHM6Ly9naXRodWIuY29tL2FwcHMvY2xhdWRlJ1xuICAgIGF3YWl0IG9wZW5Ccm93c2VyKGluc3RhbGxVcmwpXG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjaGVja1JlcG9zaXRvcnlQZXJtaXNzaW9ucyhcbiAgICByZXBvTmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgaGFzQWNjZXNzOiBib29sZWFuOyBlcnJvcj86IHN0cmluZyB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWNGaWxlTm9UaHJvdygnZ2gnLCBbXG4gICAgICAgICdhcGknLFxuICAgICAgICBgcmVwb3MvJHtyZXBvTmFtZX1gLFxuICAgICAgICAnLS1qcScsXG4gICAgICAgICcucGVybWlzc2lvbnMuYWRtaW4nLFxuICAgICAgXSlcblxuICAgICAgaWYgKHJlc3VsdC5jb2RlID09PSAwKSB7XG4gICAgICAgIGNvbnN0IGhhc0FkbWluID0gcmVzdWx0LnN0ZG91dC50cmltKCkgPT09ICd0cnVlJ1xuICAgICAgICByZXR1cm4geyBoYXNBY2Nlc3M6IGhhc0FkbWluIH1cbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICByZXN1bHQuc3RkZXJyLmluY2x1ZGVzKCc0MDQnKSB8fFxuICAgICAgICByZXN1bHQuc3RkZXJyLmluY2x1ZGVzKCdOb3QgRm91bmQnKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaGFzQWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogJ3JlcG9zaXRvcnlfbm90X2ZvdW5kJyxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBoYXNBY2Nlc3M6IGZhbHNlIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7IGhhc0FjY2VzczogZmFsc2UgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNoZWNrRXhpc3RpbmdXb3JrZmxvd0ZpbGUocmVwb05hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNoZWNrRmlsZVJlc3VsdCA9IGF3YWl0IGV4ZWNGaWxlTm9UaHJvdygnZ2gnLCBbXG4gICAgICAnYXBpJyxcbiAgICAgIGByZXBvcy8ke3JlcG9OYW1lfS9jb250ZW50cy8uZ2l0aHViL3dvcmtmbG93cy91bW1heWEueW1sYCxcbiAgICAgICctLWpxJyxcbiAgICAgICcuc2hhJyxcbiAgICBdKVxuXG4gICAgcmV0dXJuIGNoZWNrRmlsZVJlc3VsdC5jb2RlID09PSAwXG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjaGVja0V4aXN0aW5nU2VjcmV0KCkge1xuICAgIGNvbnN0IGNoZWNrU2VjcmV0c1Jlc3VsdCA9IGF3YWl0IGV4ZWNGaWxlTm9UaHJvdygnZ2gnLCBbXG4gICAgICAnc2VjcmV0JyxcbiAgICAgICdsaXN0JyxcbiAgICAgICctLWFwcCcsXG4gICAgICAnYWN0aW9ucycsXG4gICAgICAnLS1yZXBvJyxcbiAgICAgIHN0YXRlLnNlbGVjdGVkUmVwb05hbWUsXG4gICAgXSlcblxuICAgIGlmIChjaGVja1NlY3JldHNSZXN1bHQuY29kZSA9PT0gMCkge1xuICAgICAgY29uc3QgbGluZXMgPSBjaGVja1NlY3JldHNSZXN1bHQuc3Rkb3V0LnNwbGl0KCdcXG4nKVxuICAgICAgY29uc3QgaGFzRnJpZW5kbGlLZXkgPSBzZWNyZXRMaXN0Q29udGFpbnMobGluZXMsIEZSSUVORExJX1BSSU1BUllfRU5WKVxuXG4gICAgICBpZiAoaGFzRnJpZW5kbGlLZXkpIHtcbiAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoe1xuICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgc2VjcmV0RXhpc3RzOiB0cnVlLFxuICAgICAgICAgIHN0ZXA6ICdjaGVjay1leGlzdGluZy1zZWNyZXQnLFxuICAgICAgICB9KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vIGV4aXN0aW5nIHNlY3JldCBmb3VuZFxuICAgICAgICBpZiAoZXhpc3RpbmdBcGlLZXkpIHtcbiAgICAgICAgICAvLyBVc2VyIGhhcyBsb2NhbCBrZXksIHNraXAgdG8gY3JlYXRpbmcgd2l0aCBpdFxuICAgICAgICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgICBhcGlLZXlPck9BdXRoVG9rZW46IGV4aXN0aW5nQXBpS2V5LFxuICAgICAgICAgICAgdXNlRXhpc3RpbmdLZXk6IHRydWUsXG4gICAgICAgICAgfSkpXG4gICAgICAgICAgYXdhaXQgcnVuU2V0dXBHaXRIdWJBY3Rpb25zKGV4aXN0aW5nQXBpS2V5LCBzdGF0ZS5zZWNyZXROYW1lKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIGxvY2FsIGtleSwgZ28gdG8gQVBJIGtleSBzdGVwXG4gICAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzdGVwOiAnYXBpLWtleScgfSkpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRXJyb3IgY2hlY2tpbmcgc2VjcmV0c1xuICAgICAgaWYgKGV4aXN0aW5nQXBpS2V5KSB7XG4gICAgICAgIC8vIFVzZXIgaGFzIGxvY2FsIGtleSwgc2tpcCB0byBjcmVhdGluZyB3aXRoIGl0XG4gICAgICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgIGFwaUtleU9yT0F1dGhUb2tlbjogZXhpc3RpbmdBcGlLZXksXG4gICAgICAgICAgdXNlRXhpc3RpbmdLZXk6IHRydWUsXG4gICAgICAgIH0pKVxuICAgICAgICBhd2FpdCBydW5TZXR1cEdpdEh1YkFjdGlvbnMoZXhpc3RpbmdBcGlLZXksIHN0YXRlLnNlY3JldE5hbWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBObyBsb2NhbCBrZXksIGdvIHRvIEFQSSBrZXkgc3RlcFxuICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7IC4uLnByZXYsIHN0ZXA6ICdhcGkta2V5JyB9KSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBoYW5kbGVTdWJtaXQgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKHN0YXRlLnN0ZXAgPT09ICd3YXJuaW5ncycpIHtcbiAgICAgIGxvZ0V2ZW50KCd0ZW5ndV9pbnN0YWxsX2dpdGh1Yl9hcHBfc3RlcF9jb21wbGV0ZWQnLCB7XG4gICAgICAgIHN0ZXA6ICd3YXJuaW5ncycgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgIH0pXG4gICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7IC4uLnByZXYsIHN0ZXA6ICdpbnN0YWxsLWFwcCcgfSkpXG4gICAgICBzZXRUaW1lb3V0KG9wZW5HaXRIdWJBcHBJbnN0YWxsYXRpb24sIDApXG4gICAgfSBlbHNlIGlmIChzdGF0ZS5zdGVwID09PSAnY2hvb3NlLXJlcG8nKSB7XG4gICAgICBsZXQgcmVwb05hbWUgPSBzdGF0ZS51c2VDdXJyZW50UmVwb1xuICAgICAgICA/IHN0YXRlLmN1cnJlbnRSZXBvXG4gICAgICAgIDogc3RhdGUuc2VsZWN0ZWRSZXBvTmFtZVxuXG4gICAgICBpZiAoIXJlcG9OYW1lLnRyaW0oKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVwb1dhcm5pbmdzOiBXYXJuaW5nW10gPSBbXVxuXG4gICAgICBpZiAocmVwb05hbWUuaW5jbHVkZXMoJ2dpdGh1Yi5jb20nKSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHJlcG9OYW1lLm1hdGNoKC9naXRodWJcXC5jb21bOi9dKFteL10rXFwvW14vXSspKFxcLmdpdCk/JC8pXG4gICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICByZXBvV2FybmluZ3MucHVzaCh7XG4gICAgICAgICAgICB0aXRsZTogJ0ludmFsaWQgR2l0SHViIFVSTCBmb3JtYXQnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ1RoZSByZXBvc2l0b3J5IFVSTCBmb3JtYXQgYXBwZWFycyB0byBiZSBpbnZhbGlkLicsXG4gICAgICAgICAgICBpbnN0cnVjdGlvbnM6IFtcbiAgICAgICAgICAgICAgJ1VzZSBmb3JtYXQ6IG93bmVyL3JlcG8gb3IgaHR0cHM6Ly9naXRodWIuY29tL293bmVyL3JlcG8nLFxuICAgICAgICAgICAgICAnRXhhbXBsZTogdW15dW5zYW5nL1VNTUFZQScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVwb05hbWUgPSBtYXRjaFsxXT8ucmVwbGFjZSgvXFwuZ2l0JC8sICcnKSB8fCAnJ1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghcmVwb05hbWUuaW5jbHVkZXMoJy8nKSkge1xuICAgICAgICByZXBvV2FybmluZ3MucHVzaCh7XG4gICAgICAgICAgdGl0bGU6ICdSZXBvc2l0b3J5IGZvcm1hdCB3YXJuaW5nJyxcbiAgICAgICAgICBtZXNzYWdlOiAnUmVwb3NpdG9yeSBzaG91bGQgYmUgaW4gZm9ybWF0IFwib3duZXIvcmVwb1wiJyxcbiAgICAgICAgICBpbnN0cnVjdGlvbnM6IFtcbiAgICAgICAgICAgICdVc2UgZm9ybWF0OiBvd25lci9yZXBvJyxcbiAgICAgICAgICAgICdFeGFtcGxlOiB1bXl1bnNhbmcvVU1NQVlBJyxcbiAgICAgICAgICBdLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwZXJtaXNzaW9uQ2hlY2sgPSBhd2FpdCBjaGVja1JlcG9zaXRvcnlQZXJtaXNzaW9ucyhyZXBvTmFtZSlcblxuICAgICAgaWYgKHBlcm1pc3Npb25DaGVjay5lcnJvciA9PT0gJ3JlcG9zaXRvcnlfbm90X2ZvdW5kJykge1xuICAgICAgICByZXBvV2FybmluZ3MucHVzaCh7XG4gICAgICAgICAgdGl0bGU6ICdSZXBvc2l0b3J5IG5vdCBmb3VuZCcsXG4gICAgICAgICAgbWVzc2FnZTogYFJlcG9zaXRvcnkgJHtyZXBvTmFtZX0gd2FzIG5vdCBmb3VuZCBvciB5b3UgZG9uJ3QgaGF2ZSBhY2Nlc3MuYCxcbiAgICAgICAgICBpbnN0cnVjdGlvbnM6IFtcbiAgICAgICAgICAgIGBDaGVjayB0aGF0IHRoZSByZXBvc2l0b3J5IG5hbWUgaXMgY29ycmVjdDogJHtyZXBvTmFtZX1gLFxuICAgICAgICAgICAgJ0Vuc3VyZSB5b3UgaGF2ZSBhY2Nlc3MgdG8gdGhpcyByZXBvc2l0b3J5JyxcbiAgICAgICAgICAgICdGb3IgcHJpdmF0ZSByZXBvc2l0b3JpZXMsIG1ha2Ugc3VyZSB5b3VyIEdpdEh1YiB0b2tlbiBoYXMgdGhlIFwicmVwb1wiIHNjb3BlJyxcbiAgICAgICAgICAgICdZb3UgY2FuIGFkZCB0aGUgcmVwbyBzY29wZSB3aXRoOiBnaCBhdXRoIHJlZnJlc2ggLWggZ2l0aHViLmNvbSAtcyByZXBvLHdvcmtmbG93JyxcbiAgICAgICAgICBdLFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmICghcGVybWlzc2lvbkNoZWNrLmhhc0FjY2Vzcykge1xuICAgICAgICByZXBvV2FybmluZ3MucHVzaCh7XG4gICAgICAgICAgdGl0bGU6ICdBZG1pbiBwZXJtaXNzaW9ucyByZXF1aXJlZCcsXG4gICAgICAgICAgbWVzc2FnZTogYFlvdSBtaWdodCBuZWVkIGFkbWluIHBlcm1pc3Npb25zIG9uICR7cmVwb05hbWV9IHRvIHNldCB1cCBHaXRIdWIgQWN0aW9ucy5gLFxuICAgICAgICAgIGluc3RydWN0aW9uczogW1xuICAgICAgICAgICAgJ1JlcG9zaXRvcnkgYWRtaW5zIGNhbiBpbnN0YWxsIEdpdEh1YiBBcHBzIGFuZCBzZXQgc2VjcmV0cycsXG4gICAgICAgICAgICAnQXNrIGEgcmVwb3NpdG9yeSBhZG1pbiB0byBydW4gdGhpcyBjb21tYW5kIGlmIHNldHVwIGZhaWxzJyxcbiAgICAgICAgICAgICdBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSB0aGUgbWFudWFsIHNldHVwIGluc3RydWN0aW9ucycsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd29ya2Zsb3dFeGlzdHMgPSBhd2FpdCBjaGVja0V4aXN0aW5nV29ya2Zsb3dGaWxlKHJlcG9OYW1lKVxuXG4gICAgICBpZiAocmVwb1dhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgYWxsV2FybmluZ3MgPSBbLi4uc3RhdGUud2FybmluZ3MsIC4uLnJlcG9XYXJuaW5nc11cbiAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoe1xuICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgc2VsZWN0ZWRSZXBvTmFtZTogcmVwb05hbWUsXG4gICAgICAgICAgd29ya2Zsb3dFeGlzdHMsXG4gICAgICAgICAgd2FybmluZ3M6IGFsbFdhcm5pbmdzLFxuICAgICAgICAgIHN0ZXA6ICd3YXJuaW5ncycsXG4gICAgICAgIH0pKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nRXZlbnQoJ3Rlbmd1X2luc3RhbGxfZ2l0aHViX2FwcF9zdGVwX2NvbXBsZXRlZCcsIHtcbiAgICAgICAgICBzdGVwOiAnY2hvb3NlLXJlcG8nIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgIH0pXG4gICAgICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgIHNlbGVjdGVkUmVwb05hbWU6IHJlcG9OYW1lLFxuICAgICAgICAgIHdvcmtmbG93RXhpc3RzLFxuICAgICAgICAgIHN0ZXA6ICdpbnN0YWxsLWFwcCcsXG4gICAgICAgIH0pKVxuICAgICAgICBzZXRUaW1lb3V0KG9wZW5HaXRIdWJBcHBJbnN0YWxsYXRpb24sIDApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5zdGVwID09PSAnaW5zdGFsbC1hcHAnKSB7XG4gICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgICBzdGVwOiAnaW5zdGFsbC1hcHAnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICB9KVxuICAgICAgaWYgKHN0YXRlLndvcmtmbG93RXhpc3RzKSB7XG4gICAgICAgIHNldFN0YXRlKHByZXYgPT4gKHsgLi4ucHJldiwgc3RlcDogJ2NoZWNrLWV4aXN0aW5nLXdvcmtmbG93JyB9KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFN0YXRlKHByZXYgPT4gKHsgLi4ucHJldiwgc3RlcDogJ3NlbGVjdC13b3JrZmxvd3MnIH0pKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc3RhdGUuc3RlcCA9PT0gJ2NoZWNrLWV4aXN0aW5nLXdvcmtmbG93Jykge1xuICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIGlmIChzdGF0ZS5zdGVwID09PSAnc2VsZWN0LXdvcmtmbG93cycpIHtcbiAgICAgIC8vIEhhbmRsZWQgYnkgdGhlIFdvcmtmbG93TXVsdGlzZWxlY3REaWFsb2cgY29tcG9uZW50XG4gICAgICByZXR1cm5cbiAgICB9IGVsc2UgaWYgKHN0YXRlLnN0ZXAgPT09ICdjaGVjay1leGlzdGluZy1zZWNyZXQnKSB7XG4gICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgICBzdGVwOiAnY2hlY2stZXhpc3Rpbmctc2VjcmV0JyBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgICAgfSlcbiAgICAgIGlmIChzdGF0ZS51c2VFeGlzdGluZ1NlY3JldCkge1xuICAgICAgICBhd2FpdCBydW5TZXR1cEdpdEh1YkFjdGlvbnMobnVsbCwgc3RhdGUuc2VjcmV0TmFtZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVzZXIgd2FudHMgdG8gdXNlIGEgbmV3IHNlY3JldCBuYW1lIHdpdGggdGhlaXIgQVBJIGtleVxuICAgICAgICBhd2FpdCBydW5TZXR1cEdpdEh1YkFjdGlvbnMoc3RhdGUuYXBpS2V5T3JPQXV0aFRva2VuLCBzdGF0ZS5zZWNyZXROYW1lKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc3RhdGUuc3RlcCA9PT0gJ2FwaS1rZXknKSB7XG4gICAgICAvLyBJbiB0aGUgbmV3IGZsb3csIGFwaS1rZXkgc3RlcCBvbmx5IGFwcGVhcnMgd2hlbiB1c2VyIGhhcyBubyBleGlzdGluZyBrZXlcbiAgICAgIC8vIFRoZXkgZWl0aGVyIGVudGVyZWQgYSBuZXcga2V5IG9yIHdpbGwgY3JlYXRlIE9BdXRoIHRva2VuXG4gICAgICBpZiAoc3RhdGUuc2VsZWN0ZWRBcGlLZXlPcHRpb24gPT09ICdvYXV0aCcpIHtcbiAgICAgICAgLy8gT0F1dGggZmxvdyBhbHJlYWR5IGhhbmRsZWQgYnkgaGFuZGxlQ3JlYXRlT0F1dGhUb2tlblxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gSWYgdXNlciBzZWxlY3RlZCAnZXhpc3RpbmcnIG9wdGlvbiwgdXNlIHRoZSBleGlzdGluZyBBUEkga2V5XG4gICAgICBjb25zdCBhcGlLZXlUb1VzZSA9XG4gICAgICAgIHN0YXRlLnNlbGVjdGVkQXBpS2V5T3B0aW9uID09PSAnZXhpc3RpbmcnXG4gICAgICAgICAgPyBleGlzdGluZ0FwaUtleVxuICAgICAgICAgIDogc3RhdGUuYXBpS2V5T3JPQXV0aFRva2VuXG5cbiAgICAgIGlmICghYXBpS2V5VG9Vc2UpIHtcbiAgICAgICAgbG9nRXZlbnQoJ3Rlbmd1X2luc3RhbGxfZ2l0aHViX2FwcF9lcnJvcicsIHtcbiAgICAgICAgICByZWFzb246XG4gICAgICAgICAgICAnYXBpX2tleV9taXNzaW5nJyBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgICAgICB9KVxuICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICBzdGVwOiAnZXJyb3InLFxuICAgICAgICAgIGVycm9yOiAnQVBJIGtleSBpcyByZXF1aXJlZCcsXG4gICAgICAgIH0pKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gU3RvcmUgdGhlIEFQSSBrZXkgYmVpbmcgdXNlZCAoZWl0aGVyIGV4aXN0aW5nIG9yIG5ld2x5IGVudGVyZWQpXG4gICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIGFwaUtleU9yT0F1dGhUb2tlbjogYXBpS2V5VG9Vc2UsXG4gICAgICAgIHVzZUV4aXN0aW5nS2V5OiBzdGF0ZS5zZWxlY3RlZEFwaUtleU9wdGlvbiA9PT0gJ2V4aXN0aW5nJyxcbiAgICAgIH0pKVxuXG4gICAgICBjb25zdCBjaGVja1NlY3JldHNSZXN1bHQgPSBhd2FpdCBleGVjRmlsZU5vVGhyb3coJ2doJywgW1xuICAgICAgICAnc2VjcmV0JyxcbiAgICAgICAgJ2xpc3QnLFxuICAgICAgICAnLS1hcHAnLFxuICAgICAgICAnYWN0aW9ucycsXG4gICAgICAgICctLXJlcG8nLFxuICAgICAgICBzdGF0ZS5zZWxlY3RlZFJlcG9OYW1lLFxuICAgICAgXSlcblxuICAgICAgaWYgKGNoZWNrU2VjcmV0c1Jlc3VsdC5jb2RlID09PSAwKSB7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gY2hlY2tTZWNyZXRzUmVzdWx0LnN0ZG91dC5zcGxpdCgnXFxuJylcbiAgICAgICAgY29uc3QgaGFzRnJpZW5kbGlLZXkgPSBzZWNyZXRMaXN0Q29udGFpbnMobGluZXMsIEZSSUVORExJX1BSSU1BUllfRU5WKVxuXG4gICAgICAgIGlmIChoYXNGcmllbmRsaUtleSkge1xuICAgICAgICAgIGxvZ0V2ZW50KCd0ZW5ndV9pbnN0YWxsX2dpdGh1Yl9hcHBfc3RlcF9jb21wbGV0ZWQnLCB7XG4gICAgICAgICAgICBzdGVwOiAnYXBpLWtleScgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgICBzZWNyZXRFeGlzdHM6IHRydWUsXG4gICAgICAgICAgICBzdGVwOiAnY2hlY2stZXhpc3Rpbmctc2VjcmV0JyxcbiAgICAgICAgICB9KSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgICAgICAgc3RlcDogJ2FwaS1rZXknIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAvLyBObyBleGlzdGluZyBzZWNyZXQsIHByb2NlZWQgdG8gY3JlYXRpbmdcbiAgICAgICAgICBhd2FpdCBydW5TZXR1cEdpdEh1YkFjdGlvbnMoYXBpS2V5VG9Vc2UsIHN0YXRlLnNlY3JldE5hbWUpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ0V2ZW50KCd0ZW5ndV9pbnN0YWxsX2dpdGh1Yl9hcHBfc3RlcF9jb21wbGV0ZWQnLCB7XG4gICAgICAgICAgc3RlcDogJ2FwaS1rZXknIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgIH0pXG4gICAgICAgIC8vIEVycm9yIGNoZWNraW5nIHNlY3JldHMsIHByb2NlZWQgYW55d2F5XG4gICAgICAgIGF3YWl0IHJ1blNldHVwR2l0SHViQWN0aW9ucyhhcGlLZXlUb1VzZSwgc3RhdGUuc2VjcmV0TmFtZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBoYW5kbGVSZXBvVXJsQ2hhbmdlID0gKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICBzZXRTdGF0ZShwcmV2ID0+ICh7IC4uLnByZXYsIHNlbGVjdGVkUmVwb05hbWU6IHZhbHVlIH0pKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQXBpS2V5Q2hhbmdlID0gKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICBzZXRTdGF0ZShwcmV2ID0+ICh7IC4uLnByZXYsIGFwaUtleU9yT0F1dGhUb2tlbjogdmFsdWUgfSkpXG4gIH1cblxuICBjb25zdCBoYW5kbGVBcGlLZXlPcHRpb25DaGFuZ2UgPSAob3B0aW9uOiAnZXhpc3RpbmcnIHwgJ25ldycgfCAnb2F1dGgnKSA9PiB7XG4gICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzZWxlY3RlZEFwaUtleU9wdGlvbjogb3B0aW9uIH0pKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQ3JlYXRlT0F1dGhUb2tlbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgc3RlcDogJ2FwaS1rZXknIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgfSlcbiAgICBzZXRTdGF0ZShwcmV2ID0+ICh7IC4uLnByZXYsIHN0ZXA6ICdvYXV0aC1mbG93JyB9KSlcbiAgfSwgW10pXG5cbiAgY29uc3QgaGFuZGxlT0F1dGhTdWNjZXNzID0gdXNlQ2FsbGJhY2soXG4gICAgKHRva2VuOiBzdHJpbmcpID0+IHtcbiAgICAgIGxvZ0V2ZW50KCd0ZW5ndV9pbnN0YWxsX2dpdGh1Yl9hcHBfc3RlcF9jb21wbGV0ZWQnLCB7XG4gICAgICAgIHN0ZXA6ICdvYXV0aC1mbG93JyBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgICAgfSlcbiAgICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgYXBpS2V5T3JPQXV0aFRva2VuOiB0b2tlbixcbiAgICAgICAgdXNlRXhpc3RpbmdLZXk6IGZhbHNlLFxuICAgICAgICBzZWNyZXROYW1lOiBGUklFTkRMSV9QUklNQVJZX0VOVixcbiAgICAgICAgYXV0aFR5cGU6ICdhcGlfa2V5JyxcbiAgICAgIH0pKVxuICAgICAgdm9pZCBydW5TZXR1cEdpdEh1YkFjdGlvbnModG9rZW4sIEZSSUVORExJX1BSSU1BUllfRU5WKVxuICAgIH0sXG4gICAgW3J1blNldHVwR2l0SHViQWN0aW9uc10sXG4gIClcblxuICBjb25zdCBoYW5kbGVPQXV0aENhbmNlbCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRTdGF0ZShwcmV2ID0+ICh7IC4uLnByZXYsIHN0ZXA6ICdhcGkta2V5JyB9KSlcbiAgfSwgW10pXG5cbiAgY29uc3QgaGFuZGxlU2VjcmV0TmFtZUNoYW5nZSA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKHZhbHVlICYmICEvXlthLXpBLVowLTlfXSskLy50ZXN0KHZhbHVlKSkgcmV0dXJuXG4gICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzZWNyZXROYW1lOiB2YWx1ZSB9KSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVRvZ2dsZVVzZUN1cnJlbnRSZXBvID0gKHVzZUN1cnJlbnRSZXBvOiBib29sZWFuKSA9PiB7XG4gICAgc2V0U3RhdGUocHJldiA9PiAoe1xuICAgICAgLi4ucHJldixcbiAgICAgIHVzZUN1cnJlbnRSZXBvLFxuICAgICAgc2VsZWN0ZWRSZXBvTmFtZTogdXNlQ3VycmVudFJlcG8gPyBwcmV2LmN1cnJlbnRSZXBvIDogJycsXG4gICAgfSkpXG4gIH1cblxuICBjb25zdCBoYW5kbGVUb2dnbGVVc2VFeGlzdGluZ0tleSA9ICh1c2VFeGlzdGluZ0tleTogYm9vbGVhbikgPT4ge1xuICAgIHNldFN0YXRlKHByZXYgPT4gKHsgLi4ucHJldiwgdXNlRXhpc3RpbmdLZXkgfSkpXG4gIH1cblxuICBjb25zdCBoYW5kbGVUb2dnbGVVc2VFeGlzdGluZ1NlY3JldCA9ICh1c2VFeGlzdGluZ1NlY3JldDogYm9vbGVhbikgPT4ge1xuICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgIC4uLnByZXYsXG4gICAgICB1c2VFeGlzdGluZ1NlY3JldCxcbiAgICAgIHNlY3JldE5hbWU6IHVzZUV4aXN0aW5nU2VjcmV0ID8gRlJJRU5ETElfUFJJTUFSWV9FTlYgOiAnJyxcbiAgICB9KSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVdvcmtmbG93QWN0aW9uID0gYXN5bmMgKGFjdGlvbjogJ3VwZGF0ZScgfCAnc2tpcCcgfCAnZXhpdCcpID0+IHtcbiAgICBpZiAoYWN0aW9uID09PSAnZXhpdCcpIHtcbiAgICAgIHByb3BzLm9uRG9uZSgnSW5zdGFsbGF0aW9uIGNhbmNlbGxlZCBieSB1c2VyJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxvZ0V2ZW50KCd0ZW5ndV9pbnN0YWxsX2dpdGh1Yl9hcHBfc3RlcF9jb21wbGV0ZWQnLCB7XG4gICAgICBzdGVwOiAnY2hlY2stZXhpc3Rpbmctd29ya2Zsb3cnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgfSlcblxuICAgIHNldFN0YXRlKHByZXYgPT4gKHsgLi4ucHJldiwgd29ya2Zsb3dBY3Rpb246IGFjdGlvbiB9KSlcblxuICAgIGlmIChhY3Rpb24gPT09ICdza2lwJyB8fCBhY3Rpb24gPT09ICd1cGRhdGUnKSB7XG4gICAgICAvLyBDaGVjayBpZiB1c2VyIGhhcyBleGlzdGluZyBsb2NhbCBBUEkga2V5XG4gICAgICBpZiAoZXhpc3RpbmdBcGlLZXkpIHtcbiAgICAgICAgYXdhaXQgY2hlY2tFeGlzdGluZ1NlY3JldCgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBObyBsb2NhbCBrZXksIGdvIHN0cmFpZ2h0IHRvIEFQSSBrZXkgc3RlcFxuICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7IC4uLnByZXYsIHN0ZXA6ICdhcGkta2V5JyB9KSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVEaXNtaXNzS2V5RG93bihlOiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgaWYgKHN0YXRlLnN0ZXAgPT09ICdzdWNjZXNzJykge1xuICAgICAgbG9nRXZlbnQoJ3Rlbmd1X2luc3RhbGxfZ2l0aHViX2FwcF9jb21wbGV0ZWQnLCB7fSlcbiAgICB9XG4gICAgcHJvcHMub25Eb25lKFxuICAgICAgc3RhdGUuc3RlcCA9PT0gJ3N1Y2Nlc3MnXG4gICAgICAgID8gJ0dpdEh1YiBBY3Rpb25zIHNldHVwIGNvbXBsZXRlISdcbiAgICAgICAgOiBzdGF0ZS5lcnJvclxuICAgICAgICAgID8gYENvdWxkbid0IGluc3RhbGwgR2l0SHViIEFwcDogJHtzdGF0ZS5lcnJvcn1cXG5Gb3IgbWFudWFsIHNldHVwIGluc3RydWN0aW9ucywgc2VlOiAke0dJVEhVQl9BQ1RJT05fU0VUVVBfRE9DU19VUkx9YFxuICAgICAgICAgIDogYEdpdEh1YiBBcHAgaW5zdGFsbGF0aW9uIGZhaWxlZFxcbkZvciBtYW51YWwgc2V0dXAgaW5zdHJ1Y3Rpb25zLCBzZWU6ICR7R0lUSFVCX0FDVElPTl9TRVRVUF9ET0NTX1VSTH1gLFxuICAgIClcbiAgfVxuXG4gIHN3aXRjaCAoc3RhdGUuc3RlcCkge1xuICAgIGNhc2UgJ2NoZWNrLWdoJzpcbiAgICAgIHJldHVybiA8Q2hlY2tHaXRIdWJTdGVwIC8+XG4gICAgY2FzZSAnd2FybmluZ3MnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFdhcm5pbmdzU3RlcCB3YXJuaW5ncz17c3RhdGUud2FybmluZ3N9IG9uQ29udGludWU9e2hhbmRsZVN1Ym1pdH0gLz5cbiAgICAgIClcbiAgICBjYXNlICdjaG9vc2UtcmVwbyc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8Q2hvb3NlUmVwb1N0ZXBcbiAgICAgICAgICBjdXJyZW50UmVwbz17c3RhdGUuY3VycmVudFJlcG99XG4gICAgICAgICAgdXNlQ3VycmVudFJlcG89e3N0YXRlLnVzZUN1cnJlbnRSZXBvfVxuICAgICAgICAgIHJlcG9Vcmw9e3N0YXRlLnNlbGVjdGVkUmVwb05hbWV9XG4gICAgICAgICAgb25SZXBvVXJsQ2hhbmdlPXtoYW5kbGVSZXBvVXJsQ2hhbmdlfVxuICAgICAgICAgIG9uVG9nZ2xlVXNlQ3VycmVudFJlcG89e2hhbmRsZVRvZ2dsZVVzZUN1cnJlbnRSZXBvfVxuICAgICAgICAgIG9uU3VibWl0PXtoYW5kbGVTdWJtaXR9XG4gICAgICAgIC8+XG4gICAgICApXG4gICAgY2FzZSAnaW5zdGFsbC1hcHAnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPEluc3RhbGxBcHBTdGVwXG4gICAgICAgICAgcmVwb1VybD17c3RhdGUuc2VsZWN0ZWRSZXBvTmFtZX1cbiAgICAgICAgICBvblN1Ym1pdD17aGFuZGxlU3VibWl0fVxuICAgICAgICAvPlxuICAgICAgKVxuICAgIGNhc2UgJ2NoZWNrLWV4aXN0aW5nLXdvcmtmbG93JzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxFeGlzdGluZ1dvcmtmbG93U3RlcFxuICAgICAgICAgIHJlcG9OYW1lPXtzdGF0ZS5zZWxlY3RlZFJlcG9OYW1lfVxuICAgICAgICAgIG9uU2VsZWN0QWN0aW9uPXtoYW5kbGVXb3JrZmxvd0FjdGlvbn1cbiAgICAgICAgLz5cbiAgICAgIClcbiAgICBjYXNlICdjaGVjay1leGlzdGluZy1zZWNyZXQnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPENoZWNrRXhpc3RpbmdTZWNyZXRTdGVwXG4gICAgICAgICAgdXNlRXhpc3RpbmdTZWNyZXQ9e3N0YXRlLnVzZUV4aXN0aW5nU2VjcmV0fVxuICAgICAgICAgIHNlY3JldE5hbWU9e3N0YXRlLnNlY3JldE5hbWV9XG4gICAgICAgICAgb25Ub2dnbGVVc2VFeGlzdGluZ1NlY3JldD17aGFuZGxlVG9nZ2xlVXNlRXhpc3RpbmdTZWNyZXR9XG4gICAgICAgICAgb25TZWNyZXROYW1lQ2hhbmdlPXtoYW5kbGVTZWNyZXROYW1lQ2hhbmdlfVxuICAgICAgICAgIG9uU3VibWl0PXtoYW5kbGVTdWJtaXR9XG4gICAgICAgIC8+XG4gICAgICApXG4gICAgY2FzZSAnYXBpLWtleSc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8QXBpS2V5U3RlcFxuICAgICAgICAgIGV4aXN0aW5nQXBpS2V5PXtleGlzdGluZ0FwaUtleX1cbiAgICAgICAgICB1c2VFeGlzdGluZ0tleT17c3RhdGUudXNlRXhpc3RpbmdLZXl9XG4gICAgICAgICAgYXBpS2V5T3JPQXV0aFRva2VuPXtzdGF0ZS5hcGlLZXlPck9BdXRoVG9rZW59XG4gICAgICAgICAgb25BcGlLZXlDaGFuZ2U9e2hhbmRsZUFwaUtleUNoYW5nZX1cbiAgICAgICAgICBvblRvZ2dsZVVzZUV4aXN0aW5nS2V5PXtoYW5kbGVUb2dnbGVVc2VFeGlzdGluZ0tleX1cbiAgICAgICAgICBvblN1Ym1pdD17aGFuZGxlU3VibWl0fVxuICAgICAgICAgIG9uQ3JlYXRlT0F1dGhUb2tlbj17XG4gICAgICAgICAgICBpc0FudGhyb3BpY0F1dGhFbmFibGVkKCkgPyBoYW5kbGVDcmVhdGVPQXV0aFRva2VuIDogdW5kZWZpbmVkXG4gICAgICAgICAgfVxuICAgICAgICAgIHNlbGVjdGVkT3B0aW9uPXtzdGF0ZS5zZWxlY3RlZEFwaUtleU9wdGlvbn1cbiAgICAgICAgICBvblNlbGVjdE9wdGlvbj17aGFuZGxlQXBpS2V5T3B0aW9uQ2hhbmdlfVxuICAgICAgICAvPlxuICAgICAgKVxuICAgIGNhc2UgJ2NyZWF0aW5nJzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxDcmVhdGluZ1N0ZXBcbiAgICAgICAgICBjdXJyZW50V29ya2Zsb3dJbnN0YWxsU3RlcD17c3RhdGUuY3VycmVudFdvcmtmbG93SW5zdGFsbFN0ZXB9XG4gICAgICAgICAgc2VjcmV0RXhpc3RzPXtzdGF0ZS5zZWNyZXRFeGlzdHN9XG4gICAgICAgICAgdXNlRXhpc3RpbmdTZWNyZXQ9e3N0YXRlLnVzZUV4aXN0aW5nU2VjcmV0fVxuICAgICAgICAgIHNlY3JldE5hbWU9e3N0YXRlLnNlY3JldE5hbWV9XG4gICAgICAgICAgc2tpcFdvcmtmbG93PXtzdGF0ZS53b3JrZmxvd0FjdGlvbiA9PT0gJ3NraXAnfVxuICAgICAgICAgIHNlbGVjdGVkV29ya2Zsb3dzPXtzdGF0ZS5zZWxlY3RlZFdvcmtmbG93c31cbiAgICAgICAgLz5cbiAgICAgIClcbiAgICBjYXNlICdzdWNjZXNzJzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxCb3ggdGFiSW5kZXg9ezB9IGF1dG9Gb2N1cyBvbktleURvd249e2hhbmRsZURpc21pc3NLZXlEb3dufT5cbiAgICAgICAgICA8U3VjY2Vzc1N0ZXBcbiAgICAgICAgICAgIHNlY3JldEV4aXN0cz17c3RhdGUuc2VjcmV0RXhpc3RzfVxuICAgICAgICAgICAgdXNlRXhpc3RpbmdTZWNyZXQ9e3N0YXRlLnVzZUV4aXN0aW5nU2VjcmV0fVxuICAgICAgICAgICAgc2VjcmV0TmFtZT17c3RhdGUuc2VjcmV0TmFtZX1cbiAgICAgICAgICAgIHNraXBXb3JrZmxvdz17c3RhdGUud29ya2Zsb3dBY3Rpb24gPT09ICdza2lwJ31cbiAgICAgICAgICAvPlxuICAgICAgICA8L0JveD5cbiAgICAgIClcbiAgICBjYXNlICdlcnJvcic6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8Qm94IHRhYkluZGV4PXswfSBhdXRvRm9jdXMgb25LZXlEb3duPXtoYW5kbGVEaXNtaXNzS2V5RG93bn0+XG4gICAgICAgICAgPEVycm9yU3RlcFxuICAgICAgICAgICAgZXJyb3I9e3N0YXRlLmVycm9yfVxuICAgICAgICAgICAgZXJyb3JSZWFzb249e3N0YXRlLmVycm9yUmVhc29ufVxuICAgICAgICAgICAgZXJyb3JJbnN0cnVjdGlvbnM9e3N0YXRlLmVycm9ySW5zdHJ1Y3Rpb25zfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvQm94PlxuICAgICAgKVxuICAgIGNhc2UgJ3NlbGVjdC13b3JrZmxvd3MnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFdvcmtmbG93TXVsdGlzZWxlY3REaWFsb2dcbiAgICAgICAgICBkZWZhdWx0U2VsZWN0aW9ucz17c3RhdGUuc2VsZWN0ZWRXb3JrZmxvd3N9XG4gICAgICAgICAgb25TdWJtaXQ9e3NlbGVjdGVkV29ya2Zsb3dzID0+IHtcbiAgICAgICAgICAgIGxvZ0V2ZW50KCd0ZW5ndV9pbnN0YWxsX2dpdGh1Yl9hcHBfc3RlcF9jb21wbGV0ZWQnLCB7XG4gICAgICAgICAgICAgIHN0ZXA6ICdzZWxlY3Qtd29ya2Zsb3dzJyBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICAgICAgc2VsZWN0ZWRXb3JrZmxvd3MsXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHVzZXIgaGFzIGV4aXN0aW5nIGxvY2FsIEFQSSBrZXlcbiAgICAgICAgICAgIGlmIChleGlzdGluZ0FwaUtleSkge1xuICAgICAgICAgICAgICB2b2lkIGNoZWNrRXhpc3RpbmdTZWNyZXQoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTm8gbG9jYWwga2V5LCBnbyBzdHJhaWdodCB0byBBUEkga2V5IHN0ZXBcbiAgICAgICAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzdGVwOiAnYXBpLWtleScgfSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfX1cbiAgICAgICAgLz5cbiAgICAgIClcbiAgICBjYXNlICdvYXV0aC1mbG93JzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxPQXV0aEZsb3dTdGVwXG4gICAgICAgICAgb25TdWNjZXNzPXtoYW5kbGVPQXV0aFN1Y2Nlc3N9XG4gICAgICAgICAgb25DYW5jZWw9e2hhbmRsZU9BdXRoQ2FuY2VsfVxuICAgICAgICAvPlxuICAgICAgKVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYWxsKFxuICBvbkRvbmU6IExvY2FsSlNYQ29tbWFuZE9uRG9uZSxcbik6IFByb21pc2U8UmVhY3QuUmVhY3ROb2RlPiB7XG4gIHJldHVybiA8SW5zdGFsbEdpdEh1YkFwcCBvbkRvbmU9e29uRG9uZX0gLz5cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsS0FBSyxRQUFRLE9BQU87QUFDN0IsT0FBT0MsS0FBSyxJQUFJQyxXQUFXLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBQ3BELFNBQ0UsS0FBS0MsMERBQTBELEVBQy9EQyxRQUFRLFFBQ0gsaUNBQWlDO0FBQ3hDLFNBQVNDLHlCQUF5QixRQUFRLCtDQUErQztBQUN6RixTQUFTQyw0QkFBNEIsUUFBUSwrQkFBK0I7QUFDNUUsU0FBU0MsOEJBQThCLFFBQVEsK0NBQStDO0FBQzlGLGNBQWNDLGFBQWEsUUFBUSxvQ0FBb0M7QUFDdkUsU0FBU0MsR0FBRyxRQUFRLGNBQWM7QUFDbEMsY0FBY0MscUJBQXFCLFFBQVEsd0JBQXdCO0FBQ25FLFNBQVNDLGtCQUFrQixFQUFFQyxzQkFBc0IsUUFBUSxxQkFBcUI7QUFDaEYsU0FBU0MsV0FBVyxRQUFRLHdC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
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
PR_TITLE,
|
|
10
10
|
WORKFLOW_CONTENT,
|
|
11
11
|
} from '../../constants/github-app.js'
|
|
12
|
+
import { FRIENDLI_PRIMARY_ENV } from '../../utils/auth.js'
|
|
12
13
|
import { openBrowser } from '../../utils/browser.js'
|
|
13
14
|
import { execFileNoThrow } from '../../utils/execFileNoThrow.js'
|
|
14
15
|
import { logError } from '../../utils/log.js'
|
|
@@ -41,17 +42,10 @@ async function createWorkflowFile(
|
|
|
41
42
|
}
|
|
42
43
|
|
|
43
44
|
let content = workflowContent
|
|
44
|
-
if (secretName
|
|
45
|
-
// For OAuth tokens, use the claude_code_oauth_token parameter
|
|
45
|
+
if (secretName !== FRIENDLI_PRIMARY_ENV) {
|
|
46
46
|
content = workflowContent.replace(
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
)
|
|
50
|
-
} else if (secretName !== 'ANTHROPIC_API_KEY') {
|
|
51
|
-
// For other custom secret names, keep using anthropic_api_key parameter
|
|
52
|
-
content = workflowContent.replace(
|
|
53
|
-
/anthropic_api_key: \$\{\{ secrets\.ANTHROPIC_API_KEY \}\}/g,
|
|
54
|
-
`anthropic_api_key: \${{ secrets.${secretName} }}`,
|
|
47
|
+
/\$\{\{ secrets\.UMMAYA_FRIENDLI_TOKEN \}\}/g,
|
|
48
|
+
`\${{ secrets.${secretName} }}`,
|
|
55
49
|
)
|
|
56
50
|
}
|
|
57
51
|
const base64Content = Buffer.from(content).toString('base64')
|
|
@@ -101,7 +95,7 @@ async function createWorkflowFile(
|
|
|
101
95
|
'\n\nNeed help? Common issues:\n' +
|
|
102
96
|
'· Permission denied → Run: gh auth refresh -h github.com -s repo,workflow\n' +
|
|
103
97
|
'· Not authorized → Ensure you have admin access to the repository\n' +
|
|
104
|
-
'· For manual setup → Visit: https://
|
|
98
|
+
'· For manual setup → Visit: https://ummaya-docs.pages.dev/en/'
|
|
105
99
|
|
|
106
100
|
throw new Error(
|
|
107
101
|
`Failed to create workflow file ${workflowPath}: ${createFileResult.stderr}${helpText}`,
|
|
@@ -127,10 +121,10 @@ export async function setupGitHubActions(
|
|
|
127
121
|
logEvent('tengu_setup_github_actions_started', {
|
|
128
122
|
skip_workflow: skipWorkflow,
|
|
129
123
|
has_api_key: !!apiKeyOrOAuthToken,
|
|
130
|
-
using_default_secret_name: secretName ===
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
selectedWorkflows.includes('
|
|
124
|
+
using_default_secret_name: secretName === FRIENDLI_PRIMARY_ENV,
|
|
125
|
+
selected_ummaya_workflow: selectedWorkflows.includes('ummaya'),
|
|
126
|
+
selected_ummaya_review_workflow:
|
|
127
|
+
selectedWorkflows.includes('ummaya-review'),
|
|
134
128
|
...context,
|
|
135
129
|
})
|
|
136
130
|
|
|
@@ -196,7 +190,7 @@ export async function setupGitHubActions(
|
|
|
196
190
|
if (!skipWorkflow) {
|
|
197
191
|
updateProgress()
|
|
198
192
|
// Create new branch
|
|
199
|
-
branchName = `add-
|
|
193
|
+
branchName = `add-ummaya-github-actions-${Date.now()}`
|
|
200
194
|
const createBranchResult = await execFileNoThrow('gh', [
|
|
201
195
|
'api',
|
|
202
196
|
'--method',
|
|
@@ -221,19 +215,19 @@ export async function setupGitHubActions(
|
|
|
221
215
|
// Create selected workflow files
|
|
222
216
|
const workflows = []
|
|
223
217
|
|
|
224
|
-
if (selectedWorkflows.includes('
|
|
218
|
+
if (selectedWorkflows.includes('ummaya')) {
|
|
225
219
|
workflows.push({
|
|
226
|
-
path: '.github/workflows/
|
|
220
|
+
path: '.github/workflows/ummaya.yml',
|
|
227
221
|
content: WORKFLOW_CONTENT,
|
|
228
|
-
message: 'UMMAYA
|
|
222
|
+
message: 'UMMAYA runtime smoke workflow',
|
|
229
223
|
})
|
|
230
224
|
}
|
|
231
225
|
|
|
232
|
-
if (selectedWorkflows.includes('
|
|
226
|
+
if (selectedWorkflows.includes('ummaya-review')) {
|
|
233
227
|
workflows.push({
|
|
234
|
-
path: '.github/workflows/
|
|
228
|
+
path: '.github/workflows/ummaya-review.yml',
|
|
235
229
|
content: CODE_REVIEW_PLUGIN_WORKFLOW_CONTENT,
|
|
236
|
-
message: 'UMMAYA
|
|
230
|
+
message: 'UMMAYA review smoke workflow',
|
|
237
231
|
})
|
|
238
232
|
}
|
|
239
233
|
|
|
@@ -274,7 +268,7 @@ export async function setupGitHubActions(
|
|
|
274
268
|
'\n\nNeed help? Common issues:\n' +
|
|
275
269
|
'· Permission denied → Run: gh auth refresh -h github.com -s repo\n' +
|
|
276
270
|
'· Not authorized → Ensure you have admin access to the repository\n' +
|
|
277
|
-
'· For manual setup → Visit: https://
|
|
271
|
+
'· For manual setup → Visit: https://ummaya-docs.pages.dev/en/'
|
|
278
272
|
|
|
279
273
|
throw new Error(
|
|
280
274
|
`Failed to set API key secret: ${setSecretResult.stderr || 'Unknown error'}${helpText}`,
|
|
@@ -295,10 +289,10 @@ export async function setupGitHubActions(
|
|
|
295
289
|
has_api_key: !!apiKeyOrOAuthToken,
|
|
296
290
|
auth_type:
|
|
297
291
|
authType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
298
|
-
using_default_secret_name: secretName ===
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
selectedWorkflows.includes('
|
|
292
|
+
using_default_secret_name: secretName === FRIENDLI_PRIMARY_ENV,
|
|
293
|
+
selected_ummaya_workflow: selectedWorkflows.includes('ummaya'),
|
|
294
|
+
selected_ummaya_review_workflow:
|
|
295
|
+
selectedWorkflows.includes('ummaya-review'),
|
|
302
296
|
...context,
|
|
303
297
|
})
|
|
304
298
|
saveGlobalConfig(current => ({
|
|
@@ -3,7 +3,7 @@ import { logEvent } from '../../services/analytics/index.js'
|
|
|
3
3
|
import { openBrowser } from '../../utils/browser.js'
|
|
4
4
|
import { saveGlobalConfig } from '../../utils/config.js'
|
|
5
5
|
|
|
6
|
-
const SLACK_APP_URL = 'https://
|
|
6
|
+
const SLACK_APP_URL = 'https://ummaya-docs.pages.dev/en/'
|
|
7
7
|
|
|
8
8
|
export async function call(): Promise<LocalCommandResult> {
|
|
9
9
|
logEvent('tengu_install_slack_app_clicked', {})
|