@discordeno/rest 21.0.1-next.fca0b40 → 22.0.0-beta.1

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