@workflow/cli 5.0.0-beta.4 → 5.0.0-beta.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/base.js +1 -1
- package/dist/commands/build.js +1 -1
- package/dist/commands/cancel.d.ts +1 -0
- package/dist/commands/cancel.d.ts.map +1 -1
- package/dist/commands/cancel.js +36 -55
- package/dist/commands/dev.js +1 -1
- package/dist/commands/health.d.ts +1 -3
- package/dist/commands/health.d.ts.map +1 -1
- package/dist/commands/health.js +26 -50
- package/dist/commands/init.js +1 -1
- package/dist/commands/inspect.d.ts +4 -0
- package/dist/commands/inspect.d.ts.map +1 -1
- package/dist/commands/inspect.js +37 -7
- package/dist/commands/start.d.ts +1 -0
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +8 -3
- package/dist/commands/transform.js +1 -1
- package/dist/commands/validate.js +1 -1
- package/dist/commands/web.d.ts +2 -0
- package/dist/commands/web.d.ts.map +1 -1
- package/dist/commands/web.js +9 -3
- package/dist/lib/bulk-cancel.d.ts +74 -0
- package/dist/lib/bulk-cancel.d.ts.map +1 -0
- package/dist/lib/bulk-cancel.js +197 -0
- package/dist/lib/bulk-cancel.test.d.ts +2 -0
- package/dist/lib/bulk-cancel.test.d.ts.map +1 -0
- package/dist/lib/bulk-cancel.test.js +366 -0
- package/dist/lib/config/log.js +1 -1
- package/dist/lib/config/types.d.ts +6 -1
- package/dist/lib/config/types.d.ts.map +1 -1
- package/dist/lib/config/types.js +1 -1
- package/dist/lib/config/workflow-config.d.ts.map +1 -1
- package/dist/lib/config/workflow-config.js +2 -2
- package/dist/lib/inspect/auth.js +1 -1
- package/dist/lib/inspect/env.d.ts +1 -1
- package/dist/lib/inspect/env.js +2 -2
- package/dist/lib/inspect/errors.d.ts +3 -0
- package/dist/lib/inspect/errors.d.ts.map +1 -0
- package/dist/lib/inspect/errors.js +27 -0
- package/dist/lib/inspect/flags.d.ts +9 -0
- package/dist/lib/inspect/flags.d.ts.map +1 -1
- package/dist/lib/inspect/flags.js +23 -1
- package/dist/lib/inspect/hydration.d.ts +22 -0
- package/dist/lib/inspect/hydration.d.ts.map +1 -1
- package/dist/lib/inspect/hydration.js +107 -49
- package/dist/lib/inspect/hydration.test.d.ts +2 -0
- package/dist/lib/inspect/hydration.test.d.ts.map +1 -0
- package/dist/lib/inspect/hydration.test.js +23 -0
- package/dist/lib/inspect/output.d.ts +2 -2
- package/dist/lib/inspect/output.d.ts.map +1 -1
- package/dist/lib/inspect/output.js +327 -136
- package/dist/lib/inspect/output.test.js +663 -3
- package/dist/lib/inspect/pagination.d.ts +10 -1
- package/dist/lib/inspect/pagination.d.ts.map +1 -1
- package/dist/lib/inspect/pagination.js +20 -4
- package/dist/lib/inspect/run.d.ts.map +1 -1
- package/dist/lib/inspect/run.js +33 -10
- package/dist/lib/inspect/setup.d.ts.map +1 -1
- package/dist/lib/inspect/setup.js +42 -6
- package/dist/lib/inspect/stream.js +1 -1
- package/dist/lib/inspect/terminal-utils.js +1 -1
- package/dist/lib/inspect/time-window.d.ts +28 -0
- package/dist/lib/inspect/time-window.d.ts.map +1 -0
- package/dist/lib/inspect/time-window.js +61 -0
- package/dist/lib/inspect/time-window.test.d.ts +2 -0
- package/dist/lib/inspect/time-window.test.d.ts.map +1 -0
- package/dist/lib/inspect/time-window.test.js +58 -0
- package/dist/lib/inspect/vercel-api.d.ts +5 -2
- package/dist/lib/inspect/vercel-api.d.ts.map +1 -1
- package/dist/lib/inspect/vercel-api.js +12 -37
- package/dist/lib/inspect/vercel-api.test.d.ts +2 -0
- package/dist/lib/inspect/vercel-api.test.d.ts.map +1 -0
- package/dist/lib/inspect/vercel-api.test.js +21 -0
- package/dist/lib/inspect/vercel-link.js +1 -1
- package/dist/lib/inspect/web.d.ts +24 -0
- package/dist/lib/inspect/web.d.ts.map +1 -1
- package/dist/lib/inspect/web.js +122 -3
- package/dist/lib/update-check.js +1 -1
- package/package.json +15 -14
- package/dist/base.js.map +0 -1
- package/dist/commands/build.js.map +0 -1
- package/dist/commands/cancel.js.map +0 -1
- package/dist/commands/dev.js.map +0 -1
- package/dist/commands/health.js.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/inspect.js.map +0 -1
- package/dist/commands/start.js.map +0 -1
- package/dist/commands/transform.js.map +0 -1
- package/dist/commands/validate.js.map +0 -1
- package/dist/commands/web.js.map +0 -1
- package/dist/lib/config/log.js.map +0 -1
- package/dist/lib/config/types.js.map +0 -1
- package/dist/lib/config/workflow-config.js.map +0 -1
- package/dist/lib/inspect/auth.js.map +0 -1
- package/dist/lib/inspect/env.js.map +0 -1
- package/dist/lib/inspect/flags.js.map +0 -1
- package/dist/lib/inspect/hydration.js.map +0 -1
- package/dist/lib/inspect/output.js.map +0 -1
- package/dist/lib/inspect/output.test.js.map +0 -1
- package/dist/lib/inspect/pagination.js.map +0 -1
- package/dist/lib/inspect/run.js.map +0 -1
- package/dist/lib/inspect/setup.js.map +0 -1
- package/dist/lib/inspect/stream.js.map +0 -1
- package/dist/lib/inspect/terminal-utils.js.map +0 -1
- package/dist/lib/inspect/vercel-api.js.map +0 -1
- package/dist/lib/inspect/vercel-link.js.map +0 -1
- package/dist/lib/inspect/web.js.map +0 -1
- package/dist/lib/update-check.js.map +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import {
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { getObservabilityUpgradeRequiredMessage, isObservabilityUpgradeRequiredError, } from './errors.js';
|
|
3
|
+
import { formatTableValue, hasExpiredData, listEvents, listRuns, listSleeps, listSteps, } from './output.js';
|
|
3
4
|
const makeRun = (overrides = {}) => ({
|
|
4
5
|
runId: 'run-1',
|
|
5
6
|
status: 'running',
|
|
@@ -17,6 +18,9 @@ const makeRun = (overrides = {}) => ({
|
|
|
17
18
|
executionContext: {},
|
|
18
19
|
...overrides,
|
|
19
20
|
});
|
|
21
|
+
afterEach(() => {
|
|
22
|
+
vi.restoreAllMocks();
|
|
23
|
+
});
|
|
20
24
|
describe('hasExpiredData', () => {
|
|
21
25
|
it('returns false when expiredAt is undefined', () => {
|
|
22
26
|
expect(hasExpiredData(makeRun({ expiredAt: undefined }))).toBe(false);
|
|
@@ -49,4 +53,660 @@ describe('formatTableValue expired data handling', () => {
|
|
|
49
53
|
expect(String(result)).not.toContain('expired');
|
|
50
54
|
});
|
|
51
55
|
});
|
|
52
|
-
|
|
56
|
+
describe('isObservabilityUpgradeRequiredError', () => {
|
|
57
|
+
it('detects workflow analytics 402 errors by top-level code', () => {
|
|
58
|
+
expect(isObservabilityUpgradeRequiredError({
|
|
59
|
+
status: 402,
|
|
60
|
+
code: 'observability-upgrade-required',
|
|
61
|
+
})).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
it('detects workflow analytics 402 errors by response body error', () => {
|
|
64
|
+
expect(isObservabilityUpgradeRequiredError({
|
|
65
|
+
status: 402,
|
|
66
|
+
body: { error: 'observability-upgrade-required' },
|
|
67
|
+
})).toBe(true);
|
|
68
|
+
});
|
|
69
|
+
it('does not treat 404s as upgrade prompts', () => {
|
|
70
|
+
expect(isObservabilityUpgradeRequiredError({
|
|
71
|
+
status: 404,
|
|
72
|
+
code: 'observability-upgrade-required',
|
|
73
|
+
})).toBe(false);
|
|
74
|
+
});
|
|
75
|
+
it('uses an upgrade prompt message', () => {
|
|
76
|
+
expect(getObservabilityUpgradeRequiredMessage()).toContain('Upgrade Observability Plus');
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
describe('listRuns', () => {
|
|
80
|
+
it('preserves analytics page metadata in JSON output', async () => {
|
|
81
|
+
const run = {
|
|
82
|
+
runId: 'run-1',
|
|
83
|
+
status: 'running',
|
|
84
|
+
deploymentId: 'dep-1',
|
|
85
|
+
workflowName: 'workflow//./src/workflows/test//myWorkflow',
|
|
86
|
+
specVersion: 2,
|
|
87
|
+
attributes: {},
|
|
88
|
+
createdAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
89
|
+
updatedAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
90
|
+
startedAt: new Date('2026-06-30T00:00:01.000Z'),
|
|
91
|
+
completedAt: null,
|
|
92
|
+
errorCode: null,
|
|
93
|
+
workflowCoreVersion: null,
|
|
94
|
+
workflowEncryptionEnabled: false,
|
|
95
|
+
};
|
|
96
|
+
const pageInfo = {
|
|
97
|
+
currentLookbackDays: 2,
|
|
98
|
+
maxLookbackDays: 30,
|
|
99
|
+
currentWindowStart: new Date('2026-06-28T00:00:00.000Z'),
|
|
100
|
+
maxWindowStart: new Date('2026-06-01T00:00:00.000Z'),
|
|
101
|
+
upgradeAvailable: true,
|
|
102
|
+
};
|
|
103
|
+
const world = {
|
|
104
|
+
analytics: {
|
|
105
|
+
runs: {
|
|
106
|
+
list: vi.fn().mockResolvedValue({
|
|
107
|
+
data: [run],
|
|
108
|
+
cursor: null,
|
|
109
|
+
hasMore: false,
|
|
110
|
+
pageInfo,
|
|
111
|
+
}),
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
const write = vi
|
|
116
|
+
.spyOn(process.stdout, 'write')
|
|
117
|
+
.mockImplementation(() => true);
|
|
118
|
+
await listRuns(world, { json: true });
|
|
119
|
+
expect(world.analytics?.runs.list).toHaveBeenCalledWith({
|
|
120
|
+
workflowName: undefined,
|
|
121
|
+
status: undefined,
|
|
122
|
+
pagination: {
|
|
123
|
+
sortOrder: 'desc',
|
|
124
|
+
cursor: undefined,
|
|
125
|
+
limit: 20,
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
expect(write).toHaveBeenCalledTimes(1);
|
|
129
|
+
expect(JSON.parse(String(write.mock.calls[0][0]))).toEqual({
|
|
130
|
+
data: [
|
|
131
|
+
{
|
|
132
|
+
...run,
|
|
133
|
+
createdAt: '2026-06-30T00:00:00.000Z',
|
|
134
|
+
updatedAt: '2026-06-30T00:00:00.000Z',
|
|
135
|
+
startedAt: '2026-06-30T00:00:01.000Z',
|
|
136
|
+
},
|
|
137
|
+
],
|
|
138
|
+
cursor: null,
|
|
139
|
+
hasMore: false,
|
|
140
|
+
pageInfo: {
|
|
141
|
+
currentLookbackDays: 2,
|
|
142
|
+
maxLookbackDays: 30,
|
|
143
|
+
currentWindowStart: '2026-06-28T00:00:00.000Z',
|
|
144
|
+
maxWindowStart: '2026-06-01T00:00:00.000Z',
|
|
145
|
+
upgradeAvailable: true,
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
it('includes world-specific fields when the world defines describeRun', async () => {
|
|
150
|
+
const run = {
|
|
151
|
+
runId: 'wrun_41KX206BTK10M0C31CMN2AS1JS',
|
|
152
|
+
status: 'running',
|
|
153
|
+
deploymentId: 'dep-1',
|
|
154
|
+
workflowName: 'workflow//./src/workflows/test//myWorkflow',
|
|
155
|
+
specVersion: 2,
|
|
156
|
+
attributes: {},
|
|
157
|
+
createdAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
158
|
+
updatedAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
159
|
+
startedAt: new Date('2026-06-30T00:00:01.000Z'),
|
|
160
|
+
completedAt: null,
|
|
161
|
+
errorCode: null,
|
|
162
|
+
workflowCoreVersion: null,
|
|
163
|
+
workflowEncryptionEnabled: false,
|
|
164
|
+
};
|
|
165
|
+
const describeRun = vi.fn().mockReturnValue({ region: 'sfo1', shard: 'a' });
|
|
166
|
+
const world = {
|
|
167
|
+
describeRun,
|
|
168
|
+
analytics: {
|
|
169
|
+
runs: {
|
|
170
|
+
list: vi.fn().mockResolvedValue({
|
|
171
|
+
data: [run],
|
|
172
|
+
cursor: null,
|
|
173
|
+
hasMore: false,
|
|
174
|
+
}),
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
const write = vi
|
|
179
|
+
.spyOn(process.stdout, 'write')
|
|
180
|
+
.mockImplementation(() => true);
|
|
181
|
+
await listRuns(world, { json: true });
|
|
182
|
+
expect(describeRun).toHaveBeenCalledWith(expect.objectContaining({ runId: run.runId }));
|
|
183
|
+
const output = JSON.parse(String(write.mock.calls[0][0]));
|
|
184
|
+
expect(output.data[0].region).toBe('sfo1');
|
|
185
|
+
expect(output.data[0].shard).toBe('a');
|
|
186
|
+
});
|
|
187
|
+
it('preserves null field values from describeRun in JSON output', async () => {
|
|
188
|
+
// null means "applicable but undeterminable" — distinguishable from
|
|
189
|
+
// the hook being absent (key missing entirely).
|
|
190
|
+
const run = {
|
|
191
|
+
runId: 'wrun_malformed',
|
|
192
|
+
status: 'running',
|
|
193
|
+
deploymentId: 'dep-1',
|
|
194
|
+
workflowName: 'workflow//./src/workflows/test//myWorkflow',
|
|
195
|
+
specVersion: 2,
|
|
196
|
+
attributes: {},
|
|
197
|
+
createdAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
198
|
+
updatedAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
199
|
+
startedAt: new Date('2026-06-30T00:00:01.000Z'),
|
|
200
|
+
completedAt: null,
|
|
201
|
+
errorCode: null,
|
|
202
|
+
workflowCoreVersion: null,
|
|
203
|
+
workflowEncryptionEnabled: false,
|
|
204
|
+
};
|
|
205
|
+
const world = {
|
|
206
|
+
describeRun: vi.fn().mockReturnValue({ region: null }),
|
|
207
|
+
analytics: {
|
|
208
|
+
runs: {
|
|
209
|
+
list: vi.fn().mockResolvedValue({
|
|
210
|
+
data: [run],
|
|
211
|
+
cursor: null,
|
|
212
|
+
hasMore: false,
|
|
213
|
+
}),
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
const write = vi
|
|
218
|
+
.spyOn(process.stdout, 'write')
|
|
219
|
+
.mockImplementation(() => true);
|
|
220
|
+
await listRuns(world, { json: true });
|
|
221
|
+
const output = JSON.parse(String(write.mock.calls[0][0]));
|
|
222
|
+
expect('region' in output.data[0]).toBe(true);
|
|
223
|
+
expect(output.data[0].region).toBeNull();
|
|
224
|
+
});
|
|
225
|
+
it('never lets describeRun overwrite canonical run fields', async () => {
|
|
226
|
+
const run = {
|
|
227
|
+
runId: 'wrun_41KX206BTK10M0C31CMN2AS1JS',
|
|
228
|
+
status: 'running',
|
|
229
|
+
deploymentId: 'dep-1',
|
|
230
|
+
workflowName: 'workflow//./src/workflows/test//myWorkflow',
|
|
231
|
+
specVersion: 2,
|
|
232
|
+
attributes: {},
|
|
233
|
+
createdAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
234
|
+
updatedAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
235
|
+
startedAt: new Date('2026-06-30T00:00:01.000Z'),
|
|
236
|
+
completedAt: null,
|
|
237
|
+
errorCode: null,
|
|
238
|
+
workflowCoreVersion: null,
|
|
239
|
+
workflowEncryptionEnabled: false,
|
|
240
|
+
};
|
|
241
|
+
const world = {
|
|
242
|
+
// Hostile/buggy world: tries to clobber canonical fields.
|
|
243
|
+
describeRun: vi
|
|
244
|
+
.fn()
|
|
245
|
+
.mockReturnValue({ status: 'hacked', runId: 'nope', region: 'sfo1' }),
|
|
246
|
+
analytics: {
|
|
247
|
+
runs: {
|
|
248
|
+
list: vi.fn().mockResolvedValue({
|
|
249
|
+
data: [run],
|
|
250
|
+
cursor: null,
|
|
251
|
+
hasMore: false,
|
|
252
|
+
}),
|
|
253
|
+
},
|
|
254
|
+
},
|
|
255
|
+
};
|
|
256
|
+
const write = vi
|
|
257
|
+
.spyOn(process.stdout, 'write')
|
|
258
|
+
.mockImplementation(() => true);
|
|
259
|
+
await listRuns(world, { json: true });
|
|
260
|
+
const output = JSON.parse(String(write.mock.calls[0][0]));
|
|
261
|
+
expect(output.data[0].status).toBe('running');
|
|
262
|
+
expect(output.data[0].runId).toBe(run.runId);
|
|
263
|
+
expect(output.data[0].region).toBe('sfo1');
|
|
264
|
+
});
|
|
265
|
+
it('treats a throwing describeRun as contributing no fields', async () => {
|
|
266
|
+
const run = {
|
|
267
|
+
runId: 'wrun_41KX206BTK10M0C31CMN2AS1JS',
|
|
268
|
+
status: 'running',
|
|
269
|
+
deploymentId: 'dep-1',
|
|
270
|
+
workflowName: 'workflow//./src/workflows/test//myWorkflow',
|
|
271
|
+
specVersion: 2,
|
|
272
|
+
attributes: {},
|
|
273
|
+
createdAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
274
|
+
updatedAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
275
|
+
startedAt: new Date('2026-06-30T00:00:01.000Z'),
|
|
276
|
+
completedAt: null,
|
|
277
|
+
errorCode: null,
|
|
278
|
+
workflowCoreVersion: null,
|
|
279
|
+
workflowEncryptionEnabled: false,
|
|
280
|
+
};
|
|
281
|
+
const world = {
|
|
282
|
+
describeRun: vi.fn().mockImplementation(() => {
|
|
283
|
+
throw new Error('buggy world');
|
|
284
|
+
}),
|
|
285
|
+
analytics: {
|
|
286
|
+
runs: {
|
|
287
|
+
list: vi.fn().mockResolvedValue({
|
|
288
|
+
data: [run],
|
|
289
|
+
cursor: null,
|
|
290
|
+
hasMore: false,
|
|
291
|
+
}),
|
|
292
|
+
},
|
|
293
|
+
},
|
|
294
|
+
};
|
|
295
|
+
const write = vi
|
|
296
|
+
.spyOn(process.stdout, 'write')
|
|
297
|
+
.mockImplementation(() => true);
|
|
298
|
+
// Must not throw despite the world violating the no-throw contract.
|
|
299
|
+
await listRuns(world, { json: true });
|
|
300
|
+
const output = JSON.parse(String(write.mock.calls[0][0]));
|
|
301
|
+
expect(output.data[0].status).toBe('running');
|
|
302
|
+
expect('region' in output.data[0]).toBe(false);
|
|
303
|
+
});
|
|
304
|
+
it('supports async describeRun implementations', async () => {
|
|
305
|
+
const run = {
|
|
306
|
+
runId: 'wrun_41KX206BTK10M0C31CMN2AS1JS',
|
|
307
|
+
status: 'running',
|
|
308
|
+
deploymentId: 'dep-1',
|
|
309
|
+
workflowName: 'workflow//./src/workflows/test//myWorkflow',
|
|
310
|
+
specVersion: 2,
|
|
311
|
+
attributes: {},
|
|
312
|
+
createdAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
313
|
+
updatedAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
314
|
+
startedAt: new Date('2026-06-30T00:00:01.000Z'),
|
|
315
|
+
completedAt: null,
|
|
316
|
+
errorCode: null,
|
|
317
|
+
workflowCoreVersion: null,
|
|
318
|
+
workflowEncryptionEnabled: false,
|
|
319
|
+
};
|
|
320
|
+
const world = {
|
|
321
|
+
describeRun: vi.fn().mockResolvedValue({ region: 'sfo1' }),
|
|
322
|
+
analytics: {
|
|
323
|
+
runs: {
|
|
324
|
+
list: vi.fn().mockResolvedValue({
|
|
325
|
+
data: [run],
|
|
326
|
+
cursor: null,
|
|
327
|
+
hasMore: false,
|
|
328
|
+
}),
|
|
329
|
+
},
|
|
330
|
+
},
|
|
331
|
+
};
|
|
332
|
+
const write = vi
|
|
333
|
+
.spyOn(process.stdout, 'write')
|
|
334
|
+
.mockImplementation(() => true);
|
|
335
|
+
await listRuns(world, { json: true });
|
|
336
|
+
const output = JSON.parse(String(write.mock.calls[0][0]));
|
|
337
|
+
expect(output.data[0].region).toBe('sfo1');
|
|
338
|
+
});
|
|
339
|
+
it('treats a rejecting async describeRun as contributing no fields', async () => {
|
|
340
|
+
const run = {
|
|
341
|
+
runId: 'wrun_41KX206BTK10M0C31CMN2AS1JS',
|
|
342
|
+
status: 'running',
|
|
343
|
+
deploymentId: 'dep-1',
|
|
344
|
+
workflowName: 'workflow//./src/workflows/test//myWorkflow',
|
|
345
|
+
specVersion: 2,
|
|
346
|
+
attributes: {},
|
|
347
|
+
createdAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
348
|
+
updatedAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
349
|
+
startedAt: new Date('2026-06-30T00:00:01.000Z'),
|
|
350
|
+
completedAt: null,
|
|
351
|
+
errorCode: null,
|
|
352
|
+
workflowCoreVersion: null,
|
|
353
|
+
workflowEncryptionEnabled: false,
|
|
354
|
+
};
|
|
355
|
+
const world = {
|
|
356
|
+
describeRun: vi.fn().mockRejectedValue(new Error('async buggy world')),
|
|
357
|
+
analytics: {
|
|
358
|
+
runs: {
|
|
359
|
+
list: vi.fn().mockResolvedValue({
|
|
360
|
+
data: [run],
|
|
361
|
+
cursor: null,
|
|
362
|
+
hasMore: false,
|
|
363
|
+
}),
|
|
364
|
+
},
|
|
365
|
+
},
|
|
366
|
+
};
|
|
367
|
+
const write = vi
|
|
368
|
+
.spyOn(process.stdout, 'write')
|
|
369
|
+
.mockImplementation(() => true);
|
|
370
|
+
await listRuns(world, { json: true });
|
|
371
|
+
const output = JSON.parse(String(write.mock.calls[0][0]));
|
|
372
|
+
expect(output.data[0].status).toBe('running');
|
|
373
|
+
expect('region' in output.data[0]).toBe(false);
|
|
374
|
+
});
|
|
375
|
+
it('adds no world fields when the world lacks describeRun', async () => {
|
|
376
|
+
const run = {
|
|
377
|
+
runId: 'wrun_01KX2M5N3RBNC12RYWYYH4WWQJ',
|
|
378
|
+
status: 'running',
|
|
379
|
+
deploymentId: 'dep-1',
|
|
380
|
+
workflowName: 'workflow//./src/workflows/test//myWorkflow',
|
|
381
|
+
specVersion: 2,
|
|
382
|
+
attributes: {},
|
|
383
|
+
createdAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
384
|
+
updatedAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
385
|
+
startedAt: new Date('2026-06-30T00:00:01.000Z'),
|
|
386
|
+
completedAt: null,
|
|
387
|
+
errorCode: null,
|
|
388
|
+
workflowCoreVersion: null,
|
|
389
|
+
workflowEncryptionEnabled: false,
|
|
390
|
+
};
|
|
391
|
+
const world = {
|
|
392
|
+
analytics: {
|
|
393
|
+
runs: {
|
|
394
|
+
list: vi.fn().mockResolvedValue({
|
|
395
|
+
data: [run],
|
|
396
|
+
cursor: null,
|
|
397
|
+
hasMore: false,
|
|
398
|
+
}),
|
|
399
|
+
},
|
|
400
|
+
},
|
|
401
|
+
};
|
|
402
|
+
const write = vi
|
|
403
|
+
.spyOn(process.stdout, 'write')
|
|
404
|
+
.mockImplementation(() => true);
|
|
405
|
+
await listRuns(world, { json: true });
|
|
406
|
+
const output = JSON.parse(String(write.mock.calls[0][0]));
|
|
407
|
+
expect('region' in output.data[0]).toBe(false);
|
|
408
|
+
});
|
|
409
|
+
});
|
|
410
|
+
describe('listSteps', () => {
|
|
411
|
+
it('passes cursors and preserves the JSON array output', async () => {
|
|
412
|
+
const step = {
|
|
413
|
+
runId: 'run-1',
|
|
414
|
+
stepId: 'step-1',
|
|
415
|
+
stepName: 'doWork',
|
|
416
|
+
status: 'completed',
|
|
417
|
+
attempt: 1,
|
|
418
|
+
createdAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
419
|
+
updatedAt: new Date('2026-06-30T00:00:02.000Z'),
|
|
420
|
+
startedAt: new Date('2026-06-30T00:00:01.000Z'),
|
|
421
|
+
completedAt: new Date('2026-06-30T00:00:02.000Z'),
|
|
422
|
+
retryAfter: null,
|
|
423
|
+
errorCode: null,
|
|
424
|
+
workflowCoreVersion: null,
|
|
425
|
+
workflowEncryptionEnabled: false,
|
|
426
|
+
};
|
|
427
|
+
const world = {
|
|
428
|
+
analytics: {
|
|
429
|
+
steps: {
|
|
430
|
+
list: vi.fn().mockResolvedValue({
|
|
431
|
+
data: [step],
|
|
432
|
+
cursor: 'next-step-cursor',
|
|
433
|
+
hasMore: true,
|
|
434
|
+
}),
|
|
435
|
+
},
|
|
436
|
+
},
|
|
437
|
+
};
|
|
438
|
+
const write = vi
|
|
439
|
+
.spyOn(process.stdout, 'write')
|
|
440
|
+
.mockImplementation(() => true);
|
|
441
|
+
await listSteps(world, {
|
|
442
|
+
json: true,
|
|
443
|
+
runId: 'run-1',
|
|
444
|
+
cursor: 'step-cursor',
|
|
445
|
+
limit: 1,
|
|
446
|
+
});
|
|
447
|
+
expect(world.analytics?.steps.list).toHaveBeenCalledWith({
|
|
448
|
+
runId: 'run-1',
|
|
449
|
+
pagination: {
|
|
450
|
+
sortOrder: 'desc',
|
|
451
|
+
cursor: 'step-cursor',
|
|
452
|
+
limit: 1,
|
|
453
|
+
},
|
|
454
|
+
});
|
|
455
|
+
expect(JSON.parse(String(write.mock.calls[0][0]))).toEqual([
|
|
456
|
+
{
|
|
457
|
+
...step,
|
|
458
|
+
createdAt: '2026-06-30T00:00:00.000Z',
|
|
459
|
+
updatedAt: '2026-06-30T00:00:02.000Z',
|
|
460
|
+
startedAt: '2026-06-30T00:00:01.000Z',
|
|
461
|
+
completedAt: '2026-06-30T00:00:02.000Z',
|
|
462
|
+
},
|
|
463
|
+
]);
|
|
464
|
+
});
|
|
465
|
+
it('falls back to storage when the first analytics page is empty', async () => {
|
|
466
|
+
const step = {
|
|
467
|
+
runId: 'run-1',
|
|
468
|
+
stepId: 'step-1',
|
|
469
|
+
stepName: 'step//./src/workflows/test//doWork',
|
|
470
|
+
status: 'completed',
|
|
471
|
+
attempt: 1,
|
|
472
|
+
input: undefined,
|
|
473
|
+
output: undefined,
|
|
474
|
+
createdAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
475
|
+
updatedAt: new Date('2026-06-30T00:00:02.000Z'),
|
|
476
|
+
startedAt: new Date('2026-06-30T00:00:01.000Z'),
|
|
477
|
+
completedAt: new Date('2026-06-30T00:00:02.000Z'),
|
|
478
|
+
};
|
|
479
|
+
const world = {
|
|
480
|
+
analytics: {
|
|
481
|
+
steps: {
|
|
482
|
+
list: vi.fn().mockResolvedValue({
|
|
483
|
+
data: [],
|
|
484
|
+
cursor: null,
|
|
485
|
+
hasMore: false,
|
|
486
|
+
}),
|
|
487
|
+
},
|
|
488
|
+
},
|
|
489
|
+
steps: {
|
|
490
|
+
list: vi.fn().mockResolvedValue({
|
|
491
|
+
data: [step],
|
|
492
|
+
cursor: null,
|
|
493
|
+
hasMore: false,
|
|
494
|
+
}),
|
|
495
|
+
},
|
|
496
|
+
};
|
|
497
|
+
const write = vi
|
|
498
|
+
.spyOn(process.stdout, 'write')
|
|
499
|
+
.mockImplementation(() => true);
|
|
500
|
+
await listSteps(world, { json: true, runId: 'run-1' });
|
|
501
|
+
expect(world.analytics?.steps.list).toHaveBeenCalled();
|
|
502
|
+
expect(world.steps.list).toHaveBeenCalledWith({
|
|
503
|
+
runId: 'run-1',
|
|
504
|
+
pagination: {
|
|
505
|
+
sortOrder: 'desc',
|
|
506
|
+
cursor: undefined,
|
|
507
|
+
limit: 20,
|
|
508
|
+
},
|
|
509
|
+
resolveData: 'none',
|
|
510
|
+
});
|
|
511
|
+
expect(JSON.parse(String(write.mock.calls[0][0]))).toEqual([
|
|
512
|
+
{
|
|
513
|
+
...step,
|
|
514
|
+
createdAt: '2026-06-30T00:00:00.000Z',
|
|
515
|
+
updatedAt: '2026-06-30T00:00:02.000Z',
|
|
516
|
+
startedAt: '2026-06-30T00:00:01.000Z',
|
|
517
|
+
completedAt: '2026-06-30T00:00:02.000Z',
|
|
518
|
+
},
|
|
519
|
+
]);
|
|
520
|
+
});
|
|
521
|
+
});
|
|
522
|
+
describe('listEvents', () => {
|
|
523
|
+
it('passes cursors and preserves the JSON array output', async () => {
|
|
524
|
+
const event = {
|
|
525
|
+
runId: 'run-1',
|
|
526
|
+
eventId: 'event-1',
|
|
527
|
+
eventType: 'step_completed',
|
|
528
|
+
correlationId: 'step-1',
|
|
529
|
+
entityId: 'step-1',
|
|
530
|
+
stepName: 'doWork',
|
|
531
|
+
workflowName: 'workflow//./src/workflows/test//myWorkflow',
|
|
532
|
+
deploymentId: 'dep-1',
|
|
533
|
+
specVersion: 2,
|
|
534
|
+
runCreatedAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
535
|
+
createdAt: new Date('2026-06-30T00:00:02.000Z'),
|
|
536
|
+
region: null,
|
|
537
|
+
vercelId: null,
|
|
538
|
+
requestId: null,
|
|
539
|
+
resumeAt: null,
|
|
540
|
+
retryAfter: null,
|
|
541
|
+
errorCode: null,
|
|
542
|
+
workflowCoreVersion: null,
|
|
543
|
+
isWebhook: false,
|
|
544
|
+
isSystem: false,
|
|
545
|
+
workflowEncryptionEnabled: false,
|
|
546
|
+
};
|
|
547
|
+
const world = {
|
|
548
|
+
analytics: {
|
|
549
|
+
events: {
|
|
550
|
+
list: vi.fn().mockResolvedValue({
|
|
551
|
+
data: [event],
|
|
552
|
+
cursor: 'next-event-cursor',
|
|
553
|
+
hasMore: true,
|
|
554
|
+
}),
|
|
555
|
+
},
|
|
556
|
+
},
|
|
557
|
+
};
|
|
558
|
+
const write = vi
|
|
559
|
+
.spyOn(process.stdout, 'write')
|
|
560
|
+
.mockImplementation(() => true);
|
|
561
|
+
await listEvents(world, {
|
|
562
|
+
json: true,
|
|
563
|
+
runId: 'run-1',
|
|
564
|
+
cursor: 'event-cursor',
|
|
565
|
+
limit: 1,
|
|
566
|
+
});
|
|
567
|
+
expect(world.analytics?.events.list).toHaveBeenCalledWith({
|
|
568
|
+
runId: 'run-1',
|
|
569
|
+
correlationId: undefined,
|
|
570
|
+
pagination: {
|
|
571
|
+
sortOrder: 'desc',
|
|
572
|
+
cursor: 'event-cursor',
|
|
573
|
+
limit: 1,
|
|
574
|
+
},
|
|
575
|
+
});
|
|
576
|
+
expect(JSON.parse(String(write.mock.calls[0][0]))).toEqual([
|
|
577
|
+
{
|
|
578
|
+
...event,
|
|
579
|
+
runCreatedAt: '2026-06-30T00:00:00.000Z',
|
|
580
|
+
createdAt: '2026-06-30T00:00:02.000Z',
|
|
581
|
+
},
|
|
582
|
+
]);
|
|
583
|
+
});
|
|
584
|
+
it('falls back to storage when the first analytics page is empty', async () => {
|
|
585
|
+
const event = {
|
|
586
|
+
runId: 'run-1',
|
|
587
|
+
eventId: 'event-1',
|
|
588
|
+
eventType: 'step_completed',
|
|
589
|
+
correlationId: 'step-1',
|
|
590
|
+
eventData: {
|
|
591
|
+
stepName: 'doWork',
|
|
592
|
+
result: undefined,
|
|
593
|
+
},
|
|
594
|
+
createdAt: new Date('2026-06-30T00:00:02.000Z'),
|
|
595
|
+
};
|
|
596
|
+
const world = {
|
|
597
|
+
analytics: {
|
|
598
|
+
events: {
|
|
599
|
+
list: vi.fn().mockResolvedValue({
|
|
600
|
+
data: [],
|
|
601
|
+
cursor: null,
|
|
602
|
+
hasMore: false,
|
|
603
|
+
}),
|
|
604
|
+
},
|
|
605
|
+
},
|
|
606
|
+
events: {
|
|
607
|
+
list: vi.fn().mockResolvedValue({
|
|
608
|
+
data: [event],
|
|
609
|
+
cursor: null,
|
|
610
|
+
hasMore: false,
|
|
611
|
+
}),
|
|
612
|
+
},
|
|
613
|
+
};
|
|
614
|
+
const write = vi
|
|
615
|
+
.spyOn(process.stdout, 'write')
|
|
616
|
+
.mockImplementation(() => true);
|
|
617
|
+
await listEvents(world, { json: true, runId: 'run-1' });
|
|
618
|
+
expect(world.analytics?.events.list).toHaveBeenCalled();
|
|
619
|
+
expect(world.events.list).toHaveBeenCalledWith({
|
|
620
|
+
runId: 'run-1',
|
|
621
|
+
pagination: {
|
|
622
|
+
sortOrder: 'desc',
|
|
623
|
+
cursor: undefined,
|
|
624
|
+
limit: 20,
|
|
625
|
+
},
|
|
626
|
+
resolveData: 'none',
|
|
627
|
+
});
|
|
628
|
+
expect(JSON.parse(String(write.mock.calls[0][0]))).toEqual([
|
|
629
|
+
{
|
|
630
|
+
...event,
|
|
631
|
+
createdAt: '2026-06-30T00:00:02.000Z',
|
|
632
|
+
},
|
|
633
|
+
]);
|
|
634
|
+
});
|
|
635
|
+
});
|
|
636
|
+
describe('listSleeps', () => {
|
|
637
|
+
const wait = {
|
|
638
|
+
runId: 'run-1',
|
|
639
|
+
waitId: 'wait-1',
|
|
640
|
+
status: 'waiting',
|
|
641
|
+
resumeAt: new Date('2026-06-30T00:01:00.000Z'),
|
|
642
|
+
createdAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
643
|
+
updatedAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
644
|
+
completedAt: null,
|
|
645
|
+
workflowCoreVersion: null,
|
|
646
|
+
workflowEncryptionEnabled: false,
|
|
647
|
+
};
|
|
648
|
+
const pageInfo = {
|
|
649
|
+
currentLookbackDays: 2,
|
|
650
|
+
maxLookbackDays: 30,
|
|
651
|
+
currentWindowStart: new Date('2026-06-28T00:00:00.000Z'),
|
|
652
|
+
maxWindowStart: new Date('2026-06-01T00:00:00.000Z'),
|
|
653
|
+
upgradeAvailable: true,
|
|
654
|
+
};
|
|
655
|
+
it('passes cursors and preserves the JSON array output through analytics', async () => {
|
|
656
|
+
const world = {
|
|
657
|
+
analytics: {
|
|
658
|
+
waits: {
|
|
659
|
+
list: vi.fn().mockResolvedValue({
|
|
660
|
+
data: [wait],
|
|
661
|
+
cursor: 'next-wait-cursor',
|
|
662
|
+
hasMore: true,
|
|
663
|
+
pageInfo,
|
|
664
|
+
}),
|
|
665
|
+
},
|
|
666
|
+
},
|
|
667
|
+
};
|
|
668
|
+
const write = vi
|
|
669
|
+
.spyOn(process.stdout, 'write')
|
|
670
|
+
.mockImplementation(() => true);
|
|
671
|
+
await listSleeps(world, {
|
|
672
|
+
json: true,
|
|
673
|
+
runId: 'run-1',
|
|
674
|
+
cursor: 'wait-cursor',
|
|
675
|
+
limit: 1,
|
|
676
|
+
});
|
|
677
|
+
expect(world.analytics?.waits.list).toHaveBeenCalledWith({
|
|
678
|
+
runId: 'run-1',
|
|
679
|
+
pagination: {
|
|
680
|
+
sortOrder: 'desc',
|
|
681
|
+
cursor: 'wait-cursor',
|
|
682
|
+
limit: 1,
|
|
683
|
+
},
|
|
684
|
+
});
|
|
685
|
+
expect(JSON.parse(String(write.mock.calls[0][0]))).toEqual([
|
|
686
|
+
{
|
|
687
|
+
...wait,
|
|
688
|
+
resumeAt: '2026-06-30T00:01:00.000Z',
|
|
689
|
+
createdAt: '2026-06-30T00:00:00.000Z',
|
|
690
|
+
updatedAt: '2026-06-30T00:00:00.000Z',
|
|
691
|
+
},
|
|
692
|
+
]);
|
|
693
|
+
});
|
|
694
|
+
it('surfaces the observability upgrade hint in table mode', async () => {
|
|
695
|
+
const world = {
|
|
696
|
+
analytics: {
|
|
697
|
+
waits: {
|
|
698
|
+
list: vi.fn().mockResolvedValue({
|
|
699
|
+
data: [wait],
|
|
700
|
+
cursor: null,
|
|
701
|
+
hasMore: false,
|
|
702
|
+
pageInfo,
|
|
703
|
+
}),
|
|
704
|
+
},
|
|
705
|
+
},
|
|
706
|
+
};
|
|
707
|
+
const log = vi.spyOn(console, 'log').mockImplementation(() => undefined);
|
|
708
|
+
await listSleeps(world, { runId: 'run-1' });
|
|
709
|
+
expect(log.mock.calls.flat().join('\n')).toContain('Upgrade Observability Plus');
|
|
710
|
+
});
|
|
711
|
+
});
|
|
712
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2luc3BlY3Qvb3V0cHV0LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBVUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDN0QsT0FBTyxFQUNMLHNDQUFzQyxFQUN0QyxtQ0FBbUMsR0FDcEMsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsVUFBVSxFQUNWLFFBQVEsRUFDUixVQUFVLEVBQ1YsU0FBUyxHQUNWLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE1BQU0sT0FBTyxHQUFHLENBQUMsWUFBa0MsRUFBRSxFQUFlLEVBQUUsQ0FDcEUsQ0FBQztJQUNDLEtBQUssRUFBRSxPQUFPO0lBQ2QsTUFBTSxFQUFFLFNBQVM7SUFDakIsWUFBWSxFQUFFLE9BQU87SUFDckIsWUFBWSxFQUFFLDRDQUE0QztJQUMxRCxLQUFLLEVBQUUsU0FBUztJQUNoQixNQUFNLEVBQUUsU0FBUztJQUNqQixLQUFLLEVBQUUsU0FBUztJQUNoQixTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQ2pDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDakMsV0FBVyxFQUFFLFNBQVM7SUFDdEIsU0FBUyxFQUFFLFNBQVM7SUFDcEIsU0FBUyxFQUFFLFNBQVM7SUFDcEIsV0FBVyxFQUFFLENBQUM7SUFDZCxnQkFBZ0IsRUFBRSxFQUFFO0lBQ3BCLEdBQUcsU0FBUztDQUNiLENBQTJCLENBQUM7QUFFL0IsU0FBUyxDQUFDLEdBQUcsRUFBRTtJQUNiLEVBQUUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztBQUN2QixDQUFDLENBQUMsQ0FBQztBQUVILFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUU7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QUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV6RSxNQUFNLFVBQVUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUU1QyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUNoRCw0QkFBNEIsQ0FDN0IsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIEFuYWx5dGljc0V2ZW50LFxuICBBbmFseXRpY3NSdW4sXG4gIEFuYWx5dGljc1N0ZXAsXG4gIEFuYWx5dGljc1dhaXQsXG4gIEV2ZW50LFxuICBTdGVwLFxuICBXb3JrZmxvd1J1bixcbiAgV29ybGQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBhZnRlckVhY2gsIGRlc2NyaWJlLCBleHBlY3QsIGl0LCB2aSB9IGZyb20gJ3ZpdGVzdCc7XG5pbXBvcnQge1xuICBnZXRPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkTWVzc2FnZSxcbiAgaXNPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkRXJyb3IsXG59IGZyb20gJy4vZXJyb3JzLmpzJztcbmltcG9ydCB7XG4gIGZvcm1hdFRhYmxlVmFsdWUsXG4gIGhhc0V4cGlyZWREYXRhLFxuICBsaXN0RXZlbnRzLFxuICBsaXN0UnVucyxcbiAgbGlzdFNsZWVwcyxcbiAgbGlzdFN0ZXBzLFxufSBmcm9tICcuL291dHB1dC5qcyc7XG5cbmNvbnN0IG1ha2VSdW4gPSAob3ZlcnJpZGVzOiBQYXJ0aWFsPFdvcmtmbG93UnVuPiA9IHt9KTogV29ya2Zsb3dSdW4gPT5cbiAgKHtcbiAgICBydW5JZDogJ3J1bi0xJyxcbiAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICBkZXBsb3ltZW50SWQ6ICdkZXAtMScsXG4gICAgd29ya2Zsb3dOYW1lOiAnd29ya2Zsb3cvLy4vc3JjL3dvcmtmbG93cy90ZXN0Ly9teVdvcmtmbG93JyxcbiAgICBpbnB1dDogdW5kZWZpbmVkLFxuICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgnMjAyNS0wMS0wMScpLFxuICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoJzIwMjUtMDEtMDEnKSxcbiAgICBjb21wbGV0ZWRBdDogdW5kZWZpbmVkLFxuICAgIHN0YXJ0ZWRBdDogdW5kZWZpbmVkLFxuICAgIGV4cGlyZWRBdDogdW5kZWZpbmVkLFxuICAgIHNwZWNWZXJzaW9uOiAyLFxuICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHt9LFxuICAgIC4uLm92ZXJyaWRlcyxcbiAgfSkgYXMgdW5rbm93biBhcyBXb3JrZmxvd1J1bjtcblxuYWZ0ZXJFYWNoKCgpID0+IHtcbiAgdmkucmVzdG9yZUFsbE1vY2tzKCk7XG59KTtcblxuZGVzY3JpYmUoJ2hhc0V4cGlyZWREYXRhJywgKCkgPT4ge1xuICBpdCgncmV0dXJucyBmYWxzZSB3aGVuIGV4cGlyZWRBdCBpcyB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGhhc0V4cGlyZWREYXRhKG1ha2VSdW4oeyBleHBpcmVkQXQ6IHVuZGVmaW5lZCB9KSkpLnRvQmUoZmFsc2UpO1xuICB9KTtcblxuICBpdCgncmV0dXJucyBmYWxzZSB3aGVuIGV4cGlyZWRBdCBpcyBpbiB0aGUgZnV0dXJlJywgKCkgPT4ge1xuICAgIGNvbnN0IGZ1dHVyZSA9IG5ldyBEYXRlKERhdGUubm93KCkgKyAyNCAqIDYwICogNjAgKiAxMDAwKTtcbiAgICBleHBlY3QoaGFzRXhwaXJlZERhdGEobWFrZVJ1bih7IGV4cGlyZWRBdDogZnV0dXJlIH0pKSkudG9CZShmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdyZXR1cm5zIHRydWUgd2hlbiBleHBpcmVkQXQgaXMgaW4gdGhlIHBhc3QnLCAoKSA9PiB7XG4gICAgY29uc3QgcGFzdCA9IG5ldyBEYXRlKERhdGUubm93KCkgLSAyNCAqIDYwICogNjAgKiAxMDAwKTtcbiAgICBleHBlY3QoaGFzRXhwaXJlZERhdGEobWFrZVJ1bih7IGV4cGlyZWRBdDogcGFzdCB9KSkpLnRvQmUodHJ1ZSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdmb3JtYXRUYWJsZVZhbHVlIGV4cGlyZWQgZGF0YSBoYW5kbGluZycsICgpID0+IHtcbiAgaXQoJ3JldHVybnMgaW5wdXQgdmFsdWUgd2hlbiBleHBpcmVkQXQgaXMgaW4gdGhlIGZ1dHVyZScsICgpID0+IHtcbiAgICBjb25zdCBmdXR1cmUgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgMjQgKiA2MCAqIDYwICogMTAwMCk7XG4gICAgY29uc3QgaXRlbSA9IHsgZXhwaXJlZEF0OiBmdXR1cmUudG9JU09TdHJpbmcoKSwgaW5wdXQ6ICdoZWxsbycgfTtcbiAgICBjb25zdCByZXN1bHQgPSBmb3JtYXRUYWJsZVZhbHVlKCdpbnB1dCcsICdoZWxsbycsIHt9LCB1bmRlZmluZWQsIGl0ZW0pO1xuICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b0NvbnRhaW4oJ2V4cGlyZWQnKTtcbiAgfSk7XG5cbiAgaXQoJ3JldHVybnMgZXhwaXJlZCBtZXNzYWdlIHdoZW4gZXhwaXJlZEF0IGlzIGluIHRoZSBwYXN0JywgKCkgPT4ge1xuICAgIGNvbnN0IHBhc3QgPSBuZXcgRGF0ZShEYXRlLm5vdygpIC0gMjQgKiA2MCAqIDYwICogMTAwMCk7XG4gICAgY29uc3QgaXRlbSA9IHsgZXhwaXJlZEF0OiBwYXN0LnRvSVNPU3RyaW5nKCksIG91dHB1dDogJ2hlbGxvJyB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGZvcm1hdFRhYmxlVmFsdWUoJ291dHB1dCcsICdoZWxsbycsIHt9LCB1bmRlZmluZWQsIGl0ZW0pO1xuICAgIGV4cGVjdChTdHJpbmcocmVzdWx0KSkudG9Db250YWluKCdkYXRhIGV4cGlyZWQnKTtcbiAgfSk7XG5cbiAgaXQoJ3JldHVybnMgaW5wdXQgdmFsdWUgd2hlbiBleHBpcmVkQXQgaXMgbm90IHByZXNlbnQnLCAoKSA9PiB7XG4gICAgY29uc3QgaXRlbSA9IHsgaW5wdXQ6ICdoZWxsbycgfTtcbiAgICBjb25zdCByZXN1bHQgPSBmb3JtYXRUYWJsZVZhbHVlKCdpbnB1dCcsICdoZWxsbycsIHt9LCB1bmRlZmluZWQsIGl0ZW0pO1xuICAgIGV4cGVjdChTdHJpbmcocmVzdWx0KSkubm90LnRvQ29udGFpbignZXhwaXJlZCcpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnaXNPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkRXJyb3InLCAoKSA9PiB7XG4gIGl0KCdkZXRlY3RzIHdvcmtmbG93IGFuYWx5dGljcyA0MDIgZXJyb3JzIGJ5IHRvcC1sZXZlbCBjb2RlJywgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGlzT2JzZXJ2YWJpbGl0eVVwZ3JhZGVSZXF1aXJlZEVycm9yKHtcbiAgICAgICAgc3RhdHVzOiA0MDIsXG4gICAgICAgIGNvZGU6ICdvYnNlcnZhYmlsaXR5LXVwZ3JhZGUtcmVxdWlyZWQnLFxuICAgICAgfSlcbiAgICApLnRvQmUodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdkZXRlY3RzIHdvcmtmbG93IGFuYWx5dGljcyA0MDIgZXJyb3JzIGJ5IHJlc3BvbnNlIGJvZHkgZXJyb3InLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgaXNPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkRXJyb3Ioe1xuICAgICAgICBzdGF0dXM6IDQwMixcbiAgICAgICAgYm9keTogeyBlcnJvcjogJ29ic2VydmFiaWxpdHktdXBncmFkZS1yZXF1aXJlZCcgfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKHRydWUpO1xuICB9KTtcblxuICBpdCgnZG9lcyBub3QgdHJlYXQgNDA0cyBhcyB1cGdyYWRlIHByb21wdHMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgaXNPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkRXJyb3Ioe1xuICAgICAgICBzdGF0dXM6IDQwNCxcbiAgICAgICAgY29kZTogJ29ic2VydmFiaWxpdHktdXBncmFkZS1yZXF1aXJlZCcsXG4gICAgICB9KVxuICAgICkudG9CZShmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCd1c2VzIGFuIHVwZ3JhZGUgcHJvbXB0IG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGdldE9ic2VydmFiaWxpdHlVcGdyYWRlUmVxdWlyZWRNZXNzYWdlKCkpLnRvQ29udGFpbihcbiAgICAgICdVcGdyYWRlIE9ic2VydmFiaWxpdHkgUGx1cydcbiAgICApO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnbGlzdFJ1bnMnLCAoKSA9PiB7XG4gIGl0KCdwcmVzZXJ2ZXMgYW5hbHl0aWNzIHBhZ2UgbWV0YWRhdGEgaW4gSlNPTiBvdXRwdXQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcnVuID0ge1xuICAgICAgcnVuSWQ6ICdydW4tMScsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIGRlcGxveW1lbnRJZDogJ2RlcC0xJyxcbiAgICAgIHdvcmtmbG93TmFtZTogJ3dvcmtmbG93Ly8uL3NyYy93b3JrZmxvd3MvdGVzdC8vbXlXb3JrZmxvdycsXG4gICAgICBzcGVjVmVyc2lvbjogMixcbiAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMC4wMDBaJyksXG4gICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCcyMDI2LTA2LTMwVDAwOjAwOjAwLjAwMFonKSxcbiAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoJzIwMjYtMDYtMzBUMDA6MDA6MDEuMDAwWicpLFxuICAgICAgY29tcGxldGVkQXQ6IG51bGwsXG4gICAgICBlcnJvckNvZGU6IG51bGwsXG4gICAgICB3b3JrZmxvd0NvcmVWZXJzaW9uOiBudWxsLFxuICAgICAgd29ya2Zsb3dFbmNyeXB0aW9uRW5hYmxlZDogZmFsc2UsXG4gICAgfSBzYXRpc2ZpZXMgQW5hbHl0aWNzUnVuO1xuICAgIGNvbnN0IHBhZ2VJbmZvID0ge1xuICAgICAgY3VycmVudExvb2tiYWNrRGF5czogMixcbiAgICAgIG1heExvb2tiYWNrRGF5czogMzAsXG4gICAgICBjdXJyZW50V2luZG93U3RhcnQ6IG5ldyBEYXRlKCcyMDI2LTA2LTI4VDAwOjAwOjAwLjAwMFonKSxcbiAgICAgIG1heFdpbmRvd1N0YXJ0OiBuZXcgRGF0ZSgnMjAyNi0wNi0wMVQwMDowMDowMC4wMDBaJyksXG4gICAgICB1cGdyYWRlQXZhaWxhYmxlOiB0cnVlLFxuICAgIH07XG4gICAgY29uc3Qgd29ybGQgPSB7XG4gICAgICBhbmFseXRpY3M6IHtcbiAgICAgICAgcnVuczoge1xuICAgICAgICAgIGxpc3Q6IHZpLmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgICAgICAgZGF0YTogW3J1bl0sXG4gICAgICAgICAgICBjdXJzb3I6IG51bGwsXG4gICAgICAgICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgICAgICAgIHBhZ2VJbmZvLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9IGFzIHVua25vd24gYXMgV29ybGQ7XG4gICAgY29uc3Qgd3JpdGUgPSB2aVxuICAgICAgLnNweU9uKHByb2Nlc3Muc3Rkb3V0LCAnd3JpdGUnKVxuICAgICAgLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB0cnVlKTtcblxuICAgIGF3YWl0IGxpc3RSdW5zKHdvcmxkLCB7IGpzb246IHRydWUgfSk7XG5cbiAgICBleHBlY3Qod29ybGQuYW5hbHl0aWNzPy5ydW5zLmxpc3QpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICAgIHdvcmtmbG93TmFtZTogdW5kZWZpbmVkLFxuICAgICAgc3RhdHVzOiB1bmRlZmluZWQsXG4gICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgIHNvcnRPcmRlcjogJ2Rlc2MnLFxuICAgICAgICBjdXJzb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgbGltaXQ6IDIwLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBleHBlY3Qod3JpdGUpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICBleHBlY3QoSlNPTi5wYXJzZShTdHJpbmcod3JpdGUubW9jay5jYWxsc1swXVswXSkpKS50b0VxdWFsKHtcbiAgICAgIGRhdGE6IFtcbiAgICAgICAge1xuICAgICAgICAgIC4uLnJ1bixcbiAgICAgICAgICBjcmVhdGVkQXQ6ICcyMDI2LTA2LTMwVDAwOjAwOjAwLjAwMFonLFxuICAgICAgICAgIHVwZGF0ZWRBdDogJzIwMjYtMDYtMzBUMDA6MDA6MDAuMDAwWicsXG4gICAgICAgICAgc3RhcnRlZEF0OiAnMjAyNi0wNi0zMFQwMDowMDowMS4wMDBaJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBjdXJzb3I6IG51bGwsXG4gICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgIHBhZ2VJbmZvOiB7XG4gICAgICAgIGN1cnJlbnRMb29rYmFja0RheXM6IDIsXG4gICAgICAgIG1heExvb2tiYWNrRGF5czogMzAsXG4gICAgICAgIGN1cnJlbnRXaW5kb3dTdGFydDogJzIwMjYtMDYtMjhUMDA6MDA6MDAuMDAwWicsXG4gICAgICAgIG1heFdpbmRvd1N0YXJ0OiAnMjAyNi0wNi0wMVQwMDowMDowMC4wMDBaJyxcbiAgICAgICAgdXBncmFkZUF2YWlsYWJsZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdpbmNsdWRlcyB3b3JsZC1zcGVjaWZpYyBmaWVsZHMgd2hlbiB0aGUgd29ybGQgZGVmaW5lcyBkZXNjcmliZVJ1bicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBydW4gPSB7XG4gICAgICBydW5JZDogJ3dydW5fNDFLWDIwNkJUSzEwTTBDMzFDTU4yQVMxSlMnLFxuICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICBkZXBsb3ltZW50SWQ6ICdkZXAtMScsXG4gICAgICB3b3JrZmxvd05hbWU6ICd3b3JrZmxvdy8vLi9zcmMvd29ya2Zsb3dzL3Rlc3QvL215V29ya2Zsb3cnLFxuICAgICAgc3BlY1ZlcnNpb246IDIsXG4gICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoJzIwMjYtMDYtMzBUMDA6MDA6MDAuMDAwWicpLFxuICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMC4wMDBaJyksXG4gICAgICBzdGFydGVkQXQ6IG5ldyBEYXRlKCcyMDI2LTA2LTMwVDAwOjAwOjAxLjAwMFonKSxcbiAgICAgIGNvbXBsZXRlZEF0OiBudWxsLFxuICAgICAgZXJyb3JDb2RlOiBudWxsLFxuICAgICAgd29ya2Zsb3dDb3JlVmVyc2lvbjogbnVsbCxcbiAgICAgIHdvcmtmbG93RW5jcnlwdGlvbkVuYWJsZWQ6IGZhbHNlLFxuICAgIH0gc2F0aXNmaWVzIEFuYWx5dGljc1J1bjtcbiAgICBjb25zdCBkZXNjcmliZVJ1biA9IHZpLmZuKCkubW9ja1JldHVyblZhbHVlKHsgcmVnaW9uOiAnc2ZvMScsIHNoYXJkOiAnYScgfSk7XG4gICAgY29uc3Qgd29ybGQgPSB7XG4gICAgICBkZXNjcmliZVJ1bixcbiAgICAgIGFuYWx5dGljczoge1xuICAgICAgICBydW5zOiB7XG4gICAgICAgICAgbGlzdDogdmkuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICAgICAgICBkYXRhOiBbcnVuXSxcbiAgICAgICAgICAgIGN1cnNvcjogbnVsbCxcbiAgICAgICAgICAgIGhhc01vcmU6IGZhbHNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9IGFzIHVua25vd24gYXMgV29ybGQ7XG4gICAgY29uc3Qgd3JpdGUgPSB2aVxuICAgICAgLnNweU9uKHByb2Nlc3Muc3Rkb3V0LCAnd3JpdGUnKVxuICAgICAgLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB0cnVlKTtcblxuICAgIGF3YWl0IGxpc3RSdW5zKHdvcmxkLCB7IGpzb246IHRydWUgfSk7XG5cbiAgICBleHBlY3QoZGVzY3JpYmVSdW4pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyBydW5JZDogcnVuLnJ1bklkIH0pXG4gICAgKTtcbiAgICBjb25zdCBvdXRwdXQgPSBKU09OLnBhcnNlKFN0cmluZyh3cml0ZS5tb2NrLmNhbGxzWzBdWzBdKSk7XG4gICAgZXhwZWN0KG91dHB1dC5kYXRhWzBdLnJlZ2lvbikudG9CZSgnc2ZvMScpO1xuICAgIGV4cGVjdChvdXRwdXQuZGF0YVswXS5zaGFyZCkudG9CZSgnYScpO1xuICB9KTtcblxuICBpdCgncHJlc2VydmVzIG51bGwgZmllbGQgdmFsdWVzIGZyb20gZGVzY3JpYmVSdW4gaW4gSlNPTiBvdXRwdXQnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gbnVsbCBtZWFucyBcImFwcGxpY2FibGUgYnV0IHVuZGV0ZXJtaW5hYmxlXCIg4oCUIGRpc3Rpbmd1aXNoYWJsZSBmcm9tXG4gICAgLy8gdGhlIGhvb2sgYmVpbmcgYWJzZW50IChrZXkgbWlzc2luZyBlbnRpcmVseSkuXG4gICAgY29uc3QgcnVuID0ge1xuICAgICAgcnVuSWQ6ICd3cnVuX21hbGZvcm1lZCcsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIGRlcGxveW1lbnRJZDogJ2RlcC0xJyxcbiAgICAgIHdvcmtmbG93TmFtZTogJ3dvcmtmbG93Ly8uL3NyYy93b3JrZmxvd3MvdGVzdC8vbXlXb3JrZmxvdycsXG4gICAgICBzcGVjVmVyc2lvbjogMixcbiAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMC4wMDBaJyksXG4gICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCcyMDI2LTA2LTMwVDAwOjAwOjAwLjAwMFonKSxcbiAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoJzIwMjYtMDYtMzBUMDA6MDA6MDEuMDAwWicpLFxuICAgICAgY29tcGxldGVkQXQ6IG51bGwsXG4gICAgICBlcnJvckNvZGU6IG51bGwsXG4gICAgICB3b3JrZmxvd0NvcmVWZXJzaW9uOiBudWxsLFxuICAgICAgd29ya2Zsb3dFbmNyeXB0aW9uRW5hYmxlZDogZmFsc2UsXG4gICAgfSBzYXRpc2ZpZXMgQW5hbHl0aWNzUnVuO1xuICAgIGNvbnN0IHdvcmxkID0ge1xuICAgICAgZGVzY3JpYmVSdW46IHZpLmZuKCkubW9ja1JldHVyblZhbHVlKHsgcmVnaW9uOiBudWxsIH0pLFxuICAgICAgYW5hbHl0aWNzOiB7XG4gICAgICAgIHJ1bnM6IHtcbiAgICAgICAgICBsaXN0OiB2aS5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgICAgICAgIGRhdGE6IFtydW5dLFxuICAgICAgICAgICAgY3Vyc29yOiBudWxsLFxuICAgICAgICAgICAgaGFzTW9yZTogZmFsc2UsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0gYXMgdW5rbm93biBhcyBXb3JsZDtcbiAgICBjb25zdCB3cml0ZSA9IHZpXG4gICAgICAuc3B5T24ocHJvY2Vzcy5zdGRvdXQsICd3cml0ZScpXG4gICAgICAubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHRydWUpO1xuXG4gICAgYXdhaXQgbGlzdFJ1bnMod29ybGQsIHsganNvbjogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IG91dHB1dCA9IEpTT04ucGFyc2UoU3RyaW5nKHdyaXRlLm1vY2suY2FsbHNbMF1bMF0pKTtcbiAgICBleHBlY3QoJ3JlZ2lvbicgaW4gb3V0cHV0LmRhdGFbMF0pLnRvQmUodHJ1ZSk7XG4gICAgZXhwZWN0KG91dHB1dC5kYXRhWzBdLnJlZ2lvbikudG9CZU51bGwoKTtcbiAgfSk7XG5cbiAgaXQoJ25ldmVyIGxldHMgZGVzY3JpYmVSdW4gb3ZlcndyaXRlIGNhbm9uaWNhbCBydW4gZmllbGRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJ1biA9IHtcbiAgICAgIHJ1bklkOiAnd3J1bl80MUtYMjA2QlRLMTBNMEMzMUNNTjJBUzFKUycsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIGRlcGxveW1lbnRJZDogJ2RlcC0xJyxcbiAgICAgIHdvcmtmbG93TmFtZTogJ3dvcmtmbG93Ly8uL3NyYy93b3JrZmxvd3MvdGVzdC8vbXlXb3JrZmxvdycsXG4gICAgICBzcGVjVmVyc2lvbjogMixcbiAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMC4wMDBaJyksXG4gICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCcyMDI2LTA2LTMwVDAwOjAwOjAwLjAwMFonKSxcbiAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoJzIwMjYtMDYtMzBUMDA6MDA6MDEuMDAwWicpLFxuICAgICAgY29tcGxldGVkQXQ6IG51bGwsXG4gICAgICBlcnJvckNvZGU6IG51bGwsXG4gICAgICB3b3JrZmxvd0NvcmVWZXJzaW9uOiBudWxsLFxuICAgICAgd29ya2Zsb3dFbmNyeXB0aW9uRW5hYmxlZDogZmFsc2UsXG4gICAgfSBzYXRpc2ZpZXMgQW5hbHl0aWNzUnVuO1xuICAgIGNvbnN0IHdvcmxkID0ge1xuICAgICAgLy8gSG9zdGlsZS9idWdneSB3b3JsZDogdHJpZXMgdG8gY2xvYmJlciBjYW5vbmljYWwgZmllbGRzLlxuICAgICAgZGVzY3JpYmVSdW46IHZpXG4gICAgICAgIC5mbigpXG4gICAgICAgIC5tb2NrUmV0dXJuVmFsdWUoeyBzdGF0dXM6ICdoYWNrZWQnLCBydW5JZDogJ25vcGUnLCByZWdpb246ICdzZm8xJyB9KSxcbiAgICAgIGFuYWx5dGljczoge1xuICAgICAgICBydW5zOiB7XG4gICAgICAgICAgbGlzdDogdmkuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICAgICAgICBkYXRhOiBbcnVuXSxcbiAgICAgICAgICAgIGN1cnNvcjogbnVsbCxcbiAgICAgICAgICAgIGhhc01vcmU6IGZhbHNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9IGFzIHVua25vd24gYXMgV29ybGQ7XG4gICAgY29uc3Qgd3JpdGUgPSB2aVxuICAgICAgLnNweU9uKHByb2Nlc3Muc3Rkb3V0LCAnd3JpdGUnKVxuICAgICAgLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB0cnVlKTtcblxuICAgIGF3YWl0IGxpc3RSdW5zKHdvcmxkLCB7IGpzb246IHRydWUgfSk7XG5cbiAgICBjb25zdCBvdXRwdXQgPSBKU09OLnBhcnNlKFN0cmluZyh3cml0ZS5tb2NrLmNhbGxzWzBdWzBdKSk7XG4gICAgZXhwZWN0KG91dHB1dC5kYXRhWzBdLnN0YXR1cykudG9CZSgncnVubmluZycpO1xuICAgIGV4cGVjdChvdXRwdXQuZGF0YVswXS5ydW5JZCkudG9CZShydW4ucnVuSWQpO1xuICAgIGV4cGVjdChvdXRwdXQuZGF0YVswXS5yZWdpb24pLnRvQmUoJ3NmbzEnKTtcbiAgfSk7XG5cbiAgaXQoJ3RyZWF0cyBhIHRocm93aW5nIGRlc2NyaWJlUnVuIGFzIGNvbnRyaWJ1dGluZyBubyBmaWVsZHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcnVuID0ge1xuICAgICAgcnVuSWQ6ICd3cnVuXzQxS1gyMDZCVEsxME0wQzMxQ01OMkFTMUpTJyxcbiAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgZGVwbG95bWVudElkOiAnZGVwLTEnLFxuICAgICAgd29ya2Zsb3dOYW1lOiAnd29ya2Zsb3cvLy4vc3JjL3dvcmtmbG93cy90ZXN0Ly9teVdvcmtmbG93JyxcbiAgICAgIHNwZWNWZXJzaW9uOiAyLFxuICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCcyMDI2LTA2LTMwVDAwOjAwOjAwLjAwMFonKSxcbiAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoJzIwMjYtMDYtMzBUMDA6MDA6MDAuMDAwWicpLFxuICAgICAgc3RhcnRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMS4wMDBaJyksXG4gICAgICBjb21wbGV0ZWRBdDogbnVsbCxcbiAgICAgIGVycm9yQ29kZTogbnVsbCxcbiAgICAgIHdvcmtmbG93Q29yZVZlcnNpb246IG51bGwsXG4gICAgICB3b3JrZmxvd0VuY3J5cHRpb25FbmFibGVkOiBmYWxzZSxcbiAgICB9IHNhdGlzZmllcyBBbmFseXRpY3NSdW47XG4gICAgY29uc3Qgd29ybGQgPSB7XG4gICAgICBkZXNjcmliZVJ1bjogdmkuZm4oKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2J1Z2d5IHdvcmxkJyk7XG4gICAgICB9KSxcbiAgICAgIGFuYWx5dGljczoge1xuICAgICAgICBydW5zOiB7XG4gICAgICAgICAgbGlzdDogdmkuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICAgICAgICBkYXRhOiBbcnVuXSxcbiAgICAgICAgICAgIGN1cnNvcjogbnVsbCxcbiAgICAgICAgICAgIGhhc01vcmU6IGZhbHNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9IGFzIHVua25vd24gYXMgV29ybGQ7XG4gICAgY29uc3Qgd3JpdGUgPSB2aVxuICAgICAgLnNweU9uKHByb2Nlc3Muc3Rkb3V0LCAnd3JpdGUnKVxuICAgICAgLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB0cnVlKTtcblxuICAgIC8vIE11c3Qgbm90IHRocm93IGRlc3BpdGUgdGhlIHdvcmxkIHZpb2xhdGluZyB0aGUgbm8tdGhyb3cgY29udHJhY3QuXG4gICAgYXdhaXQgbGlzdFJ1bnMod29ybGQsIHsganNvbjogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IG91dHB1dCA9IEpTT04ucGFyc2UoU3RyaW5nKHdyaXRlLm1vY2suY2FsbHNbMF1bMF0pKTtcbiAgICBleHBlY3Qob3V0cHV0LmRhdGFbMF0uc3RhdHVzKS50b0JlKCdydW5uaW5nJyk7XG4gICAgZXhwZWN0KCdyZWdpb24nIGluIG91dHB1dC5kYXRhWzBdKS50b0JlKGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoJ3N1cHBvcnRzIGFzeW5jIGRlc2NyaWJlUnVuIGltcGxlbWVudGF0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBydW4gPSB7XG4gICAgICBydW5JZDogJ3dydW5fNDFLWDIwNkJUSzEwTTBDMzFDTU4yQVMxSlMnLFxuICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICBkZXBsb3ltZW50SWQ6ICdkZXAtMScsXG4gICAgICB3b3JrZmxvd05hbWU6ICd3b3JrZmxvdy8vLi9zcmMvd29ya2Zsb3dzL3Rlc3QvL215V29ya2Zsb3cnLFxuICAgICAgc3BlY1ZlcnNpb246IDIsXG4gICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoJzIwMjYtMDYtMzBUMDA6MDA6MDAuMDAwWicpLFxuICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMC4wMDBaJyksXG4gICAgICBzdGFydGVkQXQ6IG5ldyBEYXRlKCcyMDI2LTA2LTMwVDAwOjAwOjAxLjAwMFonKSxcbiAgICAgIGNvbXBsZXRlZEF0OiBudWxsLFxuICAgICAgZXJyb3JDb2RlOiBudWxsLFxuICAgICAgd29ya2Zsb3dDb3JlVmVyc2lvbjogbnVsbCxcbiAgICAgIHdvcmtmbG93RW5jcnlwdGlvbkVuYWJsZWQ6IGZhbHNlLFxuICAgIH0gc2F0aXNmaWVzIEFuYWx5dGljc1J1bjtcbiAgICBjb25zdCB3b3JsZCA9IHtcbiAgICAgIGRlc2NyaWJlUnVuOiB2aS5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHsgcmVnaW9uOiAnc2ZvMScgfSksXG4gICAgICBhbmFseXRpY3M6IHtcbiAgICAgICAgcnVuczoge1xuICAgICAgICAgIGxpc3Q6IHZpLmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgICAgICAgZGF0YTogW3J1bl0sXG4gICAgICAgICAgICBjdXJzb3I6IG51bGwsXG4gICAgICAgICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSBhcyB1bmtub3duIGFzIFdvcmxkO1xuICAgIGNvbnN0IHdyaXRlID0gdmlcbiAgICAgIC5zcHlPbihwcm9jZXNzLnN0ZG91dCwgJ3dyaXRlJylcbiAgICAgIC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gdHJ1ZSk7XG5cbiAgICBhd2FpdCBsaXN0UnVucyh3b3JsZCwgeyBqc29uOiB0cnVlIH0pO1xuXG4gICAgY29uc3Qgb3V0cHV0ID0gSlNPTi5wYXJzZShTdHJpbmcod3JpdGUubW9jay5jYWxsc1swXVswXSkpO1xuICAgIGV4cGVjdChvdXRwdXQuZGF0YVswXS5yZWdpb24pLnRvQmUoJ3NmbzEnKTtcbiAgfSk7XG5cbiAgaXQoJ3RyZWF0cyBhIHJlamVjdGluZyBhc3luYyBkZXNjcmliZVJ1biBhcyBjb250cmlidXRpbmcgbm8gZmllbGRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJ1biA9IHtcbiAgICAgIHJ1bklkOiAnd3J1bl80MUtYMjA2QlRLMTBNMEMzMUNNTjJBUzFKUycsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIGRlcGxveW1lbnRJZDogJ2RlcC0xJyxcbiAgICAgIHdvcmtmbG93TmFtZTogJ3dvcmtmbG93Ly8uL3NyYy93b3JrZmxvd3MvdGVzdC8vbXlXb3JrZmxvdycsXG4gICAgICBzcGVjVmVyc2lvbjogMixcbiAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMC4wMDBaJyksXG4gICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCcyMDI2LTA2LTMwVDAwOjAwOjAwLjAwMFonKSxcbiAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoJzIwMjYtMDYtMzBUMDA6MDA6MDEuMDAwWicpLFxuICAgICAgY29tcGxldGVkQXQ6IG51bGwsXG4gICAgICBlcnJvckNvZGU6IG51bGwsXG4gICAgICB3b3JrZmxvd0NvcmVWZXJzaW9uOiBudWxsLFxuICAgICAgd29ya2Zsb3dFbmNyeXB0aW9uRW5hYmxlZDogZmFsc2UsXG4gICAgfSBzYXRpc2ZpZXMgQW5hbHl0aWNzUnVuO1xuICAgIGNvbnN0IHdvcmxkID0ge1xuICAgICAgZGVzY3JpYmVSdW46IHZpLmZuKCkubW9ja1JlamVjdGVkVmFsdWUobmV3IEVycm9yKCdhc3luYyBidWdneSB3b3JsZCcpKSxcbiAgICAgIGFuYWx5dGljczoge1xuICAgICAgICBydW5zOiB7XG4gICAgICAgICAgbGlzdDogdmkuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICAgICAgICBkYXRhOiBbcnVuXSxcbiAgICAgICAgICAgIGN1cnNvcjogbnVsbCxcbiAgICAgICAgICAgIGhhc01vcmU6IGZhbHNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9IGFzIHVua25vd24gYXMgV29ybGQ7XG4gICAgY29uc3Qgd3JpdGUgPSB2aVxuICAgICAgLnNweU9uKHByb2Nlc3Muc3Rkb3V0LCAnd3JpdGUnKVxuICAgICAgLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB0cnVlKTtcblxuICAgIGF3YWl0IGxpc3RSdW5zKHdvcmxkLCB7IGpzb246IHRydWUgfSk7XG5cbiAgICBjb25zdCBvdXRwdXQgPSBKU09OLnBhcnNlKFN0cmluZyh3cml0ZS5tb2NrLmNhbGxzWzBdWzBdKSk7XG4gICAgZXhwZWN0KG91dHB1dC5kYXRhWzBdLnN0YXR1cykudG9CZSgncnVubmluZycpO1xuICAgIGV4cGVjdCgncmVnaW9uJyBpbiBvdXRwdXQuZGF0YVswXSkudG9CZShmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdhZGRzIG5vIHdvcmxkIGZpZWxkcyB3aGVuIHRoZSB3b3JsZCBsYWNrcyBkZXNjcmliZVJ1bicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBydW4gPSB7XG4gICAgICBydW5JZDogJ3dydW5fMDFLWDJNNU4zUkJOQzEyUllXWVlINFdXUUonLFxuICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICBkZXBsb3ltZW50SWQ6ICdkZXAtMScsXG4gICAgICB3b3JrZmxvd05hbWU6ICd3b3JrZmxvdy8vLi9zcmMvd29ya2Zsb3dzL3Rlc3QvL215V29ya2Zsb3cnLFxuICAgICAgc3BlY1ZlcnNpb246IDIsXG4gICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoJzIwMjYtMDYtMzBUMDA6MDA6MDAuMDAwWicpLFxuICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMC4wMDBaJyksXG4gICAgICBzdGFydGVkQXQ6IG5ldyBEYXRlKCcyMDI2LTA2LTMwVDAwOjAwOjAxLjAwMFonKSxcbiAgICAgIGNvbXBsZXRlZEF0OiBudWxsLFxuICAgICAgZXJyb3JDb2RlOiBudWxsLFxuICAgICAgd29ya2Zsb3dDb3JlVmVyc2lvbjogbnVsbCxcbiAgICAgIHdvcmtmbG93RW5jcnlwdGlvbkVuYWJsZWQ6IGZhbHNlLFxuICAgIH0gc2F0aXNmaWVzIEFuYWx5dGljc1J1bjtcbiAgICBjb25zdCB3b3JsZCA9IHtcbiAgICAgIGFuYWx5dGljczoge1xuICAgICAgICBydW5zOiB7XG4gICAgICAgICAgbGlzdDogdmkuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICAgICAgICBkYXRhOiBbcnVuXSxcbiAgICAgICAgICAgIGN1cnNvcjogbnVsbCxcbiAgICAgICAgICAgIGhhc01vcmU6IGZhbHNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9IGFzIHVua25vd24gYXMgV29ybGQ7XG4gICAgY29uc3Qgd3JpdGUgPSB2aVxuICAgICAgLnNweU9uKHByb2Nlc3Muc3Rkb3V0LCAnd3JpdGUnKVxuICAgICAgLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB0cnVlKTtcblxuICAgIGF3YWl0IGxpc3RSdW5zKHdvcmxkLCB7IGpzb246IHRydWUgfSk7XG5cbiAgICBjb25zdCBvdXRwdXQgPSBKU09OLnBhcnNlKFN0cmluZyh3cml0ZS5tb2NrLmNhbGxzWzBdWzBdKSk7XG4gICAgZXhwZWN0KCdyZWdpb24nIGluIG91dHB1dC5kYXRhWzBdKS50b0JlKGZhbHNlKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2xpc3RTdGVwcycsICgpID0+IHtcbiAgaXQoJ3Bhc3NlcyBjdXJzb3JzIGFuZCBwcmVzZXJ2ZXMgdGhlIEpTT04gYXJyYXkgb3V0cHV0JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHN0ZXAgPSB7XG4gICAgICBydW5JZDogJ3J1bi0xJyxcbiAgICAgIHN0ZXBJZDogJ3N0ZXAtMScsXG4gICAgICBzdGVwTmFtZTogJ2RvV29yaycsXG4gICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgYXR0ZW1wdDogMSxcbiAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoJzIwMjYtMDYtMzBUMDA6MDA6MDAuMDAwWicpLFxuICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMi4wMDBaJyksXG4gICAgICBzdGFydGVkQXQ6IG5ldyBEYXRlKCcyMDI2LTA2LTMwVDAwOjAwOjAxLjAwMFonKSxcbiAgICAgIGNvbXBsZXRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMi4wMDBaJyksXG4gICAgICByZXRyeUFmdGVyOiBudWxsLFxuICAgICAgZXJyb3JDb2RlOiBudWxsLFxuICAgICAgd29ya2Zsb3dDb3JlVmVyc2lvbjogbnVsbCxcbiAgICAgIHdvcmtmbG93RW5jcnlwdGlvbkVuYWJsZWQ6IGZhbHNlLFxuICAgIH0gc2F0aXNmaWVzIEFuYWx5dGljc1N0ZXA7XG4gICAgY29uc3Qgd29ybGQgPSB7XG4gICAgICBhbmFseXRpY3M6IHtcbiAgICAgICAgc3RlcHM6IHtcbiAgICAgICAgICBsaXN0OiB2aS5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgICAgICAgIGRhdGE6IFtzdGVwXSxcbiAgICAgICAgICAgIGN1cnNvcjogJ25leHQtc3RlcC1jdXJzb3InLFxuICAgICAgICAgICAgaGFzTW9yZTogdHJ1ZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSBhcyB1bmtub3duIGFzIFdvcmxkO1xuICAgIGNvbnN0IHdyaXRlID0gdmlcbiAgICAgIC5zcHlPbihwcm9jZXNzLnN0ZG91dCwgJ3dyaXRlJylcbiAgICAgIC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gdHJ1ZSk7XG5cbiAgICBhd2FpdCBsaXN0U3RlcHMod29ybGQsIHtcbiAgICAgIGpzb246IHRydWUsXG4gICAgICBydW5JZDogJ3J1bi0xJyxcbiAgICAgIGN1cnNvcjogJ3N0ZXAtY3Vyc29yJyxcbiAgICAgIGxpbWl0OiAxLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHdvcmxkLmFuYWx5dGljcz8uc3RlcHMubGlzdCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgcnVuSWQ6ICdydW4tMScsXG4gICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgIHNvcnRPcmRlcjogJ2Rlc2MnLFxuICAgICAgICBjdXJzb3I6ICdzdGVwLWN1cnNvcicsXG4gICAgICAgIGxpbWl0OiAxLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBleHBlY3QoSlNPTi5wYXJzZShTdHJpbmcod3JpdGUubW9jay5jYWxsc1swXVswXSkpKS50b0VxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgLi4uc3RlcCxcbiAgICAgICAgY3JlYXRlZEF0OiAnMjAyNi0wNi0zMFQwMDowMDowMC4wMDBaJyxcbiAgICAgICAgdXBkYXRlZEF0OiAnMjAyNi0wNi0zMFQwMDowMDowMi4wMDBaJyxcbiAgICAgICAgc3RhcnRlZEF0OiAnMjAyNi0wNi0zMFQwMDowMDowMS4wMDBaJyxcbiAgICAgICAgY29tcGxldGVkQXQ6ICcyMDI2LTA2LTMwVDAwOjAwOjAyLjAwMFonLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoJ2ZhbGxzIGJhY2sgdG8gc3RvcmFnZSB3aGVuIHRoZSBmaXJzdCBhbmFseXRpY3MgcGFnZSBpcyBlbXB0eScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzdGVwID0ge1xuICAgICAgcnVuSWQ6ICdydW4tMScsXG4gICAgICBzdGVwSWQ6ICdzdGVwLTEnLFxuICAgICAgc3RlcE5hbWU6ICdzdGVwLy8uL3NyYy93b3JrZmxvd3MvdGVzdC8vZG9Xb3JrJyxcbiAgICAgIHN0YXR1czogJ2NvbXBsZXRlZCcsXG4gICAgICBhdHRlbXB0OiAxLFxuICAgICAgaW5wdXQ6IHVuZGVmaW5lZCxcbiAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMC4wMDBaJyksXG4gICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCcyMDI2LTA2LTMwVDAwOjAwOjAyLjAwMFonKSxcbiAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoJzIwMjYtMDYtMzBUMDA6MDA6MDEuMDAwWicpLFxuICAgICAgY29tcGxldGVkQXQ6IG5ldyBEYXRlKCcyMDI2LTA2LTMwVDAwOjAwOjAyLjAwMFonKSxcbiAgICB9IHNhdGlzZmllcyBTdGVwO1xuICAgIGNvbnN0IHdvcmxkID0ge1xuICAgICAgYW5hbHl0aWNzOiB7XG4gICAgICAgIHN0ZXBzOiB7XG4gICAgICAgICAgbGlzdDogdmkuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICAgICAgICBkYXRhOiBbXSxcbiAgICAgICAgICAgIGN1cnNvcjogbnVsbCxcbiAgICAgICAgICAgIGhhc01vcmU6IGZhbHNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHN0ZXBzOiB7XG4gICAgICAgIGxpc3Q6IHZpLmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgICAgIGRhdGE6IFtzdGVwXSxcbiAgICAgICAgICBjdXJzb3I6IG51bGwsXG4gICAgICAgICAgaGFzTW9yZTogZmFsc2UsXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9IGFzIHVua25vd24gYXMgV29ybGQ7XG4gICAgY29uc3Qgd3JpdGUgPSB2aVxuICAgICAgLnNweU9uKHByb2Nlc3Muc3Rkb3V0LCAnd3JpdGUnKVxuICAgICAgLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB0cnVlKTtcblxuICAgIGF3YWl0IGxpc3RTdGVwcyh3b3JsZCwgeyBqc29uOiB0cnVlLCBydW5JZDogJ3J1bi0xJyB9KTtcblxuICAgIGV4cGVjdCh3b3JsZC5hbmFseXRpY3M/LnN0ZXBzLmxpc3QpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICBleHBlY3Qod29ybGQuc3RlcHMubGlzdCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgcnVuSWQ6ICdydW4tMScsXG4gICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgIHNvcnRPcmRlcjogJ2Rlc2MnLFxuICAgICAgICBjdXJzb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgbGltaXQ6IDIwLFxuICAgICAgfSxcbiAgICAgIHJlc29sdmVEYXRhOiAnbm9uZScsXG4gICAgfSk7XG4gICAgZXhwZWN0KEpTT04ucGFyc2UoU3RyaW5nKHdyaXRlLm1vY2suY2FsbHNbMF1bMF0pKSkudG9FcXVhbChbXG4gICAgICB7XG4gICAgICAgIC4uLnN0ZXAsXG4gICAgICAgIGNyZWF0ZWRBdDogJzIwMjYtMDYtMzBUMDA6MDA6MDAuMDAwWicsXG4gICAgICAgIHVwZGF0ZWRBdDogJzIwMjYtMDYtMzBUMDA6MDA6MDIuMDAwWicsXG4gICAgICAgIHN0YXJ0ZWRBdDogJzIwMjYtMDYtMzBUMDA6MDA6MDEuMDAwWicsXG4gICAgICAgIGNvbXBsZXRlZEF0OiAnMjAyNi0wNi0zMFQwMDowMDowMi4wMDBaJyxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdsaXN0RXZlbnRzJywgKCkgPT4ge1xuICBpdCgncGFzc2VzIGN1cnNvcnMgYW5kIHByZXNlcnZlcyB0aGUgSlNPTiBhcnJheSBvdXRwdXQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICBydW5JZDogJ3J1bi0xJyxcbiAgICAgIGV2ZW50SWQ6ICdldmVudC0xJyxcbiAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfY29tcGxldGVkJyxcbiAgICAgIGNvcnJlbGF0aW9uSWQ6ICdzdGVwLTEnLFxuICAgICAgZW50aXR5SWQ6ICdzdGVwLTEnLFxuICAgICAgc3RlcE5hbWU6ICdkb1dvcmsnLFxuICAgICAgd29ya2Zsb3dOYW1lOiAnd29ya2Zsb3cvLy4vc3JjL3dvcmtmbG93cy90ZXN0Ly9teVdvcmtmbG93JyxcbiAgICAgIGRlcGxveW1lbnRJZDogJ2RlcC0xJyxcbiAgICAgIHNwZWNWZXJzaW9uOiAyLFxuICAgICAgcnVuQ3JlYXRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMC4wMDBaJyksXG4gICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCcyMDI2LTA2LTMwVDAwOjAwOjAyLjAwMFonKSxcbiAgICAgIHJlZ2lvbjogbnVsbCxcbiAgICAgIHZlcmNlbElkOiBudWxsLFxuICAgICAgcmVxdWVzdElkOiBudWxsLFxuICAgICAgcmVzdW1lQXQ6IG51bGwsXG4gICAgICByZXRyeUFmdGVyOiBudWxsLFxuICAgICAgZXJyb3JDb2RlOiBudWxsLFxuICAgICAgd29ya2Zsb3dDb3JlVmVyc2lvbjogbnVsbCxcbiAgICAgIGlzV2ViaG9vazogZmFsc2UsXG4gICAgICBpc1N5c3RlbTogZmFsc2UsXG4gICAgICB3b3JrZmxvd0VuY3J5cHRpb25FbmFibGVkOiBmYWxzZSxcbiAgICB9IHNhdGlzZmllcyBBbmFseXRpY3NFdmVudDtcbiAgICBjb25zdCB3b3JsZCA9IHtcbiAgICAgIGFuYWx5dGljczoge1xuICAgICAgICBldmVudHM6IHtcbiAgICAgICAgICBsaXN0OiB2aS5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgICAgICAgIGRhdGE6IFtldmVudF0sXG4gICAgICAgICAgICBjdXJzb3I6ICduZXh0LWV2ZW50LWN1cnNvcicsXG4gICAgICAgICAgICBoYXNNb3JlOiB0cnVlLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9IGFzIHVua25vd24gYXMgV29ybGQ7XG4gICAgY29uc3Qgd3JpdGUgPSB2aVxuICAgICAgLnNweU9uKHByb2Nlc3Muc3Rkb3V0LCAnd3JpdGUnKVxuICAgICAgLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB0cnVlKTtcblxuICAgIGF3YWl0IGxpc3RFdmVudHMod29ybGQsIHtcbiAgICAgIGpzb246IHRydWUsXG4gICAgICBydW5JZDogJ3J1bi0xJyxcbiAgICAgIGN1cnNvcjogJ2V2ZW50LWN1cnNvcicsXG4gICAgICBsaW1pdDogMSxcbiAgICB9KTtcblxuICAgIGV4cGVjdCh3b3JsZC5hbmFseXRpY3M/LmV2ZW50cy5saXN0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh7XG4gICAgICBydW5JZDogJ3J1bi0xJyxcbiAgICAgIGNvcnJlbGF0aW9uSWQ6IHVuZGVmaW5lZCxcbiAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgc29ydE9yZGVyOiAnZGVzYycsXG4gICAgICAgIGN1cnNvcjogJ2V2ZW50LWN1cnNvcicsXG4gICAgICAgIGxpbWl0OiAxLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBleHBlY3QoSlNPTi5wYXJzZShTdHJpbmcod3JpdGUubW9jay5jYWxsc1swXVswXSkpKS50b0VxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgLi4uZXZlbnQsXG4gICAgICAgIHJ1bkNyZWF0ZWRBdDogJzIwMjYtMDYtMzBUMDA6MDA6MDAuMDAwWicsXG4gICAgICAgIGNyZWF0ZWRBdDogJzIwMjYtMDYtMzBUMDA6MDA6MDIuMDAwWicsXG4gICAgICB9LFxuICAgIF0pO1xuICB9KTtcblxuICBpdCgnZmFsbHMgYmFjayB0byBzdG9yYWdlIHdoZW4gdGhlIGZpcnN0IGFuYWx5dGljcyBwYWdlIGlzIGVtcHR5JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgcnVuSWQ6ICdydW4tMScsXG4gICAgICBldmVudElkOiAnZXZlbnQtMScsXG4gICAgICBldmVudFR5cGU6ICdzdGVwX2NvbXBsZXRlZCcsXG4gICAgICBjb3JyZWxhdGlvbklkOiAnc3RlcC0xJyxcbiAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICBzdGVwTmFtZTogJ2RvV29yaycsXG4gICAgICAgIHJlc3VsdDogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoJzIwMjYtMDYtMzBUMDA6MDA6MDIuMDAwWicpLFxuICAgIH0gYXMgdW5rbm93biBhcyBFdmVudDtcbiAgICBjb25zdCB3b3JsZCA9IHtcbiAgICAgIGFuYWx5dGljczoge1xuICAgICAgICBldmVudHM6IHtcbiAgICAgICAgICBsaXN0OiB2aS5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgICAgICAgIGRhdGE6IFtdLFxuICAgICAgICAgICAgY3Vyc29yOiBudWxsLFxuICAgICAgICAgICAgaGFzTW9yZTogZmFsc2UsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZXZlbnRzOiB7XG4gICAgICAgIGxpc3Q6IHZpLmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgICAgIGRhdGE6IFtldmVudF0sXG4gICAgICAgICAgY3Vyc29yOiBudWxsLFxuICAgICAgICAgIGhhc01vcmU6IGZhbHNlLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSBhcyB1bmtub3duIGFzIFdvcmxkO1xuICAgIGNvbnN0IHdyaXRlID0gdmlcbiAgICAgIC5zcHlPbihwcm9jZXNzLnN0ZG91dCwgJ3dyaXRlJylcbiAgICAgIC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gdHJ1ZSk7XG5cbiAgICBhd2FpdCBsaXN0RXZlbnRzKHdvcmxkLCB7IGpzb246IHRydWUsIHJ1bklkOiAncnVuLTEnIH0pO1xuXG4gICAgZXhwZWN0KHdvcmxkLmFuYWx5dGljcz8uZXZlbnRzLmxpc3QpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICBleHBlY3Qod29ybGQuZXZlbnRzLmxpc3QpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICAgIHJ1bklkOiAncnVuLTEnLFxuICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICBzb3J0T3JkZXI6ICdkZXNjJyxcbiAgICAgICAgY3Vyc29yOiB1bmRlZmluZWQsXG4gICAgICAgIGxpbWl0OiAyMCxcbiAgICAgIH0sXG4gICAgICByZXNvbHZlRGF0YTogJ25vbmUnLFxuICAgIH0pO1xuICAgIGV4cGVjdChKU09OLnBhcnNlKFN0cmluZyh3cml0ZS5tb2NrLmNhbGxzWzBdWzBdKSkpLnRvRXF1YWwoW1xuICAgICAge1xuICAgICAgICAuLi5ldmVudCxcbiAgICAgICAgY3JlYXRlZEF0OiAnMjAyNi0wNi0zMFQwMDowMDowMi4wMDBaJyxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdsaXN0U2xlZXBzJywgKCkgPT4ge1xuICBjb25zdCB3YWl0ID0ge1xuICAgIHJ1bklkOiAncnVuLTEnLFxuICAgIHdhaXRJZDogJ3dhaXQtMScsXG4gICAgc3RhdHVzOiAnd2FpdGluZycsXG4gICAgcmVzdW1lQXQ6IG5ldyBEYXRlKCcyMDI2LTA2LTMwVDAwOjAxOjAwLjAwMFonKSxcbiAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCcyMDI2LTA2LTMwVDAwOjAwOjAwLjAwMFonKSxcbiAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCcyMDI2LTA2LTMwVDAwOjAwOjAwLjAwMFonKSxcbiAgICBjb21wbGV0ZWRBdDogbnVsbCxcbiAgICB3b3JrZmxvd0NvcmVWZXJzaW9uOiBudWxsLFxuICAgIHdvcmtmbG93RW5jcnlwdGlvbkVuYWJsZWQ6IGZhbHNlLFxuICB9IHNhdGlzZmllcyBBbmFseXRpY3NXYWl0O1xuICBjb25zdCBwYWdlSW5mbyA9IHtcbiAgICBjdXJyZW50TG9va2JhY2tEYXlzOiAyLFxuICAgIG1heExvb2tiYWNrRGF5czogMzAsXG4gICAgY3VycmVudFdpbmRvd1N0YXJ0OiBuZXcgRGF0ZSgnMjAyNi0wNi0yOFQwMDowMDowMC4wMDBaJyksXG4gICAgbWF4V2luZG93U3RhcnQ6IG5ldyBEYXRlKCcyMDI2LTA2LTAxVDAwOjAwOjAwLjAwMFonKSxcbiAgICB1cGdyYWRlQXZhaWxhYmxlOiB0cnVlLFxuICB9O1xuXG4gIGl0KCdwYXNzZXMgY3Vyc29ycyBhbmQgcHJlc2VydmVzIHRoZSBKU09OIGFycmF5IG91dHB1dCB0aHJvdWdoIGFuYWx5dGljcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB3b3JsZCA9IHtcbiAgICAgIGFuYWx5dGljczoge1xuICAgICAgICB3YWl0czoge1xuICAgICAgICAgIGxpc3Q6IHZpLmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgICAgICAgZGF0YTogW3dhaXRdLFxuICAgICAgICAgICAgY3Vyc29yOiAnbmV4dC13YWl0LWN1cnNvcicsXG4gICAgICAgICAgICBoYXNNb3JlOiB0cnVlLFxuICAgICAgICAgICAgcGFnZUluZm8sXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0gYXMgdW5rbm93biBhcyBXb3JsZDtcbiAgICBjb25zdCB3cml0ZSA9IHZpXG4gICAgICAuc3B5T24ocHJvY2Vzcy5zdGRvdXQsICd3cml0ZScpXG4gICAgICAubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHRydWUpO1xuXG4gICAgYXdhaXQgbGlzdFNsZWVwcyh3b3JsZCwge1xuICAgICAganNvbjogdHJ1ZSxcbiAgICAgIHJ1bklkOiAncnVuLTEnLFxuICAgICAgY3Vyc29yOiAnd2FpdC1jdXJzb3InLFxuICAgICAgbGltaXQ6IDEsXG4gICAgfSk7XG5cbiAgICBleHBlY3Qod29ybGQuYW5hbHl0aWNzPy53YWl0cy5saXN0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh7XG4gICAgICBydW5JZDogJ3J1bi0xJyxcbiAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgc29ydE9yZGVyOiAnZGVzYycsXG4gICAgICAgIGN1cnNvcjogJ3dhaXQtY3Vyc29yJyxcbiAgICAgICAgbGltaXQ6IDEsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGV4cGVjdChKU09OLnBhcnNlKFN0cmluZyh3cml0ZS5tb2NrLmNhbGxzWzBdWzBdKSkpLnRvRXF1YWwoW1xuICAgICAge1xuICAgICAgICAuLi53YWl0LFxuICAgICAgICByZXN1bWVBdDogJzIwMjYtMDYtMzBUMDA6MDE6MDAuMDAwWicsXG4gICAgICAgIGNyZWF0ZWRBdDogJzIwMjYtMDYtMzBUMDA6MDA6MDAuMDAwWicsXG4gICAgICAgIHVwZGF0ZWRBdDogJzIwMjYtMDYtMzBUMDA6MDA6MDAuMDAwWicsXG4gICAgICB9LFxuICAgIF0pO1xuICB9KTtcblxuICBpdCgnc3VyZmFjZXMgdGhlIG9ic2VydmFiaWxpdHkgdXBncmFkZSBoaW50IGluIHRhYmxlIG1vZGUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgd29ybGQgPSB7XG4gICAgICBhbmFseXRpY3M6IHtcbiAgICAgICAgd2FpdHM6IHtcbiAgICAgICAgICBsaXN0OiB2aS5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgICAgICAgIGRhdGE6IFt3YWl0XSxcbiAgICAgICAgICAgIGN1cnNvcjogbnVsbCxcbiAgICAgICAgICAgIGhhc01vcmU6IGZhbHNlLFxuICAgICAgICAgICAgcGFnZUluZm8sXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0gYXMgdW5rbm93biBhcyBXb3JsZDtcbiAgICBjb25zdCBsb2cgPSB2aS5zcHlPbihjb25zb2xlLCAnbG9nJykubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHVuZGVmaW5lZCk7XG5cbiAgICBhd2FpdCBsaXN0U2xlZXBzKHdvcmxkLCB7IHJ1bklkOiAncnVuLTEnIH0pO1xuXG4gICAgZXhwZWN0KGxvZy5tb2NrLmNhbGxzLmZsYXQoKS5qb2luKCdcXG4nKSkudG9Db250YWluKFxuICAgICAgJ1VwZ3JhZGUgT2JzZXJ2YWJpbGl0eSBQbHVzJ1xuICAgICk7XG4gIH0pO1xufSk7XG4iXX0=
|