@discordeno/rest 19.0.0 → 20.0.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,1547 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ AUDIT_LOG_REASON_HEADER: function() {
13
+ return AUDIT_LOG_REASON_HEADER;
14
+ },
15
+ DISCORD_API_URL: function() {
16
+ return DISCORD_API_URL;
17
+ },
18
+ DISCORD_API_VERSION: function() {
19
+ return DISCORD_API_VERSION;
20
+ },
21
+ RATE_LIMIT_BUCKET_HEADER: function() {
22
+ return RATE_LIMIT_BUCKET_HEADER;
23
+ },
24
+ RATE_LIMIT_GLOBAL_HEADER: function() {
25
+ return RATE_LIMIT_GLOBAL_HEADER;
26
+ },
27
+ RATE_LIMIT_LIMIT_HEADER: function() {
28
+ return RATE_LIMIT_LIMIT_HEADER;
29
+ },
30
+ RATE_LIMIT_REMAINING_HEADER: function() {
31
+ return RATE_LIMIT_REMAINING_HEADER;
32
+ },
33
+ RATE_LIMIT_RESET_AFTER_HEADER: function() {
34
+ return RATE_LIMIT_RESET_AFTER_HEADER;
35
+ },
36
+ RATE_LIMIT_SCOPE_HEADER: function() {
37
+ return RATE_LIMIT_SCOPE_HEADER;
38
+ },
39
+ createRestManager: function() {
40
+ return createRestManager;
41
+ }
42
+ });
43
+ const _nodebuffer = require("node:buffer");
44
+ const _types = require("@discordeno/types");
45
+ const _utils = require("@discordeno/utils");
46
+ const _invalidBucket = require("./invalidBucket.cjs");
47
+ const _queue = require("./queue.cjs");
48
+ const _routes = require("./routes.cjs");
49
+ // TODO: make dynamic based on package.json file
50
+ const version = '19.0.0';
51
+ const DISCORD_API_VERSION = 10;
52
+ const DISCORD_API_URL = 'https://discord.com/api';
53
+ const AUDIT_LOG_REASON_HEADER = 'x-audit-log-reason';
54
+ const RATE_LIMIT_REMAINING_HEADER = 'x-ratelimit-remaining';
55
+ const RATE_LIMIT_RESET_AFTER_HEADER = 'x-ratelimit-reset-after';
56
+ const RATE_LIMIT_GLOBAL_HEADER = 'x-ratelimit-global';
57
+ const RATE_LIMIT_BUCKET_HEADER = 'x-ratelimit-bucket';
58
+ const RATE_LIMIT_LIMIT_HEADER = 'x-ratelimit-limit';
59
+ const RATE_LIMIT_SCOPE_HEADER = 'x-ratelimit-scope';
60
+ function createRestManager(options) {
61
+ const applicationId = options.applicationId ? BigInt(options.applicationId) : (0, _utils.getBotIdFromToken)(options.token);
62
+ const baseUrl = options.proxy?.baseUrl ?? DISCORD_API_URL;
63
+ const rest = {
64
+ applicationId,
65
+ authorization: options.proxy?.authorization,
66
+ authorizationHeader: options.proxy?.authorizationHeader ?? 'authorization',
67
+ baseUrl,
68
+ deleteQueueDelay: 60000,
69
+ globallyRateLimited: false,
70
+ invalidBucket: (0, _invalidBucket.createInvalidRequestBucket)({
71
+ logger: options.logger
72
+ }),
73
+ isProxied: !baseUrl.startsWith(DISCORD_API_URL),
74
+ updateBearerTokenEndpoint: options.proxy?.updateBearerTokenEndpoint,
75
+ maxRetryCount: Infinity,
76
+ processingRateLimitedPaths: false,
77
+ queues: new Map(),
78
+ rateLimitedPaths: new Map(),
79
+ token: options.token,
80
+ version: options.version ?? DISCORD_API_VERSION,
81
+ logger: options.logger ?? _utils.logger,
82
+ routes: (0, _routes.createRoutes)(),
83
+ createBaseHeaders () {
84
+ return {
85
+ 'user-agent': `DiscordBot (https://github.com/discordeno/discordeno, v${version})`
86
+ };
87
+ },
88
+ checkRateLimits (url, identifier) {
89
+ const ratelimited = rest.rateLimitedPaths.get(`${identifier}${url}`);
90
+ const global = rest.rateLimitedPaths.get('global');
91
+ const now = Date.now();
92
+ if (ratelimited && now < ratelimited.resetTimestamp) {
93
+ return ratelimited.resetTimestamp - now;
94
+ }
95
+ if (global && now < global.resetTimestamp) {
96
+ return global.resetTimestamp - now;
97
+ }
98
+ return false;
99
+ },
100
+ async updateTokenQueues (oldToken, newToken) {
101
+ if (rest.isProxied) {
102
+ if (!rest.updateBearerTokenEndpoint) {
103
+ throw new Error("The 'proxy.updateBearerTokenEndpoint' option needs to be set when using a rest proxy and needed to call 'updateTokenQueues'");
104
+ }
105
+ const headers = {
106
+ 'content-type': 'application/json'
107
+ };
108
+ if (rest.authorization !== undefined) {
109
+ headers[rest.authorizationHeader] = rest.authorization;
110
+ }
111
+ await fetch(`${rest.baseUrl}/${rest.updateBearerTokenEndpoint}`, {
112
+ method: 'POST',
113
+ body: JSON.stringify({
114
+ oldToken,
115
+ newToken
116
+ }),
117
+ headers
118
+ });
119
+ return;
120
+ }
121
+ const newIdentifier = `Bearer ${newToken}`;
122
+ // Update all the queues
123
+ for (const [key, queue] of rest.queues.entries()){
124
+ if (!key.startsWith(`Bearer ${oldToken}`)) continue;
125
+ rest.queues.delete(key);
126
+ queue.identifier = newIdentifier;
127
+ const newKey = `${newIdentifier}${queue.url}`;
128
+ const newQueue = rest.queues.get(newKey);
129
+ // Merge the queues
130
+ if (newQueue) {
131
+ newQueue.waiting.unshift(...queue.waiting);
132
+ newQueue.pending.unshift(...queue.pending);
133
+ queue.waiting = [];
134
+ queue.pending = [];
135
+ queue.cleanup();
136
+ } else {
137
+ rest.queues.set(newKey, queue);
138
+ }
139
+ }
140
+ for (const [key, ratelimitPath] of rest.rateLimitedPaths.entries()){
141
+ if (!key.startsWith(`Bearer ${oldToken}`)) continue;
142
+ rest.rateLimitedPaths.set(`${newIdentifier}${ratelimitPath.url}`, ratelimitPath);
143
+ if (ratelimitPath.bucketId) {
144
+ rest.rateLimitedPaths.set(`${newIdentifier}${ratelimitPath.bucketId}`, ratelimitPath);
145
+ }
146
+ }
147
+ },
148
+ changeToDiscordFormat (obj) {
149
+ if (obj === null) return null;
150
+ if (typeof obj === 'object') {
151
+ if (Array.isArray(obj)) {
152
+ return obj.map((item)=>rest.changeToDiscordFormat(item));
153
+ }
154
+ const newObj = {};
155
+ for (const key of Object.keys(obj)){
156
+ const value = obj[key];
157
+ // If the key is already in snake_case we can assume it is already in the discord format.
158
+ if (key.includes('_')) {
159
+ newObj[key] = value;
160
+ continue;
161
+ }
162
+ // Some falsy values should be allowed like null or 0
163
+ if (value !== undefined) {
164
+ switch(key){
165
+ case 'permissions':
166
+ case 'allow':
167
+ case 'deny':
168
+ newObj[key] = typeof value === 'string' ? value : (0, _utils.calculateBits)(value);
169
+ continue;
170
+ case 'defaultMemberPermissions':
171
+ newObj.default_member_permissions = typeof value === 'string' ? value : (0, _utils.calculateBits)(value);
172
+ continue;
173
+ case 'nameLocalizations':
174
+ newObj.name_localizations = value;
175
+ continue;
176
+ case 'descriptionLocalizations':
177
+ newObj.description_localizations = value;
178
+ continue;
179
+ }
180
+ }
181
+ newObj[(0, _utils.camelToSnakeCase)(key)] = rest.changeToDiscordFormat(value);
182
+ }
183
+ return newObj;
184
+ }
185
+ if (typeof obj === 'bigint') return obj.toString();
186
+ return obj;
187
+ },
188
+ createRequestBody (method, options) {
189
+ const headers = this.createBaseHeaders();
190
+ if (options?.unauthorized !== true) headers.authorization = `Bot ${rest.token}`;
191
+ // IF A REASON IS PROVIDED ENCODE IT IN HEADERS
192
+ if (options?.reason !== undefined) {
193
+ headers[AUDIT_LOG_REASON_HEADER] = encodeURIComponent(options?.reason);
194
+ }
195
+ let body;
196
+ // TODO: check if we need to add specific check for GET method
197
+ // Since GET does not allow bodies
198
+ // Have to check for attachments first, since body then has to be send in a different way.
199
+ if (options?.files !== undefined) {
200
+ const form = new FormData();
201
+ for(let i = 0; i < options.files.length; ++i){
202
+ form.append(`file${i}`, options.files[i].blob, options.files[i].name);
203
+ }
204
+ // Have to use changeToDiscordFormat or else JSON.stringify may throw an error for the presence of BigInt(s) in the json
205
+ form.append('payload_json', JSON.stringify(rest.changeToDiscordFormat({
206
+ ...options.body,
207
+ files: undefined
208
+ })));
209
+ // No need to set the `content-type` header since `fetch` does that automatically for us when we use a `FormData` object.
210
+ body = form;
211
+ } else if (options?.body && options.headers && options.headers['content-type'] === 'application/x-www-form-urlencoded') {
212
+ // OAuth2 body handling
213
+ const formBody = [];
214
+ const discordBody = rest.changeToDiscordFormat(options.body);
215
+ for(const prop in discordBody){
216
+ formBody.push(`${encodeURIComponent(prop)}=${encodeURIComponent(discordBody[prop])}`);
217
+ }
218
+ body = formBody.join('&');
219
+ } else if (options?.body !== undefined) {
220
+ if (options.body instanceof FormData) {
221
+ body = options.body;
222
+ // No need to set the `content-type` header since `fetch` does that automatically for us when we use a `FormData` object.
223
+ } else {
224
+ body = JSON.stringify(rest.changeToDiscordFormat(options.body));
225
+ headers['content-type'] = `application/json`;
226
+ }
227
+ }
228
+ // SOMETIMES SPECIAL HEADERS (E.G. CUSTOM AUTHORIZATION) NEED TO BE USED
229
+ if (options?.headers) {
230
+ Object.assign(headers, options.headers);
231
+ }
232
+ return {
233
+ body,
234
+ headers,
235
+ method
236
+ };
237
+ },
238
+ processRateLimitedPaths () {
239
+ const now = Date.now();
240
+ for (const [key, value] of rest.rateLimitedPaths.entries()){
241
+ // rest.debug(
242
+ // `[REST - processRateLimitedPaths] Running for of loop. ${
243
+ // value.resetTimestamp - now
244
+ // }`
245
+ // )
246
+ // If the time has not reached cancel
247
+ if (value.resetTimestamp > now) continue;
248
+ // Rate limit is over, delete the rate limiter
249
+ rest.rateLimitedPaths.delete(key);
250
+ // If it was global, also mark the global value as false
251
+ if (key === 'global') rest.globallyRateLimited = false;
252
+ }
253
+ // ALL PATHS ARE CLEARED CAN CANCEL OUT!
254
+ if (rest.rateLimitedPaths.size === 0) {
255
+ rest.processingRateLimitedPaths = false;
256
+ } else {
257
+ rest.processingRateLimitedPaths = true;
258
+ // RECHECK IN 1 SECOND
259
+ setTimeout(()=>{
260
+ // rest.debug('[REST - processRateLimitedPaths] Running setTimeout.')
261
+ rest.processRateLimitedPaths();
262
+ }, 1000);
263
+ }
264
+ },
265
+ /** Processes the rate limit headers and determines if it needs to be rate limited and returns the bucket id if available */ processHeaders (url, headers, identifier) {
266
+ let rateLimited = false;
267
+ // GET ALL NECESSARY HEADERS
268
+ const remaining = headers.get(RATE_LIMIT_REMAINING_HEADER);
269
+ const retryAfter = headers.get(RATE_LIMIT_RESET_AFTER_HEADER);
270
+ const reset = Date.now() + Number(retryAfter) * 1000;
271
+ const global = headers.get(RATE_LIMIT_GLOBAL_HEADER);
272
+ // undefined override null needed for typings
273
+ const bucketId = headers.get(RATE_LIMIT_BUCKET_HEADER) ?? undefined;
274
+ const limit = headers.get(RATE_LIMIT_LIMIT_HEADER);
275
+ // If we didn't received the identifier, fallback to the bot token
276
+ identifier ??= `Bot ${rest.token}`;
277
+ rest.queues.get(`${identifier}${url}`)?.handleCompletedRequest({
278
+ remaining: remaining ? Number(remaining) : undefined,
279
+ interval: retryAfter ? Number(retryAfter) * 1000 : undefined,
280
+ max: limit ? Number(limit) : undefined
281
+ });
282
+ // IF THERE IS NO REMAINING RATE LIMIT, MARK IT AS RATE LIMITED
283
+ if (remaining === '0') {
284
+ rateLimited = true;
285
+ // SAVE THE URL AS LIMITED, IMPORTANT FOR NEW REQUESTS BY USER WITHOUT BUCKET
286
+ rest.rateLimitedPaths.set(`${identifier}${url}`, {
287
+ url,
288
+ resetTimestamp: reset,
289
+ bucketId
290
+ });
291
+ // SAVE THE BUCKET AS LIMITED SINCE DIFFERENT URLS MAY SHARE A BUCKET
292
+ if (bucketId) {
293
+ rest.rateLimitedPaths.set(`${identifier}${bucketId}`, {
294
+ url,
295
+ resetTimestamp: reset,
296
+ bucketId
297
+ });
298
+ }
299
+ }
300
+ // IF THERE IS NO REMAINING GLOBAL LIMIT, MARK IT RATE LIMITED GLOBALLY
301
+ if (global) {
302
+ const retryAfter = Number(headers.get('retry-after')) * 1000;
303
+ const globalReset = Date.now() + retryAfter;
304
+ // rest.debug(
305
+ // `[REST = Globally Rate Limited] URL: ${url} | Global Rest: ${globalReset}`
306
+ // )
307
+ rest.globallyRateLimited = true;
308
+ rateLimited = true;
309
+ setTimeout(()=>{
310
+ rest.globallyRateLimited = false;
311
+ }, retryAfter);
312
+ rest.rateLimitedPaths.set('global', {
313
+ url: 'global',
314
+ resetTimestamp: globalReset,
315
+ bucketId
316
+ });
317
+ if (bucketId) {
318
+ rest.rateLimitedPaths.set(identifier, {
319
+ url: 'global',
320
+ resetTimestamp: globalReset,
321
+ bucketId
322
+ });
323
+ }
324
+ }
325
+ if (rateLimited && !rest.processingRateLimitedPaths) {
326
+ rest.processRateLimitedPaths();
327
+ }
328
+ return rateLimited ? bucketId : undefined;
329
+ },
330
+ async sendRequest (options) {
331
+ const url = `${rest.baseUrl}/v${rest.version}${options.route}`;
332
+ const payload = rest.createRequestBody(options.method, options.requestBodyOptions);
333
+ const loggingHeaders = {
334
+ ...payload.headers
335
+ };
336
+ if (payload.headers.authorization) {
337
+ const authorizationScheme = payload.headers.authorization?.split(' ')[0];
338
+ loggingHeaders.authorization = `${authorizationScheme} tokenhere`;
339
+ }
340
+ rest.logger.debug(`sending request to ${url}`, 'with payload:', {
341
+ ...payload,
342
+ headers: loggingHeaders
343
+ });
344
+ const response = await fetch(url, payload).catch(async (error)=>{
345
+ rest.logger.error(error);
346
+ // Mark request and completed
347
+ rest.invalidBucket.handleCompletedRequest(999, false);
348
+ options.reject({
349
+ ok: false,
350
+ status: 999,
351
+ error: 'Possible network or request shape issue occurred. If this is rare, its a network glitch. If it occurs a lot something is wrong.'
352
+ });
353
+ throw error;
354
+ });
355
+ rest.logger.debug(`request fetched from ${url} with status ${response.status} & ${response.statusText}`);
356
+ // Mark request and completed
357
+ rest.invalidBucket.handleCompletedRequest(response.status, response.headers.get(RATE_LIMIT_SCOPE_HEADER) === 'shared');
358
+ // Set the bucket id if it was available on the headers
359
+ const bucketId = rest.processHeaders(rest.simplifyUrl(options.route, options.method), response.headers, payload.headers.authorization);
360
+ if (bucketId) options.bucketId = bucketId;
361
+ if (response.status < 200 || response.status >= 400) {
362
+ rest.logger.debug(`Request to ${url} failed.`);
363
+ if (response.status !== 429) {
364
+ options.reject({
365
+ ok: false,
366
+ status: response.status,
367
+ body: await response.text()
368
+ });
369
+ return;
370
+ }
371
+ rest.logger.debug(`Request to ${url} was ratelimited.`);
372
+ // Too many attempts, get rid of request from queue.
373
+ if (options.retryCount >= rest.maxRetryCount) {
374
+ rest.logger.debug(`Request to ${url} exceeded the maximum allowed retries.`, 'with payload:', payload);
375
+ // rest.debug(`[REST - RetriesMaxed] ${JSON.stringify(options)}`)
376
+ options.reject({
377
+ ok: false,
378
+ status: response.status,
379
+ error: 'The request was rate limited and it maxed out the retries limit.'
380
+ });
381
+ return;
382
+ }
383
+ options.retryCount += 1;
384
+ const resetAfter = response.headers.get(RATE_LIMIT_RESET_AFTER_HEADER);
385
+ if (resetAfter) await (0, _utils.delay)(Number(resetAfter) * 1000);
386
+ // process the response to prevent mem leak
387
+ await response.arrayBuffer();
388
+ return await options.retryRequest?.(options);
389
+ }
390
+ // Discord sometimes sends no response with no content.
391
+ options.resolve({
392
+ ok: true,
393
+ status: response.status,
394
+ body: response.status === 204 ? undefined : await response.text()
395
+ });
396
+ },
397
+ simplifyUrl (url, method) {
398
+ const parts = url.split('/');
399
+ const secondLastPart = parts[parts.length - 2];
400
+ if (secondLastPart === 'channels' || secondLastPart === 'guilds') {
401
+ return url;
402
+ }
403
+ if (secondLastPart === 'reactions' || parts[parts.length - 1] === '@me') {
404
+ parts.splice(-2);
405
+ parts.push('reactions');
406
+ } else {
407
+ parts.splice(-1);
408
+ parts.push('x');
409
+ }
410
+ if (parts[parts.length - 3] === 'reactions') {
411
+ parts.splice(-2);
412
+ }
413
+ if (method === 'DELETE' && secondLastPart === 'messages') {
414
+ return `D${parts.join('/')}`;
415
+ }
416
+ return parts.join('/');
417
+ },
418
+ async processRequest (request) {
419
+ const url = rest.simplifyUrl(request.route, request.method);
420
+ if (request.runThroughQueue === false) {
421
+ await rest.sendRequest(request);
422
+ return;
423
+ }
424
+ // If we the request has a token, use it
425
+ // Else fallback to prefix with the bot token
426
+ const queueIdentifier = request.requestBodyOptions?.headers?.authorization ?? `Bot ${rest.token}`;
427
+ const queue = rest.queues.get(`${queueIdentifier}${url}`);
428
+ if (queue !== undefined) {
429
+ queue.makeRequest(request);
430
+ } else {
431
+ // CREATES A NEW QUEUE
432
+ const bucketQueue = new _queue.Queue(rest, {
433
+ url,
434
+ deleteQueueDelay: rest.deleteQueueDelay,
435
+ identifier: queueIdentifier
436
+ });
437
+ // Save queue
438
+ rest.queues.set(`${queueIdentifier}${url}`, bucketQueue);
439
+ // Add request to queue
440
+ bucketQueue.makeRequest(request);
441
+ }
442
+ },
443
+ async makeRequest (method, route, options) {
444
+ // This error needs to be created here because of how stack traces get calculated
445
+ const error = new Error();
446
+ error.message = 'Failed to send request to discord.';
447
+ if (rest.isProxied) {
448
+ if (rest.authorization) {
449
+ options ??= {};
450
+ options.headers ??= {};
451
+ options.headers[rest.authorizationHeader] = rest.authorization;
452
+ }
453
+ const result = await fetch(`${rest.baseUrl}/v${rest.version}${route}`, rest.createRequestBody(method, options));
454
+ if (!result.ok) {
455
+ const errText = await result.text().catch(()=>null);
456
+ if (errText) {
457
+ error.cause = {
458
+ ok: false,
459
+ status: result.status,
460
+ body: errText
461
+ };
462
+ throw error;
463
+ }
464
+ const err = await result.json().catch(()=>{});
465
+ // Legacy Handling to not break old code or when body is missing
466
+ if (!err?.body) throw new Error(`Error: ${err.message ?? result.statusText}`);
467
+ throw new Error(JSON.stringify(err));
468
+ }
469
+ return result.status !== 204 ? await result.json() : undefined;
470
+ }
471
+ return await new Promise(async (resolve, reject)=>{
472
+ const payload = {
473
+ route,
474
+ method,
475
+ requestBodyOptions: options,
476
+ retryCount: 0,
477
+ retryRequest: async (payload)=>{
478
+ await rest.processRequest(payload);
479
+ },
480
+ resolve: (data)=>{
481
+ resolve(data.status !== 204 ? JSON.parse(data.body ?? '{}') : undefined);
482
+ },
483
+ reject: (reason)=>{
484
+ error.cause = reason;
485
+ reject(error);
486
+ },
487
+ runThroughQueue: options?.runThroughQueue
488
+ };
489
+ await rest.processRequest(payload);
490
+ });
491
+ },
492
+ async get (url, options) {
493
+ return (0, _utils.camelize)(await rest.makeRequest('GET', url, options));
494
+ },
495
+ async post (url, options) {
496
+ return (0, _utils.camelize)(await rest.makeRequest('POST', url, options));
497
+ },
498
+ async delete (url, options) {
499
+ (0, _utils.camelize)(await rest.makeRequest('DELETE', url, options));
500
+ },
501
+ async patch (url, options) {
502
+ return (0, _utils.camelize)(await rest.makeRequest('PATCH', url, options));
503
+ },
504
+ async put (url, options) {
505
+ return (0, _utils.camelize)(await rest.makeRequest('PUT', url, options));
506
+ },
507
+ async addReaction (channelId, messageId, reaction) {
508
+ reaction = (0, _utils.processReactionString)(reaction);
509
+ await rest.put(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
510
+ },
511
+ async addReactions (channelId, messageId, reactions, ordered = false) {
512
+ if (!ordered) {
513
+ await Promise.all(reactions.map(async (reaction)=>{
514
+ await rest.addReaction(channelId, messageId, reaction);
515
+ }));
516
+ return;
517
+ }
518
+ for (const reaction of reactions){
519
+ await rest.addReaction(channelId, messageId, reaction);
520
+ }
521
+ },
522
+ async addRole (guildId, userId, roleId, reason) {
523
+ await rest.put(rest.routes.guilds.roles.member(guildId, userId, roleId), {
524
+ reason
525
+ });
526
+ },
527
+ async addThreadMember (channelId, userId) {
528
+ await rest.put(rest.routes.channels.threads.user(channelId, userId));
529
+ },
530
+ async addDmRecipient (channelId, userId, body) {
531
+ await rest.put(rest.routes.channels.dmRecipient(channelId, userId), {
532
+ body
533
+ });
534
+ },
535
+ async createAutomodRule (guildId, body, reason) {
536
+ return await rest.post(rest.routes.guilds.automod.rules(guildId), {
537
+ body,
538
+ reason
539
+ });
540
+ },
541
+ async createChannel (guildId, body, reason) {
542
+ return await rest.post(rest.routes.guilds.channels(guildId), {
543
+ body,
544
+ reason
545
+ });
546
+ },
547
+ async createEmoji (guildId, body, reason) {
548
+ return await rest.post(rest.routes.guilds.emojis(guildId), {
549
+ body,
550
+ reason
551
+ });
552
+ },
553
+ async createApplicationEmoji (body) {
554
+ return await rest.post(rest.routes.applicationEmojis(rest.applicationId), {
555
+ body
556
+ });
557
+ },
558
+ async createGlobalApplicationCommand (body, options) {
559
+ const restOptions = {
560
+ body
561
+ };
562
+ if (options?.bearerToken) {
563
+ restOptions.unauthorized = true;
564
+ restOptions.headers = {
565
+ authorization: `Bearer ${options.bearerToken}`
566
+ };
567
+ }
568
+ return await rest.post(rest.routes.interactions.commands.commands(rest.applicationId), restOptions);
569
+ },
570
+ async createGuild (body) {
571
+ return await rest.post(rest.routes.guilds.all(), {
572
+ body
573
+ });
574
+ },
575
+ async createGuildApplicationCommand (body, guildId, options) {
576
+ const restOptions = {
577
+ body
578
+ };
579
+ if (options?.bearerToken) {
580
+ restOptions.unauthorized = true;
581
+ restOptions.headers = {
582
+ authorization: `Bearer ${options.bearerToken}`
583
+ };
584
+ }
585
+ return await rest.post(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), restOptions);
586
+ },
587
+ async createGuildFromTemplate (templateCode, body) {
588
+ if (body.icon) {
589
+ body.icon = await (0, _utils.urlToBase64)(body.icon);
590
+ }
591
+ return await rest.post(rest.routes.guilds.templates.code(templateCode), {
592
+ body
593
+ });
594
+ },
595
+ async createGuildSticker (guildId, options, reason) {
596
+ const form = new FormData();
597
+ form.append('file', options.file.blob, options.file.name);
598
+ form.append('name', options.name);
599
+ form.append('description', options.description);
600
+ form.append('tags', options.tags);
601
+ return await rest.post(rest.routes.guilds.stickers(guildId), {
602
+ body: form,
603
+ reason
604
+ });
605
+ },
606
+ async createGuildTemplate (guildId, body) {
607
+ return await rest.post(rest.routes.guilds.templates.all(guildId), {
608
+ body
609
+ });
610
+ },
611
+ async createForumThread (channelId, body, reason) {
612
+ return await rest.post(rest.routes.channels.forum(channelId), {
613
+ body,
614
+ files: body.files,
615
+ reason
616
+ });
617
+ },
618
+ async createInvite (channelId, body = {}, reason) {
619
+ return await rest.post(rest.routes.channels.invites(channelId), {
620
+ body,
621
+ reason
622
+ });
623
+ },
624
+ async createRole (guildId, body, reason) {
625
+ return await rest.post(rest.routes.guilds.roles.all(guildId), {
626
+ body,
627
+ reason
628
+ });
629
+ },
630
+ async createScheduledEvent (guildId, body, reason) {
631
+ return await rest.post(rest.routes.guilds.events.events(guildId), {
632
+ body,
633
+ reason
634
+ });
635
+ },
636
+ async createStageInstance (body, reason) {
637
+ return await rest.post(rest.routes.channels.stages(), {
638
+ body,
639
+ reason
640
+ });
641
+ },
642
+ async createWebhook (channelId, options, reason) {
643
+ return await rest.post(rest.routes.channels.webhooks(channelId), {
644
+ body: {
645
+ name: options.name,
646
+ avatar: options.avatar ? await (0, _utils.urlToBase64)(options.avatar) : undefined
647
+ },
648
+ reason
649
+ });
650
+ },
651
+ async deleteAutomodRule (guildId, ruleId, reason) {
652
+ await rest.delete(rest.routes.guilds.automod.rule(guildId, ruleId), {
653
+ reason
654
+ });
655
+ },
656
+ async deleteChannel (channelId, reason) {
657
+ await rest.delete(rest.routes.channels.channel(channelId), {
658
+ reason
659
+ });
660
+ },
661
+ async deleteChannelPermissionOverride (channelId, overwriteId, reason) {
662
+ await rest.delete(rest.routes.channels.overwrite(channelId, overwriteId), {
663
+ reason
664
+ });
665
+ },
666
+ async deleteEmoji (guildId, id, reason) {
667
+ await rest.delete(rest.routes.guilds.emoji(guildId, id), {
668
+ reason
669
+ });
670
+ },
671
+ async deleteApplicationEmoji (id) {
672
+ await rest.delete(rest.routes.applicationEmoji(rest.applicationId, id));
673
+ },
674
+ async deleteFollowupMessage (token, messageId) {
675
+ await rest.delete(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
676
+ unauthorized: true
677
+ });
678
+ },
679
+ async deleteGlobalApplicationCommand (commandId) {
680
+ await rest.delete(rest.routes.interactions.commands.command(rest.applicationId, commandId));
681
+ },
682
+ async deleteGuild (guildId) {
683
+ await rest.delete(rest.routes.guilds.guild(guildId));
684
+ },
685
+ async deleteGuildApplicationCommand (commandId, guildId) {
686
+ await rest.delete(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
687
+ },
688
+ async deleteGuildSticker (guildId, stickerId, reason) {
689
+ await rest.delete(rest.routes.guilds.sticker(guildId, stickerId), {
690
+ reason
691
+ });
692
+ },
693
+ async deleteGuildTemplate (guildId, templateCode) {
694
+ await rest.delete(rest.routes.guilds.templates.guild(guildId, templateCode));
695
+ },
696
+ async deleteIntegration (guildId, integrationId, reason) {
697
+ await rest.delete(rest.routes.guilds.integration(guildId, integrationId), {
698
+ reason
699
+ });
700
+ },
701
+ async deleteInvite (inviteCode, reason) {
702
+ await rest.delete(rest.routes.guilds.invite(inviteCode), {
703
+ reason
704
+ });
705
+ },
706
+ async deleteMessage (channelId, messageId, reason) {
707
+ await rest.delete(rest.routes.channels.message(channelId, messageId), {
708
+ reason
709
+ });
710
+ },
711
+ async deleteMessages (channelId, messageIds, reason) {
712
+ await rest.post(rest.routes.channels.bulk(channelId), {
713
+ body: {
714
+ messages: messageIds.slice(0, 100).map((id)=>id.toString())
715
+ },
716
+ reason
717
+ });
718
+ },
719
+ async deleteOriginalInteractionResponse (token) {
720
+ await rest.delete(rest.routes.interactions.responses.original(rest.applicationId, token), {
721
+ unauthorized: true
722
+ });
723
+ },
724
+ async deleteOwnReaction (channelId, messageId, reaction) {
725
+ reaction = (0, _utils.processReactionString)(reaction);
726
+ await rest.delete(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
727
+ },
728
+ async deleteReactionsAll (channelId, messageId) {
729
+ await rest.delete(rest.routes.channels.reactions.all(channelId, messageId));
730
+ },
731
+ async deleteReactionsEmoji (channelId, messageId, reaction) {
732
+ reaction = (0, _utils.processReactionString)(reaction);
733
+ await rest.delete(rest.routes.channels.reactions.emoji(channelId, messageId, reaction));
734
+ },
735
+ async deleteRole (guildId, roleId, reason) {
736
+ await rest.delete(rest.routes.guilds.roles.one(guildId, roleId), {
737
+ reason
738
+ });
739
+ },
740
+ async deleteScheduledEvent (guildId, eventId) {
741
+ await rest.delete(rest.routes.guilds.events.event(guildId, eventId));
742
+ },
743
+ async deleteStageInstance (channelId, reason) {
744
+ await rest.delete(rest.routes.channels.stage(channelId), {
745
+ reason
746
+ });
747
+ },
748
+ async deleteUserReaction (channelId, messageId, userId, reaction) {
749
+ reaction = (0, _utils.processReactionString)(reaction);
750
+ await rest.delete(rest.routes.channels.reactions.user(channelId, messageId, reaction, userId));
751
+ },
752
+ async deleteWebhook (webhookId, reason) {
753
+ await rest.delete(rest.routes.webhooks.id(webhookId), {
754
+ reason
755
+ });
756
+ },
757
+ async deleteWebhookMessage (webhookId, token, messageId, options) {
758
+ await rest.delete(rest.routes.webhooks.message(webhookId, token, messageId, options));
759
+ },
760
+ async deleteWebhookWithToken (webhookId, token) {
761
+ await rest.delete(rest.routes.webhooks.webhook(webhookId, token), {
762
+ unauthorized: true
763
+ });
764
+ },
765
+ async editApplicationCommandPermissions (guildId, commandId, bearerToken, permissions) {
766
+ return await rest.put(rest.routes.interactions.commands.permission(rest.applicationId, guildId, commandId), {
767
+ body: {
768
+ permissions
769
+ },
770
+ headers: {
771
+ authorization: `Bearer ${bearerToken}`
772
+ }
773
+ });
774
+ },
775
+ async editAutomodRule (guildId, ruleId, body, reason) {
776
+ return await rest.patch(rest.routes.guilds.automod.rule(guildId, ruleId), {
777
+ body,
778
+ reason
779
+ });
780
+ },
781
+ async editBotProfile (options) {
782
+ const avatar = options?.botAvatarURL ? await (0, _utils.urlToBase64)(options?.botAvatarURL) : options?.botAvatarURL;
783
+ const banner = options?.botBannerURL ? await (0, _utils.urlToBase64)(options?.botBannerURL) : options?.botBannerURL;
784
+ return await rest.patch(rest.routes.currentUser(), {
785
+ body: {
786
+ username: options.username?.trim(),
787
+ avatar,
788
+ banner
789
+ }
790
+ });
791
+ },
792
+ async editChannel (channelId, body, reason) {
793
+ return await rest.patch(rest.routes.channels.channel(channelId), {
794
+ body,
795
+ reason
796
+ });
797
+ },
798
+ async editChannelPermissionOverrides (channelId, body, reason) {
799
+ await rest.put(rest.routes.channels.overwrite(channelId, body.id), {
800
+ body,
801
+ reason
802
+ });
803
+ },
804
+ async editChannelPositions (guildId, body) {
805
+ await rest.patch(rest.routes.guilds.channels(guildId), {
806
+ body
807
+ });
808
+ },
809
+ async editEmoji (guildId, id, body, reason) {
810
+ return await rest.patch(rest.routes.guilds.emoji(guildId, id), {
811
+ body,
812
+ reason
813
+ });
814
+ },
815
+ async editApplicationEmoji (id, body) {
816
+ return await rest.patch(rest.routes.applicationEmoji(rest.applicationId, id), {
817
+ body
818
+ });
819
+ },
820
+ async editFollowupMessage (token, messageId, body) {
821
+ return await rest.patch(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
822
+ body,
823
+ files: body.files,
824
+ unauthorized: true
825
+ });
826
+ },
827
+ async editGlobalApplicationCommand (commandId, body) {
828
+ return await rest.patch(rest.routes.interactions.commands.command(rest.applicationId, commandId), {
829
+ body
830
+ });
831
+ },
832
+ async editGuild (guildId, body, reason) {
833
+ return await rest.patch(rest.routes.guilds.guild(guildId), {
834
+ body,
835
+ reason
836
+ });
837
+ },
838
+ async editGuildApplicationCommand (commandId, guildId, body) {
839
+ return await rest.patch(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId), {
840
+ body
841
+ });
842
+ },
843
+ async editGuildMfaLevel (guildId, mfaLevel, reason) {
844
+ await rest.post(rest.routes.guilds.mfa(guildId), {
845
+ body: {
846
+ level: mfaLevel
847
+ },
848
+ reason
849
+ });
850
+ },
851
+ async editGuildSticker (guildId, stickerId, body, reason) {
852
+ return await rest.patch(rest.routes.guilds.sticker(guildId, stickerId), {
853
+ body,
854
+ reason
855
+ });
856
+ },
857
+ async editGuildTemplate (guildId, templateCode, body) {
858
+ return await rest.patch(rest.routes.guilds.templates.guild(guildId, templateCode), {
859
+ body
860
+ });
861
+ },
862
+ async editMessage (channelId, messageId, body) {
863
+ return await rest.patch(rest.routes.channels.message(channelId, messageId), {
864
+ body,
865
+ files: body.files
866
+ });
867
+ },
868
+ async editOriginalInteractionResponse (token, body) {
869
+ return await rest.patch(rest.routes.interactions.responses.original(rest.applicationId, token), {
870
+ body,
871
+ files: body.files
872
+ });
873
+ },
874
+ async editOriginalWebhookMessage (webhookId, token, options) {
875
+ return await rest.patch(rest.routes.webhooks.original(webhookId, token, options), {
876
+ body: {
877
+ type: _types.InteractionResponseTypes.UpdateMessage,
878
+ data: options
879
+ },
880
+ files: options.files,
881
+ unauthorized: true
882
+ });
883
+ },
884
+ async editOwnVoiceState (guildId, options) {
885
+ await rest.patch(rest.routes.guilds.voice(guildId), {
886
+ body: {
887
+ ...options,
888
+ requestToSpeakTimestamp: options.requestToSpeakTimestamp ? new Date(options.requestToSpeakTimestamp).toISOString() : options.requestToSpeakTimestamp
889
+ }
890
+ });
891
+ },
892
+ async editScheduledEvent (guildId, eventId, body, reason) {
893
+ return await rest.patch(rest.routes.guilds.events.event(guildId, eventId), {
894
+ body,
895
+ reason
896
+ });
897
+ },
898
+ async editRole (guildId, roleId, body, reason) {
899
+ return await rest.patch(rest.routes.guilds.roles.one(guildId, roleId), {
900
+ body,
901
+ reason
902
+ });
903
+ },
904
+ async editRolePositions (guildId, body, reason) {
905
+ return await rest.patch(rest.routes.guilds.roles.all(guildId), {
906
+ body,
907
+ reason
908
+ });
909
+ },
910
+ async editStageInstance (channelId, topic, reason) {
911
+ return await rest.patch(rest.routes.channels.stage(channelId), {
912
+ body: {
913
+ topic
914
+ },
915
+ reason
916
+ });
917
+ },
918
+ async editUserVoiceState (guildId, options) {
919
+ await rest.patch(rest.routes.guilds.voice(guildId, options.userId), {
920
+ body: options
921
+ });
922
+ },
923
+ async editWebhook (webhookId, body, reason) {
924
+ return await rest.patch(rest.routes.webhooks.id(webhookId), {
925
+ body,
926
+ reason
927
+ });
928
+ },
929
+ async editWebhookMessage (webhookId, token, messageId, options) {
930
+ return await rest.patch(rest.routes.webhooks.message(webhookId, token, messageId, options), {
931
+ body: options,
932
+ files: options.files,
933
+ unauthorized: true
934
+ });
935
+ },
936
+ async editWebhookWithToken (webhookId, token, body) {
937
+ return await rest.patch(rest.routes.webhooks.webhook(webhookId, token), {
938
+ body,
939
+ unauthorized: true
940
+ });
941
+ },
942
+ async editWelcomeScreen (guildId, body, reason) {
943
+ return await rest.patch(rest.routes.guilds.welcome(guildId), {
944
+ body,
945
+ reason
946
+ });
947
+ },
948
+ async editWidgetSettings (guildId, body, reason) {
949
+ return await rest.patch(rest.routes.guilds.widget(guildId), {
950
+ body,
951
+ reason
952
+ });
953
+ },
954
+ async executeWebhook (webhookId, token, options) {
955
+ return await rest.post(rest.routes.webhooks.webhook(webhookId, token, options), {
956
+ body: options,
957
+ unauthorized: true
958
+ });
959
+ },
960
+ async followAnnouncement (sourceChannelId, targetChannelId, reason) {
961
+ return await rest.post(rest.routes.channels.follow(sourceChannelId), {
962
+ body: {
963
+ webhookChannelId: targetChannelId
964
+ },
965
+ reason
966
+ });
967
+ },
968
+ async getActiveThreads (guildId) {
969
+ return await rest.get(rest.routes.channels.threads.active(guildId));
970
+ },
971
+ async getApplicationCommandPermission (guildId, commandId, options) {
972
+ const restOptions = {};
973
+ if (options?.accessToken) {
974
+ restOptions.unauthorized = true;
975
+ restOptions.headers = {
976
+ authorization: `Bearer ${options.accessToken}`
977
+ };
978
+ }
979
+ return await rest.get(rest.routes.interactions.commands.permission(options?.applicationId ?? rest.applicationId, guildId, commandId), restOptions);
980
+ },
981
+ async getApplicationCommandPermissions (guildId, options) {
982
+ const restOptions = {};
983
+ if (options?.accessToken) {
984
+ restOptions.unauthorized = true;
985
+ restOptions.headers = {
986
+ authorization: `Bearer ${options.accessToken}`
987
+ };
988
+ }
989
+ return await rest.get(rest.routes.interactions.commands.permissions(options?.applicationId ?? rest.applicationId, guildId), restOptions);
990
+ },
991
+ async getApplicationInfo () {
992
+ return await rest.get(rest.routes.oauth2.application());
993
+ },
994
+ async editApplicationInfo (body) {
995
+ return await rest.patch(rest.routes.application(), {
996
+ body
997
+ });
998
+ },
999
+ async getCurrentAuthenticationInfo (token) {
1000
+ return await rest.get(rest.routes.oauth2.currentAuthorization(), {
1001
+ headers: {
1002
+ authorization: `Bearer ${token}`
1003
+ },
1004
+ unauthorized: true
1005
+ });
1006
+ },
1007
+ async exchangeToken (clientId, clientSecret, body) {
1008
+ const basicCredentials = _nodebuffer.Buffer.from(`${clientId}:${clientSecret}`);
1009
+ const restOptions = {
1010
+ body,
1011
+ headers: {
1012
+ 'content-type': 'application/x-www-form-urlencoded',
1013
+ authorization: `Basic ${basicCredentials.toString('base64')}`
1014
+ },
1015
+ runThroughQueue: false,
1016
+ unauthorized: true
1017
+ };
1018
+ if (body.grantType === 'client_credentials') {
1019
+ restOptions.body.scope = body.scope.join(' ');
1020
+ }
1021
+ return await rest.post(rest.routes.oauth2.tokenExchange(), restOptions);
1022
+ },
1023
+ async revokeToken (clientId, clientSecret, body) {
1024
+ const basicCredentials = _nodebuffer.Buffer.from(`${clientId}:${clientSecret}`);
1025
+ await rest.post(rest.routes.oauth2.tokenRevoke(), {
1026
+ body,
1027
+ headers: {
1028
+ 'content-type': 'application/x-www-form-urlencoded',
1029
+ authorization: `Basic ${basicCredentials.toString('base64')}`
1030
+ },
1031
+ unauthorized: true
1032
+ });
1033
+ },
1034
+ async getAuditLog (guildId, options) {
1035
+ return await rest.get(rest.routes.guilds.auditlogs(guildId, options));
1036
+ },
1037
+ async getAutomodRule (guildId, ruleId) {
1038
+ return await rest.get(rest.routes.guilds.automod.rule(guildId, ruleId));
1039
+ },
1040
+ async getAutomodRules (guildId) {
1041
+ return await rest.get(rest.routes.guilds.automod.rules(guildId));
1042
+ },
1043
+ async getAvailableVoiceRegions () {
1044
+ return await rest.get(rest.routes.regions());
1045
+ },
1046
+ async getBan (guildId, userId) {
1047
+ return await rest.get(rest.routes.guilds.members.ban(guildId, userId));
1048
+ },
1049
+ async getBans (guildId, options) {
1050
+ return await rest.get(rest.routes.guilds.members.bans(guildId, options));
1051
+ },
1052
+ async getChannel (id) {
1053
+ return await rest.get(rest.routes.channels.channel(id));
1054
+ },
1055
+ async getChannelInvites (channelId) {
1056
+ return await rest.get(rest.routes.channels.invites(channelId));
1057
+ },
1058
+ async getChannels (guildId) {
1059
+ return await rest.get(rest.routes.guilds.channels(guildId));
1060
+ },
1061
+ async getChannelWebhooks (channelId) {
1062
+ return await rest.get(rest.routes.channels.webhooks(channelId));
1063
+ },
1064
+ async getDmChannel (userId) {
1065
+ return await rest.post(rest.routes.channels.dm(), {
1066
+ body: {
1067
+ recipientId: userId
1068
+ }
1069
+ });
1070
+ },
1071
+ async getGroupDmChannel (body) {
1072
+ return await rest.post(rest.routes.channels.dm(), {
1073
+ body
1074
+ });
1075
+ },
1076
+ async getEmoji (guildId, emojiId) {
1077
+ return await rest.get(rest.routes.guilds.emoji(guildId, emojiId));
1078
+ },
1079
+ async getApplicationEmoji (emojiId) {
1080
+ return await rest.get(rest.routes.applicationEmoji(rest.applicationId, emojiId));
1081
+ },
1082
+ async getEmojis (guildId) {
1083
+ return await rest.get(rest.routes.guilds.emojis(guildId));
1084
+ },
1085
+ async getApplicationEmojis () {
1086
+ return await rest.get(rest.routes.applicationEmojis(rest.applicationId));
1087
+ },
1088
+ async getFollowupMessage (token, messageId) {
1089
+ return await rest.get(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
1090
+ unauthorized: true
1091
+ });
1092
+ },
1093
+ async getGatewayBot () {
1094
+ return await rest.get(rest.routes.gatewayBot());
1095
+ },
1096
+ async getGlobalApplicationCommand (commandId) {
1097
+ return await rest.get(rest.routes.interactions.commands.command(rest.applicationId, commandId));
1098
+ },
1099
+ async getGlobalApplicationCommands () {
1100
+ return await rest.get(rest.routes.interactions.commands.commands(rest.applicationId));
1101
+ },
1102
+ async getGuild (guildId, options = {
1103
+ counts: true
1104
+ }) {
1105
+ return await rest.get(rest.routes.guilds.guild(guildId, options.counts));
1106
+ },
1107
+ async getGuilds (token, options) {
1108
+ const makeRequestOptions = token ? {
1109
+ headers: {
1110
+ authorization: `Bearer ${token}`
1111
+ },
1112
+ unauthorized: true
1113
+ } : undefined;
1114
+ return await rest.get(rest.routes.guilds.userGuilds(options), makeRequestOptions);
1115
+ },
1116
+ async getGuildApplicationCommand (commandId, guildId) {
1117
+ return await rest.get(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
1118
+ },
1119
+ async getGuildApplicationCommands (guildId) {
1120
+ return await rest.get(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId));
1121
+ },
1122
+ async getGuildPreview (guildId) {
1123
+ return await rest.get(rest.routes.guilds.preview(guildId));
1124
+ },
1125
+ async getGuildTemplate (templateCode) {
1126
+ return await rest.get(rest.routes.guilds.templates.code(templateCode));
1127
+ },
1128
+ async getGuildTemplates (guildId) {
1129
+ return await rest.get(rest.routes.guilds.templates.all(guildId));
1130
+ },
1131
+ async getGuildWebhooks (guildId) {
1132
+ return await rest.get(rest.routes.guilds.webhooks(guildId));
1133
+ },
1134
+ async getIntegrations (guildId) {
1135
+ return await rest.get(rest.routes.guilds.integrations(guildId));
1136
+ },
1137
+ async getInvite (inviteCode, options) {
1138
+ return await rest.get(rest.routes.guilds.invite(inviteCode, options));
1139
+ },
1140
+ async getInvites (guildId) {
1141
+ return await rest.get(rest.routes.guilds.invites(guildId));
1142
+ },
1143
+ async getMessage (channelId, messageId) {
1144
+ return await rest.get(rest.routes.channels.message(channelId, messageId));
1145
+ },
1146
+ async getMessages (channelId, options) {
1147
+ return await rest.get(rest.routes.channels.messages(channelId, options));
1148
+ },
1149
+ async getStickerPack (stickerPackId) {
1150
+ return await rest.get(rest.routes.stickerPack(stickerPackId));
1151
+ },
1152
+ async getStickerPacks () {
1153
+ return await rest.get(rest.routes.stickerPacks());
1154
+ },
1155
+ async getOriginalInteractionResponse (token) {
1156
+ return await rest.get(rest.routes.interactions.responses.original(rest.applicationId, token), {
1157
+ unauthorized: true
1158
+ });
1159
+ },
1160
+ async getPinnedMessages (channelId) {
1161
+ return await rest.get(rest.routes.channels.pins(channelId));
1162
+ },
1163
+ async getPrivateArchivedThreads (channelId, options) {
1164
+ return await rest.get(rest.routes.channels.threads.private(channelId, options));
1165
+ },
1166
+ async getPrivateJoinedArchivedThreads (channelId, options) {
1167
+ return await rest.get(rest.routes.channels.threads.joined(channelId, options));
1168
+ },
1169
+ async getPruneCount (guildId, options) {
1170
+ return await rest.get(rest.routes.guilds.prune(guildId, options));
1171
+ },
1172
+ async getPublicArchivedThreads (channelId, options) {
1173
+ return await rest.get(rest.routes.channels.threads.public(channelId, options));
1174
+ },
1175
+ async getRoles (guildId) {
1176
+ return await rest.get(rest.routes.guilds.roles.all(guildId));
1177
+ },
1178
+ async getRole (guildId, roleId) {
1179
+ return await rest.get(rest.routes.guilds.roles.one(guildId, roleId));
1180
+ },
1181
+ async getScheduledEvent (guildId, eventId, options) {
1182
+ return await rest.get(rest.routes.guilds.events.event(guildId, eventId, options?.withUserCount));
1183
+ },
1184
+ async getScheduledEvents (guildId, options) {
1185
+ return await rest.get(rest.routes.guilds.events.events(guildId, options?.withUserCount));
1186
+ },
1187
+ async getScheduledEventUsers (guildId, eventId, options) {
1188
+ return await rest.get(rest.routes.guilds.events.users(guildId, eventId, options));
1189
+ },
1190
+ async getSessionInfo () {
1191
+ return await rest.getGatewayBot();
1192
+ },
1193
+ async getStageInstance (channelId) {
1194
+ return await rest.get(rest.routes.channels.stage(channelId));
1195
+ },
1196
+ async getOwnVoiceState (guildId) {
1197
+ return await rest.get(rest.routes.guilds.voice(guildId));
1198
+ },
1199
+ async getUserVoiceState (guildId, userId) {
1200
+ return await rest.get(rest.routes.guilds.voice(guildId, userId));
1201
+ },
1202
+ async getSticker (stickerId) {
1203
+ return await rest.get(rest.routes.sticker(stickerId));
1204
+ },
1205
+ async getGuildSticker (guildId, stickerId) {
1206
+ return await rest.get(rest.routes.guilds.sticker(guildId, stickerId));
1207
+ },
1208
+ async getGuildStickers (guildId) {
1209
+ return await rest.get(rest.routes.guilds.stickers(guildId));
1210
+ },
1211
+ async getThreadMember (channelId, userId) {
1212
+ return await rest.get(rest.routes.channels.threads.user(channelId, userId));
1213
+ },
1214
+ async getThreadMembers (channelId) {
1215
+ return await rest.get(rest.routes.channels.threads.members(channelId));
1216
+ },
1217
+ async getReactions (channelId, messageId, reaction, options) {
1218
+ return await rest.get(rest.routes.channels.reactions.message(channelId, messageId, reaction, options));
1219
+ },
1220
+ async getUser (id) {
1221
+ return await rest.get(rest.routes.user(id));
1222
+ },
1223
+ async getCurrentUser (token) {
1224
+ return await rest.get(rest.routes.currentUser(), {
1225
+ headers: {
1226
+ authorization: `Bearer ${token}`
1227
+ },
1228
+ unauthorized: true
1229
+ });
1230
+ },
1231
+ async getUserConnections (token) {
1232
+ return await rest.get(rest.routes.oauth2.connections(), {
1233
+ headers: {
1234
+ authorization: `Bearer ${token}`
1235
+ },
1236
+ unauthorized: true
1237
+ });
1238
+ },
1239
+ async getUserApplicationRoleConnection (token, applicationId) {
1240
+ return await rest.get(rest.routes.oauth2.roleConnections(applicationId), {
1241
+ headers: {
1242
+ authorization: `Bearer ${token}`
1243
+ },
1244
+ unauthorized: true
1245
+ });
1246
+ },
1247
+ async getVanityUrl (guildId) {
1248
+ return await rest.get(rest.routes.guilds.vanity(guildId));
1249
+ },
1250
+ async getVoiceRegions (guildId) {
1251
+ return await rest.get(rest.routes.guilds.regions(guildId));
1252
+ },
1253
+ async getWebhook (webhookId) {
1254
+ return await rest.get(rest.routes.webhooks.id(webhookId));
1255
+ },
1256
+ async getWebhookMessage (webhookId, token, messageId, options) {
1257
+ return await rest.get(rest.routes.webhooks.message(webhookId, token, messageId, options), {
1258
+ unauthorized: true
1259
+ });
1260
+ },
1261
+ async getWebhookWithToken (webhookId, token) {
1262
+ return await rest.get(rest.routes.webhooks.webhook(webhookId, token), {
1263
+ unauthorized: true
1264
+ });
1265
+ },
1266
+ async getWelcomeScreen (guildId) {
1267
+ return await rest.get(rest.routes.guilds.welcome(guildId));
1268
+ },
1269
+ async getWidget (guildId) {
1270
+ return await rest.get(rest.routes.guilds.widgetJson(guildId));
1271
+ },
1272
+ async getWidgetSettings (guildId) {
1273
+ return await rest.get(rest.routes.guilds.widget(guildId));
1274
+ },
1275
+ async joinThread (channelId) {
1276
+ await rest.put(rest.routes.channels.threads.me(channelId));
1277
+ },
1278
+ async leaveGuild (guildId) {
1279
+ await rest.delete(rest.routes.guilds.leave(guildId));
1280
+ },
1281
+ async leaveThread (channelId) {
1282
+ await rest.delete(rest.routes.channels.threads.me(channelId));
1283
+ },
1284
+ async publishMessage (channelId, messageId) {
1285
+ return await rest.post(rest.routes.channels.crosspost(channelId, messageId));
1286
+ },
1287
+ async removeRole (guildId, userId, roleId, reason) {
1288
+ await rest.delete(rest.routes.guilds.roles.member(guildId, userId, roleId), {
1289
+ reason
1290
+ });
1291
+ },
1292
+ async removeThreadMember (channelId, userId) {
1293
+ await rest.delete(rest.routes.channels.threads.user(channelId, userId));
1294
+ },
1295
+ async removeDmRecipient (channelId, userId) {
1296
+ await rest.delete(rest.routes.channels.dmRecipient(channelId, userId));
1297
+ },
1298
+ async sendFollowupMessage (token, options) {
1299
+ return await rest.post(rest.routes.webhooks.webhook(rest.applicationId, token), {
1300
+ body: options,
1301
+ files: options.files,
1302
+ unauthorized: true
1303
+ });
1304
+ },
1305
+ async sendInteractionResponse (interactionId, token, options, params) {
1306
+ return await rest.post(rest.routes.interactions.responses.callback(interactionId, token, params), {
1307
+ body: options,
1308
+ files: options.data?.files,
1309
+ runThroughQueue: false,
1310
+ unauthorized: true
1311
+ });
1312
+ },
1313
+ async sendMessage (channelId, body) {
1314
+ return await rest.post(rest.routes.channels.messages(channelId), {
1315
+ body,
1316
+ files: body.files
1317
+ });
1318
+ },
1319
+ async startThreadWithMessage (channelId, messageId, body, reason) {
1320
+ return await rest.post(rest.routes.channels.threads.message(channelId, messageId), {
1321
+ body,
1322
+ reason
1323
+ });
1324
+ },
1325
+ async startThreadWithoutMessage (channelId, body, reason) {
1326
+ return await rest.post(rest.routes.channels.threads.all(channelId), {
1327
+ body,
1328
+ reason
1329
+ });
1330
+ },
1331
+ async getPollAnswerVoters (channelId, messageId, answerId, options) {
1332
+ return await rest.get(rest.routes.channels.polls.votes(channelId, messageId, answerId, options));
1333
+ },
1334
+ async endPoll (channelId, messageId) {
1335
+ return await rest.post(rest.routes.channels.polls.expire(channelId, messageId));
1336
+ },
1337
+ async syncGuildTemplate (guildId) {
1338
+ return await rest.put(rest.routes.guilds.templates.all(guildId));
1339
+ },
1340
+ async banMember (guildId, userId, body, reason) {
1341
+ await rest.put(rest.routes.guilds.members.ban(guildId, userId), {
1342
+ body,
1343
+ reason
1344
+ });
1345
+ },
1346
+ async bulkBanMembers (guildId, options, reason) {
1347
+ return await rest.post(rest.routes.guilds.members.bulkBan(guildId), {
1348
+ body: options,
1349
+ reason
1350
+ });
1351
+ },
1352
+ async editBotMember (guildId, body, reason) {
1353
+ return await rest.patch(rest.routes.guilds.members.bot(guildId), {
1354
+ body,
1355
+ reason
1356
+ });
1357
+ },
1358
+ async editMember (guildId, userId, body, reason) {
1359
+ return await rest.patch(rest.routes.guilds.members.member(guildId, userId), {
1360
+ body,
1361
+ reason
1362
+ });
1363
+ },
1364
+ async getMember (guildId, userId) {
1365
+ return await rest.get(rest.routes.guilds.members.member(guildId, userId));
1366
+ },
1367
+ async getCurrentMember (guildId, token) {
1368
+ return await rest.get(rest.routes.guilds.members.currentMember(guildId), {
1369
+ headers: {
1370
+ authorization: `Bearer ${token}`
1371
+ },
1372
+ unauthorized: true
1373
+ });
1374
+ },
1375
+ async getMembers (guildId, options) {
1376
+ return await rest.get(rest.routes.guilds.members.members(guildId, options));
1377
+ },
1378
+ async getApplicationActivityInstance (applicationId, instanceId) {
1379
+ return await rest.get(rest.routes.applicationActivityInstance(applicationId, instanceId));
1380
+ },
1381
+ async kickMember (guildId, userId, reason) {
1382
+ await rest.delete(rest.routes.guilds.members.member(guildId, userId), {
1383
+ reason
1384
+ });
1385
+ },
1386
+ async pinMessage (channelId, messageId, reason) {
1387
+ await rest.put(rest.routes.channels.pin(channelId, messageId), {
1388
+ reason
1389
+ });
1390
+ },
1391
+ async pruneMembers (guildId, body, reason) {
1392
+ return await rest.post(rest.routes.guilds.members.prune(guildId), {
1393
+ body,
1394
+ reason
1395
+ });
1396
+ },
1397
+ async searchMembers (guildId, query, options) {
1398
+ return await rest.get(rest.routes.guilds.members.search(guildId, query, options));
1399
+ },
1400
+ async getGuildOnboarding (guildId) {
1401
+ return await rest.get(rest.routes.guilds.onboarding(guildId));
1402
+ },
1403
+ async editGuildOnboarding (guildId, options, reason) {
1404
+ return await rest.put(rest.routes.guilds.onboarding(guildId), {
1405
+ body: options,
1406
+ reason
1407
+ });
1408
+ },
1409
+ async unbanMember (guildId, userId, reason) {
1410
+ await rest.delete(rest.routes.guilds.members.ban(guildId, userId), {
1411
+ reason
1412
+ });
1413
+ },
1414
+ async unpinMessage (channelId, messageId, reason) {
1415
+ await rest.delete(rest.routes.channels.pin(channelId, messageId), {
1416
+ reason
1417
+ });
1418
+ },
1419
+ async triggerTypingIndicator (channelId) {
1420
+ await rest.post(rest.routes.channels.typing(channelId));
1421
+ },
1422
+ async upsertGlobalApplicationCommands (body, options) {
1423
+ const restOptions = {
1424
+ body
1425
+ };
1426
+ if (options?.bearerToken) {
1427
+ restOptions.unauthorized = true;
1428
+ restOptions.headers = {
1429
+ authorization: `Bearer ${options.bearerToken}`
1430
+ };
1431
+ }
1432
+ return await rest.put(rest.routes.interactions.commands.commands(rest.applicationId), restOptions);
1433
+ },
1434
+ async upsertGuildApplicationCommands (guildId, body, options) {
1435
+ const restOptions = {
1436
+ body
1437
+ };
1438
+ if (options?.bearerToken) {
1439
+ restOptions.unauthorized = true;
1440
+ restOptions.headers = {
1441
+ authorization: `Bearer ${options.bearerToken}`
1442
+ };
1443
+ }
1444
+ return await rest.put(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), restOptions);
1445
+ },
1446
+ async editUserApplicationRoleConnection (token, applicationId, body) {
1447
+ return await rest.put(rest.routes.oauth2.roleConnections(applicationId), {
1448
+ body,
1449
+ headers: {
1450
+ authorization: `Bearer ${token}`
1451
+ },
1452
+ unauthorized: true
1453
+ });
1454
+ },
1455
+ async addGuildMember (guildId, userId, body) {
1456
+ return await rest.put(rest.routes.guilds.members.member(guildId, userId), {
1457
+ body
1458
+ });
1459
+ },
1460
+ async createTestEntitlement (applicationId, body) {
1461
+ return await rest.post(rest.routes.monetization.entitlements(applicationId), {
1462
+ body
1463
+ });
1464
+ },
1465
+ async listEntitlements (applicationId, options) {
1466
+ return await rest.get(rest.routes.monetization.entitlements(applicationId, options));
1467
+ },
1468
+ async getEntitlement (applicationId, entitlementId) {
1469
+ return await rest.get(rest.routes.monetization.entitlement(applicationId, entitlementId));
1470
+ },
1471
+ async deleteTestEntitlement (applicationId, entitlementId) {
1472
+ await rest.delete(rest.routes.monetization.entitlement(applicationId, entitlementId));
1473
+ },
1474
+ async consumeEntitlement (applicationId, entitlementId) {
1475
+ await rest.post(rest.routes.monetization.consumeEntitlement(applicationId, entitlementId));
1476
+ },
1477
+ async listSkus (applicationId) {
1478
+ return await rest.get(rest.routes.monetization.skus(applicationId));
1479
+ },
1480
+ async listSubscriptions (skuId, options) {
1481
+ return await rest.get(rest.routes.monetization.subscriptions(skuId, options));
1482
+ },
1483
+ async getSubscription (skuId, subscriptionId) {
1484
+ return await rest.get(rest.routes.monetization.subscription(skuId, subscriptionId));
1485
+ },
1486
+ async sendSoundboardSound (channelId, options) {
1487
+ await rest.post(rest.routes.soundboard.sendSound(channelId), {
1488
+ body: options
1489
+ });
1490
+ },
1491
+ async listDefaultSoundboardSounds () {
1492
+ return await rest.get(rest.routes.soundboard.listDefault());
1493
+ },
1494
+ async listGuildSoundboardSounds (guildId) {
1495
+ return await rest.get(rest.routes.soundboard.guildSounds(guildId));
1496
+ },
1497
+ async getGuildSoundboardSound (guildId, soundId) {
1498
+ return await rest.get(rest.routes.soundboard.guildSound(guildId, soundId));
1499
+ },
1500
+ async createGuildSoundboardSound (guildId, options, reason) {
1501
+ return await rest.post(rest.routes.soundboard.guildSounds(guildId), {
1502
+ body: options,
1503
+ reason
1504
+ });
1505
+ },
1506
+ async modifyGuildSoundboardSound (guildId, soundId, options, reason) {
1507
+ return await rest.post(rest.routes.soundboard.guildSound(guildId, soundId), {
1508
+ body: options,
1509
+ reason
1510
+ });
1511
+ },
1512
+ async deleteGuildSoundboardSound (guildId, soundId, reason) {
1513
+ return await rest.delete(rest.routes.soundboard.guildSound(guildId, soundId), {
1514
+ reason
1515
+ });
1516
+ },
1517
+ preferSnakeCase (enabled) {
1518
+ const camelizer = enabled ? (x)=>x : _utils.camelize;
1519
+ rest.get = async (url, options)=>{
1520
+ return camelizer(await rest.makeRequest('GET', url, options));
1521
+ };
1522
+ rest.post = async (url, options)=>{
1523
+ return camelizer(await rest.makeRequest('POST', url, options));
1524
+ };
1525
+ rest.delete = async (url, options)=>{
1526
+ camelizer(await rest.makeRequest('DELETE', url, options));
1527
+ };
1528
+ rest.patch = async (url, options)=>{
1529
+ return camelizer(await rest.makeRequest('PATCH', url, options));
1530
+ };
1531
+ rest.put = async (url, options)=>{
1532
+ return camelizer(await rest.makeRequest('PUT', url, options));
1533
+ };
1534
+ return rest;
1535
+ }
1536
+ };
1537
+ return rest;
1538
+ }
1539
+ var HttpResponseCode = /*#__PURE__*/ function(HttpResponseCode) {
1540
+ /** Minimum value of a code in oder to consider that it was successful. */ HttpResponseCode[HttpResponseCode["Success"] = 200] = "Success";
1541
+ /** Request completed successfully, but Discord returned an empty body. */ HttpResponseCode[HttpResponseCode["NoContent"] = 204] = "NoContent";
1542
+ /** Minimum value of a code in order to consider that something went wrong. */ HttpResponseCode[HttpResponseCode["Error"] = 400] = "Error";
1543
+ /** This request got rate limited. */ HttpResponseCode[HttpResponseCode["TooManyRequests"] = 429] = "TooManyRequests";
1544
+ return HttpResponseCode;
1545
+ }(HttpResponseCode || {});
1546
+
1547
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ25vZGU6YnVmZmVyJ1xuaW1wb3J0IHtcbiAgdHlwZSBCaWdTdHJpbmcsXG4gIHR5cGUgQ2FtZWxpemUsXG4gIHR5cGUgRGlzY29yZEFjY2Vzc1Rva2VuUmVzcG9uc2UsXG4gIHR5cGUgRGlzY29yZEFjdGl2aXR5SW5zdGFuY2UsXG4gIHR5cGUgRGlzY29yZEFwcGxpY2F0aW9uLFxuICB0eXBlIERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQsXG4gIHR5cGUgRGlzY29yZEFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24sXG4gIHR5cGUgRGlzY29yZEF1ZGl0TG9nLFxuICB0eXBlIERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGUsXG4gIHR5cGUgRGlzY29yZEJhbixcbiAgdHlwZSBEaXNjb3JkQnVsa0JhbixcbiAgdHlwZSBEaXNjb3JkQ2hhbm5lbCxcbiAgdHlwZSBEaXNjb3JkQ29ubmVjdGlvbixcbiAgdHlwZSBEaXNjb3JkQ3VycmVudEF1dGhvcml6YXRpb24sXG4gIHR5cGUgRGlzY29yZEVtb2ppLFxuICB0eXBlIERpc2NvcmRFbnRpdGxlbWVudCxcbiAgdHlwZSBEaXNjb3JkRm9sbG93ZWRDaGFubmVsLFxuICB0eXBlIERpc2NvcmRHZXRBbnN3ZXJWb3Rlc1Jlc3BvbnNlLFxuICB0eXBlIERpc2NvcmRHZXRHYXRld2F5Qm90LFxuICB0eXBlIERpc2NvcmRHdWlsZCxcbiAgdHlwZSBEaXNjb3JkR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyxcbiAgdHlwZSBEaXNjb3JkR3VpbGRPbmJvYXJkaW5nLFxuICB0eXBlIERpc2NvcmRHdWlsZFByZXZpZXcsXG4gIHR5cGUgRGlzY29yZEd1aWxkV2lkZ2V0LFxuICB0eXBlIERpc2NvcmRHdWlsZFdpZGdldFNldHRpbmdzLFxuICB0eXBlIERpc2NvcmRJbnRlZ3JhdGlvbixcbiAgdHlwZSBEaXNjb3JkSW50ZXJhY3Rpb25DYWxsYmFja1Jlc3BvbnNlLFxuICB0eXBlIERpc2NvcmRJbnZpdGUsXG4gIHR5cGUgRGlzY29yZEludml0ZU1ldGFkYXRhLFxuICB0eXBlIERpc2NvcmRMaXN0QWN0aXZlVGhyZWFkcyxcbiAgdHlwZSBEaXNjb3JkTGlzdEFyY2hpdmVkVGhyZWFkcyxcbiAgdHlwZSBEaXNjb3JkTWVtYmVyLFxuICB0eXBlIERpc2NvcmRNZW1iZXJXaXRoVXNlcixcbiAgdHlwZSBEaXNjb3JkTWVzc2FnZSxcbiAgdHlwZSBEaXNjb3JkUHJ1bmVkQ291bnQsXG4gIHR5cGUgRGlzY29yZFJvbGUsXG4gIHR5cGUgRGlzY29yZFNjaGVkdWxlZEV2ZW50LFxuICB0eXBlIERpc2NvcmRTa3UsXG4gIHR5cGUgRGlzY29yZFNvdW5kYm9hcmRTb3VuZCxcbiAgdHlwZSBEaXNjb3JkU3RhZ2VJbnN0YW5jZSxcbiAgdHlwZSBEaXNjb3JkU3RpY2tlcixcbiAgdHlwZSBEaXNjb3JkU3RpY2tlclBhY2ssXG4gIHR5cGUgRGlzY29yZFN1YnNjcmlwdGlvbixcbiAgdHlwZSBEaXNjb3JkVGVtcGxhdGUsXG4gIHR5cGUgRGlzY29yZFRocmVhZE1lbWJlcixcbiAgdHlwZSBEaXNjb3JkVXNlcixcbiAgdHlwZSBEaXNjb3JkVmFuaXR5VXJsLFxuICB0eXBlIERpc2NvcmRWb2ljZVJlZ2lvbixcbiAgdHlwZSBEaXNjb3JkVm9pY2VTdGF0ZSxcbiAgdHlwZSBEaXNjb3JkV2ViaG9vayxcbiAgdHlwZSBEaXNjb3JkV2VsY29tZVNjcmVlbixcbiAgSW50ZXJhY3Rpb25SZXNwb25zZVR5cGVzLFxuICB0eXBlIE1mYUxldmVscyxcbiAgdHlwZSBNb2RpZnlHdWlsZFRlbXBsYXRlLFxufSBmcm9tICdAZGlzY29yZGVuby90eXBlcydcbmltcG9ydCB7IGNhbGN1bGF0ZUJpdHMsIGNhbWVsVG9TbmFrZUNhc2UsIGNhbWVsaXplLCBkZWxheSwgZ2V0Qm90SWRGcm9tVG9rZW4sIGxvZ2dlciwgcHJvY2Vzc1JlYWN0aW9uU3RyaW5nLCB1cmxUb0Jhc2U2NCB9IGZyb20gJ0BkaXNjb3JkZW5vL3V0aWxzJ1xuaW1wb3J0IHsgY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQgfSBmcm9tICcuL2ludmFsaWRCdWNrZXQuanMnXG5pbXBvcnQgeyBRdWV1ZSB9IGZyb20gJy4vcXVldWUuanMnXG5pbXBvcnQgeyBjcmVhdGVSb3V0ZXMgfSBmcm9tICcuL3JvdXRlcy5qcydcbmltcG9ydCB0eXBlIHsgQ3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCBDcmVhdGVSZXN0TWFuYWdlck9wdGlvbnMsIE1ha2VSZXF1ZXN0T3B0aW9ucywgUmVzdE1hbmFnZXIsIFNlbmRSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4vdHlwZXMuanMnXG5cbi8vIFRPRE86IG1ha2UgZHluYW1pYyBiYXNlZCBvbiBwYWNrYWdlLmpzb24gZmlsZVxuY29uc3QgdmVyc2lvbiA9ICcxOS4wLjAnXG5cbmV4cG9ydCBjb25zdCBESVNDT1JEX0FQSV9WRVJTSU9OID0gMTBcbmV4cG9ydCBjb25zdCBESVNDT1JEX0FQSV9VUkwgPSAnaHR0cHM6Ly9kaXNjb3JkLmNvbS9hcGknXG5cbmV4cG9ydCBjb25zdCBBVURJVF9MT0dfUkVBU09OX0hFQURFUiA9ICd4LWF1ZGl0LWxvZy1yZWFzb24nXG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9SRU1BSU5JTkdfSEVBREVSID0gJ3gtcmF0ZWxpbWl0LXJlbWFpbmluZydcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX1JFU0VUX0FGVEVSX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1yZXNldC1hZnRlcidcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX0dMT0JBTF9IRUFERVIgPSAneC1yYXRlbGltaXQtZ2xvYmFsJ1xuZXhwb3J0IGNvbnN0IFJBVEVfTElNSVRfQlVDS0VUX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1idWNrZXQnXG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9MSU1JVF9IRUFERVIgPSAneC1yYXRlbGltaXQtbGltaXQnXG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9TQ09QRV9IRUFERVIgPSAneC1yYXRlbGltaXQtc2NvcGUnXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZXN0TWFuYWdlcihvcHRpb25zOiBDcmVhdGVSZXN0TWFuYWdlck9wdGlvbnMpOiBSZXN0TWFuYWdlciB7XG4gIGNvbnN0IGFwcGxpY2F0aW9uSWQgPSBvcHRpb25zLmFwcGxpY2F0aW9uSWQgPyBCaWdJbnQob3B0aW9ucy5hcHBsaWNhdGlvbklkKSA6IGdldEJvdElkRnJvbVRva2VuKG9wdGlvbnMudG9rZW4pXG5cbiAgY29uc3QgYmFzZVVybCA9IG9wdGlvbnMucHJveHk/LmJhc2VVcmwgPz8gRElTQ09SRF9BUElfVVJMXG5cbiAgY29uc3QgcmVzdDogUmVzdE1hbmFnZXIgPSB7XG4gICAgYXBwbGljYXRpb25JZCxcbiAgICBhdXRob3JpemF0aW9uOiBvcHRpb25zLnByb3h5Py5hdXRob3JpemF0aW9uLFxuICAgIGF1dGhvcml6YXRpb25IZWFkZXI6IG9wdGlvbnMucHJveHk/LmF1dGhvcml6YXRpb25IZWFkZXIgPz8gJ2F1dGhvcml6YXRpb24nLFxuICAgIGJhc2VVcmwsXG4gICAgZGVsZXRlUXVldWVEZWxheTogNjAwMDAsXG4gICAgZ2xvYmFsbHlSYXRlTGltaXRlZDogZmFsc2UsXG4gICAgaW52YWxpZEJ1Y2tldDogY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQoeyBsb2dnZXI6IG9wdGlvbnMubG9nZ2VyIH0pLFxuICAgIGlzUHJveGllZDogIWJhc2VVcmwuc3RhcnRzV2l0aChESVNDT1JEX0FQSV9VUkwpLFxuICAgIHVwZGF0ZUJlYXJlclRva2VuRW5kcG9pbnQ6IG9wdGlvbnMucHJveHk/LnVwZGF0ZUJlYXJlclRva2VuRW5kcG9pbnQsXG4gICAgbWF4UmV0cnlDb3VudDogSW5maW5pdHksXG4gICAgcHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHM6IGZhbHNlLFxuICAgIHF1ZXVlczogbmV3IE1hcCgpLFxuICAgIHJhdGVMaW1pdGVkUGF0aHM6IG5ldyBNYXAoKSxcbiAgICB0b2tlbjogb3B0aW9ucy50b2tlbixcbiAgICB2ZXJzaW9uOiBvcHRpb25zLnZlcnNpb24gPz8gRElTQ09SRF9BUElfVkVSU0lPTixcbiAgICBsb2dnZXI6IG9wdGlvbnMubG9nZ2VyID8/IGxvZ2dlcixcblxuICAgIHJvdXRlczogY3JlYXRlUm91dGVzKCksXG5cbiAgICBjcmVhdGVCYXNlSGVhZGVycygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICd1c2VyLWFnZW50JzogYERpc2NvcmRCb3QgKGh0dHBzOi8vZ2l0aHViLmNvbS9kaXNjb3JkZW5vL2Rpc2NvcmRlbm8sIHYke3ZlcnNpb259KWAsXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNoZWNrUmF0ZUxpbWl0cyh1cmwsIGlkZW50aWZpZXIpIHtcbiAgICAgIGNvbnN0IHJhdGVsaW1pdGVkID0gcmVzdC5yYXRlTGltaXRlZFBhdGhzLmdldChgJHtpZGVudGlmaWVyfSR7dXJsfWApXG5cbiAgICAgIGNvbnN0IGdsb2JhbCA9IHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5nZXQoJ2dsb2JhbCcpXG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG5cbiAgICAgIGlmIChyYXRlbGltaXRlZCAmJiBub3cgPCByYXRlbGltaXRlZC5yZXNldFRpbWVzdGFtcCkge1xuICAgICAgICByZXR1cm4gcmF0ZWxpbWl0ZWQucmVzZXRUaW1lc3RhbXAgLSBub3dcbiAgICAgIH1cblxuICAgICAgaWYgKGdsb2JhbCAmJiBub3cgPCBnbG9iYWwucmVzZXRUaW1lc3RhbXApIHtcbiAgICAgICAgcmV0dXJuIGdsb2JhbC5yZXNldFRpbWVzdGFtcCAtIG5vd1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBkYXRlVG9rZW5RdWV1ZXMob2xkVG9rZW4sIG5ld1Rva2VuKSB7XG4gICAgICBpZiAocmVzdC5pc1Byb3hpZWQpIHtcbiAgICAgICAgaWYgKCFyZXN0LnVwZGF0ZUJlYXJlclRva2VuRW5kcG9pbnQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIlRoZSAncHJveHkudXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludCcgb3B0aW9uIG5lZWRzIHRvIGJlIHNldCB3aGVuIHVzaW5nIGEgcmVzdCBwcm94eSBhbmQgbmVlZGVkIHRvIGNhbGwgJ3VwZGF0ZVRva2VuUXVldWVzJ1wiLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG5cbiAgICAgICAgaWYgKHJlc3QuYXV0aG9yaXphdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaGVhZGVyc1tyZXN0LmF1dGhvcml6YXRpb25IZWFkZXJdID0gcmVzdC5hdXRob3JpemF0aW9uXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBmZXRjaChgJHtyZXN0LmJhc2VVcmx9LyR7cmVzdC51cGRhdGVCZWFyZXJUb2tlbkVuZHBvaW50fWAsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBvbGRUb2tlbixcbiAgICAgICAgICAgIG5ld1Rva2VuLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld0lkZW50aWZpZXIgPSBgQmVhcmVyICR7bmV3VG9rZW59YFxuXG4gICAgICAvLyBVcGRhdGUgYWxsIHRoZSBxdWV1ZXNcbiAgICAgIGZvciAoY29uc3QgW2tleSwgcXVldWVdIG9mIHJlc3QucXVldWVzLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKGBCZWFyZXIgJHtvbGRUb2tlbn1gKSkgY29udGludWVcblxuICAgICAgICByZXN0LnF1ZXVlcy5kZWxldGUoa2V5KVxuICAgICAgICBxdWV1ZS5pZGVudGlmaWVyID0gbmV3SWRlbnRpZmllclxuXG4gICAgICAgIGNvbnN0IG5ld0tleSA9IGAke25ld0lkZW50aWZpZXJ9JHtxdWV1ZS51cmx9YFxuICAgICAgICBjb25zdCBuZXdRdWV1ZSA9IHJlc3QucXVldWVzLmdldChuZXdLZXkpXG5cbiAgICAgICAgLy8gTWVyZ2UgdGhlIHF1ZXVlc1xuICAgICAgICBpZiAobmV3UXVldWUpIHtcbiAgICAgICAgICBuZXdRdWV1ZS53YWl0aW5nLnVuc2hpZnQoLi4ucXVldWUud2FpdGluZylcbiAgICAgICAgICBuZXdRdWV1ZS5wZW5kaW5nLnVuc2hpZnQoLi4ucXVldWUucGVuZGluZylcblxuICAgICAgICAgIHF1ZXVlLndhaXRpbmcgPSBbXVxuICAgICAgICAgIHF1ZXVlLnBlbmRpbmcgPSBbXVxuXG4gICAgICAgICAgcXVldWUuY2xlYW51cCgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdC5xdWV1ZXMuc2V0KG5ld0tleSwgcXVldWUpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBba2V5LCByYXRlbGltaXRQYXRoXSBvZiByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZW50cmllcygpKSB7XG4gICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoYEJlYXJlciAke29sZFRva2VufWApKSBjb250aW51ZVxuXG4gICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQoYCR7bmV3SWRlbnRpZmllcn0ke3JhdGVsaW1pdFBhdGgudXJsfWAsIHJhdGVsaW1pdFBhdGgpXG5cbiAgICAgICAgaWYgKHJhdGVsaW1pdFBhdGguYnVja2V0SWQpIHtcbiAgICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGAke25ld0lkZW50aWZpZXJ9JHtyYXRlbGltaXRQYXRoLmJ1Y2tldElkfWAsIHJhdGVsaW1pdFBhdGgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2hhbmdlVG9EaXNjb3JkRm9ybWF0KG9iajogYW55KTogYW55IHtcbiAgICAgIGlmIChvYmogPT09IG51bGwpIHJldHVybiBudWxsXG5cbiAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgcmV0dXJuIG9iai5tYXAoKGl0ZW0pID0+IHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KGl0ZW0pKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3T2JqOiBhbnkgPSB7fVxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9iaikpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldXG5cbiAgICAgICAgICAvLyBJZiB0aGUga2V5IGlzIGFscmVhZHkgaW4gc25ha2VfY2FzZSB3ZSBjYW4gYXNzdW1lIGl0IGlzIGFscmVhZHkgaW4gdGhlIGRpc2NvcmQgZm9ybWF0LlxuICAgICAgICAgIGlmIChrZXkuaW5jbHVkZXMoJ18nKSkge1xuICAgICAgICAgICAgbmV3T2JqW2tleV0gPSB2YWx1ZVxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTb21lIGZhbHN5IHZhbHVlcyBzaG91bGQgYmUgYWxsb3dlZCBsaWtlIG51bGwgb3IgMFxuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgICBjYXNlICdwZXJtaXNzaW9ucyc6XG4gICAgICAgICAgICAgIGNhc2UgJ2FsbG93JzpcbiAgICAgICAgICAgICAgY2FzZSAnZGVueSc6XG4gICAgICAgICAgICAgICAgbmV3T2JqW2tleV0gPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBjYWxjdWxhdGVCaXRzKHZhbHVlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIGNhc2UgJ2RlZmF1bHRNZW1iZXJQZXJtaXNzaW9ucyc6XG4gICAgICAgICAgICAgICAgbmV3T2JqLmRlZmF1bHRfbWVtYmVyX3Blcm1pc3Npb25zID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogY2FsY3VsYXRlQml0cyh2YWx1ZSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICBjYXNlICduYW1lTG9jYWxpemF0aW9ucyc6XG4gICAgICAgICAgICAgICAgbmV3T2JqLm5hbWVfbG9jYWxpemF0aW9ucyA9IHZhbHVlXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgY2FzZSAnZGVzY3JpcHRpb25Mb2NhbGl6YXRpb25zJzpcbiAgICAgICAgICAgICAgICBuZXdPYmouZGVzY3JpcHRpb25fbG9jYWxpemF0aW9ucyA9IHZhbHVlXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXdPYmpbY2FtZWxUb1NuYWtlQ2FzZShrZXkpXSA9IHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KHZhbHVlKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ld09ialxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ2JpZ2ludCcpIHJldHVybiBvYmoudG9TdHJpbmcoKVxuXG4gICAgICByZXR1cm4gb2JqXG4gICAgfSxcblxuICAgIGNyZWF0ZVJlcXVlc3RCb2R5KG1ldGhvZCwgb3B0aW9ucykge1xuICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuY3JlYXRlQmFzZUhlYWRlcnMoKVxuXG4gICAgICBpZiAob3B0aW9ucz8udW5hdXRob3JpemVkICE9PSB0cnVlKSBoZWFkZXJzLmF1dGhvcml6YXRpb24gPSBgQm90ICR7cmVzdC50b2tlbn1gXG5cbiAgICAgIC8vIElGIEEgUkVBU09OIElTIFBST1ZJREVEIEVOQ09ERSBJVCBJTiBIRUFERVJTXG4gICAgICBpZiAob3B0aW9ucz8ucmVhc29uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tBVURJVF9MT0dfUkVBU09OX0hFQURFUl0gPSBlbmNvZGVVUklDb21wb25lbnQob3B0aW9ucz8ucmVhc29uKVxuICAgICAgfVxuXG4gICAgICBsZXQgYm9keTogc3RyaW5nIHwgRm9ybURhdGEgfCB1bmRlZmluZWRcblxuICAgICAgLy8gVE9ETzogY2hlY2sgaWYgd2UgbmVlZCB0byBhZGQgc3BlY2lmaWMgY2hlY2sgZm9yIEdFVCBtZXRob2RcbiAgICAgIC8vIFNpbmNlIEdFVCBkb2VzIG5vdCBhbGxvdyBib2RpZXNcblxuICAgICAgLy8gSGF2ZSB0byBjaGVjayBmb3IgYXR0YWNobWVudHMgZmlyc3QsIHNpbmNlIGJvZHkgdGhlbiBoYXMgdG8gYmUgc2VuZCBpbiBhIGRpZmZlcmVudCB3YXkuXG4gICAgICBpZiAob3B0aW9ucz8uZmlsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKClcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHRpb25zLmZpbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgZm9ybS5hcHBlbmQoYGZpbGUke2l9YCwgb3B0aW9ucy5maWxlc1tpXS5ibG9iLCBvcHRpb25zLmZpbGVzW2ldLm5hbWUpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYXZlIHRvIHVzZSBjaGFuZ2VUb0Rpc2NvcmRGb3JtYXQgb3IgZWxzZSBKU09OLnN0cmluZ2lmeSBtYXkgdGhyb3cgYW4gZXJyb3IgZm9yIHRoZSBwcmVzZW5jZSBvZiBCaWdJbnQocykgaW4gdGhlIGpzb25cbiAgICAgICAgZm9ybS5hcHBlbmQoJ3BheWxvYWRfanNvbicsIEpTT04uc3RyaW5naWZ5KHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KHsgLi4ub3B0aW9ucy5ib2R5LCBmaWxlczogdW5kZWZpbmVkIH0pKSlcblxuICAgICAgICAvLyBObyBuZWVkIHRvIHNldCB0aGUgYGNvbnRlbnQtdHlwZWAgaGVhZGVyIHNpbmNlIGBmZXRjaGAgZG9lcyB0aGF0IGF1dG9tYXRpY2FsbHkgZm9yIHVzIHdoZW4gd2UgdXNlIGEgYEZvcm1EYXRhYCBvYmplY3QuXG4gICAgICAgIGJvZHkgPSBmb3JtXG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnM/LmJvZHkgJiYgb3B0aW9ucy5oZWFkZXJzICYmIG9wdGlvbnMuaGVhZGVyc1snY29udGVudC10eXBlJ10gPT09ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSB7XG4gICAgICAgIC8vIE9BdXRoMiBib2R5IGhhbmRsaW5nXG4gICAgICAgIGNvbnN0IGZvcm1Cb2R5OiBzdHJpbmdbXSA9IFtdXG5cbiAgICAgICAgY29uc3QgZGlzY29yZEJvZHkgPSByZXN0LmNoYW5nZVRvRGlzY29yZEZvcm1hdChvcHRpb25zLmJvZHkpXG5cbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIGRpc2NvcmRCb2R5KSB7XG4gICAgICAgICAgZm9ybUJvZHkucHVzaChgJHtlbmNvZGVVUklDb21wb25lbnQocHJvcCl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KGRpc2NvcmRCb2R5W3Byb3BdKX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgYm9keSA9IGZvcm1Cb2R5LmpvaW4oJyYnKVxuICAgICAgfSBlbHNlIGlmIChvcHRpb25zPy5ib2R5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuYm9keSBpbnN0YW5jZW9mIEZvcm1EYXRhKSB7XG4gICAgICAgICAgYm9keSA9IG9wdGlvbnMuYm9keVxuICAgICAgICAgIC8vIE5vIG5lZWQgdG8gc2V0IHRoZSBgY29udGVudC10eXBlYCBoZWFkZXIgc2luY2UgYGZldGNoYCBkb2VzIHRoYXQgYXV0b21hdGljYWxseSBmb3IgdXMgd2hlbiB3ZSB1c2UgYSBgRm9ybURhdGFgIG9iamVjdC5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBib2R5ID0gSlNPTi5zdHJpbmdpZnkocmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQob3B0aW9ucy5ib2R5KSlcbiAgICAgICAgICBoZWFkZXJzWydjb250ZW50LXR5cGUnXSA9IGBhcHBsaWNhdGlvbi9qc29uYFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNPTUVUSU1FUyBTUEVDSUFMIEhFQURFUlMgKEUuRy4gQ1VTVE9NIEFVVEhPUklaQVRJT04pIE5FRUQgVE8gQkUgVVNFRFxuICAgICAgaWYgKG9wdGlvbnM/LmhlYWRlcnMpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihoZWFkZXJzLCBvcHRpb25zLmhlYWRlcnMpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIG1ldGhvZCxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHMoKSB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG5cbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5lbnRyaWVzKCkpIHtcbiAgICAgICAgLy8gICByZXN0LmRlYnVnKFxuICAgICAgICAvLyBgW1JFU1QgLSBwcm9jZXNzUmF0ZUxpbWl0ZWRQYXRoc10gUnVubmluZyBmb3Igb2YgbG9vcC4gJHtcbiAgICAgICAgLy8gICB2YWx1ZS5yZXNldFRpbWVzdGFtcCAtIG5vd1xuICAgICAgICAvLyB9YFxuICAgICAgICAvLyAgIClcbiAgICAgICAgLy8gSWYgdGhlIHRpbWUgaGFzIG5vdCByZWFjaGVkIGNhbmNlbFxuICAgICAgICBpZiAodmFsdWUucmVzZXRUaW1lc3RhbXAgPiBub3cpIGNvbnRpbnVlXG5cbiAgICAgICAgLy8gUmF0ZSBsaW1pdCBpcyBvdmVyLCBkZWxldGUgdGhlIHJhdGUgbGltaXRlclxuICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZGVsZXRlKGtleSlcbiAgICAgICAgLy8gSWYgaXQgd2FzIGdsb2JhbCwgYWxzbyBtYXJrIHRoZSBnbG9iYWwgdmFsdWUgYXMgZmFsc2VcbiAgICAgICAgaWYgKGtleSA9PT0gJ2dsb2JhbCcpIHJlc3QuZ2xvYmFsbHlSYXRlTGltaXRlZCA9IGZhbHNlXG4gICAgICB9XG5cbiAgICAgIC8vIEFMTCBQQVRIUyBBUkUgQ0xFQVJFRCBDQU4gQ0FOQ0VMIE9VVCFcbiAgICAgIGlmIChyZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXN0LnByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzID0gZmFsc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMgPSB0cnVlXG4gICAgICAgIC8vIFJFQ0hFQ0sgSU4gMSBTRUNPTkRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgLy8gcmVzdC5kZWJ1ZygnW1JFU1QgLSBwcm9jZXNzUmF0ZUxpbWl0ZWRQYXRoc10gUnVubmluZyBzZXRUaW1lb3V0LicpXG4gICAgICAgICAgcmVzdC5wcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocygpXG4gICAgICAgIH0sIDEwMDApXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKiBQcm9jZXNzZXMgdGhlIHJhdGUgbGltaXQgaGVhZGVycyBhbmQgZGV0ZXJtaW5lcyBpZiBpdCBuZWVkcyB0byBiZSByYXRlIGxpbWl0ZWQgYW5kIHJldHVybnMgdGhlIGJ1Y2tldCBpZCBpZiBhdmFpbGFibGUgKi9cbiAgICBwcm9jZXNzSGVhZGVycyh1cmwsIGhlYWRlcnMsIGlkZW50aWZpZXIpIHtcbiAgICAgIGxldCByYXRlTGltaXRlZCA9IGZhbHNlXG5cbiAgICAgIC8vIEdFVCBBTEwgTkVDRVNTQVJZIEhFQURFUlNcbiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfUkVNQUlOSU5HX0hFQURFUilcbiAgICAgIGNvbnN0IHJldHJ5QWZ0ZXIgPSBoZWFkZXJzLmdldChSQVRFX0xJTUlUX1JFU0VUX0FGVEVSX0hFQURFUilcbiAgICAgIGNvbnN0IHJlc2V0ID0gRGF0ZS5ub3coKSArIE51bWJlcihyZXRyeUFmdGVyKSAqIDEwMDBcbiAgICAgIGNvbnN0IGdsb2JhbCA9IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfR0xPQkFMX0hFQURFUilcbiAgICAgIC8vIHVuZGVmaW5lZCBvdmVycmlkZSBudWxsIG5lZWRlZCBmb3IgdHlwaW5nc1xuICAgICAgY29uc3QgYnVja2V0SWQgPSBoZWFkZXJzLmdldChSQVRFX0xJTUlUX0JVQ0tFVF9IRUFERVIpID8/IHVuZGVmaW5lZFxuICAgICAgY29uc3QgbGltaXQgPSBoZWFkZXJzLmdldChSQVRFX0xJTUlUX0xJTUlUX0hFQURFUilcblxuICAgICAgLy8gSWYgd2UgZGlkbid0IHJlY2VpdmVkIHRoZSBpZGVudGlmaWVyLCBmYWxsYmFjayB0byB0aGUgYm90IHRva2VuXG4gICAgICBpZGVudGlmaWVyID8/PSBgQm90ICR7cmVzdC50b2tlbn1gXG5cbiAgICAgIHJlc3QucXVldWVzLmdldChgJHtpZGVudGlmaWVyfSR7dXJsfWApPy5oYW5kbGVDb21wbGV0ZWRSZXF1ZXN0KHtcbiAgICAgICAgcmVtYWluaW5nOiByZW1haW5pbmcgPyBOdW1iZXIocmVtYWluaW5nKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgaW50ZXJ2YWw6IHJldHJ5QWZ0ZXIgPyBOdW1iZXIocmV0cnlBZnRlcikgKiAxMDAwIDogdW5kZWZpbmVkLFxuICAgICAgICBtYXg6IGxpbWl0ID8gTnVtYmVyKGxpbWl0KSA6IHVuZGVmaW5lZCxcbiAgICAgIH0pXG5cbiAgICAgIC8vIElGIFRIRVJFIElTIE5PIFJFTUFJTklORyBSQVRFIExJTUlULCBNQVJLIElUIEFTIFJBVEUgTElNSVRFRFxuICAgICAgaWYgKHJlbWFpbmluZyA9PT0gJzAnKSB7XG4gICAgICAgIHJhdGVMaW1pdGVkID0gdHJ1ZVxuXG4gICAgICAgIC8vIFNBVkUgVEhFIFVSTCBBUyBMSU1JVEVELCBJTVBPUlRBTlQgRk9SIE5FVyBSRVFVRVNUUyBCWSBVU0VSIFdJVEhPVVQgQlVDS0VUXG4gICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQoYCR7aWRlbnRpZmllcn0ke3VybH1gLCB7XG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIHJlc2V0VGltZXN0YW1wOiByZXNldCxcbiAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBTQVZFIFRIRSBCVUNLRVQgQVMgTElNSVRFRCBTSU5DRSBESUZGRVJFTlQgVVJMUyBNQVkgU0hBUkUgQSBCVUNLRVRcbiAgICAgICAgaWYgKGJ1Y2tldElkKSB7XG4gICAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldChgJHtpZGVudGlmaWVyfSR7YnVja2V0SWR9YCwge1xuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgcmVzZXRUaW1lc3RhbXA6IHJlc2V0LFxuICAgICAgICAgICAgYnVja2V0SWQsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJRiBUSEVSRSBJUyBOTyBSRU1BSU5JTkcgR0xPQkFMIExJTUlULCBNQVJLIElUIFJBVEUgTElNSVRFRCBHTE9CQUxMWVxuICAgICAgaWYgKGdsb2JhbCkge1xuICAgICAgICBjb25zdCByZXRyeUFmdGVyID0gTnVtYmVyKGhlYWRlcnMuZ2V0KCdyZXRyeS1hZnRlcicpKSAqIDEwMDBcbiAgICAgICAgY29uc3QgZ2xvYmFsUmVzZXQgPSBEYXRlLm5vdygpICsgcmV0cnlBZnRlclxuICAgICAgICAvLyAgIHJlc3QuZGVidWcoXG4gICAgICAgIC8vIGBbUkVTVCA9IEdsb2JhbGx5IFJhdGUgTGltaXRlZF0gVVJMOiAke3VybH0gfCBHbG9iYWwgUmVzdDogJHtnbG9iYWxSZXNldH1gXG4gICAgICAgIC8vICAgKVxuICAgICAgICByZXN0Lmdsb2JhbGx5UmF0ZUxpbWl0ZWQgPSB0cnVlXG4gICAgICAgIHJhdGVMaW1pdGVkID0gdHJ1ZVxuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHJlc3QuZ2xvYmFsbHlSYXRlTGltaXRlZCA9IGZhbHNlXG4gICAgICAgIH0sIHJldHJ5QWZ0ZXIpXG5cbiAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldCgnZ2xvYmFsJywge1xuICAgICAgICAgIHVybDogJ2dsb2JhbCcsXG4gICAgICAgICAgcmVzZXRUaW1lc3RhbXA6IGdsb2JhbFJlc2V0LFxuICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChidWNrZXRJZCkge1xuICAgICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQoaWRlbnRpZmllciwge1xuICAgICAgICAgICAgdXJsOiAnZ2xvYmFsJyxcbiAgICAgICAgICAgIHJlc2V0VGltZXN0YW1wOiBnbG9iYWxSZXNldCxcbiAgICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJhdGVMaW1pdGVkICYmICFyZXN0LnByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzKSB7XG4gICAgICAgIHJlc3QucHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHMoKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJhdGVMaW1pdGVkID8gYnVja2V0SWQgOiB1bmRlZmluZWRcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZFJlcXVlc3Qob3B0aW9ucykge1xuICAgICAgY29uc3QgdXJsID0gYCR7cmVzdC5iYXNlVXJsfS92JHtyZXN0LnZlcnNpb259JHtvcHRpb25zLnJvdXRlfWBcbiAgICAgIGNvbnN0IHBheWxvYWQgPSByZXN0LmNyZWF0ZVJlcXVlc3RCb2R5KG9wdGlvbnMubWV0aG9kLCBvcHRpb25zLnJlcXVlc3RCb2R5T3B0aW9ucylcblxuICAgICAgY29uc3QgbG9nZ2luZ0hlYWRlcnMgPSB7IC4uLnBheWxvYWQuaGVhZGVycyB9XG5cbiAgICAgIGlmIChwYXlsb2FkLmhlYWRlcnMuYXV0aG9yaXphdGlvbikge1xuICAgICAgICBjb25zdCBhdXRob3JpemF0aW9uU2NoZW1lID0gcGF5bG9hZC5oZWFkZXJzLmF1dGhvcml6YXRpb24/LnNwbGl0KCcgJylbMF1cbiAgICAgICAgbG9nZ2luZ0hlYWRlcnMuYXV0aG9yaXphdGlvbiA9IGAke2F1dGhvcml6YXRpb25TY2hlbWV9IHRva2VuaGVyZWBcbiAgICAgIH1cblxuICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYHNlbmRpbmcgcmVxdWVzdCB0byAke3VybH1gLCAnd2l0aCBwYXlsb2FkOicsIHsgLi4ucGF5bG9hZCwgaGVhZGVyczogbG9nZ2luZ0hlYWRlcnMgfSlcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCBwYXlsb2FkKS5jYXRjaChhc3luYyAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVzdC5sb2dnZXIuZXJyb3IoZXJyb3IpXG4gICAgICAgIC8vIE1hcmsgcmVxdWVzdCBhbmQgY29tcGxldGVkXG4gICAgICAgIHJlc3QuaW52YWxpZEJ1Y2tldC5oYW5kbGVDb21wbGV0ZWRSZXF1ZXN0KDk5OSwgZmFsc2UpXG4gICAgICAgIG9wdGlvbnMucmVqZWN0KHtcbiAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgc3RhdHVzOiA5OTksXG4gICAgICAgICAgZXJyb3I6ICdQb3NzaWJsZSBuZXR3b3JrIG9yIHJlcXVlc3Qgc2hhcGUgaXNzdWUgb2NjdXJyZWQuIElmIHRoaXMgaXMgcmFyZSwgaXRzIGEgbmV0d29yayBnbGl0Y2guIElmIGl0IG9jY3VycyBhIGxvdCBzb21ldGhpbmcgaXMgd3JvbmcuJyxcbiAgICAgICAgfSlcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH0pXG4gICAgICByZXN0LmxvZ2dlci5kZWJ1ZyhgcmVxdWVzdCBmZXRjaGVkIGZyb20gJHt1cmx9IHdpdGggc3RhdHVzICR7cmVzcG9uc2Uuc3RhdHVzfSAmICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKVxuXG4gICAgICAvLyBNYXJrIHJlcXVlc3QgYW5kIGNvbXBsZXRlZFxuICAgICAgcmVzdC5pbnZhbGlkQnVja2V0LmhhbmRsZUNvbXBsZXRlZFJlcXVlc3QocmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5oZWFkZXJzLmdldChSQVRFX0xJTUlUX1NDT1BFX0hFQURFUikgPT09ICdzaGFyZWQnKVxuXG4gICAgICAvLyBTZXQgdGhlIGJ1Y2tldCBpZCBpZiBpdCB3YXMgYXZhaWxhYmxlIG9uIHRoZSBoZWFkZXJzXG4gICAgICBjb25zdCBidWNrZXRJZCA9IHJlc3QucHJvY2Vzc0hlYWRlcnMocmVzdC5zaW1wbGlmeVVybChvcHRpb25zLnJvdXRlLCBvcHRpb25zLm1ldGhvZCksIHJlc3BvbnNlLmhlYWRlcnMsIHBheWxvYWQuaGVhZGVycy5hdXRob3JpemF0aW9uKVxuXG4gICAgICBpZiAoYnVja2V0SWQpIG9wdGlvbnMuYnVja2V0SWQgPSBidWNrZXRJZFxuXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzIDwgSHR0cFJlc3BvbnNlQ29kZS5TdWNjZXNzIHx8IHJlc3BvbnNlLnN0YXR1cyA+PSBIdHRwUmVzcG9uc2VDb2RlLkVycm9yKSB7XG4gICAgICAgIHJlc3QubG9nZ2VyLmRlYnVnKGBSZXF1ZXN0IHRvICR7dXJsfSBmYWlsZWQuYClcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSBIdHRwUmVzcG9uc2VDb2RlLlRvb01hbnlSZXF1ZXN0cykge1xuICAgICAgICAgIG9wdGlvbnMucmVqZWN0KHsgb2s6IGZhbHNlLCBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywgYm9keTogYXdhaXQgcmVzcG9uc2UudGV4dCgpIH0pXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICByZXN0LmxvZ2dlci5kZWJ1ZyhgUmVxdWVzdCB0byAke3VybH0gd2FzIHJhdGVsaW1pdGVkLmApXG4gICAgICAgIC8vIFRvbyBtYW55IGF0dGVtcHRzLCBnZXQgcmlkIG9mIHJlcXVlc3QgZnJvbSBxdWV1ZS5cbiAgICAgICAgaWYgKG9wdGlvbnMucmV0cnlDb3VudCA+PSByZXN0Lm1heFJldHJ5Q291bnQpIHtcbiAgICAgICAgICByZXN0LmxvZ2dlci5kZWJ1ZyhgUmVxdWVzdCB0byAke3VybH0gZXhjZWVkZWQgdGhlIG1heGltdW0gYWxsb3dlZCByZXRyaWVzLmAsICd3aXRoIHBheWxvYWQ6JywgcGF5bG9hZClcbiAgICAgICAgICAvLyByZXN0LmRlYnVnKGBbUkVTVCAtIFJldHJpZXNNYXhlZF0gJHtKU09OLnN0cmluZ2lmeShvcHRpb25zKX1gKVxuICAgICAgICAgIG9wdGlvbnMucmVqZWN0KHtcbiAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgICAgZXJyb3I6ICdUaGUgcmVxdWVzdCB3YXMgcmF0ZSBsaW1pdGVkIGFuZCBpdCBtYXhlZCBvdXQgdGhlIHJldHJpZXMgbGltaXQuJyxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zLnJldHJ5Q291bnQgKz0gMVxuXG4gICAgICAgIGNvbnN0IHJlc2V0QWZ0ZXIgPSByZXNwb25zZS5oZWFkZXJzLmdldChSQVRFX0xJTUlUX1JFU0VUX0FGVEVSX0hFQURFUilcbiAgICAgICAgaWYgKHJlc2V0QWZ0ZXIpIGF3YWl0IGRlbGF5KE51bWJlcihyZXNldEFmdGVyKSAqIDEwMDApXG4gICAgICAgIC8vIHByb2Nlc3MgdGhlIHJlc3BvbnNlIHRvIHByZXZlbnQgbWVtIGxlYWtcbiAgICAgICAgYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKVxuXG4gICAgICAgIHJldHVybiBhd2FpdCBvcHRpb25zLnJldHJ5UmVxdWVzdD8uKG9wdGlvbnMpXG4gICAgICB9XG5cbiAgICAgIC8vIERpc2NvcmQgc29tZXRpbWVzIHNlbmRzIG5vIHJlc3BvbnNlIHdpdGggbm8gY29udGVudC5cbiAgICAgIG9wdGlvbnMucmVzb2x2ZSh7IG9rOiB0cnVlLCBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywgYm9keTogcmVzcG9uc2Uuc3RhdHVzID09PSBIdHRwUmVzcG9uc2VDb2RlLk5vQ29udGVudCA/IHVuZGVmaW5lZCA6IGF3YWl0IHJlc3BvbnNlLnRleHQoKSB9KVxuICAgIH0sXG5cbiAgICBzaW1wbGlmeVVybCh1cmwsIG1ldGhvZCkge1xuICAgICAgY29uc3QgcGFydHMgPSB1cmwuc3BsaXQoJy8nKVxuICAgICAgY29uc3Qgc2Vjb25kTGFzdFBhcnQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAyXVxuXG4gICAgICBpZiAoc2Vjb25kTGFzdFBhcnQgPT09ICdjaGFubmVscycgfHwgc2Vjb25kTGFzdFBhcnQgPT09ICdndWlsZHMnKSB7XG4gICAgICAgIHJldHVybiB1cmxcbiAgICAgIH1cblxuICAgICAgaWYgKHNlY29uZExhc3RQYXJ0ID09PSAncmVhY3Rpb25zJyB8fCBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSA9PT0gJ0BtZScpIHtcbiAgICAgICAgcGFydHMuc3BsaWNlKC0yKVxuICAgICAgICBwYXJ0cy5wdXNoKCdyZWFjdGlvbnMnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFydHMuc3BsaWNlKC0xKVxuICAgICAgICBwYXJ0cy5wdXNoKCd4JylcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcnRzW3BhcnRzLmxlbmd0aCAtIDNdID09PSAncmVhY3Rpb25zJykge1xuICAgICAgICBwYXJ0cy5zcGxpY2UoLTIpXG4gICAgICB9XG5cbiAgICAgIGlmIChtZXRob2QgPT09ICdERUxFVEUnICYmIHNlY29uZExhc3RQYXJ0ID09PSAnbWVzc2FnZXMnKSB7XG4gICAgICAgIHJldHVybiBgRCR7cGFydHMuam9pbignLycpfWBcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oJy8nKVxuICAgIH0sXG5cbiAgICBhc3luYyBwcm9jZXNzUmVxdWVzdChyZXF1ZXN0OiBTZW5kUmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHVybCA9IHJlc3Quc2ltcGxpZnlVcmwocmVxdWVzdC5yb3V0ZSwgcmVxdWVzdC5tZXRob2QpXG5cbiAgICAgIGlmIChyZXF1ZXN0LnJ1blRocm91Z2hRdWV1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYXdhaXQgcmVzdC5zZW5kUmVxdWVzdChyZXF1ZXN0KVxuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBJZiB3ZSB0aGUgcmVxdWVzdCBoYXMgYSB0b2tlbiwgdXNlIGl0XG4gICAgICAvLyBFbHNlIGZhbGxiYWNrIHRvIHByZWZpeCB3aXRoIHRoZSBib3QgdG9rZW5cbiAgICAgIGNvbnN0IHF1ZXVlSWRlbnRpZmllciA9IHJlcXVlc3QucmVxdWVzdEJvZHlPcHRpb25zPy5oZWFkZXJzPy5hdXRob3JpemF0aW9uID8/IGBCb3QgJHtyZXN0LnRva2VufWBcblxuICAgICAgY29uc3QgcXVldWUgPSByZXN0LnF1ZXVlcy5nZXQoYCR7cXVldWVJZGVudGlmaWVyfSR7dXJsfWApXG5cbiAgICAgIGlmIChxdWV1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHF1ZXVlLm1ha2VSZXF1ZXN0KHJlcXVlc3QpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDUkVBVEVTIEEgTkVXIFFVRVVFXG4gICAgICAgIGNvbnN0IGJ1Y2tldFF1ZXVlID0gbmV3IFF1ZXVlKHJlc3QsIHsgdXJsLCBkZWxldGVRdWV1ZURlbGF5OiByZXN0LmRlbGV0ZVF1ZXVlRGVsYXksIGlkZW50aWZpZXI6IHF1ZXVlSWRlbnRpZmllciB9KVxuXG4gICAgICAgIC8vIFNhdmUgcXVldWVcbiAgICAgICAgcmVzdC5xdWV1ZXMuc2V0KGAke3F1ZXVlSWRlbnRpZmllcn0ke3VybH1gLCBidWNrZXRRdWV1ZSlcblxuICAgICAgICAvLyBBZGQgcmVxdWVzdCB0byBxdWV1ZVxuICAgICAgICBidWNrZXRRdWV1ZS5tYWtlUmVxdWVzdChyZXF1ZXN0KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBtYWtlUmVxdWVzdChtZXRob2QsIHJvdXRlLCBvcHRpb25zKSB7XG4gICAgICAvLyBUaGlzIGVycm9yIG5lZWRzIHRvIGJlIGNyZWF0ZWQgaGVyZSBiZWNhdXNlIG9mIGhvdyBzdGFjayB0cmFjZXMgZ2V0IGNhbGN1bGF0ZWRcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKClcbiAgICAgIGVycm9yLm1lc3NhZ2UgPSAnRmFpbGVkIHRvIHNlbmQgcmVxdWVzdCB0byBkaXNjb3JkLidcblxuICAgICAgaWYgKHJlc3QuaXNQcm94aWVkKSB7XG4gICAgICAgIGlmIChyZXN0LmF1dGhvcml6YXRpb24pIHtcbiAgICAgICAgICBvcHRpb25zID8/PSB7fVxuICAgICAgICAgIG9wdGlvbnMuaGVhZGVycyA/Pz0ge31cbiAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbcmVzdC5hdXRob3JpemF0aW9uSGVhZGVyXSA9IHJlc3QuYXV0aG9yaXphdGlvblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2goYCR7cmVzdC5iYXNlVXJsfS92JHtyZXN0LnZlcnNpb259JHtyb3V0ZX1gLCByZXN0LmNyZWF0ZVJlcXVlc3RCb2R5KG1ldGhvZCwgb3B0aW9ucykpXG5cbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICBjb25zdCBlcnJUZXh0ID0gYXdhaXQgcmVzdWx0LnRleHQoKS5jYXRjaCgoKSA9PiBudWxsKVxuXG4gICAgICAgICAgaWYgKGVyclRleHQpIHtcbiAgICAgICAgICAgIGVycm9yLmNhdXNlID0ge1xuICAgICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcbiAgICAgICAgICAgICAgYm9keTogZXJyVGV4dCxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlcnIgPSAoYXdhaXQgcmVzdWx0Lmpzb24oKS5jYXRjaCgoKSA9PiB7fSkpIGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICAgICAvLyBMZWdhY3kgSGFuZGxpbmcgdG8gbm90IGJyZWFrIG9sZCBjb2RlIG9yIHdoZW4gYm9keSBpcyBtaXNzaW5nXG4gICAgICAgICAgaWYgKCFlcnI/LmJvZHkpIHRocm93IG5ldyBFcnJvcihgRXJyb3I6ICR7ZXJyLm1lc3NhZ2UgPz8gcmVzdWx0LnN0YXR1c1RleHR9YClcblxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShlcnIpKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5zdGF0dXMgIT09IDIwNCA/IGF3YWl0IHJlc3VsdC5qc29uKCkgOiB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogU2VuZFJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgICAgIHJvdXRlLFxuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICByZXF1ZXN0Qm9keU9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICAgICAgcmV0cnlDb3VudDogMCxcbiAgICAgICAgICByZXRyeVJlcXVlc3Q6IGFzeW5jIChwYXlsb2FkOiBTZW5kUmVxdWVzdE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHJlc3QucHJvY2Vzc1JlcXVlc3QocGF5bG9hZClcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc29sdmU6IChkYXRhKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKGRhdGEuc3RhdHVzICE9PSAyMDQgPyBKU09OLnBhcnNlKGRhdGEuYm9keSA/PyAne30nKSA6IHVuZGVmaW5lZClcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlamVjdDogKHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgZXJyb3IuY2F1c2UgPSByZWFzb25cbiAgICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJ1blRocm91Z2hRdWV1ZTogb3B0aW9ucz8ucnVuVGhyb3VnaFF1ZXVlLFxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgcmVzdC5wcm9jZXNzUmVxdWVzdChwYXlsb2FkKVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0PFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnR0VUJywgdXJsLCBvcHRpb25zKSkgYXMgQ2FtZWxpemU8VD5cbiAgICB9LFxuXG4gICAgYXN5bmMgcG9zdDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikge1xuICAgICAgcmV0dXJuIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BPU1QnLCB1cmwsIG9wdGlvbnMpKSBhcyBDYW1lbGl6ZTxUPlxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGUodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSB7XG4gICAgICBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdERUxFVEUnLCB1cmwsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBwYXRjaDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikge1xuICAgICAgcmV0dXJuIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BBVENIJywgdXJsLCBvcHRpb25zKSkgYXMgQ2FtZWxpemU8VD5cbiAgICB9LFxuXG4gICAgYXN5bmMgcHV0PFQgPSB2b2lkPih1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQVVQnLCB1cmwsIG9wdGlvbnMpKSBhcyBDYW1lbGl6ZTxUPlxuICAgIH0sXG5cbiAgICBhc3luYyBhZGRSZWFjdGlvbihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pIHtcbiAgICAgIHJlYWN0aW9uID0gcHJvY2Vzc1JlYWN0aW9uU3RyaW5nKHJlYWN0aW9uKVxuXG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMuYm90KGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikpXG4gICAgfSxcblxuICAgIGFzeW5jIGFkZFJlYWN0aW9ucyhjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb25zLCBvcmRlcmVkID0gZmFsc2UpIHtcbiAgICAgIGlmICghb3JkZXJlZCkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICByZWFjdGlvbnMubWFwKGFzeW5jIChyZWFjdGlvbikgPT4ge1xuICAgICAgICAgICAgYXdhaXQgcmVzdC5hZGRSZWFjdGlvbihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgcmVhY3Rpb24gb2YgcmVhY3Rpb25zKSB7XG4gICAgICAgIGF3YWl0IHJlc3QuYWRkUmVhY3Rpb24oY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBhZGRSb2xlKGd1aWxkSWQsIHVzZXJJZCwgcm9sZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCByb2xlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBhZGRUaHJlYWRNZW1iZXIoY2hhbm5lbElkLCB1c2VySWQpIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMudXNlcihjaGFubmVsSWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGFkZERtUmVjaXBpZW50KGNoYW5uZWxJZCwgdXNlcklkLCBib2R5KSB7XG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy5kbVJlY2lwaWVudChjaGFubmVsSWQsIHVzZXJJZCksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVBdXRvbW9kUnVsZShndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmF1dG9tb2QucnVsZXMoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUNoYW5uZWwoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5ndWlsZHMuY2hhbm5lbHMoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUVtb2ppKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkRW1vamk+KHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaXMoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUFwcGxpY2F0aW9uRW1vamkoYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkRW1vamk+KHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uRW1vamlzKHJlc3QuYXBwbGljYXRpb25JZCksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoYm9keSwgb3B0aW9ucykge1xuICAgICAgY29uc3QgcmVzdE9wdGlvbnM6IE1ha2VSZXF1ZXN0T3B0aW9ucyA9IHsgYm9keSB9XG5cbiAgICAgIGlmIChvcHRpb25zPy5iZWFyZXJUb2tlbikge1xuICAgICAgICByZXN0T3B0aW9ucy51bmF1dGhvcml6ZWQgPSB0cnVlXG4gICAgICAgIHJlc3RPcHRpb25zLmhlYWRlcnMgPSB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke29wdGlvbnMuYmVhcmVyVG9rZW59YCxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kcyhyZXN0LmFwcGxpY2F0aW9uSWQpLCByZXN0T3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGQoYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkR3VpbGQ+KHJlc3Qucm91dGVzLmd1aWxkcy5hbGwoKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUd1aWxkQXBwbGljYXRpb25Db21tYW5kKGJvZHksIGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlc3RPcHRpb25zOiBNYWtlUmVxdWVzdE9wdGlvbnMgPSB7IGJvZHkgfVxuXG4gICAgICBpZiAob3B0aW9ucz8uYmVhcmVyVG9rZW4pIHtcbiAgICAgICAgcmVzdE9wdGlvbnMudW5hdXRob3JpemVkID0gdHJ1ZVxuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmJlYXJlclRva2VufWAsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLmFsbChyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpLCByZXN0T3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGRGcm9tVGVtcGxhdGUodGVtcGxhdGVDb2RlLCBib2R5KSB7XG4gICAgICBpZiAoYm9keS5pY29uKSB7XG4gICAgICAgIGJvZHkuaWNvbiA9IGF3YWl0IHVybFRvQmFzZTY0KGJvZHkuaWNvbilcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkR3VpbGQ+KHJlc3Qucm91dGVzLmd1aWxkcy50ZW1wbGF0ZXMuY29kZSh0ZW1wbGF0ZUNvZGUpLCB7IGJvZHkgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGRTdGlja2VyKGd1aWxkSWQsIG9wdGlvbnMsIHJlYXNvbikge1xuICAgICAgY29uc3QgZm9ybSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICBmb3JtLmFwcGVuZCgnZmlsZScsIG9wdGlvbnMuZmlsZS5ibG9iLCBvcHRpb25zLmZpbGUubmFtZSlcbiAgICAgIGZvcm0uYXBwZW5kKCduYW1lJywgb3B0aW9ucy5uYW1lKVxuICAgICAgZm9ybS5hcHBlbmQoJ2Rlc2NyaXB0aW9uJywgb3B0aW9ucy5kZXNjcmlwdGlvbilcbiAgICAgIGZvcm0uYXBwZW5kKCd0YWdzJywgb3B0aW9ucy50YWdzKVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRTdGlja2VyPihyZXN0LnJvdXRlcy5ndWlsZHMuc3RpY2tlcnMoZ3VpbGRJZCksIHsgYm9keTogZm9ybSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUd1aWxkVGVtcGxhdGUoZ3VpbGRJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkVGVtcGxhdGU+KHJlc3Qucm91dGVzLmd1aWxkcy50ZW1wbGF0ZXMuYWxsKGd1aWxkSWQpLCB7IGJvZHkgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlRm9ydW1UaHJlYWQoY2hhbm5lbElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmZvcnVtKGNoYW5uZWxJZCksIHsgYm9keSwgZmlsZXM6IGJvZHkuZmlsZXMsIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVJbnZpdGUoY2hhbm5lbElkLCBib2R5ID0ge30sIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkSW52aXRlPihyZXN0LnJvdXRlcy5jaGFubmVscy5pbnZpdGVzKGNoYW5uZWxJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVJvbGUoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRSb2xlPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMuYWxsKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVTY2hlZHVsZWRFdmVudChndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFNjaGVkdWxlZEV2ZW50PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50cyhndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlU3RhZ2VJbnN0YW5jZShib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFN0YWdlSW5zdGFuY2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnN0YWdlcygpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVXZWJob29rKGNoYW5uZWxJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy5jaGFubmVscy53ZWJob29rcyhjaGFubmVsSWQpLCB7XG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAgICAgYXZhdGFyOiBvcHRpb25zLmF2YXRhciA/IGF3YWl0IHVybFRvQmFzZTY0KG9wdGlvbnMuYXZhdGFyKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlQXV0b21vZFJ1bGUoZ3VpbGRJZCwgcnVsZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlQ2hhbm5lbChjaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY2hhbm5lbChjaGFubmVsSWQpLCB7XG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUNoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGUoY2hhbm5lbElkLCBvdmVyd3JpdGVJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5vdmVyd3JpdGUoY2hhbm5lbElkLCBvdmVyd3JpdGVJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUVtb2ppKGd1aWxkSWQsIGlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaShndWlsZElkLCBpZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUFwcGxpY2F0aW9uRW1vamkoaWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uRW1vamkocmVzdC5hcHBsaWNhdGlvbklkLCBpZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgbWVzc2FnZUlkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm1lc3NhZ2UocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSwgeyB1bmF1dGhvcml6ZWQ6IHRydWUgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmQocmVzdC5hcHBsaWNhdGlvbklkLCBjb21tYW5kSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHdWlsZChndWlsZElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuZ3VpbGQoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCwgZ3VpbGRJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5vbmUocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHdWlsZFN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5zdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUd1aWxkVGVtcGxhdGUoZ3VpbGRJZCwgdGVtcGxhdGVDb2RlKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmd1aWxkKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUludGVncmF0aW9uKGd1aWxkSWQsIGludGVncmF0aW9uSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmludGVncmF0aW9uKGd1aWxkSWQsIGludGVncmF0aW9uSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVJbnZpdGUoaW52aXRlQ29kZSwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuaW52aXRlKGludml0ZUNvZGUpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVNZXNzYWdlcyhjaGFubmVsSWQsIG1lc3NhZ2VJZHMsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5wb3N0KHJlc3Qucm91dGVzLmNoYW5uZWxzLmJ1bGsoY2hhbm5lbElkKSwge1xuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgbWVzc2FnZXM6IG1lc3NhZ2VJZHMuc2xpY2UoMCwgMTAwKS5tYXAoKGlkKSA9PiBpZC50b1N0cmluZygpKSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlT3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlKHRva2VuKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm9yaWdpbmFsKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pLCB7IHVuYXV0aG9yaXplZDogdHJ1ZSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVPd25SZWFjdGlvbihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pIHtcbiAgICAgIHJlYWN0aW9uID0gcHJvY2Vzc1JlYWN0aW9uU3RyaW5nKHJlYWN0aW9uKVxuXG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMuYm90KGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVJlYWN0aW9uc0FsbChjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLmFsbChjaGFubmVsSWQsIG1lc3NhZ2VJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVJlYWN0aW9uc0Vtb2ppKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikge1xuICAgICAgcmVhY3Rpb24gPSBwcm9jZXNzUmVhY3Rpb25TdHJpbmcocmVhY3Rpb24pXG5cbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnJlYWN0aW9ucy5lbW9qaShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVSb2xlKGd1aWxkSWQsIHJvbGVJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMub25lKGd1aWxkSWQsIHJvbGVJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVNjaGVkdWxlZEV2ZW50KGd1aWxkSWQsIGV2ZW50SWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVN0YWdlSW5zdGFuY2UoY2hhbm5lbElkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnN0YWdlKGNoYW5uZWxJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVVzZXJSZWFjdGlvbihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgdXNlcklkLCByZWFjdGlvbikge1xuICAgICAgcmVhY3Rpb24gPSBwcm9jZXNzUmVhY3Rpb25TdHJpbmcocmVhY3Rpb24pXG5cbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnJlYWN0aW9ucy51c2VyKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbiwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlV2ViaG9vayh3ZWJob29rSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMud2ViaG9va3MuaWQod2ViaG9va0lkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlV2ViaG9va01lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy53ZWJob29rcy5tZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVdlYmhvb2tXaXRoVG9rZW4od2ViaG9va0lkLCB0b2tlbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayh3ZWJob29rSWQsIHRva2VuKSwge1xuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMoZ3VpbGRJZCwgY29tbWFuZElkLCBiZWFyZXJUb2tlbiwgcGVybWlzc2lvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucz4oXG4gICAgICAgIHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5wZXJtaXNzaW9uKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSxcbiAgICAgICAge1xuICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaGVhZGVyczogeyBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YmVhcmVyVG9rZW59YCB9LFxuICAgICAgICB9LFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0QXV0b21vZFJ1bGUoZ3VpbGRJZCwgcnVsZUlkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEJvdFByb2ZpbGUob3B0aW9ucykge1xuICAgICAgY29uc3QgYXZhdGFyID0gb3B0aW9ucz8uYm90QXZhdGFyVVJMID8gYXdhaXQgdXJsVG9CYXNlNjQob3B0aW9ucz8uYm90QXZhdGFyVVJMKSA6IG9wdGlvbnM/LmJvdEF2YXRhclVSTFxuICAgICAgY29uc3QgYmFubmVyID0gb3B0aW9ucz8uYm90QmFubmVyVVJMID8gYXdhaXQgdXJsVG9CYXNlNjQob3B0aW9ucz8uYm90QmFubmVyVVJMKSA6IG9wdGlvbnM/LmJvdEJhbm5lclVSTFxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkVXNlcj4ocmVzdC5yb3V0ZXMuY3VycmVudFVzZXIoKSwge1xuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgdXNlcm5hbWU6IG9wdGlvbnMudXNlcm5hbWU/LnRyaW0oKSxcbiAgICAgICAgICBhdmF0YXIsXG4gICAgICAgICAgYmFubmVyLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdENoYW5uZWwoY2hhbm5lbElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5jaGFubmVsKGNoYW5uZWxJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRDaGFubmVsUGVybWlzc2lvbk92ZXJyaWRlcyhjaGFubmVsSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuY2hhbm5lbHMub3ZlcndyaXRlKGNoYW5uZWxJZCwgYm9keS5pZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRDaGFubmVsUG9zaXRpb25zKGd1aWxkSWQsIGJvZHkpIHtcbiAgICAgIGF3YWl0IHJlc3QucGF0Y2gocmVzdC5yb3V0ZXMuZ3VpbGRzLmNoYW5uZWxzKGd1aWxkSWQpLCB7IGJvZHkgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEVtb2ppKGd1aWxkSWQsIGlkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppKGd1aWxkSWQsIGlkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEFwcGxpY2F0aW9uRW1vamkoaWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25FbW9qaShyZXN0LmFwcGxpY2F0aW9uSWQsIGlkKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRGb2xsb3d1cE1lc3NhZ2UodG9rZW4sIG1lc3NhZ2VJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMubWVzc2FnZShyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuLCBtZXNzYWdlSWQpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGZpbGVzOiBib2R5LmZpbGVzLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmQocmVzdC5hcHBsaWNhdGlvbklkLCBjb21tYW5kSWQpLCB7IGJvZHkgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEd1aWxkPihyZXN0LnJvdXRlcy5ndWlsZHMuZ3VpbGQoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGd1aWxkSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMub25lKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSwge1xuICAgICAgICBib2R5LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkTWZhTGV2ZWwoZ3VpbGRJZDogQmlnU3RyaW5nLCBtZmFMZXZlbDogTWZhTGV2ZWxzLCByZWFzb24/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5ndWlsZHMubWZhKGd1aWxkSWQpLCB7IGJvZHk6IHsgbGV2ZWw6IG1mYUxldmVsIH0sIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGRTdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkU3RpY2tlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkVGVtcGxhdGUoZ3VpbGRJZCwgdGVtcGxhdGVDb2RlOiBzdHJpbmcsIGJvZHk6IE1vZGlmeUd1aWxkVGVtcGxhdGUpOiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+IHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5ndWlsZChndWlsZElkLCB0ZW1wbGF0ZUNvZGUpLCB7IGJvZHkgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdE1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSwgeyBib2R5LCBmaWxlczogYm9keS5maWxlcyB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlKHRva2VuLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5vcmlnaW5hbChyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuKSwge1xuICAgICAgICBib2R5LFxuICAgICAgICBmaWxlczogYm9keS5maWxlcyxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRPcmlnaW5hbFdlYmhvb2tNZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy53ZWJob29rcy5vcmlnaW5hbCh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSwge1xuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgdHlwZTogSW50ZXJhY3Rpb25SZXNwb25zZVR5cGVzLlVwZGF0ZU1lc3NhZ2UsXG4gICAgICAgICAgZGF0YTogb3B0aW9ucyxcbiAgICAgICAgfSxcbiAgICAgICAgZmlsZXM6IG9wdGlvbnMuZmlsZXMsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRPd25Wb2ljZVN0YXRlKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIGF3YWl0IHJlc3QucGF0Y2gocmVzdC5yb3V0ZXMuZ3VpbGRzLnZvaWNlKGd1aWxkSWQpLCB7XG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIHJlcXVlc3RUb1NwZWFrVGltZXN0YW1wOiBvcHRpb25zLnJlcXVlc3RUb1NwZWFrVGltZXN0YW1wXG4gICAgICAgICAgICA/IG5ldyBEYXRlKG9wdGlvbnMucmVxdWVzdFRvU3BlYWtUaW1lc3RhbXApLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICAgIDogb3B0aW9ucy5yZXF1ZXN0VG9TcGVha1RpbWVzdGFtcCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRTY2hlZHVsZWRFdmVudChndWlsZElkLCBldmVudElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRTY2hlZHVsZWRFdmVudD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudChndWlsZElkLCBldmVudElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFJvbGUoZ3VpbGRJZCwgcm9sZUlkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRSb2xlPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMub25lKGd1aWxkSWQsIHJvbGVJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRSb2xlUG9zaXRpb25zKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFJvbGVbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLmFsbChndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFN0YWdlSW5zdGFuY2UoY2hhbm5lbElkLCB0b3BpYywgcmVhc29uPzogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuc3RhZ2UoY2hhbm5lbElkKSwgeyBib2R5OiB7IHRvcGljIH0sIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0VXNlclZvaWNlU3RhdGUoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgYXdhaXQgcmVzdC5wYXRjaChyZXN0LnJvdXRlcy5ndWlsZHMudm9pY2UoZ3VpbGRJZCwgb3B0aW9ucy51c2VySWQpLCB7IGJvZHk6IG9wdGlvbnMgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFdlYmhvb2sod2ViaG9va0lkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy53ZWJob29rcy5pZCh3ZWJob29rSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0V2ViaG9va01lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3MubWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIGZpbGVzOiBvcHRpb25zLmZpbGVzLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0V2ViaG9va1dpdGhUb2tlbih3ZWJob29rSWQsIHRva2VuLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkV2ViaG9vaz4ocmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayh3ZWJob29rSWQsIHRva2VuKSwge1xuICAgICAgICBib2R5LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0V2VsY29tZVNjcmVlbihndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRXZWxjb21lU2NyZWVuPihyZXN0LnJvdXRlcy5ndWlsZHMud2VsY29tZShndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFdpZGdldFNldHRpbmdzKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEd1aWxkV2lkZ2V0U2V0dGluZ3M+KHJlc3Qucm91dGVzLmd1aWxkcy53aWRnZXQoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGV4ZWN1dGVXZWJob29rKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2sod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucyksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZm9sbG93QW5ub3VuY2VtZW50KHNvdXJjZUNoYW5uZWxJZCwgdGFyZ2V0Q2hhbm5lbElkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEZvbGxvd2VkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZm9sbG93KHNvdXJjZUNoYW5uZWxJZCksIHtcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIHdlYmhvb2tDaGFubmVsSWQ6IHRhcmdldENoYW5uZWxJZCxcbiAgICAgICAgfSxcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QWN0aXZlVGhyZWFkcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBY3RpdmVUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLmFjdGl2ZShndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbihndWlsZElkLCBjb21tYW5kSWQsIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlc3RPcHRpb25zOiBPbWl0PE1ha2VSZXF1ZXN0T3B0aW9ucywgJ2JvZHknPiA9IHt9XG5cbiAgICAgIGlmIChvcHRpb25zPy5hY2Nlc3NUb2tlbikge1xuICAgICAgICByZXN0T3B0aW9ucy51bmF1dGhvcml6ZWQgPSB0cnVlXG4gICAgICAgIHJlc3RPcHRpb25zLmhlYWRlcnMgPSB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke29wdGlvbnMuYWNjZXNzVG9rZW59YCxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnM+KFxuICAgICAgICByZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMucGVybWlzc2lvbihvcHRpb25zPy5hcHBsaWNhdGlvbklkID8/IHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSxcbiAgICAgICAgcmVzdE9wdGlvbnMsXG4gICAgICApXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlc3RPcHRpb25zOiBPbWl0PE1ha2VSZXF1ZXN0T3B0aW9ucywgJ2JvZHknPiA9IHt9XG5cbiAgICAgIGlmIChvcHRpb25zPy5hY2Nlc3NUb2tlbikge1xuICAgICAgICByZXN0T3B0aW9ucy51bmF1dGhvcml6ZWQgPSB0cnVlXG4gICAgICAgIHJlc3RPcHRpb25zLmhlYWRlcnMgPSB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke29wdGlvbnMuYWNjZXNzVG9rZW59YCxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnNbXT4oXG4gICAgICAgIHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5wZXJtaXNzaW9ucyhvcHRpb25zPy5hcHBsaWNhdGlvbklkID8/IHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCksXG4gICAgICAgIHJlc3RPcHRpb25zLFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBcHBsaWNhdGlvbkluZm8oKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uPihyZXN0LnJvdXRlcy5vYXV0aDIuYXBwbGljYXRpb24oKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEFwcGxpY2F0aW9uSW5mbyhib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkQXBwbGljYXRpb24+KHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uKCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEN1cnJlbnRBdXRoZW50aWNhdGlvbkluZm8odG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQ3VycmVudEF1dGhvcml6YXRpb24+KHJlc3Qucm91dGVzLm9hdXRoMi5jdXJyZW50QXV0aG9yaXphdGlvbigpLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZXhjaGFuZ2VUb2tlbihjbGllbnRJZCwgY2xpZW50U2VjcmV0LCBib2R5KSB7XG4gICAgICBjb25zdCBiYXNpY0NyZWRlbnRpYWxzID0gQnVmZmVyLmZyb20oYCR7Y2xpZW50SWR9OiR7Y2xpZW50U2VjcmV0fWApXG5cbiAgICAgIGNvbnN0IHJlc3RPcHRpb25zOiBNYWtlUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJhc2ljICR7YmFzaWNDcmVkZW50aWFscy50b1N0cmluZygnYmFzZTY0Jyl9YCxcbiAgICAgICAgfSxcbiAgICAgICAgcnVuVGhyb3VnaFF1ZXVlOiBmYWxzZSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfVxuXG4gICAgICBpZiAoYm9keS5ncmFudFR5cGUgPT09ICdjbGllbnRfY3JlZGVudGlhbHMnKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLmJvZHkuc2NvcGUgPSBib2R5LnNjb3BlLmpvaW4oJyAnKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRBY2Nlc3NUb2tlblJlc3BvbnNlPihyZXN0LnJvdXRlcy5vYXV0aDIudG9rZW5FeGNoYW5nZSgpLCByZXN0T3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgcmV2b2tlVG9rZW4oY2xpZW50SWQsIGNsaWVudFNlY3JldCwgYm9keSkge1xuICAgICAgY29uc3QgYmFzaWNDcmVkZW50aWFscyA9IEJ1ZmZlci5mcm9tKGAke2NsaWVudElkfToke2NsaWVudFNlY3JldH1gKVxuXG4gICAgICBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMub2F1dGgyLnRva2VuUmV2b2tlKCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmFzaWMgJHtiYXNpY0NyZWRlbnRpYWxzLnRvU3RyaW5nKCdiYXNlNjQnKX1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBdWRpdExvZyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEF1ZGl0TG9nPihyZXN0LnJvdXRlcy5ndWlsZHMuYXVkaXRsb2dzKGd1aWxkSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBdXRvbW9kUnVsZShndWlsZElkLCBydWxlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPihyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlKGd1aWxkSWQsIHJ1bGVJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEF1dG9tb2RSdWxlcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlcyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXZhaWxhYmxlVm9pY2VSZWdpb25zKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRWb2ljZVJlZ2lvbltdPihyZXN0LnJvdXRlcy5yZWdpb25zKCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEJhbihndWlsZElkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQmFuPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5iYW4oZ3VpbGRJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QmFucyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEJhbltdPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5iYW5zKGd1aWxkSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVsKGlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmNoYW5uZWwoaWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVsSW52aXRlcyhjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkSW52aXRlTWV0YWRhdGFbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuaW52aXRlcyhjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVscyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZENoYW5uZWxbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmNoYW5uZWxzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVsV2ViaG9va3MoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2tbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMud2ViaG9va3MoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0RG1DaGFubmVsKHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZG0oKSwge1xuICAgICAgICBib2R5OiB7IHJlY2lwaWVudElkOiB1c2VySWQgfSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEdyb3VwRG1DaGFubmVsKGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmRtKCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEVtb2ppKGd1aWxkSWQsIGVtb2ppSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkRW1vamk+KHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaShndWlsZElkLCBlbW9qaUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXBwbGljYXRpb25FbW9qaShlbW9qaUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5hcHBsaWNhdGlvbkVtb2ppKHJlc3QuYXBwbGljYXRpb25JZCwgZW1vamlJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEVtb2ppcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEVtb2ppW10+KHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaXMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uRW1vamlzKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PHsgaXRlbXM6IERpc2NvcmRFbW9qaVtdIH0+KHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uRW1vamlzKHJlc3QuYXBwbGljYXRpb25JZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgbWVzc2FnZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMubWVzc2FnZShyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuLCBtZXNzYWdlSWQpLCB7IHVuYXV0aG9yaXplZDogdHJ1ZSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHYXRld2F5Qm90KCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHZXRHYXRld2F5Qm90PihyZXN0LnJvdXRlcy5nYXRld2F5Qm90KCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZChyZXN0LmFwcGxpY2F0aW9uSWQsIGNvbW1hbmRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZHMocmVzdC5hcHBsaWNhdGlvbklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGQoZ3VpbGRJZCwgb3B0aW9ucyA9IHsgY291bnRzOiB0cnVlIH0pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ndWlsZChndWlsZElkLCBvcHRpb25zLmNvdW50cykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkcyh0b2tlbiwgb3B0aW9ucykge1xuICAgICAgY29uc3QgbWFrZVJlcXVlc3RPcHRpb25zOiBNYWtlUmVxdWVzdE9wdGlvbnMgfCB1bmRlZmluZWQgPSB0b2tlblxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWRcblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PFBhcnRpYWw8RGlzY29yZEd1aWxkPltdPihyZXN0LnJvdXRlcy5ndWlsZHMudXNlckd1aWxkcyhvcHRpb25zKSwgbWFrZVJlcXVlc3RPcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLm9uZShyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLmFsbChyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFByZXZpZXcoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZFByZXZpZXc+KHJlc3Qucm91dGVzLmd1aWxkcy5wcmV2aWV3KGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFRlbXBsYXRlKHRlbXBsYXRlQ29kZSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5jb2RlKHRlbXBsYXRlQ29kZSkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkVGVtcGxhdGVzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVGVtcGxhdGVbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5hbGwoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkV2ViaG9va3MoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWJob29rW10+KHJlc3Qucm91dGVzLmd1aWxkcy53ZWJob29rcyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0SW50ZWdyYXRpb25zKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkSW50ZWdyYXRpb25bXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmludGVncmF0aW9ucyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0SW52aXRlKGludml0ZUNvZGUsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkSW52aXRlTWV0YWRhdGE+KHJlc3Qucm91dGVzLmd1aWxkcy5pbnZpdGUoaW52aXRlQ29kZSwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEludml0ZXMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnZpdGVNZXRhZGF0YVtdPihyZXN0LnJvdXRlcy5ndWlsZHMuaW52aXRlcyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0TWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0TWVzc2FnZXMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2VbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZXMoY2hhbm5lbElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U3RpY2tlclBhY2soc3RpY2tlclBhY2tJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGlja2VyUGFjaz4ocmVzdC5yb3V0ZXMuc3RpY2tlclBhY2soc3RpY2tlclBhY2tJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFN0aWNrZXJQYWNrcygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlclBhY2tbXT4ocmVzdC5yb3V0ZXMuc3RpY2tlclBhY2tzKCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldE9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSh0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm9yaWdpbmFsKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pLCB7IHVuYXV0aG9yaXplZDogdHJ1ZSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQaW5uZWRNZXNzYWdlcyhjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZVtdPihyZXN0LnJvdXRlcy5jaGFubmVscy5waW5zKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFByaXZhdGVBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMucHJpdmF0ZShjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQcml2YXRlSm9pbmVkQXJjaGl2ZWRUaHJlYWRzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMaXN0QXJjaGl2ZWRUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLmpvaW5lZChjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQcnVuZUNvdW50KGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkUHJ1bmVkQ291bnQ+KHJlc3Qucm91dGVzLmd1aWxkcy5wcnVuZShndWlsZElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0UHVibGljQXJjaGl2ZWRUaHJlYWRzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMaXN0QXJjaGl2ZWRUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLnB1YmxpYyhjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRSb2xlcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFJvbGVbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLmFsbChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Um9sZShndWlsZElkLCByb2xlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkUm9sZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm9uZShndWlsZElkLCByb2xlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTY2hlZHVsZWRFdmVudChndWlsZElkLCBldmVudElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFNjaGVkdWxlZEV2ZW50PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50KGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnM/LndpdGhVc2VyQ291bnQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTY2hlZHVsZWRFdmVudHMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTY2hlZHVsZWRFdmVudFtdPihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50cyhndWlsZElkLCBvcHRpb25zPy53aXRoVXNlckNvdW50KSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U2NoZWR1bGVkRXZlbnRVc2VycyhndWlsZElkLCBldmVudElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8QXJyYXk8eyB1c2VyOiBEaXNjb3JkVXNlcjsgbWVtYmVyPzogRGlzY29yZE1lbWJlciB9Pj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy51c2VycyhndWlsZElkLCBldmVudElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U2Vzc2lvbkluZm8oKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRHYXRld2F5Qm90KClcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U3RhZ2VJbnN0YW5jZShjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuc3RhZ2UoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0T3duVm9pY2VTdGF0ZShndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFZvaWNlU3RhdGU+KHJlc3Qucm91dGVzLmd1aWxkcy52b2ljZShndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VXNlclZvaWNlU3RhdGUoZ3VpbGRJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFZvaWNlU3RhdGU+KHJlc3Qucm91dGVzLmd1aWxkcy52b2ljZShndWlsZElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTdGlja2VyKHN0aWNrZXJJZDogQmlnU3RyaW5nKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0aWNrZXI+KHJlc3Qucm91dGVzLnN0aWNrZXIoc3RpY2tlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRTdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGlja2VyPihyZXN0LnJvdXRlcy5ndWlsZHMuc3RpY2tlcihndWlsZElkLCBzdGlja2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFN0aWNrZXJzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlcltdPihyZXN0LnJvdXRlcy5ndWlsZHMuc3RpY2tlcnMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFRocmVhZE1lbWJlcihjaGFubmVsSWQsIHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUaHJlYWRNZW1iZXI+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMudXNlcihjaGFubmVsSWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFRocmVhZE1lbWJlcnMoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFRocmVhZE1lbWJlcltdPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lbWJlcnMoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0UmVhY3Rpb25zKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRVc2VyW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnJlYWN0aW9ucy5tZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbiwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFVzZXIoaWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVXNlcj4ocmVzdC5yb3V0ZXMudXNlcihpZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEN1cnJlbnRVc2VyKHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFVzZXI+KHJlc3Qucm91dGVzLmN1cnJlbnRVc2VyKCksIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRVc2VyQ29ubmVjdGlvbnModG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQ29ubmVjdGlvbltdPihyZXN0LnJvdXRlcy5vYXV0aDIuY29ubmVjdGlvbnMoKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFVzZXJBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uKHRva2VuLCBhcHBsaWNhdGlvbklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24+KHJlc3Qucm91dGVzLm9hdXRoMi5yb2xlQ29ubmVjdGlvbnMoYXBwbGljYXRpb25JZCksIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRWYW5pdHlVcmwoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRWYW5pdHlVcmw+KHJlc3Qucm91dGVzLmd1aWxkcy52YW5pdHkoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFZvaWNlUmVnaW9ucyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFZvaWNlUmVnaW9uW10+KHJlc3Qucm91dGVzLmd1aWxkcy5yZWdpb25zKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXZWJob29rKHdlYmhvb2tJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy53ZWJob29rcy5pZCh3ZWJob29rSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3MubWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpLCB7XG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlYmhvb2tXaXRoVG9rZW4od2ViaG9va0lkLCB0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4pLCB7XG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlbGNvbWVTY3JlZW4oZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWxjb21lU2NyZWVuPihyZXN0LnJvdXRlcy5ndWlsZHMud2VsY29tZShndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0V2lkZ2V0KGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGRXaWRnZXQ+KHJlc3Qucm91dGVzLmd1aWxkcy53aWRnZXRKc29uKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXaWRnZXRTZXR0aW5ncyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkV2lkZ2V0U2V0dGluZ3M+KHJlc3Qucm91dGVzLmd1aWxkcy53aWRnZXQoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGpvaW5UaHJlYWQoY2hhbm5lbElkKSB7XG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGxlYXZlR3VpbGQoZ3VpbGRJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmxlYXZlKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBsZWF2ZVRocmVhZChjaGFubmVsSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMubWUoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcHVibGlzaE1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmNyb3NzcG9zdChjaGFubmVsSWQsIG1lc3NhZ2VJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHJlbW92ZVJvbGUoZ3VpbGRJZCwgdXNlcklkLCByb2xlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm1lbWJlcihndWlsZElkLCB1c2VySWQsIHJvbGVJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHJlbW92ZVRocmVhZE1lbWJlcihjaGFubmVsSWQsIHVzZXJJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy51c2VyKGNoYW5uZWxJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVtb3ZlRG1SZWNpcGllbnQoY2hhbm5lbElkLCB1c2VySWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLmRtUmVjaXBpZW50KGNoYW5uZWxJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZEZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIGZpbGVzOiBvcHRpb25zLmZpbGVzLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBzZW5kSW50ZXJhY3Rpb25SZXNwb25zZShpbnRlcmFjdGlvbklkLCB0b2tlbiwgb3B0aW9ucywgcGFyYW1zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PHZvaWQgfCBEaXNjb3JkSW50ZXJhY3Rpb25DYWxsYmFja1Jlc3BvbnNlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLmNhbGxiYWNrKGludGVyYWN0aW9uSWQsIHRva2VuLCBwYXJhbXMpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIGZpbGVzOiBvcHRpb25zLmRhdGE/LmZpbGVzLFxuICAgICAgICBydW5UaHJvdWdoUXVldWU6IGZhbHNlLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBzZW5kTWVzc2FnZShjaGFubmVsSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2VzKGNoYW5uZWxJZCksIHsgYm9keSwgZmlsZXM6IGJvZHkuZmlsZXMgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc3RhcnRUaHJlYWRXaXRoTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBzdGFydFRocmVhZFdpdGhvdXRNZXNzYWdlKGNoYW5uZWxJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLmFsbChjaGFubmVsSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQb2xsQW5zd2VyVm90ZXJzKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBhbnN3ZXJJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHZXRBbnN3ZXJWb3Rlc1Jlc3BvbnNlPihyZXN0LnJvdXRlcy5jaGFubmVscy5wb2xscy52b3RlcyhjaGFubmVsSWQsIG1lc3NhZ2VJZCwgYW5zd2VySWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBlbmRQb2xsKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5jaGFubmVscy5wb2xscy5leHBpcmUoY2hhbm5lbElkLCBtZXNzYWdlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBzeW5jR3VpbGRUZW1wbGF0ZShndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmFsbChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYmFuTWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LnB1dDx2b2lkPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5iYW4oZ3VpbGRJZCwgdXNlcklkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYnVsa0Jhbk1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRCdWxrQmFuPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5idWxrQmFuKGd1aWxkSWQpLCB7IGJvZHk6IG9wdGlvbnMsIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Qm90TWVtYmVyKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lbWJlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuYm90KGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0TWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVtYmVyV2l0aFVzZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcihndWlsZElkLCB1c2VySWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q3VycmVudE1lbWJlcihndWlsZElkLCB0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZW1iZXJXaXRoVXNlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuY3VycmVudE1lbWJlcihndWlsZElkKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldE1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZW1iZXJXaXRoVXNlcltdPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXJzKGd1aWxkSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBcHBsaWNhdGlvbkFjdGl2aXR5SW5zdGFuY2UoYXBwbGljYXRpb25JZCwgaW5zdGFuY2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBY3Rpdml0eUluc3RhbmNlPihyZXN0LnJvdXRlcy5hcHBsaWNhdGlvbkFjdGl2aXR5SW5zdGFuY2UoYXBwbGljYXRpb25JZCwgaW5zdGFuY2VJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGtpY2tNZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcihndWlsZElkLCB1c2VySWQpLCB7XG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHBpbk1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuY2hhbm5lbHMucGluKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcHJ1bmVNZW1iZXJzKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDx7IHBydW5lZDogbnVtYmVyIHwgbnVsbCB9PihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5wcnVuZShndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VhcmNoTWVtYmVycyhndWlsZElkLCBxdWVyeSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZW1iZXJXaXRoVXNlcltdPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5zZWFyY2goZ3VpbGRJZCwgcXVlcnksIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZE9uYm9hcmRpbmcoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZE9uYm9hcmRpbmc+KHJlc3Qucm91dGVzLmd1aWxkcy5vbmJvYXJkaW5nKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGRPbmJvYXJkaW5nKGd1aWxkSWQsIG9wdGlvbnMsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRHdWlsZE9uYm9hcmRpbmc+KHJlc3Qucm91dGVzLmd1aWxkcy5vbmJvYXJkaW5nKGd1aWxkSWQpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHVuYmFuTWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5iYW4oZ3VpbGRJZCwgdXNlcklkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdW5waW5NZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnBpbihjaGFubmVsSWQsIG1lc3NhZ2VJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHRyaWdnZXJUeXBpbmdJbmRpY2F0b3IoY2hhbm5lbElkKSB7XG4gICAgICBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMuY2hhbm5lbHMudHlwaW5nKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHVwc2VydEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMoYm9keSwgb3B0aW9ucykge1xuICAgICAgY29uc3QgcmVzdE9wdGlvbnM6IE1ha2VSZXF1ZXN0T3B0aW9ucyA9IHsgYm9keSB9XG5cbiAgICAgIGlmIChvcHRpb25zPy5iZWFyZXJUb2tlbikge1xuICAgICAgICByZXN0T3B0aW9ucy51bmF1dGhvcml6ZWQgPSB0cnVlXG4gICAgICAgIHJlc3RPcHRpb25zLmhlYWRlcnMgPSB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke29wdGlvbnMuYmVhcmVyVG9rZW59YCxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZHMocmVzdC5hcHBsaWNhdGlvbklkKSwgcmVzdE9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIHVwc2VydEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyhndWlsZElkLCBib2R5LCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zID0geyBib2R5IH1cblxuICAgICAgaWYgKG9wdGlvbnM/LmJlYXJlclRva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWVcbiAgICAgICAgcmVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7b3B0aW9ucy5iZWFyZXJUb2tlbn1gLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMuYWxsKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCksIHJlc3RPcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0VXNlckFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24odG9rZW4sIGFwcGxpY2F0aW9uSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbj4ocmVzdC5yb3V0ZXMub2F1dGgyLnJvbGVDb25uZWN0aW9ucyhhcHBsaWNhdGlvbklkKSwge1xuICAgICAgICBib2R5LFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGFkZEd1aWxkTWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcihndWlsZElkLCB1c2VySWQpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVUZXN0RW50aXRsZW1lbnQoYXBwbGljYXRpb25JZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkRW50aXRsZW1lbnQ+KHJlc3Qucm91dGVzLm1vbmV0aXphdGlvbi5lbnRpdGxlbWVudHMoYXBwbGljYXRpb25JZCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3RFbnRpdGxlbWVudHMoYXBwbGljYXRpb25JZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRFbnRpdGxlbWVudFtdPihyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uZW50aXRsZW1lbnRzKGFwcGxpY2F0aW9uSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRFbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEVudGl0bGVtZW50PihyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uZW50aXRsZW1lbnQoYXBwbGljYXRpb25JZCwgZW50aXRsZW1lbnRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVRlc3RFbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uZW50aXRsZW1lbnQoYXBwbGljYXRpb25JZCwgZW50aXRsZW1lbnRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGNvbnN1bWVFbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSB7XG4gICAgICBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMubW9uZXRpemF0aW9uLmNvbnN1bWVFbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGlzdFNrdXMoYXBwbGljYXRpb25JZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTa3VbXT4ocmVzdC5yb3V0ZXMubW9uZXRpemF0aW9uLnNrdXMoYXBwbGljYXRpb25JZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3RTdWJzY3JpcHRpb25zKHNrdUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN1YnNjcmlwdGlvbltdPihyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uc3Vic2NyaXB0aW9ucyhza3VJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFN1YnNjcmlwdGlvbihza3VJZCwgc3Vic2NyaXB0aW9uSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3Vic2NyaXB0aW9uPihyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uc3Vic2NyaXB0aW9uKHNrdUlkLCBzdWJzY3JpcHRpb25JZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRTb3VuZGJvYXJkU291bmQoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMuc291bmRib2FyZC5zZW5kU291bmQoY2hhbm5lbElkKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGlzdERlZmF1bHRTb3VuZGJvYXJkU291bmRzKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTb3VuZGJvYXJkU291bmRbXT4ocmVzdC5yb3V0ZXMuc291bmRib2FyZC5saXN0RGVmYXVsdCgpKVxuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0R3VpbGRTb3VuZGJvYXJkU291bmRzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDx7IGl0ZW1zOiBEaXNjb3JkU291bmRib2FyZFNvdW5kW10gfT4ocmVzdC5yb3V0ZXMuc291bmRib2FyZC5ndWlsZFNvdW5kcyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRTb3VuZGJvYXJkU291bmQoZ3VpbGRJZCwgc291bmRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTb3VuZGJvYXJkU291bmQ+KHJlc3Qucm91dGVzLnNvdW5kYm9hcmQuZ3VpbGRTb3VuZChndWlsZElkLCBzb3VuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGRTb3VuZGJvYXJkU291bmQoZ3VpbGRJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRTb3VuZGJvYXJkU291bmQ+KHJlc3Qucm91dGVzLnNvdW5kYm9hcmQuZ3VpbGRTb3VuZHMoZ3VpbGRJZCksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbW9kaWZ5R3VpbGRTb3VuZGJvYXJkU291bmQoZ3VpbGRJZCwgc291bmRJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRTb3VuZGJvYXJkU291bmQ+KHJlc3Qucm91dGVzLnNvdW5kYm9hcmQuZ3VpbGRTb3VuZChndWlsZElkLCBzb3VuZElkKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHdWlsZFNvdW5kYm9hcmRTb3VuZChndWlsZElkLCBzb3VuZElkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5zb3VuZGJvYXJkLmd1aWxkU291bmQoZ3VpbGRJZCwgc291bmRJZCksIHtcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgcHJlZmVyU25ha2VDYXNlKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgIGNvbnN0IGNhbWVsaXplciA9IGVuYWJsZWQgPyAoeDogYW55KSA9PiB4IDogY2FtZWxpemVcblxuICAgICAgcmVzdC5nZXQgPSBhc3luYyAodXJsLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIHJldHVybiBjYW1lbGl6ZXIoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnR0VUJywgdXJsLCBvcHRpb25zKSlcbiAgICAgIH1cblxuICAgICAgcmVzdC5wb3N0ID0gYXN5bmMgKHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikgPT4ge1xuICAgICAgICByZXR1cm4gY2FtZWxpemVyKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BPU1QnLCB1cmwsIG9wdGlvbnMpKVxuICAgICAgfVxuXG4gICAgICByZXN0LmRlbGV0ZSA9IGFzeW5jICh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pID0+IHtcbiAgICAgICAgY2FtZWxpemVyKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ0RFTEVURScsIHVybCwgb3B0aW9ucykpXG4gICAgICB9XG5cbiAgICAgIHJlc3QucGF0Y2ggPSBhc3luYyAodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSA9PiB7XG4gICAgICAgIHJldHVybiBjYW1lbGl6ZXIoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUEFUQ0gnLCB1cmwsIG9wdGlvbnMpKVxuICAgICAgfVxuXG4gICAgICByZXN0LnB1dCA9IGFzeW5jICh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pID0+IHtcbiAgICAgICAgcmV0dXJuIGNhbWVsaXplcihhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQVVQnLCB1cmwsIG9wdGlvbnMpKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdFxuICAgIH0sXG4gIH1cblxuICByZXR1cm4gcmVzdFxufVxuXG5lbnVtIEh0dHBSZXNwb25zZUNvZGUge1xuICAvKiogTWluaW11bSB2YWx1ZSBvZiBhIGNvZGUgaW4gb2RlciB0byBjb25zaWRlciB0aGF0IGl0IHdhcyBzdWNjZXNzZnVsLiAqL1xuICBTdWNjZXNzID0gMjAwLFxuICAvKiogUmVxdWVzdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCBidXQgRGlzY29yZCByZXR1cm5lZCBhbiBlbXB0eSBib2R5LiAqL1xuICBOb0NvbnRlbnQgPSAyMDQsXG4gIC8qKiBNaW5pbXVtIHZhbHVlIG9mIGEgY29kZSBpbiBvcmRlciB0byBjb25zaWRlciB0aGF0IHNvbWV0aGluZyB3ZW50IHdyb25nLiAqL1xuICBFcnJvciA9IDQwMCxcbiAgLyoqIFRoaXMgcmVxdWVzdCBnb3QgcmF0ZSBsaW1pdGVkLiAqL1xuICBUb29NYW55UmVxdWVzdHMgPSA0MjksXG59XG4iXSwibmFtZXMiOlsiQVVESVRfTE9HX1JFQVNPTl9IRUFERVIiLCJESVNDT1JEX0FQSV9VUkwiLCJESVNDT1JEX0FQSV9WRVJTSU9OIiwiUkFURV9MSU1JVF9CVUNLRVRfSEVBREVSIiwiUkFURV9MSU1JVF9HTE9CQUxfSEVBREVSIiwiUkFURV9MSU1JVF9MSU1JVF9IRUFERVIiLCJSQVRFX0xJTUlUX1JFTUFJTklOR19IRUFERVIiLCJSQVRFX0xJTUlUX1JFU0VUX0FGVEVSX0hFQURFUiIsIlJBVEVfTElNSVRfU0NPUEVfSEVBREVSIiwiY3JlYXRlUmVzdE1hbmFnZXIiLCJ2ZXJzaW9uIiwib3B0aW9ucyIsImFwcGxpY2F0aW9uSWQiLCJCaWdJbnQiLCJnZXRCb3RJZEZyb21Ub2tlbiIsInRva2VuIiwiYmFzZVVybCIsInByb3h5IiwicmVzdCIsImF1dGhvcml6YXRpb24iLCJhdXRob3JpemF0aW9uSGVhZGVyIiwiZGVsZXRlUXVldWVEZWxheSIsImdsb2JhbGx5UmF0ZUxpbWl0ZWQiLCJpbnZhbGlkQnVja2V0IiwiY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQiLCJsb2dnZXIiLCJpc1Byb3hpZWQiLCJzdGFydHNXaXRoIiwidXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludCIsIm1heFJldHJ5Q291bnQiLCJJbmZpbml0eSIsInByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzIiwicXVldWVzIiwiTWFwIiwicmF0ZUxpbWl0ZWRQYXRocyIsInJvdXRlcyIsImNyZWF0ZVJvdXRlcyIsImNyZWF0ZUJhc2VIZWFkZXJzIiwiY2hlY2tSYXRlTGltaXRzIiwidXJsIiwiaWRlbnRpZmllciIsInJhdGVsaW1pdGVkIiwiZ2V0IiwiZ2xvYmFsIiwibm93IiwiRGF0ZSIsInJlc2V0VGltZXN0YW1wIiwidXBkYXRlVG9rZW5RdWV1ZXMiLCJvbGRUb2tlbiIsIm5ld1Rva2VuIiwiRXJyb3IiLCJoZWFkZXJzIiwidW5kZWZpbmVkIiwiZmV0Y2giLCJtZXRob2QiLCJib2R5IiwiSlNPTiIsInN0cmluZ2lmeSIsIm5ld0lkZW50aWZpZXIiLCJrZXkiLCJxdWV1ZSIsImVudHJpZXMiLCJkZWxldGUiLCJuZXdLZXkiLCJuZXdRdWV1ZSIsIndhaXRpbmciLCJ1bnNoaWZ0IiwicGVuZGluZyIsImNsZWFudXAiLCJzZXQiLCJyYXRlbGltaXRQYXRoIiwiYnVja2V0SWQiLCJjaGFuZ2VUb0Rpc2NvcmRGb3JtYXQiLCJvYmoiLCJBcnJheSIsImlzQXJyYXkiLCJtYXAiLCJpdGVtIiwibmV3T2JqIiwiT2JqZWN0Iiwia2V5cyIsInZhbHVlIiwiaW5jbHVkZXMiLCJjYWxjdWxhdGVCaXRzIiwiZGVmYXVsdF9tZW1iZXJfcGVybWlzc2lvbnMiLCJuYW1lX2xvY2FsaXphdGlvbnMiLCJkZXNjcmlwdGlvbl9sb2NhbGl6YXRpb25zIiwiY2FtZWxUb1NuYWtlQ2FzZSIsInRvU3RyaW5nIiwiY3JlYXRlUmVxdWVzdEJvZHkiLCJ1bmF1dGhvcml6ZWQiLCJyZWFzb24iLCJlbmNvZGVVUklDb21wb25lbnQiLCJmaWxlcyIsImZvcm0iLCJGb3JtRGF0YSIsImkiLCJsZW5ndGgiLCJhcHBlbmQiLCJibG9iIiwibmFtZSIsImZvcm1Cb2R5IiwiZGlzY29yZEJvZHkiLCJwcm9wIiwicHVzaCIsImpvaW4iLCJhc3NpZ24iLCJwcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocyIsInNpemUiLCJzZXRUaW1lb3V0IiwicHJvY2Vzc0hlYWRlcnMiLCJyYXRlTGltaXRlZCIsInJlbWFpbmluZyIsInJldHJ5QWZ0ZXIiLCJyZXNldCIsIk51bWJlciIsImxpbWl0IiwiaGFuZGxlQ29tcGxldGVkUmVxdWVzdCIsImludGVydmFsIiwibWF4IiwiZ2xvYmFsUmVzZXQiLCJzZW5kUmVxdWVzdCIsInJvdXRlIiwicGF5bG9hZCIsInJlcXVlc3RCb2R5T3B0aW9ucyIsImxvZ2dpbmdIZWFkZXJzIiwiYXV0aG9yaXphdGlvblNjaGVtZSIsInNwbGl0IiwiZGVidWciLCJyZXNwb25zZSIsImNhdGNoIiwiZXJyb3IiLCJyZWplY3QiLCJvayIsInN0YXR1cyIsInN0YXR1c1RleHQiLCJzaW1wbGlmeVVybCIsInRleHQiLCJyZXRyeUNvdW50IiwicmVzZXRBZnRlciIsImRlbGF5IiwiYXJyYXlCdWZmZXIiLCJyZXRyeVJlcXVlc3QiLCJyZXNvbHZlIiwicGFydHMiLCJzZWNvbmRMYXN0UGFydCIsInNwbGljZSIsInByb2Nlc3NSZXF1ZXN0IiwicmVxdWVzdCIsInJ1blRocm91Z2hRdWV1ZSIsInF1ZXVlSWRlbnRpZmllciIsIm1ha2VSZXF1ZXN0IiwiYnVja2V0UXVldWUiLCJRdWV1ZSIsIm1lc3NhZ2UiLCJyZXN1bHQiLCJlcnJUZXh0IiwiY2F1c2UiLCJlcnIiLCJqc29uIiwiUHJvbWlzZSIsImRhdGEiLCJwYXJzZSIsImNhbWVsaXplIiwicG9zdCIsInBhdGNoIiwicHV0IiwiYWRkUmVhY3Rpb24iLCJjaGFubmVsSWQiLCJtZXNzYWdlSWQiLCJyZWFjdGlvbiIsInByb2Nlc3NSZWFjdGlvblN0cmluZyIsImNoYW5uZWxzIiwicmVhY3Rpb25zIiwiYm90IiwiYWRkUmVhY3Rpb25zIiwib3JkZXJlZCIsImFsbCIsImFkZFJvbGUiLCJndWlsZElkIiwidXNlcklkIiwicm9sZUlkIiwiZ3VpbGRzIiwicm9sZXMiLCJtZW1iZXIiLCJhZGRUaHJlYWRNZW1iZXIiLCJ0aHJlYWRzIiwidXNlciIsImFkZERtUmVjaXBpZW50IiwiZG1SZWNpcGllbnQiLCJjcmVhdGVBdXRvbW9kUnVsZSIsImF1dG9tb2QiLCJydWxlcyIsImNyZWF0ZUNoYW5uZWwiLCJjcmVhdGVFbW9qaSIsImVtb2ppcyIsImNyZWF0ZUFwcGxpY2F0aW9uRW1vamkiLCJhcHBsaWNhdGlvbkVtb2ppcyIsImNyZWF0ZUdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZCIsInJlc3RPcHRpb25zIiwiYmVhcmVyVG9rZW4iLCJpbnRlcmFjdGlvbnMiLCJjb21tYW5kcyIsImNyZWF0ZUd1aWxkIiwiY3JlYXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQiLCJjcmVhdGVHdWlsZEZyb21UZW1wbGF0ZSIsInRlbXBsYXRlQ29kZSIsImljb24iLCJ1cmxUb0Jhc2U2NCIsInRlbXBsYXRlcyIsImNvZGUiLCJjcmVhdGVHdWlsZFN0aWNrZXIiLCJmaWxlIiwiZGVzY3JpcHRpb24iLCJ0YWdzIiwic3RpY2tlcnMiLCJjcmVhdGVHdWlsZFRlbXBsYXRlIiwiY3JlYXRlRm9ydW1UaHJlYWQiLCJmb3J1bSIsImNyZWF0ZUludml0ZSIsImludml0ZXMiLCJjcmVhdGVSb2xlIiwiY3JlYXRlU2NoZWR1bGVkRXZlbnQiLCJldmVudHMiLCJjcmVhdGVTdGFnZUluc3RhbmNlIiwic3RhZ2VzIiwiY3JlYXRlV2ViaG9vayIsIndlYmhvb2tzIiwiYXZhdGFyIiwiZGVsZXRlQXV0b21vZFJ1bGUiLCJydWxlSWQiLCJydWxlIiwiZGVsZXRlQ2hhbm5lbCIsImNoYW5uZWwiLCJkZWxldGVDaGFubmVsUGVybWlzc2lvbk92ZXJyaWRlIiwib3ZlcndyaXRlSWQiLCJvdmVyd3JpdGUiLCJkZWxldGVFbW9qaSIsImlkIiwiZW1vamkiLCJkZWxldGVBcHBsaWNhdGlvbkVtb2ppIiwiYXBwbGljYXRpb25FbW9qaSIsImRlbGV0ZUZvbGxvd3VwTWVzc2FnZSIsInJlc3BvbnNlcyIsImRlbGV0ZUdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZCIsImNvbW1hbmRJZCIsImNvbW1hbmQiLCJkZWxldGVHdWlsZCIsImd1aWxkIiwiZGVsZXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQiLCJvbmUiLCJkZWxldGVHdWlsZFN0aWNrZXIiLCJzdGlja2VySWQiLCJzdGlja2VyIiwiZGVsZXRlR3VpbGRUZW1wbGF0ZSIsImRlbGV0ZUludGVncmF0aW9uIiwiaW50ZWdyYXRpb25JZCIsImludGVncmF0aW9uIiwiZGVsZXRlSW52aXRlIiwiaW52aXRlQ29kZSIsImludml0ZSIsImRlbGV0ZU1lc3NhZ2UiLCJkZWxldGVNZXNzYWdlcyIsIm1lc3NhZ2VJZHMiLCJidWxrIiwibWVzc2FnZXMiLCJzbGljZSIsImRlbGV0ZU9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSIsIm9yaWdpbmFsIiwiZGVsZXRlT3duUmVhY3Rpb24iLCJkZWxldGVSZWFjdGlvbnNBbGwiLCJkZWxldGVSZWFjdGlvbnNFbW9qaSIsImRlbGV0ZVJvbGUiLCJkZWxldGVTY2hlZHVsZWRFdmVudCIsImV2ZW50SWQiLCJldmVudCIsImRlbGV0ZVN0YWdlSW5zdGFuY2UiLCJzdGFnZSIsImRlbGV0ZVVzZXJSZWFjdGlvbiIsImRlbGV0ZVdlYmhvb2siLCJ3ZWJob29rSWQiLCJkZWxldGVXZWJob29rTWVzc2FnZSIsImRlbGV0ZVdlYmhvb2tXaXRoVG9rZW4iLCJ3ZWJob29rIiwiZWRpdEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zIiwicGVybWlzc2lvbnMiLCJwZXJtaXNzaW9uIiwiZWRpdEF1dG9tb2RSdWxlIiwiZWRpdEJvdFByb2ZpbGUiLCJib3RBdmF0YXJVUkwiLCJiYW5uZXIiLCJib3RCYW5uZXJVUkwiLCJjdXJyZW50VXNlciIsInVzZXJuYW1lIiwidHJpbSIsImVkaXRDaGFubmVsIiwiZWRpdENoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGVzIiwiZWRpdENoYW5uZWxQb3NpdGlvbnMiLCJlZGl0RW1vamkiLCJlZGl0QXBwbGljYXRpb25FbW9qaSIsImVkaXRGb2xsb3d1cE1lc3NhZ2UiLCJlZGl0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwiZWRpdEd1aWxkIiwiZWRpdEd1aWxkQXBwbGljYXRpb25Db21tYW5kIiwiZWRpdEd1aWxkTWZhTGV2ZWwiLCJtZmFMZXZlbCIsIm1mYSIsImxldmVsIiwiZWRpdEd1aWxkU3RpY2tlciIsImVkaXRHdWlsZFRlbXBsYXRlIiwiZWRpdE1lc3NhZ2UiLCJlZGl0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlIiwiZWRpdE9yaWdpbmFsV2ViaG9va01lc3NhZ2UiLCJ0eXBlIiwiSW50ZXJhY3Rpb25SZXNwb25zZVR5cGVzIiwiVXBkYXRlTWVzc2FnZSIsImVkaXRPd25Wb2ljZVN0YXRlIiwidm9pY2UiLCJyZXF1ZXN0VG9TcGVha1RpbWVzdGFtcCIsInRvSVNPU3RyaW5nIiwiZWRpdFNjaGVkdWxlZEV2ZW50IiwiZWRpdFJvbGUiLCJlZGl0Um9sZVBvc2l0aW9ucyIsImVkaXRTdGFnZUluc3RhbmNlIiwidG9waWMiLCJlZGl0VXNlclZvaWNlU3RhdGUiLCJlZGl0V2ViaG9vayIsImVkaXRXZWJob29rTWVzc2FnZSIsImVkaXRXZWJob29rV2l0aFRva2VuIiwiZWRpdFdlbGNvbWVTY3JlZW4iLCJ3ZWxjb21lIiwiZWRpdFdpZGdldFNldHRpbmdzIiwid2lkZ2V0IiwiZXhlY3V0ZVdlYmhvb2siLCJmb2xsb3dBbm5vdW5jZW1lbnQiLCJzb3VyY2VDaGFubmVsSWQiLCJ0YXJnZXRDaGFubmVsSWQiLCJmb2xsb3ciLCJ3ZWJob29rQ2hhbm5lbElkIiwiZ2V0QWN0aXZlVGhyZWFkcyIsImFjdGl2ZSIsImdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb24iLCJhY2Nlc3NUb2tlbiIsImdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zIiwiZ2V0QXBwbGljYXRpb25JbmZvIiwib2F1dGgyIiwiYXBwbGljYXRpb24iLCJlZGl0QXBwbGljYXRpb25JbmZvIiwiZ2V0Q3VycmVudEF1dGhlbnRpY2F0aW9uSW5mbyIsImN1cnJlbnRBdXRob3JpemF0aW9uIiwiZXhjaGFuZ2VUb2tlbiIsImNsaWVudElkIiwiY2xpZW50U2VjcmV0IiwiYmFzaWNDcmVkZW50aWFscyIsIkJ1ZmZlciIsImZyb20iLCJncmFudFR5cGUiLCJzY29wZSIsInRva2VuRXhjaGFuZ2UiLCJyZXZva2VUb2tlbiIsInRva2VuUmV2b2tlIiwiZ2V0QXVkaXRMb2ciLCJhdWRpdGxvZ3MiLCJnZXRBdXRvbW9kUnVsZSIsImdldEF1dG9tb2RSdWxlcyIsImdldEF2YWlsYWJsZVZvaWNlUmVnaW9ucyIsInJlZ2lvbnMiLCJnZXRCYW4iLCJtZW1iZXJzIiwiYmFuIiwiZ2V0QmFucyIsImJhbnMiLCJnZXRDaGFubmVsIiwiZ2V0Q2hhbm5lbEludml0ZXMiLCJnZXRDaGFubmVscyIsImdldENoYW5uZWxXZWJob29rcyIsImdldERtQ2hhbm5lbCIsImRtIiwicmVjaXBpZW50SWQiLCJnZXRHcm91cERtQ2hhbm5lbCIsImdldEVtb2ppIiwiZW1vamlJZCIsImdldEFwcGxpY2F0aW9uRW1vamkiLCJnZXRFbW9qaXMiLCJnZXRBcHBsaWNhdGlvbkVtb2ppcyIsImdldEZvbGxvd3VwTWVzc2FnZSIsImdldEdhdGV3YXlCb3QiLCJnYXRld2F5Qm90IiwiZ2V0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwiZ2V0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcyIsImdldEd1aWxkIiwiY291bnRzIiwiZ2V0R3VpbGRzIiwibWFrZVJlcXVlc3RPcHRpb25zIiwidXNlckd1aWxkcyIsImdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kIiwiZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzIiwiZ2V0R3VpbGRQcmV2aWV3IiwicHJldmlldyIsImdldEd1aWxkVGVtcGxhdGUiLCJnZXRHdWlsZFRlbXBsYXRlcyIsImdldEd1aWxkV2ViaG9va3MiLCJnZXRJbnRlZ3JhdGlvbnMiLCJpbnRlZ3JhdGlvbnMiLCJnZXRJbnZpdGUiLCJnZXRJbnZpdGVzIiwiZ2V0TWVzc2FnZSIsImdldE1lc3NhZ2VzIiwiZ2V0U3RpY2tlclBhY2siLCJzdGlja2VyUGFja0lkIiwic3RpY2tlclBhY2siLCJnZXRTdGlja2VyUGFja3MiLCJzdGlja2VyUGFja3MiLCJnZXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UiLCJnZXRQaW5uZWRNZXNzYWdlcyIsInBpbnMiLCJnZXRQcml2YXRlQXJjaGl2ZWRUaHJlYWRzIiwicHJpdmF0ZSIsImdldFByaXZhdGVKb2luZWRBcmNoaXZlZFRocmVhZHMiLCJqb2luZWQiLCJnZXRQcnVuZUNvdW50IiwicHJ1bmUiLCJnZXRQdWJsaWNBcmNoaXZlZFRocmVhZHMiLCJwdWJsaWMiLCJnZXRSb2xlcyIsImdldFJvbGUiLCJnZXRTY2hlZHVsZWRFdmVudCIsIndpdGhVc2VyQ291bnQiLCJnZXRTY2hlZHVsZWRFdmVudHMiLCJnZXRTY2hlZHVsZWRFdmVudFVzZXJzIiwidXNlcnMiLCJnZXRTZXNzaW9uSW5mbyIsImdldFN0YWdlSW5zdGFuY2UiLCJnZXRPd25Wb2ljZVN0YXRlIiwiZ2V0VXNlclZvaWNlU3RhdGUiLCJnZXRTdGlja2VyIiwiZ2V0R3VpbGRTdGlja2VyIiwiZ2V0R3VpbGRTdGlja2VycyIsImdldFRocmVhZE1lbWJlciIsImdldFRocmVhZE1lbWJlcnMiLCJnZXRSZWFjdGlvbnMiLCJnZXRVc2VyIiwiZ2V0Q3VycmVudFVzZXIiLCJnZXRVc2VyQ29ubmVjdGlvbnMiLCJjb25uZWN0aW9ucyIsImdldFVzZXJBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uIiwicm9sZUNvbm5lY3Rpb25zIiwiZ2V0VmFuaXR5VXJsIiwidmFuaXR5IiwiZ2V0Vm9pY2VSZWdpb25zIiwiZ2V0V2ViaG9vayIsImdldFdlYmhvb2tNZXNzYWdlIiwiZ2V0V2ViaG9va1dpdGhUb2tlbiIsImdldFdlbGNvbWVTY3JlZW4iLCJnZXRXaWRnZXQiLCJ3aWRnZXRKc29uIiwiZ2V0V2lkZ2V0U2V0dGluZ3MiLCJqb2luVGhyZWFkIiwibWUiLCJsZWF2ZUd1aWxkIiwibGVhdmUiLCJsZWF2ZVRocmVhZCIsInB1Ymxpc2hNZXNzYWdlIiwiY3Jvc3Nwb3N0IiwicmVtb3ZlUm9sZSIsInJlbW92ZVRocmVhZE1lbWJlciIsInJlbW92ZURtUmVjaXBpZW50Iiwic2VuZEZvbGxvd3VwTWVzc2FnZSIsInNlbmRJbnRlcmFjdGlvblJlc3BvbnNlIiwiaW50ZXJhY3Rpb25JZCIsInBhcmFtcyIsImNhbGxiYWNrIiwic2VuZE1lc3NhZ2UiLCJzdGFydFRocmVhZFdpdGhNZXNzYWdlIiwic3RhcnRUaHJlYWRXaXRob3V0TWVzc2FnZSIsImdldFBvbGxBbnN3ZXJWb3RlcnMiLCJhbnN3ZXJJZCIsInBvbGxzIiwidm90ZXMiLCJlbmRQb2xsIiwiZXhwaXJlIiwic3luY0d1aWxkVGVtcGxhdGUiLCJiYW5NZW1iZXIiLCJidWxrQmFuTWVtYmVycyIsImJ1bGtCYW4iLCJlZGl0Qm90TWVtYmVyIiwiZWRpdE1lbWJlciIsImdldE1lbWJlciIsImdldEN1cnJlbnRNZW1iZXIiLCJjdXJyZW50TWVtYmVyIiwiZ2V0TWVtYmVycyIsImdldEFwcGxpY2F0aW9uQWN0aXZpdHlJbnN0YW5jZSIsImluc3RhbmNlSWQiLCJhcHBsaWNhdGlvbkFjdGl2aXR5SW5zdGFuY2UiLCJraWNrTWVtYmVyIiwicGluTWVzc2FnZSIsInBpbiIsInBydW5lTWVtYmVycyIsInNlYXJjaE1lbWJlcnMiLCJxdWVyeSIsInNlYXJjaCIsImdldEd1aWxkT25ib2FyZGluZyIsIm9uYm9hcmRpbmciLCJlZGl0R3VpbGRPbmJvYXJkaW5nIiwidW5iYW5NZW1iZXIiLCJ1bnBpbk1lc3NhZ2UiLCJ0cmlnZ2VyVHlwaW5nSW5kaWNhdG9yIiwidHlwaW5nIiwidXBzZXJ0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcyIsInVwc2VydEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyIsImVkaXRVc2VyQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbiIsImFkZEd1aWxkTWVtYmVyIiwiY3JlYXRlVGVzdEVudGl0bGVtZW50IiwibW9uZXRpemF0aW9uIiwiZW50aXRsZW1lbnRzIiwibGlzdEVudGl0bGVtZW50cyIsImdldEVudGl0bGVtZW50IiwiZW50aXRsZW1lbnRJZCIsImVudGl0bGVtZW50IiwiZGVsZXRlVGVzdEVudGl0bGVtZW50IiwiY29uc3VtZUVudGl0bGVtZW50IiwibGlzdFNrdXMiLCJza3VzIiwibGlzdFN1YnNjcmlwdGlvbnMiLCJza3VJZCIsInN1YnNjcmlwdGlvbnMiLCJnZXRTdWJzY3JpcHRpb24iLCJzdWJzY3JpcHRpb25JZCIsInN1YnNjcmlwdGlvbiIsInNlbmRTb3VuZGJvYXJkU291bmQiLCJzb3VuZGJvYXJkIiwic2VuZFNvdW5kIiwibGlzdERlZmF1bHRTb3VuZGJvYXJkU291bmRzIiwibGlzdERlZmF1bHQiLCJsaXN0R3VpbGRTb3VuZGJvYXJkU291bmRzIiwiZ3VpbGRTb3VuZHMiLCJnZXRHdWlsZFNvdW5kYm9hcmRTb3VuZCIsInNvdW5kSWQiLCJndWlsZFNvdW5kIiwiY3JlYXRlR3VpbGRTb3VuZGJvYXJkU291bmQiLCJtb2RpZnlHdWlsZFNvdW5kYm9hcmRTb3VuZCIsImRlbGV0ZUd1aWxkU291bmRib2FyZFNvdW5kIiwicHJlZmVyU25ha2VDYXNlIiwiZW5hYmxlZCIsImNhbWVsaXplciIsIngiLCJIdHRwUmVzcG9uc2VDb2RlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztJQXFFYUEsdUJBQXVCO2VBQXZCQTs7SUFGQUMsZUFBZTtlQUFmQTs7SUFEQUMsbUJBQW1CO2VBQW5CQTs7SUFPQUMsd0JBQXdCO2VBQXhCQTs7SUFEQUMsd0JBQXdCO2VBQXhCQTs7SUFFQUMsdUJBQXVCO2VBQXZCQTs7SUFKQUMsMkJBQTJCO2VBQTNCQTs7SUFDQUMsNkJBQTZCO2VBQTdCQTs7SUFJQUMsdUJBQXVCO2VBQXZCQTs7SUFFR0MsaUJBQWlCO2VBQWpCQTs7OzRCQTdFTzt1QkF3RGhCO3VCQUN5SDsrQkFDckY7dUJBQ3JCO3dCQUNPO0FBRzdCLGdEQUFnRDtBQUNoRCxNQUFNQyxVQUFVO0FBRVQsTUFBTVIsc0JBQXNCO0FBQzVCLE1BQU1ELGtCQUFrQjtBQUV4QixNQUFNRCwwQkFBMEI7QUFDaEMsTUFBTU0sOEJBQThCO0FBQ3BDLE1BQU1DLGdDQUFnQztBQUN0QyxNQUFNSCwyQkFBMkI7QUFDakMsTUFBTUQsMkJBQTJCO0FBQ2pDLE1BQU1FLDBCQUEwQjtBQUNoQyxNQUFNRywwQkFBMEI7QUFFaEMsU0FBU0Msa0JBQWtCRSxPQUFpQztJQUNqRSxNQUFNQyxnQkFBZ0JELFFBQVFDLGFBQWEsR0FBR0MsT0FBT0YsUUFBUUMsYUFBYSxJQUFJRSxJQUFBQSx3QkFBaUIsRUFBQ0gsUUFBUUksS0FBSztJQUU3RyxNQUFNQyxVQUFVTCxRQUFRTSxLQUFLLEVBQUVELFdBQVdmO0lBRTFDLE1BQU1pQixPQUFvQjtRQUN4Qk47UUFDQU8sZUFBZVIsUUFBUU0sS0FBSyxFQUFFRTtRQUM5QkMscUJBQXFCVCxRQUFRTSxLQUFLLEVBQUVHLHVCQUF1QjtRQUMzREo7UUFDQUss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