@plumile/backoffice-core 0.1.200 → 0.1.205

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 (43) hide show
  1. package/README.md +3 -1
  2. package/lib/esm/builders.d.ts +11 -5
  3. package/lib/esm/builders.d.ts.map +1 -1
  4. package/lib/esm/builders.js +1 -1
  5. package/lib/esm/config/entity-builders.d.ts +3 -3
  6. package/lib/esm/config/entity-builders.d.ts.map +1 -1
  7. package/lib/esm/config/entity-builders.js +3 -5
  8. package/lib/esm/detailParams.d.ts +8 -2
  9. package/lib/esm/detailParams.d.ts.map +1 -1
  10. package/lib/esm/detailParams.js +3 -3
  11. package/lib/esm/index.d.ts +1 -0
  12. package/lib/esm/index.d.ts.map +1 -1
  13. package/lib/esm/index.js +1 -1
  14. package/lib/esm/resolve.d.ts +2 -1
  15. package/lib/esm/resolve.d.ts.map +1 -1
  16. package/lib/esm/resolve.js +1 -1
  17. package/lib/esm/runtimeErasure.d.ts +2 -0
  18. package/lib/esm/runtimeErasure.d.ts.map +1 -0
  19. package/lib/esm/runtimeErasure.js +2 -0
  20. package/lib/esm/types.d.ts +27 -24
  21. package/lib/esm/types.d.ts.map +1 -1
  22. package/lib/esm/types.js +1 -1
  23. package/lib/tsconfig.esm.tsbuildinfo +1 -1
  24. package/lib/types/builders.d.ts +11 -5
  25. package/lib/types/builders.d.ts.map +1 -1
  26. package/lib/types/config/entity-builders.d.ts +3 -3
  27. package/lib/types/config/entity-builders.d.ts.map +1 -1
  28. package/lib/types/detailParams.d.ts +8 -2
  29. package/lib/types/detailParams.d.ts.map +1 -1
  30. package/lib/types/index.d.ts +1 -0
  31. package/lib/types/index.d.ts.map +1 -1
  32. package/lib/types/resolve.d.ts +2 -1
  33. package/lib/types/resolve.d.ts.map +1 -1
  34. package/lib/types/runtimeErasure.d.ts +2 -0
  35. package/lib/types/runtimeErasure.d.ts.map +1 -0
  36. package/lib/types/types.d.ts +27 -24
  37. package/lib/types/types.d.ts.map +1 -1
  38. package/package.json +3 -3
  39. package/lib/esm/type-tests/operation-bound-config.test-d.d.ts +0 -50
  40. package/lib/esm/type-tests/operation-bound-config.test-d.d.ts.map +0 -1
  41. package/lib/esm/type-tests/operation-bound-config.test-d.js +0 -666
  42. package/lib/types/type-tests/operation-bound-config.test-d.d.ts +0 -50
  43. package/lib/types/type-tests/operation-bound-config.test-d.d.ts.map +0 -1
