@dcl/sdk 7.0.6-4197739270.commit-db87ed8 → 7.0.6-4217957637.commit-a393ef7

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.
Files changed (88) hide show
  1. package/package.json +6 -30
  2. package/cli/commands/build/helpers.d.ts +0 -21
  3. package/cli/commands/build/helpers.js +0 -50
  4. package/cli/commands/build/helpers.ts +0 -89
  5. package/cli/commands/build/index.d.ts +0 -19
  6. package/cli/commands/build/index.js +0 -69
  7. package/cli/commands/build/index.ts +0 -91
  8. package/cli/commands/init/index.d.ts +0 -17
  9. package/cli/commands/init/index.js +0 -51
  10. package/cli/commands/init/index.ts +0 -67
  11. package/cli/commands/init/repos.d.ts +0 -9
  12. package/cli/commands/init/repos.js +0 -12
  13. package/cli/commands/init/repos.ts +0 -17
  14. package/cli/commands/preview/bff.d.ts +0 -3
  15. package/cli/commands/preview/bff.js +0 -54
  16. package/cli/commands/preview/bff.ts +0 -63
  17. package/cli/commands/preview/catalyst.d.ts +0 -5
  18. package/cli/commands/preview/catalyst.js +0 -24
  19. package/cli/commands/preview/catalyst.ts +0 -31
  20. package/cli/commands/preview/coordinates.d.ts +0 -20
  21. package/cli/commands/preview/coordinates.js +0 -90
  22. package/cli/commands/preview/coordinates.ts +0 -146
  23. package/cli/commands/preview/endpoints.d.ts +0 -10
  24. package/cli/commands/preview/endpoints.js +0 -455
  25. package/cli/commands/preview/endpoints.ts +0 -568
  26. package/cli/commands/preview/eth.d.ts +0 -2
  27. package/cli/commands/preview/eth.js +0 -6
  28. package/cli/commands/preview/eth.ts +0 -3
  29. package/cli/commands/preview/index.d.ts +0 -20
  30. package/cli/commands/preview/index.js +0 -100
  31. package/cli/commands/preview/index.ts +0 -98
  32. package/cli/commands/preview/port.d.ts +0 -1
  33. package/cli/commands/preview/port.js +0 -21
  34. package/cli/commands/preview/port.ts +0 -15
  35. package/cli/commands/preview/project.d.ts +0 -14
  36. package/cli/commands/preview/project.js +0 -77
  37. package/cli/commands/preview/project.ts +0 -112
  38. package/cli/commands/preview/types.d.ts +0 -18
  39. package/cli/commands/preview/types.js +0 -3
  40. package/cli/commands/preview/types.ts +0 -26
  41. package/cli/commands/preview/wire.d.ts +0 -2
  42. package/cli/commands/preview/wire.js +0 -66
  43. package/cli/commands/preview/wire.ts +0 -70
  44. package/cli/commands/preview/ws.d.ts +0 -7
  45. package/cli/commands/preview/ws.js +0 -16
  46. package/cli/commands/preview/ws.ts +0 -24
  47. package/cli/commands/start/index.d.ts +0 -29
  48. package/cli/commands/start/index.js +0 -126
  49. package/cli/commands/start/index.ts +0 -145
  50. package/cli/components/fetch.d.ts +0 -5
  51. package/cli/components/fetch.js +0 -34
  52. package/cli/components/fetch.ts +0 -11
  53. package/cli/components/fs.d.ts +0 -12
  54. package/cli/components/fs.js +0 -69
  55. package/cli/components/fs.ts +0 -62
  56. package/cli/components/index.d.ts +0 -7
  57. package/cli/components/index.js +0 -13
  58. package/cli/components/index.ts +0 -14
  59. package/cli/index.d.ts +0 -7
  60. package/cli/index.js +0 -76
  61. package/cli/index.ts +0 -85
  62. package/cli/utils/args.d.ts +0 -10
  63. package/cli/utils/args.js +0 -16
  64. package/cli/utils/args.ts +0 -18
  65. package/cli/utils/commands.d.ts +0 -3
  66. package/cli/utils/commands.js +0 -24
  67. package/cli/utils/commands.ts +0 -28
  68. package/cli/utils/dcl-ignore.d.ts +0 -4
  69. package/cli/utils/dcl-ignore.js +0 -44
  70. package/cli/utils/dcl-ignore.ts +0 -45
  71. package/cli/utils/error.d.ts +0 -2
  72. package/cli/utils/error.js +0 -7
  73. package/cli/utils/error.ts +0 -1
  74. package/cli/utils/exec.d.ts +0 -8
  75. package/cli/utils/exec.js +0 -32
  76. package/cli/utils/exec.ts +0 -42
  77. package/cli/utils/fs.d.ts +0 -10
  78. package/cli/utils/fs.js +0 -26
  79. package/cli/utils/fs.ts +0 -41
  80. package/cli/utils/log.d.ts +0 -5
  81. package/cli/utils/log.js +0 -29
  82. package/cli/utils/log.ts +0 -39
  83. package/cli/utils/object.d.ts +0 -9
  84. package/cli/utils/object.js +0 -45
  85. package/cli/utils/object.ts +0 -62
  86. package/cli/utils/out-messages.d.ts +0 -1
  87. package/cli/utils/out-messages.js +0 -8
  88. package/cli/utils/out-messages.ts +0 -3
