@nlabs/lex 1.52.17 → 1.52.18

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.
@@ -7,6 +7,7 @@ import express from 'express';
7
7
  import { readFileSync, existsSync, mkdirSync, writeFileSync } from 'fs';
8
8
  import { homedir } from 'os';
9
9
  import { resolve as pathResolve, join, isAbsolute } from 'path';
10
+ import { pathToFileURL } from 'url';
10
11
  import { WebSocketServer } from 'ws';
11
12
  import { LexConfig, getPackageDir } from '../../LexConfig.js';
12
13
  import { createSpinner, removeFiles } from '../../utils/app.js';
@@ -90,33 +91,75 @@ const displayServerStatus = (httpPort, httpsPort, wsPort, host, quiet, publicIp)
90
91
  };
91
92
  const loadHandler = async (handlerPath, outputDir)=>{
92
93
  try {
94
+ console.log(`[Serverless] Parsing handler path: ${handlerPath}`);
95
+ // Parse AWS Lambda handler format: "path/to/file.exportName" or "file.exportName"
96
+ // Examples: "index.handler", "handlers/api.handler", "src/index.default"
97
+ const handlerParts = handlerPath.split('.');
98
+ console.log('[Serverless] Handler parts after split:', handlerParts);
99
+ let filePath;
100
+ let exportName = null;
101
+ if (handlerParts.length > 1) {
102
+ // AWS Lambda format: "file.exportName"
103
+ // Take the last part as export name, rest as file path
104
+ // Handle cases like "index.handler" -> file: "index", export: "handler"
105
+ // Or "handlers/api.handler" -> file: "handlers/api", export: "handler"
106
+ exportName = handlerParts[handlerParts.length - 1] || null;
107
+ filePath = handlerParts.slice(0, -1).join('.');
108
+ console.log(`[Serverless] Parsed AWS Lambda format - filePath: "${filePath}", exportName: "${exportName}"`);
109
+ } else {
110
+ // Simple format: just the file path
111
+ filePath = handlerPath;
112
+ console.log(`[Serverless] Simple format - filePath: "${filePath}"`);
113
+ }
114
+ // Ensure filePath doesn't have the export name in it
115
+ if (filePath.includes('.handler') || filePath.includes('.default')) {
116
+ console.error(`[Serverless] WARNING: filePath still contains export name! filePath: "${filePath}"`);
117
+ // Try to fix it - remove the last part if it looks like an export name
118
+ const pathParts = filePath.split('.');
119
+ if (pathParts.length > 1) {
120
+ const lastPart = pathParts[pathParts.length - 1];
121
+ if ([
122
+ 'handler',
123
+ 'default',
124
+ 'index'
125
+ ].includes(lastPart) && !exportName) {
126
+ exportName = lastPart;
127
+ filePath = pathParts.slice(0, -1).join('.');
128
+ console.log(`[Serverless] Fixed - filePath: "${filePath}", exportName: "${exportName}"`);
129
+ }
130
+ }
131
+ }
93
132
  // Handle both relative paths and absolute paths
94
- // If handlerPath includes a file extension, use it as-is
95
- // Otherwise, try .js, .mjs, .cjs extensions
96
133
  let fullPath;
97
- if (isAbsolute(handlerPath)) {
98
- fullPath = handlerPath;
134
+ if (isAbsolute(filePath)) {
135
+ fullPath = filePath;
99
136
  } else {
100
- fullPath = pathResolve(outputDir, handlerPath);
137
+ fullPath = pathResolve(outputDir, filePath);
101
138
  }
139
+ console.log(`[Serverless] Resolved fullPath (before extensions): ${fullPath}`);
102
140
  // Try different extensions if file doesn't exist
103
141
  if (!existsSync(fullPath)) {
104
142
  const extensions = [
105
143
  '.js',
106
144
  '.mjs',
107
- '.cjs',
108
- '.ts'
145
+ '.cjs'
109
146
  ];
110
- const pathWithoutExt = fullPath.replace(/\.(js|mjs|cjs|ts)$/, '');
147
+ const pathWithoutExt = fullPath.replace(/\.(js|mjs|cjs)$/, '');
148
+ console.log(`[Serverless] Trying extensions. Base path: ${pathWithoutExt}`);
111
149
  for (const ext of extensions){
112
150
  const candidatePath = pathWithoutExt + ext;
151
+ console.log(`[Serverless] Checking: ${candidatePath} (exists: ${existsSync(candidatePath)})`);
113
152
  if (existsSync(candidatePath)) {
114
153
  fullPath = candidatePath;
154
+ console.log(`[Serverless] Found file with extension: ${fullPath}`);
115
155
  break;
116
156
  }
117
157
  }
158
+ } else {
159
+ console.log(`[Serverless] File exists without trying extensions: ${fullPath}`);
118
160
  }
119
- console.log(`[Serverless] Loading handler from: ${fullPath}`);
161
+ console.log(`[Serverless] Final fullPath: ${fullPath}`);
162
+ console.log(`[Serverless] Export name: ${exportName || 'default/handler'}`);
120
163
  console.log(`[Serverless] File exists: ${existsSync(fullPath)}`);
121
164
  if (!existsSync(fullPath)) {
122
165
  console.error(`[Serverless] Handler file not found: ${fullPath}`);
@@ -125,13 +168,31 @@ const loadHandler = async (handlerPath, outputDir)=>{
125
168
  throw new Error(`Handler file not found: ${fullPath}`);
126
169
  }
127
170
  // Dynamic import of the handler with better error handling
171
+ // Add .js extension if importing TypeScript compiled output
172
+ const importPath = fullPath.endsWith('.ts') ? fullPath.replace(/\.ts$/, '.js') : fullPath;
128
173
  try {
129
- // Add .js extension if importing TypeScript compiled output
130
- const importPath = fullPath.endsWith('.ts') ? fullPath.replace(/\.ts$/, '.js') : fullPath;
131
- console.log(`[Serverless] Importing handler from: ${importPath}`);
132
- const handlerModule = await import(importPath);
133
- console.log(`[Serverless] Handler module loaded. Exports: ${Object.keys(handlerModule).join(', ')}`);
134
- const handler = handlerModule.default || handlerModule.handler || handlerModule;
174
+ // Convert to file:// URL for ES module imports (required for absolute paths)
175
+ // Use pathToFileURL to ensure proper file:// URL format
176
+ const importUrl = pathToFileURL(importPath).href;
177
+ console.log(`[Serverless] Importing handler from: ${importUrl}`);
178
+ console.log(`[Serverless] File path: ${importPath}`);
179
+ // Use import() with the file URL
180
+ // Note: If the handler file has import errors (like missing dependencies),
181
+ // those will surface here, but that's a handler code issue, not a loader issue
182
+ const handlerModule = await import(importUrl);
183
+ console.log(`[Serverless] Handler module loaded successfully. Exports: ${Object.keys(handlerModule).join(', ')}`);
184
+ // Get the handler based on export name or try defaults
185
+ let handler;
186
+ if (exportName) {
187
+ handler = handlerModule[exportName];
188
+ if (!handler) {
189
+ console.error(`[Serverless] Export "${exportName}" not found in module. Available exports: ${Object.keys(handlerModule).join(', ')}`);
190
+ return null;
191
+ }
192
+ } else {
193
+ // Try default, handler, or the module itself
194
+ handler = handlerModule.default || handlerModule.handler || handlerModule;
195
+ }
135
196
  console.log(`[Serverless] Handler found: ${typeof handler}, isFunction: ${typeof handler === 'function'}`);
136
197
  if (typeof handler !== 'function') {
137
198
  console.error(`[Serverless] Handler is not a function. Type: ${typeof handler}, Value:`, handler);
@@ -141,6 +202,14 @@ const loadHandler = async (handlerPath, outputDir)=>{
141
202
  } catch (importError) {
142
203
  console.error(`[Serverless] Import error for handler ${handlerPath}:`, importError.message);
143
204
  console.error('[Serverless] Import error stack:', importError.stack);
205
+ // Check if this is a dependency resolution error (common with ES modules)
206
+ if (importError.message && importError.message.includes('Cannot find module')) {
207
+ console.error('[Serverless] This appears to be a dependency resolution error.');
208
+ console.error('[Serverless] The handler file exists, but one of its imports is failing.');
209
+ console.error('[Serverless] Check that all dependencies in the handler file are properly installed.');
210
+ console.error(`[Serverless] Handler file: ${importPath}`);
211
+ console.error('[Serverless] Make sure the handler and its dependencies are compiled correctly.');
212
+ }
144
213
  return null;
145
214
  }
146
215
  } catch (error) {
@@ -738,4 +807,4 @@ export const serverless = async (cmd, callback = ()=>({}))=>{
738
807
  }
739
808
  };
740
809
 
741
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9zZXJ2ZXJsZXNzL3NlcnZlcmxlc3MudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCBib3hlbiBmcm9tICdib3hlbic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge3JlYWRGaWxlU3luYywgZXhpc3RzU3luYywgbWtkaXJTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge2hvbWVkaXJ9IGZyb20gJ29zJztcbmltcG9ydCB7cmVzb2x2ZSBhcyBwYXRoUmVzb2x2ZSwgam9pbiwgaXNBYnNvbHV0ZX0gZnJvbSAncGF0aCc7XG5pbXBvcnQge1dlYlNvY2tldFNlcnZlcn0gZnJvbSAnd3MnO1xuXG5pbXBvcnQge0xleENvbmZpZywgZ2V0UGFja2FnZURpcn0gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y3JlYXRlU3Bpbm5lciwgcmVtb3ZlRmlsZXN9IGZyb20gJy4uLy4uL3V0aWxzL2FwcC5qcyc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2ZXJsZXNzT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNsaU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbmZpZz86IHN0cmluZztcbiAgcmVhZG9ubHkgZGVidWc/OiBib29sZWFuO1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuICByZWFkb25seSBodHRwUG9ydD86IG51bWJlcjtcbiAgcmVhZG9ubHkgaHR0cHNQb3J0PzogbnVtYmVyO1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJlbW92ZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRlc3Q/OiBib29sZWFuO1xuICByZWFkb25seSB1c2VQdWJsaWNJcD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHZhcmlhYmxlcz86IHN0cmluZztcbiAgcmVhZG9ubHkgd3NQb3J0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBTZXJ2ZXJsZXNzQ2FsbGJhY2sgPSAoc3RhdHVzOiBudW1iZXIpPT4gdm9pZDtcblxuaW50ZXJmYWNlIFB1YmxpY0lwQ2FjaGUge1xuICBpcDogc3RyaW5nO1xuICB0aW1lc3RhbXA6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFNlcnZlcmxlc3NIYW5kbGVyIHtcbiAgcmVhZG9ubHkgaGFuZGxlcjogc3RyaW5nO1xuICByZWFkb25seSBldmVudHM/OiBBcnJheTx7XG4gICAgcmVhZG9ubHkgaHR0cD86IHtcbiAgICAgIHJlYWRvbmx5IGNvcnM/OiBib29sZWFuO1xuICAgICAgcmVhZG9ubHkgbWV0aG9kPzogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcbiAgICB9O1xuICAgIHJlYWRvbmx5IHdlYnNvY2tldD86IHtcbiAgICAgIHJlYWRvbmx5IHJvdXRlPzogc3RyaW5nO1xuICAgIH07XG4gIH0+O1xufVxuXG5pbnRlcmZhY2UgU2VydmVybGVzc0NvbmZpZyB7XG4gIHJlYWRvbmx5IGN1c3RvbT86IHtcbiAgICByZWFkb25seSAnc2VydmVybGVzcy1vZmZsaW5lJz86IHtcbiAgICAgIHJlYWRvbmx5IGNvcnM/OiBib29sZWFuO1xuICAgICAgcmVhZG9ubHkgaG9zdD86IHN0cmluZztcbiAgICAgIHJlYWRvbmx5IGh0dHBQb3J0PzogbnVtYmVyO1xuICAgICAgcmVhZG9ubHkgaHR0cHNQb3J0PzogbnVtYmVyO1xuICAgICAgcmVhZG9ubHkgd3NQb3J0PzogbnVtYmVyO1xuICAgIH07XG4gIH07XG4gIHJlYWRvbmx5IGZ1bmN0aW9ucz86IFJlY29yZDxzdHJpbmcsIFNlcnZlcmxlc3NIYW5kbGVyPjtcbn1cblxuY29uc3QgZ2V0Q2FjaGVEaXIgPSAoKTogc3RyaW5nID0+IHtcbiAgY29uc3QgY2FjaGVEaXIgPSBqb2luKGhvbWVkaXIoKSwgJy5sZXgtY2FjaGUnKTtcbiAgaWYoIWV4aXN0c1N5bmMoY2FjaGVEaXIpKSB7XG4gICAgbWtkaXJTeW5jKGNhY2hlRGlyLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG4gIH1cbiAgcmV0dXJuIGNhY2hlRGlyO1xufTtcblxuY29uc3QgZ2V0Q2FjaGVQYXRoID0gKCk6IHN0cmluZyA9PiBqb2luKGdldENhY2hlRGlyKCksICdwdWJsaWMtaXAuanNvbicpO1xuXG5jb25zdCByZWFkUHVibGljSXBDYWNoZSA9ICgpOiBQdWJsaWNJcENhY2hlIHwgbnVsbCA9PiB7XG4gIGNvbnN0IGNhY2hlUGF0aCA9IGdldENhY2hlUGF0aCgpO1xuICBpZighZXhpc3RzU3luYyhjYWNoZVBhdGgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGNhY2hlRGF0YSA9IHJlYWRGaWxlU3luYyhjYWNoZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgY2FjaGU6IFB1YmxpY0lwQ2FjaGUgPSBKU09OLnBhcnNlKGNhY2hlRGF0YSk7XG5cbiAgICAvLyBDaGVjayBpZiBjYWNoZSBpcyBvbGRlciB0aGFuIDEgd2Vla1xuICAgIGNvbnN0IG9uZVdlZWtNcyA9IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuICAgIGlmKERhdGUubm93KCkgLSBjYWNoZS50aW1lc3RhbXAgPiBvbmVXZWVrTXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBjYWNoZTtcbiAgfSBjYXRjaHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcblxuY29uc3Qgd3JpdGVQdWJsaWNJcENhY2hlID0gKGlwOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgY29uc3QgY2FjaGVQYXRoID0gZ2V0Q2FjaGVQYXRoKCk7XG4gIGNvbnN0IGNhY2hlOiBQdWJsaWNJcENhY2hlID0ge1xuICAgIGlwLFxuICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuICB9O1xuICB3cml0ZUZpbGVTeW5jKGNhY2hlUGF0aCwgSlNPTi5zdHJpbmdpZnkoY2FjaGUsIG51bGwsIDIpKTtcbn07XG5cbmNvbnN0IGZldGNoUHVibGljSXAgPSAoZm9yY2VSZWZyZXNoOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4gPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgaWYoIWZvcmNlUmVmcmVzaCkge1xuICAgIGNvbnN0IGNhY2hlZCA9IHJlYWRQdWJsaWNJcENhY2hlKCk7XG4gICAgaWYoY2FjaGVkKSB7XG4gICAgICByZXNvbHZlKGNhY2hlZC5pcCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLy8gVXNlIGZldGNoIGluc3RlYWQgb2YgaHR0cHNcbiAgZmV0Y2goJ2h0dHBzOi8vYXBpLmlwaWZ5Lm9yZycpXG4gICAgLnRoZW4oKHJlcykgPT4gcmVzLnRleHQoKSlcbiAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgaXAgPSBkYXRhLnRyaW0oKTtcbiAgICAgIGlmKGlwKSB7XG4gICAgICAgIHdyaXRlUHVibGljSXBDYWNoZShpcCk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKGlwKTtcbiAgICB9KVxuICAgIC5jYXRjaCgoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkpO1xufSk7XG5cbmNvbnN0IGRpc3BsYXlTZXJ2ZXJTdGF0dXMgPSAoXG4gIGh0dHBQb3J0OiBudW1iZXIsXG4gIGh0dHBzUG9ydDogbnVtYmVyLFxuICB3c1BvcnQ6IG51bWJlcixcbiAgaG9zdDogc3RyaW5nLFxuICBxdWlldDogYm9vbGVhbixcbiAgcHVibGljSXA/OiBzdHJpbmdcbikgPT4ge1xuICBpZihxdWlldCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGh0dHBVcmwgPSBgaHR0cDovLyR7aG9zdH06JHtodHRwUG9ydH1gO1xuICBjb25zdCBodHRwc1VybCA9IGBodHRwczovLyR7aG9zdH06JHtodHRwc1BvcnR9YDtcbiAgY29uc3Qgd3NVcmwgPSBgd3M6Ly8ke2hvc3R9OiR7d3NQb3J0fWA7XG4gIGNvbnN0IHdzc1VybCA9IGB3c3M6Ly8ke2hvc3R9OiR7d3NQb3J0fWA7XG5cbiAgbGV0IHVybExpbmVzID0gYCR7Y2hhbGsuZ3JlZW4oJ0hUVFA6Jyl9ICAgICAgJHtjaGFsay51bmRlcmxpbmUoaHR0cFVybCl9XFxuYDtcbiAgdXJsTGluZXMgKz0gYCR7Y2hhbGsuZ3JlZW4oJ0hUVFBTOicpfSAgICAgJHtjaGFsay51bmRlcmxpbmUoaHR0cHNVcmwpfVxcbmA7XG4gIHVybExpbmVzICs9IGAke2NoYWxrLmdyZWVuKCdXZWJTb2NrZXQ6Jyl9ICR7Y2hhbGsudW5kZXJsaW5lKHdzVXJsKX1cXG5gO1xuICB1cmxMaW5lcyArPSBgJHtjaGFsay5ncmVlbignV1NTOicpfSAgICAgICAke2NoYWxrLnVuZGVybGluZSh3c3NVcmwpfVxcbmA7XG5cbiAgaWYocHVibGljSXApIHtcbiAgICB1cmxMaW5lcyArPSBgXFxuJHtjaGFsay5ncmVlbignUHVibGljOicpfSAgICAke2NoYWxrLnVuZGVybGluZShgaHR0cDovLyR7cHVibGljSXB9OiR7aHR0cFBvcnR9YCl9XFxuYDtcbiAgfVxuXG4gIGNvbnN0IHN0YXR1c0JveCA9IGJveGVuKFxuICAgIGAke2NoYWxrLmN5YW4uYm9sZCgn8J+agCBTZXJ2ZXJsZXNzIERldmVsb3BtZW50IFNlcnZlciBSdW5uaW5nJyl9XFxuXFxuJHt1cmxMaW5lc31cXG5gICtcbiAgICBgJHtjaGFsay55ZWxsb3coJ1ByZXNzIEN0cmwrQyB0byBzdG9wIHRoZSBzZXJ2ZXInKX1gLFxuICAgIHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJyMxYTFhMWEnLFxuICAgICAgYm9yZGVyQ29sb3I6ICdjeWFuJyxcbiAgICAgIGJvcmRlclN0eWxlOiAncm91bmQnLFxuICAgICAgbWFyZ2luOiAxLFxuICAgICAgcGFkZGluZzogMVxuICAgIH1cbiAgKTtcblxuICBjb25zb2xlLmxvZyhgXFxuJHtzdGF0dXNCb3h9XFxuYCk7XG59O1xuXG5jb25zdCBsb2FkSGFuZGxlciA9IGFzeW5jIChoYW5kbGVyUGF0aDogc3RyaW5nLCBvdXRwdXREaXI6IHN0cmluZykgPT4ge1xuICB0cnkge1xuICAgIC8vIEhhbmRsZSBib3RoIHJlbGF0aXZlIHBhdGhzIGFuZCBhYnNvbHV0ZSBwYXRoc1xuICAgIC8vIElmIGhhbmRsZXJQYXRoIGluY2x1ZGVzIGEgZmlsZSBleHRlbnNpb24sIHVzZSBpdCBhcy1pc1xuICAgIC8vIE90aGVyd2lzZSwgdHJ5IC5qcywgLm1qcywgLmNqcyBleHRlbnNpb25zXG4gICAgbGV0IGZ1bGxQYXRoOiBzdHJpbmc7XG5cbiAgICBpZihpc0Fic29sdXRlKGhhbmRsZXJQYXRoKSkge1xuICAgICAgZnVsbFBhdGggPSBoYW5kbGVyUGF0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgZnVsbFBhdGggPSBwYXRoUmVzb2x2ZShvdXRwdXREaXIsIGhhbmRsZXJQYXRoKTtcbiAgICB9XG5cbiAgICAvLyBUcnkgZGlmZmVyZW50IGV4dGVuc2lvbnMgaWYgZmlsZSBkb2Vzbid0IGV4aXN0XG4gICAgaWYoIWV4aXN0c1N5bmMoZnVsbFBhdGgpKSB7XG4gICAgICBjb25zdCBleHRlbnNpb25zID0gWycuanMnLCAnLm1qcycsICcuY2pzJywgJy50cyddO1xuICAgICAgY29uc3QgcGF0aFdpdGhvdXRFeHQgPSBmdWxsUGF0aC5yZXBsYWNlKC9cXC4oanN8bWpzfGNqc3x0cykkLywgJycpO1xuICAgICAgZm9yKGNvbnN0IGV4dCBvZiBleHRlbnNpb25zKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZVBhdGggPSBwYXRoV2l0aG91dEV4dCArIGV4dDtcbiAgICAgICAgaWYoZXhpc3RzU3luYyhjYW5kaWRhdGVQYXRoKSkge1xuICAgICAgICAgIGZ1bGxQYXRoID0gY2FuZGlkYXRlUGF0aDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gTG9hZGluZyBoYW5kbGVyIGZyb206ICR7ZnVsbFBhdGh9YCk7XG4gICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBGaWxlIGV4aXN0czogJHtleGlzdHNTeW5jKGZ1bGxQYXRoKX1gKTtcblxuICAgIGlmKCFleGlzdHNTeW5jKGZ1bGxQYXRoKSkge1xuICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEhhbmRsZXIgZmlsZSBub3QgZm91bmQ6ICR7ZnVsbFBhdGh9YCk7XG4gICAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gT3V0cHV0IGRpcmVjdG9yeTogJHtvdXRwdXREaXJ9YCk7XG4gICAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gSGFuZGxlciBwYXRoIGZyb20gY29uZmlnOiAke2hhbmRsZXJQYXRofWApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBIYW5kbGVyIGZpbGUgbm90IGZvdW5kOiAke2Z1bGxQYXRofWApO1xuICAgIH1cblxuICAgIC8vIER5bmFtaWMgaW1wb3J0IG9mIHRoZSBoYW5kbGVyIHdpdGggYmV0dGVyIGVycm9yIGhhbmRsaW5nXG4gICAgdHJ5IHtcbiAgICAgIC8vIEFkZCAuanMgZXh0ZW5zaW9uIGlmIGltcG9ydGluZyBUeXBlU2NyaXB0IGNvbXBpbGVkIG91dHB1dFxuICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IGZ1bGxQYXRoLmVuZHNXaXRoKCcudHMnKSA/IGZ1bGxQYXRoLnJlcGxhY2UoL1xcLnRzJC8sICcuanMnKSA6IGZ1bGxQYXRoO1xuICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBJbXBvcnRpbmcgaGFuZGxlciBmcm9tOiAke2ltcG9ydFBhdGh9YCk7XG5cbiAgICAgIGNvbnN0IGhhbmRsZXJNb2R1bGUgPSBhd2FpdCBpbXBvcnQoaW1wb3J0UGF0aCk7XG4gICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIEhhbmRsZXIgbW9kdWxlIGxvYWRlZC4gRXhwb3J0czogJHtPYmplY3Qua2V5cyhoYW5kbGVyTW9kdWxlKS5qb2luKCcsICcpfWApO1xuXG4gICAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlck1vZHVsZS5kZWZhdWx0IHx8IGhhbmRsZXJNb2R1bGUuaGFuZGxlciB8fCBoYW5kbGVyTW9kdWxlO1xuICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBIYW5kbGVyIGZvdW5kOiAke3R5cGVvZiBoYW5kbGVyfSwgaXNGdW5jdGlvbjogJHt0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJ31gKTtcblxuICAgICAgaWYodHlwZW9mIGhhbmRsZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEhhbmRsZXIgaXMgbm90IGEgZnVuY3Rpb24uIFR5cGU6ICR7dHlwZW9mIGhhbmRsZXJ9LCBWYWx1ZTpgLCBoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBoYW5kbGVyO1xuICAgIH0gY2F0Y2goaW1wb3J0RXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEltcG9ydCBlcnJvciBmb3IgaGFuZGxlciAke2hhbmRsZXJQYXRofTpgLCBpbXBvcnRFcnJvci5tZXNzYWdlKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTZXJ2ZXJsZXNzXSBJbXBvcnQgZXJyb3Igc3RhY2s6JywgaW1wb3J0RXJyb3Iuc3RhY2spO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9IGNhdGNoKGVycm9yOiBhbnkpIHtcbiAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gRXJyb3IgbG9hZGluZyBoYW5kbGVyICR7aGFuZGxlclBhdGh9OmAsIGVycm9yLm1lc3NhZ2UpO1xuICAgIGNvbnNvbGUuZXJyb3IoJ1tTZXJ2ZXJsZXNzXSBFcnJvciBzdGFjazonLCBlcnJvci5zdGFjayk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbmNvbnN0IGNhcHR1cmVDb25zb2xlTG9ncyA9IChoYW5kbGVyOiAoZXZlbnQ6IGFueSwgY29udGV4dDogYW55KT0+IFByb21pc2U8YW55PiwgcXVpZXQ6IGJvb2xlYW4pID0+IHtcbiAgaWYocXVpZXQpIHtcbiAgICByZXR1cm4gaGFuZGxlcjtcbiAgfVxuXG4gIHJldHVybiBhc3luYyAoZXZlbnQ6IGFueSwgY29udGV4dDogYW55KSA9PiB7XG4gICAgLy8gQ2FwdHVyZSBjb25zb2xlLmxvZywgY29uc29sZS5lcnJvciwgZXRjLlxuICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZUxvZyA9IGNvbnNvbGUubG9nO1xuICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZUVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICBjb25zdCBvcmlnaW5hbENvbnNvbGVXYXJuID0gY29uc29sZS53YXJuO1xuICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZUluZm8gPSBjb25zb2xlLmluZm87XG5cbiAgICBjb25zdCBsb2dzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc29sZS5sb2cgPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgIGxvZ3MucHVzaChgW0xPR10gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICAgIG9yaWdpbmFsQ29uc29sZUxvZyguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgY29uc29sZS5lcnJvciA9ICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgbG9ncy5wdXNoKGBbRVJST1JdICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgICBvcmlnaW5hbENvbnNvbGVFcnJvciguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgY29uc29sZS53YXJuID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBsb2dzLnB1c2goYFtXQVJOXSAke2FyZ3Muam9pbignICcpfWApO1xuICAgICAgb3JpZ2luYWxDb25zb2xlV2FybiguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgY29uc29sZS5pbmZvID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBsb2dzLnB1c2goYFtJTkZPXSAke2FyZ3Muam9pbignICcpfWApO1xuICAgICAgb3JpZ2luYWxDb25zb2xlSW5mbyguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIoZXZlbnQsIGNvbnRleHQpO1xuXG4gICAgICAvLyBPdXRwdXQgY2FwdHVyZWQgbG9nc1xuICAgICAgaWYobG9ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJy0tLSBIYW5kbGVyIENvbnNvbGUgT3V0cHV0IC0tLScpKTtcbiAgICAgICAgbG9ncy5mb3JFYWNoKChsb2cpID0+IGNvbnNvbGUubG9nKGNoYWxrLmdyYXkobG9nKSkpO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCctLS0gRW5kIEhhbmRsZXIgQ29uc29sZSBPdXRwdXQgLS0tJykpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIGNvbnNvbGUgbWV0aG9kc1xuICAgICAgY29uc29sZS5sb2cgPSBvcmlnaW5hbENvbnNvbGVMb2c7XG4gICAgICBjb25zb2xlLmVycm9yID0gb3JpZ2luYWxDb25zb2xlRXJyb3I7XG4gICAgICBjb25zb2xlLndhcm4gPSBvcmlnaW5hbENvbnNvbGVXYXJuO1xuICAgICAgY29uc29sZS5pbmZvID0gb3JpZ2luYWxDb25zb2xlSW5mbztcbiAgICB9XG4gIH07XG59O1xuXG5jb25zdCBjcmVhdGVFeHByZXNzU2VydmVyID0gYXN5bmMgKFxuICBjb25maWc6IFNlcnZlcmxlc3NDb25maWcsXG4gIG91dHB1dERpcjogc3RyaW5nLFxuICBodHRwUG9ydDogbnVtYmVyLFxuICBob3N0OiBzdHJpbmcsXG4gIHF1aWV0OiBib29sZWFuLFxuICBkZWJ1ZzogYm9vbGVhblxuKSA9PiB7XG4gIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcblxuICAvLyBFbmFibGUgQ09SU1xuICBhcHAudXNlKChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbicsICcqJyk7XG4gICAgcmVzLmhlYWRlcignQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kcycsICdHRVQsIFBPU1QsIFBVVCwgREVMRVRFLCBQQVRDSCwgT1BUSU9OUycpO1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMnLCAnKicpO1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzJywgJ3RydWUnKTtcblxuICAgIGlmKHJlcS5tZXRob2QgPT09ICdPUFRJT05TJykge1xuICAgICAgcmVzLnNlbmRTdGF0dXMoMjAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dCgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gUGFyc2UgSlNPTiBib2RpZXNcbiAgYXBwLnVzZShleHByZXNzLmpzb24oKSk7XG5cbiAgLy8gTG9hZCBHcmFwaFFMIGhhbmRsZXJcbiAgY29uc3QgbG9hZEdyYXBoUUxTY2hlbWEgPSBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFRyeSB0byBmaW5kIGEgR3JhcGhRTCBoYW5kbGVyXG4gICAgICBsZXQgZ3JhcGhxbEhhbmRsZXIgPSBudWxsO1xuXG4gICAgICBpZihjb25maWcuZnVuY3Rpb25zKSB7XG4gICAgICAgIGZvcihjb25zdCBbZnVuY3Rpb25OYW1lLCBmdW5jdGlvbkNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLmZ1bmN0aW9ucykpIHtcbiAgICAgICAgICBpZihmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgIGZvcihjb25zdCBldmVudCBvZiBmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgICAgaWYoZXZlbnQuaHR0cCAmJiBldmVudC5odHRwLnBhdGgpIHtcbiAgICAgICAgICAgICAgICAvLyBMb29rIGZvciBHcmFwaFFMIGVuZHBvaW50c1xuICAgICAgICAgICAgICAgIGlmKGV2ZW50Lmh0dHAucGF0aCA9PT0gJy9wdWJsaWMnIHx8IGV2ZW50Lmh0dHAucGF0aCA9PT0gJy9ncmFwaHFsJykge1xuICAgICAgICAgICAgICAgICAgZ3JhcGhxbEhhbmRsZXIgPSBhd2FpdCBsb2FkSGFuZGxlcihmdW5jdGlvbkNvbmZpZy5oYW5kbGVyLCBvdXRwdXREaXIpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGdyYXBocWxIYW5kbGVyKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYoZ3JhcGhxbEhhbmRsZXIpIHtcbiAgICAgICAgbG9nKCdGb3VuZCBHcmFwaFFMIGhhbmRsZXInLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgcmV0dXJuIGdyYXBocWxIYW5kbGVyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgbG9nKGBFcnJvciBsb2FkaW5nIEdyYXBoUUwgaGFuZGxlcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICAvLyBTZXQgdXAgR3JhcGhRTCBoYW5kbGVyIGZvciBHcmFwaFFMIHJlcXVlc3RzXG4gIHRyeSB7XG4gICAgY29uc3QgZ3JhcGhxbEhhbmRsZXIgPSBhd2FpdCBsb2FkR3JhcGhRTFNjaGVtYSgpO1xuICAgIGlmKGdyYXBocWxIYW5kbGVyKSB7XG4gICAgICAvLyBGaW5kIHRoZSBHcmFwaFFMIHBhdGggZnJvbSB0aGUgc2VydmVybGVzcyBjb25maWdcbiAgICAgIGxldCBncmFwaHFsUGF0aCA9ICcvZ3JhcGhxbCc7IC8vIGRlZmF1bHQgZmFsbGJhY2tcblxuICAgICAgaWYoY29uZmlnLmZ1bmN0aW9ucykge1xuICAgICAgICBmb3IoY29uc3QgW19mdW5jdGlvbk5hbWUsIGZ1bmN0aW9uQ29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcuZnVuY3Rpb25zKSkge1xuICAgICAgICAgIGlmKGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgZm9yKGNvbnN0IGV2ZW50IG9mIGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgICBpZihldmVudD8uaHR0cD8ucGF0aCkge1xuICAgICAgICAgICAgICAgIGdyYXBocWxQYXRoID0gZXZlbnQuaHR0cC5wYXRoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGdyYXBocWxQYXRoICE9PSAnL2dyYXBocWwnKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHVwIEdyYXBoUUwgZW5kcG9pbnQgd2l0aCBlbmhhbmNlZCBjb25zb2xlLmxvZyBjYXB0dXJlXG4gICAgICBhcHAudXNlKGdyYXBocWxQYXRoLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgLy8gR3JhcGhRTCBEZWJ1ZyBMb2dnaW5nXG4gICAgICAgIGlmKGRlYnVnICYmIHJlcS5ib2R5ICYmIHJlcS5ib2R5LnF1ZXJ5KSB7XG4gICAgICAgICAgbG9nKCfwn5SNIEdyYXBoUUwgRGVidWcgTW9kZTogQW5hbHl6aW5nIHJlcXVlc3QuLi4nLCAnaW5mbycsIGZhbHNlKTtcbiAgICAgICAgICBsb2coYPCfk50gR3JhcGhRTCBRdWVyeTogJHtyZXEuYm9keS5xdWVyeX1gLCAnaW5mbycsIGZhbHNlKTtcbiAgICAgICAgICBpZihyZXEuYm9keS52YXJpYWJsZXMpIHtcbiAgICAgICAgICAgIGxvZyhg8J+TiiBHcmFwaFFMIFZhcmlhYmxlczogJHtKU09OLnN0cmluZ2lmeShyZXEuYm9keS52YXJpYWJsZXMsIG51bGwsIDIpfWAsICdpbmZvJywgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZihyZXEuYm9keS5vcGVyYXRpb25OYW1lKSB7XG4gICAgICAgICAgICBsb2coYPCfj7fvuI8gIEdyYXBoUUwgT3BlcmF0aW9uOiAke3JlcS5ib2R5Lm9wZXJhdGlvbk5hbWV9YCwgJ2luZm8nLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5oYW5jZWQgY29uc29sZS5sb2cgY2FwdHVyZVxuICAgICAgICBjb25zdCBvcmlnaW5hbENvbnNvbGVMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgICAgY29uc3QgbG9nczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBjb25zb2xlLmxvZyA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgY29uc3QgbG9nTWVzc2FnZSA9IGFyZ3MubWFwKChhcmcpID0+XG4gICAgICAgICAgICAodHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShhcmcsIG51bGwsIDIpIDogU3RyaW5nKGFyZykpXG4gICAgICAgICAgKS5qb2luKCcgJyk7XG4gICAgICAgICAgbG9ncy5wdXNoKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgIG9yaWdpbmFsQ29uc29sZUxvZyhgW0dyYXBoUUxdICR7bG9nTWVzc2FnZX1gKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBDcmVhdGUgY29udGV4dCBmb3IgdGhlIGhhbmRsZXJcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgICAgICBhd3NSZXF1ZXN0SWQ6ICd0ZXN0LXJlcXVlc3QtaWQnLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ2dyYXBocWwnLFxuICAgICAgICAgIGZ1bmN0aW9uVmVyc2lvbjogJyRMQVRFU1QnLFxuICAgICAgICAgIGdldFJlbWFpbmluZ1RpbWVJbk1pbGxpczogKCkgPT4gMzAwMDAsXG4gICAgICAgICAgaW52b2tlZEZ1bmN0aW9uQXJuOiAnYXJuOmF3czpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjpncmFwaHFsJyxcbiAgICAgICAgICBsb2dHcm91cE5hbWU6ICcvYXdzL2xhbWJkYS9ncmFwaHFsJyxcbiAgICAgICAgICBsb2dTdHJlYW1OYW1lOiAndGVzdC1sb2ctc3RyZWFtJyxcbiAgICAgICAgICByZXEsXG4gICAgICAgICAgcmVzXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gV3JhcCBoYW5kbGVyIHdpdGggY29uc29sZSBsb2cgY2FwdHVyZVxuICAgICAgICBjb25zdCB3cmFwcGVkSGFuZGxlciA9IGNhcHR1cmVDb25zb2xlTG9ncyhncmFwaHFsSGFuZGxlciwgcXVpZXQpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQ2FsbCB0aGUgaGFuZGxlciB3aXRoIEdyYXBoUUwgcGFyYW1ldGVyc1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdyYXBwZWRIYW5kbGVyKHtcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcS5ib2R5KSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlcS5oZWFkZXJzLFxuICAgICAgICAgICAgaHR0cE1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgcGF0aDogZ3JhcGhxbFBhdGgsXG4gICAgICAgICAgICBxdWVyeVN0cmluZ1BhcmFtZXRlcnM6IHt9XG4gICAgICAgICAgfSwgY29udGV4dCk7XG5cbiAgICAgICAgICAvLyBSZXN0b3JlIGNvbnNvbGUubG9nXG4gICAgICAgICAgY29uc29sZS5sb2cgPSBvcmlnaW5hbENvbnNvbGVMb2c7XG5cbiAgICAgICAgICAvLyBIYW5kbGUgdGhlIHJlc3VsdFxuICAgICAgICAgIGlmKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQuc3RhdHVzQ29kZSkge1xuICAgICAgICAgICAgcmVzLnN0YXR1cyhyZXN1bHQuc3RhdHVzQ29kZSk7XG4gICAgICAgICAgICBpZihyZXN1bHQuaGVhZGVycykge1xuICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhyZXN1bHQuaGVhZGVycykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzLnNldEhlYWRlcihrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcy5zZW5kKHJlc3VsdC5ib2R5KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzLmpzb24ocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAvLyBSZXN0b3JlIGNvbnNvbGUubG9nXG4gICAgICAgICAgY29uc29sZS5sb2cgPSBvcmlnaW5hbENvbnNvbGVMb2c7XG4gICAgICAgICAgbG9nKGBHcmFwaFFMIGhhbmRsZXIgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe2Vycm9yOiBlcnJvci5tZXNzYWdlfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsb2coYEdyYXBoUUwgZW5kcG9pbnQgYXZhaWxhYmxlIGF0IGh0dHA6Ly8ke2hvc3R9OiR7aHR0cFBvcnR9JHtncmFwaHFsUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICB9XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYEVycm9yIHNldHRpbmcgdXAgR3JhcGhRTDogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIGZvciBub24tR3JhcGhRTCByb3V0ZXMgLSBoYW5kbGUgYWxsIHJlbWFpbmluZyByb3V0ZXNcbiAgYXBwLnVzZSgnLycsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSByZXEudXJsIHx8ICcvJztcbiAgICAgIGNvbnN0IG1ldGhvZCA9IHJlcS5tZXRob2QgfHwgJ0dFVCc7XG4gICAgICBjb25zdCBwYXRobmFtZSA9IHJlcS5wYXRoIHx8IHVybC5zcGxpdCgnPycpWzBdOyAvLyBFeHRyYWN0IHBhdGhuYW1lIHdpdGhvdXQgcXVlcnkgc3RyaW5nXG5cbiAgICAgIC8vIEFsd2F5cyBsb2cgcmVxdWVzdHMgKG5vdCBhZmZlY3RlZCBieSBxdWlldCBmbGFnIGZvciBkZWJ1Z2dpbmcpXG4gICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdICR7bWV0aG9kfSAke3VybH0gKHBhdGhuYW1lOiAke3BhdGhuYW1lfSlgKTtcblxuICAgICAgLy8gRmluZCBtYXRjaGluZyBmdW5jdGlvblxuICAgICAgbGV0IG1hdGNoZWRGdW5jdGlvbiA9IG51bGw7XG5cbiAgICAgIGlmKGNvbmZpZy5mdW5jdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lcyA9IE9iamVjdC5rZXlzKGNvbmZpZy5mdW5jdGlvbnMpO1xuICAgICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIEF2YWlsYWJsZSBmdW5jdGlvbnM6ICR7ZnVuY3Rpb25OYW1lcy5qb2luKCcsICcpfWApO1xuICAgICAgICBjb25zb2xlLmxvZygnW1NlcnZlcmxlc3NdIENvbmZpZyBmdW5jdGlvbnM6JywgSlNPTi5zdHJpbmdpZnkoY29uZmlnLmZ1bmN0aW9ucywgbnVsbCwgMikpO1xuXG4gICAgICAgIGZvcihjb25zdCBbZnVuY3Rpb25OYW1lLCBmdW5jdGlvbkNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLmZ1bmN0aW9ucykpIHtcbiAgICAgICAgICBpZihmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgIGZvcihjb25zdCBldmVudCBvZiBmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgICAgaWYoZXZlbnQuaHR0cCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50UGF0aCA9IGV2ZW50Lmh0dHAucGF0aCB8fCAnLyc7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRNZXRob2QgPSAoZXZlbnQuaHR0cC5tZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdE1ldGhvZCA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBDaGVja2luZyBmdW5jdGlvbiAke2Z1bmN0aW9uTmFtZX06IHBhdGg9XCIke2V2ZW50UGF0aH1cIiwgbWV0aG9kPVwiJHtldmVudE1ldGhvZH1cIiBhZ2FpbnN0IHBhdGhuYW1lPVwiJHtwYXRobmFtZX1cIiwgbWV0aG9kPVwiJHtyZXF1ZXN0TWV0aG9kfVwiYCk7XG5cbiAgICAgICAgICAgICAgICAvLyBJbXByb3ZlZCBwYXRoIG1hdGNoaW5nIC0gY29tcGFyZSBwYXRobmFtZSB3aXRob3V0IHF1ZXJ5IHN0cmluZ1xuICAgICAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSBwYXRocyAocmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMgZm9yIGNvbXBhcmlzb24pXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEV2ZW50UGF0aCA9IGV2ZW50UGF0aC5yZXBsYWNlKC9cXC8kLywgJycpIHx8ICcvJztcbiAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkUGF0aG5hbWUgPSBwYXRobmFtZS5yZXBsYWNlKC9cXC8kLywgJycpIHx8ICcvJztcblxuICAgICAgICAgICAgICAgIGlmKG5vcm1hbGl6ZWRFdmVudFBhdGggPT09IG5vcm1hbGl6ZWRQYXRobmFtZSAmJiBldmVudE1ldGhvZCA9PT0gcmVxdWVzdE1ldGhvZCkge1xuICAgICAgICAgICAgICAgICAgbWF0Y2hlZEZ1bmN0aW9uID0gZnVuY3Rpb25OYW1lO1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSDinJMgTWF0Y2hlZCBmdW5jdGlvbjogJHttYXRjaGVkRnVuY3Rpb259YCk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYobWF0Y2hlZEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2VydmVybGVzc10gTm8gZnVuY3Rpb25zIGZvdW5kIGluIGNvbmZpZycpO1xuICAgICAgfVxuXG4gICAgICBpZihtYXRjaGVkRnVuY3Rpb24gJiYgY29uZmlnLmZ1bmN0aW9uc1ttYXRjaGVkRnVuY3Rpb25dKSB7XG4gICAgICAgIC8vIFJlc29sdmUgaGFuZGxlciBwYXRoIHJlbGF0aXZlIHRvIG91dHB1dCBkaXJlY3RvcnlcbiAgICAgICAgY29uc3QgaGFuZGxlclBhdGggPSBjb25maWcuZnVuY3Rpb25zW21hdGNoZWRGdW5jdGlvbl0uaGFuZGxlcjtcbiAgICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBMb2FkaW5nIGhhbmRsZXI6ICR7aGFuZGxlclBhdGh9IGZyb20gb3V0cHV0RGlyOiAke291dHB1dERpcn1gKTtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IGF3YWl0IGxvYWRIYW5kbGVyKGhhbmRsZXJQYXRoLCBvdXRwdXREaXIpO1xuXG4gICAgICAgIGlmKGhhbmRsZXIpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIEhhbmRsZXIgbG9hZGVkIHN1Y2Nlc3NmdWxseSwgdHlwZTogJHt0eXBlb2YgaGFuZGxlcn1gKTtcbiAgICAgICAgICBjb25zdCB3cmFwcGVkSGFuZGxlciA9IGNhcHR1cmVDb25zb2xlTG9ncyhoYW5kbGVyLCBxdWlldCk7XG5cbiAgICAgICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgICAgIGJvZHk6IHJlcS5ib2R5LFxuICAgICAgICAgICAgaGVhZGVyczogcmVxLmhlYWRlcnMsXG4gICAgICAgICAgICBodHRwTWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICBwYXRoOiB1cmwsXG4gICAgICAgICAgICBxdWVyeVN0cmluZ1BhcmFtZXRlcnM6IHJlcS5xdWVyeVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgICAgICAgYXdzUmVxdWVzdElkOiAndGVzdC1yZXF1ZXN0LWlkJyxcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogbWF0Y2hlZEZ1bmN0aW9uLFxuICAgICAgICAgICAgZnVuY3Rpb25WZXJzaW9uOiAnJExBVEVTVCcsXG4gICAgICAgICAgICBnZXRSZW1haW5pbmdUaW1lSW5NaWxsaXM6ICgpID0+IDMwMDAwLFxuICAgICAgICAgICAgaW52b2tlZEZ1bmN0aW9uQXJuOiBgYXJuOmF3czpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjoke21hdGNoZWRGdW5jdGlvbn1gLFxuICAgICAgICAgICAgbG9nR3JvdXBOYW1lOiBgL2F3cy9sYW1iZGEvJHttYXRjaGVkRnVuY3Rpb259YCxcbiAgICAgICAgICAgIGxvZ1N0cmVhbU5hbWU6ICd0ZXN0LWxvZy1zdHJlYW0nLFxuICAgICAgICAgICAgbWVtb3J5TGltaXRJbk1COiAnMTI4J1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tTZXJ2ZXJsZXNzXSBDYWxsaW5nIGhhbmRsZXIgd2l0aCBldmVudDonLCBKU09OLnN0cmluZ2lmeShldmVudCwgbnVsbCwgMikpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd3JhcHBlZEhhbmRsZXIoZXZlbnQsIGNvbnRleHQpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tTZXJ2ZXJsZXNzXSBIYW5kbGVyIHJldHVybmVkOicsIEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMikpO1xuXG4gICAgICAgICAgICBpZihyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0LnN0YXR1c0NvZGUpIHtcbiAgICAgICAgICAgICAgcmVzLnN0YXR1cyhyZXN1bHQuc3RhdHVzQ29kZSk7XG4gICAgICAgICAgICAgIGlmKHJlc3VsdC5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocmVzdWx0LmhlYWRlcnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmVzLnNldEhlYWRlcihrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlcy5zZW5kKHJlc3VsdC5ib2R5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlcy5qc29uKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbU2VydmVybGVzc10gSGFuZGxlciBlcnJvcjonLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTZXJ2ZXJsZXNzXSBIYW5kbGVyIGVycm9yIHN0YWNrOicsIGVycm9yLnN0YWNrKTtcbiAgICAgICAgICAgIGxvZyhgSGFuZGxlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIGZhbHNlKTtcbiAgICAgICAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtlcnJvcjogZXJyb3IubWVzc2FnZX0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gSGFuZGxlciBub3QgZm91bmQgZm9yIGZ1bmN0aW9uOiAke21hdGNoZWRGdW5jdGlvbn1gKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gSGFuZGxlciBwYXRoOiAke2hhbmRsZXJQYXRofSwgT3V0cHV0IGRpcjogJHtvdXRwdXREaXJ9YCk7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oe2Vycm9yOiAnSGFuZGxlciBub3QgZm91bmQnfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtTZXJ2ZXJsZXNzXSBGdW5jdGlvbiBub3QgZm91bmQgZm9yIHBhdGhuYW1lOiAke3BhdGhuYW1lfSwgbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEF2YWlsYWJsZSBmdW5jdGlvbnM6ICR7Y29uZmlnLmZ1bmN0aW9ucyA/IE9iamVjdC5rZXlzKGNvbmZpZy5mdW5jdGlvbnMpLmpvaW4oJywgJykgOiAnbm9uZSd9YCk7XG4gICAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHtlcnJvcjogJ0Z1bmN0aW9uIG5vdCBmb3VuZCd9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBsb2coYFJvdXRlIGhhbmRsaW5nIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgZmFsc2UpO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe2Vycm9yOiBlcnJvci5tZXNzYWdlfSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gYXBwO1xufTtcblxuY29uc3QgY3JlYXRlV2ViU29ja2V0U2VydmVyID0gKFxuICBjb25maWc6IFNlcnZlcmxlc3NDb25maWcsXG4gIG91dHB1dERpcjogc3RyaW5nLFxuICB3c1BvcnQ6IG51bWJlcixcbiAgcXVpZXQ6IGJvb2xlYW4sXG4gIGRlYnVnOiBib29sZWFuXG4pID0+IHtcbiAgY29uc3Qgd3NzID0gbmV3IFdlYlNvY2tldFNlcnZlcih7cG9ydDogd3NQb3J0fSk7XG5cbiAgd3NzLm9uKCdjb25uZWN0aW9uJywgYXN5bmMgKHdzLCByZXEpID0+IHtcbiAgICBsb2coYFdlYlNvY2tldCBjb25uZWN0aW9uIGVzdGFibGlzaGVkOiAke3JlcS51cmx9YCwgJ2luZm8nLCBmYWxzZSk7XG5cbiAgICB3cy5vbignbWVzc2FnZScsIGFzeW5jIChtZXNzYWdlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShtZXNzYWdlLnRvU3RyaW5nKCkpO1xuXG4gICAgICAgIC8vIEZpbmQgbWF0Y2hpbmcgV2ViU29ja2V0IGZ1bmN0aW9uXG4gICAgICAgIGxldCBtYXRjaGVkRnVuY3Rpb24gPSBudWxsO1xuXG4gICAgICAgIGlmKGNvbmZpZy5mdW5jdGlvbnMpIHtcbiAgICAgICAgICBmb3IoY29uc3QgW2Z1bmN0aW9uTmFtZSwgZnVuY3Rpb25Db25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5mdW5jdGlvbnMpKSB7XG4gICAgICAgICAgICBpZihmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgICAgZm9yKGNvbnN0IGV2ZW50IG9mIGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgICAgIGlmKGV2ZW50LndlYnNvY2tldCkge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgcm91dGUgPSBldmVudC53ZWJzb2NrZXQucm91dGUgfHwgJyRjb25uZWN0JztcbiAgICAgICAgICAgICAgICAgIGlmKHJvdXRlID09PSAnJGRlZmF1bHQnIHx8IHJvdXRlID09PSBkYXRhLmFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaGVkRnVuY3Rpb24gPSBmdW5jdGlvbk5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYobWF0Y2hlZEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG1hdGNoZWRGdW5jdGlvbiAmJiBjb25maWcuZnVuY3Rpb25zW21hdGNoZWRGdW5jdGlvbl0pIHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVyID0gYXdhaXQgbG9hZEhhbmRsZXIoY29uZmlnLmZ1bmN0aW9uc1ttYXRjaGVkRnVuY3Rpb25dLmhhbmRsZXIsIG91dHB1dERpcik7XG5cbiAgICAgICAgICBpZihoYW5kbGVyKSB7XG4gICAgICAgICAgICAvLyBXcmFwIGhhbmRsZXIgd2l0aCBjb25zb2xlIGxvZyBjYXB0dXJlXG4gICAgICAgICAgICBjb25zdCB3cmFwcGVkSGFuZGxlciA9IGNhcHR1cmVDb25zb2xlTG9ncyhoYW5kbGVyLCBxdWlldCk7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgICAgICAgYm9keTogZGF0YS5ib2R5IHx8IG51bGwsXG4gICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgYXBpR2F0ZXdheToge1xuICAgICAgICAgICAgICAgICAgZW5kcG9pbnQ6IGB3czovL2xvY2FsaG9zdDoke3dzUG9ydH1gXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQ6ICd0ZXN0LWNvbm5lY3Rpb24taWQnLFxuICAgICAgICAgICAgICAgIHJvdXRlS2V5OiBkYXRhLmFjdGlvbiB8fCAnJGRlZmF1bHQnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgICAgICAgIGF3c1JlcXVlc3RJZDogJ3Rlc3QtcmVxdWVzdC1pZCcsXG4gICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogbWF0Y2hlZEZ1bmN0aW9uLFxuICAgICAgICAgICAgICBmdW5jdGlvblZlcnNpb246ICckTEFURVNUJyxcbiAgICAgICAgICAgICAgZ2V0UmVtYWluaW5nVGltZUluTWlsbGlzOiAoKSA9PiAzMDAwMCxcbiAgICAgICAgICAgICAgaW52b2tlZEZ1bmN0aW9uQXJuOiBgYXJuOmF3czpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjoke21hdGNoZWRGdW5jdGlvbn1gLFxuICAgICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke21hdGNoZWRGdW5jdGlvbn1gLFxuICAgICAgICAgICAgICBsb2dTdHJlYW1OYW1lOiAndGVzdC1sb2ctc3RyZWFtJyxcbiAgICAgICAgICAgICAgbWVtb3J5TGltaXRJbk1COiAnMTI4J1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd3JhcHBlZEhhbmRsZXIoZXZlbnQsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICAvLyBIYW5kbGUgTGFtYmRhIHJlc3BvbnNlIGZvcm1hdCBmb3IgV2ViU29ja2V0XG4gICAgICAgICAgICBpZihyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0LnN0YXR1c0NvZGUpIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIExhbWJkYSByZXNwb25zZSBvYmplY3QsIGV4dHJhY3QgdGhlIGJvZHlcbiAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHJlc3VsdC5ib2R5IHx8ICcnO1xuICAgICAgICAgICAgICB3cy5zZW5kKGJvZHkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGRpcmVjdCByZXNwb25zZSwgc3RyaW5naWZ5IGl0XG4gICAgICAgICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoe2Vycm9yOiAnSGFuZGxlciBub3QgZm91bmQnfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3cy5zZW5kKEpTT04uc3RyaW5naWZ5KHtlcnJvcjogJ1dlYlNvY2tldCBmdW5jdGlvbiBub3QgZm91bmQnfSkpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGxvZyhgV2ViU29ja2V0IGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgZmFsc2UpO1xuICAgICAgICB3cy5zZW5kKEpTT04uc3RyaW5naWZ5KHtlcnJvcjogZXJyb3IubWVzc2FnZX0pKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHdzLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIGxvZygnV2ViU29ja2V0IGNvbm5lY3Rpb24gY2xvc2VkJywgJ2luZm8nLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiB3c3M7XG59O1xuXG5jb25zdCBsb2FkRW52RmlsZSA9IChlbnZQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+IHtcbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGlmKCFleGlzdHNTeW5jKGVudlBhdGgpKSB7XG4gICAgcmV0dXJuIGVudlZhcnM7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGVudkNvbnRlbnQgPSByZWFkRmlsZVN5bmMoZW52UGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBsaW5lcyA9IGVudkNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuXG4gICAgZm9yKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZS50cmltKCk7XG5cbiAgICAgIC8vIFNraXAgZW1wdHkgbGluZXMgYW5kIGNvbW1lbnRzXG4gICAgICBpZighdHJpbW1lZExpbmUgfHwgdHJpbW1lZExpbmUuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBQYXJzZSBLRVk9dmFsdWUgZm9ybWF0XG4gICAgICBjb25zdCBlcXVhbEluZGV4ID0gdHJpbW1lZExpbmUuaW5kZXhPZignPScpO1xuICAgICAgaWYoZXF1YWxJbmRleCA+IDApIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdHJpbW1lZExpbmUuc3Vic3RyaW5nKDAsIGVxdWFsSW5kZXgpLnRyaW0oKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0cmltbWVkTGluZS5zdWJzdHJpbmcoZXF1YWxJbmRleCArIDEpLnRyaW0oKTtcblxuICAgICAgICAvLyBSZW1vdmUgcXVvdGVzIGlmIHByZXNlbnRcbiAgICAgICAgY29uc3QgY2xlYW5WYWx1ZSA9IHZhbHVlLnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgJycpO1xuXG4gICAgICAgIGlmKGtleSkge1xuICAgICAgICAgIGVudlZhcnNba2V5XSA9IGNsZWFuVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYFdhcm5pbmc6IENvdWxkIG5vdCBsb2FkIC5lbnYgZmlsZSBhdCAke2VudlBhdGh9OiAke2Vycm9yLm1lc3NhZ2V9YCwgJ3dhcm4nLCBmYWxzZSk7XG4gIH1cblxuICByZXR1cm4gZW52VmFycztcbn07XG5cbmV4cG9ydCBjb25zdCBzZXJ2ZXJsZXNzID0gYXN5bmMgKFxuICBjbWQ6IFNlcnZlcmxlc3NPcHRpb25zLFxuICBjYWxsYmFjazogU2VydmVybGVzc0NhbGxiYWNrID0gKCkgPT4gKHt9KVxuKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgY29uc3Qge1xuICAgIGNsaU5hbWUgPSAnTGV4JyxcbiAgICBjb25maWcsXG4gICAgZGVidWcgPSBmYWxzZSxcbiAgICBob3N0ID0gJ2xvY2FsaG9zdCcsXG4gICAgaHR0cFBvcnQgPSA1MDAwLFxuICAgIGh0dHBzUG9ydCA9IDUwMDEsXG4gICAgcXVpZXQgPSBmYWxzZSxcbiAgICByZW1vdmUgPSBmYWxzZSxcbiAgICB0ZXN0ID0gZmFsc2UsXG4gICAgdXNlUHVibGljSXAsXG4gICAgdmFyaWFibGVzLFxuICAgIHdzUG9ydCA9IDUwMDJcbiAgfSA9IGNtZDtcblxuICBjb25zdCBzcGlubmVyID0gY3JlYXRlU3Bpbm5lcihxdWlldCk7XG5cbiAgbG9nKGAke2NsaU5hbWV9IHN0YXJ0aW5nIHNlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyLi4uYCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgYXdhaXQgTGV4Q29uZmlnLnBhcnNlQ29uZmlnKGNtZCk7XG5cbiAgY29uc3Qge291dHB1dEZ1bGxQYXRofSA9IExleENvbmZpZy5jb25maWc7XG5cbiAgLy8gTG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAuZW52IGZpbGVzXG4gIGNvbnN0IGVudlBhdGhzID0gW1xuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICcuZW52JyksXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy5lbnYubG9jYWwnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLmVudi5kZXZlbG9wbWVudCcpXG4gIF07XG5cbiAgbGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAvLyBMb2FkIGZyb20gLmVudiBmaWxlcyBpbiBvcmRlciAobGF0ZXIgZmlsZXMgb3ZlcnJpZGUgZWFybGllciBvbmVzKVxuICBmb3IoY29uc3QgZW52UGF0aCBvZiBlbnZQYXRocykge1xuICAgIGNvbnN0IGZpbGVFbnZWYXJzID0gbG9hZEVudkZpbGUoZW52UGF0aCk7XG4gICAgaWYoT2JqZWN0LmtleXMoZmlsZUVudlZhcnMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZyhgTG9hZGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tOiAke2VudlBhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgfVxuICAgIGVudlZhcnMgPSB7Li4uZW52VmFycywgLi4uZmlsZUVudlZhcnN9O1xuICB9XG5cbiAgLy8gU3RhcnQgd2l0aCBkZWZhdWx0IE5PREVfRU5WIGFuZCBsb2FkZWQgLmVudiB2YXJpYWJsZXNcbiAgbGV0IHZhcmlhYmxlc09iajogb2JqZWN0ID0ge05PREVfRU5WOiAnZGV2ZWxvcG1lbnQnLCAuLi5lbnZWYXJzfTtcblxuICAvLyBPdmVycmlkZSB3aXRoIGNvbW1hbmQgbGluZSB2YXJpYWJsZXMgaWYgcHJvdmlkZWRcbiAgaWYodmFyaWFibGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNsaVZhcnMgPSBKU09OLnBhcnNlKHZhcmlhYmxlcyk7XG4gICAgICB2YXJpYWJsZXNPYmogPSB7Li4udmFyaWFibGVzT2JqLCAuLi5jbGlWYXJzfTtcbiAgICB9IGNhdGNoKF9lcnJvcikge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgb3B0aW9uIGlzIG5vdCBhIHZhbGlkIEpTT04gb2JqZWN0LmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgcHJvY2Vzcy5lbnYgPSB7Li4ucHJvY2Vzcy5lbnYsIC4uLnZhcmlhYmxlc09ian07XG5cbiAgLy8gSWYgaW4gdGVzdCBtb2RlLCBleGl0IGVhcmx5IGFmdGVyIGxvYWRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gIGlmKHRlc3QpIHtcbiAgICBsb2coJ1Rlc3QgbW9kZTogRW52aXJvbm1lbnQgdmFyaWFibGVzIGxvYWRlZCwgZXhpdGluZycsICdpbmZvJywgcXVpZXQpO1xuICAgIGNhbGxiYWNrKDApO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaWYocmVtb3ZlKSB7XG4gICAgc3Bpbm5lci5zdGFydCgnQ2xlYW5pbmcgb3V0cHV0IGRpcmVjdG9yeS4uLicpO1xuICAgIGF3YWl0IHJlbW92ZUZpbGVzKG91dHB1dEZ1bGxQYXRoIHx8ICcnKTtcbiAgICBzcGlubmVyLnN1Y2NlZWQoJ1N1Y2Nlc3NmdWxseSBjbGVhbmVkIG91dHB1dCBkaXJlY3RvcnkhJyk7XG4gIH1cblxuICAvLyBMb2FkIHNlcnZlcmxlc3MgY29uZmlndXJhdGlvblxuICBsZXQgc2VydmVybGVzc0NvbmZpZzogU2VydmVybGVzc0NvbmZpZyA9IHt9O1xuXG4gIHRyeSB7XG4gICAgLy8gVXNlIGdldFBhY2thZ2VEaXIgdG8gaGFuZGxlIG5wbSB3b3Jrc3BhY2VzIGNvcnJlY3RseVxuICAgIGNvbnN0IHBhY2thZ2VEaXIgPSBnZXRQYWNrYWdlRGlyKCk7XG5cbiAgICAvLyBUcnkgbXVsdGlwbGUgY29uZmlnIGZpbGUgZm9ybWF0c1xuICAgIGNvbnN0IGNvbmZpZ0Zvcm1hdHMgPSBjb25maWcgPyBbY29uZmlnXSA6IFtcbiAgICAgIHBhdGhSZXNvbHZlKHBhY2thZ2VEaXIsICdsZXguY29uZmlnLm1qcycpLFxuICAgICAgcGF0aFJlc29sdmUocGFja2FnZURpciwgJ2xleC5jb25maWcuanMnKSxcbiAgICAgIHBhdGhSZXNvbHZlKHBhY2thZ2VEaXIsICdsZXguY29uZmlnLmNqcycpLFxuICAgICAgcGF0aFJlc29sdmUocGFja2FnZURpciwgJ2xleC5jb25maWcudHMnKVxuICAgIF07XG5cbiAgICBsZXQgY29uZmlnUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgZm9yKGNvbnN0IGNhbmRpZGF0ZVBhdGggb2YgY29uZmlnRm9ybWF0cykge1xuICAgICAgaWYoZXhpc3RzU3luYyhjYW5kaWRhdGVQYXRoKSkge1xuICAgICAgICBjb25maWdQYXRoID0gY2FuZGlkYXRlUGF0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYoY29uZmlnUGF0aCkge1xuICAgICAgbG9nKGBMb2FkaW5nIHNlcnZlcmxlc3MgY29uZmlnIGZyb206ICR7Y29uZmlnUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIGNvbnN0IGNvbmZpZ01vZHVsZSA9IGF3YWl0IGltcG9ydChjb25maWdQYXRoKTtcbiAgICAgIHNlcnZlcmxlc3NDb25maWcgPSBjb25maWdNb2R1bGUuZGVmYXVsdD8uc2VydmVybGVzcyB8fCBjb25maWdNb2R1bGUuc2VydmVybGVzcyB8fCB7fTtcbiAgICAgIGxvZygnU2VydmVybGVzcyBjb25maWcgbG9hZGVkIHN1Y2Nlc3NmdWxseScsICdpbmZvJywgcXVpZXQpO1xuICAgICAgY29uc3QgZnVuY3Rpb25OYW1lcyA9IE9iamVjdC5rZXlzKHNlcnZlcmxlc3NDb25maWcuZnVuY3Rpb25zIHx8IHt9KTtcbiAgICAgIGxvZyhgTG9hZGVkIGZ1bmN0aW9uczogJHtmdW5jdGlvbk5hbWVzLmxlbmd0aCA+IDAgPyBmdW5jdGlvbk5hbWVzLmpvaW4oJywgJykgOiAnbm9uZSd9YCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgICAgIC8vIERlYnVnOiBQcmludCBmdWxsIGNvbmZpZyBpZiBkZWJ1ZyBtb2RlXG4gICAgICBpZihkZWJ1Zykge1xuICAgICAgICBsb2coYEZ1bGwgc2VydmVybGVzcyBjb25maWc6ICR7SlNPTi5zdHJpbmdpZnkoc2VydmVybGVzc0NvbmZpZywgbnVsbCwgMil9YCwgJ2luZm8nLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZyhgTm8gc2VydmVybGVzcyBjb25maWcgZm91bmQuIFRyaWVkOiAke2NvbmZpZ0Zvcm1hdHMuam9pbignLCAnKX1gLCAnd2FybicsIHF1aWV0KTtcbiAgICB9XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYEVycm9yIGxvYWRpbmcgc2VydmVybGVzcyBjb25maWc6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgaWYoZGVidWcpIHtcbiAgICAgIGxvZyhgQ29uZmlnIGVycm9yIHN0YWNrOiAke2Vycm9yLnN0YWNrfWAsICdlcnJvcicsIGZhbHNlKTtcbiAgICB9XG4gICAgLy8gRG9uJ3QgZXhpdCwgY29udGludWUgd2l0aCBlbXB0eSBjb25maWdcbiAgfVxuXG4gIC8vIE1lcmdlIGNvbmZpZyB3aXRoIGNvbW1hbmQgbGluZSBvcHRpb25zXG4gIGNvbnN0IGZpbmFsQ29uZmlnOiBTZXJ2ZXJsZXNzQ29uZmlnID0ge1xuICAgIC4uLnNlcnZlcmxlc3NDb25maWcsXG4gICAgY3VzdG9tOiB7XG4gICAgICAnc2VydmVybGVzcy1vZmZsaW5lJzoge1xuICAgICAgICBjb3JzOiBzZXJ2ZXJsZXNzQ29uZmlnLmN1c3RvbT8uWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXT8uY29ycyAhPT0gZmFsc2UsXG4gICAgICAgIGhvc3Q6IHNlcnZlcmxlc3NDb25maWcuY3VzdG9tPy5bJ3NlcnZlcmxlc3Mtb2ZmbGluZSddPy5ob3N0IHx8IGhvc3QsXG4gICAgICAgIGh0dHBQb3J0OiBzZXJ2ZXJsZXNzQ29uZmlnLmN1c3RvbT8uWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXT8uaHR0cFBvcnQgfHwgaHR0cFBvcnQsXG4gICAgICAgIGh0dHBzUG9ydDogc2VydmVybGVzc0NvbmZpZy5jdXN0b20/Llsnc2VydmVybGVzcy1vZmZsaW5lJ10/Lmh0dHBzUG9ydCB8fCBodHRwc1BvcnQsXG4gICAgICAgIHdzUG9ydDogc2VydmVybGVzc0NvbmZpZy5jdXN0b20/Llsnc2VydmVybGVzcy1vZmZsaW5lJ10/LndzUG9ydCB8fCB3c1BvcnRcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgb3V0cHV0RGlyID0gb3V0cHV0RnVsbFBhdGggfHwgJ2xpYic7XG4gIGxvZyhgVXNpbmcgb3V0cHV0IGRpcmVjdG9yeTogJHtvdXRwdXREaXJ9YCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgdHJ5IHtcbiAgICBzcGlubmVyLnN0YXJ0KCdTdGFydGluZyBzZXJ2ZXJsZXNzIGRldmVsb3BtZW50IHNlcnZlci4uLicpO1xuXG4gICAgY29uc3QgaHR0cFBvcnQgPSBmaW5hbENvbmZpZy5jdXN0b20hWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXSEuaHR0cFBvcnQhO1xuICAgIGNvbnN0IHdzUG9ydCA9IGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS53c1BvcnQhO1xuICAgIGNvbnN0IGhvc3QgPSBmaW5hbENvbmZpZy5jdXN0b20hWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXSEuaG9zdCE7XG5cbiAgICBsb2coYENyZWF0aW5nIEhUVFAgc2VydmVyIG9uICR7aG9zdH06JHtodHRwUG9ydH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICBsb2coYENyZWF0aW5nIFdlYlNvY2tldCBzZXJ2ZXIgb24gcG9ydCAke3dzUG9ydH1gLCAnaW5mbycsIHF1aWV0KTtcblxuICAgIC8vIENyZWF0ZSBFeHByZXNzIHNlcnZlclxuICAgIGNvbnN0IGV4cHJlc3NBcHAgPSBhd2FpdCBjcmVhdGVFeHByZXNzU2VydmVyKFxuICAgICAgZmluYWxDb25maWcsXG4gICAgICBvdXRwdXREaXIsXG4gICAgICBodHRwUG9ydCxcbiAgICAgIGhvc3QsXG4gICAgICBxdWlldCxcbiAgICAgIGRlYnVnXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBXZWJTb2NrZXQgc2VydmVyXG4gICAgY29uc3Qgd3NTZXJ2ZXIgPSBjcmVhdGVXZWJTb2NrZXRTZXJ2ZXIoXG4gICAgICBmaW5hbENvbmZpZyxcbiAgICAgIG91dHB1dERpcixcbiAgICAgIHdzUG9ydCxcbiAgICAgIHF1aWV0LFxuICAgICAgZGVidWdcbiAgICApO1xuXG4gICAgLy8gSGFuZGxlIHNlcnZlciBlcnJvcnNcbiAgICB3c1NlcnZlci5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIGxvZyhgV2ViU29ja2V0IHNlcnZlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIHN0YXJ0IFdlYlNvY2tldCBzZXJ2ZXIuJyk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcblxuICAgIC8vIFN0YXJ0IEV4cHJlc3Mgc2VydmVyXG4gICAgY29uc3Qgc2VydmVyID0gZXhwcmVzc0FwcC5saXN0ZW4oaHR0cFBvcnQsIGhvc3QsICgpID0+IHtcbiAgICAgIHNwaW5uZXIuc3VjY2VlZCgnU2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIgc3RhcnRlZC4nKTtcblxuICAgICAgZGlzcGxheVNlcnZlclN0YXR1cyhcbiAgICAgICAgaHR0cFBvcnQsXG4gICAgICAgIGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS5odHRwc1BvcnQhLFxuICAgICAgICB3c1BvcnQsXG4gICAgICAgIGhvc3QsXG4gICAgICAgIHF1aWV0XG4gICAgICApO1xuXG4gICAgICBmZXRjaFB1YmxpY0lwKHVzZVB1YmxpY0lwKS50aGVuKChwdWJsaWNJcCkgPT4ge1xuICAgICAgICBpZihwdWJsaWNJcCkge1xuICAgICAgICAgIGRpc3BsYXlTZXJ2ZXJTdGF0dXMoXG4gICAgICAgICAgICBodHRwUG9ydCxcbiAgICAgICAgICAgIGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS5odHRwc1BvcnQhLFxuICAgICAgICAgICAgd3NQb3J0LFxuICAgICAgICAgICAgaG9zdCxcbiAgICAgICAgICAgIHF1aWV0LFxuICAgICAgICAgICAgcHVibGljSXBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBFeHByZXNzIHNlcnZlciBlcnJvcnNcbiAgICBzZXJ2ZXIub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICBsb2coYEV4cHJlc3Mgc2VydmVyIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gc3RhcnQgRXhwcmVzcyBzZXJ2ZXIuJyk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBncmFjZWZ1bCBzaHV0ZG93blxuICAgIGNvbnN0IHNodXRkb3duID0gKCkgPT4ge1xuICAgICAgbG9nKCdcXG5TaHV0dGluZyBkb3duIHNlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyLi4uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgIHdzU2VydmVyLmNsb3NlKCk7XG4gICAgICBjYWxsYmFjaygwKTtcbiAgICB9O1xuXG4gICAgcHJvY2Vzcy5vbignU0lHSU5UJywgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBzaHV0ZG93bik7XG5cbiAgICAvLyBLZWVwIHRoZSBwcm9jZXNzIGFsaXZlXG4gICAgcHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTtcblxuICAgIGxvZygnU2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIgaXMgcnVubmluZy4gUHJlc3MgQ3RybCtDIHRvIHN0b3AuJywgJ2luZm8nLCBxdWlldCk7XG5cbiAgICAvLyBEb24ndCBjYWxsIGNhbGxiYWNrIGhlcmUsIGxldCB0aGUgcHJvY2VzcyBzdGF5IGFsaXZlXG4gICAgcmV0dXJuIDA7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gc3RhcnQgc2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIuJyk7XG4gICAgY2FsbGJhY2soMSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn07Il0sIm5hbWVzIjpbImJveGVuIiwiY2hhbGsiLCJleHByZXNzIiwicmVhZEZpbGVTeW5jIiwiZXhpc3RzU3luYyIsIm1rZGlyU3luYyIsIndyaXRlRmlsZVN5bmMiLCJob21lZGlyIiwicmVzb2x2ZSIsInBhdGhSZXNvbHZlIiwiam9pbiIsImlzQWJzb2x1dGUiLCJXZWJTb2NrZXRTZXJ2ZXIiLCJMZXhDb25maWciLCJnZXRQYWNrYWdlRGlyIiwiY3JlYXRlU3Bpbm5lciIsInJlbW92ZUZpbGVzIiwibG9nIiwiZ2V0Q2FjaGVEaXIiLCJjYWNoZURpciIsInJlY3Vyc2l2ZSIsImdldENhY2hlUGF0aCIsInJlYWRQdWJsaWNJcENhY2hlIiwiY2FjaGVQYXRoIiwiY2FjaGVEYXRhIiwiY2FjaGUiLCJKU09OIiwicGFyc2UiLCJvbmVXZWVrTXMiLCJEYXRlIiwibm93IiwidGltZXN0YW1wIiwid3JpdGVQdWJsaWNJcENhY2hlIiwiaXAiLCJzdHJpbmdpZnkiLCJmZXRjaFB1YmxpY0lwIiwiZm9yY2VSZWZyZXNoIiwiUHJvbWlzZSIsImNhY2hlZCIsImZldGNoIiwidGhlbiIsInJlcyIsInRleHQiLCJkYXRhIiwidHJpbSIsImNhdGNoIiwidW5kZWZpbmVkIiwiZGlzcGxheVNlcnZlclN0YXR1cyIsImh0dHBQb3J0IiwiaHR0cHNQb3J0Iiwid3NQb3J0IiwiaG9zdCIsInF1aWV0IiwicHVibGljSXAiLCJodHRwVXJsIiwiaHR0cHNVcmwiLCJ3c1VybCIsIndzc1VybCIsInVybExpbmVzIiwiZ3JlZW4iLCJ1bmRlcmxpbmUiLCJzdGF0dXNCb3giLCJjeWFuIiwiYm9sZCIsInllbGxvdyIsImJhY2tncm91bmRDb2xvciIsImJvcmRlckNvbG9yIiwiYm9yZGVyU3R5bGUiLCJtYXJnaW4iLCJwYWRkaW5nIiwiY29uc29sZSIsImxvYWRIYW5kbGVyIiwiaGFuZGxlclBhdGgiLCJvdXRwdXREaXIiLCJmdWxsUGF0aCIsImV4dGVuc2lvbnMiLCJwYXRoV2l0aG91dEV4dCIsInJlcGxhY2UiLCJleHQiLCJjYW5kaWRhdGVQYXRoIiwiZXJyb3IiLCJFcnJvciIsImltcG9ydFBhdGgiLCJlbmRzV2l0aCIsImhhbmRsZXJNb2R1bGUiLCJPYmplY3QiLCJrZXlzIiwiaGFuZGxlciIsImRlZmF1bHQiLCJpbXBvcnRFcnJvciIsIm1lc3NhZ2UiLCJzdGFjayIsImNhcHR1cmVDb25zb2xlTG9ncyIsImV2ZW50IiwiY29udGV4dCIsIm9yaWdpbmFsQ29uc29sZUxvZyIsIm9yaWdpbmFsQ29uc29sZUVycm9yIiwib3JpZ2luYWxDb25zb2xlV2FybiIsIndhcm4iLCJvcmlnaW5hbENvbnNvbGVJbmZvIiwiaW5mbyIsImxvZ3MiLCJhcmdzIiwicHVzaCIsInJlc3VsdCIsImxlbmd0aCIsImdyYXkiLCJmb3JFYWNoIiwiY3JlYXRlRXhwcmVzc1NlcnZlciIsImNvbmZpZyIsImRlYnVnIiwiYXBwIiwidXNlIiwicmVxIiwibmV4dCIsImhlYWRlciIsIm1ldGhvZCIsInNlbmRTdGF0dXMiLCJqc29uIiwibG9hZEdyYXBoUUxTY2hlbWEiLCJncmFwaHFsSGFuZGxlciIsImZ1bmN0aW9ucyIsImZ1bmN0aW9uTmFtZSIsImZ1bmN0aW9uQ29uZmlnIiwiZW50cmllcyIsImV2ZW50cyIsImh0dHAiLCJwYXRoIiwiZ3JhcGhxbFBhdGgiLCJfZnVuY3Rpb25OYW1lIiwiYm9keSIsInF1ZXJ5IiwidmFyaWFibGVzIiwib3BlcmF0aW9uTmFtZSIsImxvZ01lc3NhZ2UiLCJtYXAiLCJhcmciLCJTdHJpbmciLCJhd3NSZXF1ZXN0SWQiLCJmdW5jdGlvblZlcnNpb24iLCJnZXRSZW1haW5pbmdUaW1lSW5NaWxsaXMiLCJpbnZva2VkRnVuY3Rpb25Bcm4iLCJsb2dHcm91cE5hbWUiLCJsb2dTdHJlYW1OYW1lIiwid3JhcHBlZEhhbmRsZXIiLCJoZWFkZXJzIiwiaHR0cE1ldGhvZCIsInF1ZXJ5U3RyaW5nUGFyYW1ldGVycyIsInN0YXR1c0NvZGUiLCJzdGF0dXMiLCJrZXkiLCJ2YWx1ZSIsInNldEhlYWRlciIsInNlbmQiLCJ1cmwiLCJwYXRobmFtZSIsInNwbGl0IiwibWF0Y2hlZEZ1bmN0aW9uIiwiZnVuY3Rpb25OYW1lcyIsImV2ZW50UGF0aCIsImV2ZW50TWV0aG9kIiwidG9VcHBlckNhc2UiLCJyZXF1ZXN0TWV0aG9kIiwibm9ybWFsaXplZEV2ZW50UGF0aCIsIm5vcm1hbGl6ZWRQYXRobmFtZSIsIm1lbW9yeUxpbWl0SW5NQiIsImNyZWF0ZVdlYlNvY2tldFNlcnZlciIsIndzcyIsInBvcnQiLCJvbiIsIndzIiwidG9TdHJpbmciLCJ3ZWJzb2NrZXQiLCJyb3V0ZSIsImFjdGlvbiIsInJlcXVlc3RDb250ZXh0IiwiYXBpR2F0ZXdheSIsImVuZHBvaW50IiwiY29ubmVjdGlvbklkIiwicm91dGVLZXkiLCJsb2FkRW52RmlsZSIsImVudlBhdGgiLCJlbnZWYXJzIiwiZW52Q29udGVudCIsImxpbmVzIiwibGluZSIsInRyaW1tZWRMaW5lIiwic3RhcnRzV2l0aCIsImVxdWFsSW5kZXgiLCJpbmRleE9mIiwic3Vic3RyaW5nIiwiY2xlYW5WYWx1ZSIsInNlcnZlcmxlc3MiLCJjbWQiLCJjYWxsYmFjayIsImNsaU5hbWUiLCJyZW1vdmUiLCJ0ZXN0IiwidXNlUHVibGljSXAiLCJzcGlubmVyIiwicGFyc2VDb25maWciLCJvdXRwdXRGdWxsUGF0aCIsImVudlBhdGhzIiwicHJvY2VzcyIsImN3ZCIsImZpbGVFbnZWYXJzIiwidmFyaWFibGVzT2JqIiwiTk9ERV9FTlYiLCJjbGlWYXJzIiwiX2Vycm9yIiwiZW52Iiwic3RhcnQiLCJzdWNjZWVkIiwic2VydmVybGVzc0NvbmZpZyIsInBhY2thZ2VEaXIiLCJjb25maWdGb3JtYXRzIiwiY29uZmlnUGF0aCIsImNvbmZpZ01vZHVsZSIsImZpbmFsQ29uZmlnIiwiY3VzdG9tIiwiY29ycyIsImV4cHJlc3NBcHAiLCJ3c1NlcnZlciIsImZhaWwiLCJzZXJ2ZXIiLCJsaXN0ZW4iLCJzaHV0ZG93biIsImNsb3NlIiwic3RkaW4iLCJyZXN1bWUiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELE9BQU9BLFdBQVcsUUFBUTtBQUMxQixPQUFPQyxXQUFXLFFBQVE7QUFDMUIsT0FBT0MsYUFBYSxVQUFVO0FBQzlCLFNBQVFDLFlBQVksRUFBRUMsVUFBVSxFQUFFQyxTQUFT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
810
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9zZXJ2ZXJsZXNzL3NlcnZlcmxlc3MudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCBib3hlbiBmcm9tICdib3hlbic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge3JlYWRGaWxlU3luYywgZXhpc3RzU3luYywgbWtkaXJTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge2hvbWVkaXJ9IGZyb20gJ29zJztcbmltcG9ydCB7cmVzb2x2ZSBhcyBwYXRoUmVzb2x2ZSwgam9pbiwgaXNBYnNvbHV0ZX0gZnJvbSAncGF0aCc7XG5pbXBvcnQge3BhdGhUb0ZpbGVVUkx9IGZyb20gJ3VybCc7XG5pbXBvcnQge1dlYlNvY2tldFNlcnZlcn0gZnJvbSAnd3MnO1xuXG5pbXBvcnQge0xleENvbmZpZywgZ2V0UGFja2FnZURpcn0gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y3JlYXRlU3Bpbm5lciwgcmVtb3ZlRmlsZXN9IGZyb20gJy4uLy4uL3V0aWxzL2FwcC5qcyc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2ZXJsZXNzT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNsaU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbmZpZz86IHN0cmluZztcbiAgcmVhZG9ubHkgZGVidWc/OiBib29sZWFuO1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuICByZWFkb25seSBodHRwUG9ydD86IG51bWJlcjtcbiAgcmVhZG9ubHkgaHR0cHNQb3J0PzogbnVtYmVyO1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJlbW92ZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRlc3Q/OiBib29sZWFuO1xuICByZWFkb25seSB1c2VQdWJsaWNJcD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHZhcmlhYmxlcz86IHN0cmluZztcbiAgcmVhZG9ubHkgd3NQb3J0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBTZXJ2ZXJsZXNzQ2FsbGJhY2sgPSAoc3RhdHVzOiBudW1iZXIpPT4gdm9pZDtcblxuaW50ZXJmYWNlIFB1YmxpY0lwQ2FjaGUge1xuICBpcDogc3RyaW5nO1xuICB0aW1lc3RhbXA6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFNlcnZlcmxlc3NIYW5kbGVyIHtcbiAgcmVhZG9ubHkgaGFuZGxlcjogc3RyaW5nO1xuICByZWFkb25seSBldmVudHM/OiBBcnJheTx7XG4gICAgcmVhZG9ubHkgaHR0cD86IHtcbiAgICAgIHJlYWRvbmx5IGNvcnM/OiBib29sZWFuO1xuICAgICAgcmVhZG9ubHkgbWV0aG9kPzogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcbiAgICB9O1xuICAgIHJlYWRvbmx5IHdlYnNvY2tldD86IHtcbiAgICAgIHJlYWRvbmx5IHJvdXRlPzogc3RyaW5nO1xuICAgIH07XG4gIH0+O1xufVxuXG5pbnRlcmZhY2UgU2VydmVybGVzc0NvbmZpZyB7XG4gIHJlYWRvbmx5IGN1c3RvbT86IHtcbiAgICByZWFkb25seSAnc2VydmVybGVzcy1vZmZsaW5lJz86IHtcbiAgICAgIHJlYWRvbmx5IGNvcnM/OiBib29sZWFuO1xuICAgICAgcmVhZG9ubHkgaG9zdD86IHN0cmluZztcbiAgICAgIHJlYWRvbmx5IGh0dHBQb3J0PzogbnVtYmVyO1xuICAgICAgcmVhZG9ubHkgaHR0cHNQb3J0PzogbnVtYmVyO1xuICAgICAgcmVhZG9ubHkgd3NQb3J0PzogbnVtYmVyO1xuICAgIH07XG4gIH07XG4gIHJlYWRvbmx5IGZ1bmN0aW9ucz86IFJlY29yZDxzdHJpbmcsIFNlcnZlcmxlc3NIYW5kbGVyPjtcbn1cblxuY29uc3QgZ2V0Q2FjaGVEaXIgPSAoKTogc3RyaW5nID0+IHtcbiAgY29uc3QgY2FjaGVEaXIgPSBqb2luKGhvbWVkaXIoKSwgJy5sZXgtY2FjaGUnKTtcbiAgaWYoIWV4aXN0c1N5bmMoY2FjaGVEaXIpKSB7XG4gICAgbWtkaXJTeW5jKGNhY2hlRGlyLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG4gIH1cbiAgcmV0dXJuIGNhY2hlRGlyO1xufTtcblxuY29uc3QgZ2V0Q2FjaGVQYXRoID0gKCk6IHN0cmluZyA9PiBqb2luKGdldENhY2hlRGlyKCksICdwdWJsaWMtaXAuanNvbicpO1xuXG5jb25zdCByZWFkUHVibGljSXBDYWNoZSA9ICgpOiBQdWJsaWNJcENhY2hlIHwgbnVsbCA9PiB7XG4gIGNvbnN0IGNhY2hlUGF0aCA9IGdldENhY2hlUGF0aCgpO1xuICBpZighZXhpc3RzU3luYyhjYWNoZVBhdGgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGNhY2hlRGF0YSA9IHJlYWRGaWxlU3luYyhjYWNoZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgY2FjaGU6IFB1YmxpY0lwQ2FjaGUgPSBKU09OLnBhcnNlKGNhY2hlRGF0YSk7XG5cbiAgICAvLyBDaGVjayBpZiBjYWNoZSBpcyBvbGRlciB0aGFuIDEgd2Vla1xuICAgIGNvbnN0IG9uZVdlZWtNcyA9IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuICAgIGlmKERhdGUubm93KCkgLSBjYWNoZS50aW1lc3RhbXAgPiBvbmVXZWVrTXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBjYWNoZTtcbiAgfSBjYXRjaHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcblxuY29uc3Qgd3JpdGVQdWJsaWNJcENhY2hlID0gKGlwOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgY29uc3QgY2FjaGVQYXRoID0gZ2V0Q2FjaGVQYXRoKCk7XG4gIGNvbnN0IGNhY2hlOiBQdWJsaWNJcENhY2hlID0ge1xuICAgIGlwLFxuICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuICB9O1xuICB3cml0ZUZpbGVTeW5jKGNhY2hlUGF0aCwgSlNPTi5zdHJpbmdpZnkoY2FjaGUsIG51bGwsIDIpKTtcbn07XG5cbmNvbnN0IGZldGNoUHVibGljSXAgPSAoZm9yY2VSZWZyZXNoOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4gPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgaWYoIWZvcmNlUmVmcmVzaCkge1xuICAgIGNvbnN0IGNhY2hlZCA9IHJlYWRQdWJsaWNJcENhY2hlKCk7XG4gICAgaWYoY2FjaGVkKSB7XG4gICAgICByZXNvbHZlKGNhY2hlZC5pcCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLy8gVXNlIGZldGNoIGluc3RlYWQgb2YgaHR0cHNcbiAgZmV0Y2goJ2h0dHBzOi8vYXBpLmlwaWZ5Lm9yZycpXG4gICAgLnRoZW4oKHJlcykgPT4gcmVzLnRleHQoKSlcbiAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgaXAgPSBkYXRhLnRyaW0oKTtcbiAgICAgIGlmKGlwKSB7XG4gICAgICAgIHdyaXRlUHVibGljSXBDYWNoZShpcCk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKGlwKTtcbiAgICB9KVxuICAgIC5jYXRjaCgoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkpO1xufSk7XG5cbmNvbnN0IGRpc3BsYXlTZXJ2ZXJTdGF0dXMgPSAoXG4gIGh0dHBQb3J0OiBudW1iZXIsXG4gIGh0dHBzUG9ydDogbnVtYmVyLFxuICB3c1BvcnQ6IG51bWJlcixcbiAgaG9zdDogc3RyaW5nLFxuICBxdWlldDogYm9vbGVhbixcbiAgcHVibGljSXA/OiBzdHJpbmdcbikgPT4ge1xuICBpZihxdWlldCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGh0dHBVcmwgPSBgaHR0cDovLyR7aG9zdH06JHtodHRwUG9ydH1gO1xuICBjb25zdCBodHRwc1VybCA9IGBodHRwczovLyR7aG9zdH06JHtodHRwc1BvcnR9YDtcbiAgY29uc3Qgd3NVcmwgPSBgd3M6Ly8ke2hvc3R9OiR7d3NQb3J0fWA7XG4gIGNvbnN0IHdzc1VybCA9IGB3c3M6Ly8ke2hvc3R9OiR7d3NQb3J0fWA7XG5cbiAgbGV0IHVybExpbmVzID0gYCR7Y2hhbGsuZ3JlZW4oJ0hUVFA6Jyl9ICAgICAgJHtjaGFsay51bmRlcmxpbmUoaHR0cFVybCl9XFxuYDtcbiAgdXJsTGluZXMgKz0gYCR7Y2hhbGsuZ3JlZW4oJ0hUVFBTOicpfSAgICAgJHtjaGFsay51bmRlcmxpbmUoaHR0cHNVcmwpfVxcbmA7XG4gIHVybExpbmVzICs9IGAke2NoYWxrLmdyZWVuKCdXZWJTb2NrZXQ6Jyl9ICR7Y2hhbGsudW5kZXJsaW5lKHdzVXJsKX1cXG5gO1xuICB1cmxMaW5lcyArPSBgJHtjaGFsay5ncmVlbignV1NTOicpfSAgICAgICAke2NoYWxrLnVuZGVybGluZSh3c3NVcmwpfVxcbmA7XG5cbiAgaWYocHVibGljSXApIHtcbiAgICB1cmxMaW5lcyArPSBgXFxuJHtjaGFsay5ncmVlbignUHVibGljOicpfSAgICAke2NoYWxrLnVuZGVybGluZShgaHR0cDovLyR7cHVibGljSXB9OiR7aHR0cFBvcnR9YCl9XFxuYDtcbiAgfVxuXG4gIGNvbnN0IHN0YXR1c0JveCA9IGJveGVuKFxuICAgIGAke2NoYWxrLmN5YW4uYm9sZCgn8J+agCBTZXJ2ZXJsZXNzIERldmVsb3BtZW50IFNlcnZlciBSdW5uaW5nJyl9XFxuXFxuJHt1cmxMaW5lc31cXG5gICtcbiAgICBgJHtjaGFsay55ZWxsb3coJ1ByZXNzIEN0cmwrQyB0byBzdG9wIHRoZSBzZXJ2ZXInKX1gLFxuICAgIHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJyMxYTFhMWEnLFxuICAgICAgYm9yZGVyQ29sb3I6ICdjeWFuJyxcbiAgICAgIGJvcmRlclN0eWxlOiAncm91bmQnLFxuICAgICAgbWFyZ2luOiAxLFxuICAgICAgcGFkZGluZzogMVxuICAgIH1cbiAgKTtcblxuICBjb25zb2xlLmxvZyhgXFxuJHtzdGF0dXNCb3h9XFxuYCk7XG59O1xuXG5jb25zdCBsb2FkSGFuZGxlciA9IGFzeW5jIChoYW5kbGVyUGF0aDogc3RyaW5nLCBvdXRwdXREaXI6IHN0cmluZykgPT4ge1xuICB0cnkge1xuICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gUGFyc2luZyBoYW5kbGVyIHBhdGg6ICR7aGFuZGxlclBhdGh9YCk7XG5cbiAgICAvLyBQYXJzZSBBV1MgTGFtYmRhIGhhbmRsZXIgZm9ybWF0OiBcInBhdGgvdG8vZmlsZS5leHBvcnROYW1lXCIgb3IgXCJmaWxlLmV4cG9ydE5hbWVcIlxuICAgIC8vIEV4YW1wbGVzOiBcImluZGV4LmhhbmRsZXJcIiwgXCJoYW5kbGVycy9hcGkuaGFuZGxlclwiLCBcInNyYy9pbmRleC5kZWZhdWx0XCJcbiAgICBjb25zdCBoYW5kbGVyUGFydHMgPSBoYW5kbGVyUGF0aC5zcGxpdCgnLicpO1xuICAgIGNvbnNvbGUubG9nKCdbU2VydmVybGVzc10gSGFuZGxlciBwYXJ0cyBhZnRlciBzcGxpdDonLCBoYW5kbGVyUGFydHMpO1xuXG4gICAgbGV0IGZpbGVQYXRoOiBzdHJpbmc7XG4gICAgbGV0IGV4cG9ydE5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgaWYoaGFuZGxlclBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIEFXUyBMYW1iZGEgZm9ybWF0OiBcImZpbGUuZXhwb3J0TmFtZVwiXG4gICAgICAvLyBUYWtlIHRoZSBsYXN0IHBhcnQgYXMgZXhwb3J0IG5hbWUsIHJlc3QgYXMgZmlsZSBwYXRoXG4gICAgICAvLyBIYW5kbGUgY2FzZXMgbGlrZSBcImluZGV4LmhhbmRsZXJcIiAtPiBmaWxlOiBcImluZGV4XCIsIGV4cG9ydDogXCJoYW5kbGVyXCJcbiAgICAgIC8vIE9yIFwiaGFuZGxlcnMvYXBpLmhhbmRsZXJcIiAtPiBmaWxlOiBcImhhbmRsZXJzL2FwaVwiLCBleHBvcnQ6IFwiaGFuZGxlclwiXG4gICAgICBleHBvcnROYW1lID0gaGFuZGxlclBhcnRzW2hhbmRsZXJQYXJ0cy5sZW5ndGggLSAxXSB8fCBudWxsO1xuICAgICAgZmlsZVBhdGggPSBoYW5kbGVyUGFydHMuc2xpY2UoMCwgLTEpLmpvaW4oJy4nKTtcbiAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gUGFyc2VkIEFXUyBMYW1iZGEgZm9ybWF0IC0gZmlsZVBhdGg6IFwiJHtmaWxlUGF0aH1cIiwgZXhwb3J0TmFtZTogXCIke2V4cG9ydE5hbWV9XCJgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2ltcGxlIGZvcm1hdDoganVzdCB0aGUgZmlsZSBwYXRoXG4gICAgICBmaWxlUGF0aCA9IGhhbmRsZXJQYXRoO1xuICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBTaW1wbGUgZm9ybWF0IC0gZmlsZVBhdGg6IFwiJHtmaWxlUGF0aH1cImApO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBmaWxlUGF0aCBkb2Vzbid0IGhhdmUgdGhlIGV4cG9ydCBuYW1lIGluIGl0XG4gICAgaWYoZmlsZVBhdGguaW5jbHVkZXMoJy5oYW5kbGVyJykgfHwgZmlsZVBhdGguaW5jbHVkZXMoJy5kZWZhdWx0JykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtTZXJ2ZXJsZXNzXSBXQVJOSU5HOiBmaWxlUGF0aCBzdGlsbCBjb250YWlucyBleHBvcnQgbmFtZSEgZmlsZVBhdGg6IFwiJHtmaWxlUGF0aH1cImApO1xuICAgICAgLy8gVHJ5IHRvIGZpeCBpdCAtIHJlbW92ZSB0aGUgbGFzdCBwYXJ0IGlmIGl0IGxvb2tzIGxpa2UgYW4gZXhwb3J0IG5hbWVcbiAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IGZpbGVQYXRoLnNwbGl0KCcuJyk7XG4gICAgICBpZihwYXRoUGFydHMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zdCBsYXN0UGFydCA9IHBhdGhQYXJ0c1twYXRoUGFydHMubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmKFsnaGFuZGxlcicsICdkZWZhdWx0JywgJ2luZGV4J10uaW5jbHVkZXMobGFzdFBhcnQpICYmICFleHBvcnROYW1lKSB7XG4gICAgICAgICAgZXhwb3J0TmFtZSA9IGxhc3RQYXJ0O1xuICAgICAgICAgIGZpbGVQYXRoID0gcGF0aFBhcnRzLnNsaWNlKDAsIC0xKS5qb2luKCcuJyk7XG4gICAgICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBGaXhlZCAtIGZpbGVQYXRoOiBcIiR7ZmlsZVBhdGh9XCIsIGV4cG9ydE5hbWU6IFwiJHtleHBvcnROYW1lfVwiYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYm90aCByZWxhdGl2ZSBwYXRocyBhbmQgYWJzb2x1dGUgcGF0aHNcbiAgICBsZXQgZnVsbFBhdGg6IHN0cmluZztcbiAgICBpZihpc0Fic29sdXRlKGZpbGVQYXRoKSkge1xuICAgICAgZnVsbFBhdGggPSBmaWxlUGF0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgZnVsbFBhdGggPSBwYXRoUmVzb2x2ZShvdXRwdXREaXIsIGZpbGVQYXRoKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBSZXNvbHZlZCBmdWxsUGF0aCAoYmVmb3JlIGV4dGVuc2lvbnMpOiAke2Z1bGxQYXRofWApO1xuXG4gICAgLy8gVHJ5IGRpZmZlcmVudCBleHRlbnNpb25zIGlmIGZpbGUgZG9lc24ndCBleGlzdFxuICAgIGlmKCFleGlzdHNTeW5jKGZ1bGxQYXRoKSkge1xuICAgICAgY29uc3QgZXh0ZW5zaW9ucyA9IFsnLmpzJywgJy5tanMnLCAnLmNqcyddO1xuICAgICAgY29uc3QgcGF0aFdpdGhvdXRFeHQgPSBmdWxsUGF0aC5yZXBsYWNlKC9cXC4oanN8bWpzfGNqcykkLywgJycpO1xuICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBUcnlpbmcgZXh0ZW5zaW9ucy4gQmFzZSBwYXRoOiAke3BhdGhXaXRob3V0RXh0fWApO1xuICAgICAgZm9yKGNvbnN0IGV4dCBvZiBleHRlbnNpb25zKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZVBhdGggPSBwYXRoV2l0aG91dEV4dCArIGV4dDtcbiAgICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBDaGVja2luZzogJHtjYW5kaWRhdGVQYXRofSAoZXhpc3RzOiAke2V4aXN0c1N5bmMoY2FuZGlkYXRlUGF0aCl9KWApO1xuICAgICAgICBpZihleGlzdHNTeW5jKGNhbmRpZGF0ZVBhdGgpKSB7XG4gICAgICAgICAgZnVsbFBhdGggPSBjYW5kaWRhdGVQYXRoO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gRm91bmQgZmlsZSB3aXRoIGV4dGVuc2lvbjogJHtmdWxsUGF0aH1gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIEZpbGUgZXhpc3RzIHdpdGhvdXQgdHJ5aW5nIGV4dGVuc2lvbnM6ICR7ZnVsbFBhdGh9YCk7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBGaW5hbCBmdWxsUGF0aDogJHtmdWxsUGF0aH1gKTtcbiAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIEV4cG9ydCBuYW1lOiAke2V4cG9ydE5hbWUgfHwgJ2RlZmF1bHQvaGFuZGxlcid9YCk7XG4gICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBGaWxlIGV4aXN0czogJHtleGlzdHNTeW5jKGZ1bGxQYXRoKX1gKTtcblxuICAgIGlmKCFleGlzdHNTeW5jKGZ1bGxQYXRoKSkge1xuICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEhhbmRsZXIgZmlsZSBub3QgZm91bmQ6ICR7ZnVsbFBhdGh9YCk7XG4gICAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gT3V0cHV0IGRpcmVjdG9yeTogJHtvdXRwdXREaXJ9YCk7XG4gICAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gSGFuZGxlciBwYXRoIGZyb20gY29uZmlnOiAke2hhbmRsZXJQYXRofWApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBIYW5kbGVyIGZpbGUgbm90IGZvdW5kOiAke2Z1bGxQYXRofWApO1xuICAgIH1cblxuICAgIC8vIER5bmFtaWMgaW1wb3J0IG9mIHRoZSBoYW5kbGVyIHdpdGggYmV0dGVyIGVycm9yIGhhbmRsaW5nXG4gICAgLy8gQWRkIC5qcyBleHRlbnNpb24gaWYgaW1wb3J0aW5nIFR5cGVTY3JpcHQgY29tcGlsZWQgb3V0cHV0XG4gICAgY29uc3QgaW1wb3J0UGF0aCA9IGZ1bGxQYXRoLmVuZHNXaXRoKCcudHMnKSA/IGZ1bGxQYXRoLnJlcGxhY2UoL1xcLnRzJC8sICcuanMnKSA6IGZ1bGxQYXRoO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENvbnZlcnQgdG8gZmlsZTovLyBVUkwgZm9yIEVTIG1vZHVsZSBpbXBvcnRzIChyZXF1aXJlZCBmb3IgYWJzb2x1dGUgcGF0aHMpXG4gICAgICAvLyBVc2UgcGF0aFRvRmlsZVVSTCB0byBlbnN1cmUgcHJvcGVyIGZpbGU6Ly8gVVJMIGZvcm1hdFxuICAgICAgY29uc3QgaW1wb3J0VXJsID0gcGF0aFRvRmlsZVVSTChpbXBvcnRQYXRoKS5ocmVmO1xuICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBJbXBvcnRpbmcgaGFuZGxlciBmcm9tOiAke2ltcG9ydFVybH1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gRmlsZSBwYXRoOiAke2ltcG9ydFBhdGh9YCk7XG5cbiAgICAgIC8vIFVzZSBpbXBvcnQoKSB3aXRoIHRoZSBmaWxlIFVSTFxuICAgICAgLy8gTm90ZTogSWYgdGhlIGhhbmRsZXIgZmlsZSBoYXMgaW1wb3J0IGVycm9ycyAobGlrZSBtaXNzaW5nIGRlcGVuZGVuY2llcyksXG4gICAgICAvLyB0aG9zZSB3aWxsIHN1cmZhY2UgaGVyZSwgYnV0IHRoYXQncyBhIGhhbmRsZXIgY29kZSBpc3N1ZSwgbm90IGEgbG9hZGVyIGlzc3VlXG4gICAgICBjb25zdCBoYW5kbGVyTW9kdWxlID0gYXdhaXQgaW1wb3J0KGltcG9ydFVybCk7XG4gICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIEhhbmRsZXIgbW9kdWxlIGxvYWRlZCBzdWNjZXNzZnVsbHkuIEV4cG9ydHM6ICR7T2JqZWN0LmtleXMoaGFuZGxlck1vZHVsZSkuam9pbignLCAnKX1gKTtcblxuICAgICAgLy8gR2V0IHRoZSBoYW5kbGVyIGJhc2VkIG9uIGV4cG9ydCBuYW1lIG9yIHRyeSBkZWZhdWx0c1xuICAgICAgbGV0IGhhbmRsZXI6IGFueTtcbiAgICAgIGlmKGV4cG9ydE5hbWUpIHtcbiAgICAgICAgaGFuZGxlciA9IGhhbmRsZXJNb2R1bGVbZXhwb3J0TmFtZV07XG4gICAgICAgIGlmKCFoYW5kbGVyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEV4cG9ydCBcIiR7ZXhwb3J0TmFtZX1cIiBub3QgZm91bmQgaW4gbW9kdWxlLiBBdmFpbGFibGUgZXhwb3J0czogJHtPYmplY3Qua2V5cyhoYW5kbGVyTW9kdWxlKS5qb2luKCcsICcpfWApO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUcnkgZGVmYXVsdCwgaGFuZGxlciwgb3IgdGhlIG1vZHVsZSBpdHNlbGZcbiAgICAgICAgaGFuZGxlciA9IGhhbmRsZXJNb2R1bGUuZGVmYXVsdCB8fCBoYW5kbGVyTW9kdWxlLmhhbmRsZXIgfHwgaGFuZGxlck1vZHVsZTtcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBIYW5kbGVyIGZvdW5kOiAke3R5cGVvZiBoYW5kbGVyfSwgaXNGdW5jdGlvbjogJHt0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJ31gKTtcblxuICAgICAgaWYodHlwZW9mIGhhbmRsZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEhhbmRsZXIgaXMgbm90IGEgZnVuY3Rpb24uIFR5cGU6ICR7dHlwZW9mIGhhbmRsZXJ9LCBWYWx1ZTpgLCBoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBoYW5kbGVyO1xuICAgIH0gY2F0Y2goaW1wb3J0RXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEltcG9ydCBlcnJvciBmb3IgaGFuZGxlciAke2hhbmRsZXJQYXRofTpgLCBpbXBvcnRFcnJvci5tZXNzYWdlKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTZXJ2ZXJsZXNzXSBJbXBvcnQgZXJyb3Igc3RhY2s6JywgaW1wb3J0RXJyb3Iuc3RhY2spO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgZGVwZW5kZW5jeSByZXNvbHV0aW9uIGVycm9yIChjb21tb24gd2l0aCBFUyBtb2R1bGVzKVxuICAgICAgaWYoaW1wb3J0RXJyb3IubWVzc2FnZSAmJiBpbXBvcnRFcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdDYW5ub3QgZmluZCBtb2R1bGUnKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbU2VydmVybGVzc10gVGhpcyBhcHBlYXJzIHRvIGJlIGEgZGVwZW5kZW5jeSByZXNvbHV0aW9uIGVycm9yLicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbU2VydmVybGVzc10gVGhlIGhhbmRsZXIgZmlsZSBleGlzdHMsIGJ1dCBvbmUgb2YgaXRzIGltcG9ydHMgaXMgZmFpbGluZy4nKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1NlcnZlcmxlc3NdIENoZWNrIHRoYXQgYWxsIGRlcGVuZGVuY2llcyBpbiB0aGUgaGFuZGxlciBmaWxlIGFyZSBwcm9wZXJseSBpbnN0YWxsZWQuJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtTZXJ2ZXJsZXNzXSBIYW5kbGVyIGZpbGU6ICR7aW1wb3J0UGF0aH1gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1NlcnZlcmxlc3NdIE1ha2Ugc3VyZSB0aGUgaGFuZGxlciBhbmQgaXRzIGRlcGVuZGVuY2llcyBhcmUgY29tcGlsZWQgY29ycmVjdGx5LicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0gY2F0Y2goZXJyb3I6IGFueSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYFtTZXJ2ZXJsZXNzXSBFcnJvciBsb2FkaW5nIGhhbmRsZXIgJHtoYW5kbGVyUGF0aH06YCwgZXJyb3IubWVzc2FnZSk7XG4gICAgY29uc29sZS5lcnJvcignW1NlcnZlcmxlc3NdIEVycm9yIHN0YWNrOicsIGVycm9yLnN0YWNrKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcblxuY29uc3QgY2FwdHVyZUNvbnNvbGVMb2dzID0gKGhhbmRsZXI6IChldmVudDogYW55LCBjb250ZXh0OiBhbnkpPT4gUHJvbWlzZTxhbnk+LCBxdWlldDogYm9vbGVhbikgPT4ge1xuICBpZihxdWlldCkge1xuICAgIHJldHVybiBoYW5kbGVyO1xuICB9XG5cbiAgcmV0dXJuIGFzeW5jIChldmVudDogYW55LCBjb250ZXh0OiBhbnkpID0+IHtcbiAgICAvLyBDYXB0dXJlIGNvbnNvbGUubG9nLCBjb25zb2xlLmVycm9yLCBldGMuXG4gICAgY29uc3Qgb3JpZ2luYWxDb25zb2xlTG9nID0gY29uc29sZS5sb2c7XG4gICAgY29uc3Qgb3JpZ2luYWxDb25zb2xlRXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZVdhcm4gPSBjb25zb2xlLndhcm47XG4gICAgY29uc3Qgb3JpZ2luYWxDb25zb2xlSW5mbyA9IGNvbnNvbGUuaW5mbztcblxuICAgIGNvbnN0IGxvZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICBjb25zb2xlLmxvZyA9ICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgbG9ncy5wdXNoKGBbTE9HXSAke2FyZ3Muam9pbignICcpfWApO1xuICAgICAgb3JpZ2luYWxDb25zb2xlTG9nKC4uLmFyZ3MpO1xuICAgIH07XG5cbiAgICBjb25zb2xlLmVycm9yID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBsb2dzLnB1c2goYFtFUlJPUl0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICAgIG9yaWdpbmFsQ29uc29sZUVycm9yKC4uLmFyZ3MpO1xuICAgIH07XG5cbiAgICBjb25zb2xlLndhcm4gPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgIGxvZ3MucHVzaChgW1dBUk5dICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgICBvcmlnaW5hbENvbnNvbGVXYXJuKC4uLmFyZ3MpO1xuICAgIH07XG5cbiAgICBjb25zb2xlLmluZm8gPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgIGxvZ3MucHVzaChgW0lORk9dICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgICBvcmlnaW5hbENvbnNvbGVJbmZvKC4uLmFyZ3MpO1xuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlcihldmVudCwgY29udGV4dCk7XG5cbiAgICAgIC8vIE91dHB1dCBjYXB0dXJlZCBsb2dzXG4gICAgICBpZihsb2dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnLS0tIEhhbmRsZXIgQ29uc29sZSBPdXRwdXQgLS0tJykpO1xuICAgICAgICBsb2dzLmZvckVhY2goKGxvZykgPT4gY29uc29sZS5sb2coY2hhbGsuZ3JheShsb2cpKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJy0tLSBFbmQgSGFuZGxlciBDb25zb2xlIE91dHB1dCAtLS0nKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgY29uc29sZSBtZXRob2RzXG4gICAgICBjb25zb2xlLmxvZyA9IG9yaWdpbmFsQ29uc29sZUxvZztcbiAgICAgIGNvbnNvbGUuZXJyb3IgPSBvcmlnaW5hbENvbnNvbGVFcnJvcjtcbiAgICAgIGNvbnNvbGUud2FybiA9IG9yaWdpbmFsQ29uc29sZVdhcm47XG4gICAgICBjb25zb2xlLmluZm8gPSBvcmlnaW5hbENvbnNvbGVJbmZvO1xuICAgIH1cbiAgfTtcbn07XG5cbmNvbnN0IGNyZWF0ZUV4cHJlc3NTZXJ2ZXIgPSBhc3luYyAoXG4gIGNvbmZpZzogU2VydmVybGVzc0NvbmZpZyxcbiAgb3V0cHV0RGlyOiBzdHJpbmcsXG4gIGh0dHBQb3J0OiBudW1iZXIsXG4gIGhvc3Q6IHN0cmluZyxcbiAgcXVpZXQ6IGJvb2xlYW4sXG4gIGRlYnVnOiBib29sZWFuXG4pID0+IHtcbiAgY29uc3QgYXBwID0gZXhwcmVzcygpO1xuXG4gIC8vIEVuYWJsZSBDT1JTXG4gIGFwcC51c2UoKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgcmVzLmhlYWRlcignQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJywgJyonKTtcbiAgICByZXMuaGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzJywgJ0dFVCwgUE9TVCwgUFVULCBERUxFVEUsIFBBVENILCBPUFRJT05TJyk7XG4gICAgcmVzLmhlYWRlcignQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVycycsICcqJyk7XG4gICAgcmVzLmhlYWRlcignQWNjZXNzLUNvbnRyb2wtQWxsb3ctQ3JlZGVudGlhbHMnLCAndHJ1ZScpO1xuXG4gICAgaWYocmVxLm1ldGhvZCA9PT0gJ09QVElPTlMnKSB7XG4gICAgICByZXMuc2VuZFN0YXR1cygyMDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0KCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBQYXJzZSBKU09OIGJvZGllc1xuICBhcHAudXNlKGV4cHJlc3MuanNvbigpKTtcblxuICAvLyBMb2FkIEdyYXBoUUwgaGFuZGxlclxuICBjb25zdCBsb2FkR3JhcGhRTFNjaGVtYSA9IGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gVHJ5IHRvIGZpbmQgYSBHcmFwaFFMIGhhbmRsZXJcbiAgICAgIGxldCBncmFwaHFsSGFuZGxlciA9IG51bGw7XG5cbiAgICAgIGlmKGNvbmZpZy5mdW5jdGlvbnMpIHtcbiAgICAgICAgZm9yKGNvbnN0IFtmdW5jdGlvbk5hbWUsIGZ1bmN0aW9uQ29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcuZnVuY3Rpb25zKSkge1xuICAgICAgICAgIGlmKGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgZm9yKGNvbnN0IGV2ZW50IG9mIGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgICBpZihldmVudC5odHRwICYmIGV2ZW50Lmh0dHAucGF0aCkge1xuICAgICAgICAgICAgICAgIC8vIExvb2sgZm9yIEdyYXBoUUwgZW5kcG9pbnRzXG4gICAgICAgICAgICAgICAgaWYoZXZlbnQuaHR0cC5wYXRoID09PSAnL3B1YmxpYycgfHwgZXZlbnQuaHR0cC5wYXRoID09PSAnL2dyYXBocWwnKSB7XG4gICAgICAgICAgICAgICAgICBncmFwaHFsSGFuZGxlciA9IGF3YWl0IGxvYWRIYW5kbGVyKGZ1bmN0aW9uQ29uZmlnLmhhbmRsZXIsIG91dHB1dERpcik7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoZ3JhcGhxbEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZihncmFwaHFsSGFuZGxlcikge1xuICAgICAgICBsb2coJ0ZvdW5kIEdyYXBoUUwgaGFuZGxlcicsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICByZXR1cm4gZ3JhcGhxbEhhbmRsZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBsb2coYEVycm9yIGxvYWRpbmcgR3JhcGhRTCBoYW5kbGVyOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuXG4gIC8vIFNldCB1cCBHcmFwaFFMIGhhbmRsZXIgZm9yIEdyYXBoUUwgcmVxdWVzdHNcbiAgdHJ5IHtcbiAgICBjb25zdCBncmFwaHFsSGFuZGxlciA9IGF3YWl0IGxvYWRHcmFwaFFMU2NoZW1hKCk7XG4gICAgaWYoZ3JhcGhxbEhhbmRsZXIpIHtcbiAgICAgIC8vIEZpbmQgdGhlIEdyYXBoUUwgcGF0aCBmcm9tIHRoZSBzZXJ2ZXJsZXNzIGNvbmZpZ1xuICAgICAgbGV0IGdyYXBocWxQYXRoID0gJy9ncmFwaHFsJzsgLy8gZGVmYXVsdCBmYWxsYmFja1xuXG4gICAgICBpZihjb25maWcuZnVuY3Rpb25zKSB7XG4gICAgICAgIGZvcihjb25zdCBbX2Z1bmN0aW9uTmFtZSwgZnVuY3Rpb25Db25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5mdW5jdGlvbnMpKSB7XG4gICAgICAgICAgaWYoZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICBmb3IoY29uc3QgZXZlbnQgb2YgZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICAgIGlmKGV2ZW50Py5odHRwPy5wYXRoKSB7XG4gICAgICAgICAgICAgICAgZ3JhcGhxbFBhdGggPSBldmVudC5odHRwLnBhdGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoZ3JhcGhxbFBhdGggIT09ICcvZ3JhcGhxbCcpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdXAgR3JhcGhRTCBlbmRwb2ludCB3aXRoIGVuaGFuY2VkIGNvbnNvbGUubG9nIGNhcHR1cmVcbiAgICAgIGFwcC51c2UoZ3JhcGhxbFBhdGgsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICAvLyBHcmFwaFFMIERlYnVnIExvZ2dpbmdcbiAgICAgICAgaWYoZGVidWcgJiYgcmVxLmJvZHkgJiYgcmVxLmJvZHkucXVlcnkpIHtcbiAgICAgICAgICBsb2coJ/CflI0gR3JhcGhRTCBEZWJ1ZyBNb2RlOiBBbmFseXppbmcgcmVxdWVzdC4uLicsICdpbmZvJywgZmFsc2UpO1xuICAgICAgICAgIGxvZyhg8J+TnSBHcmFwaFFMIFF1ZXJ5OiAke3JlcS5ib2R5LnF1ZXJ5fWAsICdpbmZvJywgZmFsc2UpO1xuICAgICAgICAgIGlmKHJlcS5ib2R5LnZhcmlhYmxlcykge1xuICAgICAgICAgICAgbG9nKGDwn5OKIEdyYXBoUUwgVmFyaWFibGVzOiAke0pTT04uc3RyaW5naWZ5KHJlcS5ib2R5LnZhcmlhYmxlcywgbnVsbCwgMil9YCwgJ2luZm8nLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHJlcS5ib2R5Lm9wZXJhdGlvbk5hbWUpIHtcbiAgICAgICAgICAgIGxvZyhg8J+Pt++4jyAgR3JhcGhRTCBPcGVyYXRpb246ICR7cmVxLmJvZHkub3BlcmF0aW9uTmFtZX1gLCAnaW5mbycsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbmhhbmNlZCBjb25zb2xlLmxvZyBjYXB0dXJlXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZUxvZyA9IGNvbnNvbGUubG9nO1xuICAgICAgICBjb25zdCBsb2dzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGNvbnNvbGUubG9nID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICBjb25zdCBsb2dNZXNzYWdlID0gYXJncy5tYXAoKGFyZykgPT5cbiAgICAgICAgICAgICh0eXBlb2YgYXJnID09PSAnb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGFyZywgbnVsbCwgMikgOiBTdHJpbmcoYXJnKSlcbiAgICAgICAgICApLmpvaW4oJyAnKTtcbiAgICAgICAgICBsb2dzLnB1c2gobG9nTWVzc2FnZSk7XG4gICAgICAgICAgb3JpZ2luYWxDb25zb2xlTG9nKGBbR3JhcGhRTF0gJHtsb2dNZXNzYWdlfWApO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIENyZWF0ZSBjb250ZXh0IGZvciB0aGUgaGFuZGxlclxuICAgICAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgICAgIGF3c1JlcXVlc3RJZDogJ3Rlc3QtcmVxdWVzdC1pZCcsXG4gICAgICAgICAgZnVuY3Rpb25OYW1lOiAnZ3JhcGhxbCcsXG4gICAgICAgICAgZnVuY3Rpb25WZXJzaW9uOiAnJExBVEVTVCcsXG4gICAgICAgICAgZ2V0UmVtYWluaW5nVGltZUluTWlsbGlzOiAoKSA9PiAzMDAwMCxcbiAgICAgICAgICBpbnZva2VkRnVuY3Rpb25Bcm46ICdhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOmdyYXBocWwnLFxuICAgICAgICAgIGxvZ0dyb3VwTmFtZTogJy9hd3MvbGFtYmRhL2dyYXBocWwnLFxuICAgICAgICAgIGxvZ1N0cmVhbU5hbWU6ICd0ZXN0LWxvZy1zdHJlYW0nLFxuICAgICAgICAgIHJlcSxcbiAgICAgICAgICByZXNcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBXcmFwIGhhbmRsZXIgd2l0aCBjb25zb2xlIGxvZyBjYXB0dXJlXG4gICAgICAgIGNvbnN0IHdyYXBwZWRIYW5kbGVyID0gY2FwdHVyZUNvbnNvbGVMb2dzKGdyYXBocWxIYW5kbGVyLCBxdWlldCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBDYWxsIHRoZSBoYW5kbGVyIHdpdGggR3JhcGhRTCBwYXJhbWV0ZXJzXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd3JhcHBlZEhhbmRsZXIoe1xuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxLmJvZHkpLFxuICAgICAgICAgICAgaGVhZGVyczogcmVxLmhlYWRlcnMsXG4gICAgICAgICAgICBodHRwTWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBwYXRoOiBncmFwaHFsUGF0aCxcbiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nUGFyYW1ldGVyczoge31cbiAgICAgICAgICB9LCBjb250ZXh0KTtcblxuICAgICAgICAgIC8vIFJlc3RvcmUgY29uc29sZS5sb2dcbiAgICAgICAgICBjb25zb2xlLmxvZyA9IG9yaWdpbmFsQ29uc29sZUxvZztcblxuICAgICAgICAgIC8vIEhhbmRsZSB0aGUgcmVzdWx0XG4gICAgICAgICAgaWYocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHJlc3VsdC5zdGF0dXNDb2RlKSB7XG4gICAgICAgICAgICByZXMuc3RhdHVzKHJlc3VsdC5zdGF0dXNDb2RlKTtcbiAgICAgICAgICAgIGlmKHJlc3VsdC5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHJlc3VsdC5oZWFkZXJzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICByZXMuc2V0SGVhZGVyKGtleSwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzLnNlbmQocmVzdWx0LmJvZHkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXMuanNvbihyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICAgIC8vIFJlc3RvcmUgY29uc29sZS5sb2dcbiAgICAgICAgICBjb25zb2xlLmxvZyA9IG9yaWdpbmFsQ29uc29sZUxvZztcbiAgICAgICAgICBsb2coYEdyYXBoUUwgaGFuZGxlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIGZhbHNlKTtcbiAgICAgICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7ZXJyb3I6IGVycm9yLm1lc3NhZ2V9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGxvZyhgR3JhcGhRTCBlbmRwb2ludCBhdmFpbGFibGUgYXQgaHR0cDovLyR7aG9zdH06JHtodHRwUG9ydH0ke2dyYXBocWxQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgIH1cbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZyhgRXJyb3Igc2V0dGluZyB1cCBHcmFwaFFMOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICB9XG5cbiAgLy8gRmFsbGJhY2sgZm9yIG5vbi1HcmFwaFFMIHJvdXRlcyAtIGhhbmRsZSBhbGwgcmVtYWluaW5nIHJvdXRlc1xuICBhcHAudXNlKCcvJywgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IHJlcS51cmwgfHwgJy8nO1xuICAgICAgY29uc3QgbWV0aG9kID0gcmVxLm1ldGhvZCB8fCAnR0VUJztcbiAgICAgIGNvbnN0IHBhdGhuYW1lID0gcmVxLnBhdGggfHwgdXJsLnNwbGl0KCc/JylbMF07IC8vIEV4dHJhY3QgcGF0aG5hbWUgd2l0aG91dCBxdWVyeSBzdHJpbmdcblxuICAgICAgLy8gQWx3YXlzIGxvZyByZXF1ZXN0cyAobm90IGFmZmVjdGVkIGJ5IHF1aWV0IGZsYWcgZm9yIGRlYnVnZ2luZylcbiAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gJHttZXRob2R9ICR7dXJsfSAocGF0aG5hbWU6ICR7cGF0aG5hbWV9KWApO1xuXG4gICAgICAvLyBGaW5kIG1hdGNoaW5nIGZ1bmN0aW9uXG4gICAgICBsZXQgbWF0Y2hlZEZ1bmN0aW9uID0gbnVsbDtcblxuICAgICAgaWYoY29uZmlnLmZ1bmN0aW9ucykge1xuICAgICAgICBjb25zdCBmdW5jdGlvbk5hbWVzID0gT2JqZWN0LmtleXMoY29uZmlnLmZ1bmN0aW9ucyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gQXZhaWxhYmxlIGZ1bmN0aW9uczogJHtmdW5jdGlvbk5hbWVzLmpvaW4oJywgJyl9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2VydmVybGVzc10gQ29uZmlnIGZ1bmN0aW9uczonLCBKU09OLnN0cmluZ2lmeShjb25maWcuZnVuY3Rpb25zLCBudWxsLCAyKSk7XG5cbiAgICAgICAgZm9yKGNvbnN0IFtmdW5jdGlvbk5hbWUsIGZ1bmN0aW9uQ29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcuZnVuY3Rpb25zKSkge1xuICAgICAgICAgIGlmKGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgZm9yKGNvbnN0IGV2ZW50IG9mIGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgICBpZihldmVudC5odHRwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRQYXRoID0gZXZlbnQuaHR0cC5wYXRoIHx8ICcvJztcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudE1ldGhvZCA9IChldmVudC5odHRwLm1ldGhvZCB8fCAnR0VUJykudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0TWV0aG9kID0gbWV0aG9kLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIENoZWNraW5nIGZ1bmN0aW9uICR7ZnVuY3Rpb25OYW1lfTogcGF0aD1cIiR7ZXZlbnRQYXRofVwiLCBtZXRob2Q9XCIke2V2ZW50TWV0aG9kfVwiIGFnYWluc3QgcGF0aG5hbWU9XCIke3BhdGhuYW1lfVwiLCBtZXRob2Q9XCIke3JlcXVlc3RNZXRob2R9XCJgKTtcblxuICAgICAgICAgICAgICAgIC8vIEltcHJvdmVkIHBhdGggbWF0Y2hpbmcgLSBjb21wYXJlIHBhdGhuYW1lIHdpdGhvdXQgcXVlcnkgc3RyaW5nXG4gICAgICAgICAgICAgICAgLy8gTm9ybWFsaXplIHBhdGhzIChyZW1vdmUgdHJhaWxpbmcgc2xhc2hlcyBmb3IgY29tcGFyaXNvbilcbiAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkRXZlbnRQYXRoID0gZXZlbnRQYXRoLnJlcGxhY2UoL1xcLyQvLCAnJykgfHwgJy8nO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRobmFtZSA9IHBhdGhuYW1lLnJlcGxhY2UoL1xcLyQvLCAnJykgfHwgJy8nO1xuXG4gICAgICAgICAgICAgICAgaWYobm9ybWFsaXplZEV2ZW50UGF0aCA9PT0gbm9ybWFsaXplZFBhdGhuYW1lICYmIGV2ZW50TWV0aG9kID09PSByZXF1ZXN0TWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgICBtYXRjaGVkRnVuY3Rpb24gPSBmdW5jdGlvbk5hbWU7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIOKckyBNYXRjaGVkIGZ1bmN0aW9uOiAke21hdGNoZWRGdW5jdGlvbn1gKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZihtYXRjaGVkRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTZXJ2ZXJsZXNzXSBObyBmdW5jdGlvbnMgZm91bmQgaW4gY29uZmlnJyk7XG4gICAgICB9XG5cbiAgICAgIGlmKG1hdGNoZWRGdW5jdGlvbiAmJiBjb25maWcuZnVuY3Rpb25zW21hdGNoZWRGdW5jdGlvbl0pIHtcbiAgICAgICAgLy8gUmVzb2x2ZSBoYW5kbGVyIHBhdGggcmVsYXRpdmUgdG8gb3V0cHV0IGRpcmVjdG9yeVxuICAgICAgICBjb25zdCBoYW5kbGVyUGF0aCA9IGNvbmZpZy5mdW5jdGlvbnNbbWF0Y2hlZEZ1bmN0aW9uXS5oYW5kbGVyO1xuICAgICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIExvYWRpbmcgaGFuZGxlcjogJHtoYW5kbGVyUGF0aH0gZnJvbSBvdXRwdXREaXI6ICR7b3V0cHV0RGlyfWApO1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gYXdhaXQgbG9hZEhhbmRsZXIoaGFuZGxlclBhdGgsIG91dHB1dERpcik7XG5cbiAgICAgICAgaWYoaGFuZGxlcikge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gSGFuZGxlciBsb2FkZWQgc3VjY2Vzc2Z1bGx5LCB0eXBlOiAke3R5cGVvZiBoYW5kbGVyfWApO1xuICAgICAgICAgIGNvbnN0IHdyYXBwZWRIYW5kbGVyID0gY2FwdHVyZUNvbnNvbGVMb2dzKGhhbmRsZXIsIHF1aWV0KTtcblxuICAgICAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICAgICAgYm9keTogcmVxLmJvZHksXG4gICAgICAgICAgICBoZWFkZXJzOiByZXEuaGVhZGVycyxcbiAgICAgICAgICAgIGh0dHBNZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgIHBhdGg6IHVybCxcbiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nUGFyYW1ldGVyczogcmVxLnF1ZXJ5XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgICAgICBhd3NSZXF1ZXN0SWQ6ICd0ZXN0LXJlcXVlc3QtaWQnLFxuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBtYXRjaGVkRnVuY3Rpb24sXG4gICAgICAgICAgICBmdW5jdGlvblZlcnNpb246ICckTEFURVNUJyxcbiAgICAgICAgICAgIGdldFJlbWFpbmluZ1RpbWVJbk1pbGxpczogKCkgPT4gMzAwMDAsXG4gICAgICAgICAgICBpbnZva2VkRnVuY3Rpb25Bcm46IGBhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOiR7bWF0Y2hlZEZ1bmN0aW9ufWAsXG4gICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke21hdGNoZWRGdW5jdGlvbn1gLFxuICAgICAgICAgICAgbG9nU3RyZWFtTmFtZTogJ3Rlc3QtbG9nLXN0cmVhbScsXG4gICAgICAgICAgICBtZW1vcnlMaW1pdEluTUI6ICcxMjgnXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW1NlcnZlcmxlc3NdIENhbGxpbmcgaGFuZGxlciB3aXRoIGV2ZW50OicsIEpTT04uc3RyaW5naWZ5KGV2ZW50LCBudWxsLCAyKSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3cmFwcGVkSGFuZGxlcihldmVudCwgY29udGV4dCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW1NlcnZlcmxlc3NdIEhhbmRsZXIgcmV0dXJuZWQ6JywgSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSk7XG5cbiAgICAgICAgICAgIGlmKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQuc3RhdHVzQ29kZSkge1xuICAgICAgICAgICAgICByZXMuc3RhdHVzKHJlc3VsdC5zdGF0dXNDb2RlKTtcbiAgICAgICAgICAgICAgaWYocmVzdWx0LmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhyZXN1bHQuaGVhZGVycykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXMuc2V0SGVhZGVyKGtleSwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVzLnNlbmQocmVzdWx0LmJvZHkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzLmpzb24ocmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTZXJ2ZXJsZXNzXSBIYW5kbGVyIGVycm9yOicsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1NlcnZlcmxlc3NdIEhhbmRsZXIgZXJyb3Igc3RhY2s6JywgZXJyb3Iuc3RhY2spO1xuICAgICAgICAgICAgbG9nKGBIYW5kbGVyIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgZmFsc2UpO1xuICAgICAgICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe2Vycm9yOiBlcnJvci5tZXNzYWdlfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtTZXJ2ZXJsZXNzXSBIYW5kbGVyIG5vdCBmb3VuZCBmb3IgZnVuY3Rpb246ICR7bWF0Y2hlZEZ1bmN0aW9ufWApO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtTZXJ2ZXJsZXNzXSBIYW5kbGVyIHBhdGg6ICR7aGFuZGxlclBhdGh9LCBPdXRwdXQgZGlyOiAke291dHB1dERpcn1gKTtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7ZXJyb3I6ICdIYW5kbGVyIG5vdCBmb3VuZCd9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEZ1bmN0aW9uIG5vdCBmb3VuZCBmb3IgcGF0aG5hbWU6ICR7cGF0aG5hbWV9LCBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gQXZhaWxhYmxlIGZ1bmN0aW9uczogJHtjb25maWcuZnVuY3Rpb25zID8gT2JqZWN0LmtleXMoY29uZmlnLmZ1bmN0aW9ucykuam9pbignLCAnKSA6ICdub25lJ31gKTtcbiAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oe2Vycm9yOiAnRnVuY3Rpb24gbm90IGZvdW5kJ30pO1xuICAgICAgfVxuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGxvZyhgUm91dGUgaGFuZGxpbmcgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7ZXJyb3I6IGVycm9yLm1lc3NhZ2V9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBhcHA7XG59O1xuXG5jb25zdCBjcmVhdGVXZWJTb2NrZXRTZXJ2ZXIgPSAoXG4gIGNvbmZpZzogU2VydmVybGVzc0NvbmZpZyxcbiAgb3V0cHV0RGlyOiBzdHJpbmcsXG4gIHdzUG9ydDogbnVtYmVyLFxuICBxdWlldDogYm9vbGVhbixcbiAgZGVidWc6IGJvb2xlYW5cbikgPT4ge1xuICBjb25zdCB3c3MgPSBuZXcgV2ViU29ja2V0U2VydmVyKHtwb3J0OiB3c1BvcnR9KTtcblxuICB3c3Mub24oJ2Nvbm5lY3Rpb24nLCBhc3luYyAod3MsIHJlcSkgPT4ge1xuICAgIGxvZyhgV2ViU29ja2V0IGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQ6ICR7cmVxLnVybH1gLCAnaW5mbycsIGZhbHNlKTtcblxuICAgIHdzLm9uKCdtZXNzYWdlJywgYXN5bmMgKG1lc3NhZ2UpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKG1lc3NhZ2UudG9TdHJpbmcoKSk7XG5cbiAgICAgICAgLy8gRmluZCBtYXRjaGluZyBXZWJTb2NrZXQgZnVuY3Rpb25cbiAgICAgICAgbGV0IG1hdGNoZWRGdW5jdGlvbiA9IG51bGw7XG5cbiAgICAgICAgaWYoY29uZmlnLmZ1bmN0aW9ucykge1xuICAgICAgICAgIGZvcihjb25zdCBbZnVuY3Rpb25OYW1lLCBmdW5jdGlvbkNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLmZ1bmN0aW9ucykpIHtcbiAgICAgICAgICAgIGlmKGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgICBmb3IoY29uc3QgZXZlbnQgb2YgZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgaWYoZXZlbnQud2Vic29ja2V0KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByb3V0ZSA9IGV2ZW50LndlYnNvY2tldC5yb3V0ZSB8fCAnJGNvbm5lY3QnO1xuICAgICAgICAgICAgICAgICAgaWYocm91dGUgPT09ICckZGVmYXVsdCcgfHwgcm91dGUgPT09IGRhdGEuYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWRGdW5jdGlvbiA9IGZ1bmN0aW9uTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihtYXRjaGVkRnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYobWF0Y2hlZEZ1bmN0aW9uICYmIGNvbmZpZy5mdW5jdGlvbnNbbWF0Y2hlZEZ1bmN0aW9uXSkge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBhd2FpdCBsb2FkSGFuZGxlcihjb25maWcuZnVuY3Rpb25zW21hdGNoZWRGdW5jdGlvbl0uaGFuZGxlciwgb3V0cHV0RGlyKTtcblxuICAgICAgICAgIGlmKGhhbmRsZXIpIHtcbiAgICAgICAgICAgIC8vIFdyYXAgaGFuZGxlciB3aXRoIGNvbnNvbGUgbG9nIGNhcHR1cmVcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRIYW5kbGVyID0gY2FwdHVyZUNvbnNvbGVMb2dzKGhhbmRsZXIsIHF1aWV0KTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICAgICAgICBib2R5OiBkYXRhLmJvZHkgfHwgbnVsbCxcbiAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICBhcGlHYXRld2F5OiB7XG4gICAgICAgICAgICAgICAgICBlbmRwb2ludDogYHdzOi8vbG9jYWxob3N0OiR7d3NQb3J0fWBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZDogJ3Rlc3QtY29ubmVjdGlvbi1pZCcsXG4gICAgICAgICAgICAgICAgcm91dGVLZXk6IGRhdGEuYWN0aW9uIHx8ICckZGVmYXVsdCdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgICAgICAgICAgYXdzUmVxdWVzdElkOiAndGVzdC1yZXF1ZXN0LWlkJyxcbiAgICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBtYXRjaGVkRnVuY3Rpb24sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uVmVyc2lvbjogJyRMQVRFU1QnLFxuICAgICAgICAgICAgICBnZXRSZW1haW5pbmdUaW1lSW5NaWxsaXM6ICgpID0+IDMwMDAwLFxuICAgICAgICAgICAgICBpbnZva2VkRnVuY3Rpb25Bcm46IGBhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOiR7bWF0Y2hlZEZ1bmN0aW9ufWAsXG4gICAgICAgICAgICAgIGxvZ0dyb3VwTmFtZTogYC9hd3MvbGFtYmRhLyR7bWF0Y2hlZEZ1bmN0aW9ufWAsXG4gICAgICAgICAgICAgIGxvZ1N0cmVhbU5hbWU6ICd0ZXN0LWxvZy1zdHJlYW0nLFxuICAgICAgICAgICAgICBtZW1vcnlMaW1pdEluTUI6ICcxMjgnXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3cmFwcGVkSGFuZGxlcihldmVudCwgY29udGV4dCk7XG5cbiAgICAgICAgICAgIC8vIEhhbmRsZSBMYW1iZGEgcmVzcG9uc2UgZm9ybWF0IGZvciBXZWJTb2NrZXRcbiAgICAgICAgICAgIGlmKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQuc3RhdHVzQ29kZSkge1xuICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgTGFtYmRhIHJlc3BvbnNlIG9iamVjdCwgZXh0cmFjdCB0aGUgYm9keVxuICAgICAgICAgICAgICBjb25zdCBib2R5ID0gcmVzdWx0LmJvZHkgfHwgJyc7XG4gICAgICAgICAgICAgIHdzLnNlbmQoYm9keSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgZGlyZWN0IHJlc3BvbnNlLCBzdHJpbmdpZnkgaXRcbiAgICAgICAgICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeShyZXN1bHQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeSh7ZXJyb3I6ICdIYW5kbGVyIG5vdCBmb3VuZCd9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoe2Vycm9yOiAnV2ViU29ja2V0IGZ1bmN0aW9uIG5vdCBmb3VuZCd9KSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgbG9nKGBXZWJTb2NrZXQgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoe2Vycm9yOiBlcnJvci5tZXNzYWdlfSkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgd3Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgbG9nKCdXZWJTb2NrZXQgY29ubmVjdGlvbiBjbG9zZWQnLCAnaW5mbycsIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHdzcztcbn07XG5cbmNvbnN0IGxvYWRFbnZGaWxlID0gKGVudlBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPT4ge1xuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgaWYoIWV4aXN0c1N5bmMoZW52UGF0aCkpIHtcbiAgICByZXR1cm4gZW52VmFycztcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgZW52Q29udGVudCA9IHJlYWRGaWxlU3luYyhlbnZQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IGxpbmVzID0gZW52Q29udGVudC5zcGxpdCgnXFxuJyk7XG5cbiAgICBmb3IoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lLnRyaW0oKTtcblxuICAgICAgLy8gU2tpcCBlbXB0eSBsaW5lcyBhbmQgY29tbWVudHNcbiAgICAgIGlmKCF0cmltbWVkTGluZSB8fCB0cmltbWVkTGluZS5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFBhcnNlIEtFWT12YWx1ZSBmb3JtYXRcbiAgICAgIGNvbnN0IGVxdWFsSW5kZXggPSB0cmltbWVkTGluZS5pbmRleE9mKCc9Jyk7XG4gICAgICBpZihlcXVhbEluZGV4ID4gMCkge1xuICAgICAgICBjb25zdCBrZXkgPSB0cmltbWVkTGluZS5zdWJzdHJpbmcoMCwgZXF1YWxJbmRleCkudHJpbSgpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRyaW1tZWRMaW5lLnN1YnN0cmluZyhlcXVhbEluZGV4ICsgMSkudHJpbSgpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBxdW90ZXMgaWYgcHJlc2VudFxuICAgICAgICBjb25zdCBjbGVhblZhbHVlID0gdmFsdWUucmVwbGFjZSgvXltcIiddfFtcIiddJC9nLCAnJyk7XG5cbiAgICAgICAgaWYoa2V5KSB7XG4gICAgICAgICAgZW52VmFyc1trZXldID0gY2xlYW5WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZyhgV2FybmluZzogQ291bGQgbm90IGxvYWQgLmVudiBmaWxlIGF0ICR7ZW52UGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gLCAnd2FybicsIGZhbHNlKTtcbiAgfVxuXG4gIHJldHVybiBlbnZWYXJzO1xufTtcblxuZXhwb3J0IGNvbnN0IHNlcnZlcmxlc3MgPSBhc3luYyAoXG4gIGNtZDogU2VydmVybGVzc09wdGlvbnMsXG4gIGNhbGxiYWNrOiBTZXJ2ZXJsZXNzQ2FsbGJhY2sgPSAoKSA9PiAoe30pXG4pOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBjb25zdCB7XG4gICAgY2xpTmFtZSA9ICdMZXgnLFxuICAgIGNvbmZpZyxcbiAgICBkZWJ1ZyA9IGZhbHNlLFxuICAgIGhvc3QgPSAnbG9jYWxob3N0JyxcbiAgICBodHRwUG9ydCA9IDUwMDAsXG4gICAgaHR0cHNQb3J0ID0gNTAwMSxcbiAgICBxdWlldCA9IGZhbHNlLFxuICAgIHJlbW92ZSA9IGZhbHNlLFxuICAgIHRlc3QgPSBmYWxzZSxcbiAgICB1c2VQdWJsaWNJcCxcbiAgICB2YXJpYWJsZXMsXG4gICAgd3NQb3J0ID0gNTAwMlxuICB9ID0gY21kO1xuXG4gIGNvbnN0IHNwaW5uZXIgPSBjcmVhdGVTcGlubmVyKHF1aWV0KTtcblxuICBsb2coYCR7Y2xpTmFtZX0gc3RhcnRpbmcgc2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIuLi5gLCAnaW5mbycsIHF1aWV0KTtcblxuICBhd2FpdCBMZXhDb25maWcucGFyc2VDb25maWcoY21kKTtcblxuICBjb25zdCB7b3V0cHV0RnVsbFBhdGh9ID0gTGV4Q29uZmlnLmNvbmZpZztcblxuICAvLyBMb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIC5lbnYgZmlsZXNcbiAgY29uc3QgZW52UGF0aHMgPSBbXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy5lbnYnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLmVudi5sb2NhbCcpLFxuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICcuZW52LmRldmVsb3BtZW50JylcbiAgXTtcblxuICBsZXQgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIC8vIExvYWQgZnJvbSAuZW52IGZpbGVzIGluIG9yZGVyIChsYXRlciBmaWxlcyBvdmVycmlkZSBlYXJsaWVyIG9uZXMpXG4gIGZvcihjb25zdCBlbnZQYXRoIG9mIGVudlBhdGhzKSB7XG4gICAgY29uc3QgZmlsZUVudlZhcnMgPSBsb2FkRW52RmlsZShlbnZQYXRoKTtcbiAgICBpZihPYmplY3Qua2V5cyhmaWxlRW52VmFycykubGVuZ3RoID4gMCkge1xuICAgICAgbG9nKGBMb2FkZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb206ICR7ZW52UGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICB9XG4gICAgZW52VmFycyA9IHsuLi5lbnZWYXJzLCAuLi5maWxlRW52VmFyc307XG4gIH1cblxuICAvLyBTdGFydCB3aXRoIGRlZmF1bHQgTk9ERV9FTlYgYW5kIGxvYWRlZCAuZW52IHZhcmlhYmxlc1xuICBsZXQgdmFyaWFibGVzT2JqOiBvYmplY3QgPSB7Tk9ERV9FTlY6ICdkZXZlbG9wbWVudCcsIC4uLmVudlZhcnN9O1xuXG4gIC8vIE92ZXJyaWRlIHdpdGggY29tbWFuZCBsaW5lIHZhcmlhYmxlcyBpZiBwcm92aWRlZFxuICBpZih2YXJpYWJsZXMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2xpVmFycyA9IEpTT04ucGFyc2UodmFyaWFibGVzKTtcbiAgICAgIHZhcmlhYmxlc09iaiA9IHsuLi52YXJpYWJsZXNPYmosIC4uLmNsaVZhcnN9O1xuICAgIH0gY2F0Y2goX2Vycm9yKSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IEVudmlyb25tZW50IHZhcmlhYmxlcyBvcHRpb24gaXMgbm90IGEgdmFsaWQgSlNPTiBvYmplY3QuYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzLmVudiA9IHsuLi5wcm9jZXNzLmVudiwgLi4udmFyaWFibGVzT2JqfTtcblxuICAvLyBJZiBpbiB0ZXN0IG1vZGUsIGV4aXQgZWFybHkgYWZ0ZXIgbG9hZGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgaWYodGVzdCkge1xuICAgIGxvZygnVGVzdCBtb2RlOiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgbG9hZGVkLCBleGl0aW5nJywgJ2luZm8nLCBxdWlldCk7XG4gICAgY2FsbGJhY2soMCk7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZihyZW1vdmUpIHtcbiAgICBzcGlubmVyLnN0YXJ0KCdDbGVhbmluZyBvdXRwdXQgZGlyZWN0b3J5Li4uJyk7XG4gICAgYXdhaXQgcmVtb3ZlRmlsZXMob3V0cHV0RnVsbFBhdGggfHwgJycpO1xuICAgIHNwaW5uZXIuc3VjY2VlZCgnU3VjY2Vzc2Z1bGx5IGNsZWFuZWQgb3V0cHV0IGRpcmVjdG9yeSEnKTtcbiAgfVxuXG4gIC8vIExvYWQgc2VydmVybGVzcyBjb25maWd1cmF0aW9uXG4gIGxldCBzZXJ2ZXJsZXNzQ29uZmlnOiBTZXJ2ZXJsZXNzQ29uZmlnID0ge307XG5cbiAgdHJ5IHtcbiAgICAvLyBVc2UgZ2V0UGFja2FnZURpciB0byBoYW5kbGUgbnBtIHdvcmtzcGFjZXMgY29ycmVjdGx5XG4gICAgY29uc3QgcGFja2FnZURpciA9IGdldFBhY2thZ2VEaXIoKTtcblxuICAgIC8vIFRyeSBtdWx0aXBsZSBjb25maWcgZmlsZSBmb3JtYXRzXG4gICAgY29uc3QgY29uZmlnRm9ybWF0cyA9IGNvbmZpZyA/IFtjb25maWddIDogW1xuICAgICAgcGF0aFJlc29sdmUocGFja2FnZURpciwgJ2xleC5jb25maWcubWpzJyksXG4gICAgICBwYXRoUmVzb2x2ZShwYWNrYWdlRGlyLCAnbGV4LmNvbmZpZy5qcycpLFxuICAgICAgcGF0aFJlc29sdmUocGFja2FnZURpciwgJ2xleC5jb25maWcuY2pzJyksXG4gICAgICBwYXRoUmVzb2x2ZShwYWNrYWdlRGlyLCAnbGV4LmNvbmZpZy50cycpXG4gICAgXTtcblxuICAgIGxldCBjb25maWdQYXRoOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBmb3IoY29uc3QgY2FuZGlkYXRlUGF0aCBvZiBjb25maWdGb3JtYXRzKSB7XG4gICAgICBpZihleGlzdHNTeW5jKGNhbmRpZGF0ZVBhdGgpKSB7XG4gICAgICAgIGNvbmZpZ1BhdGggPSBjYW5kaWRhdGVQYXRoO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZihjb25maWdQYXRoKSB7XG4gICAgICBsb2coYExvYWRpbmcgc2VydmVybGVzcyBjb25maWcgZnJvbTogJHtjb25maWdQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgY29uc3QgY29uZmlnTW9kdWxlID0gYXdhaXQgaW1wb3J0KGNvbmZpZ1BhdGgpO1xuICAgICAgc2VydmVybGVzc0NvbmZpZyA9IGNvbmZpZ01vZHVsZS5kZWZhdWx0Py5zZXJ2ZXJsZXNzIHx8IGNvbmZpZ01vZHVsZS5zZXJ2ZXJsZXNzIHx8IHt9O1xuICAgICAgbG9nKCdTZXJ2ZXJsZXNzIGNvbmZpZyBsb2FkZWQgc3VjY2Vzc2Z1bGx5JywgJ2luZm8nLCBxdWlldCk7XG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWVzID0gT2JqZWN0LmtleXMoc2VydmVybGVzc0NvbmZpZy5mdW5jdGlvbnMgfHwge30pO1xuICAgICAgbG9nKGBMb2FkZWQgZnVuY3Rpb25zOiAke2Z1bmN0aW9uTmFtZXMubGVuZ3RoID4gMCA/IGZ1bmN0aW9uTmFtZXMuam9pbignLCAnKSA6ICdub25lJ31gLCAnaW5mbycsIHF1aWV0KTtcblxuICAgICAgLy8gRGVidWc6IFByaW50IGZ1bGwgY29uZmlnIGlmIGRlYnVnIG1vZGVcbiAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgIGxvZyhgRnVsbCBzZXJ2ZXJsZXNzIGNvbmZpZzogJHtKU09OLnN0cmluZ2lmeShzZXJ2ZXJsZXNzQ29uZmlnLCBudWxsLCAyKX1gLCAnaW5mbycsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9nKGBObyBzZXJ2ZXJsZXNzIGNvbmZpZyBmb3VuZC4gVHJpZWQ6ICR7Y29uZmlnRm9ybWF0cy5qb2luKCcsICcpfWAsICd3YXJuJywgcXVpZXQpO1xuICAgIH1cbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZyhgRXJyb3IgbG9hZGluZyBzZXJ2ZXJsZXNzIGNvbmZpZzogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICBpZihkZWJ1Zykge1xuICAgICAgbG9nKGBDb25maWcgZXJyb3Igc3RhY2s6ICR7ZXJyb3Iuc3RhY2t9YCwgJ2Vycm9yJywgZmFsc2UpO1xuICAgIH1cbiAgICAvLyBEb24ndCBleGl0LCBjb250aW51ZSB3aXRoIGVtcHR5IGNvbmZpZ1xuICB9XG5cbiAgLy8gTWVyZ2UgY29uZmlnIHdpdGggY29tbWFuZCBsaW5lIG9wdGlvbnNcbiAgY29uc3QgZmluYWxDb25maWc6IFNlcnZlcmxlc3NDb25maWcgPSB7XG4gICAgLi4uc2VydmVybGVzc0NvbmZpZyxcbiAgICBjdXN0b206IHtcbiAgICAgICdzZXJ2ZXJsZXNzLW9mZmxpbmUnOiB7XG4gICAgICAgIGNvcnM6IHNlcnZlcmxlc3NDb25maWcuY3VzdG9tPy5bJ3NlcnZlcmxlc3Mtb2ZmbGluZSddPy5jb3JzICE9PSBmYWxzZSxcbiAgICAgICAgaG9zdDogc2VydmVybGVzc0NvbmZpZy5jdXN0b20/Llsnc2VydmVybGVzcy1vZmZsaW5lJ10/Lmhvc3QgfHwgaG9zdCxcbiAgICAgICAgaHR0cFBvcnQ6IHNlcnZlcmxlc3NDb25maWcuY3VzdG9tPy5bJ3NlcnZlcmxlc3Mtb2ZmbGluZSddPy5odHRwUG9ydCB8fCBodHRwUG9ydCxcbiAgICAgICAgaHR0cHNQb3J0OiBzZXJ2ZXJsZXNzQ29uZmlnLmN1c3RvbT8uWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXT8uaHR0cHNQb3J0IHx8IGh0dHBzUG9ydCxcbiAgICAgICAgd3NQb3J0OiBzZXJ2ZXJsZXNzQ29uZmlnLmN1c3RvbT8uWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXT8ud3NQb3J0IHx8IHdzUG9ydFxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBvdXRwdXREaXIgPSBvdXRwdXRGdWxsUGF0aCB8fCAnbGliJztcbiAgbG9nKGBVc2luZyBvdXRwdXQgZGlyZWN0b3J5OiAke291dHB1dERpcn1gLCAnaW5mbycsIHF1aWV0KTtcblxuICB0cnkge1xuICAgIHNwaW5uZXIuc3RhcnQoJ1N0YXJ0aW5nIHNlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyLi4uJyk7XG5cbiAgICBjb25zdCBodHRwUG9ydCA9IGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS5odHRwUG9ydCE7XG4gICAgY29uc3Qgd3NQb3J0ID0gZmluYWxDb25maWcuY3VzdG9tIVsnc2VydmVybGVzcy1vZmZsaW5lJ10hLndzUG9ydCE7XG4gICAgY29uc3QgaG9zdCA9IGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS5ob3N0ITtcblxuICAgIGxvZyhgQ3JlYXRpbmcgSFRUUCBzZXJ2ZXIgb24gJHtob3N0fToke2h0dHBQb3J0fWAsICdpbmZvJywgcXVpZXQpO1xuICAgIGxvZyhgQ3JlYXRpbmcgV2ViU29ja2V0IHNlcnZlciBvbiBwb3J0ICR7d3NQb3J0fWAsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgLy8gQ3JlYXRlIEV4cHJlc3Mgc2VydmVyXG4gICAgY29uc3QgZXhwcmVzc0FwcCA9IGF3YWl0IGNyZWF0ZUV4cHJlc3NTZXJ2ZXIoXG4gICAgICBmaW5hbENvbmZpZyxcbiAgICAgIG91dHB1dERpcixcbiAgICAgIGh0dHBQb3J0LFxuICAgICAgaG9zdCxcbiAgICAgIHF1aWV0LFxuICAgICAgZGVidWdcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIFdlYlNvY2tldCBzZXJ2ZXJcbiAgICBjb25zdCB3c1NlcnZlciA9IGNyZWF0ZVdlYlNvY2tldFNlcnZlcihcbiAgICAgIGZpbmFsQ29uZmlnLFxuICAgICAgb3V0cHV0RGlyLFxuICAgICAgd3NQb3J0LFxuICAgICAgcXVpZXQsXG4gICAgICBkZWJ1Z1xuICAgICk7XG5cbiAgICAvLyBIYW5kbGUgc2VydmVyIGVycm9yc1xuICAgIHdzU2VydmVyLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgbG9nKGBXZWJTb2NrZXQgc2VydmVyIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gc3RhcnQgV2ViU29ja2V0IHNlcnZlci4nKTtcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuXG4gICAgLy8gU3RhcnQgRXhwcmVzcyBzZXJ2ZXJcbiAgICBjb25zdCBzZXJ2ZXIgPSBleHByZXNzQXBwLmxpc3RlbihodHRwUG9ydCwgaG9zdCwgKCkgPT4ge1xuICAgICAgc3Bpbm5lci5zdWNjZWVkKCdTZXJ2ZXJsZXNzIGRldmVsb3BtZW50IHNlcnZlciBzdGFydGVkLicpO1xuXG4gICAgICBkaXNwbGF5U2VydmVyU3RhdHVzKFxuICAgICAgICBodHRwUG9ydCxcbiAgICAgICAgZmluYWxDb25maWcuY3VzdG9tIVsnc2VydmVybGVzcy1vZmZsaW5lJ10hLmh0dHBzUG9ydCEsXG4gICAgICAgIHdzUG9ydCxcbiAgICAgICAgaG9zdCxcbiAgICAgICAgcXVpZXRcbiAgICAgICk7XG5cbiAgICAgIGZldGNoUHVibGljSXAodXNlUHVibGljSXApLnRoZW4oKHB1YmxpY0lwKSA9PiB7XG4gICAgICAgIGlmKHB1YmxpY0lwKSB7XG4gICAgICAgICAgZGlzcGxheVNlcnZlclN0YXR1cyhcbiAgICAgICAgICAgIGh0dHBQb3J0LFxuICAgICAgICAgICAgZmluYWxDb25maWcuY3VzdG9tIVsnc2VydmVybGVzcy1vZmZsaW5lJ10hLmh0dHBzUG9ydCEsXG4gICAgICAgICAgICB3c1BvcnQsXG4gICAgICAgICAgICBob3N0LFxuICAgICAgICAgICAgcXVpZXQsXG4gICAgICAgICAgICBwdWJsaWNJcFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gSGFuZGxlIEV4cHJlc3Mgc2VydmVyIGVycm9yc1xuICAgIHNlcnZlci5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIGxvZyhgRXhwcmVzcyBzZXJ2ZXIgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICBzcGlubmVyLmZhaWwoJ0ZhaWxlZCB0byBzdGFydCBFeHByZXNzIHNlcnZlci4nKTtcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuXG4gICAgLy8gSGFuZGxlIGdyYWNlZnVsIHNodXRkb3duXG4gICAgY29uc3Qgc2h1dGRvd24gPSAoKSA9PiB7XG4gICAgICBsb2coJ1xcblNodXR0aW5nIGRvd24gc2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIuLi4nLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIHNlcnZlci5jbG9zZSgpO1xuICAgICAgd3NTZXJ2ZXIuY2xvc2UoKTtcbiAgICAgIGNhbGxiYWNrKDApO1xuICAgIH07XG5cbiAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzaHV0ZG93bik7XG4gICAgcHJvY2Vzcy5vbignU0lHVEVSTScsIHNodXRkb3duKTtcblxuICAgIC8vIEtlZXAgdGhlIHByb2Nlc3MgYWxpdmVcbiAgICBwcm9jZXNzLnN0ZGluLnJlc3VtZSgpO1xuXG4gICAgbG9nKCdTZXJ2ZXJsZXNzIGRldmVsb3BtZW50IHNlcnZlciBpcyBydW5uaW5nLiBQcmVzcyBDdHJsK0MgdG8gc3RvcC4nLCAnaW5mbycsIHF1aWV0KTtcblxuICAgIC8vIERvbid0IGNhbGwgY2FsbGJhY2sgaGVyZSwgbGV0IHRoZSBwcm9jZXNzIHN0YXkgYWxpdmVcbiAgICByZXR1cm4gMDtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICBzcGlubmVyLmZhaWwoJ0ZhaWxlZCB0byBzdGFydCBzZXJ2ZXJsZXNzIGRldmVsb3BtZW50IHNlcnZlci4nKTtcbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxufTsiXSwibmFtZXMiOlsiYm94ZW4iLCJjaGFsayIsImV4cHJlc3MiLCJyZWFkRmlsZVN5bmMiLCJleGlzdHNTeW5jIiwibWtkaXJTeW5jIiwid3JpdGVGaWxlU3luYyIsImhvbWVkaXIiLCJyZXNvbHZlIiwicGF0aFJlc29sdmUiLCJqb2luIiwiaXNBYnNvbHV0ZSIsInBhdGhUb0ZpbGVVUkwiLCJXZWJTb2NrZXRTZXJ2ZXIiLCJMZXhDb25maWciLCJnZXRQYWNrYWdlRGlyIiwiY3JlYXRlU3Bpbm5lciIsInJlbW92ZUZpbGVzIiwibG9nIiwiZ2V0Q2FjaGVEaXIiLCJjYWNoZURpciIsInJlY3Vyc2l2ZSIsImdldENhY2hlUGF0aCIsInJlYWRQdWJsaWNJcENhY2hlIiwiY2FjaGVQYXRoIiwiY2FjaGVEYXRhIiwiY2FjaGUiLCJKU09OIiwicGFyc2UiLCJvbmVXZWVrTXMiLCJEYXRlIiwibm93IiwidGltZXN0YW1wIiwid3JpdGVQdWJsaWNJcENhY2hlIiwiaXAiLCJzdHJpbmdpZnkiLCJmZXRjaFB1YmxpY0lwIiwiZm9yY2VSZWZyZXNoIiwiUHJvbWlzZSIsImNhY2hlZCIsImZldGNoIiwidGhlbiIsInJlcyIsInRleHQiLCJkYXRhIiwidHJpbSIsImNhdGNoIiwidW5kZWZpbmVkIiwiZGlzcGxheVNlcnZlclN0YXR1cyIsImh0dHBQb3J0IiwiaHR0cHNQb3J0Iiwid3NQb3J0IiwiaG9zdCIsInF1aWV0IiwicHVibGljSXAiLCJodHRwVXJsIiwiaHR0cHNVcmwiLCJ3c1VybCIsIndzc1VybCIsInVybExpbmVzIiwiZ3JlZW4iLCJ1bmRlcmxpbmUiLCJzdGF0dXNCb3giLCJjeWFuIiwiYm9sZCIsInllbGxvdyIsImJhY2tncm91bmRDb2xvciIsImJvcmRlckNvbG9yIiwiYm9yZGVyU3R5bGUiLCJtYXJnaW4iLCJwYWRkaW5nIiwiY29uc29sZSIsImxvYWRIYW5kbGVyIiwiaGFuZGxlclBhdGgiLCJvdXRwdXREaXIiLCJoYW5kbGVyUGFydHMiLCJzcGxpdCIsImZpbGVQYXRoIiwiZXhwb3J0TmFtZSIsImxlbmd0aCIsInNsaWNlIiwiaW5jbHVkZXMiLCJlcnJvciIsInBhdGhQYXJ0cyIsImxhc3RQYXJ0IiwiZnVsbFBhdGgiLCJleHRlbnNpb25zIiwicGF0aFdpdGhvdXRFeHQiLCJyZXBsYWNlIiwiZXh0IiwiY2FuZGlkYXRlUGF0aCIsIkVycm9yIiwiaW1wb3J0UGF0aCIsImVuZHNXaXRoIiwiaW1wb3J0VXJsIiwiaHJlZiIsImhhbmRsZXJNb2R1bGUiLCJPYmplY3QiLCJrZXlzIiwiaGFuZGxlciIsImRlZmF1bHQiLCJpbXBvcnRFcnJvciIsIm1lc3NhZ2UiLCJzdGFjayIsImNhcHR1cmVDb25zb2xlTG9ncyIsImV2ZW50IiwiY29udGV4dCIsIm9yaWdpbmFsQ29uc29sZUxvZyIsIm9yaWdpbmFsQ29uc29sZUVycm9yIiwib3JpZ2luYWxDb25zb2xlV2FybiIsIndhcm4iLCJvcmlnaW5hbENvbnNvbGVJbmZvIiwiaW5mbyIsImxvZ3MiLCJhcmdzIiwicHVzaCIsInJlc3VsdCIsImdyYXkiLCJmb3JFYWNoIiwiY3JlYXRlRXhwcmVzc1NlcnZlciIsImNvbmZpZyIsImRlYnVnIiwiYXBwIiwidXNlIiwicmVxIiwibmV4dCIsImhlYWRlciIsIm1ldGhvZCIsInNlbmRTdGF0dXMiLCJqc29uIiwibG9hZEdyYXBoUUxTY2hlbWEiLCJncmFwaHFsSGFuZGxlciIsImZ1bmN0aW9ucyIsImZ1bmN0aW9uTmFtZSIsImZ1bmN0aW9uQ29uZmlnIiwiZW50cmllcyIsImV2ZW50cyIsImh0dHAiLCJwYXRoIiwiZ3JhcGhxbFBhdGgiLCJfZnVuY3Rpb25OYW1lIiwiYm9keSIsInF1ZXJ5IiwidmFyaWFibGVzIiwib3BlcmF0aW9uTmFtZSIsImxvZ01lc3NhZ2UiLCJtYXAiLCJhcmciLCJTdHJpbmciLCJhd3NSZXF1ZXN0SWQiLCJmdW5jdGlvblZlcnNpb24iLCJnZXRSZW1haW5pbmdUaW1lSW5NaWxsaXMiLCJpbnZva2VkRnVuY3Rpb25Bcm4iLCJsb2dHcm91cE5hbWUiLCJsb2dTdHJlYW1OYW1lIiwid3JhcHBlZEhhbmRsZXIiLCJoZWFkZXJzIiwiaHR0cE1ldGhvZCIsInF1ZXJ5U3RyaW5nUGFyYW1ldGVycyIsInN0YXR1c0NvZGUiLCJzdGF0dXMiLCJrZXkiLCJ2YWx1ZSIsInNldEhlYWRlciIsInNlbmQiLCJ1cmwiLCJwYXRobmFtZSIsIm1hdGNoZWRGdW5jdGlvbiIsImZ1bmN0aW9uTmFtZXMiLCJldmVudFBhdGgiLCJldmVudE1ldGhvZCIsInRvVXBwZXJDYXNlIiwicmVxdWVzdE1ldGhvZCIsIm5vcm1hbGl6ZWRFdmVudFBhdGgiLCJub3JtYWxpemVkUGF0aG5hbWUiLCJtZW1vcnlMaW1pdEluTUIiLCJjcmVhdGVXZWJTb2NrZXRTZXJ2ZXIiLCJ3c3MiLCJwb3J0Iiwib24iLCJ3cyIsInRvU3RyaW5nIiwid2Vic29ja2V0Iiwicm91dGUiLCJhY3Rpb24iLCJyZXF1ZXN0Q29udGV4dCIsImFwaUdhdGV3YXkiLCJlbmRwb2ludCIsImNvbm5lY3Rpb25JZCIsInJvdXRlS2V5IiwibG9hZEVudkZpbGUiLCJlbnZQYXRoIiwiZW52VmFycyIsImVudkNvbnRlbnQiLCJsaW5lcyIsImxpbmUiLCJ0cmltbWVkTGluZSIsInN0YXJ0c1dpdGgiLCJlcXVhbEluZGV4IiwiaW5kZXhPZiIsInN1YnN0cmluZyIsImNsZWFuVmFsdWUiLCJzZXJ2ZXJsZXNzIiwiY21kIiwiY2FsbGJhY2siLCJjbGlOYW1lIiwicmVtb3ZlIiwidGVzdCIsInVzZVB1YmxpY0lwIiwic3Bpbm5lciIsInBhcnNlQ29uZmlnIiwib3V0cHV0RnVsbFBhdGgiLCJlbnZQYXRocyIsInByb2Nlc3MiLCJjd2QiLCJmaWxlRW52VmFycyIsInZhcmlhYmxlc09iaiIsIk5PREVfRU5WIiwiY2xpVmFycyIsIl9lcnJvciIsImVudiIsInN0YXJ0Iiwic3VjY2VlZCIsInNlcnZlcmxlc3NDb25maWciLCJwYWNrYWdlRGlyIiwiY29uZmlnRm9ybWF0cyIsImNvbmZpZ1BhdGgiLCJjb25maWdNb2R1bGUiLCJmaW5hbENvbmZpZyIsImN1c3RvbSIsImNvcnMiLCJleHByZXNzQXBwIiwid3NTZXJ2ZXIiLCJmYWlsIiwic2VydmVyIiwibGlzdGVuIiwic2h1dGRvd24iLCJjbG9zZSIsInN0ZGluIiwicmVzdW1lIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxPQUFPQSxXQUFXLFFBQVE7QUFDMUIsT0FBT0MsV0FBVyxRQUFRO0FBQzFCLE9BQU9DLGFBQWEsVUFBVTtBQUM5QixTQUFRQyxZQUFZLEVBQUVDLFVBQVUsRUFBRUMsU0FBUyxFQUFFQyxhQUFhLFFBQU8sS0FBSztBQUN0RSxTQUFRQyxPQUFPLFFBQU8sS0FBSztBQUMzQixTQUFRQyxXQUFXQyxXQUFXLEVBQUVDLElBQUksRUFBRUMsVUFBVSxRQUFPLE9BQU87QUFDOUQsU0FBUUMsYUFBYSxRQUFPLE1BQU07QUFDbEMsU0FBUUMsZUFBZSxRQUFPLEtBQUs7QUFFbkMsU0FBUUMsU0FBUyxFQUFFQyxhQUFhLFFBQU8scUJBQXFCO0FBQzVELFNBQVFDLGFBQWEsRUFBRUMsV0FBVyxRQUFPLHFCQUFxQjtBQUM5RCxTQUFRQyxHQUFHLFFBQU8scUJBQXFCO0FBbUR2QyxNQUFNQyxjQUFjO0lBQ2xCLE1BQU1DLFdBQVdWLEtBQUtILFdBQVc7SUFDakMsSUFBRyxDQUFDSCxXQUFXZ0IsV0FBVztRQUN4QmYsVUFBVWUsVUFBVTtZQUFDQyxXQUFXO1FBQUk7SUFDdEM7SUFDQSxPQUFPRDtBQUNUO0FBRUEsTUFBTUUsZUFB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nlabs/lex",
3
- "version": "1.52.17",
3
+ "version": "1.52.18",
4
4
  "description": "Lex",
5
5
  "license": "MIT",
6
6
  "type": "module",
package/webpack.config.js CHANGED
@@ -486,7 +486,16 @@ export default (webpackEnv, webpackOptions) => {
486
486
  {
487
487
  loader: cssLoaderPath,
488
488
  options: {
489
- importLoaders: 1
489
+ importLoaders: 1,
490
+ url: {
491
+ filter: (url, resourcePath) => {
492
+ if(url.startsWith('/')) {
493
+ return false;
494
+ }
495
+
496
+ return true;
497
+ }
498
+ }
490
499
  }
491
500
  },
492
501
  {
@@ -498,7 +507,18 @@ export default (webpackEnv, webpackOptions) => {
498
507
  addDependencyTo: webpack,
499
508
  path: [relativeNodePath('', dirName)]
500
509
  }),
501
- postcssUrl(),
510
+ postcssUrl({
511
+ // Skip processing absolute URLs (starting with /) - let them pass through as-is
512
+ filter: (asset) => {
513
+ const url = asset.url || '';
514
+ // If URL starts with /, it's an absolute path - don't process it
515
+ if(url.startsWith('/')) {
516
+ return false;
517
+ }
518
+ // Process relative URLs
519
+ return true;
520
+ }
521
+ }),
502
522
  postcssFor(),
503
523
  postcssPercentage({
504
524
  floor: true,