@xpr-agents/sdk 0.1.0

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.
@@ -0,0 +1,638 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ValidationRegistry = void 0;
4
+ const utils_1 = require("./utils");
5
+ const DEFAULT_CONTRACT = 'agentvalid';
6
+ class ValidationRegistry {
7
+ constructor(rpc, session, contract) {
8
+ this.rpc = rpc;
9
+ this.session = session || null;
10
+ this.contract = contract || DEFAULT_CONTRACT;
11
+ }
12
+ // ============== READ OPERATIONS ==============
13
+ /**
14
+ * Get a validator by account
15
+ */
16
+ async getValidator(account) {
17
+ const result = await this.rpc.get_table_rows({
18
+ json: true,
19
+ code: this.contract,
20
+ scope: this.contract,
21
+ table: 'validators',
22
+ lower_bound: account,
23
+ upper_bound: account,
24
+ limit: 1,
25
+ });
26
+ if (result.rows.length === 0)
27
+ return null;
28
+ return this.parseValidator(result.rows[0]);
29
+ }
30
+ /**
31
+ * List all validators
32
+ */
33
+ async listValidators(options = {}) {
34
+ const { limit = 100, active_only = true } = options;
35
+ const result = await this.rpc.get_table_rows({
36
+ json: true,
37
+ code: this.contract,
38
+ scope: this.contract,
39
+ table: 'validators',
40
+ limit,
41
+ });
42
+ let validators = result.rows.map((row) => this.parseValidator(row));
43
+ if (active_only) {
44
+ validators = validators.filter((v) => v.active);
45
+ }
46
+ if (options.min_stake !== undefined) {
47
+ validators = validators.filter((v) => v.stake >= options.min_stake);
48
+ }
49
+ if (options.min_accuracy !== undefined) {
50
+ validators = validators.filter((v) => v.accuracy_score >= options.min_accuracy);
51
+ }
52
+ if (options.specialization) {
53
+ validators = validators.filter((v) => v.specializations.includes(options.specialization));
54
+ }
55
+ return validators;
56
+ }
57
+ /**
58
+ * Get validation by ID
59
+ */
60
+ async getValidation(id) {
61
+ const result = await this.rpc.get_table_rows({
62
+ json: true,
63
+ code: this.contract,
64
+ scope: this.contract,
65
+ table: 'validations',
66
+ lower_bound: String(id),
67
+ upper_bound: String(id),
68
+ limit: 1,
69
+ });
70
+ if (result.rows.length === 0)
71
+ return null;
72
+ return this.parseValidation(result.rows[0]);
73
+ }
74
+ /**
75
+ * List validations for an agent
76
+ */
77
+ async listValidationsForAgent(agent, limit = 100) {
78
+ const result = await this.rpc.get_table_rows({
79
+ json: true,
80
+ code: this.contract,
81
+ scope: this.contract,
82
+ table: 'validations',
83
+ index_position: 2,
84
+ key_type: 'i64',
85
+ limit,
86
+ });
87
+ return result.rows
88
+ .filter((row) => row.agent === agent)
89
+ .map((row) => this.parseValidation(row));
90
+ }
91
+ /**
92
+ * List validations by a validator
93
+ */
94
+ async listValidationsByValidator(validator, limit = 100) {
95
+ const result = await this.rpc.get_table_rows({
96
+ json: true,
97
+ code: this.contract,
98
+ scope: this.contract,
99
+ table: 'validations',
100
+ index_position: 3,
101
+ key_type: 'i64',
102
+ limit,
103
+ });
104
+ return result.rows
105
+ .filter((row) => row.validator === validator)
106
+ .map((row) => this.parseValidation(row));
107
+ }
108
+ /**
109
+ * Get challenge by ID
110
+ */
111
+ async getChallenge(id) {
112
+ const result = await this.rpc.get_table_rows({
113
+ json: true,
114
+ code: this.contract,
115
+ scope: this.contract,
116
+ table: 'challenges',
117
+ lower_bound: String(id),
118
+ upper_bound: String(id),
119
+ limit: 1,
120
+ });
121
+ if (result.rows.length === 0)
122
+ return null;
123
+ return this.parseChallenge(result.rows[0]);
124
+ }
125
+ /**
126
+ * Get challenges for a validation
127
+ */
128
+ async getChallengesForValidation(validationId) {
129
+ const result = await this.rpc.get_table_rows({
130
+ json: true,
131
+ code: this.contract,
132
+ scope: this.contract,
133
+ table: 'challenges',
134
+ index_position: 2,
135
+ key_type: 'i64',
136
+ limit: 100,
137
+ });
138
+ return result.rows
139
+ .filter((row) => row.validation_id === String(validationId))
140
+ .map((row) => this.parseChallenge(row));
141
+ }
142
+ // ============== WRITE OPERATIONS ==============
143
+ /**
144
+ * Register as a validator
145
+ */
146
+ async registerValidator(method, specializations) {
147
+ this.requireSession();
148
+ return this.session.link.transact({
149
+ actions: [
150
+ {
151
+ account: this.contract,
152
+ name: 'regval',
153
+ authorization: [
154
+ {
155
+ actor: this.session.auth.actor,
156
+ permission: this.session.auth.permission,
157
+ },
158
+ ],
159
+ data: {
160
+ account: this.session.auth.actor,
161
+ method,
162
+ specializations: JSON.stringify(specializations),
163
+ },
164
+ },
165
+ ],
166
+ });
167
+ }
168
+ /**
169
+ * Update validator info
170
+ */
171
+ async updateValidator(method, specializations) {
172
+ this.requireSession();
173
+ return this.session.link.transact({
174
+ actions: [
175
+ {
176
+ account: this.contract,
177
+ name: 'updateval',
178
+ authorization: [
179
+ {
180
+ actor: this.session.auth.actor,
181
+ permission: this.session.auth.permission,
182
+ },
183
+ ],
184
+ data: {
185
+ account: this.session.auth.actor,
186
+ method,
187
+ specializations: JSON.stringify(specializations),
188
+ },
189
+ },
190
+ ],
191
+ });
192
+ }
193
+ /**
194
+ * Stake XPR as validator
195
+ */
196
+ async stake(amount) {
197
+ this.requireSession();
198
+ return this.session.link.transact({
199
+ actions: [
200
+ {
201
+ account: 'eosio.token',
202
+ name: 'transfer',
203
+ authorization: [
204
+ {
205
+ actor: this.session.auth.actor,
206
+ permission: this.session.auth.permission,
207
+ },
208
+ ],
209
+ data: {
210
+ from: this.session.auth.actor,
211
+ to: this.contract,
212
+ quantity: amount,
213
+ memo: 'stake',
214
+ },
215
+ },
216
+ ],
217
+ });
218
+ }
219
+ /**
220
+ * Submit validation
221
+ */
222
+ async validate(data) {
223
+ this.requireSession();
224
+ return this.session.link.transact({
225
+ actions: [
226
+ {
227
+ account: this.contract,
228
+ name: 'validate',
229
+ authorization: [
230
+ {
231
+ actor: this.session.auth.actor,
232
+ permission: this.session.auth.permission,
233
+ },
234
+ ],
235
+ data: {
236
+ validator: this.session.auth.actor,
237
+ agent: data.agent,
238
+ job_hash: data.job_hash,
239
+ result: (0, utils_1.validationResultToNumber)(data.result),
240
+ confidence: data.confidence,
241
+ evidence_uri: data.evidence_uri || '',
242
+ },
243
+ },
244
+ ],
245
+ });
246
+ }
247
+ /**
248
+ * Challenge a validation
249
+ */
250
+ async challenge(validationId, reason, evidenceUri) {
251
+ this.requireSession();
252
+ return this.session.link.transact({
253
+ actions: [
254
+ {
255
+ account: this.contract,
256
+ name: 'challenge',
257
+ authorization: [
258
+ {
259
+ actor: this.session.auth.actor,
260
+ permission: this.session.auth.permission,
261
+ },
262
+ ],
263
+ data: {
264
+ challenger: this.session.auth.actor,
265
+ validation_id: validationId,
266
+ reason,
267
+ evidence_uri: evidenceUri || '',
268
+ },
269
+ },
270
+ ],
271
+ });
272
+ }
273
+ /**
274
+ * Stake for a challenge
275
+ */
276
+ async stakeChallengeDeposit(challengeId, amount) {
277
+ this.requireSession();
278
+ return this.session.link.transact({
279
+ actions: [
280
+ {
281
+ account: 'eosio.token',
282
+ name: 'transfer',
283
+ authorization: [
284
+ {
285
+ actor: this.session.auth.actor,
286
+ permission: this.session.auth.permission,
287
+ },
288
+ ],
289
+ data: {
290
+ from: this.session.auth.actor,
291
+ to: this.contract,
292
+ quantity: amount,
293
+ memo: `challenge:${challengeId}`,
294
+ },
295
+ },
296
+ ],
297
+ });
298
+ }
299
+ /**
300
+ * Set validator active status
301
+ */
302
+ async setValidatorStatus(active) {
303
+ this.requireSession();
304
+ return this.session.link.transact({
305
+ actions: [
306
+ {
307
+ account: this.contract,
308
+ name: 'setvalstat',
309
+ authorization: [
310
+ {
311
+ actor: this.session.auth.actor,
312
+ permission: this.session.auth.permission,
313
+ },
314
+ ],
315
+ data: {
316
+ account: this.session.auth.actor,
317
+ active,
318
+ },
319
+ },
320
+ ],
321
+ });
322
+ }
323
+ /**
324
+ * Request to unstake validator funds (time-delayed).
325
+ * Must be deactivated and have no pending challenges first.
326
+ *
327
+ * @param amount - Amount to unstake in smallest units
328
+ */
329
+ async unstake(amount) {
330
+ this.requireSession();
331
+ return this.session.link.transact({
332
+ actions: [
333
+ {
334
+ account: this.contract,
335
+ name: 'unstake',
336
+ authorization: [
337
+ {
338
+ actor: this.session.auth.actor,
339
+ permission: this.session.auth.permission,
340
+ },
341
+ ],
342
+ data: {
343
+ account: this.session.auth.actor,
344
+ amount,
345
+ },
346
+ },
347
+ ],
348
+ });
349
+ }
350
+ /**
351
+ * Withdraw unstaked validator funds (after delay period)
352
+ *
353
+ * @param unstakeId - The ID of the unstake request to withdraw
354
+ */
355
+ async withdraw(unstakeId) {
356
+ this.requireSession();
357
+ return this.session.link.transact({
358
+ actions: [
359
+ {
360
+ account: this.contract,
361
+ name: 'withdraw',
362
+ authorization: [
363
+ {
364
+ actor: this.session.auth.actor,
365
+ permission: this.session.auth.permission,
366
+ },
367
+ ],
368
+ data: {
369
+ account: this.session.auth.actor,
370
+ unstake_id: unstakeId,
371
+ },
372
+ },
373
+ ],
374
+ });
375
+ }
376
+ /**
377
+ * Cancel an unfunded challenge (within grace period or after deadline)
378
+ */
379
+ async cancelChallenge(challengeId) {
380
+ this.requireSession();
381
+ return this.session.link.transact({
382
+ actions: [
383
+ {
384
+ account: this.contract,
385
+ name: 'cancelchal',
386
+ authorization: [
387
+ {
388
+ actor: this.session.auth.actor,
389
+ permission: this.session.auth.permission,
390
+ },
391
+ ],
392
+ data: {
393
+ challenger: this.session.auth.actor,
394
+ challenge_id: challengeId,
395
+ },
396
+ },
397
+ ],
398
+ });
399
+ }
400
+ /**
401
+ * Resolve a validation challenge (owner only)
402
+ */
403
+ async resolve(challengeId, upheld, resolutionNotes) {
404
+ this.requireSession();
405
+ return this.session.link.transact({
406
+ actions: [
407
+ {
408
+ account: this.contract,
409
+ name: 'resolve',
410
+ authorization: [
411
+ {
412
+ actor: this.session.auth.actor,
413
+ permission: this.session.auth.permission,
414
+ },
415
+ ],
416
+ data: {
417
+ resolver: this.session.auth.actor,
418
+ challenge_id: challengeId,
419
+ upheld,
420
+ resolution_notes: resolutionNotes,
421
+ },
422
+ },
423
+ ],
424
+ });
425
+ }
426
+ /**
427
+ * Expire an unfunded challenge (permissionless cleanup)
428
+ */
429
+ async expireUnfundedChallenge(challengeId) {
430
+ this.requireSession();
431
+ return this.session.link.transact({
432
+ actions: [
433
+ {
434
+ account: this.contract,
435
+ name: 'expireunfund',
436
+ authorization: [
437
+ {
438
+ actor: this.session.auth.actor,
439
+ permission: this.session.auth.permission,
440
+ },
441
+ ],
442
+ data: {
443
+ challenge_id: challengeId,
444
+ },
445
+ },
446
+ ],
447
+ });
448
+ }
449
+ /**
450
+ * Expire a funded challenge that was not resolved within timeout (permissionless cleanup)
451
+ */
452
+ async expireFundedChallenge(challengeId) {
453
+ this.requireSession();
454
+ return this.session.link.transact({
455
+ actions: [
456
+ {
457
+ account: this.contract,
458
+ name: 'expirefunded',
459
+ authorization: [
460
+ {
461
+ actor: this.session.auth.actor,
462
+ permission: this.session.auth.permission,
463
+ },
464
+ ],
465
+ data: {
466
+ challenge_id: challengeId,
467
+ },
468
+ },
469
+ ],
470
+ });
471
+ }
472
+ /**
473
+ * Submit validation with fee in one transaction.
474
+ *
475
+ * @param data - Validation data
476
+ * @param amount - The validation fee (e.g., "1.0000 XPR")
477
+ */
478
+ async validateWithFee(data, amount) {
479
+ this.requireSession();
480
+ const actor = this.session.auth.actor;
481
+ return this.session.link.transact({
482
+ actions: [
483
+ {
484
+ account: 'eosio.token',
485
+ name: 'transfer',
486
+ authorization: [{
487
+ actor,
488
+ permission: this.session.auth.permission,
489
+ }],
490
+ data: {
491
+ from: actor,
492
+ to: this.contract,
493
+ quantity: amount,
494
+ memo: `valfee:${actor}`,
495
+ },
496
+ },
497
+ {
498
+ account: this.contract,
499
+ name: 'validate',
500
+ authorization: [{
501
+ actor,
502
+ permission: this.session.auth.permission,
503
+ }],
504
+ data: {
505
+ validator: actor,
506
+ agent: data.agent,
507
+ job_hash: data.job_hash,
508
+ result: (0, utils_1.validationResultToNumber)(data.result),
509
+ confidence: data.confidence,
510
+ evidence_uri: data.evidence_uri || '',
511
+ },
512
+ },
513
+ ],
514
+ });
515
+ }
516
+ /**
517
+ * Clean up old validations (permissionless)
518
+ */
519
+ async cleanValidations(agent, maxAge, maxDelete) {
520
+ this.requireSession();
521
+ return this.session.link.transact({
522
+ actions: [{
523
+ account: this.contract,
524
+ name: 'cleanvals',
525
+ authorization: [{
526
+ actor: this.session.auth.actor,
527
+ permission: this.session.auth.permission,
528
+ }],
529
+ data: {
530
+ agent,
531
+ max_age: maxAge,
532
+ max_delete: maxDelete,
533
+ },
534
+ }],
535
+ });
536
+ }
537
+ /**
538
+ * Clean up resolved challenges (permissionless)
539
+ */
540
+ async cleanChallenges(maxAge, maxDelete) {
541
+ this.requireSession();
542
+ return this.session.link.transact({
543
+ actions: [{
544
+ account: this.contract,
545
+ name: 'cleanchals',
546
+ authorization: [{
547
+ actor: this.session.auth.actor,
548
+ permission: this.session.auth.permission,
549
+ }],
550
+ data: {
551
+ max_age: maxAge,
552
+ max_delete: maxDelete,
553
+ },
554
+ }],
555
+ });
556
+ }
557
+ /**
558
+ * Get validation contract configuration
559
+ */
560
+ async getConfig() {
561
+ const result = await this.rpc.get_table_rows({
562
+ json: true,
563
+ code: this.contract,
564
+ scope: this.contract,
565
+ table: 'config',
566
+ limit: 1,
567
+ });
568
+ if (result.rows.length === 0) {
569
+ throw new Error('Contract not initialized');
570
+ }
571
+ const row = result.rows[0];
572
+ return {
573
+ owner: row.owner,
574
+ core_contract: row.core_contract,
575
+ min_stake: (0, utils_1.safeParseInt)(row.min_stake),
576
+ challenge_stake: (0, utils_1.safeParseInt)(row.challenge_stake),
577
+ unstake_delay: (0, utils_1.safeParseInt)(row.unstake_delay),
578
+ challenge_window: (0, utils_1.safeParseInt)(row.challenge_window),
579
+ slash_percent: (0, utils_1.safeParseInt)(row.slash_percent),
580
+ dispute_period: (0, utils_1.safeParseInt)(row.dispute_period),
581
+ funded_challenge_timeout: (0, utils_1.safeParseInt)(row.funded_challenge_timeout),
582
+ paused: row.paused === 1,
583
+ validation_fee: (0, utils_1.safeParseInt)(row.validation_fee),
584
+ };
585
+ }
586
+ // ============== HELPERS ==============
587
+ requireSession() {
588
+ if (!this.session) {
589
+ throw new Error('Session required for write operations');
590
+ }
591
+ }
592
+ parseValidator(raw) {
593
+ return {
594
+ account: raw.account,
595
+ stake: (0, utils_1.safeParseInt)(raw.stake),
596
+ method: raw.method,
597
+ specializations: (0, utils_1.parseSpecializations)(raw.specializations),
598
+ total_validations: (0, utils_1.safeParseInt)(raw.total_validations),
599
+ incorrect_validations: (0, utils_1.safeParseInt)(raw.incorrect_validations),
600
+ accuracy_score: (0, utils_1.safeParseInt)(raw.accuracy_score),
601
+ pending_challenges: (0, utils_1.safeParseInt)(raw.pending_challenges),
602
+ registered_at: (0, utils_1.safeParseInt)(raw.registered_at),
603
+ active: raw.active === 1,
604
+ };
605
+ }
606
+ parseValidation(raw) {
607
+ return {
608
+ id: (0, utils_1.safeParseInt)(raw.id),
609
+ validator: raw.validator,
610
+ agent: raw.agent,
611
+ job_hash: raw.job_hash,
612
+ result: (0, utils_1.validationResultFromNumber)(raw.result),
613
+ confidence: raw.confidence,
614
+ evidence_uri: raw.evidence_uri,
615
+ challenged: raw.challenged === 1,
616
+ timestamp: (0, utils_1.safeParseInt)(raw.timestamp),
617
+ };
618
+ }
619
+ parseChallenge(raw) {
620
+ return {
621
+ id: (0, utils_1.safeParseInt)(raw.id),
622
+ validation_id: (0, utils_1.safeParseInt)(raw.validation_id),
623
+ challenger: raw.challenger,
624
+ reason: raw.reason,
625
+ evidence_uri: raw.evidence_uri,
626
+ stake: (0, utils_1.safeParseInt)(raw.stake),
627
+ status: (0, utils_1.disputeStatusFromNumber)(raw.status),
628
+ resolver: raw.resolver,
629
+ resolution_notes: raw.resolution_notes,
630
+ created_at: (0, utils_1.safeParseInt)(raw.created_at),
631
+ resolved_at: (0, utils_1.safeParseInt)(raw.resolved_at),
632
+ funding_deadline: (0, utils_1.safeParseInt)(raw.funding_deadline),
633
+ funded_at: (0, utils_1.safeParseInt)(raw.funded_at),
634
+ };
635
+ }
636
+ }
637
+ exports.ValidationRegistry = ValidationRegistry;
638
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmFsaWRhdGlvblJlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1ZhbGlkYXRpb25SZWdpc3RyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFjQSxtQ0FNaUI7QUFFakIsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUM7QUFFdEMsTUFBYSxrQkFBa0I7SUFLN0IsWUFBWSxHQUFZLEVBQUUsT0FBdUIsRUFBRSxRQUFpQjtRQUNsRSxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxJQUFJLElBQUksQ0FBQztRQUMvQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsSUFBSSxnQkFBZ0IsQ0FBQztJQUMvQyxDQUFDO0lBRUQsZ0RBQWdEO0lBRWhEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFlO1FBQ2hDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQWU7WUFDekQsSUFBSSxFQUFFLElBQUk7WUFDVixJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDbkIsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3BCLEtBQUssRUFBRSxZQUFZO1lBQ25CLFdBQVcsRUFBRSxPQUFPO1lBQ3BCLFdBQVcsRUFBRSxPQUFPO1lBQ3BCLEtBQUssRUFBRSxDQUFDO1NBQ1QsQ0FBQyxDQUFDO1FBRUgsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDMUMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsY0FBYyxDQUFDLFVBQWdDLEVBQUU7UUFDckQsTUFBTSxFQUFFLEtBQUssR0FBRyxHQUFHLEVBQUUsV0FBVyxHQUFH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LEdBQUcsQ0FBQyxVQUFVO1lBQzFCLFlBQVksRUFBRSxHQUFHLENBQUMsWUFBWTtZQUM5QixVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVUsS0FBSyxDQUFDO1lBQ2hDLFNBQVMsRUFBRSxJQUFBLG9CQUFZLEVBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztTQUN2QyxDQUFDO0lBQ0osQ0FBQztJQUVPLGNBQWMsQ0FBQyxHQWN0QjtRQUNDLE9BQU87WUFDTCxFQUFFLEVBQUUsSUFBQSxvQkFBWSxFQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEIsYUFBYSxFQUFFLElBQUEsb0JBQVksRUFBQyxHQUFHLENBQUMsYUFBYSxDQUFDO1lBQzlDLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVTtZQUMxQixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU07WUFDbEIsWUFBWSxFQUFFLEdBQUcsQ0FBQyxZQUFZO1lBQzlCLEtBQUssRUFBRSxJQUFBLG9CQUFZLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUM5QixNQUFNLEVBQUUsSUFBQSwrQkFBdUIsRUFBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQzNDLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtZQUN0QixnQkFBZ0IsRUFBRSxHQUFHLENBQUMsZ0JBQWdCO1lBQ3RDLFVBQVUsRUFBRSxJQUFBLG9CQUFZLEVBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztZQUN4QyxXQUFXLEVBQUUsSUFBQSxvQkFBWSxFQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7WUFDMUMsZ0JBQWdCLEVBQUUsSUFBQSxvQkFBWSxFQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztZQUNwRCxTQUFTLEVBQUUsSUFBQSxvQkFBWSxFQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7U0FDdkMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQWx3QkQsZ0RBa3dCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFZhbGlkYXRvcixcbiAgVmFsaWRhdG9yUmF3LFxuICBWYWxpZGF0aW9uLFxuICBWYWxpZGF0aW9uUmF3LFxuICBWYWxpZGF0aW9uQ29uZmlnLFxuICBDaGFsbGVuZ2UsXG4gIFZhbGlkYXRvckxpc3RPcHRpb25zLFxuICBTdWJtaXRWYWxpZGF0aW9uRGF0YSxcbiAgVHJhbnNhY3Rpb25SZXN1bHQsXG4gIEpzb25ScGMsXG4gIFByb3RvblNlc3Npb24sXG4gIFZhbGlkYXRpb25SZXN1bHQsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgcGFyc2VTcGVjaWFsaXphdGlvbnMsXG4gIHZhbGlkYXRpb25SZXN1bHRGcm9tTnVtYmVyLFxuICB2YWxpZGF0aW9uUmVzdWx0VG9OdW1iZXIsXG4gIGRpc3B1dGVTdGF0dXNGcm9tTnVtYmVyLFxuICBzYWZlUGFyc2VJbnQsXG59IGZyb20gJy4vdXRpbHMnO1xuXG5jb25zdCBERUZBVUxUX0NPTlRSQUNUID0gJ2FnZW50dmFsaWQnO1xuXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvblJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSBycGM6IEpzb25ScGM7XG4gIHByaXZhdGUgc2Vzc2lvbjogUHJvdG9uU2Vzc2lvbiB8IG51bGw7XG4gIHByaXZhdGUgY29udHJhY3Q6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihycGM6IEpzb25ScGMsIHNlc3Npb24/OiBQcm90b25TZXNzaW9uLCBjb250cmFjdD86IHN0cmluZykge1xuICAgIHRoaXMucnBjID0gcnBjO1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb24gfHwgbnVsbDtcbiAgICB0aGlzLmNvbnRyYWN0ID0gY29udHJhY3QgfHwgREVGQVVMVF9DT05UUkFDVDtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09IFJFQUQgT1BFUkFUSU9OUyA9PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZXQgYSB2YWxpZGF0b3IgYnkgYWNjb3VudFxuICAgKi9cbiAgYXN5bmMgZ2V0VmFsaWRhdG9yKGFjY291bnQ6IHN0cmluZyk6IFByb21pc2U8VmFsaWRhdG9yIHwgbnVsbD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnBjLmdldF90YWJsZV9yb3dzPFZhbGlkYXRvclJhdz4oe1xuICAgICAganNvbjogdHJ1ZSxcbiAgICAgIGNvZGU6IHRoaXMuY29udHJhY3QsXG4gICAgICBzY29wZTogdGhpcy5jb250cmFjdCxcbiAgICAgIHRhYmxlOiAndmFsaWRhdG9ycycsXG4gICAgICBsb3dlcl9ib3VuZDogYWNjb3VudCxcbiAgICAgIHVwcGVyX2JvdW5kOiBhY2NvdW50LFxuICAgICAgbGltaXQ6IDEsXG4gICAgfSk7XG5cbiAgICBpZiAocmVzdWx0LnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5wYXJzZVZhbGlkYXRvcihyZXN1bHQucm93c1swXSk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhbGwgdmFsaWRhdG9yc1xuICAgKi9cbiAgYXN5bmMgbGlzdFZhbGlkYXRvcnMob3B0aW9uczogVmFsaWRhdG9yTGlzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VmFsaWRhdG9yW10+IHtcbiAgICBjb25zdCB7IGxpbWl0ID0gMTAwLCBhY3RpdmVfb25seSA9IHRydWUgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJwYy5nZXRfdGFibGVfcm93czxWYWxpZGF0b3JSYXc+KHtcbiAgICAgIGpzb246IHRydWUsXG4gICAgICBjb2RlOiB0aGlzLmNvbnRyYWN0LFxuICAgICAgc2NvcGU6IHRoaXMuY29udHJhY3QsXG4gICAgICB0YWJsZTogJ3ZhbGlkYXRvcnMnLFxuICAgICAgbGltaXQsXG4gICAgfSk7XG5cbiAgICBsZXQgdmFsaWRhdG9ycyA9IHJlc3VsdC5yb3dzLm1hcCgocm93KSA9PiB0aGlzLnBhcnNlVmFsaWRhdG9yKHJvdykpO1xuXG4gICAgaWYgKGFjdGl2ZV9vbmx5KSB7XG4gICAgICB2YWxpZGF0b3JzID0gdmFsaWRhdG9ycy5maWx0ZXIoKHYpID0+IHYuYWN0aXZlKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5taW5fc3Rha2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsaWRhdG9ycyA9IHZhbGlkYXRvcnMuZmlsdGVyKCh2KSA9PiB2LnN0YWtlID49IG9wdGlvbnMubWluX3N0YWtlISk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubWluX2FjY3VyYWN5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbGlkYXRvcnMgPSB2YWxpZGF0b3JzLmZpbHRlcigodikgPT4gdi5hY2N1cmFjeV9zY29yZSA+PSBvcHRpb25zLm1pbl9hY2N1cmFjeSEpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNwZWNpYWxpemF0aW9uKSB7XG4gICAgICB2YWxpZGF0b3JzID0gdmFsaWRhdG9ycy5maWx0ZXIoKHYpID0+XG4gICAgICAgIHYuc3BlY2lhbGl6YXRpb25zLmluY2x1ZGVzKG9wdGlvbnMuc3BlY2lhbGl6YXRpb24hKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdG9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdmFsaWRhdGlvbiBieSBJRFxuICAgKi9cbiAgYXN5bmMgZ2V0VmFsaWRhdGlvbihpZDogbnVtYmVyKTogUHJvbWlzZTxWYWxpZGF0aW9uIHwgbnVsbD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnBjLmdldF90YWJsZV9yb3dzPFZhbGlkYXRpb25SYXc+KHtcbiAgICAgIGpzb246IHRydWUsXG4gICAgICBjb2RlOiB0aGlzLmNvbnRyYWN0LFxuICAgICAgc2NvcGU6IHRoaXMuY29udHJhY3QsXG4gICAgICB0YWJsZTogJ3ZhbGlkYXRpb25zJyxcbiAgICAgIGxvd2VyX2JvdW5kOiBTdHJpbmcoaWQpLFxuICAgICAgdXBwZXJfYm91bmQ6IFN0cmluZyhpZCksXG4gICAgICBsaW1pdDogMSxcbiAgICB9KTtcblxuICAgIGlmIChyZXN1bHQucm93cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnBhcnNlVmFsaWRhdGlvbihyZXN1bHQucm93c1swXSk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB2YWxpZGF0aW9ucyBmb3IgYW4gYWdlbnRcbiAgICovXG4gIGFzeW5jIGxpc3RWYWxpZGF0aW9uc0ZvckFnZW50KGFnZW50OiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgPSAxMDApOiBQcm9taXNlPFZhbGlkYXRpb25bXT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnBjLmdldF90YWJsZV9yb3dzPFZhbGlkYXRpb25SYXc+KHtcbiAgICAgIGpzb246IHRydWUsXG4gICAgICBjb2RlOiB0aGlzLmNvbnRyYWN0LFxuICAgICAgc2NvcGU6IHRoaXMuY29udHJhY3QsXG4gICAgICB0YWJsZTogJ3ZhbGlkYXRpb25zJyxcbiAgICAgIGluZGV4X3Bvc2l0aW9uOiAyLFxuICAgICAga2V5X3R5cGU6ICdpNjQnLFxuICAgICAgbGltaXQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0LnJvd3NcbiAgICAgIC5maWx0ZXIoKHJvdykgPT4gcm93LmFnZW50ID09PSBhZ2VudClcbiAgICAgIC5tYXAoKHJvdykgPT4gdGhpcy5wYXJzZVZhbGlkYXRpb24ocm93KSk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB2YWxpZGF0aW9ucyBieSBhIHZhbGlkYXRvclxuICAgKi9cbiAgYXN5bmMgbGlzdFZhbGlkYXRpb25zQnlWYWxpZGF0b3IoXG4gICAgdmFsaWRhdG9yOiBzdHJpbmcsXG4gICAgbGltaXQ6IG51bWJlciA9IDEwMFxuICApOiBQcm9taXNlPFZhbGlkYXRpb25bXT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnBjLmdldF90YWJsZV9yb3dzPFZhbGlkYXRpb25SYXc+KHtcbiAgICAgIGpzb246IHRydWUsXG4gICAgICBjb2RlOiB0aGlzLmNvbnRyYWN0LFxuICAgICAgc2NvcGU6IHRoaXMuY29udHJhY3QsXG4gICAgICB0YWJsZTogJ3ZhbGlkYXRpb25zJyxcbiAgICAgIGluZGV4X3Bvc2l0aW9uOiAzLFxuICAgICAga2V5X3R5cGU6ICdpNjQnLFxuICAgICAgbGltaXQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0LnJvd3NcbiAgICAgIC5maWx0ZXIoKHJvdykgPT4gcm93LnZhbGlkYXRvciA9PT0gdmFsaWRhdG9yKVxuICAgICAgLm1hcCgocm93KSA9PiB0aGlzLnBhcnNlVmFsaWRhdGlvbihyb3cpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2hhbGxlbmdlIGJ5IElEXG4gICAqL1xuICBhc3luYyBnZXRDaGFsbGVuZ2UoaWQ6IG51bWJlcik6IFByb21pc2U8Q2hhbGxlbmdlIHwgbnVsbD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnBjLmdldF90YWJsZV9yb3dzPHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICB2YWxpZGF0aW9uX2lkOiBzdHJpbmc7XG4gICAgICBjaGFsbGVuZ2VyOiBzdHJpbmc7XG4gICAgICByZWFzb246IHN0cmluZztcbiAgICAgIGV2aWRlbmNlX3VyaTogc3RyaW5nO1xuICAgICAgc3Rha2U6IHN0cmluZztcbiAgICAgIHN0YXR1czogbnVtYmVyO1xuICAgICAgcmVzb2x2ZXI6IHN0cmluZztcbiAgICAgIHJlc29sdXRpb25fbm90ZXM6IHN0cmluZztcbiAgICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAgIHJlc29sdmVkX2F0OiBzdHJpbmc7XG4gICAgICBmdW5kaW5nX2RlYWRsaW5lOiBzdHJpbmc7XG4gICAgICBmdW5kZWRfYXQ6IHN0cmluZztcbiAgICB9Pih7XG4gICAgICBqc29uOiB0cnVlLFxuICAgICAgY29kZTogdGhpcy5jb250cmFjdCxcbiAgICAgIHNjb3BlOiB0aGlzLmNvbnRyYWN0LFxuICAgICAgdGFibGU6ICdjaGFsbGVuZ2VzJyxcbiAgICAgIGxvd2VyX2JvdW5kOiBTdHJpbmcoaWQpLFxuICAgICAgdXBwZXJfYm91bmQ6IFN0cmluZyhpZCksXG4gICAgICBsaW1pdDogMSxcbiAgICB9KTtcblxuICAgIGlmIChyZXN1bHQucm93cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnBhcnNlQ2hhbGxlbmdlKHJlc3VsdC5yb3dzWzBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2hhbGxlbmdlcyBmb3IgYSB2YWxpZGF0aW9uXG4gICAqL1xuICBhc3luYyBnZXRDaGFsbGVuZ2VzRm9yVmFsaWRhdGlvbih2YWxpZGF0aW9uSWQ6IG51bWJlcik6IFByb21pc2U8Q2hhbGxlbmdlW10+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJwYy5nZXRfdGFibGVfcm93czx7XG4gICAgICBpZDogc3RyaW5nO1xuICAgICAgdmFsaWRhdGlvbl9pZDogc3RyaW5nO1xuICAgICAgY2hhbGxlbmdlcjogc3RyaW5nO1xuICAgICAgcmVhc29uOiBzdHJpbmc7XG4gICAgICBldmlkZW5jZV91cmk6IHN0cmluZztcbiAgICAgIHN0YWtlOiBzdHJpbmc7XG4gICAgICBzdGF0dXM6IG51bWJlcjtcbiAgICAgIHJlc29sdmVyOiBzdHJpbmc7XG4gICAgICByZXNvbHV0aW9uX25vdGVzOiBzdHJpbmc7XG4gICAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgICByZXNvbHZlZF9hdDogc3RyaW5nO1xuICAgICAgZnVuZGluZ19kZWFkbGluZTogc3RyaW5nO1xuICAgICAgZnVuZGVkX2F0OiBzdHJpbmc7XG4gICAgfT4oe1xuICAgICAganNvbjogdHJ1ZSxcbiAgICAgIGNvZGU6IHRoaXMuY29udHJhY3QsXG4gICAgICBzY29wZTogdGhpcy5jb250cmFjdCxcbiAgICAgIHRhYmxlOiAnY2hhbGxlbmdlcycsXG4gICAgICBpbmRleF9wb3NpdGlvbjogMixcbiAgICAgIGtleV90eXBlOiAnaTY0JyxcbiAgICAgIGxpbWl0OiAxMDAsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0LnJvd3NcbiAgICAgIC5maWx0ZXIoKHJvdykgPT4gcm93LnZhbGlkYXRpb25faWQgPT09IFN0cmluZyh2YWxpZGF0aW9uSWQpKVxuICAgICAgLm1hcCgocm93KSA9PiB0aGlzLnBhcnNlQ2hhbGxlbmdlKHJvdykpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT0gV1JJVEUgT1BFUkFUSU9OUyA9PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhcyBhIHZhbGlkYXRvclxuICAgKi9cbiAgYXN5bmMgcmVnaXN0ZXJWYWxpZGF0b3IoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgc3BlY2lhbGl6YXRpb25zOiBzdHJpbmdbXVxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uUmVzdWx0PiB7XG4gICAgdGhpcy5yZXF1aXJlU2Vzc2lvbigpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbiEubGluay50cmFuc2FjdCh7XG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhY2NvdW50OiB0aGlzLmNvbnRyYWN0LFxuICAgICAgICAgIG5hbWU6ICdyZWd2YWwnLFxuICAgICAgICAgIGF1dGhvcml6YXRpb246IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWN0b3I6IHRoaXMuc2Vzc2lvbiEuYXV0aC5hY3RvcixcbiAgICAgICAgICAgICAgcGVybWlzc2lvbjogdGhpcy5zZXNzaW9uIS5hdXRoLnBlcm1pc3Npb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgYWNjb3VudDogdGhpcy5zZXNzaW9uIS5hdXRoLmFjdG9yLFxuICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgc3BlY2lhbGl6YXRpb25zOiBKU09OLnN0cmluZ2lmeShzcGVjaWFsaXphdGlvbnMpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB2YWxpZGF0b3IgaW5mb1xuICAgKi9cbiAgYXN5bmMgdXBkYXRlVmFsaWRhdG9yKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHNwZWNpYWxpemF0aW9uczogc3RyaW5nW11cbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIHRoaXMucmVxdWlyZVNlc3Npb24oKTtcblxuICAgIHJldHVybiB0aGlzLnNlc3Npb24hLmxpbmsudHJhbnNhY3Qoe1xuICAgICAgYWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgYWNjb3VudDogdGhpcy5jb250cmFjdCxcbiAgICAgICAgICBuYW1lOiAndXBkYXRldmFsJyxcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFjdG9yOiB0aGlzLnNlc3Npb24hLmF1dGguYWN0b3IsXG4gICAgICAgICAgICAgIHBlcm1pc3Npb246IHRoaXMuc2Vzc2lvbiEuYXV0aC5wZXJtaXNzaW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGFjY291bnQ6IHRoaXMuc2Vzc2lvbiEuYXV0aC5hY3RvcixcbiAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgIHNwZWNpYWxpemF0aW9uczogSlNPTi5zdHJpbmdpZnkoc3BlY2lhbGl6YXRpb25zKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFrZSBYUFIgYXMgdmFsaWRhdG9yXG4gICAqL1xuICBhc3luYyBzdGFrZShhbW91bnQ6IHN0cmluZyk6IFByb21pc2U8VHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICB0aGlzLnJlcXVpcmVTZXNzaW9uKCk7XG5cbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uIS5saW5rLnRyYW5zYWN0KHtcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGFjY291bnQ6ICdlb3Npby50b2tlbicsXG4gICAgICAgICAgbmFtZTogJ3RyYW5zZmVyJyxcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFjdG9yOiB0aGlzLnNlc3Npb24hLmF1dGguYWN0b3IsXG4gICAgICAgICAgICAgIHBlcm1pc3Npb246IHRoaXMuc2Vzc2lvbiEuYXV0aC5wZXJtaXNzaW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGZyb206IHRoaXMuc2Vzc2lvbiEuYXV0aC5hY3RvcixcbiAgICAgICAgICAgIHRvOiB0aGlzLmNvbnRyYWN0LFxuICAgICAgICAgICAgcXVhbnRpdHk6IGFtb3VudCxcbiAgICAgICAgICAgIG1lbW86ICdzdGFrZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0IHZhbGlkYXRpb25cbiAgICovXG4gIGFzeW5jIHZhbGlkYXRlKGRhdGE6IFN1Ym1pdFZhbGlkYXRpb25EYXRhKTogUHJvbWlzZTxUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIHRoaXMucmVxdWlyZVNlc3Npb24oKTtcblxuICAgIHJldHVybiB0aGlzLnNlc3Npb24hLmxpbmsudHJhbnNhY3Qoe1xuICAgICAgYWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgYWNjb3VudDogdGhpcy5jb250cmFjdCxcbiAgICAgICAgICBuYW1lOiAndmFsaWRhdGUnLFxuICAgICAgICAgIGF1dGhvcml6YXRpb246IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWN0b3I6IHRoaXMuc2Vzc2lvbiEuYXV0aC5hY3RvcixcbiAgICAgICAgICAgICAgcGVybWlzc2lvbjogdGhpcy5zZXNzaW9uIS5hdXRoLnBlcm1pc3Npb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgdmFsaWRhdG9yOiB0aGlzLnNlc3Npb24hLmF1dGguYWN0b3IsXG4gICAgICAgICAgICBhZ2VudDogZGF0YS5hZ2VudCxcbiAgICAgICAgICAgIGpvYl9oYXNoOiBkYXRhLmpvYl9oYXNoLFxuICAgICAgICAgICAgcmVzdWx0OiB2YWxpZGF0aW9uUmVzdWx0VG9OdW1iZXIoZGF0YS5yZXN1bHQpLFxuICAgICAgICAgICAgY29uZmlkZW5jZTogZGF0YS5jb25maWRlbmNlLFxuICAgICAgICAgICAgZXZpZGVuY2VfdXJpOiBkYXRhLmV2aWRlbmNlX3VyaSB8fCAnJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFsbGVuZ2UgYSB2YWxpZGF0aW9uXG4gICAqL1xuICBhc3luYyBjaGFsbGVuZ2UoXG4gICAgdmFsaWRhdGlvbklkOiBudW1iZXIsXG4gICAgcmVhc29uOiBzdHJpbmcsXG4gICAgZXZpZGVuY2VVcmk/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIHRoaXMucmVxdWlyZVNlc3Npb24oKTtcblxuICAgIHJldHVybiB0aGlzLnNlc3Npb24hLmxpbmsudHJhbnNhY3Qoe1xuICAgICAgYWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgYWNjb3VudDogdGhpcy5jb250cmFjdCxcbiAgICAgICAgICBuYW1lOiAnY2hhbGxlbmdlJyxcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFjdG9yOiB0aGlzLnNlc3Npb24hLmF1dGguYWN0b3IsXG4gICAgICAgICAgICAgIHBlcm1pc3Npb246IHRoaXMuc2Vzc2lvbiEuYXV0aC5wZXJtaXNzaW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGNoYWxsZW5nZXI6IHRoaXMuc2Vzc2lvbiEuYXV0aC5hY3RvcixcbiAgICAgICAgICAgIHZhbGlkYXRpb25faWQ6IHZhbGlkYXRpb25JZCxcbiAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICAgIGV2aWRlbmNlX3VyaTogZXZpZGVuY2VVcmkgfHwgJycsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3Rha2UgZm9yIGEgY2hhbGxlbmdlXG4gICAqL1xuICBhc3luYyBzdGFrZUNoYWxsZW5nZURlcG9zaXQoXG4gICAgY2hhbGxlbmdlSWQ6IG51bWJlcixcbiAgICBhbW91bnQ6IHN0cmluZ1xuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uUmVzdWx0PiB7XG4gICAgdGhpcy5yZXF1aXJlU2Vzc2lvbigpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbiEubGluay50cmFuc2FjdCh7XG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhY2NvdW50OiAnZW9zaW8udG9rZW4nLFxuICAgICAgICAgIG5hbWU6ICd0cmFuc2ZlcicsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhY3RvcjogdGhpcy5zZXNzaW9uIS5hdXRoLmFjdG9yLFxuICAgICAgICAgICAgICBwZXJtaXNzaW9uOiB0aGlzLnNlc3Npb24hLmF1dGgucGVybWlzc2lvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBmcm9tOiB0aGlzLnNlc3Npb24hLmF1dGguYWN0b3IsXG4gICAgICAgICAgICB0bzogdGhpcy5jb250cmFjdCxcbiAgICAgICAgICAgIHF1YW50aXR5OiBhbW91bnQsXG4gICAgICAgICAgICBtZW1vOiBgY2hhbGxlbmdlOiR7Y2hhbGxlbmdlSWR9YCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdmFsaWRhdG9yIGFjdGl2ZSBzdGF0dXNcbiAgICovXG4gIGFzeW5jIHNldFZhbGlkYXRvclN0YXR1cyhhY3RpdmU6IGJvb2xlYW4pOiBQcm9taXNlPFRyYW5zYWN0aW9uUmVzdWx0PiB7XG4gICAgdGhpcy5yZXF1aXJlU2Vzc2lvbigpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbiEubGluay50cmFuc2FjdCh7XG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhY2NvdW50OiB0aGlzLmNvbnRyYWN0LFxuICAgICAgICAgIG5hbWU6ICdzZXR2YWxzdGF0JyxcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFjdG9yOiB0aGlzLnNlc3Npb24hLmF1dGguYWN0b3IsXG4gICAgICAgICAgICAgIHBlcm1pc3Npb246IHRoaXMuc2Vzc2lvbiEuYXV0aC5wZXJtaXNzaW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGFjY291bnQ6IHRoaXMuc2Vzc2lvbiEuYXV0aC5hY3RvcixcbiAgICAgICAgICAgIGFjdGl2ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHRvIHVuc3Rha2UgdmFsaWRhdG9yIGZ1bmRzICh0aW1lLWRlbGF5ZWQpLlxuICAgKiBNdXN0IGJlIGRlYWN0aXZhdGVkIGFuZCBoYXZlIG5vIHBlbmRpbmcgY2hhbGxlbmdlcyBmaXJzdC5cbiAgICpcbiAgICogQHBhcmFtIGFtb3VudCAtIEFtb3VudCB0byB1bnN0YWtlIGluIHNtYWxsZXN0IHVuaXRzXG4gICAqL1xuICBhc3luYyB1bnN0YWtlKGFtb3VudDogbnVtYmVyKTogUHJvbWlzZTxUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIHRoaXMucmVxdWlyZVNlc3Npb24oKTtcblxuICAgIHJldHVybiB0aGlzLnNlc3Npb24hLmxpbmsudHJhbnNhY3Qoe1xuICAgICAgYWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgYWNjb3VudDogdGhpcy5jb250cmFjdCxcbiAgICAgICAgICBuYW1lOiAndW5zdGFrZScsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhY3RvcjogdGhpcy5zZXNzaW9uIS5hdXRoLmFjdG9yLFxuICAgICAgICAgICAgICBwZXJtaXNzaW9uOiB0aGlzLnNlc3Npb24hLmF1dGgucGVybWlzc2lvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBhY2NvdW50OiB0aGlzLnNlc3Npb24hLmF1dGguYWN0b3IsXG4gICAgICAgICAgICBhbW91bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogV2l0aGRyYXcgdW5zdGFrZWQgdmFsaWRhdG9yIGZ1bmRzIChhZnRlciBkZWxheSBwZXJpb2QpXG4gICAqXG4gICAqIEBwYXJhbSB1bnN0YWtlSWQgLSBUaGUgSUQgb2YgdGhlIHVuc3Rha2UgcmVxdWVzdCB0byB3aXRoZHJhd1xuICAgKi9cbiAgYXN5bmMgd2l0aGRyYXcodW5zdGFrZUlkOiBudW1iZXIpOiBQcm9taXNlPFRyYW5zYWN0aW9uUmVzdWx0PiB7XG4gICAgdGhpcy5yZXF1aXJlU2Vzc2lvbigpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbiEubGluay50cmFuc2FjdCh7XG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhY2NvdW50OiB0aGlzLmNvbnRyYWN0LFxuICAgICAgICAgIG5hbWU6ICd3aXRoZHJhdycsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhY3RvcjogdGhpcy5zZXNzaW9uIS5hdXRoLmFjdG9yLFxuICAgICAgICAgICAgICBwZXJtaXNzaW9uOiB0aGlzLnNlc3Npb24hLmF1dGgucGVybWlzc2lvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBhY2NvdW50OiB0aGlzLnNlc3Npb24hLmF1dGguYWN0b3IsXG4gICAgICAgICAgICB1bnN0YWtlX2lkOiB1bnN0YWtlSWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIGFuIHVuZnVuZGVkIGNoYWxsZW5nZSAod2l0aGluIGdyYWNlIHBlcmlvZCBvciBhZnRlciBkZWFkbGluZSlcbiAgICovXG4gIGFzeW5jIGNhbmNlbENoYWxsZW5nZShjaGFsbGVuZ2VJZDogbnVtYmVyKTogUHJvbWlzZTxUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIHRoaXMucmVxdWlyZVNlc3Npb24oKTtcblxuICAgIHJldHVybiB0aGlzLnNlc3Npb24hLmxpbmsudHJhbnNhY3Qoe1xuICAgICAgYWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgYWNjb3VudDogdGhpcy5jb250cmFjdCxcbiAgICAgICAgICBuYW1lOiAnY2FuY2VsY2hhbCcsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhY3RvcjogdGhpcy5zZXNzaW9uIS5hdXRoLmFjdG9yLFxuICAgICAgICAgICAgICBwZXJtaXNzaW9uOiB0aGlzLnNlc3Npb24hLmF1dGgucGVybWlzc2lvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBjaGFsbGVuZ2VyOiB0aGlzLnNlc3Npb24hLmF1dGguYWN0b3IsXG4gICAgICAgICAgICBjaGFsbGVuZ2VfaWQ6IGNoYWxsZW5nZUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSB2YWxpZGF0aW9uIGNoYWxsZW5nZSAob3duZXIgb25seSlcbiAgICovXG4gIGFzeW5jIHJlc29sdmUoXG4gICAgY2hhbGxlbmdlSWQ6IG51bWJlcixcbiAgICB1cGhlbGQ6IGJvb2xlYW4sXG4gICAgcmVzb2x1dGlvbk5vdGVzOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIHRoaXMucmVxdWlyZVNlc3Npb24oKTtcblxuICAgIHJldHVybiB0aGlzLnNlc3Npb24hLmxpbmsudHJhbnNhY3Qoe1xuICAgICAgYWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgYWNjb3VudDogdGhpcy5jb250cmFjdCxcbiAgICAgICAgICBuYW1lOiAncmVzb2x2ZScsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhY3RvcjogdGhpcy5zZXNzaW9uIS5hdXRoLmFjdG9yLFxuICAgICAgICAgICAgICBwZXJtaXNzaW9uOiB0aGlzLnNlc3Npb24hLmF1dGgucGVybWlzc2lvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICByZXNvbHZlcjogdGhpcy5zZXNzaW9uIS5hdXRoLmFjdG9yLFxuICAgICAgICAgICAgY2hhbGxlbmdlX2lkOiBjaGFsbGVuZ2VJZCxcbiAgICAgICAgICAgIHVwaGVsZCxcbiAgICAgICAgICAgIHJlc29sdXRpb25fbm90ZXM6IHJlc29sdXRpb25Ob3RlcyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBpcmUgYW4gdW5mdW5kZWQgY2hhbGxlbmdlIChwZXJtaXNzaW9ubGVzcyBjbGVhbnVwKVxuICAgKi9cbiAgYXN5bmMgZXhwaXJlVW5mdW5kZWRDaGFsbGVuZ2UoY2hhbGxlbmdlSWQ6IG51bWJlcik6IFByb21pc2U8VHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICB0aGlzLnJlcXVpcmVTZXNzaW9uKCk7XG5cbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uIS5saW5rLnRyYW5zYWN0KHtcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGFjY291bnQ6IHRoaXMuY29udHJhY3QsXG4gICAgICAgICAgbmFtZTogJ2V4cGlyZXVuZnVuZCcsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhY3RvcjogdGhpcy5zZXNzaW9uIS5hdXRoLmFjdG9yLFxuICAgICAgICAgICAgICBwZXJtaXNzaW9uOiB0aGlzLnNlc3Npb24hLmF1dGgucGVybWlzc2lvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBjaGFsbGVuZ2VfaWQ6IGNoYWxsZW5nZUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGlyZSBhIGZ1bmRlZCBjaGFsbGVuZ2UgdGhhdCB3YXMgbm90IHJlc29sdmVkIHdpdGhpbiB0aW1lb3V0IChwZXJtaXNzaW9ubGVzcyBjbGVhbnVwKVxuICAgKi9cbiAgYXN5bmMgZXhwaXJlRnVuZGVkQ2hhbGxlbmdlKGNoYWxsZW5nZUlkOiBudW1iZXIpOiBQcm9taXNlPFRyYW5zYWN0aW9uUmVzdWx0PiB7XG4gICAgdGhpcy5yZXF1aXJlU2Vzc2lvbigpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbiEubGluay50cmFuc2FjdCh7XG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhY2NvdW50OiB0aGlzLmNvbnRyYWN0LFxuICAgICAgICAgIG5hbWU6ICdleHBpcmVmdW5kZWQnLFxuICAgICAgICAgIGF1dGhvcml6YXRpb246IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWN0b3I6IHRoaXMuc2Vzc2lvbiEuYXV0aC5hY3RvcixcbiAgICAgICAgICAgICAgcGVybWlzc2lvbjogdGhpcy5zZXNzaW9uIS5hdXRoLnBlcm1pc3Npb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgY2hhbGxlbmdlX2lkOiBjaGFsbGVuZ2VJZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXQgdmFsaWRhdGlvbiB3aXRoIGZlZSBpbiBvbmUgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gVmFsaWRhdGlvbiBkYXRhXG4gICAqIEBwYXJhbSBhbW91bnQgLSBUaGUgdmFsaWRhdGlvbiBmZWUgKGUuZy4sIFwiMS4wMDAwIFhQUlwiKVxuICAgKi9cbiAgYXN5bmMgdmFsaWRhdGVXaXRoRmVlKGRhdGE6IFN1Ym1pdFZhbGlkYXRpb25EYXRhLCBhbW91bnQ6IHN0cmluZyk6IFByb21pc2U8VHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICB0aGlzLnJlcXVpcmVTZXNzaW9uKCk7XG5cbiAgICBjb25zdCBhY3RvciA9IHRoaXMuc2Vzc2lvbiEuYXV0aC5hY3RvcjtcblxuICAgIHJldHVybiB0aGlzLnNlc3Npb24hLmxpbmsudHJhbnNhY3Qoe1xuICAgICAgYWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgYWNjb3VudDogJ2Vvc2lvLnRva2VuJyxcbiAgICAgICAgICBuYW1lOiAndHJhbnNmZXInLFxuICAgICAgICAgIGF1dGhvcml6YXRpb246IFt7XG4gICAgICAgICAgICBhY3RvcixcbiAgICAgICAgICAgIHBlcm1pc3Npb246IHRoaXMuc2Vzc2lvbiEuYXV0aC5wZXJtaXNzaW9uLFxuICAgICAgICAgIH1dLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGZyb206IGFjdG9yLFxuICAgICAgICAgICAgdG86IHRoaXMuY29udHJhY3QsXG4gICAgICAgICAgICBxdWFudGl0eTogYW1vdW50LFxuICAgICAgICAgICAgbWVtbzogYHZhbGZlZToke2FjdG9yfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGFjY291bnQ6IHRoaXMuY29udHJhY3QsXG4gICAgICAgICAgbmFtZTogJ3ZhbGlkYXRlJyxcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBbe1xuICAgICAgICAgICAgYWN0b3IsXG4gICAgICAgICAgICBwZXJtaXNzaW9uOiB0aGlzLnNlc3Npb24hLmF1dGgucGVybWlzc2lvbixcbiAgICAgICAgICB9XSxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB2YWxpZGF0b3I6IGFjdG9yLFxuICAgICAgICAgICAgYWdlbnQ6IGRhdGEuYWdlbnQsXG4gICAgICAgICAgICBqb2JfaGFzaDogZGF0YS5qb2JfaGFzaCxcbiAgICAgICAgICAgIHJlc3VsdDogdmFsaWRhdGlvblJlc3VsdFRvTnVtYmVyKGRhdGEucmVzdWx0KSxcbiAgICAgICAgICAgIGNvbmZpZGVuY2U6IGRhdGEuY29uZmlkZW5jZSxcbiAgICAgICAgICAgIGV2aWRlbmNlX3VyaTogZGF0YS5ldmlkZW5jZV91cmkgfHwgJycsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgb2xkIHZhbGlkYXRpb25zIChwZXJtaXNzaW9ubGVzcylcbiAgICovXG4gIGFzeW5jIGNsZWFuVmFsaWRhdGlvbnMoYWdlbnQ6IHN0cmluZywgbWF4QWdlOiBudW1iZXIsIG1heERlbGV0ZTogbnVtYmVyKTogUHJvbWlzZTxUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIHRoaXMucmVxdWlyZVNlc3Npb24oKTtcblxuICAgIHJldHVybiB0aGlzLnNlc3Npb24hLmxpbmsudHJhbnNhY3Qoe1xuICAgICAgYWN0aW9uczogW3tcbiAgICAgICAgYWNjb3VudDogdGhpcy5jb250cmFjdCxcbiAgICAgICAgbmFtZTogJ2NsZWFudmFscycsXG4gICAgICAgIGF1dGhvcml6YXRpb246IFt7XG4gICAgICAgICAgYWN0b3I6IHRoaXMuc2Vzc2lvbiEuYXV0aC5hY3RvcixcbiAgICAgICAgICBwZXJtaXNzaW9uOiB0aGlzLnNlc3Npb24hLmF1dGgucGVybWlzc2lvbixcbiAgICAgICAgfV0sXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBhZ2VudCxcbiAgICAgICAgICBtYXhfYWdlOiBtYXhBZ2UsXG4gICAgICAgICAgbWF4X2RlbGV0ZTogbWF4RGVsZXRlLFxuICAgICAgICB9LFxuICAgICAgfV0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgcmVzb2x2ZWQgY2hhbGxlbmdlcyAocGVybWlzc2lvbmxlc3MpXG4gICAqL1xuICBhc3luYyBjbGVhbkNoYWxsZW5nZXMobWF4QWdlOiBudW1iZXIsIG1heERlbGV0ZTogbnVtYmVyKTogUHJvbWlzZTxUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIHRoaXMucmVxdWlyZVNlc3Npb24oKTtcblxuICAgIHJldHVybiB0aGlzLnNlc3Npb24hLmxpbmsudHJhbnNhY3Qoe1xuICAgICAgYWN0aW9uczogW3tcbiAgICAgICAgYWNjb3VudDogdGhpcy5jb250cmFjdCxcbiAgICAgICAgbmFtZTogJ2NsZWFuY2hhbHMnLFxuICAgICAgICBhdXRob3JpemF0aW9uOiBbe1xuICAgICAgICAgIGFjdG9yOiB0aGlzLnNlc3Npb24hLmF1dGguYWN0b3IsXG4gICAgICAgICAgcGVybWlzc2lvbjogdGhpcy5zZXNzaW9uIS5hdXRoLnBlcm1pc3Npb24sXG4gICAgICAgIH1dLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgbWF4X2FnZTogbWF4QWdlLFxuICAgICAgICAgIG1heF9kZWxldGU6IG1heERlbGV0ZSxcbiAgICAgICAgfSxcbiAgICAgIH1dLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB2YWxpZGF0aW9uIGNvbnRyYWN0IGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIGFzeW5jIGdldENvbmZpZygpOiBQcm9taXNlPFZhbGlkYXRpb25Db25maWc+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJwYy5nZXRfdGFibGVfcm93czx7XG4gICAgICBvd25lcjogc3RyaW5nO1xuICAgICAgY29yZV9jb250cmFjdDogc3RyaW5nO1xuICAgICAgbWluX3N0YWtlOiBzdHJpbmc7XG4gICAgICBjaGFsbGVuZ2Vfc3Rha2U6IHN0cmluZztcbiAgICAgIHVuc3Rha2VfZGVsYXk6IHN0cmluZztcbiAgICAgIGNoYWxsZW5nZV93aW5kb3c6IHN0cmluZztcbiAgICAgIHNsYXNoX3BlcmNlbnQ6IHN0cmluZztcbiAgICAgIGRpc3B1dGVfcGVyaW9kOiBzdHJpbmc7XG4gICAgICBmdW5kZWRfY2hhbGxlbmdlX3RpbWVvdXQ6IHN0cmluZztcbiAgICAgIHBhdXNlZDogbnVtYmVyO1xuICAgICAgdmFsaWRhdGlvbl9mZWU6IHN0cmluZztcbiAgICB9Pih7XG4gICAgICBqc29uOiB0cnVlLFxuICAgICAgY29kZTogdGhpcy5jb250cmFjdCxcbiAgICAgIHNjb3BlOiB0aGlzLmNvbnRyYWN0LFxuICAgICAgdGFibGU6ICdjb25maWcnLFxuICAgICAgbGltaXQ6IDEsXG4gICAgfSk7XG5cbiAgICBpZiAocmVzdWx0LnJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRyYWN0IG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHJvdyA9IHJlc3VsdC5yb3dzWzBdO1xuICAgIHJldHVybiB7XG4gICAgICBvd25lcjogcm93Lm93bmVyLFxuICAgICAgY29yZV9jb250cmFjdDogcm93LmNvcmVfY29udHJhY3QsXG4gICAgICBtaW5fc3Rha2U6IHNhZmVQYXJzZUludChyb3cubWluX3N0YWtlKSxcbiAgICAgIGNoYWxsZW5nZV9zdGFrZTogc2FmZVBhcnNlSW50KHJvdy5jaGFsbGVuZ2Vfc3Rha2UpLFxuICAgICAgdW5zdGFrZV9kZWxheTogc2FmZVBhcnNlSW50KHJvdy51bnN0YWtlX2RlbGF5KSxcbiAgICAgIGNoYWxsZW5nZV93aW5kb3c6IHNhZmVQYXJzZUludChyb3cuY2hhbGxlbmdlX3dpbmRvdyksXG4gICAgICBzbGFzaF9wZXJjZW50OiBzYWZlUGFyc2VJbnQocm93LnNsYXNoX3BlcmNlbnQpLFxuICAgICAgZGlzcHV0ZV9wZXJpb2Q6IHNhZmVQYXJzZUludChyb3cuZGlzcHV0ZV9wZXJpb2QpLFxuICAgICAgZnVuZGVkX2NoYWxsZW5nZV90aW1lb3V0OiBzYWZlUGFyc2VJbnQocm93LmZ1bmRlZF9jaGFsbGVuZ2VfdGltZW91dCksXG4gICAgICBwYXVzZWQ6IHJvdy5wYXVzZWQgPT09IDEsXG4gICAgICB2YWxpZGF0aW9uX2ZlZTogc2FmZVBhcnNlSW50KHJvdy52YWxpZGF0aW9uX2ZlZSksXG4gICAgfTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09IEhFTFBFUlMgPT09PT09PT09PT09PT1cblxuICBwcml2YXRlIHJlcXVpcmVTZXNzaW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZXNzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nlc3Npb24gcmVxdWlyZWQgZm9yIHdyaXRlIG9wZXJhdGlvbnMnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBhcnNlVmFsaWRhdG9yKHJhdzogVmFsaWRhdG9yUmF3KTogVmFsaWRhdG9yIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWNjb3VudDogcmF3LmFjY291bnQsXG4gICAgICBzdGFrZTogc2FmZVBhcnNlSW50KHJhdy5zdGFrZSksXG4gICAgICBtZXRob2Q6IHJhdy5tZXRob2QsXG4gICAgICBzcGVjaWFsaXphdGlvbnM6IHBhcnNlU3BlY2lhbGl6YXRpb25zKHJhdy5zcGVjaWFsaXphdGlvbnMpLFxuICAgICAgdG90YWxfdmFsaWRhdGlvbnM6IHNhZmVQYXJzZUludChyYXcudG90YWxfdmFsaWRhdGlvbnMpLFxuICAgICAgaW5jb3JyZWN0X3ZhbGlkYXRpb25zOiBzYWZlUGFyc2VJbnQocmF3LmluY29ycmVjdF92YWxpZGF0aW9ucyksXG4gICAgICBhY2N1cmFjeV9zY29yZTogc2FmZVBhcnNlSW50KHJhdy5hY2N1cmFjeV9zY29yZSksXG4gICAgICBwZW5kaW5nX2NoYWxsZW5nZXM6IHNhZmVQYXJzZUludChyYXcucGVuZGluZ19jaGFsbGVuZ2VzKSxcbiAgICAgIHJlZ2lzdGVyZWRfYXQ6IHNhZmVQYXJzZUludChyYXcucmVnaXN0ZXJlZF9hdCksXG4gICAgICBhY3RpdmU6IHJhdy5hY3RpdmUgPT09IDEsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VWYWxpZGF0aW9uKHJhdzogVmFsaWRhdGlvblJhdyk6IFZhbGlkYXRpb24ge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogc2FmZVBhcnNlSW50KHJhdy5pZCksXG4gICAgICB2YWxpZGF0b3I6IHJhdy52YWxpZGF0b3IsXG4gICAgICBhZ2VudDogcmF3LmFnZW50LFxuICAgICAgam9iX2hhc2g6IHJhdy5qb2JfaGFzaCxcbiAgICAgIHJlc3VsdDogdmFsaWRhdGlvblJlc3VsdEZyb21OdW1iZXIocmF3LnJlc3VsdCksXG4gICAgICBjb25maWRlbmNlOiByYXcuY29uZmlkZW5jZSxcbiAgICAgIGV2aWRlbmNlX3VyaTogcmF3LmV2aWRlbmNlX3VyaSxcbiAgICAgIGNoYWxsZW5nZWQ6IHJhdy5jaGFsbGVuZ2VkID09PSAxLFxuICAgICAgdGltZXN0YW1wOiBzYWZlUGFyc2VJbnQocmF3LnRpbWVzdGFtcCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VDaGFsbGVuZ2UocmF3OiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB2YWxpZGF0aW9uX2lkOiBzdHJpbmc7XG4gICAgY2hhbGxlbmdlcjogc3RyaW5nO1xuICAgIHJlYXNvbjogc3RyaW5nO1xuICAgIGV2aWRlbmNlX3VyaTogc3RyaW5nO1xuICAgIHN0YWtlOiBzdHJpbmc7XG4gICAgc3RhdHVzOiBudW1iZXI7XG4gICAgcmVzb2x2ZXI6IHN0cmluZztcbiAgICByZXNvbHV0aW9uX25vdGVzOiBzdHJpbmc7XG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIHJlc29sdmVkX2F0OiBzdHJpbmc7XG4gICAgZnVuZGluZ19kZWFkbGluZTogc3RyaW5nO1xuICAgIGZ1bmRlZF9hdDogc3RyaW5nO1xuICB9KTogQ2hhbGxlbmdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHNhZmVQYXJzZUludChyYXcuaWQpLFxuICAgICAgdmFsaWRhdGlvbl9pZDogc2FmZVBhcnNlSW50KHJhdy52YWxpZGF0aW9uX2lkKSxcbiAgICAgIGNoYWxsZW5nZXI6IHJhdy5jaGFsbGVuZ2VyLFxuICAgICAgcmVhc29uOiByYXcucmVhc29uLFxuICAgICAgZXZpZGVuY2VfdXJpOiByYXcuZXZpZGVuY2VfdXJpLFxuICAgICAgc3Rha2U6IHNhZmVQYXJzZUludChyYXcuc3Rha2UpLFxuICAgICAgc3RhdHVzOiBkaXNwdXRlU3RhdHVzRnJvbU51bWJlcihyYXcuc3RhdHVzKSxcbiAgICAgIHJlc29sdmVyOiByYXcucmVzb2x2ZXIsXG4gICAgICByZXNvbHV0aW9uX25vdGVzOiByYXcucmVzb2x1dGlvbl9ub3RlcyxcbiAgICAgIGNyZWF0ZWRfYXQ6IHNhZmVQYXJzZUludChyYXcuY3JlYXRlZF9hdCksXG4gICAgICByZXNvbHZlZF9hdDogc2FmZVBhcnNlSW50KHJhdy5yZXNvbHZlZF9hdCksXG4gICAgICBmdW5kaW5nX2RlYWRsaW5lOiBzYWZlUGFyc2VJbnQocmF3LmZ1bmRpbmdfZGVhZGxpbmUpLFxuICAgICAgZnVuZGVkX2F0OiBzYWZlUGFyc2VJbnQocmF3LmZ1bmRlZF9hdCksXG4gICAgfTtcbiAgfVxufVxuIl19