@@ -1,666 +0,0 @@
1
- import { defineSchema, stringField } from '@plumile/filter-query/schema.js';
2
- import { createListDetailManifest, defineBackofficeConnectionList, defineBackofficeDashboardConfig, defineBackofficeDashboardHrefTarget, defineBackofficeDashboardListTarget, defineBackofficeDashboardQueryWidget, defineBackofficeDashboardStaticWidget, defineBackofficeFormMutationAction, defineBackofficeFilters, defineBackofficeMutationAction, defineBackofficePicker, defineBackofficeRelationFilter, defineBackofficeSorts, datetimeFilter, entityIdFilter, enumFilter, numberFilter, } from '../builders.js';
3
- import { defineBackofficeListNavigation } from '../state/listNavigation.js';
4
- const label = (t) => {
5
- return t('common.label');
6
- };
7
- const testListQuerySchema = defineSchema({
8
- projectId: stringField(['eq']),
9
- kind: stringField(['eq']),
10
- });
11
- const testListNavigation = defineBackofficeListNavigation()({
12
- defaults: { where: null, sort: 'CREATED_AT_DESC' },
13
- filterSchema: {
14
- schema: testListQuerySchema,
15
- toWhere: (filters) => {
16
- const rawKind = filters.kind?.eq;
17
- let kind;
18
- if (rawKind === 'A' || rawKind === 'B') {
19
- kind = rawKind;
20
- }
21
- return {
22
- projectId: filters.projectId?.eq,
23
- kind,
24
- };
25
- },
26
- fromWhere: (where) => {
27
- return {
28
- projectId: { eq: where?.projectId ?? undefined },
29
- kind: { eq: where?.kind ?? undefined },
30
- };
31
- },
32
- },
33
- sortIds: ['CREATED_AT_ASC', 'CREATED_AT_DESC'],
34
- });
35
- testListNavigation.encode({
36
- where: { projectId: 'project-1', kind: 'A' },
37
- sort: 'CREATED_AT_ASC',
38
- });
39
- testListNavigation.encode({
40
- where: { status: 'OPEN' },
41
- });
42
- testListNavigation.decode({
43
- filters: { missing: { eq: 'value' } },
44
- });
45
- const typedListManifest = createListDetailManifest({
46
- id: 'tasks',
47
- routeSegment: 'tasks',
48
- label,
49
- routes: {
50
- list: '/tasks',
51
- detail: (id) => {
52
- return `/tasks/${id}`;
53
- },
54
- detailPage: (id, pageId) => {
55
- return `/tasks/${id}/${pageId}`;
56
- },
57
- },
58
- hasList: true,
59
- listNavigation: testListNavigation,
60
- detailPages: [
61
- {
62
- id: 'overview',
63
- pathSegment: 'overview',
64
- label,
65
- isDefault: true,
66
- },
67
- ],
68
- defaultDetailPageId: 'overview',
69
- facets: {
70
- list: async () => {
71
- throw new Error('type test');
72
- },
73
- detailLayout: async () => {
74
- throw new Error('type test');
75
- },
76
- detailPage: async () => {
77
- throw new Error('type test');
78
- },
79
- },
80
- });
81
- const runtimeListManifest = typedListManifest;
82
- export const runtimeListManifestId = runtimeListManifest.id;
83
- export const typedListState = {
84
- where: { projectId: 'project-1' },
85
- sort: 'CREATED_AT_ASC',
86
- };
87
- export const invalidTypedListState = {
88
- where: { status: 'OPEN' },
89
- };
90
- export const runtimeListState = {
91
- where: { status: 'OPEN' },
92
- sort: 'CREATED_AT_DESC',
93
- };
94
- createListDetailManifest({
95
- id: 'tasks',
96
- routeSegment: 'tasks',
97
- label,
98
- routes: {
99
- list: '/tasks',
100
- detail: (id) => {
101
- return `/tasks/${id}`;
102
- },
103
- detailPage: (id, pageId) => {
104
- return `/tasks/${id}/${pageId}`;
105
- },
106
- },
107
- hasList: true,
108
- detailPages: typedListManifest.detailPages,
109
- defaultDetailPageId: typedListManifest.defaultDetailPageId,
110
- facets: {
111
- list: typedListManifest.facets.list,
112
- detailLayout: async () => {
113
- throw new Error('type test');
114
- },
115
- detailPage: async () => {
116
- throw new Error('type test');
117
- },
118
- },
119
- });
120
- createListDetailManifest({
121
- ...typedListManifest,
122
- listNavigation: { kind: 'list-navigation' },
123
- });
124
- createListDetailManifest({
125
- ...typedListManifest,
126
- detailPages: [],
127
- });
128
- createListDetailManifest({
129
- ...typedListManifest,
130
- facets: {
131
- detailLayout: typedListManifest.facets.detailLayout,
132
- detailPage: typedListManifest.facets.detailPage,
133
- },
134
- });
135
- createListDetailManifest({
136
- ...typedListManifest,
137
- facets: {
138
- list: typedListManifest.facets.list,
139
- detailPage: typedListManifest.facets.detailPage,
140
- },
141
- });
142
- createListDetailManifest({
143
- ...typedListManifest,
144
- facets: {
145
- list: typedListManifest.facets.list,
146
- detailLayout: typedListManifest.facets.detailLayout,
147
- },
148
- });
149
- defineBackofficeFormMutationAction()({
150
- id: 'create-organization',
151
- kind: 'formMutation',
152
- label,
153
- mutation: {},
154
- fields: [],
155
- getVariables: (_node, values) => {
156
- return {
157
- input: {
158
- name: values.name,
159
- currency: values.currency,
160
- },
161
- };
162
- },
163
- toasts: {
164
- success: {
165
- title: label,
166
- view: {
167
- entityId: 'organizations',
168
- getTargetId: (response) => {
169
- return response.createOrganization.organization?.id ?? null;
170
- },
171
- },
172
- },
173
- },
174
- });
175
- defineBackofficeFormMutationAction()({
176
- id: 'missing-currency',
177
- kind: 'formMutation',
178
- label,
179
- mutation: {},
180
- fields: [],
181
- getVariables: (_node, values) => {
182
- return {
183
- input: {
184
- name: values.name,
185
- },
186
- };
187
- },
188
- });
189
- defineBackofficeFormMutationAction()({
190
- id: 'invalid-currency',
191
- kind: 'formMutation',
192
- label,
193
- mutation: {},
194
- fields: [],
195
- getVariables: (_node, values) => {
196
- return {
197
- input: {
198
- name: values.name,
199
- currency: values.currency,
200
- },
201
- };
202
- },
203
- });
204
- defineBackofficeMutationAction()({
205
- id: 'archive',
206
- kind: 'mutation',
207
- label,
208
- mutation: {},
209
- getVariables: (node) => {
210
- return {
211
- id: node.id,
212
- };
213
- },
214
- });
215
- defineBackofficeMutationAction()({
216
- id: 'archive-missing-id',
217
- kind: 'mutation',
218
- label,
219
- mutation: {},
220
- getVariables: () => {
221
- return {};
222
- },
223
- });
224
- export const responsiveMeta = {
225
- id: 'state',
226
- label,
227
- value: 'ready',
228
- };
229
- export const invalidResponsiveMeta = {
230
- id: 'state',
231
- label: 'State',
232
- value: 'ready',
233
- };
234
- export const titleMeta = {
235
- id: 'state',
236
- label,
237
- value: 'ready',
238
- };
239
- export const invalidTitleMeta = {
240
- id: 'state',
241
- label: 'State',
242
- value: 'ready',
243
- };
244
- const filters = defineBackofficeFilters()([
245
- entityIdFilter('projectId', {
246
- entity: 'projects',
247
- label,
248
- }),
249
- enumFilter('kind', {
250
- label,
251
- options: ['A', 'B'],
252
- }),
253
- numberFilter('attempt', {
254
- label,
255
- }),
256
- datetimeFilter('createdFrom', {
257
- label,
258
- mode: 'from',
259
- }),
260
- ]);
261
- defineBackofficeSorts()([{ id: 'CREATED_AT_DESC', label }]);
262
- defineBackofficeConnectionList()({
263
- title: label,
264
- query: {},
265
- fragment: {},
266
- count: {
267
- query: {},
268
- buildVariables: ({ where }) => {
269
- return { where };
270
- },
271
- getCount: (data) => {
272
- return data.rowsCount;
273
- },
274
- },
275
- filters,
276
- sorts: defineBackofficeSorts()([
277
- { id: 'CREATED_AT_ASC', label },
278
- ]),
279
- defaultState: {
280
- where: { projectId: 'project-1' },
281
- sort: 'CREATED_AT_DESC',
282
- },
283
- getConnection: () => {
284
- return { edges: [] };
285
- },
286
- toRow: (row) => {
287
- return row;
288
- },
289
- getRowId: () => {
290
- return 'row';
291
- },
292
- columns: [],
293
- });
294
- defineBackofficePicker()({
295
- query: {},
296
- fragment: {},
297
- getConnection: () => {
298
- return { edges: [] };
299
- },
300
- toRow: () => {
301
- return { id: 'row', title: 'Row' };
302
- },
303
- getRowId: (row) => {
304
- return row.id;
305
- },
306
- buildQueryVariables: ({ scope }) => {
307
- return {
308
- where: {
309
- organizationId: scope?.organizationId,
310
- },
311
- count: 20,
312
- cursor: null,
313
- };
314
- },
315
- });
316
- defineBackofficeDashboardConfig({
317
- title: label,
318
- widgets: [
319
- defineBackofficeDashboardQueryWidget()({
320
- id: 'users',
321
- kind: 'metricGroup',
322
- query: {},
323
- variables: {},
324
- resolve: (data) => {
325
- return [
326
- {
327
- id: 'users',
328
- label,
329
- value: data.users.totalCount,
330
- target: defineBackofficeDashboardListTarget()({
331
- entityId: 'tasks',
332
- state: {
333
- where: { kind: 'A' },
334
- sort: 'CREATED_AT_DESC',
335
- },
336
- }),
337
- },
338
- ];
339
- },
340
- }),
341
- defineBackofficeDashboardStaticWidget({
342
- id: 'window',
343
- kind: 'windowControl',
344
- title: label,
345
- }),
346
- defineBackofficeDashboardQueryWidget()({
347
- id: 'throughput',
348
- kind: 'trendMetric',
349
- query: {},
350
- variables: ({ window }) => {
351
- return {
352
- from: window.from,
353
- to: window.to,
354
- severity: 'A',
355
- };
356
- },
357
- resolve: (data) => {
358
- return {
359
- label,
360
- value: data.throughputCount,
361
- delta: {
362
- value: 12,
363
- direction: 'up',
364
- tone: 'success',
365
- label,
366
- },
367
- sparkline: [{ x: '2026-01-01T00:00:00.000Z', y: 1 }],
368
- target: defineBackofficeDashboardListTarget()({
369
- entityId: 'tasks',
370
- state: {
371
- where: { kind: 'A' },
372
- sort: 'CREATED_AT_DESC',
373
- },
374
- }),
375
- };
376
- },
377
- }),
378
- defineBackofficeDashboardQueryWidget()({
379
- id: 'failure-rate',
380
- kind: 'slaGauge',
381
- query: {},
382
- variables: ({ window }) => {
383
- return { from: window.from, to: window.to };
384
- },
385
- resolve: (data) => {
386
- return {
387
- label,
388
- value: data.failureRate,
389
- max: 1,
390
- threshold: 0.05,
391
- unit: '%',
392
- tone: 'warning',
393
- };
394
- },
395
- }),
396
- defineBackofficeDashboardQueryWidget()({
397
- id: 'top-failures',
398
- kind: 'breakdownList',
399
- query: {},
400
- variables: ({ window }) => {
401
- return { from: window.from, to: window.to };
402
- },
403
- resolve: (data) => {
404
- return data.topFailures.map((failure) => {
405
- return {
406
- id: failure.id,
407
- label: () => {
408
- return failure.label;
409
- },
410
- value: failure.count,
411
- tone: 'danger',
412
- };
413
- });
414
- },
415
- }),
416
- defineBackofficeDashboardQueryWidget()({
417
- id: 'timeline',
418
- kind: 'timelineChart',
419
- query: {},
420
- variables: ({ window }) => {
421
- return { from: window.from, to: window.to };
422
- },
423
- ariaLabel: label,
424
- chart: 'bar',
425
- resolve: (data) => {
426
- return {
427
- series: [
428
- {
429
- id: 'throughput',
430
- label,
431
- color: '#2563eb',
432
- data: data.buckets.map((bucket) => {
433
- return {
434
- x: bucket.bucket,
435
- y: bucket.count,
436
- };
437
- }),
438
- },
439
- ],
440
- };
441
- },
442
- }),
443
- defineBackofficeDashboardQueryWidget()({
444
- id: 'risk-queue',
445
- kind: 'riskQueue',
446
- query: {},
447
- variables: ({ window }) => {
448
- return { from: window.from, to: window.to };
449
- },
450
- resolve: () => {
451
- return [
452
- {
453
- id: 'dead-outbox',
454
- label,
455
- severity: 'danger',
456
- value: 4,
457
- },
458
- ];
459
- },
460
- }),
461
- defineBackofficeDashboardQueryWidget()({
462
- id: 'spotlight',
463
- kind: 'entitySpotlight',
464
- query: {},
465
- variables: ({ window }) => {
466
- return { from: window.from, to: window.to };
467
- },
468
- resolve: () => {
469
- return {
470
- label,
471
- title: label,
472
- tone: 'info',
473
- meta: [{ id: 'age', label, value: '45 min' }],
474
- };
475
- },
476
- }),
477
- defineBackofficeDashboardQueryWidget()({
478
- id: 'health',
479
- kind: 'healthMatrix',
480
- query: {},
481
- variables: ({ window }) => {
482
- return { from: window.from, to: window.to };
483
- },
484
- resolve: () => {
485
- return [
486
- {
487
- id: 'work',
488
- label,
489
- cells: [
490
- {
491
- id: 'tasks',
492
- label,
493
- value: 2,
494
- tone: 'warning',
495
- },
496
- ],
497
- },
498
- ];
499
- },
500
- }),
501
- defineBackofficeDashboardStaticWidget({
502
- id: 'actions',
503
- kind: 'quickActions',
504
- actions: [
505
- {
506
- id: 'users',
507
- label,
508
- target: defineBackofficeDashboardHrefTarget('/users'),
509
- },
510
- ],
511
- }),
512
- ],
513
- });
514
- defineBackofficeDashboardQueryWidget()({
515
- id: 'invalid-users',
516
- kind: 'metricGroup',
517
- query: {},
518
- variables: {},
519
- resolve: (data) => {
520
- return [
521
- {
522
- id: 'users',
523
- label,
524
- value: data.projects.totalCount,
525
- },
526
- ];
527
- },
528
- });
529
- defineBackofficeDashboardQueryWidget()({
530
- id: 'invalid-window-variables',
531
- kind: 'trendMetric',
532
- query: {},
533
- variables: ({ window }) => {
534
- return {
535
- from: window.from,
536
- };
537
- },
538
- resolve: (data) => {
539
- return {
540
- label,
541
- value: data.throughputCount,
542
- };
543
- },
544
- });
545
- defineBackofficeDashboardListTarget()({
546
- entityId: 'tasks',
547
- state: {
548
- where: { organizationId: 'org-1' },
549
- },
550
- });
551
- defineBackofficeDashboardListTarget()({
552
- entityId: 'tasks',
553
- state: {
554
- sort: 'UPDATED_AT_DESC',
555
- },
556
- });
557
- export const invalidDashboardConfig = {
558
- title: label,
559
- query: {},
560
- widgets: [],
561
- };
562
- defineBackofficeDashboardQueryWidget()({
563
- id: 'missing-query',
564
- kind: 'metricGroup',
565
- variables: {},
566
- resolve: (data) => {
567
- return [
568
- {
569
- id: 'users',
570
- label,
571
- value: data.users.totalCount,
572
- },
573
- ];
574
- },
575
- });
576
- defineBackofficeRelationFilter()({
577
- target: 'projects',
578
- whereKey: 'projectId',
579
- });
580
- defineBackofficeRelationFilter()({
581
- target: 'projects',
582
- whereKey: 'organizationId',
583
- });
584
- defineBackofficeFilters()([
585
- entityIdFilter('missingField', {
586
- entity: 'projects',
587
- label,
588
- }),
589
- ]);
590
- defineBackofficeFilters()([
591
- enumFilter('kind', {
592
- label,
593
- options: [
594
- 'A',
595
- 'C',
596
- ],
597
- }),
598
- ]);
599
- defineBackofficeFilters()([
600
- numberFilter('kind', {
601
- label,
602
- }),
603
- ]);
604
- defineBackofficeFilters()([
605
- datetimeFilter('attempt', {
606
- label,
607
- }),
608
- ]);
609
- defineBackofficeSorts()([
610
- { id: 'UPDATED_AT_DESC', label },
611
- ]);
612
- defineBackofficeConnectionList()({
613
- title: label,
614
- query: {},
615
- fragment: {},
616
- count: {
617
- query: {},
618
- buildVariables: ({ where }) => {
619
- return { where };
620
- },
621
- getCount: (data) => {
622
- return data.rowsCount;
623
- },
624
- },
625
- filters,
626
- sorts: defineBackofficeSorts()([
627
- { id: 'CREATED_AT_ASC', label },
628
- ]),
629
- defaultState: {
630
- where: { organizationId: 'org-1' },
631
- sort: 'CREATED_AT_ASC',
632
- },
633
- getConnection: () => {
634
- return { edges: [] };
635
- },
636
- toRow: (row) => {
637
- return row;
638
- },
639
- getRowId: () => {
640
- return 'row';
641
- },
642
- columns: [],
643
- });
644
- defineBackofficePicker()({
645
- query: {},
646
- fragment: {},
647
- getConnection: () => {
648
- return { edges: [] };
649
- },
650
- toRow: () => {
651
- return { id: 'row', title: 'Row' };
652
- },
653
- getRowId: (row) => {
654
- return row.id;
655
- },
656
- buildQueryVariables: ({ scope }) => {
657
- return {
658
- where: {
659
- projectId: scope?.projectId,
660
- },
661
- count: 20,
662
- cursor: null,
663
- };
664
- },
665
- });
666
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9uLWJvdW5kLWNvbmZpZy50ZXN0LWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdHlwZS10ZXN0cy9vcGVyYXRpb24tYm91bmQtY29uZmlnLnRlc3QtZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzVFLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsOEJBQThCLEVBQzlCLCtCQUErQixFQUMvQixtQ0FBbUMsRUFDbkMsbUNBQW1DLEVBQ25DLG9DQUFvQyxFQUNwQyxxQ0FBcUMsRUFDckMsa0NBQWtDLEVBQ2xDLHVCQUF1QixFQUN2Qiw4QkFBOEIsRUFDOUIsc0JBQXNCLEVBQ3RCLDhCQUE4QixFQUM5QixxQkFBcUIsRUFDckIsY0FBYyxFQUNkLGNBQWMsRUFDZCxVQUFVLEVBQ1YsWUFBWSxHQUNiLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFxSDVFLE1BQU0sS0FBSyxHQUFjLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDN0IsT0FBTyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDO0FBRUYsTUFBTSxtQkFBbUIsR0FBRyxZQUFZLENBQUM7SUFDdkMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUMxQixDQUFDLENBQUM7QUFFSCxNQUFNLGtCQUFrQixHQUFHLDhCQUE4QixFQUFxQixDQUFDO0lBQzdFLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFO0lBQ2xELFlBQVksRUFBRTtRQUNaLE1BQU0sRUFBRSxtQkFBbUI7UUFDM0IsT0FBTyxFQUFFLENBQUMs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VztJQUNsQixRQUFRLEVBQUUsRUFBVztJQUNyQixhQUFhLEVBQUUsR0FBRyxFQUFFO1FBQ2xCLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7UUFDVixPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUNELFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO1FBQ2hCLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRUQsbUJBQW1CLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7UUFDakMsT0FBTztZQUNMLEtBQUssRUFBRTtnQkFDTCxTQUFTLEVBQUcsS0FBNEMsRUFBRSxTQUFTO2FBQ3BFO1lBQ0QsS0FBSyxFQUFFLEVBQUU7WUFDVCxNQUFNLEVBQUUsSUFBSTtTQUNiLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBPcGVyYXRpb25UeXBlIH0gZnJvbSAncmVsYXktcnVudGltZSc7XG5pbXBvcnQgeyBkZWZpbmVTY2hlbWEsIHN0cmluZ0ZpZWxkIH0gZnJvbSAnQHBsdW1pbGUvZmlsdGVyLXF1ZXJ5L3NjaGVtYS5qcyc7XG5pbXBvcnQge1xuICBjcmVhdGVMaXN0RGV0YWlsTWFuaWZlc3QsXG4gIGRlZmluZUJhY2tvZmZpY2VDb25uZWN0aW9uTGlzdCxcbiAgZGVmaW5lQmFja29mZmljZURhc2hib2FyZENvbmZpZyxcbiAgZGVmaW5lQmFja29mZmljZURhc2hib2FyZEhyZWZUYXJnZXQsXG4gIGRlZmluZUJhY2tvZmZpY2VEYXNoYm9hcmRMaXN0VGFyZ2V0LFxuICBkZWZpbmVCYWNrb2ZmaWNlRGFzaGJvYXJkUXVlcnlXaWRnZXQsXG4gIGRlZmluZUJhY2tvZmZpY2VEYXNoYm9hcmRTdGF0aWNXaWRnZXQsXG4gIGRlZmluZUJhY2tvZmZpY2VGb3JtTXV0YXRpb25BY3Rpb24sXG4gIGRlZmluZUJhY2tvZmZpY2VGaWx0ZXJzLFxuICBkZWZpbmVCYWNrb2ZmaWNlTXV0YXRpb25BY3Rpb24sXG4gIGRlZmluZUJhY2tvZmZpY2VQaWNrZXIsXG4gIGRlZmluZUJhY2tvZmZpY2VSZWxhdGlvbkZpbHRlcixcbiAgZGVmaW5lQmFja29mZmljZVNvcnRzLFxuICBkYXRldGltZUZpbHRlcixcbiAgZW50aXR5SWRGaWx0ZXIsXG4gIGVudW1GaWx0ZXIsXG4gIG51bWJlckZpbHRlcixcbn0gZnJvbSAnLi4vYnVpbGRlcnMuanMnO1xuaW1wb3J0IHsgZGVmaW5lQmFja29mZmljZUxpc3ROYXZpZ2F0aW9uIH0gZnJvbSAnLi4vc3RhdGUvbGlzdE5hdmlnYXRpb24uanMnO1xuaW1wb3J0IHR5cGUge1xuICBCYWNrb2ZmaWNlRGFzaGJvYXJkQ29uZmlnLFxuICBCYWNrb2ZmaWNlRGV0YWlsVGl0bGVNZXRhSXRlbSxcbiAgQmFja29mZmljZUVudGl0eU1hbmlmZXN0SXRlbSxcbiAgQmFja29mZmljZU1hbmlmZXN0TGlzdFN0YXRlSW5wdXQsXG4gIEJhY2tvZmZpY2VMaXN0UmVzcG9uc2l2ZU1ldGFJdGVtLFxuICBCYWNrb2ZmaWNlT3BlcmF0aW9uV2hlcmUsXG4gIEkxOG5MYWJlbCxcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG50eXBlIFRlc3RTb3J0ID0gJ0NSRUFURURfQVRfQVNDJyB8ICdDUkVBVEVEX0FUX0RFU0MnO1xudHlwZSBUZXN0S2luZCA9ICdBJyB8ICdCJztcbnR5cGUgVGVzdEN1cnJlbmN5ID0gJ0VVUicgfCAnVVNEJztcblxuaW50ZXJmYWNlIFRlc3RMaXN0T3BlcmF0aW9uIGV4dGVuZHMgT3BlcmF0aW9uVHlwZSB7XG4gIHZhcmlhYmxlczoge1xuICAgIHdoZXJlPzoge1xuICAgICAgcHJvamVjdElkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICAgIGtpbmQ/OiBUZXN0S2luZCB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgICBhdHRlbXB0PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICAgIGNyZWF0ZWRGcm9tPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICB9IHwgbnVsbDtcbiAgICBzb3J0PzogVGVzdFNvcnQgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIGNvdW50OiBudW1iZXI7XG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgfTtcbiAgcmVzcG9uc2U6IHtcbiAgICByZWFkb25seSByb3dzOiByZWFkb25seSB1bmtub3duW107XG4gIH07XG59XG5cbmludGVyZmFjZSBUZXN0UGlja2VyT3BlcmF0aW9uIGV4dGVuZHMgT3BlcmF0aW9uVHlwZSB7XG4gIHZhcmlhYmxlczoge1xuICAgIHdoZXJlPzoge1xuICAgICAgb3JnYW5pemF0aW9uSWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIH0gfCBudWxsO1xuICAgIGNvdW50OiBudW1iZXI7XG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgfTtcbiAgcmVzcG9uc2U6IHtcbiAgICByZWFkb25seSByb3dzOiByZWFkb25seSB1bmtub3duW107XG4gIH07XG59XG5cbmludGVyZmFjZSBUZXN0Q291bnRPcGVyYXRpb24gZXh0ZW5kcyBPcGVyYXRpb25UeXBlIHtcbiAgdmFyaWFibGVzOiB7XG4gICAgd2hlcmU/OiBCYWNrb2ZmaWNlT3BlcmF0aW9uV2hlcmU8VGVzdExpc3RPcGVyYXRpb24+IHwgbnVsbDtcbiAgfTtcbiAgcmVzcG9uc2U6IHtcbiAgICByZWFkb25seSByb3dzQ291bnQ6IG51bWJlcjtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFRlc3REYXNoYm9hcmRPcGVyYXRpb24gZXh0ZW5kcyBPcGVyYXRpb25UeXBlIHtcbiAgdmFyaWFibGVzOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj47XG4gIHJlc3BvbnNlOiB7XG4gICAgcmVhZG9ubHkgdXNlcnM6IHtcbiAgICAgIHJlYWRvbmx5IHRvdGFsQ291bnQ6IG51bWJlcjtcbiAgICB9O1xuICB9O1xufVxuXG5pbnRlcmZhY2UgVGVzdERhc2hib2FyZFdpbmRvd09wZXJhdGlvbiBleHRlbmRzIE9wZXJhdGlvblR5cGUge1xuICB2YXJpYWJsZXM6IHtcbiAgICBmcm9tOiBzdHJpbmc7XG4gICAgdG86IHN0cmluZztcbiAgICBzZXZlcml0eT86IFRlc3RLaW5kIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgfTtcbiAgcmVzcG9uc2U6IHtcbiAgICByZWFkb25seSB0aHJvdWdocHV0Q291bnQ6IG51bWJlcjtcbiAgICByZWFkb25seSBmYWlsdXJlUmF0ZTogbnVtYmVyO1xuICAgIHJlYWRvbmx5IHRvcEZhaWx1cmVzOiByZWFkb25seSB7XG4gICAgICByZWFkb25seSBpZDogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgbGFiZWw6IHN0cmluZztcbiAgICAgIHJlYWRvbmx5IGNvdW50OiBudW1iZXI7XG4gICAgfVtdO1xuICAgIHJlYWRvbmx5IGJ1Y2tldHM6IHJlYWRvbmx5IHtcbiAgICAgIHJlYWRvbmx5IGJ1Y2tldDogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgY291bnQ6IG51bWJlcjtcbiAgICB9W107XG4gIH07XG59XG5cbmludGVyZmFjZSBUZXN0Q3JlYXRlT3JnYW5pemF0aW9uT3BlcmF0aW9uIGV4dGVuZHMgT3BlcmF0aW9uVHlwZSB7XG4gIHZhcmlhYmxlczoge1xuICAgIGlucHV0OiB7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBjdXJyZW5jeTogVGVzdEN1cnJlbmN5O1xuICAgIH07XG4gIH07XG4gIHJlc3BvbnNlOiB7XG4gICAgcmVhZG9ubHkgY3JlYXRlT3JnYW5pemF0aW9uOiB7XG4gICAgICByZWFkb25seSBzdGF0dXM6IHN0cmluZztcbiAgICAgIHJlYWRvbmx5IG9yZ2FuaXphdGlvbjoge1xuICAgICAgICByZWFkb25seSBpZDogc3RyaW5nO1xuICAgICAgfSB8IG51bGw7XG4gICAgfTtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFRlc3RBcmNoaXZlT3BlcmF0aW9uIGV4dGVuZHMgT3BlcmF0aW9uVHlwZSB7XG4gIHZhcmlhYmxlczoge1xuICAgIGlkOiBzdHJpbmc7XG4gIH07XG4gIHJlc3BvbnNlOiB7XG4gICAgcmVhZG9ubHkgYXJjaGl2ZToge1xuICAgICAgcmVhZG9ubHkgc3RhdHVzOiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbn1cblxudHlwZSBUZXN0Q3JlYXRlT3JnYW5pemF0aW9uRm9ybVZhbHVlcyA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBjdXJyZW5jeTogVGVzdEN1cnJlbmN5O1xufTtcblxuY29uc3QgbGFiZWw6IEkxOG5MYWJlbCA9ICh0KSA9PiB7XG4gIHJldHVybiB0KCdjb21tb24ubGFiZWwnKTtcbn07XG5cbmNvbnN0IHRlc3RMaXN0UXVlcnlTY2hlbWEgPSBkZWZpbmVTY2hlbWEoe1xuICBwcm9qZWN0SWQ6IHN0cmluZ0ZpZWxkKFsnZXEnXSksXG4gIGtpbmQ6IHN0cmluZ0ZpZWxkKFsnZXEnXSksXG59KTtcblxuY29uc3QgdGVzdExpc3ROYXZpZ2F0aW9uID0gZGVmaW5lQmFja29mZmljZUxpc3ROYXZpZ2F0aW9uPFRlc3RMaXN0T3BlcmF0aW9uPigpKHtcbiAgZGVmYXVsdHM6IHsgd2hlcmU6IG51bGwsIHNvcnQ6ICdDUkVBVEVEX0FUX0RFU0MnIH0sXG4gIGZpbHRlclNjaGVtYToge1xuICAgIHNjaGVtYTogdGVzdExpc3RRdWVyeVNjaGVtYSxcbiAgICB0b1doZXJlOiAoZmlsdGVycykgPT4ge1xuICAgICAgY29uc3QgcmF3S2luZCA9IGZpbHRlcnMua2luZD8uZXE7XG4gICAgICBsZXQga2luZDogVGVzdEtpbmQgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAocmF3S2luZCA9PT0gJ0EnIHx8IHJhd0tpbmQgPT09ICdCJykge1xuICAgICAgICBraW5kID0gcmF3S2luZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb2plY3RJZDogZmlsdGVycy5wcm9qZWN0SWQ/LmVxLFxuICAgICAgICBraW5kLFxuICAgICAgfTtcbiAgICB9LFxuICAgIGZyb21XaGVyZTogKHdoZXJlKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm9qZWN0SWQ6IHsgZXE6IHdoZXJlPy5wcm9qZWN0SWQgPz8gdW5kZWZpbmVkIH0sXG4gICAgICAgIGtpbmQ6IHsgZXE6IHdoZXJlPy5raW5kID8/IHVuZGVmaW5lZCB9LFxuICAgICAgfTtcbiAgICB9LFxuICB9LFxuICBzb3J0SWRzOiBbJ0NSRUFURURfQVRfQVNDJywgJ0NSRUFURURfQVRfREVTQyddLFxufSk7XG5cbnRlc3RMaXN0TmF2aWdhdGlvbi5lbmNvZGUoe1xuICB3aGVyZTogeyBwcm9qZWN0SWQ6ICdwcm9qZWN0LTEnLCBraW5kOiAnQScgfSxcbiAgc29ydDogJ0NSRUFURURfQVRfQVNDJyxcbn0pO1xuXG50ZXN0TGlzdE5hdmlnYXRpb24uZW5jb2RlKHtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBsaXN0IG5hdmlnYXRpb24gc3RhdGUgaXMgZXhhY3QgdG8gdGhlIG9wZXJhdGlvbiB3aGVyZSBpbnB1dC5cbiAgd2hlcmU6IHsgc3RhdHVzOiAnT1BFTicgfSxcbn0pO1xuXG50ZXN0TGlzdE5hdmlnYXRpb24uZGVjb2RlKHtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBsaXN0IG5hdmlnYXRpb24gZmlsdGVycyBhcmUgZXhhY3QgdG8gdGhlIGRlc3RpbmF0aW9uIHNjaGVtYS5cbiAgZmlsdGVyczogeyBtaXNzaW5nOiB7IGVxOiAndmFsdWUnIH0gfSxcbn0pO1xuXG5jb25zdCB0eXBlZExpc3RNYW5pZmVzdCA9IGNyZWF0ZUxpc3REZXRhaWxNYW5pZmVzdCh7XG4gIGlkOiAndGFza3MnLFxuICByb3V0ZVNlZ21lbnQ6ICd0YXNrcycsXG4gIGxhYmVsLFxuICByb3V0ZXM6IHtcbiAgICBsaXN0OiAnL3Rhc2tzJyxcbiAgICBkZXRhaWw6IChpZCkgPT4ge1xuICAgICAgcmV0dXJuIGAvdGFza3MvJHtpZH1gO1xuICAgIH0sXG4gICAgZGV0YWlsUGFnZTogKGlkLCBwYWdlSWQpID0+IHtcbiAgICAgIHJldHVybiBgL3Rhc2tzLyR7aWR9LyR7cGFnZUlkfWA7XG4gICAgfSxcbiAgfSxcbiAgaGFzTGlzdDogdHJ1ZSxcbiAgbGlzdE5hdmlnYXRpb246IHRlc3RMaXN0TmF2aWdhdGlvbixcbiAgZGV0YWlsUGFnZXM6IFtcbiAgICB7XG4gICAgICBpZDogJ292ZXJ2aWV3JyxcbiAgICAgIHBhdGhTZWdtZW50OiAnb3ZlcnZpZXcnLFxuICAgICAgbGFiZWwsXG4gICAgICBpc0RlZmF1bHQ6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgZGVmYXVsdERldGFpbFBhZ2VJZDogJ292ZXJ2aWV3JyxcbiAgZmFjZXRzOiB7XG4gICAgbGlzdDogYXN5bmMgKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eXBlIHRlc3QnKTtcbiAgICB9LFxuICAgIGRldGFpbExheW91dDogYXN5bmMgKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eXBlIHRlc3QnKTtcbiAgICB9LFxuICAgIGRldGFpbFBhZ2U6IGFzeW5jICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndHlwZSB0ZXN0Jyk7XG4gICAgfSxcbiAgfSxcbn0pO1xuXG5jb25zdCBydW50aW1lTGlzdE1hbmlmZXN0OiBCYWNrb2ZmaWNlRW50aXR5TWFuaWZlc3RJdGVtID0gdHlwZWRMaXN0TWFuaWZlc3Q7XG5leHBvcnQgY29uc3QgcnVudGltZUxpc3RNYW5pZmVzdElkID0gcnVudGltZUxpc3RNYW5pZmVzdC5pZDtcblxudHlwZSBUeXBlZExpc3RTdGF0ZSA9IEJhY2tvZmZpY2VNYW5pZmVzdExpc3RTdGF0ZUlucHV0PFxuICB7IHRhc2tzOiB0eXBlb2YgdHlwZWRMaXN0TWFuaWZlc3QgfSxcbiAgJ3Rhc2tzJ1xuPjtcblxuZXhwb3J0IGNvbnN0IHR5cGVkTGlzdFN0YXRlOiBUeXBlZExpc3RTdGF0ZSA9IHtcbiAgd2hlcmU6IHsgcHJvamVjdElkOiAncHJvamVjdC0xJyB9LFxuICBzb3J0OiAnQ1JFQVRFRF9BVF9BU0MnLFxufTtcblxuZXhwb3J0IGNvbnN0IGludmFsaWRUeXBlZExpc3RTdGF0ZTogVHlwZWRMaXN0U3RhdGUgPSB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgbWFuaWZlc3QtZGVyaXZlZCBsaXN0IHN0YXRlIHJlamVjdHMgdW5rbm93biB3aGVyZSBmaWVsZHMuXG4gIHdoZXJlOiB7IHN0YXR1czogJ09QRU4nIH0sXG59O1xuXG5leHBvcnQgY29uc3QgcnVudGltZUxpc3RTdGF0ZTogQmFja29mZmljZU1hbmlmZXN0TGlzdFN0YXRlSW5wdXQ8XG4gIFJlY29yZDxzdHJpbmcsIEJhY2tvZmZpY2VFbnRpdHlNYW5pZmVzdEl0ZW0+LFxuICBzdHJpbmdcbj4gPSB7XG4gIHdoZXJlOiB7IHN0YXR1czogJ09QRU4nIH0sXG4gIHNvcnQ6ICdDUkVBVEVEX0FUX0RFU0MnLFxufTtcblxuLy8gQHRzLWV4cGVjdC1lcnJvciBsaXN0IG1hbmlmZXN0cyByZXF1aXJlIHN5bmNocm9ub3VzIGxpc3QgbmF2aWdhdGlvbi5cbmNyZWF0ZUxpc3REZXRhaWxNYW5pZmVzdCh7XG4gIGlkOiAndGFza3MnLFxuICByb3V0ZVNlZ21lbnQ6ICd0YXNrcycsXG4gIGxhYmVsLFxuICByb3V0ZXM6IHtcbiAgICBsaXN0OiAnL3Rhc2tzJyxcbiAgICBkZXRhaWw6IChpZCkgPT4ge1xuICAgICAgcmV0dXJuIGAvdGFza3MvJHtpZH1gO1xuICAgIH0sXG4gICAgZGV0YWlsUGFnZTogKGlkLCBwYWdlSWQpID0+IHtcbiAgICAgIHJldHVybiBgL3Rhc2tzLyR7aWR9LyR7cGFnZUlkfWA7XG4gICAgfSxcbiAgfSxcbiAgaGFzTGlzdDogdHJ1ZSxcbiAgZGV0YWlsUGFnZXM6IHR5cGVkTGlzdE1hbmlmZXN0LmRldGFpbFBhZ2VzLFxuICBkZWZhdWx0RGV0YWlsUGFnZUlkOiB0eXBlZExpc3RNYW5pZmVzdC5kZWZhdWx0RGV0YWlsUGFnZUlkLFxuICBmYWNldHM6IHtcbiAgICBsaXN0OiB0eXBlZExpc3RNYW5pZmVzdC5mYWNldHMubGlzdCxcbiAgICBkZXRhaWxMYXlvdXQ6IGFzeW5jICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndHlwZSB0ZXN0Jyk7XG4gICAgfSxcbiAgICBkZXRhaWxQYWdlOiBhc3luYyAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R5cGUgdGVzdCcpO1xuICAgIH0sXG4gIH0sXG59KTtcblxuY3JlYXRlTGlzdERldGFpbE1hbmlmZXN0KHtcbiAgLi4udHlwZWRMaXN0TWFuaWZlc3QsXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgbGlzdCBuYXZpZ2F0aW9uIG11c3QgcHJvdmlkZSB0aGUgY29tcGxldGUgc3luY2hyb25vdXMgY29udHJhY3QuXG4gIGxpc3ROYXZpZ2F0aW9uOiB7IGtpbmQ6ICdsaXN0LW5hdmlnYXRpb24nIH0sXG59KTtcblxuY3JlYXRlTGlzdERldGFpbE1hbmlmZXN0KHtcbiAgLi4udHlwZWRMaXN0TWFuaWZlc3QsXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgbGlzdC1kZXRhaWwgbWFuaWZlc3RzIHJlcXVpcmUgYXQgbGVhc3Qgb25lIGRldGFpbCBwYWdlLlxuICBkZXRhaWxQYWdlczogW10sXG59KTtcblxuLy8gQHRzLWV4cGVjdC1lcnJvciBsaXN0IG1hbmlmZXN0cyByZXF1aXJlIGEgbGlzdCBmYWNldCBsb2FkZXIuXG5jcmVhdGVMaXN0RGV0YWlsTWFuaWZlc3Qoe1xuICAuLi50eXBlZExpc3RNYW5pZmVzdCxcbiAgZmFjZXRzOiB7XG4gICAgZGV0YWlsTGF5b3V0OiB0eXBlZExpc3RNYW5pZmVzdC5mYWNldHMuZGV0YWlsTGF5b3V0LFxuICAgIGRldGFpbFBhZ2U6IHR5cGVkTGlzdE1hbmlmZXN0LmZhY2V0cy5kZXRhaWxQYWdlLFxuICB9LFxufSk7XG5cbmNyZWF0ZUxpc3REZXRhaWxNYW5pZmVzdCh7XG4gIC4uLnR5cGVkTGlzdE1hbmlmZXN0LFxuICAvLyBAdHMtZXhwZWN0LWVycm9yIGxpc3QtZGV0YWlsIG1hbmlmZXN0cyByZXF1aXJlIGEgZGV0YWlsLWxheW91dCBmYWNldCBsb2FkZXIuXG4gIGZhY2V0czoge1xuICAgIGxpc3Q6IHR5cGVkTGlzdE1hbmlmZXN0LmZhY2V0cy5saXN0LFxuICAgIGRldGFpbFBhZ2U6IHR5cGVkTGlzdE1hbmlmZXN0LmZhY2V0cy5kZXRhaWxQYWdlLFxuICB9LFxufSk7XG5cbmNyZWF0ZUxpc3REZXRhaWxNYW5pZmVzdCh7XG4gIC4uLnR5cGVkTGlzdE1hbmlmZXN0LFxuICAvLyBAdHMtZXhwZWN0LWVycm9yIGxpc3QtZGV0YWlsIG1hbmlmZXN0cyByZXF1aXJlIGEgZGV0YWlsLXBhZ2UgZmFjZXQgbG9hZGVyLlxuICBmYWNldHM6IHtcbiAgICBsaXN0OiB0eXBlZExpc3RNYW5pZmVzdC5mYWNldHMubGlzdCxcbiAgICBkZXRhaWxMYXlvdXQ6IHR5cGVkTGlzdE1hbmlmZXN0LmZhY2V0cy5kZXRhaWxMYXlvdXQsXG4gIH0sXG59KTtcblxuZGVmaW5lQmFja29mZmljZUZvcm1NdXRhdGlvbkFjdGlvbjxcbiAgVGVzdENyZWF0ZU9yZ2FuaXphdGlvbk9wZXJhdGlvbixcbiAgbnVsbCxcbiAgVGVzdENyZWF0ZU9yZ2FuaXphdGlvbkZvcm1WYWx1ZXNcbj4oKSh7XG4gIGlkOiAnY3JlYXRlLW9yZ2FuaXphdGlvbicsXG4gIGtpbmQ6ICdmb3JtTXV0YXRpb24nLFxuICBsYWJlbCxcbiAgbXV0YXRpb246IHt9IGFzIG5ldmVyLFxuICBmaWVsZHM6IFtdLFxuICBnZXRWYXJpYWJsZXM6IChfbm9kZSwgdmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0OiB7XG4gICAgICAgIG5hbWU6IHZhbHVlcy5uYW1lLFxuICAgICAgICBjdXJyZW5jeTogdmFsdWVzLmN1cnJlbmN5LFxuICAgICAgfSxcbiAgICB9O1xuICB9LFxuICB0b2FzdHM6IHtcbiAgICBzdWNjZXNzOiB7XG4gICAgICB0aXRsZTogbGFiZWwsXG4gICAgICB2aWV3OiB7XG4gICAgICAgIGVudGl0eUlkOiAnb3JnYW5pemF0aW9ucycsXG4gICAgICAgIGdldFRhcmdldElkOiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuY3JlYXRlT3JnYW5pemF0aW9uLm9yZ2FuaXphdGlvbj8uaWQgPz8gbnVsbDtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVCYWNrb2ZmaWNlRm9ybU11dGF0aW9uQWN0aW9uPFxuICBUZXN0Q3JlYXRlT3JnYW5pemF0aW9uT3BlcmF0aW9uLFxuICBudWxsLFxuICBUZXN0Q3JlYXRlT3JnYW5pemF0aW9uRm9ybVZhbHVlc1xuPigpKHtcbiAgaWQ6ICdtaXNzaW5nLWN1cnJlbmN5JyxcbiAga2luZDogJ2Zvcm1NdXRhdGlvbicsXG4gIGxhYmVsLFxuICBtdXRhdGlvbjoge30gYXMgbmV2ZXIsXG4gIGZpZWxkczogW10sXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgY3JlYXRlIG9yZ2FuaXphdGlvbiB2YXJpYWJsZXMgbXVzdCBpbmNsdWRlIHJlcXVpcmVkIGlucHV0LmN1cnJlbmN5LlxuICBnZXRWYXJpYWJsZXM6IChfbm9kZSwgdmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0OiB7XG4gICAgICAgIG5hbWU6IHZhbHVlcy5uYW1lLFxuICAgICAgfSxcbiAgICB9O1xuICB9LFxufSk7XG5cbmRlZmluZUJhY2tvZmZpY2VGb3JtTXV0YXRpb25BY3Rpb248XG4gIFRlc3RDcmVhdGVPcmdhbml6YXRpb25PcGVyYXRpb24sXG4gIG51bGwsXG4gIHsgbmFtZTogc3RyaW5nOyBjdXJyZW5jeTogJ0dCUCcgfVxuPigpKHtcbiAgaWQ6ICdpbnZhbGlkLWN1cnJlbmN5JyxcbiAga2luZDogJ2Zvcm1NdXRhdGlvbicsXG4gIGxhYmVsLFxuICBtdXRhdGlvbjoge30gYXMgbmV2ZXIsXG4gIGZpZWxkczogW10sXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgY3JlYXRlIG9yZ2FuaXphdGlvbiBjdXJyZW5jeSBtdXN0IGJlIG9uZSBvZiB0aGUgUmVsYXkgZ2VuZXJhdGVkIGVudW0gdmFsdWVzLlxuICBnZXRWYXJpYWJsZXM6IChfbm9kZSwgdmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0OiB7XG4gICAgICAgIG5hbWU6IHZhbHVlcy5uYW1lLFxuICAgICAgICBjdXJyZW5jeTogdmFsdWVzLmN1cnJlbmN5LFxuICAgICAgfSxcbiAgICB9O1xuICB9LFxufSk7XG5cbmRlZmluZUJhY2tvZmZpY2VNdXRhdGlvbkFjdGlvbjxUZXN0QXJjaGl2ZU9wZXJhdGlvbiwgeyBpZDogc3RyaW5nIH0+KCkoe1xuICBpZDogJ2FyY2hpdmUnLFxuICBraW5kOiAnbXV0YXRpb24nLFxuICBsYWJlbCxcbiAgbXV0YXRpb246IHt9IGFzIG5ldmVyLFxuICBnZXRWYXJpYWJsZXM6IChub2RlKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBub2RlLmlkLFxuICAgIH07XG4gIH0sXG59KTtcblxuZGVmaW5lQmFja29mZmljZU11dGF0aW9uQWN0aW9uPFRlc3RBcmNoaXZlT3BlcmF0aW9uLCB7IGlkOiBzdHJpbmcgfT4oKSh7XG4gIGlkOiAnYXJjaGl2ZS1taXNzaW5nLWlkJyxcbiAga2luZDogJ211dGF0aW9uJyxcbiAgbGFiZWwsXG4gIG11dGF0aW9uOiB7fSBhcyBuZXZlcixcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBtdXRhdGlvbiB2YXJpYWJsZXMgbXVzdCBpbmNsdWRlIHJlcXVpcmVkIGlkLlxuICBnZXRWYXJpYWJsZXM6ICgpID0+IHtcbiAgICByZXR1cm4ge307XG4gIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IHJlc3BvbnNpdmVNZXRhOiBCYWNrb2ZmaWNlTGlzdFJlc3BvbnNpdmVNZXRhSXRlbSA9IHtcbiAgaWQ6ICdzdGF0ZScsXG4gIGxhYmVsLFxuICB2YWx1ZTogJ3JlYWR5Jyxcbn07XG5cbmV4cG9ydCBjb25zdCBpbnZhbGlkUmVzcG9uc2l2ZU1ldGE6IEJhY2tvZmZpY2VMaXN0UmVzcG9uc2l2ZU1ldGFJdGVtID0ge1xuICBpZDogJ3N0YXRlJyxcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciByZXNwb25zaXZlIG1ldGEgbGFiZWxzIG11c3QgYmUgaTE4biBsYWJlbCBmdW5jdGlvbnMsIG5vdCByYXcgc3RyaW5ncy5cbiAgbGFiZWw6ICdTdGF0ZScsXG4gIHZhbHVlOiAncmVhZHknLFxufTtcblxuZXhwb3J0IGNvbnN0IHRpdGxlTWV0YTogQmFja29mZmljZURldGFpbFRpdGxlTWV0YUl0ZW0gPSB7XG4gIGlkOiAnc3RhdGUnLFxuICBsYWJlbCxcbiAgdmFsdWU6ICdyZWFkeScsXG59O1xuXG5leHBvcnQgY29uc3QgaW52YWxpZFRpdGxlTWV0YTogQmFja29mZmljZURldGFpbFRpdGxlTWV0YUl0ZW0gPSB7XG4gIGlkOiAnc3RhdGUnLFxuICAvLyBAdHMtZXhwZWN0LWVycm9yIHRpdGxlIG1ldGEgbGFiZWxzIG11c3QgYmUgaTE4biBsYWJlbCBmdW5jdGlvbnMsIG5vdCByYXcgc3RyaW5ncy5cbiAgbGFiZWw6ICdTdGF0ZScsXG4gIHZhbHVlOiAncmVhZHknLFxufTtcblxuY29uc3QgZmlsdGVycyA9IGRlZmluZUJhY2tvZmZpY2VGaWx0ZXJzPFRlc3RMaXN0T3BlcmF0aW9uPigpKFtcbiAgZW50aXR5SWRGaWx0ZXI8QmFja29mZmljZU9wZXJhdGlvbldoZXJlPFRlc3RMaXN0T3BlcmF0aW9uPiwgJ3Byb2plY3RJZCc+KFxuICAgICdwcm9qZWN0SWQnLFxuICAgIHtcbiAgICAgIGVudGl0eTogJ3Byb2plY3RzJyxcbiAgICAgIGxhYmVsLFxuICAgIH0sXG4gICksXG4gIGVudW1GaWx0ZXI8QmFja29mZmljZU9wZXJhdGlvbldoZXJlPFRlc3RMaXN0T3BlcmF0aW9uPiwgJ2tpbmQnPigna2luZCcsIHtcbiAgICBsYWJlbCxcbiAgICBvcHRpb25zOiBbJ0EnLCAnQiddLFxuICB9KSxcbiAgbnVtYmVyRmlsdGVyPEJhY2tvZmZpY2VPcGVyYXRpb25XaGVyZTxUZXN0TGlzdE9wZXJhdGlvbj4sICdhdHRlbXB0Jz4oXG4gICAgJ2F0dGVtcHQnLFxuICAgIHtcbiAgICAgIGxhYmVsLFxuICAgIH0sXG4gICksXG4gIGRhdGV0aW1lRmlsdGVyPEJhY2tvZmZpY2VPcGVyYXRpb25XaGVyZTxUZXN0TGlzdE9wZXJhdGlvbj4sICdjcmVhdGVkRnJvbSc+KFxuICAgICdjcmVhdGVkRnJvbScsXG4gICAge1xuICAgICAgbGFiZWwsXG4gICAgICBtb2RlOiAnZnJvbScsXG4gICAgfSxcbiAgKSxcbl0pO1xuXG5kZWZpbmVCYWNrb2ZmaWNlU29ydHM8VGVzdExpc3RPcGVyYXRpb24+KCkoW3sgaWQ6ICdDUkVBVEVEX0FUX0RFU0MnLCBsYWJlbCB9XSk7XG5cbmRlZmluZUJhY2tvZmZpY2VDb25uZWN0aW9uTGlzdDxUZXN0TGlzdE9wZXJhdGlvbiwgVGVzdENvdW50T3BlcmF0aW9uPigpKHtcbiAgdGl0bGU6IGxhYmVsLFxuICBxdWVyeToge30gYXMgbmV2ZXIsXG4gIGZyYWdtZW50OiB7fSBhcyBuZXZlcixcbiAgY291bnQ6IHtcbiAgICBxdWVyeToge30gYXMgbmV2ZXIsXG4gICAgYnVpbGRWYXJpYWJsZXM6ICh7IHdoZXJlIH0pID0+IHtcbiAgICAgIHJldHVybiB7IHdoZXJlIH07XG4gICAgfSxcbiAgICBnZXRDb3VudDogKGRhdGEpID0+IHtcbiAgICAgIHJldHVybiAoZGF0YSBhcyBUZXN0Q291bnRPcGVyYXRpb25bJ3Jlc3BvbnNlJ10pLnJvd3NDb3VudDtcbiAgICB9LFxuICB9LFxuICBmaWx0ZXJzLFxuICBzb3J0czogZGVmaW5lQmFja29mZmljZVNvcnRzPFRlc3RMaXN0T3BlcmF0aW9uPigpKFtcbiAgICB7IGlkOiAnQ1JFQVRFRF9BVF9BU0MnLCBsYWJlbCB9LFxuICBdKSxcbiAgZGVmYXVsdFN0YXRlOiB7XG4gICAgd2hlcmU6IHsgcHJvamVjdElkOiAncHJvamVjdC0xJyB9LFxuICAgIHNvcnQ6ICdDUkVBVEVEX0FUX0RFU0MnLFxuICB9LFxuICBnZXRDb25uZWN0aW9uOiAoKSA9PiB7XG4gICAgcmV0dXJuIHsgZWRnZXM6IFtdIH07XG4gIH0sXG4gIHRvUm93OiAocm93KSA9PiB7XG4gICAgcmV0dXJuIHJvdztcbiAgfSxcbiAgZ2V0Um93SWQ6ICgpID0+IHtcbiAgICByZXR1cm4gJ3Jvdyc7XG4gIH0sXG4gIGNvbHVtbnM6IFtdLFxufSk7XG5cbmRlZmluZUJhY2tvZmZpY2VQaWNrZXI8VGVzdFBpY2tlck9wZXJhdGlvbj4oKSh7XG4gIHF1ZXJ5OiB7fSBhcyBuZXZlcixcbiAgZnJhZ21lbnQ6IHt9IGFzIG5ldmVyLFxuICBnZXRDb25uZWN0aW9uOiAoKSA9PiB7XG4gICAgcmV0dXJuIHsgZWRnZXM6IFtdIH07XG4gIH0sXG4gIHRvUm93OiAoKSA9PiB7XG4gICAgcmV0dXJuIHsgaWQ6ICdyb3cnLCB0aXRsZTogJ1JvdycgfTtcbiAgfSxcbiAgZ2V0Um93SWQ6IChyb3cpID0+IHtcbiAgICByZXR1cm4gcm93LmlkO1xuICB9LFxuICBidWlsZFF1ZXJ5VmFyaWFibGVzOiAoeyBzY29wZSB9KSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdoZXJlOiB7XG4gICAgICAgIG9yZ2FuaXphdGlvbklkOiBzY29wZT8ub3JnYW5pemF0aW9uSWQsXG4gICAgICB9LFxuICAgICAgY291bnQ6IDIwLFxuICAgICAgY3Vyc29yOiBudWxsLFxuICAgIH07XG4gIH0sXG59KTtcblxuZGVmaW5lQmFja29mZmljZURhc2hib2FyZENvbmZpZyh7XG4gIHRpdGxlOiBsYWJlbCxcbiAgd2lkZ2V0czogW1xuICAgIGRlZmluZUJhY2tvZmZpY2VEYXNoYm9hcmRRdWVyeVdpZGdldDxUZXN0RGFzaGJvYXJkT3BlcmF0aW9uPigpKHtcbiAgICAgIGlkOiAndXNlcnMnLFxuICAgICAga2luZDogJ21ldHJpY0dyb3VwJyxcbiAgICAgIHF1ZXJ5OiB7fSBhcyBuZXZlcixcbiAgICAgIHZhcmlhYmxlczoge30sXG4gICAgICByZXNvbHZlOiAoZGF0YSkgPT4ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAndXNlcnMnLFxuICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICB2YWx1ZTogZGF0YS51c2Vycy50b3RhbENvdW50LFxuICAgICAgICAgICAgdGFyZ2V0OiBkZWZpbmVCYWNrb2ZmaWNlRGFzaGJvYXJkTGlzdFRhcmdldDxUZXN0TGlzdE9wZXJhdGlvbj4oKSh7XG4gICAgICAgICAgICAgIGVudGl0eUlkOiAndGFza3MnLFxuICAgICAgICAgICAgICBzdGF0ZToge1xuICAgICAgICAgICAgICAgIHdoZXJlOiB7IGtpbmQ6ICdBJyB9LFxuICAgICAgICAgICAgICAgIHNvcnQ6ICdDUkVBVEVEX0FUX0RFU0MnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH0sXG4gICAgfSksXG4gICAgZGVmaW5lQmFja29mZmljZURhc2hib2FyZFN0YXRpY1dpZGdldCh7XG4gICAgICBpZDogJ3dpbmRvdycsXG4gICAgICBraW5kOiAnd2luZG93Q29udHJvbCcsXG4gICAgICB0aXRsZTogbGFiZWwsXG4gICAgfSksXG4gICAgZGVmaW5lQmFja29mZmljZURhc2hib2FyZFF1ZXJ5V2lkZ2V0PFRlc3REYXNoYm9hcmRXaW5kb3dPcGVyYXRpb24+KCkoe1xuICAgICAgaWQ6ICd0aHJvdWdocHV0JyxcbiAgICAgIGtpbmQ6ICd0cmVuZE1ldHJpYycsXG4gICAgICBxdWVyeToge30gYXMgbmV2ZXIsXG4gICAgICB2YXJpYWJsZXM6ICh7IHdpbmRvdyB9KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZnJvbTogd2luZG93LmZyb20sXG4gICAgICAgICAgdG86IHdpbmRvdy50byxcbiAgICAgICAgICBzZXZlcml0eTogJ0EnLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHJlc29sdmU6IChkYXRhKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgdmFsdWU6IGRhdGEudGhyb3VnaHB1dENvdW50LFxuICAgICAgICAgIGRlbHRhOiB7XG4gICAgICAgICAgICB2YWx1ZTogMTIsXG4gICAgICAgICAgICBkaXJlY3Rpb246ICd1cCcsXG4gICAgICAgICAgICB0b25lOiAnc3VjY2VzcycsXG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNwYXJrbGluZTogW3sgeDogJzIwMjYtMDEtMDFUMDA6MDA6MDAuMDAwWicsIHk6IDEgfV0sXG4gICAgICAgICAgdGFyZ2V0OiBkZWZpbmVCYWNrb2ZmaWNlRGFzaGJvYXJkTGlzdFRhcmdldDxUZXN0TGlzdE9wZXJhdGlvbj4oKSh7XG4gICAgICAgICAgICBlbnRpdHlJZDogJ3Rhc2tzJyxcbiAgICAgICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgICAgIHdoZXJlOiB7IGtpbmQ6ICdBJyB9LFxuICAgICAgICAgICAgICBzb3J0OiAnQ1JFQVRFRF9BVF9ERVNDJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pLFxuICAgIGRlZmluZUJhY2tvZmZpY2VEYXNoYm9hcmRRdWVyeVdpZGdldDxUZXN0RGFzaGJvYXJkV2luZG93T3BlcmF0aW9uPigpKHtcbiAgICAgIGlkOiAnZmFpbHVyZS1yYXRlJyxcbiAgICAgIGtpbmQ6ICdzbGFHYXVnZScsXG4gICAgICBxdWVyeToge30gYXMgbmV2ZXIsXG4gICAgICB2YXJpYWJsZXM6ICh7IHdpbmRvdyB9KSA9PiB7XG4gICAgICAgIHJldHVybiB7IGZyb206IHdpbmRvdy5mcm9tLCB0bzogd2luZG93LnRvIH07XG4gICAgICB9LFxuICAgICAgcmVzb2x2ZTogKGRhdGEpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICB2YWx1ZTogZGF0YS5mYWlsdXJlUmF0ZSxcbiAgICAgICAgICBtYXg6IDEsXG4gICAgICAgICAgdGhyZXNob2xkOiAwLjA1LFxuICAgICAgICAgIHVuaXQ6ICclJyxcbiAgICAgICAgICB0b25lOiAnd2FybmluZycsXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pLFxuICAgIGRlZmluZUJhY2tvZmZpY2VEYXNoYm9hcmRRdWVyeVdpZGdldDxUZXN0RGFzaGJvYXJkV2luZG93T3BlcmF0aW9uPigpKHtcbiAgICAgIGlkOiAndG9wLWZhaWx1cmVzJyxcbiAgICAgIGtpbmQ6ICdicmVha2Rvd25MaXN0JyxcbiAgICAgIHF1ZXJ5OiB7fSBhcyBuZXZlcixcbiAgICAgIHZhcmlhYmxlczogKHsgd2luZG93IH0pID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZnJvbTogd2luZG93LmZyb20sIHRvOiB3aW5kb3cudG8gfTtcbiAgICAgIH0sXG4gICAgICByZXNvbHZlOiAoZGF0YSkgPT4ge1xuICAgICAgICByZXR1cm4gZGF0YS50b3BGYWlsdXJlcy5tYXAoKGZhaWx1cmUpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGZhaWx1cmUuaWQsXG4gICAgICAgICAgICBsYWJlbDogKCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gZmFpbHVyZS5sYWJlbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2YWx1ZTogZmFpbHVyZS5jb3VudCxcbiAgICAgICAgICAgIHRvbmU6ICdkYW5nZXInLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KSxcbiAgICBkZWZpbmVCYWNrb2ZmaWNlRGFzaGJvYXJkUXVlcnlXaWRnZXQ8VGVzdERhc2hib2FyZFdpbmRvd09wZXJhdGlvbj4oKSh7XG4gICAgICBpZDogJ3RpbWVsaW5lJyxcbiAgICAgIGtpbmQ6ICd0aW1lbGluZUNoYXJ0JyxcbiAgICAgIHF1ZXJ5OiB7fSBhcyBuZXZlcixcbiAgICAgIHZhcmlhYmxlczogKHsgd2luZG93IH0pID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZnJvbTogd2luZG93LmZyb20sIHRvOiB3aW5kb3cudG8gfTtcbiAgICAgIH0sXG4gICAgICBhcmlhTGFiZWw6IGxhYmVsLFxuICAgICAgY2hhcnQ6ICdiYXInLFxuICAgICAgcmVzb2x2ZTogKGRhdGEpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzZXJpZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWQ6ICd0aHJvdWdocHV0JyxcbiAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgIGNvbG9yOiAnIzI1NjNlYicsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGEuYnVja2V0cy5tYXAoKGJ1Y2tldCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICB4OiBidWNrZXQuYnVja2V0LFxuICAgICAgICAgICAgICAgICAgeTogYnVja2V0LmNvdW50LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9KSxcbiAgICBkZWZpbmVCYWNrb2ZmaWNlRGFzaGJvYXJkUXVlcnlXaWRnZXQ8VGVzdERhc2hib2FyZFdpbmRvd09wZXJhdGlvbj4oKSh7XG4gICAgICBpZDogJ3Jpc2stcXVldWUnLFxuICAgICAga2luZDogJ3Jpc2tRdWV1ZScsXG4gICAgICBxdWVyeToge30gYXMgbmV2ZXIsXG4gICAgICB2YXJpYWJsZXM6ICh7IHdpbmRvdyB9KSA9PiB7XG4gICAgICAgIHJldHVybiB7IGZyb206IHdpbmRvdy5mcm9tLCB0bzogd2luZG93LnRvIH07XG4gICAgICB9LFxuICAgICAgcmVzb2x2ZTogKCkgPT4ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnZGVhZC1vdXRib3gnLFxuICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICBzZXZlcml0eTogJ2RhbmdlcicsXG4gICAgICAgICAgICB2YWx1ZTogNCxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfSxcbiAgICB9KSxcbiAgICBkZWZpbmVCYWNrb2ZmaWNlRGFzaGJvYXJkUXVlcnlXaWRnZXQ8VGVzdERhc2hib2FyZFdpbmRvd09wZXJhdGlvbj4oKSh7XG4gICAgICBpZDogJ3Nwb3RsaWdodCcsXG4gICAgICBraW5kOiAnZW50aXR5U3BvdGxpZ2h0JyxcbiAgICAgIHF1ZXJ5OiB7fSBhcyBuZXZlcixcbiAgICAgIHZhcmlhYmxlczogKHsgd2luZG93IH0pID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZnJvbTogd2luZG93LmZyb20sIHRvOiB3aW5kb3cudG8gfTtcbiAgICAgIH0sXG4gICAgICByZXNvbHZlOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgdGl0bGU6IGxhYmVsLFxuICAgICAgICAgIHRvbmU6ICdpbmZvJyxcbiAgICAgICAgICBtZXRhOiBbeyBpZDogJ2FnZScsIGxhYmVsLCB2YWx1ZTogJzQ1IG1pbicgfV0sXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pLFxuICAgIGRlZmluZUJhY2tvZmZpY2VEYXNoYm9hcmRRdWVyeVdpZGdldDxUZXN0RGFzaGJvYXJkV2luZG93T3BlcmF0aW9uPigpKHtcbiAgICAgIGlkOiAnaGVhbHRoJyxcbiAgICAgIGtpbmQ6ICdoZWFsdGhNYXRyaXgnLFxuICAgICAgcXVlcnk6IHt9IGFzIG5ldmVyLFxuICAgICAgdmFyaWFibGVzOiAoeyB3aW5kb3cgfSkgPT4ge1xuICAgICAgICByZXR1cm4geyBmcm9tOiB3aW5kb3cuZnJvbSwgdG86IHdpbmRvdy50byB9O1xuICAgICAgfSxcbiAgICAgIHJlc29sdmU6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJ3dvcmsnLFxuICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICBjZWxsczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWQ6ICd0YXNrcycsXG4gICAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgICAgdmFsdWU6IDIsXG4gICAgICAgICAgICAgICAgdG9uZTogJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfSxcbiAgICB9KSxcbiAgICBkZWZpbmVCYWNrb2ZmaWNlRGFzaGJvYXJkU3RhdGljV2lkZ2V0KHtcbiAgICAgIGlkOiAnYWN0aW9ucycsXG4gICAgICBraW5kOiAncXVpY2tBY3Rpb25zJyxcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAndXNlcnMnLFxuICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgIHRhcmdldDogZGVmaW5lQmFja29mZmljZURhc2hib2FyZEhyZWZUYXJnZXQoJy91c2VycycpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KSxcbiAgXSxcbn0pO1xuXG5kZWZpbmVCYWNrb2ZmaWNlRGFzaGJvYXJkUXVlcnlXaWRnZXQ8VGVzdERhc2hib2FyZE9wZXJhdGlvbj4oKSh7XG4gIGlkOiAnaW52YWxpZC11c2VycycsXG4gIGtpbmQ6ICdtZXRyaWNHcm91cCcsXG4gIHF1ZXJ5OiB7fSBhcyBuZXZlcixcbiAgdmFyaWFibGVzOiB7fSxcbiAgcmVzb2x2ZTogKGRhdGEpID0+IHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBpZDogJ3VzZXJzJyxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgZGFzaGJvYXJkIHdpZGdldCByZXNvbHZlIGRhdGEgaXMgdHlwZWQgZnJvbSB0aGUgb3BlcmF0aW9uIHJlc3BvbnNlLlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgIHZhbHVlOiBkYXRhLnByb2plY3RzLnRvdGFsQ291bnQsXG4gICAgICB9LFxuICAgIF07XG4gIH0sXG59KTtcblxuZGVmaW5lQmFja29mZmljZURhc2hib2FyZFF1ZXJ5V2lkZ2V0PFRlc3REYXNoYm9hcmRXaW5kb3dPcGVyYXRpb24+KCkoe1xuICBpZDogJ2ludmFsaWQtd2luZG93LXZhcmlhYmxlcycsXG4gIGtpbmQ6ICd0cmVuZE1ldHJpYycsXG4gIHF1ZXJ5OiB7fSBhcyBuZXZlcixcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBkYXNoYm9hcmQgd2lkZ2V0IHZhcmlhYmxlcyBtdXN0IG1hdGNoIHRoZSBvcGVyYXRpb24gdmFyaWFibGVzLlxuICB2YXJpYWJsZXM6ICh7IHdpbmRvdyB9KSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb206IHdpbmRvdy5mcm9tLFxuICAgIH07XG4gIH0sXG4gIHJlc29sdmU6IChkYXRhKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsLFxuICAgICAgdmFsdWU6IGRhdGEudGhyb3VnaHB1dENvdW50LFxuICAgIH07XG4gIH0sXG59KTtcblxuZGVmaW5lQmFja29mZmljZURhc2hib2FyZExpc3RUYXJnZXQ8VGVzdExpc3RPcGVyYXRpb24+KCkoe1xuICBlbnRpdHlJZDogJ3Rhc2tzJyxcbiAgc3RhdGU6IHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGRhc2hib2FyZCBsaXN0IHRhcmdldCB3aGVyZSBtdXN0IG1hdGNoIHRoZSB0YXJnZXQgbGlzdCBvcGVyYXRpb24gd2hlcmUgaW5wdXQuXG4gICAgd2hlcmU6IHsgb3JnYW5pemF0aW9uSWQ6ICdvcmctMScgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVCYWNrb2ZmaWNlRGFzaGJvYXJkTGlzdFRhcmdldDxUZXN0TGlzdE9wZXJhdGlvbj4oKSh7XG4gIGVudGl0eUlkOiAndGFza3MnLFxuICBzdGF0ZToge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgZGFzaGJvYXJkIGxpc3QgdGFyZ2V0IHNvcnQgbXVzdCBtYXRjaCB0aGUgdGFyZ2V0IGxpc3Qgb3BlcmF0aW9uIHNvcnQgaW5wdXQuXG4gICAgc29ydDogJ1VQREFURURfQVRfREVTQycsXG4gIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IGludmFsaWREYXNoYm9hcmRDb25maWc6IEJhY2tvZmZpY2VEYXNoYm9hcmRDb25maWcgPSB7XG4gIHRpdGxlOiBsYWJlbCxcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBkYXNoYm9hcmQgY29uZmlncyBkbyBub3Qgc3VwcG9ydCBnbG9iYWwgcXVlcmllcy5cbiAgcXVlcnk6IHt9IGFzIG5ldmVyLFxuICB3aWRnZXRzOiBbXSxcbn07XG5cbi8vIEB0cy1leHBlY3QtZXJyb3IgZGF0YS1kcml2ZW4gZGFzaGJvYXJkIHdpZGdldHMgbXVzdCBkZWNsYXJlIGEgcXVlcnkuXG5kZWZpbmVCYWNrb2ZmaWNlRGFzaGJvYXJkUXVlcnlXaWRnZXQ8VGVzdERhc2hib2FyZE9wZXJhdGlvbj4oKSh7XG4gIGlkOiAnbWlzc2luZy1xdWVyeScsXG4gIGtpbmQ6ICdtZXRyaWNHcm91cCcsXG4gIHZhcmlhYmxlczoge30sXG4gIHJlc29sdmU6IChkYXRhKSA9PiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgaWQ6ICd1c2VycycsXG4gICAgICAgIGxhYmVsLFxuICAgICAgICB2YWx1ZTogZGF0YS51c2Vycy50b3RhbENvdW50LFxuICAgICAgfSxcbiAgICBdO1xuICB9LFxufSk7XG5cbmRlZmluZUJhY2tvZmZpY2VSZWxhdGlvbkZpbHRlcjxUZXN0TGlzdE9wZXJhdGlvbj4oKSh7XG4gIHRhcmdldDogJ3Byb2plY3RzJyxcbiAgd2hlcmVLZXk6ICdwcm9qZWN0SWQnLFxufSk7XG5cbmRlZmluZUJhY2tvZmZpY2VSZWxhdGlvbkZpbHRlcjxUZXN0TGlzdE9wZXJhdGlvbj4oKSh7XG4gIHRhcmdldDogJ3Byb2plY3RzJyxcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBvcmdhbml6YXRpb25JZCBpcyBub3QgZGVjbGFyZWQgYnkgdGhlIHRhcmdldCBsaXN0IHdoZXJlIGlucHV0LlxuICB3aGVyZUtleTogJ29yZ2FuaXphdGlvbklkJyxcbn0pO1xuXG5kZWZpbmVCYWNrb2ZmaWNlRmlsdGVyczxUZXN0TGlzdE9wZXJhdGlvbj4oKShbXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgbWlzc2luZ0ZpZWxkIGlzIG5vdCBkZWNsYXJlZCBieSB0aGUgb3BlcmF0aW9uIHdoZXJlIGlucHV0LlxuICBlbnRpdHlJZEZpbHRlcjxCYWNrb2ZmaWNlT3BlcmF0aW9uV2hlcmU8VGVzdExpc3RPcGVyYXRpb24+LCAnbWlzc2luZ0ZpZWxkJz4oXG4gICAgJ21pc3NpbmdGaWVsZCcsXG4gICAge1xuICAgICAgZW50aXR5OiAncHJvamVjdHMnLFxuICAgICAgbGFiZWwsXG4gICAgfSxcbiAgKSxcbl0pO1xuXG5kZWZpbmVCYWNrb2ZmaWNlRmlsdGVyczxUZXN0TGlzdE9wZXJhdGlvbj4oKShbXG4gIGVudW1GaWx0ZXI8QmFja29mZmljZU9wZXJhdGlvbldoZXJlPFRlc3RMaXN0T3BlcmF0aW9uPiwgJ2tpbmQnPigna2luZCcsIHtcbiAgICBsYWJlbCxcbiAgICBvcHRpb25zOiBbXG4gICAgICAnQScsXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEMgaXMgbm90IGEgdmFsaWQgVGVzdEtpbmQgdmFsdWUuXG4gICAgICAnQycsXG4gICAgXSxcbiAgfSksXG5dKTtcblxuZGVmaW5lQmFja29mZmljZUZpbHRlcnM8VGVzdExpc3RPcGVyYXRpb24+KCkoW1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIGtpbmQgaXMgYW4gZW51bSBzdHJpbmcgZmllbGQsIG5vdCBhIG51bWJlciBmaWVsZC5cbiAgbnVtYmVyRmlsdGVyPEJhY2tvZmZpY2VPcGVyYXRpb25XaGVyZTxUZXN0TGlzdE9wZXJhdGlvbj4sICdraW5kJz4oJ2tpbmQnLCB7XG4gICAgbGFiZWwsXG4gIH0pLFxuXSk7XG5cbmRlZmluZUJhY2tvZmZpY2VGaWx0ZXJzPFRlc3RMaXN0T3BlcmF0aW9uPigpKFtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBhdHRlbXB0IGlzIGEgbnVtYmVyIGZpZWxkLCBub3QgYSBkYXRldGltZSBzdHJpbmcgZmllbGQuXG4gIGRhdGV0aW1lRmlsdGVyPEJhY2tvZmZpY2VPcGVyYXRpb25XaGVyZTxUZXN0TGlzdE9wZXJhdGlvbj4sICdhdHRlbXB0Jz4oXG4gICAgJ2F0dGVtcHQnLFxuICAgIHtcbiAgICAgIGxhYmVsLFxuICAgIH0sXG4gICksXG5dKTtcblxuZGVmaW5lQmFja29mZmljZVNvcnRzPFRlc3RMaXN0T3BlcmF0aW9uPigpKFtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBVUERBVEVEX0FUX0RFU0MgaXMgbm90IGRlY2xhcmVkIGJ5IHRoZSBvcGVyYXRpb24gc29ydC5cbiAgeyBpZDogJ1VQREFURURfQVRfREVTQycsIGxhYmVsIH0sXG5dKTtcblxuZGVmaW5lQmFja29mZmljZUNvbm5lY3Rpb25MaXN0PFRlc3RMaXN0T3BlcmF0aW9uLCBUZXN0Q291bnRPcGVyYXRpb24+KCkoe1xuICB0aXRsZTogbGFiZWwsXG4gIHF1ZXJ5OiB7fSBhcyBuZXZlcixcbiAgZnJhZ21lbnQ6IHt9IGFzIG5ldmVyLFxuICBjb3VudDoge1xuICAgIHF1ZXJ5OiB7fSBhcyBuZXZlcixcbiAgICBidWlsZFZhcmlhYmxlczogKHsgd2hlcmUgfSkgPT4ge1xuICAgICAgcmV0dXJuIHsgd2hlcmUgfTtcbiAgICB9LFxuICAgIGdldENvdW50OiAoZGF0YSkgPT4ge1xuICAgICAgcmV0dXJuIChkYXRhIGFzIFRlc3RDb3VudE9wZXJhdGlvblsncmVzcG9uc2UnXSkucm93c0NvdW50O1xuICAgIH0sXG4gIH0sXG4gIGZpbHRlcnMsXG4gIHNvcnRzOiBkZWZpbmVCYWNrb2ZmaWNlU29ydHM8VGVzdExpc3RPcGVyYXRpb24+KCkoW1xuICAgIHsgaWQ6ICdDUkVBVEVEX0FUX0FTQycsIGxhYmVsIH0sXG4gIF0pLFxuICBkZWZhdWx0U3RhdGU6IHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG9yZ2FuaXphdGlvbklkIGlzIG5vdCBkZWNsYXJlZCBieSB0aGUgbGlzdCB3aGVyZSBpbnB1dC5cbiAgICB3aGVyZTogeyBvcmdhbml6YXRpb25JZDogJ29yZy0xJyB9LFxuICAgIHNvcnQ6ICdDUkVBVEVEX0FUX0FTQycsXG4gIH0sXG4gIGdldENvbm5lY3Rpb246ICgpID0+IHtcbiAgICByZXR1cm4geyBlZGdlczogW10gfTtcbiAgfSxcbiAgdG9Sb3c6IChyb3cpID0+IHtcbiAgICByZXR1cm4gcm93O1xuICB9LFxuICBnZXRSb3dJZDogKCkgPT4ge1xuICAgIHJldHVybiAncm93JztcbiAgfSxcbiAgY29sdW1uczogW10sXG59KTtcblxuZGVmaW5lQmFja29mZmljZVBpY2tlcjxUZXN0UGlja2VyT3BlcmF0aW9uPigpKHtcbiAgcXVlcnk6IHt9IGFzIG5ldmVyLFxuICBmcmFnbWVudDoge30gYXMgbmV2ZXIsXG4gIGdldENvbm5lY3Rpb246ICgpID0+IHtcbiAgICByZXR1cm4geyBlZGdlczogW10gfTtcbiAgfSxcbiAgdG9Sb3c6ICgpID0+IHtcbiAgICByZXR1cm4geyBpZDogJ3JvdycsIHRpdGxlOiAnUm93JyB9O1xuICB9LFxuICBnZXRSb3dJZDogKHJvdykgPT4ge1xuICAgIHJldHVybiByb3cuaWQ7XG4gIH0sXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgcmV0dXJuZWQgd2hlcmUgc2hhcGUgaXMgbm90IGRlY2xhcmVkIGJ5IHRoZSBwaWNrZXIgb3BlcmF0aW9uLlxuICBidWlsZFF1ZXJ5VmFyaWFibGVzOiAoeyBzY29wZSB9KSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdoZXJlOiB7XG4gICAgICAgIHByb2plY3RJZDogKHNjb3BlIGFzIHsgcHJvamVjdElkPzogc3RyaW5nIH0gfCB1bmRlZmluZWQpPy5wcm9qZWN0SWQsXG4gICAgICB9LFxuICAgICAgY291bnQ6IDIwLFxuICAgICAgY3Vyc29yOiBudWxsLFxuICAgIH07XG4gIH0sXG59KTtcbiJdfQ==