@@ -1,455 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
- Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.getFilesFromFolder = exports.setupEcs6Endpoints = void 0;
30
- const path = __importStar(require("path"));
31
- const glob_1 = require("glob");
32
- const sdk_1 = require("@dcl/schemas/dist/sdk");
33
- const schemas_1 = require("@dcl/schemas");
34
- const ignore_1 = __importDefault(require("ignore"));
35
- const node_fetch_1 = __importStar(require("node-fetch"));
36
- const catalyst_1 = require("./catalyst");
37
- const fs_1 = require("fs");
38
- const dcl_ignore_1 = require("../../utils/dcl-ignore");
39
- function getCatalystUrl() {
40
- return new URL('https://peer.decentraland.org');
41
- }
42
- function smartWearableNameToId(name) {
43
- return name.toLocaleLowerCase().replace(/ /g, '-');
44
- }
45
- function setupEcs6Endpoints(components, dir, router) {
46
- const baseFolders = [dir];
47
- router.get('/scene.json', async () => {
48
- return {
49
- headers: { 'content-type': 'application/json' },
50
- body: components.fs.createReadStream(path.join(dir, 'scene.json'))
51
- };
52
- });
53
- router.get('/lambdas/explore/realms', async (ctx) => {
54
- return {
55
- body: [
56
- {
57
- serverName: 'localhost',
58
- url: `http://${ctx.url.host}`,
59
- layer: 'stub',
60
- usersCount: 0,
61
- maxUsers: 100,
62
- userParcels: []
63
- }
64
- ]
65
- };
66
- });
67
- router.get('/lambdas/contracts/servers', async (ctx) => {
68
- return {
69
- body: [
70
- {
71
- address: `http://${ctx.url.host}`,
72
- owner: '0x0000000000000000000000000000000000000000',
73
- id: '0x0000000000000000000000000000000000000000000000000000000000000000'
74
- }
75
- ]
76
- };
77
- });
78
- router.get('/lambdas/profiles', async (ctx, next) => {
79
- const baseUrl = `${ctx.url.protocol}//${ctx.url.host}/content/contents`;
80
- try {
81
- const previewWearables = await getAllPreviewWearables(components, {
82
- baseFolders,
83
- baseUrl
84
- });
85
- if (previewWearables.length === 1) {
86
- const catalystUrl = getCatalystUrl();
87
- const u = new URL(ctx.url.toString());
88
- u.host = catalystUrl.host;
89
- u.protocol = catalystUrl.protocol;
90
- u.port = catalystUrl.port;
91
- const req = await (0, node_fetch_1.default)(u.toString(), {
92
- headers: {
93
- connection: 'close'
94
- },
95
- method: ctx.request.method,
96
- body: ctx.request.method === 'get' ? undefined : ctx.request.body
97
- });
98
- const deployedProfile = (await req.json());
99
- if ((deployedProfile === null || deployedProfile === void 0 ? void 0 : deployedProfile.length) === 1) {
100
- deployedProfile[0].avatars[0].avatar.wearables.push(...previewWearables.map(($) => $.id));
101
- return {
102
- headers: {
103
- 'content-type': req.headers.get('content-type') || 'application/binary'
104
- },
105
- body: deployedProfile
106
- };
107
- }
108
- }
109
- }
110
- catch (err) {
111
- console.warn(`Failed to catch profile and fill with preview wearables.`, err);
112
- }
113
- return next();
114
- });
115
- router.all('/lambdas/:path+', async (ctx) => {
116
- const catalystUrl = getCatalystUrl();
117
- const u = new URL(ctx.url.toString());
118
- u.host = catalystUrl.host;
119
- u.protocol = catalystUrl.protocol;
120
- u.port = catalystUrl.port;
121
- const req = await (0, node_fetch_1.default)(u.toString(), {
122
- headers: {
123
- connection: 'close'
124
- },
125
- method: ctx.request.method,
126
- body: ctx.request.method === 'get' ? undefined : ctx.request.body
127
- });
128
- return {
129
- headers: {
130
- 'content-type': req.headers.get('content-type') || 'application/binary'
131
- },
132
- body: req.body
133
- };
134
- });
135
- router.post('/content/entities', async (ctx) => {
136
- const catalystUrl = getCatalystUrl();
137
- const headers = new node_fetch_1.Headers();
138
- console.log(ctx.request.headers);
139
- const res = await (0, node_fetch_1.default)(`${catalystUrl.toString()}/content/entities`, {
140
- method: 'post',
141
- headers,
142
- body: ctx.request.body
143
- });
144
- return res;
145
- });
146
- serveStatic(components, dir, router);
147
- serveFolders(components, router, baseFolders);
148
- }
149
- exports.setupEcs6Endpoints = setupEcs6Endpoints;
150
- function serveFolders(components, router, baseFolders) {
151
- router.get('/content/contents/:hash', async (ctx, next) => {
152
- if (ctx.params.hash && ctx.params.hash.startsWith('b64-')) {
153
- const fullPath = path.resolve(Buffer.from(ctx.params.hash.replace(/^b64-/, ''), 'base64').toString('utf8'));
154
- if (!baseFolders.find((folder) => fullPath.startsWith(folder))) {
155
- return next();
156
- }
157
- return {
158
- headers: {
159
- 'x-timestamp': Date.now(),
160
- 'x-sent': true,
161
- 'cache-control': 'no-cache,private,max-age=1'
162
- },
163
- body: components.fs.createReadStream(fullPath)
164
- };
165
- }
166
- return next();
167
- });
168
- async function pointerRequestHandler(pointers) {
169
- if (!pointers || pointers.length === 0) {
170
- return [];
171
- }
172
- const requestedPointers = new Set(pointers && typeof pointers === 'string' ? [pointers] : pointers);
173
- const resultEntities = await getSceneJson(components, {
174
- baseFolders,
175
- pointers: Array.from(requestedPointers)
176
- });
177
- const catalystUrl = getCatalystUrl();
178
- const remote = (0, catalyst_1.fetchEntityByPointer)(catalystUrl.toString(), pointers.filter(($) => !$.match(/-?\d+,-?\d+/)));
179
- const serverEntities = Array.isArray(remote) ? remote : [];
180
- return [...resultEntities, ...serverEntities];
181
- }
182
- router.get('/content/entities/scene', async (ctx) => {
183
- return {
184
- body: await pointerRequestHandler(ctx.url.searchParams.getAll('pointer'))
185
- };
186
- });
187
- router.post('/content/entities/active', async (ctx) => {
188
- const body = await ctx.request.json();
189
- return {
190
- body: await pointerRequestHandler(body.pointers)
191
- };
192
- });
193
- router.get('/preview-wearables/:id', async (ctx) => {
194
- const baseUrl = `${ctx.url.protocol}//${ctx.url.host}/content/contents`;
195
- const wearables = await getAllPreviewWearables(components, {
196
- baseUrl,
197
- baseFolders
198
- });
199
- const wearableId = ctx.params.id;
200
- return {
201
- body: {
202
- ok: true,
203
- data: wearables.filter((wearable) => smartWearableNameToId(wearable === null || wearable === void 0 ? void 0 : wearable.name) === wearableId)
204
- }
205
- };
206
- });
207
- router.get('/preview-wearables', async (ctx) => {
208
- const baseUrl = `${ctx.url.protocol}//${ctx.url.host}/content/contents`;
209
- return {
210
- body: {
211
- ok: true,
212
- data: await getAllPreviewWearables(components, { baseUrl, baseFolders })
213
- }
214
- };
215
- });
216
- }
217
- const defaultHashMaker = (str) => 'b64-' + Buffer.from(str).toString('base64');
218
- async function getAllPreviewWearables(components, { baseFolders, baseUrl }) {
219
- const wearablePathArray = [];
220
- for (const wearableDir of baseFolders) {
221
- const wearableJsonPath = path.resolve(wearableDir, 'wearable.json');
222
- if (await components.fs.fileExists(wearableJsonPath)) {
223
- wearablePathArray.push(wearableJsonPath);
224
- }
225
- }
226
- const ret = [];
227
- for (const wearableJsonPath of wearablePathArray) {
228
- try {
229
- ret.push(await serveWearable(components, { wearableJsonPath, baseUrl }));
230
- }
231
- catch (err) {
232
- console.error(`Couldn't mock the wearable ${wearableJsonPath}. Please verify the correct format and scheme.`, err);
233
- }
234
- }
235
- return ret;
236
- }
237
- async function serveWearable(components, { wearableJsonPath, baseUrl }) {
238
- var _a;
239
- const wearableDir = path.dirname(wearableJsonPath);
240
- const wearableJson = JSON.parse((await components.fs.readFile(wearableJsonPath)).toString());
241
- if (!sdk_1.WearableJson.validate(wearableJson)) {
242
- const errors = (sdk_1.WearableJson.validate.errors || []).map((a) => `${a.data} ${a.message}`).join('');
243
- console.error(`Unable to validate wearable.json properly, please check it.`, errors);
244
- throw new Error(`Invalid wearable.json (${wearableJsonPath})`);
245
- }
246
- const hashedFiles = await getFilesFromFolder(components, {
247
- folder: wearableDir,
248
- addOriginalPath: false
249
- });
250
- const thumbnailFiltered = hashedFiles.filter(($) => ($ === null || $ === void 0 ? void 0 : $.file) === 'thumbnail.png');
251
- const thumbnail = thumbnailFiltered.length > 0 && ((_a = thumbnailFiltered[0]) === null || _a === void 0 ? void 0 : _a.hash) && `${baseUrl}/${thumbnailFiltered[0].hash}`;
252
- const wearableId = 'urn:8dc2d7ad-97e3-44d0-ba89-e8305d795a6a';
253
- const representations = wearableJson.data.representations.map((representation) => (Object.assign(Object.assign({}, representation), { mainFile: `male/${representation.mainFile}`, contents: hashedFiles.map(($) => ({
254
- key: `male/${$ === null || $ === void 0 ? void 0 : $.file}`,
255
- url: `${baseUrl}/${$ === null || $ === void 0 ? void 0 : $.hash}`,
256
- hash: $ === null || $ === void 0 ? void 0 : $.hash
257
- })) })));
258
- return {
259
- id: wearableId,
260
- rarity: wearableJson.rarity,
261
- i18n: [{ code: 'en', text: wearableJson.name }],
262
- description: wearableJson.description,
263
- thumbnail: thumbnail || '',
264
- image: thumbnail || '',
265
- collectionAddress: '0x0',
266
- baseUrl: `${baseUrl}/`,
267
- name: wearableJson.name || '',
268
- data: {
269
- category: wearableJson.data.category,
270
- replaces: [],
271
- hides: [],
272
- tags: [],
273
- representations: representations
274
- }
275
- };
276
- }
277
- async function getSceneJson(components, { baseFolders, pointers, customHashMaker }) {
278
- const requestedPointers = new Set(pointers);
279
- const resultEntities = [];
280
- const allDeployments = await Promise.all(baseFolders.map(async (folder) => {
281
- return entityV3FromFolder(components, {
282
- folder,
283
- addOriginalPath: false,
284
- customHashMaker
285
- });
286
- }));
287
- for (const pointer of Array.from(requestedPointers)) {
288
- const theDeployment = allDeployments.find(($) => $ && $.pointers.includes(pointer));
289
- if (theDeployment) {
290
- theDeployment.pointers.forEach(($) => requestedPointers.delete($));
291
- resultEntities.push(theDeployment);
292
- }
293
- }
294
- return resultEntities;
295
- }
296
- function serveStatic(components, dir, router) {
297
- const sdkPath = path.dirname(require.resolve('@dcl/sdk/package.json', {
298
- paths: [dir]
299
- }));
300
- const dclExplorerJsonPath = path.dirname(require.resolve('@dcl/explorer/package.json', {
301
- paths: [dir, sdkPath]
302
- }));
303
- const dclKernelDefaultProfilePath = path.resolve(dclExplorerJsonPath, 'default-profile');
304
- const dclKernelImagesDecentralandConnect = path.resolve(dclExplorerJsonPath, 'images', 'decentraland-connect');
305
- const routes = [
306
- {
307
- route: '/',
308
- path: path.resolve(dclExplorerJsonPath, 'preview.html'),
309
- type: 'text/html'
310
- },
311
- {
312
- route: '/favicon.ico',
313
- path: path.resolve(dclExplorerJsonPath, 'favicon.ico'),
314
- type: 'text/html'
315
- },
316
- {
317
- route: '/@/explorer/index.js',
318
- path: path.resolve(dclExplorerJsonPath, 'index.js'),
319
- type: 'text/javascript'
320
- }
321
- ];
322
- for (const route of routes) {
323
- router.get(route.route, async (_ctx) => {
324
- return {
325
- headers: { 'Content-Type': route.type },
326
- body: components.fs.createReadStream(route.path)
327
- };
328
- });
329
- }
330
- function createStaticRoutes(components, route, folder, transform = (str) => str) {
331
- router.get(route, async (ctx, next) => {
332
- const file = ctx.params.path;
333
- const fullPath = path.resolve(folder, transform(file));
334
- if (!(await components.fs.fileExists(fullPath))) {
335
- return next();
336
- }
337
- const headers = {
338
- 'x-timestamp': Date.now(),
339
- 'x-sent': true,
340
- 'cache-control': 'no-cache,private,max-age=1'
341
- };
342
- if (fullPath.endsWith('.wasm')) {
343
- headers['content-type'] = 'application/wasm';
344
- }
345
- return {
346
- headers,
347
- body: components.fs.createReadStream(fullPath)
348
- };
349
- });
350
- }
351
- createStaticRoutes(components, '/images/decentraland-connect/:path+', dclKernelImagesDecentralandConnect);
352
- createStaticRoutes(components, '/default-profile/:path+', dclKernelDefaultProfilePath);
353
- createStaticRoutes(components, '/@/explorer/:path+', dclExplorerJsonPath, (filePath) => filePath.replace(/.br+$/, ''));
354
- router.get('/feature-flags/:file', async (ctx) => {
355
- const res = await (0, node_fetch_1.default)(`https://feature-flags.decentraland.zone/${ctx.params.file}`, {
356
- headers: {
357
- connection: 'close'
358
- }
359
- });
360
- return {
361
- body: await res.arrayBuffer()
362
- };
363
- });
364
- }
365
- async function entityV3FromFolder(components, { folder, addOriginalPath, customHashMaker }) {
366
- const sceneJsonPath = path.resolve(folder, './scene.json');
367
- let isParcelScene = true;
368
- const wearableJsonPath = path.resolve(folder, './wearable.json');
369
- if (await components.fs.fileExists(wearableJsonPath)) {
370
- try {
371
- const wearableJson = JSON.parse(await components.fs.readFile(wearableJsonPath, 'utf-8'));
372
- if (!sdk_1.WearableJson.validate(wearableJson)) {
373
- const errors = (sdk_1.WearableJson.validate.errors || []).map((a) => `${a.data} ${a.message}`).join('');
374
- console.error(`Unable to validate wearable.json properly, please check it.`, errors);
375
- console.error(`Invalid wearable.json (${wearableJsonPath})`);
376
- }
377
- else {
378
- isParcelScene = false;
379
- }
380
- }
381
- catch (err) {
382
- console.error(`Unable to load wearable.json properly`, err);
383
- }
384
- }
385
- const hashMaker = customHashMaker ? customHashMaker : defaultHashMaker;
386
- if ((await components.fs.fileExists(sceneJsonPath)) && isParcelScene) {
387
- const sceneJson = JSON.parse(await components.fs.readFile(sceneJsonPath, 'utf-8'));
388
- const { base, parcels } = sceneJson.scene;
389
- const pointers = new Set();
390
- pointers.add(base);
391
- parcels.forEach(($) => pointers.add($));
392
- const mappedFiles = await getFilesFromFolder(components, {
393
- folder,
394
- addOriginalPath,
395
- customHashMaker
396
- });
397
- return {
398
- version: 'v3',
399
- type: schemas_1.EntityType.SCENE,
400
- id: hashMaker(folder),
401
- pointers: Array.from(pointers),
402
- timestamp: Date.now(),
403
- metadata: sceneJson,
404
- content: mappedFiles
405
- };
406
- }
407
- return null;
408
- }
409
- async function getFilesFromFolder(components, { folder, addOriginalPath, customHashMaker }) {
410
- const hashMaker = customHashMaker ? customHashMaker : defaultHashMaker;
411
- const ignorePatterns = await (0, dcl_ignore_1.getDCLIgnorePatterns)(components, folder);
412
- const allFiles = (0, glob_1.sync)('**/*', {
413
- ignore: ignorePatterns,
414
- cwd: folder,
415
- dot: false,
416
- absolute: true
417
- })
418
- .map((file) => {
419
- try {
420
- if (!(0, fs_1.statSync)(file).isFile())
421
- return;
422
- }
423
- catch (err) {
424
- return;
425
- }
426
- const _folder = folder.replace(/\\/gi, '/');
427
- const key = file.replace(_folder, '').replace(/^\/+/, '');
428
- return key;
429
- })
430
- .filter(($) => !!$);
431
- const ig = (0, ignore_1.default)().add(ignorePatterns);
432
- const filteredFiles = ig.filter(allFiles);
433
- const ret = [];
434
- for (const file of filteredFiles) {
435
- const absolutePath = path.resolve(folder, file);
436
- try {
437
- if (!(0, fs_1.statSync)(absolutePath).isFile())
438
- continue;
439
- }
440
- catch (err) {
441
- console.error(err);
442
- continue;
443
- }
444
- const absoluteFolder = folder.replace(/\\/gi, '/');
445
- const relativeFilePathToFolder = file.replace(absoluteFolder, '').replace(/^\/+/, '');
446
- ret.push({
447
- file: relativeFilePathToFolder.toLowerCase(),
448
- original_path: addOriginalPath ? absolutePath : undefined,
449
- hash: hashMaker(absolutePath)
450
- });
451
- }
452
- return ret;
453
- }
454
- exports.getFilesFromFolder = getFilesFromFolder;
455
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5kcG9pbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZW5kcG9pbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsMkNBQTRCO0FBQzVCLCtCQUF1QztBQUN2QywrQ0FBb0Q7QUFDcEQsMENBQW1GO0FBQ25GLG9EQUEyQjtBQUMzQix5REFBMkM7QUFDM0MseUNBQWlEO0FBRWpELDJCQUE2QjtBQUM3Qix1REFBNkQ7QUFFN0QsU0FBUyxjQUFjO0lBQ3JCLE9BQU8sSUFBSSxHQUFHLENBQUMsK0JBQStCLENBQUMsQ0FBQTtBQUNqRCxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FBQyxJQUFZO0lBQ3pDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQTtBQUNwRCxDQUFDO0FBTUQsU0FBZ0Isa0JBQWtCLENBQUMsVUFBeUIsRUFBRSxHQUFXLEVBQUUsTUFBaUM7SUFDMUcsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUV6QixNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNuQyxPQUFPO1lBQ0wsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO1lBQy9DLElBQUksRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQ25FLENBQUE7SUFDSCxDQUFDLENBQUMsQ0FBQTtJQUVGLE1BQU0sQ0FBQyxHQUFHLENBQUMseUJBQXlCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ2xELE9BQU87WUFDTCxJQUFJLEVBQUU7Z0JBQ0o7b0JBQ0UsVUFBVSxFQUFFLFdBQVc7b0JBQ3ZCLEdBQUcsRUFBRSxVQUFVLEdBQUcsQ0FBQyxHQUFHLENB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LElBQUEsYUFBUSxFQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sRUFBRTtnQkFBRSxTQUFRO1NBQy9DO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2xCLFNBQVE7U0FDVDtRQUVELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBRWxELE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUVyRixHQUFHLENBQUMsSUFBSSxDQUFDO1lBQ1AsSUFBSSxFQUFFLHdCQUF3QixDQUFDLFdBQVcsRUFBRTtZQUM1QyxhQUFhLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDekQsSUFBSSxFQUFFLFNBQVMsQ0FBQyxZQUFZLENBQUM7U0FDOUIsQ0FBQyxDQUFBO0tBQ0g7SUFFRCxPQUFPLEdBQUcsQ0FBQTtBQUNaLENBQUM7QUEzREQsZ0RBMkRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQHdlbGwta25vd24tY29tcG9uZW50cy9odHRwLXNlcnZlcidcbmltcG9ydCB7IFByZXZpZXdDb21wb25lbnRzIH0gZnJvbSAnLi90eXBlcydcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCB7IHN5bmMgYXMgZ2xvYlN5bmMgfSBmcm9tICdnbG9iJ1xuaW1wb3J0IHsgV2VhcmFibGVKc29uIH0gZnJvbSAnQGRjbC9zY2hlbWFzL2Rpc3Qvc2RrJ1xuaW1wb3J0IHsgQ29udGVudE1hcHBpbmcsIEVudGl0eSwgRW50aXR5VHlwZSwgTG9jYWxlLCBXZWFyYWJsZSB9IGZyb20gJ0BkY2wvc2NoZW1hcydcbmltcG9ydCBpZ25vcmUgZnJvbSAnaWdub3JlJ1xuaW1wb3J0IGZldGNoLCB7IEhlYWRlcnMgfSBmcm9tICdub2RlLWZldGNoJ1xuaW1wb3J0IHsgZmV0Y2hFbnRpdHlCeVBvaW50ZXIgfSBmcm9tICcuL2NhdGFseXN0J1xuaW1wb3J0IHsgQ2xpQ29tcG9uZW50cyB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMnXG5pbXBvcnQgeyBzdGF0U3luYyB9IGZyb20gJ2ZzJ1xuaW1wb3J0IHsgZ2V0RENMSWdub3JlUGF0dGVybnMgfSBmcm9tICcuLi8uLi91dGlscy9kY2wtaWdub3JlJ1xuXG5mdW5jdGlvbiBnZXRDYXRhbHlzdFVybCgpOiBVUkwge1xuICByZXR1cm4gbmV3IFVSTCgnaHR0cHM6Ly9wZWVyLmRlY2VudHJhbGFuZC5vcmcnKVxufVxuXG5mdW5jdGlvbiBzbWFydFdlYXJhYmxlTmFtZVRvSWQobmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiBuYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkucmVwbGFjZSgvIC9nLCAnLScpXG59XG5cbnR5cGUgTGFtYmRhc1dlYXJhYmxlID0gV2VhcmFibGUgJiB7XG4gIGJhc2VVcmw6IHN0cmluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBFY3M2RW5kcG9pbnRzKGNvbXBvbmVudHM6IENsaUNvbXBvbmVudHMsIGRpcjogc3RyaW5nLCByb3V0ZXI6IFJvdXRlcjxQcmV2aWV3Q29tcG9uZW50cz4pIHtcbiAgY29uc3QgYmFzZUZvbGRlcnMgPSBbZGlyXVxuICAvLyBoYW5kbGUgb2xkIHByZXZpZXcgc2NlbmUuanNvblxuICByb3V0ZXIuZ2V0KCcvc2NlbmUuanNvbicsIGFzeW5jICgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVhZGVyczogeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBjb21wb25lbnRzLmZzLmNyZWF0ZVJlYWRTdHJlYW0ocGF0aC5qb2luKGRpciwgJ3NjZW5lLmpzb24nKSlcbiAgICB9XG4gIH0pXG5cbiAgcm91dGVyLmdldCgnL2xhbWJkYXMvZXhwbG9yZS9yZWFsbXMnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJvZHk6IFtcbiAgICAgICAge1xuICAgICAgICAgIHNlcnZlck5hbWU6ICdsb2NhbGhvc3QnLFxuICAgICAgICAgIHVybDogYGh0dHA6Ly8ke2N0eC51cmwuaG9zdH1gLFxuICAgICAgICAgIGxheWVyOiAnc3R1YicsXG4gICAgICAgICAgdXNlcnNDb3VudDogMCxcbiAgICAgICAgICBtYXhVc2VyczogMTAwLFxuICAgICAgICAgIHVzZXJQYXJjZWxzOiBbXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICB9KVxuXG4gIHJvdXRlci5nZXQoJy9sYW1iZGFzL2NvbnRyYWN0cy9zZXJ2ZXJzJywgYXN5bmMgKGN0eCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBib2R5OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBgaHR0cDovLyR7Y3R4LnVybC5ob3N0fWAsXG4gICAgICAgICAgb3duZXI6ICcweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgIGlkOiAnMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJ1xuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICB9KVxuXG4gIHJvdXRlci5nZXQoJy9sYW1iZGFzL3Byb2ZpbGVzJywgYXN5bmMgKGN0eCwgbmV4dCkgPT4ge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBgJHtjdHgudXJsLnByb3RvY29sfS8vJHtjdHgudXJsLmhvc3R9L2NvbnRlbnQvY29udGVudHNgXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJldmlld1dlYXJhYmxlcyA9IGF3YWl0IGdldEFsbFByZXZpZXdXZWFyYWJsZXMoY29tcG9uZW50cywge1xuICAgICAgICBiYXNlRm9sZGVycyxcbiAgICAgICAgYmFzZVVybFxuICAgICAgfSlcblxuICAgICAgaWYgKHByZXZpZXdXZWFyYWJsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IGNhdGFseXN0VXJsID0gZ2V0Q2F0YWx5c3RVcmwoKVxuXG4gICAgICAgIGNvbnN0IHUgPSBuZXcgVVJMKGN0eC51cmwudG9TdHJpbmcoKSlcbiAgICAgICAgdS5ob3N0ID0gY2F0YWx5c3RVcmwuaG9zdFxuICAgICAgICB1LnByb3RvY29sID0gY2F0YWx5c3RVcmwucHJvdG9jb2xcbiAgICAgICAgdS5wb3J0ID0gY2F0YWx5c3RVcmwucG9ydFxuICAgICAgICBjb25zdCByZXEgPSBhd2FpdCBmZXRjaCh1LnRvU3RyaW5nKCksIHtcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBjb25uZWN0aW9uOiAnY2xvc2UnXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZXRob2Q6IGN0eC5yZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICBib2R5OiBjdHgucmVxdWVzdC5tZXRob2QgPT09ICdnZXQnID8gdW5kZWZpbmVkIDogY3R4LnJlcXVlc3QuYm9keVxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IGRlcGxveWVkUHJvZmlsZSA9IChhd2FpdCByZXEuanNvbigpKSBhcyBhbnlbXVxuXG4gICAgICAgIGlmIChkZXBsb3llZFByb2ZpbGU/Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGRlcGxveWVkUHJvZmlsZVswXS5hdmF0YXJzWzBdLmF2YXRhci53ZWFyYWJsZXMucHVzaCguLi5wcmV2aWV3V2VhcmFibGVzLm1hcCgoJCkgPT4gJC5pZCkpXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6IHJlcS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykgfHwgJ2FwcGxpY2F0aW9uL2JpbmFyeSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiBkZXBsb3llZFByb2ZpbGVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGNhdGNoIHByb2ZpbGUgYW5kIGZpbGwgd2l0aCBwcmV2aWV3IHdlYXJhYmxlcy5gLCBlcnIpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQoKVxuICB9KVxuXG4gIHJvdXRlci5hbGwoJy9sYW1iZGFzLzpwYXRoKycsIGFzeW5jIChjdHgpID0+IHtcbiAgICBjb25zdCBjYXRhbHlzdFVybCA9IGdldENhdGFseXN0VXJsKClcbiAgICBjb25zdCB1ID0gbmV3IFVSTChjdHgudXJsLnRvU3RyaW5nKCkpXG4gICAgdS5ob3N0ID0gY2F0YWx5c3RVcmwuaG9zdFxuICAgIHUucHJvdG9jb2wgPSBjYXRhbHlzdFVybC5wcm90b2NvbFxuICAgIHUucG9ydCA9IGNhdGFseXN0VXJsLnBvcnRcbiAgICBjb25zdCByZXEgPSBhd2FpdCBmZXRjaCh1LnRvU3RyaW5nKCksIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgY29ubmVjdGlvbjogJ2Nsb3NlJ1xuICAgICAgfSxcbiAgICAgIG1ldGhvZDogY3R4LnJlcXVlc3QubWV0aG9kLFxuICAgICAgYm9keTogY3R4LnJlcXVlc3QubWV0aG9kID09PSAnZ2V0JyA/IHVuZGVmaW5lZCA6IGN0eC5yZXF1ZXN0LmJvZHlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ2NvbnRlbnQtdHlwZSc6IHJlcS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykgfHwgJ2FwcGxpY2F0aW9uL2JpbmFyeSdcbiAgICAgIH0sXG4gICAgICBib2R5OiByZXEuYm9keVxuICAgIH1cbiAgfSlcblxuICByb3V0ZXIucG9zdCgnL2NvbnRlbnQvZW50aXRpZXMnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgY29uc3QgY2F0YWx5c3RVcmwgPSBnZXRDYXRhbHlzdFVybCgpXG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKClcbiAgICBjb25zb2xlLmxvZyhjdHgucmVxdWVzdC5oZWFkZXJzKVxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke2NhdGFseXN0VXJsLnRvU3RyaW5nKCl9L2NvbnRlbnQvZW50aXRpZXNgLCB7XG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBib2R5OiBjdHgucmVxdWVzdC5ib2R5XG4gICAgfSlcblxuICAgIHJldHVybiByZXNcbiAgfSlcblxuICBzZXJ2ZVN0YXRpYyhjb21wb25lbnRzLCBkaXIsIHJvdXRlcilcblxuICAvLyBUT0RPOiBnZXQgd29ya3NwYWNlIHNjZW5lcyAmIHdlYXJhYmxlcy4uLlxuXG4gIHNlcnZlRm9sZGVycyhjb21wb25lbnRzLCByb3V0ZXIsIGJhc2VGb2xkZXJzKVxufVxuXG5mdW5jdGlvbiBzZXJ2ZUZvbGRlcnMoY29tcG9uZW50czogUGljazxDbGlDb21wb25lbnRzLCAnZnMnPiwgcm91dGVyOiBSb3V0ZXI8UHJldmlld0NvbXBvbmVudHM+LCBiYXNlRm9sZGVyczogc3RyaW5nW10pIHtcbiAgcm91dGVyLmdldCgnL2NvbnRlbnQvY29udGVudHMvOmhhc2gnLCBhc3luYyAoY3R4OiBhbnksIG5leHQ6IGFueSkgPT4ge1xuICAgIGlmIChjdHgucGFyYW1zLmhhc2ggJiYgY3R4LnBhcmFtcy5oYXNoLnN0YXJ0c1dpdGgoJ2I2NC0nKSkge1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLnJlc29sdmUoQnVmZmVyLmZyb20oY3R4LnBhcmFtcy5oYXNoLnJlcGxhY2UoL15iNjQtLywgJycpLCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0ZjgnKSlcblxuICAgICAgLy8gb25seSByZXR1cm4gZmlsZXMgSUYgdGhlIGZpbGUgaXMgd2l0aGluIGEgYmFzZUZvbGRlclxuICAgICAgaWYgKCFiYXNlRm9sZGVycy5maW5kKChmb2xkZXI6IHN0cmluZykgPT4gZnVsbFBhdGguc3RhcnRzV2l0aChmb2xkZXIpKSkge1xuICAgICAgICByZXR1cm4gbmV4dCgpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAneC10aW1lc3RhbXAnOiBEYXRlLm5vdygpLFxuICAgICAgICAgICd4LXNlbnQnOiB0cnVlLFxuICAgICAgICAgICdjYWNoZS1jb250cm9sJzogJ25vLWNhY2hlLHByaXZhdGUsbWF4LWFnZT0xJ1xuICAgICAgICB9LFxuICAgICAgICBib2R5OiBjb21wb25lbnRzLmZzLmNyZWF0ZVJlYWRTdHJlYW0oZnVsbFBhdGgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQoKVxuICB9KVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHBvaW50ZXJSZXF1ZXN0SGFuZGxlcihwb2ludGVyczogc3RyaW5nW10pIHtcbiAgICBpZiAoIXBvaW50ZXJzIHx8IHBvaW50ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdGVkUG9pbnRlcnMgPSBuZXcgU2V0PHN0cmluZz4oXG4gICAgICBwb2ludGVycyAmJiB0eXBlb2YgcG9pbnRlcnMgPT09ICdzdHJpbmcnID8gW3BvaW50ZXJzIGFzIHN0cmluZ10gOiAocG9pbnRlcnMgYXMgc3RyaW5nW10pXG4gICAgKVxuXG4gICAgY29uc3QgcmVzdWx0RW50aXRpZXMgPSBhd2FpdCBnZXRTY2VuZUpzb24oY29tcG9uZW50cywge1xuICAgICAgYmFzZUZvbGRlcnMsXG4gICAgICBwb2ludGVyczogQXJyYXkuZnJvbShyZXF1ZXN0ZWRQb2ludGVycylcbiAgICB9KVxuICAgIGNvbnN0IGNhdGFseXN0VXJsID0gZ2V0Q2F0YWx5c3RVcmwoKVxuICAgIGNvbnN0IHJlbW90ZSA9IGZldGNoRW50aXR5QnlQb2ludGVyKFxuICAgICAgY2F0YWx5c3RVcmwudG9TdHJpbmcoKSxcbiAgICAgIHBvaW50ZXJzLmZpbHRlcigoJDogc3RyaW5nKSA9PiAhJC5tYXRjaCgvLT9cXGQrLC0/XFxkKy8pKVxuICAgIClcblxuICAgIGNvbnN0IHNlcnZlckVudGl0aWVzID0gQXJyYXkuaXNBcnJheShyZW1vdGUpID8gcmVtb3RlIDogW11cblxuICAgIHJldHVybiBbLi4ucmVzdWx0RW50aXRpZXMsIC4uLnNlcnZlckVudGl0aWVzXVxuICB9XG5cbiAgLy8gUkVWSUVXIFJFU1BPTlNFIEZPUk1BVFxuICByb3V0ZXIuZ2V0KCcvY29udGVudC9lbnRpdGllcy9zY2VuZScsIGFzeW5jIChjdHgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgYm9keTogYXdhaXQgcG9pbnRlclJlcXVlc3RIYW5kbGVyKGN0eC51cmwuc2VhcmNoUGFyYW1zLmdldEFsbCgncG9pbnRlcicpKVxuICAgIH1cbiAgfSlcblxuICAvLyBSRVZJRVcgUkVTUE9OU0UgRk9STUFUXG4gIHJvdXRlci5wb3N0KCcvY29udGVudC9lbnRpdGllcy9hY3RpdmUnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgY29uc3QgYm9keSA9IGF3YWl0IGN0eC5yZXF1ZXN0Lmpzb24oKVxuICAgIHJldHVybiB7XG4gICAgICBib2R5OiBhd2FpdCBwb2ludGVyUmVxdWVzdEhhbmRsZXIoYm9keS5wb2ludGVycylcbiAgICB9XG4gIH0pXG5cbiAgcm91dGVyLmdldCgnL3ByZXZpZXctd2VhcmFibGVzLzppZCcsIGFzeW5jIChjdHgpID0+IHtcbiAgICBjb25zdCBiYXNlVXJsID0gYCR7Y3R4LnVybC5wcm90b2NvbH0vLyR7Y3R4LnVybC5ob3N0fS9jb250ZW50L2NvbnRlbnRzYFxuICAgIGNvbnN0IHdlYXJhYmxlcyA9IGF3YWl0IGdldEFsbFByZXZpZXdXZWFyYWJsZXMoY29tcG9uZW50cywge1xuICAgICAgYmFzZVVybCxcbiAgICAgIGJhc2VGb2xkZXJzXG4gICAgfSlcbiAgICBjb25zdCB3ZWFyYWJsZUlkID0gY3R4LnBhcmFtcy5pZFxuICAgIHJldHVybiB7XG4gICAgICBib2R5OiB7XG4gICAgICAgIG9rOiB0cnVlLFxuICAgICAgICBkYXRhOiB3ZWFyYWJsZXMuZmlsdGVyKCh3ZWFyYWJsZSkgPT4gc21hcnRXZWFyYWJsZU5hbWVUb0lkKHdlYXJhYmxlPy5uYW1lKSA9PT0gd2VhcmFibGVJZClcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgcm91dGVyLmdldCgnL3ByZXZpZXctd2VhcmFibGVzJywgYXN5bmMgKGN0eCkgPT4ge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBgJHtjdHgudXJsLnByb3RvY29sfS8vJHtjdHgudXJsLmhvc3R9L2NvbnRlbnQvY29udGVudHNgXG4gICAgcmV0dXJuIHtcbiAgICAgIGJvZHk6IHtcbiAgICAgICAgb2s6IHRydWUsXG4gICAgICAgIGRhdGE6IGF3YWl0IGdldEFsbFByZXZpZXdXZWFyYWJsZXMoY29tcG9uZW50cywgeyBiYXNlVXJsLCBiYXNlRm9sZGVycyB9KVxuICAgICAgfVxuICAgIH1cbiAgfSlcbn1cblxuY29uc3QgZGVmYXVsdEhhc2hNYWtlciA9IChzdHI6IHN0cmluZykgPT4gJ2I2NC0nICsgQnVmZmVyLmZyb20oc3RyKS50b1N0cmluZygnYmFzZTY0JylcblxuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsUHJldmlld1dlYXJhYmxlcyhcbiAgY29tcG9uZW50czogUGljazxDbGlDb21wb25lbnRzLCAnZnMnPixcbiAgeyBiYXNlRm9sZGVycywgYmFzZVVybCB9OiB7IGJhc2VGb2xkZXJzOiBzdHJpbmdbXTsgYmFzZVVybDogc3RyaW5nIH1cbikge1xuICBjb25zdCB3ZWFyYWJsZVBhdGhBcnJheTogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IHdlYXJhYmxlRGlyIG9mIGJhc2VGb2xkZXJzKSB7XG4gICAgY29uc3Qgd2VhcmFibGVKc29uUGF0aCA9IHBhdGgucmVzb2x2ZSh3ZWFyYWJsZURpciwgJ3dlYXJhYmxlLmpzb24nKVxuICAgIGlmIChhd2FpdCBjb21wb25lbnRzLmZzLmZpbGVFeGlzdHMod2VhcmFibGVKc29uUGF0aCkpIHtcbiAgICAgIHdlYXJhYmxlUGF0aEFycmF5LnB1c2god2VhcmFibGVKc29uUGF0aClcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXQ6IExhbWJkYXNXZWFyYWJsZVtdID0gW11cbiAgZm9yIChjb25zdCB3ZWFyYWJsZUpzb25QYXRoIG9mIHdlYXJhYmxlUGF0aEFycmF5KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldC5wdXNoKGF3YWl0IHNlcnZlV2VhcmFibGUoY29tcG9uZW50cywgeyB3ZWFyYWJsZUpzb25QYXRoLCBiYXNlVXJsIH0pKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihgQ291bGRuJ3QgbW9jayB0aGUgd2VhcmFibGUgJHt3ZWFyYWJsZUpzb25QYXRofS4gUGxlYXNlIHZlcmlmeSB0aGUgY29ycmVjdCBmb3JtYXQgYW5kIHNjaGVtZS5gLCBlcnIpXG4gICAgfVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VydmVXZWFyYWJsZShcbiAgY29tcG9uZW50czogUGljazxDbGlDb21wb25lbnRzLCAnZnMnPixcbiAgeyB3ZWFyYWJsZUpzb25QYXRoLCBiYXNlVXJsIH06IHsgd2VhcmFibGVKc29uUGF0aDogc3RyaW5nOyBiYXNlVXJsOiBzdHJpbmcgfVxuKTogUHJvbWlzZTxMYW1iZGFzV2VhcmFibGU+IHtcbiAgY29uc3Qgd2VhcmFibGVEaXIgPSBwYXRoLmRpcm5hbWUod2VhcmFibGVKc29uUGF0aClcbiAgY29uc3Qgd2VhcmFibGVKc29uID0gSlNPTi5wYXJzZSgoYXdhaXQgY29tcG9uZW50cy5mcy5yZWFkRmlsZSh3ZWFyYWJsZUpzb25QYXRoKSkudG9TdHJpbmcoKSlcblxuICBpZiAoIVdlYXJhYmxlSnNvbi52YWxpZGF0ZSh3ZWFyYWJsZUpzb24pKSB7XG4gICAgY29uc3QgZXJyb3JzID0gKFdlYXJhYmxlSnNvbi52YWxpZGF0ZS5lcnJvcnMgfHwgW10pLm1hcCgoYSkgPT4gYCR7YS5kYXRhfSAke2EubWVzc2FnZX1gKS5qb2luKCcnKVxuXG4gICAgY29uc29sZS5lcnJvcihgVW5hYmxlIHRvIHZhbGlkYXRlIHdlYXJhYmxlLmpzb24gcHJvcGVybHksIHBsZWFzZSBjaGVjayBpdC5gLCBlcnJvcnMpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHdlYXJhYmxlLmpzb24gKCR7d2VhcmFibGVKc29uUGF0aH0pYClcbiAgfVxuXG4gIGNvbnN0IGhhc2hlZEZpbGVzID0gYXdhaXQgZ2V0RmlsZXNGcm9tRm9sZGVyKGNvbXBvbmVudHMsIHtcbiAgICBmb2xkZXI6IHdlYXJhYmxlRGlyLFxuICAgIGFkZE9yaWdpbmFsUGF0aDogZmFsc2VcbiAgfSlcblxuICBjb25zdCB0aHVtYm5haWxGaWx0ZXJlZCA9IGhhc2hlZEZpbGVzLmZpbHRlcigoJCkgPT4gJD8uZmlsZSA9PT0gJ3RodW1ibmFpbC5wbmcnKVxuICBjb25zdCB0aHVtYm5haWwgPVxuICAgIHRodW1ibmFpbEZpbHRlcmVkLmxlbmd0aCA+IDAgJiYgdGh1bWJuYWlsRmlsdGVyZWRbMF0/Lmhhc2ggJiYgYCR7YmFzZVVybH0vJHt0aHVtYm5haWxGaWx0ZXJlZFswXS5oYXNofWBcblxuICBjb25zdCB3ZWFyYWJsZUlkID0gJ3Vybjo4ZGMyZDdhZC05N2UzLTQ0ZDAtYmE4OS1lODMwNWQ3OTVhNmEnXG5cbiAgY29uc3QgcmVwcmVzZW50YXRpb25zID0gd2VhcmFibGVKc29uLmRhdGEucmVwcmVzZW50YXRpb25zLm1hcCgocmVwcmVzZW50YXRpb24pID0+ICh7XG4gICAgLi4ucmVwcmVzZW50YXRpb24sXG4gICAgbWFpbkZpbGU6IGBtYWxlLyR7cmVwcmVzZW50YXRpb24ubWFpbkZpbGV9YCxcbiAgICBjb250ZW50czogaGFzaGVkRmlsZXMubWFwKCgkKSA9PiAoe1xuICAgICAga2V5OiBgbWFsZS8keyQ/LmZpbGV9YCxcbiAgICAgIHVybDogYCR7YmFzZVVybH0vJHskPy5oYXNofWAsXG4gICAgICBoYXNoOiAkPy5oYXNoXG4gICAgfSkpXG4gIH0pKVxuXG4gIHJldHVybiB7XG4gICAgaWQ6IHdlYXJhYmxlSWQsXG4gICAgcmFyaXR5OiB3ZWFyYWJsZUpzb24ucmFyaXR5LFxuICAgIGkxOG46IFt7IGNvZGU6ICdlbicgYXMgTG9jYWxlLCB0ZXh0OiB3ZWFyYWJsZUpzb24ubmFtZSB9XSxcbiAgICBkZXNjcmlwdGlvbjogd2VhcmFibGVKc29uLmRlc2NyaXB0aW9uLFxuICAgIHRodW1ibmFpbDogdGh1bWJuYWlsIHx8ICcnLFxuICAgIGltYWdlOiB0aHVtYm5haWwgfHwgJycsXG4gICAgY29sbGVjdGlvbkFkZHJlc3M6ICcweDAnLFxuICAgIGJhc2VVcmw6IGAke2Jhc2VVcmx9L2AsXG4gICAgbmFtZTogd2VhcmFibGVKc29uLm5hbWUgfHwgJycsXG4gICAgZGF0YToge1xuICAgICAgY2F0ZWdvcnk6IHdlYXJhYmxlSnNvbi5kYXRhLmNhdGVnb3J5LFxuICAgICAgcmVwbGFjZXM6IFtdLFxuICAgICAgaGlkZXM6IFtdLFxuICAgICAgdGFnczogW10sXG4gICAgICByZXByZXNlbnRhdGlvbnM6IHJlcHJlc2VudGF0aW9ucyBhcyBhbnlcbiAgICAgIC8vIHNjZW5lOiBoYXNoZWRGaWxlcyBhcyBhbnksXG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFNjZW5lSnNvbihcbiAgY29tcG9uZW50czogUGljazxDbGlDb21wb25lbnRzLCAnZnMnPixcbiAge1xuICAgIGJhc2VGb2xkZXJzLFxuICAgIHBvaW50ZXJzLFxuICAgIGN1c3RvbUhhc2hNYWtlclxuICB9OiB7XG4gICAgYmFzZUZvbGRlcnM6IHN0cmluZ1tdXG4gICAgcG9pbnRlcnM6IHN0cmluZ1tdXG4gICAgY3VzdG9tSGFzaE1ha2VyPzogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmdcbiAgfVxuKTogUHJvbWlzZTxFbnRpdHlbXT4ge1xuICBjb25zdCByZXF1ZXN0ZWRQb2ludGVycyA9IG5ldyBTZXQ8c3RyaW5nPihwb2ludGVycylcbiAgY29uc3QgcmVzdWx0RW50aXRpZXM6IEVudGl0eVtdID0gW11cblxuICBjb25zdCBhbGxEZXBsb3ltZW50cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGJhc2VGb2xkZXJzLm1hcChhc3luYyAoZm9sZGVyKSA9PiB7XG4gICAgICByZXR1cm4gZW50aXR5VjNGcm9tRm9sZGVyKGNvbXBvbmVudHMsIHtcbiAgICAgICAgZm9sZGVyLFxuICAgICAgICBhZGRPcmlnaW5hbFBhdGg6IGZhbHNlLFxuICAgICAgICBjdXN0b21IYXNoTWFrZXJcbiAgICAgIH0pXG4gICAgfSlcbiAgKVxuXG4gIGZvciAoY29uc3QgcG9pbnRlciBvZiBBcnJheS5mcm9tKHJlcXVlc3RlZFBvaW50ZXJzKSkge1xuICAgIC8vIGdldCBkZXBsb3ltZW50IGJ5IHBvaW50ZXJcbiAgICBjb25zdCB0aGVEZXBsb3ltZW50ID0gYWxsRGVwbG95bWVudHMuZmluZCgoJCkgPT4gJCAmJiAkLnBvaW50ZXJzLmluY2x1ZGVzKHBvaW50ZXIpKVxuICAgIGlmICh0aGVEZXBsb3ltZW50KSB7XG4gICAgICAvLyByZW1vdmUgYWxsIHRoZSByZXF1aXJlZCBwb2ludGVycyBmcm9tIHRoZSByZXF1ZXN0ZWRQb2ludGVycyBzZXRcbiAgICAgIC8vIHRvIHByZXZlbnQgc2VuZGluZyBkdXBsaWNhdGVkIGVudGl0aWVzXG4gICAgICB0aGVEZXBsb3ltZW50LnBvaW50ZXJzLmZvckVhY2goKCQpID0+IHJlcXVlc3RlZFBvaW50ZXJzLmRlbGV0ZSgkKSlcblxuICAgICAgLy8gYWRkIHRoZSBkZXBsb3ltZW50IHRvIHRoZSByZXN1bHRzXG4gICAgICByZXN1bHRFbnRpdGllcy5wdXNoKHRoZURlcGxveW1lbnQpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdEVudGl0aWVzXG59XG5cbmZ1bmN0aW9uIHNlcnZlU3RhdGljKGNvbXBvbmVudHM6IFBpY2s8Q2xpQ29tcG9uZW50cywgJ2ZzJz4sIGRpcjogc3RyaW5nLCByb3V0ZXI6IFJvdXRlcjxQcmV2aWV3Q29tcG9uZW50cz4pIHtcbiAgY29uc3Qgc2RrUGF0aCA9IHBhdGguZGlybmFtZShcbiAgICByZXF1aXJlLnJlc29sdmUoJ0BkY2wvc2RrL3BhY2thZ2UuanNvbicsIHtcbiAgICAgIHBhdGhzOiBbZGlyXVxuICAgIH0pXG4gIClcbiAgY29uc3QgZGNsRXhwbG9yZXJKc29uUGF0aCA9IHBhdGguZGlybmFtZShcbiAgICByZXF1aXJlLnJlc29sdmUoJ0BkY2wvZXhwbG9yZXIvcGFja2FnZS5qc29uJywge1xuICAgICAgcGF0aHM6IFtkaXIsIHNka1BhdGhdXG4gICAgfSlcbiAgKVxuXG4gIGNvbnN0IGRjbEtlcm5lbERlZmF1bHRQcm9maWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkY2xFeHBsb3Jlckpzb25QYXRoLCAnZGVmYXVsdC1wcm9maWxlJylcbiAgY29uc3QgZGNsS2VybmVsSW1hZ2VzRGVjZW50cmFsYW5kQ29ubmVjdCA9IHBhdGgucmVzb2x2ZShkY2xFeHBsb3Jlckpzb25QYXRoLCAnaW1hZ2VzJywgJ2RlY2VudHJhbGFuZC1jb25uZWN0JylcblxuICBjb25zdCByb3V0ZXMgPSBbXG4gICAge1xuICAgICAgcm91dGU6ICcvJyxcbiAgICAgIHBhdGg6IHBhdGgucmVzb2x2ZShkY2xFeHBsb3Jlckpzb25QYXRoLCAncHJldmlldy5odG1sJyksXG4gICAgICB0eXBlOiAndGV4dC9odG1sJ1xuICAgIH0sXG4gICAge1xuICAgICAgcm91dGU6ICcvZmF2aWNvbi5pY28nLFxuICAgICAgcGF0aDogcGF0aC5yZXNvbHZlKGRjbEV4cGxvcmVySnNvblBhdGgsICdmYXZpY29uLmljbycpLFxuICAgICAgdHlwZTogJ3RleHQvaHRtbCdcbiAgICB9LFxuICAgIHtcbiAgICAgIHJvdXRlOiAnL0AvZXhwbG9yZXIvaW5kZXguanMnLFxuICAgICAgcGF0aDogcGF0aC5yZXNvbHZlKGRjbEV4cGxvcmVySnNvblBhdGgsICdpbmRleC5qcycpLFxuICAgICAgdHlwZTogJ3RleHQvamF2YXNjcmlwdCdcbiAgICB9XG4gIF1cblxuICBmb3IgKGNvbnN0IHJvdXRlIG9mIHJvdXRlcykge1xuICAgIHJvdXRlci5nZXQocm91dGUucm91dGUsIGFzeW5jIChfY3R4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiByb3V0ZS50eXBlIH0sXG4gICAgICAgIGJvZHk6IGNvbXBvbmVudHMuZnMuY3JlYXRlUmVhZFN0cmVhbShyb3V0ZS5wYXRoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVTdGF0aWNSb3V0ZXMoXG4gICAgY29tcG9uZW50czogUGljazxDbGlDb21wb25lbnRzLCAnZnMnPixcbiAgICByb3V0ZTogc3RyaW5nLFxuICAgIGZvbGRlcjogc3RyaW5nLFxuICAgIHRyYW5zZm9ybSA9IChzdHI6IHN0cmluZykgPT4gc3RyXG4gICkge1xuICAgIHJvdXRlci5nZXQocm91dGUsIGFzeW5jIChjdHgsIG5leHQpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSBjdHgucGFyYW1zLnBhdGhcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKGZvbGRlciwgdHJhbnNmb3JtKGZpbGUpKVxuXG4gICAgICAvLyBvbmx5IHJldHVybiBmaWxlcyBJRiB0aGUgZmlsZSBpcyB3aXRoaW4gYSBiYXNlRm9sZGVyXG4gICAgICBpZiAoIShhd2FpdCBjb21wb25lbnRzLmZzLmZpbGVFeGlzdHMoZnVsbFBhdGgpKSkge1xuICAgICAgICByZXR1cm4gbmV4dCgpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICAgICd4LXRpbWVzdGFtcCc6IERhdGUubm93KCksXG4gICAgICAgICd4LXNlbnQnOiB0cnVlLFxuICAgICAgICAnY2FjaGUtY29udHJvbCc6ICduby1jYWNoZSxwcml2YXRlLG1heC1hZ2U9MSdcbiAgICAgIH1cblxuICAgICAgaWYgKGZ1bGxQYXRoLmVuZHNXaXRoKCcud2FzbScpKSB7XG4gICAgICAgIGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gJ2FwcGxpY2F0aW9uL3dhc20nXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGJvZHk6IGNvbXBvbmVudHMuZnMuY3JlYXRlUmVhZFN0cmVhbShmdWxsUGF0aClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgY3JlYXRlU3RhdGljUm91dGVzKGNvbXBvbmVudHMsICcvaW1hZ2VzL2RlY2VudHJhbGFuZC1jb25uZWN0LzpwYXRoKycsIGRjbEtlcm5lbEltYWdlc0RlY2VudHJhbGFuZENvbm5lY3QpXG4gIGNyZWF0ZVN0YXRpY1JvdXRlcyhjb21wb25lbnRzLCAnL2RlZmF1bHQtcHJvZmlsZS86cGF0aCsnLCBkY2xLZXJuZWxEZWZhdWx0UHJvZmlsZVBhdGgpXG4gIGNyZWF0ZVN0YXRpY1JvdXRlcyhjb21wb25lbnRzLCAnL0AvZXhwbG9yZXIvOnBhdGgrJywgZGNsRXhwbG9yZXJKc29uUGF0aCwgKGZpbGVQYXRoKSA9PiBmaWxlUGF0aC5yZXBsYWNlKC8uYnIrJC8sICcnKSlcblxuICByb3V0ZXIuZ2V0KCcvZmVhdHVyZS1mbGFncy86ZmlsZScsIGFzeW5jIChjdHgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9mZWF0dXJlLWZsYWdzLmRlY2VudHJhbGFuZC56b25lLyR7Y3R4LnBhcmFtcy5maWxlfWAsIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgY29ubmVjdGlvbjogJ2Nsb3NlJ1xuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHtcbiAgICAgIGJvZHk6IGF3YWl0IHJlcy5hcnJheUJ1ZmZlcigpXG4gICAgfVxuICB9KVxufVxuXG5hc3luYyBmdW5jdGlvbiBlbnRpdHlWM0Zyb21Gb2xkZXIoXG4gIGNvbXBvbmVudHM6IFBpY2s8Q2xpQ29tcG9uZW50cywgJ2ZzJz4sXG4gIHtcbiAgICBmb2xkZXIsXG4gICAgYWRkT3JpZ2luYWxQYXRoLFxuICAgIGN1c3RvbUhhc2hNYWtlclxuICB9OiB7XG4gICAgZm9sZGVyOiBzdHJpbmdcbiAgICBhZGRPcmlnaW5hbFBhdGg/OiBib29sZWFuXG4gICAgY3VzdG9tSGFzaE1ha2VyPzogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmdcbiAgfVxuKTogUHJvbWlzZTxFbnRpdHkgfCBudWxsPiB7XG4gIGNvbnN0IHNjZW5lSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZm9sZGVyLCAnLi9zY2VuZS5qc29uJylcbiAgbGV0IGlzUGFyY2VsU2NlbmUgPSB0cnVlXG5cbiAgY29uc3Qgd2VhcmFibGVKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShmb2xkZXIsICcuL3dlYXJhYmxlLmpzb24nKVxuICBpZiAoYXdhaXQgY29tcG9uZW50cy5mcy5maWxlRXhpc3RzKHdlYXJhYmxlSnNvblBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdlYXJhYmxlSnNvbiA9IEpTT04ucGFyc2UoYXdhaXQgY29tcG9uZW50cy5mcy5yZWFkRmlsZSh3ZWFyYWJsZUpzb25QYXRoLCAndXRmLTgnKSlcbiAgICAgIGlmICghV2VhcmFibGVKc29uLnZhbGlkYXRlKHdlYXJhYmxlSnNvbikpIHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gKFdlYXJhYmxlSnNvbi52YWxpZGF0ZS5lcnJvcnMgfHwgW10pLm1hcCgoYSkgPT4gYCR7YS5kYXRhfSAke2EubWVzc2FnZX1gKS5qb2luKCcnKVxuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFVuYWJsZSB0byB2YWxpZGF0ZSB3ZWFyYWJsZS5qc29uIHByb3Blcmx5LCBwbGVhc2UgY2hlY2sgaXQuYCwgZXJyb3JzKVxuICAgICAgICBjb25zb2xlLmVycm9yKGBJbnZhbGlkIHdlYXJhYmxlLmpzb24gKCR7d2VhcmFibGVKc29uUGF0aH0pYClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzUGFyY2VsU2NlbmUgPSBmYWxzZVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihgVW5hYmxlIHRvIGxvYWQgd2VhcmFibGUuanNvbiBwcm9wZXJseWAsIGVycilcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYXNoTWFrZXIgPSBjdXN0b21IYXNoTWFrZXIgPyBjdXN0b21IYXNoTWFrZXIgOiBkZWZhdWx0SGFzaE1ha2VyXG5cbiAgaWYgKChhd2FpdCBjb21wb25lbnRzLmZzLmZpbGVFeGlzdHMoc2NlbmVKc29uUGF0aCkpICYmIGlzUGFyY2VsU2NlbmUpIHtcbiAgICBjb25zdCBzY2VuZUpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGNvbXBvbmVudHMuZnMucmVhZEZpbGUoc2NlbmVKc29uUGF0aCwgJ3V0Zi04JykpXG4gICAgY29uc3QgeyBiYXNlLCBwYXJjZWxzIH06IHsgYmFzZTogc3RyaW5nOyBwYXJjZWxzOiBzdHJpbmdbXSB9ID0gc2NlbmVKc29uLnNjZW5lXG4gICAgY29uc3QgcG9pbnRlcnMgPSBuZXcgU2V0PHN0cmluZz4oKVxuICAgIHBvaW50ZXJzLmFkZChiYXNlKVxuICAgIHBhcmNlbHMuZm9yRWFjaCgoJCkgPT4gcG9pbnRlcnMuYWRkKCQpKVxuXG4gICAgY29uc3QgbWFwcGVkRmlsZXMgPSBhd2FpdCBnZXRGaWxlc0Zyb21Gb2xkZXIoY29tcG9uZW50cywge1xuICAgICAgZm9sZGVyLFxuICAgICAgYWRkT3JpZ2luYWxQYXRoLFxuICAgICAgY3VzdG9tSGFzaE1ha2VyXG4gICAgfSlcblxuICAgIHJldHVybiB7XG4gICAgICB2ZXJzaW9uOiAndjMnLFxuICAgICAgdHlwZTogRW50aXR5VHlwZS5TQ0VORSxcbiAgICAgIGlkOiBoYXNoTWFrZXIoZm9sZGVyKSxcbiAgICAgIHBvaW50ZXJzOiBBcnJheS5mcm9tKHBvaW50ZXJzKSxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIG1ldGFkYXRhOiBzY2VuZUpzb24sXG4gICAgICBjb250ZW50OiBtYXBwZWRGaWxlc1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRGaWxlc0Zyb21Gb2xkZXIoXG4gIGNvbXBvbmVudHM6IFBpY2s8Q2xpQ29tcG9uZW50cywgJ2ZzJz4sXG4gIHtcbiAgICBmb2xkZXIsXG4gICAgYWRkT3JpZ2luYWxQYXRoLFxuICAgIGN1c3RvbUhhc2hNYWtlclxuICB9OiB7XG4gICAgZm9sZGVyOiBzdHJpbmdcbiAgICBhZGRPcmlnaW5hbFBhdGg/OiBib29sZWFuXG4gICAgY3VzdG9tSGFzaE1ha2VyPzogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmdcbiAgfVxuKTogUHJvbWlzZTxDb250ZW50TWFwcGluZ1tdPiB7XG4gIGNvbnN0IGhhc2hNYWtlciA9IGN1c3RvbUhhc2hNYWtlciA/IGN1c3RvbUhhc2hNYWtlciA6IGRlZmF1bHRIYXNoTWFrZXJcbiAgY29uc3QgaWdub3JlUGF0dGVybnMgPSBhd2FpdCBnZXREQ0xJZ25vcmVQYXR0ZXJucyhjb21wb25lbnRzLCBmb2xkZXIpXG5cbiAgY29uc3QgYWxsRmlsZXMgPSBnbG9iU3luYygnKiovKicsIHtcbiAgICBpZ25vcmU6IGlnbm9yZVBhdHRlcm5zLFxuICAgIGN3ZDogZm9sZGVyLFxuICAgIGRvdDogZmFsc2UsXG4gICAgYWJzb2x1dGU6IHRydWVcbiAgfSlcbiAgICAubWFwKChmaWxlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIXN0YXRTeW5jKGZpbGUpLmlzRmlsZSgpKSByZXR1cm5cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IF9mb2xkZXIgPSBmb2xkZXIucmVwbGFjZSgvXFxcXC9naSwgJy8nKVxuICAgICAgY29uc3Qga2V5ID0gZmlsZS5yZXBsYWNlKF9mb2xkZXIsICcnKS5yZXBsYWNlKC9eXFwvKy8sICcnKVxuICAgICAgcmV0dXJuIGtleVxuICAgIH0pXG4gICAgLmZpbHRlcigoJCkgPT4gISEkKSBhcyBzdHJpbmdbXVxuXG4gIGNvbnN0IGlnID0gaWdub3JlKCkuYWRkKGlnbm9yZVBhdHRlcm5zKVxuICBjb25zdCBmaWx0ZXJlZEZpbGVzID0gaWcuZmlsdGVyKGFsbEZpbGVzKVxuXG4gIGNvbnN0IHJldDogKENvbnRlbnRNYXBwaW5nICYgeyBvcmlnaW5hbF9wYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQgfSlbXSA9IFtdXG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbHRlcmVkRmlsZXMpIHtcbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoZm9sZGVyLCBmaWxlKVxuICAgIHRyeSB7XG4gICAgICBpZiAoIXN0YXRTeW5jKGFic29sdXRlUGF0aCkuaXNGaWxlKCkpIGNvbnRpbnVlXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgYWJzb2x1dGVGb2xkZXIgPSBmb2xkZXIucmVwbGFjZSgvXFxcXC9naSwgJy8nKVxuXG4gICAgY29uc3QgcmVsYXRpdmVGaWxlUGF0aFRvRm9sZGVyID0gZmlsZS5yZXBsYWNlKGFic29sdXRlRm9sZGVyLCAnJykucmVwbGFjZSgvXlxcLysvLCAnJylcblxuICAgIHJldC5wdXNoKHtcbiAgICAgIGZpbGU6IHJlbGF0aXZlRmlsZVBhdGhUb0ZvbGRlci50b0xvd2VyQ2FzZSgpLFxuICAgICAgb3JpZ2luYWxfcGF0aDogYWRkT3JpZ2luYWxQYXRoID8gYWJzb2x1dGVQYXRoIDogdW5kZWZpbmVkLFxuICAgICAgaGFzaDogaGFzaE1ha2VyKGFic29sdXRlUGF0aClcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHJldFxufVxuIl19