@jubbio/core 1.3.1 → 1.3.2

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 (121) hide show
  1. package/dist/cjs/Client.d.ts +157 -0
  2. package/dist/cjs/Client.js +640 -0
  3. package/dist/cjs/builders/ActionRowBuilder.d.ts +53 -0
  4. package/dist/cjs/builders/ActionRowBuilder.js +68 -0
  5. package/dist/cjs/builders/ButtonBuilder.d.ts +77 -0
  6. package/dist/cjs/builders/ButtonBuilder.js +96 -0
  7. package/dist/cjs/builders/EmbedBuilder.d.ts +157 -0
  8. package/dist/cjs/builders/EmbedBuilder.js +208 -0
  9. package/dist/cjs/builders/ModalBuilder.d.ts +122 -0
  10. package/dist/cjs/builders/ModalBuilder.js +162 -0
  11. package/dist/cjs/builders/SelectMenuBuilder.d.ts +123 -0
  12. package/dist/cjs/builders/SelectMenuBuilder.js +165 -0
  13. package/dist/cjs/builders/SlashCommandBuilder.d.ts +197 -0
  14. package/dist/cjs/builders/SlashCommandBuilder.js +324 -0
  15. package/dist/cjs/builders/index.d.ts +9 -0
  16. package/dist/cjs/builders/index.js +26 -0
  17. package/dist/cjs/enums.d.ts +191 -0
  18. package/dist/cjs/enums.js +211 -0
  19. package/dist/cjs/index.d.ts +25 -0
  20. package/dist/cjs/index.js +130 -0
  21. package/dist/cjs/managers/BaseManager.d.ts +69 -0
  22. package/dist/cjs/managers/BaseManager.js +106 -0
  23. package/dist/cjs/managers/ChannelManager.d.ts +95 -0
  24. package/dist/cjs/managers/ChannelManager.js +205 -0
  25. package/dist/cjs/managers/GuildMemberManager.d.ts +74 -0
  26. package/dist/cjs/managers/GuildMemberManager.js +157 -0
  27. package/dist/cjs/managers/RoleManager.d.ts +84 -0
  28. package/dist/cjs/managers/RoleManager.js +207 -0
  29. package/dist/cjs/managers/index.d.ts +7 -0
  30. package/dist/cjs/managers/index.js +24 -0
  31. package/dist/cjs/rest/REST.d.ts +527 -0
  32. package/dist/cjs/rest/REST.js +904 -0
  33. package/dist/cjs/rest/index.d.ts +1 -0
  34. package/dist/cjs/rest/index.js +18 -0
  35. package/dist/cjs/sharding/ShardingManager.d.ts +179 -0
  36. package/dist/cjs/sharding/ShardingManager.js +375 -0
  37. package/dist/cjs/sharding/index.d.ts +4 -0
  38. package/dist/cjs/sharding/index.js +21 -0
  39. package/dist/cjs/structures/Channel.d.ts +122 -0
  40. package/dist/cjs/structures/Channel.js +240 -0
  41. package/dist/cjs/structures/Collection.d.ts +53 -0
  42. package/dist/cjs/structures/Collection.js +115 -0
  43. package/dist/cjs/structures/Guild.d.ts +59 -0
  44. package/dist/cjs/structures/Guild.js +94 -0
  45. package/dist/cjs/structures/GuildMember.d.ts +174 -0
  46. package/dist/cjs/structures/GuildMember.js +311 -0
  47. package/dist/cjs/structures/Interaction.d.ts +245 -0
  48. package/dist/cjs/structures/Interaction.js +450 -0
  49. package/dist/cjs/structures/Message.d.ts +98 -0
  50. package/dist/cjs/structures/Message.js +195 -0
  51. package/dist/cjs/structures/User.d.ts +37 -0
  52. package/dist/cjs/structures/User.js +65 -0
  53. package/dist/cjs/structures/index.d.ts +7 -0
  54. package/dist/cjs/structures/index.js +25 -0
  55. package/dist/cjs/structures.d.ts +1 -0
  56. package/dist/cjs/structures.js +19 -0
  57. package/dist/cjs/types.d.ts +255 -0
  58. package/dist/cjs/types.js +3 -0
  59. package/dist/cjs/utils/BitField.d.ts +66 -0
  60. package/dist/cjs/utils/BitField.js +138 -0
  61. package/dist/cjs/utils/Collection.d.ts +116 -0
  62. package/dist/cjs/utils/Collection.js +265 -0
  63. package/dist/cjs/utils/Collector.d.ts +152 -0
  64. package/dist/cjs/utils/Collector.js +314 -0
  65. package/dist/cjs/utils/DataResolver.d.ts +61 -0
  66. package/dist/cjs/utils/DataResolver.js +146 -0
  67. package/dist/cjs/utils/Formatters.d.ts +145 -0
  68. package/dist/cjs/utils/Formatters.js +213 -0
  69. package/dist/cjs/utils/IntentsBitField.d.ts +85 -0
  70. package/dist/cjs/utils/IntentsBitField.js +99 -0
  71. package/dist/cjs/utils/Partials.d.ts +104 -0
  72. package/dist/cjs/utils/Partials.js +148 -0
  73. package/dist/cjs/utils/PermissionsBitField.d.ts +118 -0
  74. package/dist/cjs/utils/PermissionsBitField.js +145 -0
  75. package/dist/cjs/utils/SnowflakeUtil.d.ts +63 -0
  76. package/dist/cjs/utils/SnowflakeUtil.js +93 -0
  77. package/dist/cjs/utils/Sweepers.d.ts +119 -0
  78. package/dist/cjs/utils/Sweepers.js +249 -0
  79. package/dist/cjs/utils/index.d.ts +13 -0
  80. package/dist/cjs/utils/index.js +30 -0
  81. package/dist/esm/Client.js +634 -0
  82. package/dist/esm/builders/ActionRowBuilder.js +64 -0
  83. package/dist/esm/builders/ButtonBuilder.js +92 -0
  84. package/dist/esm/builders/EmbedBuilder.js +204 -0
  85. package/dist/esm/builders/ModalBuilder.js +157 -0
  86. package/dist/esm/builders/SelectMenuBuilder.js +161 -0
  87. package/dist/esm/builders/SlashCommandBuilder.js +311 -0
  88. package/dist/esm/builders/index.js +10 -0
  89. package/dist/esm/enums.js +208 -0
  90. package/dist/esm/index.js +34 -0
  91. package/dist/esm/managers/BaseManager.js +100 -0
  92. package/dist/esm/managers/ChannelManager.js +200 -0
  93. package/dist/esm/managers/GuildMemberManager.js +153 -0
  94. package/dist/esm/managers/RoleManager.js +203 -0
  95. package/dist/esm/managers/index.js +8 -0
  96. package/dist/esm/rest/REST.js +900 -0
  97. package/dist/esm/rest/index.js +2 -0
  98. package/dist/esm/sharding/ShardingManager.js +366 -0
  99. package/dist/esm/sharding/index.js +5 -0
  100. package/dist/esm/structures/Channel.js +232 -0
  101. package/dist/esm/structures/Collection.js +111 -0
  102. package/dist/esm/structures/Guild.js +90 -0
  103. package/dist/esm/structures/GuildMember.js +306 -0
  104. package/dist/esm/structures/Interaction.js +438 -0
  105. package/dist/esm/structures/Message.js +191 -0
  106. package/dist/esm/structures/User.js +61 -0
  107. package/dist/esm/structures/index.js +9 -0
  108. package/dist/esm/structures.js +3 -0
  109. package/dist/esm/types.js +2 -0
  110. package/dist/esm/utils/BitField.js +134 -0
  111. package/dist/esm/utils/Collection.js +261 -0
  112. package/dist/esm/utils/Collector.js +305 -0
  113. package/dist/esm/utils/DataResolver.js +142 -0
  114. package/dist/esm/utils/Formatters.js +191 -0
  115. package/dist/esm/utils/IntentsBitField.js +93 -0
  116. package/dist/esm/utils/Partials.js +137 -0
  117. package/dist/esm/utils/PermissionsBitField.js +141 -0
  118. package/dist/esm/utils/SnowflakeUtil.js +89 -0
  119. package/dist/esm/utils/Sweepers.js +245 -0
  120. package/dist/esm/utils/index.js +14 -0
  121. package/package.json +14 -4
@@ -0,0 +1,900 @@
1
+ /**
2
+ * REST API client for Jubbio
3
+ */
4
+ export class REST {
5
+ baseUrl;
6
+ token = '';
7
+ // User cache for mention resolution (ID -> username)
8
+ userCache = new Map();
9
+ USER_CACHE_TTL = 5 * 60 * 1000; // 5 dakika
10
+ constructor(baseUrl = 'https://gateway.jubbio.com/api/v1') {
11
+ this.baseUrl = baseUrl;
12
+ }
13
+ // ==================== Mention Helpers ====================
14
+ /**
15
+ * Cache a user for mention resolution
16
+ * Bot'lar interaction'dan gelen user bilgisini cache'leyebilir
17
+ */
18
+ cacheUser(user) {
19
+ const userId = typeof user.id === 'string' ? parseInt(user.id, 10) : user.id;
20
+ this.userCache.set(userId, {
21
+ id: userId,
22
+ username: user.username,
23
+ displayName: user.displayName || user.display_name,
24
+ cachedAt: Date.now()
25
+ });
26
+ }
27
+ /**
28
+ * Cache multiple users
29
+ */
30
+ cacheUsers(users) {
31
+ users.forEach(user => this.cacheUser(user));
32
+ }
33
+ /**
34
+ * Get cached user by ID
35
+ */
36
+ getCachedUser(userId) {
37
+ const cached = this.userCache.get(userId);
38
+ if (cached && Date.now() - cached.cachedAt < this.USER_CACHE_TTL) {
39
+ return cached;
40
+ }
41
+ // Expired, remove from cache
42
+ if (cached) {
43
+ this.userCache.delete(userId);
44
+ }
45
+ return undefined;
46
+ }
47
+ /**
48
+ * Format a user mention
49
+ * Returns both the text format and mentions data
50
+ *
51
+ * @example
52
+ * const mention = rest.formatMention(user);
53
+ * // mention.text = "<@1>"
54
+ * // mention.data = { users: [{ id: 1, username: "ilkay" }] }
55
+ */
56
+ formatMention(user) {
57
+ const userId = typeof user.id === 'string' ? parseInt(user.id, 10) : user.id;
58
+ return {
59
+ text: `<@${userId}>`,
60
+ data: {
61
+ users: [{ id: userId, username: user.username }]
62
+ }
63
+ };
64
+ }
65
+ /**
66
+ * Parse mentions (<@ID>) in content and build mentions data structure
67
+ * Content is kept as-is with <@ID> format (client renders them)
68
+ *
69
+ * @param content - Message content with mentions
70
+ * @param existingMentions - Existing mentions data to merge with
71
+ * @returns Original content and mentions data
72
+ */
73
+ processMentions(content, existingMentions) {
74
+ const mentions = {
75
+ users: [...(existingMentions?.users || [])],
76
+ roles: [...(existingMentions?.roles || [])],
77
+ everyone: existingMentions?.everyone
78
+ };
79
+ // Track already added user IDs to avoid duplicates
80
+ const addedUserIds = new Set(mentions.users?.map(u => u.id) || []);
81
+ // Parse <@ID> format (user mentions) — keep content as-is, only build mentions data
82
+ const userMentionRegex = /<@!?(\d+)>/g;
83
+ let match;
84
+ while ((match = userMentionRegex.exec(content)) !== null) {
85
+ const userId = parseInt(match[1], 10);
86
+ if (!addedUserIds.has(userId)) {
87
+ // Try to get username from cache for mentions data
88
+ const cachedUser = this.getCachedUser(userId);
89
+ mentions.users.push({ id: userId, username: cachedUser?.username || `User_${userId}` });
90
+ addedUserIds.add(userId);
91
+ }
92
+ }
93
+ // Parse <@&ID> format (role mentions) — keep content as-is
94
+ const roleMentionRegex = /<@&(\d+)>/g;
95
+ const addedRoleIds = new Set(mentions.roles?.map(r => r.id) || []);
96
+ while ((match = roleMentionRegex.exec(content)) !== null) {
97
+ const roleId = match[1];
98
+ if (!addedRoleIds.has(roleId)) {
99
+ mentions.roles.push({ id: roleId });
100
+ addedRoleIds.add(roleId);
101
+ }
102
+ }
103
+ // Parse @everyone and @here
104
+ if (content.includes('@everyone')) {
105
+ mentions.everyone = true;
106
+ }
107
+ // Clean up empty arrays
108
+ if (mentions.users?.length === 0)
109
+ delete mentions.users;
110
+ if (mentions.roles?.length === 0)
111
+ delete mentions.roles;
112
+ return { content, mentions };
113
+ }
114
+ /**
115
+ * Prepare message data with processed mentions
116
+ * Automatically converts mentions to our format
117
+ */
118
+ prepareMessageData(data) {
119
+ const result = { ...data };
120
+ // Resolve components (ActionRowBuilder / ButtonBuilder instances)
121
+ if (data.components && data.components.length > 0) {
122
+ result.components = data.components.map((c) => typeof c.toJSON === 'function' ? c.toJSON() : c);
123
+ }
124
+ let allMentions = { ...data.mentions };
125
+ // Process mentions in content if present
126
+ if (data.content) {
127
+ const { content, mentions } = this.processMentions(data.content, allMentions);
128
+ result.content = content;
129
+ allMentions = mentions;
130
+ }
131
+ // Process mentions in embeds (description, title, footer, fields)
132
+ if (data.embeds && data.embeds.length > 0) {
133
+ result.embeds = data.embeds.map(embed => {
134
+ // Support EmbedBuilder instances - extract raw data via toJSON()
135
+ const rawEmbed = typeof embed.toJSON === 'function' ? embed.toJSON() : embed;
136
+ const processedEmbed = { ...rawEmbed };
137
+ // Normalize thumbnail: string → { url: string }
138
+ if (typeof processedEmbed.thumbnail === 'string') {
139
+ processedEmbed.thumbnail = { url: processedEmbed.thumbnail };
140
+ }
141
+ // Normalize image: string → { url: string }
142
+ if (typeof processedEmbed.image === 'string') {
143
+ processedEmbed.image = { url: processedEmbed.image };
144
+ }
145
+ // Normalize color: hex string → number
146
+ if (typeof processedEmbed.color === 'string') {
147
+ processedEmbed.color = parseInt(processedEmbed.color.replace('#', ''), 16);
148
+ }
149
+ // Normalize timestamp: Date → ISO string
150
+ if (processedEmbed.timestamp instanceof Date) {
151
+ processedEmbed.timestamp = processedEmbed.timestamp.toISOString();
152
+ }
153
+ else if (typeof processedEmbed.timestamp === 'number') {
154
+ processedEmbed.timestamp = new Date(processedEmbed.timestamp).toISOString();
155
+ }
156
+ // Normalize footer.iconURL → footer.icon_url
157
+ if (processedEmbed.footer) {
158
+ if (processedEmbed.footer.iconURL && !processedEmbed.footer.icon_url) {
159
+ processedEmbed.footer = { ...processedEmbed.footer, icon_url: processedEmbed.footer.iconURL };
160
+ delete processedEmbed.footer.iconURL;
161
+ }
162
+ }
163
+ // Normalize author.iconURL → author.icon_url
164
+ if (processedEmbed.author) {
165
+ if (processedEmbed.author.iconURL && !processedEmbed.author.icon_url) {
166
+ processedEmbed.author = { ...processedEmbed.author, icon_url: processedEmbed.author.iconURL };
167
+ delete processedEmbed.author.iconURL;
168
+ }
169
+ }
170
+ // Process description
171
+ if (rawEmbed.description) {
172
+ const { content, mentions } = this.processMentions(rawEmbed.description, allMentions);
173
+ processedEmbed.description = content;
174
+ allMentions = mentions;
175
+ }
176
+ // Process title
177
+ if (rawEmbed.title) {
178
+ const { content, mentions } = this.processMentions(rawEmbed.title, allMentions);
179
+ processedEmbed.title = content;
180
+ allMentions = mentions;
181
+ }
182
+ // Process footer text
183
+ if (rawEmbed.footer?.text) {
184
+ const { content, mentions } = this.processMentions(rawEmbed.footer.text, allMentions);
185
+ processedEmbed.footer = { ...rawEmbed.footer, text: content };
186
+ allMentions = mentions;
187
+ }
188
+ // Process fields
189
+ if (rawEmbed.fields && rawEmbed.fields.length > 0) {
190
+ processedEmbed.fields = rawEmbed.fields.map((field) => {
191
+ const processedField = { ...field };
192
+ if (field.value) {
193
+ const { content, mentions } = this.processMentions(field.value, allMentions);
194
+ processedField.value = content;
195
+ allMentions = mentions;
196
+ }
197
+ if (field.name) {
198
+ const { content, mentions } = this.processMentions(field.name, allMentions);
199
+ processedField.name = content;
200
+ allMentions = mentions;
201
+ }
202
+ return processedField;
203
+ });
204
+ }
205
+ return processedEmbed;
206
+ });
207
+ }
208
+ // Add merged mentions to result
209
+ if (allMentions.users?.length || allMentions.roles?.length || allMentions.everyone) {
210
+ result.mentions = allMentions;
211
+ }
212
+ return result;
213
+ }
214
+ /**
215
+ * Set the bot token
216
+ */
217
+ setToken(token) {
218
+ this.token = token;
219
+ return this;
220
+ }
221
+ /**
222
+ * Make an authenticated request
223
+ */
224
+ async request(method, path, body) {
225
+ const url = `${this.baseUrl}${path}`;
226
+ // Debug log
227
+ console.log(`[REST] ${method} ${url}`, body ? JSON.stringify(body) : '');
228
+ const response = await fetch(url, {
229
+ method,
230
+ headers: {
231
+ 'Authorization': `Bot ${this.token}`,
232
+ 'Content-Type': 'application/json'
233
+ },
234
+ body: body ? JSON.stringify(body) : undefined
235
+ });
236
+ if (!response.ok) {
237
+ const error = await response.text();
238
+ throw new Error(`API Error ${response.status}: ${error}`);
239
+ }
240
+ // Handle empty responses
241
+ const text = await response.text();
242
+ if (!text)
243
+ return {};
244
+ return JSON.parse(text);
245
+ }
246
+ // ==================== Messages ====================
247
+ /**
248
+ * Create a message in a channel
249
+ * Mentions use <@ID> format and are kept as-is (client renders them)
250
+ *
251
+ * @example
252
+ * await rest.createMessage(guildId, channelId, {
253
+ * content: 'Hello <@123>!',
254
+ * });
255
+ */
256
+ async createMessage(guildIdOrChannelId, channelIdOrData, data) {
257
+ // İki kullanım şekli:
258
+ // 1. createMessage(guildId, channelId, data) - guildId ile (tercih edilen)
259
+ // 2. createMessage(channelId, data) - guildId olmadan (eski format, hata verir)
260
+ let guildId;
261
+ let channelId;
262
+ let messageData;
263
+ if (typeof channelIdOrData === 'string' && data) {
264
+ // Yeni format: createMessage(guildId, channelId, data)
265
+ guildId = guildIdOrChannelId;
266
+ channelId = channelIdOrData;
267
+ messageData = this.prepareMessageData(data);
268
+ // Add interaction_id if provided
269
+ if (data.interactionId) {
270
+ messageData.interaction_id = data.interactionId;
271
+ }
272
+ }
273
+ else if (typeof channelIdOrData === 'object') {
274
+ // Eski format: createMessage(channelId, data) - guildId yok
275
+ // Bu format artık desteklenmiyor, hata fırlat
276
+ throw new Error('createMessage requires guildId: createMessage(guildId, channelId, data)');
277
+ }
278
+ else {
279
+ throw new Error('Invalid createMessage arguments');
280
+ }
281
+ return this.request('POST', `/bot/guilds/${guildId}/channels/${channelId}/messages`, messageData);
282
+ }
283
+ /**
284
+ * Create an ephemeral message that is only visible to a specific user
285
+ * Ephemeral messages are NOT saved to database - they are only sent via WebSocket
286
+ *
287
+ * @example
288
+ * // Send a warning only visible to the user
289
+ * await rest.createEphemeralMessage(guildId, channelId, targetUserId, {
290
+ * embeds: [warningEmbed]
291
+ * });
292
+ */
293
+ async createEphemeralMessage(guildId, channelId, targetUserId, data) {
294
+ const messageData = this.prepareMessageData(data);
295
+ return this.request('POST', `/bot/guilds/${guildId}/channels/${channelId}/messages`, {
296
+ ...messageData,
297
+ flags: 64, // EPHEMERAL flag
298
+ target_user_id: typeof targetUserId === 'string' ? parseInt(targetUserId, 10) : targetUserId
299
+ });
300
+ }
301
+ /**
302
+ * Create a DM message
303
+ */
304
+ async createDMMessage(channelId, data) {
305
+ return this.request('POST', `/bot/dm/${channelId}`, data);
306
+ }
307
+ /**
308
+ * Edit a message
309
+ * Automatically processes mentions
310
+ */
311
+ async editMessage(guildId, channelId, messageId, data) {
312
+ const path = `/bot/guilds/${guildId}/channels/${channelId}/messages/${messageId}`;
313
+ const processedData = this.prepareMessageData(data);
314
+ return this.request('PATCH', path, processedData);
315
+ }
316
+ /**
317
+ * Delete a message
318
+ */
319
+ async deleteMessage(guildId, channelId, messageId) {
320
+ const path = `/bot/guilds/${guildId}/channels/${channelId}/messages/${messageId}`;
321
+ await this.request('DELETE', path);
322
+ }
323
+ /**
324
+ * Validate and normalize emoji format for the API.
325
+ * Accepted formats: :name:, <:name:id>, <a:name:id>
326
+ * Unicode emoji characters (👍) are NOT supported.
327
+ */
328
+ validateEmoji(emoji) {
329
+ const trimmed = emoji.trim();
330
+ // Custom emoji: <:name:id> or <a:name:id>
331
+ if (/^<a?:\w+:\d+>$/.test(trimmed))
332
+ return trimmed;
333
+ // Unicode emoji by name: :name:
334
+ if (/^:\w+:$/.test(trimmed))
335
+ return trimmed;
336
+ throw new Error(`Geçersiz emoji formatı: "${emoji}". Kabul edilen formatlar: :emoji_name:, <:name:id>, <a:name:id>`);
337
+ }
338
+ /**
339
+ * Add a reaction to a message
340
+ * @param emoji - Emoji in :name:, <:name:id>, or <a:name:id> format. Unicode characters (👍) are not supported.
341
+ */
342
+ async addReaction(guildId, channelId, messageId, emoji) {
343
+ const validated = this.validateEmoji(emoji);
344
+ const path = `/bot/guilds/${guildId}/channels/${channelId}/messages/${messageId}/reactions/${encodeURIComponent(validated)}/@me`;
345
+ await this.request('PUT', path);
346
+ }
347
+ /**
348
+ * Remove a reaction from a message
349
+ * @param emoji - Emoji in :name:, <:name:id>, or <a:name:id> format. Unicode characters (👍) are not supported.
350
+ */
351
+ async removeReaction(guildId, channelId, messageId, emoji) {
352
+ const validated = this.validateEmoji(emoji);
353
+ const path = `/bot/guilds/${guildId}/channels/${channelId}/messages/${messageId}/reactions/${encodeURIComponent(validated)}/@me`;
354
+ await this.request('DELETE', path);
355
+ }
356
+ /**
357
+ * Upload an attachment to a channel
358
+ */
359
+ async uploadAttachment(guildId, channelId, file) {
360
+ const FormData = require('form-data');
361
+ const form = new FormData();
362
+ // form-data expects the buffer directly with options
363
+ form.append('file', file.data, {
364
+ filename: file.name,
365
+ contentType: file.contentType || 'text/plain'
366
+ });
367
+ const url = `${this.baseUrl}/bot/guilds/${guildId}/channels/${channelId}/attachments`;
368
+ console.log(`[REST] Uploading attachment: ${file.name} (${file.data.length} bytes)`);
369
+ const response = await fetch(url, {
370
+ method: 'POST',
371
+ headers: {
372
+ 'Authorization': `Bot ${this.token}`,
373
+ ...form.getHeaders()
374
+ },
375
+ body: form.getBuffer()
376
+ });
377
+ if (!response.ok) {
378
+ const error = await response.text();
379
+ throw new Error(`API Error ${response.status}: ${error}`);
380
+ }
381
+ return response.json();
382
+ }
383
+ /**
384
+ * Create a message with a file attachment
385
+ */
386
+ async createMessageWithFile(guildId, channelId, data) {
387
+ const FormData = require('form-data');
388
+ const form = new FormData();
389
+ // Add content if provided
390
+ if (data.content) {
391
+ form.append('content', data.content);
392
+ }
393
+ // Add interaction_id if provided (for deferred response matching)
394
+ if (data.interactionId) {
395
+ form.append('interaction_id', data.interactionId);
396
+ }
397
+ // Add file
398
+ form.append('files', data.file.data, {
399
+ filename: data.file.name,
400
+ contentType: data.file.contentType || 'text/plain'
401
+ });
402
+ const url = `${this.baseUrl}/bot/guilds/${guildId}/channels/${channelId}/messages`;
403
+ console.log(`[REST] Creating message with file: ${data.file.name} (${data.file.data.length} bytes)${data.interactionId ? ` [interaction: ${data.interactionId}]` : ''}`);
404
+ const response = await fetch(url, {
405
+ method: 'POST',
406
+ headers: {
407
+ 'Authorization': `Bot ${this.token}`,
408
+ ...form.getHeaders()
409
+ },
410
+ body: form.getBuffer()
411
+ });
412
+ if (!response.ok) {
413
+ const error = await response.text();
414
+ throw new Error(`API Error ${response.status}: ${error}`);
415
+ }
416
+ return response.json();
417
+ }
418
+ // ==================== Interactions ====================
419
+ /**
420
+ * Create an interaction response
421
+ * Automatically processes mentions in content and embeds
422
+ */
423
+ async createInteractionResponse(interactionId, token, data) {
424
+ console.log(`📤 Interaction response: ${interactionId} -> type ${data.type}`);
425
+ try {
426
+ // Process mentions in response data if present
427
+ let processedData = data;
428
+ if (data.data && (data.data.content || data.data.embeds)) {
429
+ processedData = {
430
+ ...data,
431
+ data: this.prepareMessageData(data.data)
432
+ };
433
+ }
434
+ await this.request('POST', `/interactions/${interactionId}/${token}/callback`, processedData);
435
+ console.log(`✅ Interaction response sent`);
436
+ }
437
+ catch (error) {
438
+ console.error(`❌ Interaction response error:`, error);
439
+ throw error;
440
+ }
441
+ }
442
+ /**
443
+ * Edit the original interaction response
444
+ * If files are provided, creates a new message with files (since webhook edit doesn't support file upload)
445
+ * Automatically processes mentions
446
+ */
447
+ async editInteractionResponse(token, data, guildId, channelId, interactionId) {
448
+ const appId = this.getApplicationId();
449
+ // Process mentions in content
450
+ const processedData = this.prepareMessageData(data);
451
+ // If files are present and we have guild/channel info, create message with file instead
452
+ if (data.files && data.files.length > 0 && guildId && channelId) {
453
+ console.log(`[REST] editInteractionResponse with ${data.files.length} files - using createMessageWithFile`);
454
+ // Create message with file
455
+ const file = data.files[0]; // For now, support single file
456
+ await this.createMessageWithFile(guildId, channelId, {
457
+ content: processedData.content,
458
+ file: file,
459
+ interactionId: interactionId
460
+ });
461
+ return;
462
+ }
463
+ // If we have guildId, channelId and interactionId, create a new message with interaction_id
464
+ // This is needed because our deferred response doesn't create a message
465
+ if (guildId && channelId && interactionId) {
466
+ console.log(`[REST] editInteractionResponse - creating message with interaction_id: ${interactionId}`);
467
+ const payload = {
468
+ interaction_id: interactionId
469
+ };
470
+ if (processedData.content !== undefined)
471
+ payload.content = processedData.content;
472
+ if (processedData.embeds)
473
+ payload.embeds = processedData.embeds;
474
+ if (processedData.components)
475
+ payload.components = processedData.components;
476
+ if (processedData.mentions)
477
+ payload.mentions = processedData.mentions;
478
+ await this.request('POST', `/bot/guilds/${guildId}/channels/${channelId}/messages`, payload);
479
+ return;
480
+ }
481
+ // Fallback: Regular edit without files (webhook PATCH)
482
+ const payload = {};
483
+ if (processedData.content !== undefined)
484
+ payload.content = processedData.content;
485
+ if (processedData.embeds)
486
+ payload.embeds = processedData.embeds;
487
+ if (processedData.components)
488
+ payload.components = processedData.components;
489
+ if (processedData.mentions)
490
+ payload.mentions = processedData.mentions;
491
+ await this.request('PATCH', `/interactions/webhooks/${appId}/${token}/messages/@original`, payload);
492
+ }
493
+ /**
494
+ * Delete the original interaction response
495
+ */
496
+ async deleteInteractionResponse(token) {
497
+ const appId = this.getApplicationId();
498
+ await this.request('DELETE', `/interactions/webhooks/${appId}/${token}/messages/@original`);
499
+ }
500
+ /**
501
+ * Create a followup message
502
+ * Automatically processes mentions
503
+ */
504
+ async createFollowup(token, data) {
505
+ const appId = this.getApplicationId();
506
+ const processedData = this.prepareMessageData(data);
507
+ await this.request('POST', `/interactions/webhooks/${appId}/${token}`, processedData);
508
+ }
509
+ // ==================== Commands ====================
510
+ /**
511
+ * Register global application commands
512
+ */
513
+ async registerGlobalCommands(commands) {
514
+ const appId = this.getApplicationId();
515
+ for (const command of commands) {
516
+ await this.request('POST', `/applications/${appId}/commands`, command);
517
+ }
518
+ }
519
+ /**
520
+ * Register guild-specific commands
521
+ */
522
+ async registerGuildCommands(guildId, commands) {
523
+ const appId = this.getApplicationId();
524
+ for (const command of commands) {
525
+ await this.request('POST', `/applications/${appId}/guilds/${guildId}/commands`, command);
526
+ }
527
+ }
528
+ /**
529
+ * Delete a global command
530
+ */
531
+ async deleteGlobalCommand(commandId) {
532
+ const appId = this.getApplicationId();
533
+ await this.request('DELETE', `/applications/${appId}/commands/${commandId}`);
534
+ }
535
+ /**
536
+ * Delete a guild-specific command
537
+ */
538
+ async deleteGuildCommand(guildId, commandId) {
539
+ const appId = this.getApplicationId();
540
+ await this.request('DELETE', `/applications/${appId}/guilds/${guildId}/commands/${commandId}`);
541
+ }
542
+ /**
543
+ * List all global commands for this application
544
+ */
545
+ async listGlobalCommands() {
546
+ const appId = this.getApplicationId();
547
+ return this.request('GET', `/applications/${appId}/commands`);
548
+ }
549
+ /**
550
+ * List all guild-specific commands for this application
551
+ */
552
+ async listGuildCommands(guildId) {
553
+ const appId = this.getApplicationId();
554
+ return this.request('GET', `/applications/${appId}/guilds/${guildId}/commands`);
555
+ }
556
+ /**
557
+ * Get a specific global command
558
+ */
559
+ async getGlobalCommand(commandId) {
560
+ const appId = this.getApplicationId();
561
+ return this.request('GET', `/applications/${appId}/commands/${commandId}`);
562
+ }
563
+ /**
564
+ * Get a specific guild command
565
+ */
566
+ async getGuildCommand(guildId, commandId) {
567
+ const appId = this.getApplicationId();
568
+ return this.request('GET', `/applications/${appId}/guilds/${guildId}/commands/${commandId}`);
569
+ }
570
+ /**
571
+ * Update a global command
572
+ */
573
+ async updateGlobalCommand(commandId, data) {
574
+ const appId = this.getApplicationId();
575
+ return this.request('PATCH', `/applications/${appId}/commands/${commandId}`, data);
576
+ }
577
+ /**
578
+ * Update a guild-specific command
579
+ */
580
+ async updateGuildCommand(guildId, commandId, data) {
581
+ const appId = this.getApplicationId();
582
+ return this.request('PATCH', `/applications/${appId}/guilds/${guildId}/commands/${commandId}`, data);
583
+ }
584
+ // ==================== Helpers ====================
585
+ applicationId = '';
586
+ /**
587
+ * Set the application ID
588
+ */
589
+ setApplicationId(id) {
590
+ this.applicationId = id;
591
+ }
592
+ /**
593
+ * Get the application ID
594
+ */
595
+ getApplicationId() {
596
+ if (!this.applicationId) {
597
+ throw new Error('Application ID not set. Call setApplicationId() first.');
598
+ }
599
+ return this.applicationId;
600
+ }
601
+ // ==================== Channels ====================
602
+ /**
603
+ * Create a channel in a guild
604
+ */
605
+ async createChannel(guildId, data) {
606
+ // Map parent_id to category_id for backend compatibility
607
+ const requestData = {
608
+ name: data.name,
609
+ type: data.type ?? 0, // Default to text channel
610
+ };
611
+ // Backend expects category_id, not parent_id
612
+ if (data.category_id) {
613
+ requestData.category_id = data.category_id;
614
+ }
615
+ else if (data.parent_id) {
616
+ requestData.category_id = data.parent_id;
617
+ }
618
+ // Add permission_overwrites if provided
619
+ if (data.permission_overwrites && data.permission_overwrites.length > 0) {
620
+ requestData.permission_overwrites = data.permission_overwrites;
621
+ }
622
+ return this.request('POST', `/bot/guilds/${guildId}/channels`, requestData);
623
+ }
624
+ /**
625
+ * Delete a channel
626
+ */
627
+ /**
628
+ * Delete a channel
629
+ */
630
+ async deleteChannel(guildId, channelId) {
631
+ await this.request('DELETE', `/bot/guilds/${guildId}/channels/${channelId}`);
632
+ }
633
+ /**
634
+ * Delete a category
635
+ */
636
+ async deleteCategory(guildId, categoryId) {
637
+ await this.request('DELETE', `/bot/guilds/${guildId}/categories/${categoryId}`);
638
+ }
639
+ /**
640
+ * Edit channel permission overwrites
641
+ */
642
+ async editChannelPermissions(channelId, overwriteId, data) {
643
+ await this.request('PUT', `/bot/channels/${channelId}/permissions/${overwriteId}`, data);
644
+ }
645
+ /**
646
+ * Delete channel permission overwrite
647
+ */
648
+ async deleteChannelPermission(channelId, overwriteId) {
649
+ await this.request('DELETE', `/bot/channels/${channelId}/permissions/${overwriteId}`);
650
+ }
651
+ /**
652
+ * Get messages from a channel
653
+ */
654
+ async getMessages(guildId, channelId, options) {
655
+ const params = new URLSearchParams();
656
+ if (options?.limit)
657
+ params.append('limit', String(options.limit));
658
+ if (options?.before)
659
+ params.append('before', options.before);
660
+ if (options?.after)
661
+ params.append('after', options.after);
662
+ const query = params.toString() ? `?${params.toString()}` : '';
663
+ const response = await this.request('GET', `/bot/guilds/${guildId}/channels/${channelId}/messages${query}`);
664
+ return response.messages || [];
665
+ }
666
+ // ==================== Members ====================
667
+ /**
668
+ * Get a guild member
669
+ */
670
+ async getMember(guildId, userId) {
671
+ return this.request('GET', `/bot/guilds/${guildId}/members/${userId}`);
672
+ }
673
+ /**
674
+ * Timeout a guild member
675
+ */
676
+ async timeoutMember(guildId, userId, duration, reason) {
677
+ if (duration === null) {
678
+ // Clear timeout
679
+ await this.request('POST', `/bot/guilds/${guildId}/members/${userId}/timeout/clear`, {
680
+ reason
681
+ });
682
+ }
683
+ else {
684
+ // Set timeout
685
+ const until = new Date(Date.now() + duration).toISOString();
686
+ await this.request('POST', `/bot/guilds/${guildId}/members/${userId}/timeout`, {
687
+ until,
688
+ reason
689
+ });
690
+ }
691
+ }
692
+ /**
693
+ * Kick a guild member
694
+ */
695
+ async kickMember(guildId, userId, reason) {
696
+ const query = reason ? `?reason=${encodeURIComponent(reason)}` : '';
697
+ await this.request('DELETE', `/bot/guilds/${guildId}/members/${userId}${query}`);
698
+ }
699
+ /**
700
+ * Ban a guild member
701
+ */
702
+ async banMember(guildId, userId, options) {
703
+ await this.request('PUT', `/bot/guilds/${guildId}/bans/${userId}`, {
704
+ delete_message_days: options?.deleteMessageDays,
705
+ delete_message_seconds: options?.deleteMessageSeconds,
706
+ reason: options?.reason
707
+ });
708
+ }
709
+ /**
710
+ * Unban a user
711
+ */
712
+ async unbanMember(guildId, userId, reason) {
713
+ const query = reason ? `?reason=${encodeURIComponent(reason)}` : '';
714
+ await this.request('DELETE', `/bot/guilds/${guildId}/bans/${userId}${query}`);
715
+ }
716
+ /**
717
+ * Edit a guild member
718
+ */
719
+ async editMember(guildId, userId, data) {
720
+ return this.request('PATCH', `/bot/guilds/${guildId}/members/${userId}`, data);
721
+ }
722
+ /**
723
+ * Add a role to a member
724
+ */
725
+ async addMemberRole(guildId, userId, roleId, reason) {
726
+ const query = reason ? `?reason=${encodeURIComponent(reason)}` : '';
727
+ await this.request('PUT', `/bot/guilds/${guildId}/members/${userId}/roles/${roleId}${query}`);
728
+ }
729
+ /**
730
+ * Remove a role from a member
731
+ */
732
+ async removeMemberRole(guildId, userId, roleId, reason) {
733
+ const query = reason ? `?reason=${encodeURIComponent(reason)}` : '';
734
+ await this.request('DELETE', `/bot/guilds/${guildId}/members/${userId}/roles/${roleId}${query}`);
735
+ }
736
+ /**
737
+ * Bulk assign roles to members
738
+ */
739
+ async bulkAssignRoles(guildId, assignments) {
740
+ return this.request('PUT', `/bot/guilds/${guildId}/members/roles/assign`, { assignments });
741
+ }
742
+ /**
743
+ * Bulk remove roles from members
744
+ */
745
+ async bulkRemoveRoles(guildId, removals) {
746
+ return this.request('DELETE', `/bot/guilds/${guildId}/members/roles/remove`, { removals });
747
+ }
748
+ /**
749
+ * Bulk delete messages
750
+ */
751
+ async bulkDeleteMessages(guildId, channelId, messageIds) {
752
+ await this.request('POST', `/bot/guilds/${guildId}/channels/${channelId}/messages/bulk-delete`, {
753
+ messages: messageIds
754
+ });
755
+ }
756
+ // ==================== Guilds ====================
757
+ /**
758
+ * Get a guild
759
+ */
760
+ async getGuild(guildId) {
761
+ return this.request('GET', `/bot/guilds/${guildId}`);
762
+ }
763
+ /**
764
+ * Get guild channels
765
+ */
766
+ async getGuildChannels(guildId) {
767
+ return this.request('GET', `/bot/guilds/${guildId}/channels`);
768
+ }
769
+ /**
770
+ * Get guild roles
771
+ */
772
+ async getRoles(guildId) {
773
+ return this.request('GET', `/bot/guilds/${guildId}/roles`);
774
+ }
775
+ /**
776
+ * Create a role
777
+ */
778
+ async createRole(guildId, data) {
779
+ return this.request('POST', `/bot/guilds/${guildId}/roles`, data);
780
+ }
781
+ /**
782
+ * Edit a role
783
+ */
784
+ async editRole(guildId, roleId, data) {
785
+ return this.request('PATCH', `/bot/guilds/${guildId}/roles/${roleId}`, data);
786
+ }
787
+ /**
788
+ * Delete a role
789
+ */
790
+ async deleteRole(guildId, roleId) {
791
+ await this.request('DELETE', `/bot/guilds/${guildId}/roles/${roleId}`);
792
+ }
793
+ /**
794
+ * Get guild emojis
795
+ */
796
+ async getEmojis(guildId) {
797
+ return this.request('GET', `/bot/guilds/${guildId}/emojis`);
798
+ }
799
+ /**
800
+ * Get guild bans
801
+ */
802
+ async getBans(guildId) {
803
+ return this.request('GET', `/bot/guilds/${guildId}/bans`);
804
+ }
805
+ /**
806
+ * Get a specific ban
807
+ */
808
+ async getBan(guildId, userId) {
809
+ return this.request('GET', `/bot/guilds/${guildId}/bans/${userId}`);
810
+ }
811
+ /**
812
+ * Get guild invites
813
+ */
814
+ async getGuildInvites(guildId) {
815
+ return this.request('GET', `/bot/guilds/${guildId}/invites`);
816
+ }
817
+ // ==================== Pins ====================
818
+ /**
819
+ * Pin a message
820
+ */
821
+ async pinMessage(guildId, channelId, messageId) {
822
+ await this.request('PUT', `/bot/guilds/${guildId}/channels/${channelId}/pins/${messageId}`);
823
+ }
824
+ /**
825
+ * Unpin a message
826
+ */
827
+ async unpinMessage(guildId, channelId, messageId) {
828
+ await this.request('DELETE', `/bot/guilds/${guildId}/channels/${channelId}/pins/${messageId}`);
829
+ }
830
+ /**
831
+ * Get pinned messages
832
+ */
833
+ async getPinnedMessages(guildId, channelId) {
834
+ return this.request('GET', `/bot/guilds/${guildId}/channels/${channelId}/pins`);
835
+ }
836
+ // ==================== Users ====================
837
+ /**
838
+ * Get a user
839
+ */
840
+ async getUser(userId) {
841
+ return this.request('GET', `/bot/users/${userId}`);
842
+ }
843
+ /**
844
+ * Get current bot user
845
+ */
846
+ async getCurrentUser() {
847
+ return this.request('GET', `/bot/users/@me`);
848
+ }
849
+ // ==================== Invites ====================
850
+ /**
851
+ * Create an invite
852
+ */
853
+ async createInvite(guildId, channelId, data) {
854
+ return this.request('POST', `/bot/guilds/${guildId}/channels/${channelId}/invites`, data || {});
855
+ }
856
+ /**
857
+ * Delete an invite
858
+ */
859
+ async deleteInvite(inviteCode) {
860
+ await this.request('DELETE', `/bot/invites/${inviteCode}`);
861
+ }
862
+ /**
863
+ * Get an invite
864
+ */
865
+ async getInvite(inviteCode) {
866
+ return this.request('GET', `/bot/invites/${inviteCode}`);
867
+ }
868
+ // ==================== Webhooks ====================
869
+ /**
870
+ * Get channel webhooks
871
+ */
872
+ async getChannelWebhooks(guildId, channelId) {
873
+ return this.request('GET', `/bot/guilds/${guildId}/channels/${channelId}/webhooks`);
874
+ }
875
+ /**
876
+ * Get guild webhooks
877
+ */
878
+ async getGuildWebhooks(guildId) {
879
+ return this.request('GET', `/bot/guilds/${guildId}/webhooks`);
880
+ }
881
+ /**
882
+ * Create a webhook
883
+ */
884
+ async createWebhook(guildId, channelId, data) {
885
+ return this.request('POST', `/bot/guilds/${guildId}/channels/${channelId}/webhooks`, data);
886
+ }
887
+ /**
888
+ * Update a webhook
889
+ */
890
+ async updateWebhook(guildId, webhookId, data) {
891
+ return this.request('PATCH', `/bot/guilds/${guildId}/webhooks/${webhookId}`, data);
892
+ }
893
+ /**
894
+ * Delete a webhook
895
+ */
896
+ async deleteWebhook(guildId, webhookId) {
897
+ return this.request('DELETE', `/bot/guilds/${guildId}/webhooks/${webhookId}`);
898
+ }
899
+ }
900
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUkVTVC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZXN0L1JFU1QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBK0JBOztHQUVHO0FBQ0gsTUFBTSxPQUFPLElBQUk7SUFDUCxPQUFPLENBQVM7SUFDaEIsS0FBSyxHQUFXLEVBQUUsQ0FBQztJQUUzQixxREFBcUQ7SUFDN0MsU0FBUyxHQUE0QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3RDLGNBQWMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLFdBQVc7SUFFNUQsWUFBWSxVQUFrQixtQ0FBbUM7UUFDL0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztJQUVELDREQUE0RDtJQUU1RDs7O09BR0c7SUFDSCxTQUFTLENBQUMsSUFBNEY7UUFDcEcsTUFBTSxNQUFNLEdBQUcsT0FBTyxJQUFJLENBQUMsRUFBRSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDN0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFO1lBQ3pCLEVBQUUsRUFBRSxNQUFNO1lBQ1YsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxZQUFZO1lBQ2xELFFBQVEsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVUsQ0FBQyxLQUFvRztRQUM3RyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7T0FFRztJQUNI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SSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsZUFBZSxPQUFPLFdBQVcsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBZSxFQUFFLFNBQWlCLEVBQUUsSUFHdkQ7UUFDQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGVBQWUsT0FBTyxhQUFhLFNBQVMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBZSxFQUFFLFNBQWlCLEVBQUUsSUFHdkQ7UUFDQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLGVBQWUsT0FBTyxhQUFhLFNBQVMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBZSxFQUFFLFNBQWlCO1FBQ3BELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsZUFBZSxPQUFPLGFBQWEsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUNoRixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBUElNZXNzYWdlLCBBUElBcHBsaWNhdGlvbkNvbW1hbmQsIEFQSUVtYmVkIH0gZnJvbSAnLi4vdHlwZXMnO1xyXG5cclxuLyoqXHJcbiAqIE1lbnRpb24gZGF0YSBzdHJ1Y3R1cmUgZm9yIG91ciBzeXN0ZW1cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVudGlvblVzZXIge1xyXG4gIGlkOiBudW1iZXI7XHJcbiAgdXNlcm5hbWU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNZW50aW9uUm9sZSB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBuYW1lPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE1lbnRpb25zRGF0YSB7XHJcbiAgdXNlcnM/OiBNZW50aW9uVXNlcltdO1xyXG4gIHJvbGVzPzogTWVudGlvblJvbGVbXTtcclxuICBldmVyeW9uZT86IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBVc2VyIGNhY2hlIGVudHJ5XHJcbiAqL1xyXG5pbnRlcmZhY2UgQ2FjaGVkVXNlciB7XHJcbiAgaWQ6IG51bWJlcjtcclxuICB1c2VybmFtZTogc3RyaW5nO1xyXG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xyXG4gIGNhY2hlZEF0OiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSRVNUIEFQSSBjbGllbnQgZm9yIEp1YmJpb1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFJFU1Qge1xyXG4gIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgdG9rZW46IHN0cmluZyA9ICcnO1xyXG4gIFxyXG4gIC8vIFVzZXIgY2FjaGUgZm9yIG1lbnRpb24gcmVzb2x1dGlvbiAoSUQgLT4gdXNlcm5hbWUpXHJcbiAgcHJpdmF0ZSB1c2VyQ2FjaGU6IE1hcDxudW1iZXIsIENhY2hlZFVzZXI+ID0gbmV3IE1hcCgpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgVVNFUl9DQUNIRV9UVEwgPSA1ICogNjAgKiAxMDAwOyAvLyA1IGRha2lrYVxyXG5cclxuICBjb25zdHJ1Y3RvcihiYXNlVXJsOiBzdHJpbmcgPSAnaHR0cHM6Ly9nYXRld2F5Lmp1YmJpby5jb20vYXBpL3YxJykge1xyXG4gICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybDtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IE1lbnRpb24gSGVscGVycyA9PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvKipcclxuICAgKiBDYWNoZSBhIHVzZXIgZm9yIG1lbnRpb24gcmVzb2x1dGlvblxyXG4gICAqIEJvdCdsYXIgaW50ZXJhY3Rpb24nZGFuIGdlbGVuIHVzZXIgYmlsZ2lzaW5pIGNhY2hlJ2xleWViaWxpclxyXG4gICAqL1xyXG4gIGNhY2hlVXNlcih1c2VyOiB7IGlkOiBzdHJpbmcgfCBudW1iZXI7IHVzZXJuYW1lOiBzdHJpbmc7IGRpc3BsYXlOYW1lPzogc3RyaW5nOyBkaXNwbGF5X25hbWU/OiBzdHJpbmcgfSk6IHZvaWQge1xyXG4gICAgY29uc3QgdXNlcklkID0gdHlwZW9mIHVzZXIuaWQgPT09ICdzdHJpbmcnID8gcGFyc2VJbnQodXNlci5pZCwgMTApIDogdXNlci5pZDtcclxuICAgIHRoaXMudXNlckNhY2hlLnNldCh1c2VySWQsIHtcclxuICAgICAgaWQ6IHVzZXJJZCxcclxuICAgICAgdXNlcm5hbWU6IHVzZXIudXNlcm5hbWUsXHJcbiAgICAgIGRpc3BsYXlOYW1lOiB1c2VyLmRpc3BsYXlOYW1lIHx8IHVzZXIuZGlzcGxheV9uYW1lLFxyXG4gICAgICBjYWNoZWRBdDogRGF0ZS5ub3coKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWNoZSBtdWx0aXBsZSB1c2Vyc1xyXG4gICAqL1xyXG4gIGNhY2hlVXNlcnModXNlcnM6IEFycmF5PHsgaWQ6IHN0cmluZyB8IG51bWJlcjsgdXNlcm5hbWU6IHN0cmluZzsgZGlzcGxheU5hbWU/OiBzdHJpbmc7IGRpc3BsYXlfbmFtZT86IHN0cmluZyB9Pik6IHZvaWQge1xyXG4gICAgdXNlcnMuZm9yRWFjaCh1c2VyID0+IHRoaXMuY2FjaGVVc2VyKHVzZXIpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBjYWNoZWQgdXNlciBieSBJRFxyXG4gICAqL1xyXG4gIGdldENhY2hlZFVzZXIodXNlcklkOiBudW1iZXIpOiBDYWNoZWRVc2VyIHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMudXNlckNhY2hlLmdldCh1c2VySWQpO1xyXG4gICAgaWYgKGNhY2hlZCAmJiBEYXRlLm5vdygpIC0gY2FjaGVkLmNhY2hlZEF0IDwgdGhpcy5VU0VSX0NBQ0hFX1RUTCkge1xyXG4gICAgICByZXR1cm4gY2FjaGVkO1xyXG4gICAgfVxyXG4gICAgLy8gRXhwaXJlZCwgcmVtb3ZlIGZyb20gY2FjaGVcclxuICAgIGlmIChjYWNoZWQpIHtcclxuICAgICAgdGhpcy51c2VyQ2FjaGUuZGVsZXRlKHVzZXJJZCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9ybWF0IGEgdXNlciBtZW50aW9uXHJcbiAgICogUmV0dXJucyBib3RoIHRoZSB0ZXh0IGZvcm1hdCBhbmQgbWVudGlvbnMgZGF0YVxyXG4gICAqIFxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogY29uc3QgbWVudGlvbiA9IHJlc3QuZm9ybWF0TWVudGlvbih1c2VyKTtcclxuICAgKiAvLyBtZW50aW9uLnRleHQgPSBcIjxAMT5cIlxyXG4gICAqIC8vIG1lbnRpb24uZGF0YSA9IHsgdXNlcnM6IFt7IGlkOiAxLCB1c2VybmFtZTogXCJpbGtheVwiIH1dIH1cclxuICAgKi9cclxuICBmb3JtYXRNZW50aW9uKHVzZXI6IHsgaWQ6IHN0cmluZyB8IG51bWJlcjsgdXNlcm5hbWU6IHN0cmluZyB9KTogeyB0ZXh0OiBzdHJpbmc7IGRhdGE6IE1lbnRpb25zRGF0YSB9IHtcclxuICAgIGNvbnN0IHVzZXJJZCA9IHR5cGVvZiB1c2VyLmlkID09PSAnc3RyaW5nJyA/IHBhcnNlSW50KHVzZXIuaWQsIDEwKSA6IHVzZXIuaWQ7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0ZXh0OiBgPEAke3VzZXJJZH0+YCxcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIHVzZXJzOiBbeyBpZDogdXNlcklkLCB1c2VybmFtZTogdXNlci51c2VybmFtZSB9XVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGFyc2UgbWVudGlvbnMgKDxASUQ+KSBpbiBjb250ZW50IGFuZCBidWlsZCBtZW50aW9ucyBkYXRhIHN0cnVjdHVyZVxyXG4gICAqIENvbnRlbnQgaXMga2VwdCBhcy1pcyB3aXRoIDxASUQ+IGZvcm1hdCAoY2xpZW50IHJlbmRlcnMgdGhlbSlcclxuICAgKiBcclxuICAgKiBAcGFyYW0gY29udGVudCAtIE1lc3NhZ2UgY29udGVudCB3aXRoIG1lbnRpb25zXHJcbiAgICogQHBhcmFtIGV4aXN0aW5nTWVudGlvbnMgLSBFeGlzdGluZyBtZW50aW9ucyBkYXRhIHRvIG1lcmdlIHdpdGhcclxuICAgKiBAcmV0dXJucyBPcmlnaW5hbCBjb250ZW50IGFuZCBtZW50aW9ucyBkYXRhXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwcm9jZXNzTWVudGlvbnMoY29udGVudDogc3RyaW5nLCBleGlzdGluZ01lbnRpb25zPzogTWVudGlvbnNEYXRhKTogeyBjb250ZW50OiBzdHJpbmc7IG1lbnRpb25zOiBNZW50aW9uc0RhdGEgfSB7XHJcbiAgICBjb25zdCBtZW50aW9uczogTWVudGlvbnNEYXRhID0ge1xyXG4gICAgICB1c2VyczogWy4uLihleGlzdGluZ01lbnRpb25zPy51c2VycyB8fCBbXSldLFxyXG4gICAgICByb2xlczogWy4uLihleGlzdGluZ01lbnRpb25zPy5yb2xlcyB8fCBbXSldLFxyXG4gICAgICBldmVyeW9uZTogZXhpc3RpbmdNZW50aW9ucz8uZXZlcnlvbmVcclxuICAgIH07XHJcblxyXG4gICAgLy8gVHJhY2sgYWxyZWFkeSBhZGRlZCB1c2VyIElEcyB0byBhdm9pZCBkdXBsaWNhdGVzXHJcbiAgICBjb25zdCBhZGRlZFVzZXJJZHMgPSBuZXcgU2V0KG1lbnRpb25zLnVzZXJzPy5tYXAodSA9PiB1LmlkKSB8fCBbXSk7XHJcblxyXG4gICAgLy8gUGFyc2UgPEBJRD4gZm9ybWF0ICh1c2VyIG1lbnRpb25zKSDigJQga2VlcCBjb250ZW50IGFzLWlzLCBvbmx5IGJ1aWxkIG1lbnRpb25zIGRhdGFcclxuICAgIGNvbnN0IHVzZXJNZW50aW9uUmVnZXggPSAvPEAhPyhcXGQrKT4vZztcclxuICAgIGxldCBtYXRjaDtcclxuXHJcbiAgICB3aGlsZSAoKG1hdGNoID0gdXNlck1lbnRpb25SZWdleC5leGVjKGNvbnRlbnQpKSAhPT0gbnVsbCkge1xyXG4gICAgICBjb25zdCB1c2VySWQgPSBwYXJzZUludChtYXRjaFsxXSwgMTApO1xyXG5cclxuICAgICAgaWYgKCFhZGRlZFVzZXJJZHMuaGFzKHVzZXJJZCkpIHtcclxuICAgICAgICAvLyBUcnkgdG8gZ2V0IHVzZXJuYW1lIGZyb20gY2FjaGUgZm9yIG1lbnRpb25zIGRhdGFcclxuICAgICAgICBjb25zdCBjYWNoZWRVc2VyID0gdGhpcy5nZXRDYWNoZWRVc2VyKHVzZXJJZCk7XHJcbiAgICAgICAgbWVudGlvbnMudXNlcnMhLnB1c2goeyBpZDogdXNlcklkLCB1c2VybmFtZTogY2FjaGVkVXNlcj8udXNlcm5hbWUgfHwgYFVzZXJfJHt1c2VySWR9YCB9KTtcclxuICAgICAgICBhZGRlZFVzZXJJZHMuYWRkKHVzZXJJZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBQYXJzZSA8QCZJRD4gZm9ybWF0IChyb2xlIG1lbnRpb25zKSDigJQga2VlcCBjb250ZW50IGFzLWlzXHJcbiAgICBjb25zdCByb2xlTWVudGlvblJlZ2V4ID0gLzxAJihcXGQrKT4vZztcclxuICAgIGNvbnN0IGFkZGVkUm9sZUlkcyA9IG5ldyBTZXQobWVudGlvbnMucm9sZXM/Lm1hcChyID0+IHIuaWQpIHx8IFtdKTtcclxuXHJcbiAgICB3aGlsZSAoKG1hdGNoID0gcm9sZU1lbnRpb25SZWdleC5leGVjKGNvbnRlbnQpKSAhPT0gbnVsbCkge1xyXG4gICAgICBjb25zdCByb2xlSWQgPSBtYXRjaFsxXTtcclxuICAgICAgaWYgKCFhZGRlZFJvbGVJZHMuaGFzKHJvbGVJZCkpIHtcclxuICAgICAgICBtZW50aW9ucy5yb2xlcyEucHVzaCh7IGlkOiByb2xlSWQgfSk7XHJcbiAgICAgICAgYWRkZWRSb2xlSWRzLmFkZChyb2xlSWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUGFyc2UgQGV2ZXJ5b25lIGFuZCBAaGVyZVxyXG4gICAgaWYgKGNvbnRlbnQuaW5jbHVkZXMoJ0BldmVyeW9uZScpKSB7XHJcbiAgICAgIG1lbnRpb25zLmV2ZXJ5b25lID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDbGVhbiB1cCBlbXB0eSBhcnJheXNcclxuICAgIGlmIChtZW50aW9ucy51c2Vycz8ubGVuZ3RoID09PSAwKSBkZWxldGUgbWVudGlvbnMudXNlcnM7XHJcbiAgICBpZiAobWVudGlvbnMucm9sZXM/Lmxlbmd0aCA9PT0gMCkgZGVsZXRlIG1lbnRpb25zLnJvbGVzO1xyXG5cclxuICAgIHJldHVybiB7IGNvbnRlbnQsIG1lbnRpb25zIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQcmVwYXJlIG1lc3NhZ2UgZGF0YSB3aXRoIHByb2Nlc3NlZCBtZW50aW9uc1xyXG4gICAqIEF1dG9tYXRpY2FsbHkgY29udmVydHMgbWVudGlvbnMgdG8gb3VyIGZvcm1hdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgcHJlcGFyZU1lc3NhZ2VEYXRhKGRhdGE6IHtcclxuICAgIGNvbnRlbnQ/OiBzdHJpbmc7XHJcbiAgICBlbWJlZHM/OiBBUElFbWJlZFtdO1xyXG4gICAgY29tcG9uZW50cz86IGFueVtdO1xyXG4gICAgbWVudGlvbnM/OiBNZW50aW9uc0RhdGE7XHJcbiAgICBtZXNzYWdlX3JlZmVyZW5jZT86IHsgbWVzc2FnZV9pZDogc3RyaW5nIH07XHJcbiAgfSk6IGFueSB7XHJcbiAgICBjb25zdCByZXN1bHQ6IGFueSA9IHsgLi4uZGF0YSB9O1xyXG5cclxuICAgIC8vIFJlc29sdmUgY29tcG9uZW50cyAoQWN0aW9uUm93QnVpbGRlciAvIEJ1dHRvbkJ1aWxkZXIgaW5zdGFuY2VzKVxyXG4gICAgaWYgKGRhdGEuY29tcG9uZW50cyAmJiBkYXRhLmNvbXBvbmVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXN1bHQuY29tcG9uZW50cyA9IGRhdGEuY29tcG9uZW50cy5tYXAoKGM6IGFueSkgPT5cclxuICAgICAgICB0eXBlb2YgYy50b0pTT04gPT09ICdmdW5jdGlvbicgPyBjLnRvSlNPTigpIDogY1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBhbGxNZW50aW9uczogTWVudGlvbnNEYXRhID0geyAuLi5kYXRhLm1lbnRpb25zIH07XHJcblxyXG4gICAgLy8gUHJvY2VzcyBtZW50aW9ucyBpbiBjb250ZW50IGlmIHByZXNlbnRcclxuICAgIGlmIChkYXRhLmNvbnRlbnQpIHtcclxuICAgICAgY29uc3QgeyBjb250ZW50LCBtZW50aW9ucyB9ID0gdGhpcy5wcm9jZXNzTWVudGlvbnMoZGF0YS5jb250ZW50LCBhbGxNZW50aW9ucyk7XHJcbiAgICAgIHJlc3VsdC5jb250ZW50ID0gY29udGVudDtcclxuICAgICAgYWxsTWVudGlvbnMgPSBtZW50aW9ucztcclxuICAgIH1cclxuXHJcbiAgICAvLyBQcm9jZXNzIG1lbnRpb25zIGluIGVtYmVkcyAoZGVzY3JpcHRpb24sIHRpdGxlLCBmb290ZXIsIGZpZWxkcylcclxuICAgIGlmIChkYXRhLmVtYmVkcyAmJiBkYXRhLmVtYmVkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJlc3VsdC5lbWJlZHMgPSBkYXRhLmVtYmVkcy5tYXAoZW1iZWQgPT4ge1xyXG4gICAgICAgIC8vIFN1cHBvcnQgRW1iZWRCdWlsZGVyIGluc3RhbmNlcyAtIGV4dHJhY3QgcmF3IGRhdGEgdmlhIHRvSlNPTigpXHJcbiAgICAgICAgY29uc3QgcmF3RW1iZWQgPSB0eXBlb2YgKGVtYmVkIGFzIGFueSkudG9KU09OID09PSAnZnVuY3Rpb24nID8gKGVtYmVkIGFzIGFueSkudG9KU09OKCkgOiBlbWJlZDtcclxuICAgICAgICBjb25zdCBwcm9jZXNzZWRFbWJlZDogYW55ID0geyAuLi5yYXdFbWJlZCB9O1xyXG5cclxuICAgICAgICAvLyBOb3JtYWxpemUgdGh1bWJuYWlsOiBzdHJpbmcg4oaSIHsgdXJsOiBzdHJpbmcgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgcHJvY2Vzc2VkRW1iZWQudGh1bWJuYWlsID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgcHJvY2Vzc2VkRW1iZWQudGh1bWJuYWlsID0geyB1cmw6IHByb2Nlc3NlZEVtYmVkLnRodW1ibmFpbCB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTm9ybWFsaXplIGltYWdlOiBzdHJpbmcg4oaSIHsgdXJsOiBzdHJpbmcgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgcHJvY2Vzc2VkRW1iZWQuaW1hZ2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBwcm9jZXNzZWRFbWJlZC5pbWFnZSA9IHsgdXJsOiBwcm9jZXNzZWRFbWJlZC5pbWFnZSB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTm9ybWFsaXplIGNvbG9yOiBoZXggc3RyaW5nIOKGkiBudW1iZXJcclxuICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3NlZEVtYmVkLmNvbG9yID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgcHJvY2Vzc2VkRW1iZWQuY29sb3IgPSBwYXJzZUludChwcm9jZXNzZWRFbWJlZC5jb2xvci5yZXBsYWNlKCcjJywgJycpLCAxNik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBOb3JtYWxpemUgdGltZXN0YW1wOiBEYXRlIOKGkiBJU08gc3RyaW5nXHJcbiAgICAgICAgaWYgKHByb2Nlc3NlZEVtYmVkLnRpbWVzdGFtcCBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgICAgIHByb2Nlc3NlZEVtYmVkLnRpbWVzdGFtcCA9IHByb2Nlc3NlZEVtYmVkLnRpbWVzdGFtcC50b0lTT1N0cmluZygpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHByb2Nlc3NlZEVtYmVkLnRpbWVzdGFtcCA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgIHByb2Nlc3NlZEVtYmVkLnRpbWVzdGFtcCA9IG5ldyBEYXRlKHByb2Nlc3NlZEVtYmVkLnRpbWVzdGFtcCkudG9JU09TdHJpbmcoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIE5vcm1hbGl6ZSBmb290ZXIuaWNvblVSTCDihpIgZm9vdGVyLmljb25fdXJsXHJcbiAgICAgICAgaWYgKHByb2Nlc3NlZEVtYmVkLmZvb3Rlcikge1xyXG4gICAgICAgICAgaWYgKHByb2Nlc3NlZEVtYmVkLmZvb3Rlci5pY29uVVJMICYmICFwcm9jZXNzZWRFbWJlZC5mb290ZXIuaWNvbl91cmwpIHtcclxuICAgICAgICAgICAgcHJvY2Vzc2VkRW1iZWQuZm9vdGVyID0geyAuLi5wcm9jZXNzZWRFbWJlZC5mb290ZXIsIGljb25fdXJsOiBwcm9jZXNzZWRFbWJlZC5mb290ZXIuaWNvblVSTCB9O1xyXG4gICAgICAgICAgICBkZWxldGUgcHJvY2Vzc2VkRW1iZWQuZm9vdGVyLmljb25VUkw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBOb3JtYWxpemUgYXV0aG9yLmljb25VUkwg4oaSIGF1dGhvci5pY29uX3VybFxyXG4gICAgICAgIGlmIChwcm9jZXNzZWRFbWJlZC5hdXRob3IpIHtcclxuICAgICAgICAgIGlmIChwcm9jZXNzZWRFbWJlZC5hdXRob3IuaWNvblVSTCAmJiAhcHJvY2Vzc2VkRW1iZWQuYXV0aG9yLmljb25fdXJsKSB7XHJcbiAgICAgICAgICAgIHByb2Nlc3NlZEVtYmVkLmF1dGhvciA9IHsgLi4ucHJvY2Vzc2VkRW1iZWQuYXV0aG9yLCBpY29uX3VybDogcHJvY2Vzc2VkRW1iZWQuYXV0aG9yLmljb25VUkwgfTtcclxuICAgICAgICAgICAgZGVsZXRlIHByb2Nlc3NlZEVtYmVkLmF1dGhvci5pY29uVVJMO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBQcm9jZXNzIGRlc2NyaXB0aW9uXHJcbiAgICAgICAgaWYgKHJhd0VtYmVkLmRlc2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICBjb25zdCB7IGNvbnRlbnQsIG1lbnRpb25zIH0gPSB0aGlzLnByb2Nlc3NNZW50aW9ucyhyYXdFbWJlZC5kZXNjcmlwdGlvbiwgYWxsTWVudGlvbnMpO1xyXG4gICAgICAgICAgcHJvY2Vzc2VkRW1iZWQuZGVzY3JpcHRpb24gPSBjb250ZW50O1xyXG4gICAgICAgICAgYWxsTWVudGlvbnMgPSBtZW50aW9ucztcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gUHJvY2VzcyB0aXRsZVxyXG4gICAgICAgIGlmIChyYXdFbWJlZC50aXRsZSkge1xyXG4gICAgICAgICAgY29uc3QgeyBjb250ZW50LCBtZW50aW9ucyB9ID0gdGhpcy5wcm9jZXNzTWVudGlvbnMocmF3RW1iZWQudGl0bGUsIGFsbE1lbnRpb25zKTtcclxuICAgICAgICAgIHByb2Nlc3NlZEVtYmVkLnRpdGxlID0gY29udGVudDtcclxuICAgICAgICAgIGFsbE1lbnRpb25zID0gbWVudGlvbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFByb2Nlc3MgZm9vdGVyIHRleHRcclxuICAgICAgICBpZiAocmF3RW1iZWQuZm9vdGVyPy50ZXh0KSB7XHJcbiAgICAgICAgICBjb25zdCB7IGNvbnRlbnQsIG1lbnRpb25zIH0gPSB0aGlzLnByb2Nlc3NNZW50aW9ucyhyYXdFbWJlZC5mb290ZXIudGV4dCwgYWxsTWVudGlvbnMpO1xyXG4gICAgICAgICAgcHJvY2Vzc2VkRW1iZWQuZm9vdGVyID0geyAuLi5yYXdFbWJlZC5mb290ZXIsIHRleHQ6IGNvbnRlbnQgfTtcclxuICAgICAgICAgIGFsbE1lbnRpb25zID0gbWVudGlvbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFByb2Nlc3MgZmllbGRzXHJcbiAgICAgICAgaWYgKHJhd0VtYmVkLmZpZWxkcyAmJiByYXdFbWJlZC5maWVsZHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgcHJvY2Vzc2VkRW1iZWQuZmllbGRzID0gcmF3RW1iZWQuZmllbGRzLm1hcCgoZmllbGQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBwcm9jZXNzZWRGaWVsZDogYW55ID0geyAuLi5maWVsZCB9O1xyXG4gICAgICAgICAgICBpZiAoZmllbGQudmFsdWUpIHtcclxuICAgICAgICAgICAgICBjb25zdCB7IGNvbnRlbnQsIG1lbnRpb25zIH0gPSB0aGlzLnByb2Nlc3NNZW50aW9ucyhmaWVsZC52YWx1ZSwgYWxsTWVudGlvbnMpO1xyXG4gICAgICAgICAgICAgIHByb2Nlc3NlZEZpZWxkLnZhbHVlID0gY29udGVudDtcclxuICAgICAgICAgICAgICBhbGxNZW50aW9ucyA9IG1lbnRpb25zO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChmaWVsZC5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgeyBjb250ZW50LCBtZW50aW9ucyB9ID0gdGhpcy5wcm9jZXNzTWVudGlvbnMoZmllbGQubmFtZSwgYWxsTWVudGlvbnMpO1xyXG4gICAgICAgICAgICAgIHByb2Nlc3NlZEZpZWxkLm5hbWUgPSBjb250ZW50O1xyXG4gICAgICAgICAgICAgIGFsbE1lbnRpb25zID0gbWVudGlvbnM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEZpZWxkO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBwcm9jZXNzZWRFbWJlZDtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWRkIG1lcmdlZCBtZW50aW9ucyB0byByZXN1bHRcclxuICAgIGlmIChhbGxNZW50aW9ucy51c2Vycz8ubGVuZ3RoIHx8IGFsbE1lbnRpb25zLnJvbGVzPy5sZW5ndGggfHwgYWxsTWVudGlvbnMuZXZlcnlvbmUpIHtcclxuICAgICAgcmVzdWx0Lm1lbnRpb25zID0gYWxsTWVudGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgYm90IHRva2VuXHJcbiAgICovXHJcbiAgc2V0VG9rZW4odG9rZW46IHN0cmluZyk6IHRoaXMge1xyXG4gICAgdGhpcy50b2tlbiA9IHRva2VuO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYWtlIGFuIGF1dGhlbnRpY2F0ZWQgcmVxdWVzdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgcmVxdWVzdDxUPihtZXRob2Q6IHN0cmluZywgcGF0aDogc3RyaW5nLCBib2R5PzogYW55KTogUHJvbWlzZTxUPiB7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmJhc2VVcmx9JHtwYXRofWA7XHJcbiAgICBcclxuICAgIC8vIERlYnVnIGxvZ1xyXG4gICAgY29uc29sZS5sb2coYFtSRVNUXSAke21ldGhvZH0gJHt1cmx9YCwgYm9keSA/IEpTT04uc3RyaW5naWZ5KGJvZHkpIDogJycpO1xyXG4gICAgXHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xyXG4gICAgICBtZXRob2QsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCb3QgJHt0aGlzLnRva2VufWAsXHJcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xyXG4gICAgICB9LFxyXG4gICAgICBib2R5OiBib2R5ID8gSlNPTi5zdHJpbmdpZnkoYm9keSkgOiB1bmRlZmluZWRcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQVBJIEVycm9yICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtlcnJvcn1gKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBIYW5kbGUgZW1wdHkgcmVzcG9uc2VzXHJcbiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xyXG4gICAgaWYgKCF0ZXh0KSByZXR1cm4ge30gYXMgVDtcclxuICAgIFxyXG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBNZXNzYWdlcyA9PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBtZXNzYWdlIGluIGEgY2hhbm5lbFxyXG4gICAqIE1lbnRpb25zIHVzZSA8QElEPiBmb3JtYXQgYW5kIGFyZSBrZXB0IGFzLWlzIChjbGllbnQgcmVuZGVycyB0aGVtKVxyXG4gICAqIFxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogYXdhaXQgcmVzdC5jcmVhdGVNZXNzYWdlKGd1aWxkSWQsIGNoYW5uZWxJZCwge1xyXG4gICAqICAgY29udGVudDogJ0hlbGxvIDxAMTIzPiEnLFxyXG4gICAqIH0pO1xyXG4gICAqL1xyXG4gIGFzeW5jIGNyZWF0ZU1lc3NhZ2UoZ3VpbGRJZE9yQ2hhbm5lbElkOiBzdHJpbmcsIGNoYW5uZWxJZE9yRGF0YTogc3RyaW5nIHwge1xyXG4gICAgY29udGVudD86IHN0cmluZztcclxuICAgIGVtYmVkcz86IEFQSUVtYmVkW107XHJcbiAgICBjb21wb25lbnRzPzogYW55W107XHJcbiAgICBtZW50aW9ucz86IE1lbnRpb25zRGF0YTtcclxuICAgIGZpbGVzPzogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGRhdGE6IEJ1ZmZlciB9PjtcclxuICAgIG1lc3NhZ2VfcmVmZXJlbmNlPzogeyBtZXNzYWdlX2lkOiBzdHJpbmcgfTtcclxuICAgIGludGVyYWN0aW9uSWQ/OiBzdHJpbmc7XHJcbiAgfSwgZGF0YT86IHtcclxuICAgIGNvbnRlbnQ/OiBzdHJpbmc7XHJcbiAgICBlbWJlZHM/OiBBUElFbWJlZFtdO1xyXG4gICAgY29tcG9uZW50cz86IGFueVtdO1xyXG4gICAgbWVudGlvbnM/OiBNZW50aW9uc0RhdGE7XHJcbiAgICBmaWxlcz86IEFycmF5PHsgbmFtZTogc3RyaW5nOyBkYXRhOiBCdWZmZXIgfT47XHJcbiAgICBtZXNzYWdlX3JlZmVyZW5jZT86IHsgbWVzc2FnZV9pZDogc3RyaW5nIH07XHJcbiAgICBpbnRlcmFjdGlvbklkPzogc3RyaW5nO1xyXG4gIH0pOiBQcm9taXNlPEFQSU1lc3NhZ2U+IHtcclxuICAgIC8vIMSwa2kga3VsbGFuxLFtIMWfZWtsaTpcclxuICAgIC8vIDEuIGNyZWF0ZU1lc3NhZ2UoZ3VpbGRJZCwgY2hhbm5lbElkLCBkYXRhKSAtIGd1aWxkSWQgaWxlICh0ZXJjaWggZWRpbGVuKVxyXG4gICAgLy8gMi4gY3JlYXRlTWVzc2FnZShjaGFubmVsSWQsIGRhdGEpIC0gZ3VpbGRJZCBvbG1hZGFuIChlc2tpIGZvcm1hdCwgaGF0YSB2ZXJpcilcclxuICAgIFxyXG4gICAgbGV0IGd1aWxkSWQ6IHN0cmluZztcclxuICAgIGxldCBjaGFubmVsSWQ6IHN0cmluZztcclxuICAgIGxldCBtZXNzYWdlRGF0YTogYW55O1xyXG4gICAgXHJcbiAgICBpZiAodHlwZW9mIGNoYW5uZWxJZE9yRGF0YSA9PT0gJ3N0cmluZycgJiYgZGF0YSkge1xyXG4gICAgICAvLyBZZW5pIGZvcm1hdDogY3JlYXRlTWVzc2FnZShndWlsZElkLCBjaGFubmVsSWQsIGRhdGEpXHJcbiAgICAgIGd1aWxkSWQgPSBndWlsZElkT3JDaGFubmVsSWQ7XHJcbiAgICAgIGNoYW5uZWxJZCA9IGNoYW5uZWxJZE9yRGF0YTtcclxuICAgICAgbWVzc2FnZURhdGEgPSB0aGlzLnByZXBhcmVNZXNzYWdlRGF0YShkYXRhKTtcclxuICAgICAgXHJcbiAgICAgIC8vIEFkZCBpbnRlcmFjdGlvbl9pZCBpZiBwcm92aWRlZFxyXG4gICAgICBpZiAoZGF0YS5pbnRlcmFjdGlvbklkKSB7XHJcbiAgICAgICAgbWVzc2FnZURhdGEuaW50ZXJhY3Rpb25faWQgPSBkYXRhLmludGVyYWN0aW9uSWQ7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNoYW5uZWxJZE9yRGF0YSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgLy8gRXNraSBmb3JtYXQ6IGNyZWF0ZU1lc3NhZ2UoY2hhbm5lbElkLCBkYXRhKSAtIGd1aWxkSWQgeW9rXHJcbiAgICAgIC8vIEJ1IGZvcm1hdCBhcnTEsWsgZGVzdGVrbGVubWl5b3IsIGhhdGEgZsSxcmxhdFxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyZWF0ZU1lc3NhZ2UgcmVxdWlyZXMgZ3VpbGRJZDogY3JlYXRlTWVzc2FnZShndWlsZElkLCBjaGFubmVsSWQsIGRhdGEpJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY3JlYXRlTWVzc2FnZSBhcmd1bWVudHMnKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxBUElNZXNzYWdlPignUE9TVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9tZXNzYWdlc2AsIG1lc3NhZ2VEYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBlcGhlbWVyYWwgbWVzc2FnZSB0aGF0IGlzIG9ubHkgdmlzaWJsZSB0byBhIHNwZWNpZmljIHVzZXJcclxuICAgKiBFcGhlbWVyYWwgbWVzc2FnZXMgYXJlIE5PVCBzYXZlZCB0byBkYXRhYmFzZSAtIHRoZXkgYXJlIG9ubHkgc2VudCB2aWEgV2ViU29ja2V0XHJcbiAgICogXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiAvLyBTZW5kIGEgd2FybmluZyBvbmx5IHZpc2libGUgdG8gdGhlIHVzZXJcclxuICAgKiBhd2FpdCByZXN0LmNyZWF0ZUVwaGVtZXJhbE1lc3NhZ2UoZ3VpbGRJZCwgY2hhbm5lbElkLCB0YXJnZXRVc2VySWQsIHtcclxuICAgKiAgIGVtYmVkczogW3dhcm5pbmdFbWJlZF1cclxuICAgKiB9KTtcclxuICAgKi9cclxuICBhc3luYyBjcmVhdGVFcGhlbWVyYWxNZXNzYWdlKGd1aWxkSWQ6IHN0cmluZywgY2hhbm5lbElkOiBzdHJpbmcsIHRhcmdldFVzZXJJZDogc3RyaW5nIHwgbnVtYmVyLCBkYXRhOiB7XHJcbiAgICBjb250ZW50Pzogc3RyaW5nO1xyXG4gICAgZW1iZWRzPzogQVBJRW1iZWRbXTtcclxuICAgIGNvbXBvbmVudHM/OiBhbnlbXTtcclxuICB9KTogUHJvbWlzZTx7IGlkOiBzdHJpbmc7IGVwaGVtZXJhbDogYm9vbGVhbjsgZmxhZ3M6IG51bWJlciB9PiB7XHJcbiAgICBjb25zdCBtZXNzYWdlRGF0YSA9IHRoaXMucHJlcGFyZU1lc3NhZ2VEYXRhKGRhdGEpO1xyXG4gICAgXHJcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PHsgaWQ6IHN0cmluZzsgZXBoZW1lcmFsOiBib29sZWFuOyBmbGFnczogbnVtYmVyIH0+KCdQT1NUJywgYC9ib3QvZ3VpbGRzLyR7Z3VpbGRJZH0vY2hhbm5lbHMvJHtjaGFubmVsSWR9L21lc3NhZ2VzYCwge1xyXG4gICAgICAuLi5tZXNzYWdlRGF0YSxcclxuICAgICAgZmxhZ3M6IDY0LCAvLyBFUEhFTUVSQUwgZmxhZ1xyXG4gICAgICB0YXJnZXRfdXNlcl9pZDogdHlwZW9mIHRhcmdldFVzZXJJZCA9PT0gJ3N0cmluZycgPyBwYXJzZUludCh0YXJnZXRVc2VySWQsIDEwKSA6IHRhcmdldFVzZXJJZFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBETSBtZXNzYWdlXHJcbiAgICovXHJcbiAgYXN5bmMgY3JlYXRlRE1NZXNzYWdlKGNoYW5uZWxJZDogc3RyaW5nLCBkYXRhOiB7XHJcbiAgICBjb250ZW50Pzogc3RyaW5nO1xyXG4gICAgZW1iZWRzPzogQVBJRW1iZWRbXTtcclxuICB9KTogUHJvbWlzZTxBUElNZXNzYWdlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PEFQSU1lc3NhZ2U+KCdQT1NUJywgYC9ib3QvZG0vJHtjaGFubmVsSWR9YCwgZGF0YSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFZGl0IGEgbWVzc2FnZVxyXG4gICAqIEF1dG9tYXRpY2FsbHkgcHJvY2Vzc2VzIG1lbnRpb25zXHJcbiAgICovXHJcbiAgYXN5bmMgZWRpdE1lc3NhZ2UoZ3VpbGRJZDogc3RyaW5nLCBjaGFubmVsSWQ6IHN0cmluZywgbWVzc2FnZUlkOiBzdHJpbmcsIGRhdGE6IHtcclxuICAgIGNvbnRlbnQ/OiBzdHJpbmc7XHJcbiAgICBlbWJlZHM/OiBBUElFbWJlZFtdO1xyXG4gICAgY29tcG9uZW50cz86IGFueVtdO1xyXG4gICAgbWVudGlvbnM/OiBNZW50aW9uc0RhdGE7XHJcbiAgfSk6IFByb21pc2U8QVBJTWVzc2FnZT4ge1xyXG4gICAgY29uc3QgcGF0aCA9IGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9tZXNzYWdlcy8ke21lc3NhZ2VJZH1gO1xyXG4gICAgY29uc3QgcHJvY2Vzc2VkRGF0YSA9IHRoaXMucHJlcGFyZU1lc3NhZ2VEYXRhKGRhdGEpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxBUElNZXNzYWdlPignUEFUQ0gnLCBwYXRoLCBwcm9jZXNzZWREYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZSBhIG1lc3NhZ2VcclxuICAgKi9cclxuICBhc3luYyBkZWxldGVNZXNzYWdlKGd1aWxkSWQ6IHN0cmluZywgY2hhbm5lbElkOiBzdHJpbmcsIG1lc3NhZ2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBwYXRoID0gYC9ib3QvZ3VpbGRzLyR7Z3VpbGRJZH0vY2hhbm5lbHMvJHtjaGFubmVsSWR9L21lc3NhZ2VzLyR7bWVzc2FnZUlkfWA7XHJcbiAgICBhd2FpdCB0aGlzLnJlcXVlc3Q8dm9pZD4oJ0RFTEVURScsIHBhdGgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmFsaWRhdGUgYW5kIG5vcm1hbGl6ZSBlbW9qaSBmb3JtYXQgZm9yIHRoZSBBUEkuXHJcbiAgICogQWNjZXB0ZWQgZm9ybWF0czogOm5hbWU6LCA8Om5hbWU6aWQ+LCA8YTpuYW1lOmlkPlxyXG4gICAqIFVuaWNvZGUgZW1vamkgY2hhcmFjdGVycyAo8J+RjSkgYXJlIE5PVCBzdXBwb3J0ZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB2YWxpZGF0ZUVtb2ppKGVtb2ppOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdHJpbW1lZCA9IGVtb2ppLnRyaW0oKTtcclxuICAgIC8vIEN1c3RvbSBlbW9qaTogPDpuYW1lOmlkPiBvciA8YTpuYW1lOmlkPlxyXG4gICAgaWYgKC9ePGE/Olxcdys6XFxkKz4kLy50ZXN0KHRyaW1tZWQpKSByZXR1cm4gdHJpbW1lZDtcclxuICAgIC8vIFVuaWNvZGUgZW1vamkgYnkgbmFtZTogOm5hbWU6XHJcbiAgICBpZiAoL146XFx3KzokLy50ZXN0KHRyaW1tZWQpKSByZXR1cm4gdHJpbW1lZDtcclxuICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgYEdlw6dlcnNpeiBlbW9qaSBmb3JtYXTEsTogXCIke2Vtb2ppfVwiLiBLYWJ1bCBlZGlsZW4gZm9ybWF0bGFyOiA6ZW1vamlfbmFtZTosIDw6bmFtZTppZD4sIDxhOm5hbWU6aWQ+YFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZCBhIHJlYWN0aW9uIHRvIGEgbWVzc2FnZVxyXG4gICAqIEBwYXJhbSBlbW9qaSAtIEVtb2ppIGluIDpuYW1lOiwgPDpuYW1lOmlkPiwgb3IgPGE6bmFtZTppZD4gZm9ybWF0LiBVbmljb2RlIGNoYXJhY3RlcnMgKPCfkY0pIGFyZSBub3Qgc3VwcG9ydGVkLlxyXG4gICAqL1xyXG4gIGFzeW5jIGFkZFJlYWN0aW9uKGd1aWxkSWQ6IHN0cmluZywgY2hhbm5lbElkOiBzdHJpbmcsIG1lc3NhZ2VJZDogc3RyaW5nLCBlbW9qaTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCB2YWxpZGF0ZWQgPSB0aGlzLnZhbGlkYXRlRW1vamkoZW1vamkpO1xyXG4gICAgY29uc3QgcGF0aCA9IGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9tZXNzYWdlcy8ke21lc3NhZ2VJZH0vcmVhY3Rpb25zLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHZhbGlkYXRlZCl9L0BtZWA7XHJcbiAgICBhd2FpdCB0aGlzLnJlcXVlc3Q8dm9pZD4oJ1BVVCcsIHBhdGgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIGEgcmVhY3Rpb24gZnJvbSBhIG1lc3NhZ2VcclxuICAgKiBAcGFyYW0gZW1vamkgLSBFbW9qaSBpbiA6bmFtZTosIDw6bmFtZTppZD4sIG9yIDxhOm5hbWU6aWQ+IGZvcm1hdC4gVW5pY29kZSBjaGFyYWN0ZXJzICjwn5GNKSBhcmUgbm90IHN1cHBvcnRlZC5cclxuICAgKi9cclxuICBhc3luYyByZW1vdmVSZWFjdGlvbihndWlsZElkOiBzdHJpbmcsIGNoYW5uZWxJZDogc3RyaW5nLCBtZXNzYWdlSWQ6IHN0cmluZywgZW1vamk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgdmFsaWRhdGVkID0gdGhpcy52YWxpZGF0ZUVtb2ppKGVtb2ppKTtcclxuICAgIGNvbnN0IHBhdGggPSBgL2JvdC9ndWlsZHMvJHtndWlsZElkfS9jaGFubmVscy8ke2NoYW5uZWxJZH0vbWVzc2FnZXMvJHttZXNzYWdlSWR9L3JlYWN0aW9ucy8ke2VuY29kZVVSSUNvbXBvbmVudCh2YWxpZGF0ZWQpfS9AbWVgO1xyXG4gICAgYXdhaXQgdGhpcy5yZXF1ZXN0PHZvaWQ+KCdERUxFVEUnLCBwYXRoKTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBVcGxvYWQgYW4gYXR0YWNobWVudCB0byBhIGNoYW5uZWxcclxuICAgKi9cclxuICBhc3luYyB1cGxvYWRBdHRhY2htZW50KGd1aWxkSWQ6IHN0cmluZywgY2hhbm5lbElkOiBzdHJpbmcsIGZpbGU6IHsgbmFtZTogc3RyaW5nOyBkYXRhOiBCdWZmZXI7IGNvbnRlbnRUeXBlPzogc3RyaW5nIH0pOiBQcm9taXNlPHsgaWQ6IHN0cmluZzsgdXJsOiBzdHJpbmc7IGZpbGVuYW1lOiBzdHJpbmcgfT4ge1xyXG4gICAgY29uc3QgRm9ybURhdGEgPSByZXF1aXJlKCdmb3JtLWRhdGEnKTtcclxuICAgIGNvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKTtcclxuICAgIFxyXG4gICAgLy8gZm9ybS1kYXRhIGV4cGVjdHMgdGhlIGJ1ZmZlciBkaXJlY3RseSB3aXRoIG9wdGlvbnNcclxuICAgIGZvcm0uYXBwZW5kKCdmaWxlJywgZmlsZS5kYXRhLCB7XHJcbiAgICAgIGZpbGVuYW1lOiBmaWxlLm5hbWUsXHJcbiAgICAgIGNvbnRlbnRUeXBlOiBmaWxlLmNvbnRlbnRUeXBlIHx8ICd0ZXh0L3BsYWluJ1xyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYmFzZVVybH0vYm90L2d1aWxkcy8ke2d1aWxkSWR9L2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9hdHRhY2htZW50c2A7XHJcbiAgICBcclxuICAgIGNvbnNvbGUubG9nKGBbUkVTVF0gVXBsb2FkaW5nIGF0dGFjaG1lbnQ6ICR7ZmlsZS5uYW1lfSAoJHtmaWxlLmRhdGEubGVuZ3RofSBieXRlcylgKTtcclxuICAgIFxyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcclxuICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCb3QgJHt0aGlzLnRva2VufWAsXHJcbiAgICAgICAgLi4uZm9ybS5nZXRIZWFkZXJzKClcclxuICAgICAgfSxcclxuICAgICAgYm9keTogZm9ybS5nZXRCdWZmZXIoKVxyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQVBJIEVycm9yICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtlcnJvcn1gKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKSBhcyBQcm9taXNlPHsgaWQ6IHN0cmluZzsgdXJsOiBzdHJpbmc7IGZpbGVuYW1lOiBzdHJpbmcgfT47XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBtZXNzYWdlIHdpdGggYSBmaWxlIGF0dGFjaG1lbnRcclxuICAgKi9cclxuICBhc3luYyBjcmVhdGVNZXNzYWdlV2l0aEZpbGUoZ3VpbGRJZDogc3RyaW5nLCBjaGFubmVsSWQ6IHN0cmluZywgZGF0YToge1xyXG4gICAgY29udGVudD86IHN0cmluZztcclxuICAgIGZpbGU6IHsgbmFtZTogc3RyaW5nOyBkYXRhOiBCdWZmZXI7IGNvbnRlbnRUeXBlPzogc3RyaW5nIH07XHJcbiAgICBpbnRlcmFjdGlvbklkPzogc3RyaW5nO1xyXG4gIH0pOiBQcm9taXNlPEFQSU1lc3NhZ2U+IHtcclxuICAgIGNvbnN0IEZvcm1EYXRhID0gcmVxdWlyZSgnZm9ybS1kYXRhJyk7XHJcbiAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgICBcclxuICAgIC8vIEFkZCBjb250ZW50IGlmIHByb3ZpZGVkXHJcbiAgICBpZiAoZGF0YS5jb250ZW50KSB7XHJcbiAgICAgIGZvcm0uYXBwZW5kKCdjb250ZW50JywgZGF0YS5jb250ZW50KTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gQWRkIGludGVyYWN0aW9uX2lkIGlmIHByb3ZpZGVkIChmb3IgZGVmZXJyZWQgcmVzcG9uc2UgbWF0Y2hpbmcpXHJcbiAgICBpZiAoZGF0YS5pbnRlcmFjdGlvbklkKSB7XHJcbiAgICAgIGZvcm0uYXBwZW5kKCdpbnRlcmFjdGlvbl9pZCcsIGRhdGEuaW50ZXJhY3Rpb25JZCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIEFkZCBmaWxlXHJcbiAgICBmb3JtLmFwcGVuZCgnZmlsZXMnLCBkYXRhLmZpbGUuZGF0YSwge1xyXG4gICAgICBmaWxlbmFtZTogZGF0YS5maWxlLm5hbWUsXHJcbiAgICAgIGNvbnRlbnRUeXBlOiBkYXRhLmZpbGUuY29udGVudFR5cGUgfHwgJ3RleHQvcGxhaW4nXHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5iYXNlVXJsfS9ib3QvZ3VpbGRzLyR7Z3VpbGRJZH0vY2hhbm5lbHMvJHtjaGFubmVsSWR9L21lc3NhZ2VzYDtcclxuICAgIFxyXG4gICAgY29uc29sZS5sb2coYFtSRVNUXSBDcmVhdGluZyBtZXNzYWdlIHdpdGggZmlsZTogJHtkYXRhLmZpbGUubmFtZX0gKCR7ZGF0YS5maWxlLmRhdGEubGVuZ3RofSBieXRlcykke2RhdGEuaW50ZXJhY3Rpb25JZCA/IGAgW2ludGVyYWN0aW9uOiAke2RhdGEuaW50ZXJhY3Rpb25JZH1dYCA6ICcnfWApO1xyXG4gICAgXHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xyXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICdBdXRob3JpemF0aW9uJzogYEJvdCAke3RoaXMudG9rZW59YCxcclxuICAgICAgICAuLi5mb3JtLmdldEhlYWRlcnMoKVxyXG4gICAgICB9LFxyXG4gICAgICBib2R5OiBmb3JtLmdldEJ1ZmZlcigpXHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xyXG4gICAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBUEkgRXJyb3IgJHtyZXNwb25zZS5zdGF0dXN9OiAke2Vycm9yfWApO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpIGFzIFByb21pc2U8QVBJTWVzc2FnZT47XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBJbnRlcmFjdGlvbnMgPT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIGludGVyYWN0aW9uIHJlc3BvbnNlXHJcbiAgICogQXV0b21hdGljYWxseSBwcm9jZXNzZXMgbWVudGlvbnMgaW4gY29udGVudCBhbmQgZW1iZWRzXHJcbiAgICovXHJcbiAgYXN5bmMgY3JlYXRlSW50ZXJhY3Rpb25SZXNwb25zZShpbnRlcmFjdGlvbklkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGRhdGE6IHtcclxuICAgIHR5cGU6IG51bWJlcjtcclxuICAgIGRhdGE/OiBhbnk7XHJcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc29sZS5sb2coYPCfk6QgSW50ZXJhY3Rpb24gcmVzcG9uc2U6ICR7aW50ZXJhY3Rpb25JZH0gLT4gdHlwZSAke2RhdGEudHlwZX1gKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIFByb2Nlc3MgbWVudGlvbnMgaW4gcmVzcG9uc2UgZGF0YSBpZiBwcmVzZW50XHJcbiAgICAgIGxldCBwcm9jZXNzZWREYXRhID0gZGF0YTtcclxuICAgICAgaWYgKGRhdGEuZGF0YSAmJiAoZGF0YS5kYXRhLmNvbnRlbnQgfHwgZGF0YS5kYXRhLmVtYmVkcykpIHtcclxuICAgICAgICBwcm9jZXNzZWREYXRhID0ge1xyXG4gICAgICAgICAgLi4uZGF0YSxcclxuICAgICAgICAgIGRhdGE6IHRoaXMucHJlcGFyZU1lc3NhZ2VEYXRhKGRhdGEuZGF0YSlcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICBhd2FpdCB0aGlzLnJlcXVlc3Q8dm9pZD4oJ1BPU1QnLCBgL2ludGVyYWN0aW9ucy8ke2ludGVyYWN0aW9uSWR9LyR7dG9rZW59L2NhbGxiYWNrYCwgcHJvY2Vzc2VkRGF0YSk7XHJcbiAgICAgIGNvbnNvbGUubG9nKGDinIUgSW50ZXJhY3Rpb24gcmVzcG9uc2Ugc2VudGApO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihg4p2MIEludGVyYWN0aW9uIHJlc3BvbnNlIGVycm9yOmAsIGVycm9yKTtcclxuICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFZGl0IHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbiByZXNwb25zZVxyXG4gICAqIElmIGZpbGVzIGFyZSBwcm92aWRlZCwgY3JlYXRlcyBhIG5ldyBtZXNzYWdlIHdpdGggZmlsZXMgKHNpbmNlIHdlYmhvb2sgZWRpdCBkb2Vzbid0IHN1cHBvcnQgZmlsZSB1cGxvYWQpXHJcbiAgICogQXV0b21hdGljYWxseSBwcm9jZXNzZXMgbWVudGlvbnNcclxuICAgKi9cclxuICBhc3luYyBlZGl0SW50ZXJhY3Rpb25SZXNwb25zZSh0b2tlbjogc3RyaW5nLCBkYXRhOiB7XHJcbiAgICBjb250ZW50Pzogc3RyaW5nO1xyXG4gICAgZW1iZWRzPzogQVBJRW1iZWRbXTtcclxuICAgIGNvbXBvbmVudHM/OiBhbnlbXTtcclxuICAgIG1lbnRpb25zPzogTWVudGlvbnNEYXRhO1xyXG4gICAgZmlsZXM/OiBBcnJheTx7IG5hbWU6IHN0cmluZzsgZGF0YTogQnVmZmVyOyBjb250ZW50VHlwZT86IHN0cmluZyB9PjtcclxuICB9LCBndWlsZElkPzogc3RyaW5nLCBjaGFubmVsSWQ/OiBzdHJpbmcsIGludGVyYWN0aW9uSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGFwcElkID0gdGhpcy5nZXRBcHBsaWNhdGlvbklkKCk7XHJcbiAgICBcclxuICAgIC8vIFByb2Nlc3MgbWVudGlvbnMgaW4gY29udGVudFxyXG4gICAgY29uc3QgcHJvY2Vzc2VkRGF0YSA9IHRoaXMucHJlcGFyZU1lc3NhZ2VEYXRhKGRhdGEpO1xyXG4gICAgXHJcbiAgICAvLyBJZiBmaWxlcyBhcmUgcHJlc2VudCBhbmQgd2UgaGF2ZSBndWlsZC9jaGFubmVsIGluZm8sIGNyZWF0ZSBtZXNzYWdlIHdpdGggZmlsZSBpbnN0ZWFkXHJcbiAgICBpZiAoZGF0YS5maWxlcyAmJiBkYXRhLmZpbGVzLmxlbmd0aCA+IDAgJiYgZ3VpbGRJZCAmJiBjaGFubmVsSWQpIHtcclxuICAgICAgY29uc29sZS5sb2coYFtSRVNUXSBlZGl0SW50ZXJhY3Rpb25SZXNwb25zZSB3aXRoICR7ZGF0YS5maWxlcy5sZW5ndGh9IGZpbGVzIC0gdXNpbmcgY3JlYXRlTWVzc2FnZVdpdGhGaWxlYCk7XHJcbiAgICAgIFxyXG4gICAgICAvLyBDcmVhdGUgbWVzc2FnZSB3aXRoIGZpbGVcclxuICAgICAgY29uc3QgZmlsZSA9IGRhdGEuZmlsZXNbMF07IC8vIEZvciBub3csIHN1cHBvcnQgc2luZ2xlIGZpbGVcclxuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVNZXNzYWdlV2l0aEZpbGUoZ3VpbGRJZCwgY2hhbm5lbElkLCB7XHJcbiAgICAgICAgY29udGVudDogcHJvY2Vzc2VkRGF0YS5jb250ZW50LFxyXG4gICAgICAgIGZpbGU6IGZpbGUsXHJcbiAgICAgICAgaW50ZXJhY3Rpb25JZDogaW50ZXJhY3Rpb25JZFxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBJZiB3ZSBoYXZlIGd1aWxkSWQsIGNoYW5uZWxJZCBhbmQgaW50ZXJhY3Rpb25JZCwgY3JlYXRlIGEgbmV3IG1lc3NhZ2Ugd2l0aCBpbnRlcmFjdGlvbl9pZFxyXG4gICAgLy8gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBvdXIgZGVmZXJyZWQgcmVzcG9uc2UgZG9lc24ndCBjcmVhdGUgYSBtZXNzYWdlXHJcbiAgICBpZiAoZ3VpbGRJZCAmJiBjaGFubmVsSWQgJiYgaW50ZXJhY3Rpb25JZCkge1xyXG4gICAgICBjb25zb2xlLmxvZyhgW1JFU1RdIGVkaXRJbnRlcmFjdGlvblJlc3BvbnNlIC0gY3JlYXRpbmcgbWVzc2FnZSB3aXRoIGludGVyYWN0aW9uX2lkOiAke2ludGVyYWN0aW9uSWR9YCk7XHJcbiAgICAgIFxyXG4gICAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7XHJcbiAgICAgICAgaW50ZXJhY3Rpb25faWQ6IGludGVyYWN0aW9uSWRcclxuICAgICAgfTtcclxuICAgICAgaWYgKHByb2Nlc3NlZERhdGEuY29udGVudCAhPT0gdW5kZWZpbmVkKSBwYXlsb2FkLmNvbnRlbnQgPSBwcm9jZXNzZWREYXRhLmNvbnRlbnQ7XHJcbiAgICAgIGlmIChwcm9jZXNzZWREYXRhLmVtYmVkcykgcGF5bG9hZC5lbWJlZHMgPSBwcm9jZXNzZWREYXRhLmVtYmVkcztcclxuICAgICAgaWYgKHByb2Nlc3NlZERhdGEuY29tcG9uZW50cykgcGF5bG9hZC5jb21wb25lbnRzID0gcHJvY2Vzc2VkRGF0YS5jb21wb25lbnRzO1xyXG4gICAgICBpZiAocHJvY2Vzc2VkRGF0YS5tZW50aW9ucykgcGF5bG9hZC5tZW50aW9ucyA9IHByb2Nlc3NlZERhdGEubWVudGlvbnM7XHJcbiAgICAgIFxyXG4gICAgICBhd2FpdCB0aGlzLnJlcXVlc3Q8dm9pZD4oJ1BPU1QnLCBgL2JvdC9ndWlsZHMvJHtndWlsZElkfS9jaGFubmVscy8ke2NoYW5uZWxJZH0vbWVzc2FnZXNgLCBwYXlsb2FkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBGYWxsYmFjazogUmVndWxhciBlZGl0IHdpdGhvdXQgZmlsZXMgKHdlYmhvb2sgUEFUQ0gpXHJcbiAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7fTtcclxuICAgIGlmIChwcm9jZXNzZWREYXRhLmNvbnRlbnQgIT09IHVuZGVmaW5lZCkgcGF5bG9hZC5jb250ZW50ID0gcHJvY2Vzc2VkRGF0YS5jb250ZW50O1xyXG4gICAgaWYgKHByb2Nlc3NlZERhdGEuZW1iZWRzKSBwYXlsb2FkLmVtYmVkcyA9IHByb2Nlc3NlZERhdGEuZW1iZWRzO1xyXG4gICAgaWYgKHByb2Nlc3NlZERhdGEuY29tcG9uZW50cykgcGF5bG9hZC5jb21wb25lbnRzID0gcHJvY2Vzc2VkRGF0YS5jb21wb25lbnRzO1xyXG4gICAgaWYgKHByb2Nlc3NlZERhdGEubWVudGlvbnMpIHBheWxvYWQubWVudGlvbnMgPSBwcm9jZXNzZWREYXRhLm1lbnRpb25zO1xyXG4gICAgXHJcbiAgICBhd2FpdCB0aGlzLnJlcXVlc3Q8dm9pZD4oJ1BBVENIJywgYC9pbnRlcmFjdGlvbnMvd2ViaG9va3MvJHthcHBJZH0vJHt0b2tlbn0vbWVzc2FnZXMvQG9yaWdpbmFsYCwgcGF5bG9hZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgdGhlIG9yaWdpbmFsIGludGVyYWN0aW9uIHJlc3BvbnNlXHJcbiAgICovXHJcbiAgYXN5bmMgZGVsZXRlSW50ZXJhY3Rpb25SZXNwb25zZSh0b2tlbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBhcHBJZCA9IHRoaXMuZ2V0QXBwbGljYXRpb25JZCgpO1xyXG4gICAgYXdhaXQgdGhpcy5yZXF1ZXN0PHZvaWQ+KCdERUxFVEUnLCBgL2ludGVyYWN0aW9ucy93ZWJob29rcy8ke2FwcElkfS8ke3Rva2VufS9tZXNzYWdlcy9Ab3JpZ2luYWxgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIGZvbGxvd3VwIG1lc3NhZ2VcclxuICAgKiBBdXRvbWF0aWNhbGx5IHByb2Nlc3NlcyBtZW50aW9uc1xyXG4gICAqL1xyXG4gIGFzeW5jIGNyZWF0ZUZvbGxvd3VwKHRva2VuOiBzdHJpbmcsIGRhdGE6IHtcclxuICAgIGNvbnRlbnQ/OiBzdHJpbmc7XHJcbiAgICBlbWJlZHM/OiBBUElFbWJlZFtdO1xyXG4gICAgbWVudGlvbnM/OiBNZW50aW9uc0RhdGE7XHJcbiAgICBmbGFncz86IG51bWJlcjtcclxuICB9KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBhcHBJZCA9IHRoaXMuZ2V0QXBwbGljYXRpb25JZCgpO1xyXG4gICAgY29uc3QgcHJvY2Vzc2VkRGF0YSA9IHRoaXMucHJlcGFyZU1lc3NhZ2VEYXRhKGRhdGEpO1xyXG4gICAgYXdhaXQgdGhpcy5yZXF1ZXN0PHZvaWQ+KCdQT1NUJywgYC9pbnRlcmFjdGlvbnMvd2ViaG9va3MvJHthcHBJZH0vJHt0b2tlbn1gLCBwcm9jZXNzZWREYXRhKTtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IENvbW1hbmRzID09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlZ2lzdGVyIGdsb2JhbCBhcHBsaWNhdGlvbiBjb21tYW5kc1xyXG4gICAqL1xyXG4gIGFzeW5jIHJlZ2lzdGVyR2xvYmFsQ29tbWFuZHMoY29tbWFuZHM6IEFQSUFwcGxpY2F0aW9uQ29tbWFuZFtdKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBhcHBJZCA9IHRoaXMuZ2V0QXBwbGljYXRpb25JZCgpO1xyXG4gICAgXHJcbiAgICBmb3IgKGNvbnN0IGNvbW1hbmQgb2YgY29tbWFuZHMpIHtcclxuICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0PHZvaWQ+KCdQT1NUJywgYC9hcHBsaWNhdGlvbnMvJHthcHBJZH0vY29tbWFuZHNgLCBjb21tYW5kKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlZ2lzdGVyIGd1aWxkLXNwZWNpZmljIGNvbW1hbmRzXHJcbiAgICovXHJcbiAgYXN5bmMgcmVnaXN0ZXJHdWlsZENvbW1hbmRzKGd1aWxkSWQ6IHN0cmluZywgY29tbWFuZHM6IEFQSUFwcGxpY2F0aW9uQ29tbWFuZFtdKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBhcHBJZCA9IHRoaXMuZ2V0QXBwbGljYXRpb25JZCgpO1xyXG4gICAgXHJcbiAgICBmb3IgKGNvbnN0IGNvbW1hbmQgb2YgY29tbWFuZHMpIHtcclxuICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0PHZvaWQ+KCdQT1NUJywgYC9hcHBsaWNhdGlvbnMvJHthcHBJZH0vZ3VpbGRzLyR7Z3VpbGRJZH0vY29tbWFuZHNgLCBjb21tYW5kKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZSBhIGdsb2JhbCBjb21tYW5kXHJcbiAgICovXHJcbiAgYXN5bmMgZGVsZXRlR2xvYmFsQ29tbWFuZChjb21tYW5kSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgYXBwSWQgPSB0aGlzLmdldEFwcGxpY2F0aW9uSWQoKTtcclxuICAgIGF3YWl0IHRoaXMucmVxdWVzdDx2b2lkPignREVMRVRFJywgYC9hcHBsaWNhdGlvbnMvJHthcHBJZH0vY29tbWFuZHMvJHtjb21tYW5kSWR9YCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgYSBndWlsZC1zcGVjaWZpYyBjb21tYW5kXHJcbiAgICovXHJcbiAgYXN5bmMgZGVsZXRlR3VpbGRDb21tYW5kKGd1aWxkSWQ6IHN0cmluZywgY29tbWFuZElkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGFwcElkID0gdGhpcy5nZXRBcHBsaWNhdGlvbklkKCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlcXVlc3Q8dm9pZD4oJ0RFTEVURScsIGAvYXBwbGljYXRpb25zLyR7YXBwSWR9L2d1aWxkcy8ke2d1aWxkSWR9L2NvbW1hbmRzLyR7Y29tbWFuZElkfWApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTGlzdCBhbGwgZ2xvYmFsIGNvbW1hbmRzIGZvciB0aGlzIGFwcGxpY2F0aW9uXHJcbiAgICovXHJcbiAgYXN5bmMgbGlzdEdsb2JhbENvbW1hbmRzKCk6IFByb21pc2U8QVBJQXBwbGljYXRpb25Db21tYW5kW10+IHtcclxuICAgIGNvbnN0IGFwcElkID0gdGhpcy5nZXRBcHBsaWNhdGlvbklkKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PEFQSUFwcGxpY2F0aW9uQ29tbWFuZFtdPignR0VUJywgYC9hcHBsaWNhdGlvbnMvJHthcHBJZH0vY29tbWFuZHNgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExpc3QgYWxsIGd1aWxkLXNwZWNpZmljIGNvbW1hbmRzIGZvciB0aGlzIGFwcGxpY2F0aW9uXHJcbiAgICovXHJcbiAgYXN5bmMgbGlzdEd1aWxkQ29tbWFuZHMoZ3VpbGRJZDogc3RyaW5nKTogUHJvbWlzZTxBUElBcHBsaWNhdGlvbkNvbW1hbmRbXT4ge1xyXG4gICAgY29uc3QgYXBwSWQgPSB0aGlzLmdldEFwcGxpY2F0aW9uSWQoKTtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8QVBJQXBwbGljYXRpb25Db21tYW5kW10+KCdHRVQnLCBgL2FwcGxpY2F0aW9ucy8ke2FwcElkfS9ndWlsZHMvJHtndWlsZElkfS9jb21tYW5kc2ApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGEgc3BlY2lmaWMgZ2xvYmFsIGNvbW1hbmRcclxuICAgKi9cclxuICBhc3luYyBnZXRHbG9iYWxDb21tYW5kKGNvbW1hbmRJZDogc3RyaW5nKTogUHJvbWlzZTxBUElBcHBsaWNhdGlvbkNvbW1hbmQ+IHtcclxuICAgIGNvbnN0IGFwcElkID0gdGhpcy5nZXRBcHBsaWNhdGlvbklkKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PEFQSUFwcGxpY2F0aW9uQ29tbWFuZD4oJ0dFVCcsIGAvYXBwbGljYXRpb25zLyR7YXBwSWR9L2NvbW1hbmRzLyR7Y29tbWFuZElkfWApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGEgc3BlY2lmaWMgZ3VpbGQgY29tbWFuZFxyXG4gICAqL1xyXG4gIGFzeW5jIGdldEd1aWxkQ29tbWFuZChndWlsZElkOiBzdHJpbmcsIGNvbW1hbmRJZDogc3RyaW5nKTogUHJvbWlzZTxBUElBcHBsaWNhdGlvbkNvbW1hbmQ+IHtcclxuICAgIGNvbnN0IGFwcElkID0gdGhpcy5nZXRBcHBsaWNhdGlvbklkKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PEFQSUFwcGxpY2F0aW9uQ29tbWFuZD4oJ0dFVCcsIGAvYXBwbGljYXRpb25zLyR7YXBwSWR9L2d1aWxkcy8ke2d1aWxkSWR9L2NvbW1hbmRzLyR7Y29tbWFuZElkfWApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIGEgZ2xvYmFsIGNvbW1hbmRcclxuICAgKi9cclxuICBhc3luYyB1cGRhdGVHbG9iYWxDb21tYW5kKGNvbW1hbmRJZDogc3RyaW5nLCBkYXRhOiBQYXJ0aWFsPEFQSUFwcGxpY2F0aW9uQ29tbWFuZD4pOiBQcm9taXNlPEFQSUFwcGxpY2F0aW9uQ29tbWFuZD4ge1xyXG4gICAgY29uc3QgYXBwSWQgPSB0aGlzLmdldEFwcGxpY2F0aW9uSWQoKTtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8QVBJQXBwbGljYXRpb25Db21tYW5kPignUEFUQ0gnLCBgL2FwcGxpY2F0aW9ucy8ke2FwcElkfS9jb21tYW5kcy8ke2NvbW1hbmRJZH1gLCBkYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBhIGd1aWxkLXNwZWNpZmljIGNvbW1hbmRcclxuICAgKi9cclxuICBhc3luYyB1cGRhdGVHdWlsZENvbW1hbmQoZ3VpbGRJZDogc3RyaW5nLCBjb21tYW5kSWQ6IHN0cmluZywgZGF0YTogUGFydGlhbDxBUElBcHBsaWNhdGlvbkNvbW1hbmQ+KTogUHJvbWlzZTxBUElBcHBsaWNhdGlvbkNvbW1hbmQ+IHtcclxuICAgIGNvbnN0IGFwcElkID0gdGhpcy5nZXRBcHBsaWNhdGlvbklkKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PEFQSUFwcGxpY2F0aW9uQ29tbWFuZD4oJ1BBVENIJywgYC9hcHBsaWNhdGlvbnMvJHthcHBJZH0vZ3VpbGRzLyR7Z3VpbGRJZH0vY29tbWFuZHMvJHtjb21tYW5kSWR9YCwgZGF0YSk7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBIZWxwZXJzID09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIHByaXZhdGUgYXBwbGljYXRpb25JZDogc3RyaW5nID0gJyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgYXBwbGljYXRpb24gSURcclxuICAgKi9cclxuICBzZXRBcHBsaWNhdGlvbklkKGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuYXBwbGljYXRpb25JZCA9IGlkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBhcHBsaWNhdGlvbiBJRFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0QXBwbGljYXRpb25JZCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmFwcGxpY2F0aW9uSWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcHBsaWNhdGlvbiBJRCBub3Qgc2V0LiBDYWxsIHNldEFwcGxpY2F0aW9uSWQoKSBmaXJzdC4nKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmFwcGxpY2F0aW9uSWQ7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBDaGFubmVscyA9PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBjaGFubmVsIGluIGEgZ3VpbGRcclxuICAgKi9cclxuICBhc3luYyBjcmVhdGVDaGFubmVsKGd1aWxkSWQ6IHN0cmluZywgZGF0YToge1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgdHlwZT86IG51bWJlcjtcclxuICAgIHBhcmVudF9pZD86IHN0cmluZyB8IG51bGw7XHJcbiAgICBjYXRlZ29yeV9pZD86IHN0cmluZyB8IG51bGw7XHJcbiAgICBwZXJtaXNzaW9uX292ZXJ3cml0ZXM/OiBBcnJheTx7XHJcbiAgICAgIGlkOiBzdHJpbmc7XHJcbiAgICAgIHR5cGU6IG51bWJlcjtcclxuICAgICAgYWxsb3c/OiBzdHJpbmc7XHJcbiAgICAgIGRlbnk/OiBzdHJpbmc7XHJcbiAgICB9PjtcclxuICB9KTogUHJvbWlzZTx7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9PiB7XHJcbiAgICAvLyBNYXAgcGFyZW50X2lkIHRvIGNhdGVnb3J5X2lkIGZvciBiYWNrZW5kIGNvbXBhdGliaWxpdHlcclxuICAgIGNvbnN0IHJlcXVlc3REYXRhOiBhbnkgPSB7XHJcbiAgICAgIG5hbWU6IGRhdGEubmFtZSxcclxuICAgICAgdHlwZTogZGF0YS50eXBlID8/IDAsIC8vIERlZmF1bHQgdG8gdGV4dCBjaGFubmVsXHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICAvLyBCYWNrZW5kIGV4cGVjdHMgY2F0ZWdvcnlfaWQsIG5vdCBwYXJlbnRfaWRcclxuICAgIGlmIChkYXRhLmNhdGVnb3J5X2lkKSB7XHJcbiAgICAgIHJlcXVlc3REYXRhLmNhdGVnb3J5X2lkID0gZGF0YS5jYXRlZ29yeV9pZDtcclxuICAgIH0gZWxzZSBpZiAoZGF0YS5wYXJlbnRfaWQpIHtcclxuICAgICAgcmVxdWVzdERhdGEuY2F0ZWdvcnlfaWQgPSBkYXRhLnBhcmVudF9pZDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gQWRkIHBlcm1pc3Npb25fb3ZlcndyaXRlcyBpZiBwcm92aWRlZFxyXG4gICAgaWYgKGRhdGEucGVybWlzc2lvbl9vdmVyd3JpdGVzICYmIGRhdGEucGVybWlzc2lvbl9vdmVyd3JpdGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmVxdWVzdERhdGEucGVybWlzc2lvbl9vdmVyd3JpdGVzID0gZGF0YS5wZXJtaXNzaW9uX292ZXJ3cml0ZXM7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ1BPU1QnLCBgL2JvdC9ndWlsZHMvJHtndWlsZElkfS9jaGFubmVsc2AsIHJlcXVlc3REYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZSBhIGNoYW5uZWxcclxuICAgKi9cclxuICAvKipcclxuICAgKiBEZWxldGUgYSBjaGFubmVsXHJcbiAgICovXHJcbiAgYXN5bmMgZGVsZXRlQ2hhbm5lbChndWlsZElkOiBzdHJpbmcsIGNoYW5uZWxJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLnJlcXVlc3QoJ0RFTEVURScsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2NoYW5uZWxzLyR7Y2hhbm5lbElkfWApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlIGEgY2F0ZWdvcnlcclxuICAgKi9cclxuICBhc3luYyBkZWxldGVDYXRlZ29yeShndWlsZElkOiBzdHJpbmcsIGNhdGVnb3J5SWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5yZXF1ZXN0KCdERUxFVEUnLCBgL2JvdC9ndWlsZHMvJHtndWlsZElkfS9jYXRlZ29yaWVzLyR7Y2F0ZWdvcnlJZH1gKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVkaXQgY2hhbm5lbCBwZXJtaXNzaW9uIG92ZXJ3cml0ZXNcclxuICAgKi9cclxuICBhc3luYyBlZGl0Q2hhbm5lbFBlcm1pc3Npb25zKGNoYW5uZWxJZDogc3RyaW5nLCBvdmVyd3JpdGVJZDogc3RyaW5nLCBkYXRhOiB7XHJcbiAgICB0eXBlOiBudW1iZXI7XHJcbiAgICBhbGxvdz86IHN0cmluZztcclxuICAgIGRlbnk/OiBzdHJpbmc7XHJcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5yZXF1ZXN0KCdQVVQnLCBgL2JvdC9jaGFubmVscy8ke2NoYW5uZWxJZH0vcGVybWlzc2lvbnMvJHtvdmVyd3JpdGVJZH1gLCBkYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZSBjaGFubmVsIHBlcm1pc3Npb24gb3ZlcndyaXRlXHJcbiAgICovXHJcbiAgYXN5bmMgZGVsZXRlQ2hhbm5lbFBlcm1pc3Npb24oY2hhbm5lbElkOiBzdHJpbmcsIG92ZXJ3cml0ZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMucmVxdWVzdCgnREVMRVRFJywgYC9ib3QvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3Blcm1pc3Npb25zLyR7b3ZlcndyaXRlSWR9YCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgbWVzc2FnZXMgZnJvbSBhIGNoYW5uZWxcclxuICAgKi9cclxuICBhc3luYyBnZXRNZXNzYWdlcyhndWlsZElkOiBzdHJpbmcsIGNoYW5uZWxJZDogc3RyaW5nLCBvcHRpb25zPzoge1xyXG4gICAgbGltaXQ/OiBudW1iZXI7XHJcbiAgICBiZWZvcmU/OiBzdHJpbmc7XHJcbiAgICBhZnRlcj86IHN0cmluZztcclxuICB9KTogUHJvbWlzZTxBUElNZXNzYWdlW10+IHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcclxuICAgIGlmIChvcHRpb25zPy5saW1pdCkgcGFyYW1zLmFwcGVuZCgnbGltaXQnLCBTdHJpbmcob3B0aW9ucy5saW1pdCkpO1xyXG4gICAgaWYgKG9wdGlvbnM/LmJlZm9yZSkgcGFyYW1zLmFwcGVuZCgnYmVmb3JlJywgb3B0aW9ucy5iZWZvcmUpO1xyXG4gICAgaWYgKG9wdGlvbnM/LmFmdGVyKSBwYXJhbXMuYXBwZW5kKCdhZnRlcicsIG9wdGlvbnMuYWZ0ZXIpO1xyXG4gICAgXHJcbiAgICBjb25zdCBxdWVyeSA9IHBhcmFtcy50b1N0cmluZygpID8gYD8ke3BhcmFtcy50b1N0cmluZygpfWAgOiAnJztcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0PHsgbWVzc2FnZXM6IEFQSU1lc3NhZ2VbXTsgcGFnZV9pbmZvOiBhbnkgfT4oJ0dFVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9tZXNzYWdlcyR7cXVlcnl9YCk7XHJcbiAgICByZXR1cm4gcmVzcG9uc2UubWVzc2FnZXMgfHwgW107XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBNZW1iZXJzID09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhIGd1aWxkIG1lbWJlclxyXG4gICAqL1xyXG4gIGFzeW5jIGdldE1lbWJlcihndWlsZElkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0dFVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L21lbWJlcnMvJHt1c2VySWR9YCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaW1lb3V0IGEgZ3VpbGQgbWVtYmVyXHJcbiAgICovXHJcbiAgYXN5bmMgdGltZW91dE1lbWJlcihndWlsZElkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nLCBkdXJhdGlvbjogbnVtYmVyIHwgbnVsbCwgcmVhc29uPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoZHVyYXRpb24gPT09IG51bGwpIHtcclxuICAgICAgLy8gQ2xlYXIgdGltZW91dFxyXG4gICAgICBhd2FpdCB0aGlzLnJlcXVlc3QoJ1BPU1QnLCBgL2JvdC9ndWlsZHMvJHtndWlsZElkfS9tZW1iZXJzLyR7dXNlcklkfS90aW1lb3V0L2NsZWFyYCwge1xyXG4gICAgICAgIHJlYXNvblxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIFNldCB0aW1lb3V0XHJcbiAgICAgIGNvbnN0IHVudGlsID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIGR1cmF0aW9uKS50b0lTT1N0cmluZygpO1xyXG4gICAgICBhd2FpdCB0aGlzLnJlcXVlc3QoJ1BPU1QnLCBgL2JvdC9ndWlsZHMvJHtndWlsZElkfS9tZW1iZXJzLyR7dXNlcklkfS90aW1lb3V0YCwge1xyXG4gICAgICAgIHVudGlsLFxyXG4gICAgICAgIHJlYXNvblxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEtpY2sgYSBndWlsZCBtZW1iZXJcclxuICAgKi9cclxuICBhc3luYyBraWNrTWVtYmVyKGd1aWxkSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgcXVlcnkgPSByZWFzb24gPyBgP3JlYXNvbj0ke2VuY29kZVVSSUNvbXBvbmVudChyZWFzb24pfWAgOiAnJztcclxuICAgIGF3YWl0IHRoaXMucmVxdWVzdCgnREVMRVRFJywgYC9ib3QvZ3VpbGRzLyR7Z3VpbGRJZH0vbWVtYmVycy8ke3VzZXJJZH0ke3F1ZXJ5fWApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQmFuIGEgZ3VpbGQgbWVtYmVyXHJcbiAgICovXHJcbiAgYXN5bmMgYmFuTWVtYmVyKGd1aWxkSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcsIG9wdGlvbnM/OiB7XHJcbiAgICBkZWxldGVNZXNzYWdlRGF5cz86IG51bWJlcjtcclxuICAgIGRlbGV0ZU1lc3NhZ2VTZWNvbmRzPzogbnVtYmVyO1xyXG4gICAgcmVhc29uPzogc3RyaW5nO1xyXG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMucmVxdWVzdCgnUFVUJywgYC9ib3QvZ3VpbGRzLyR7Z3VpbGRJZH0vYmFucy8ke3VzZXJJZH1gLCB7XHJcbiAgICAgIGRlbGV0ZV9tZXNzYWdlX2RheXM6IG9wdGlvbnM/LmRlbGV0ZU1lc3NhZ2VEYXlzLFxyXG4gICAgICBkZWxldGVfbWVzc2FnZV9zZWNvbmRzOiBvcHRpb25zPy5kZWxldGVNZXNzYWdlU2Vjb25kcyxcclxuICAgICAgcmVhc29uOiBvcHRpb25zPy5yZWFzb25cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVW5iYW4gYSB1c2VyXHJcbiAgICovXHJcbiAgYXN5bmMgdW5iYW5NZW1iZXIoZ3VpbGRJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZywgcmVhc29uPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBxdWVyeSA9IHJlYXNvbiA/IGA/cmVhc29uPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHJlYXNvbil9YCA6ICcnO1xyXG4gICAgYXdhaXQgdGhpcy5yZXF1ZXN0KCdERUxFVEUnLCBgL2JvdC9ndWlsZHMvJHtndWlsZElkfS9iYW5zLyR7dXNlcklkfSR7cXVlcnl9YCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFZGl0IGEgZ3VpbGQgbWVtYmVyXHJcbiAgICovXHJcbiAgYXN5bmMgZWRpdE1lbWJlcihndWlsZElkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nLCBkYXRhOiB7XHJcbiAgICBuaWNrPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIHJvbGVzPzogc3RyaW5nW107XHJcbiAgICBtdXRlPzogYm9vbGVhbjtcclxuICAgIGRlYWY/OiBib29sZWFuO1xyXG4gICAgY2hhbm5lbF9pZD86IHN0cmluZyB8IG51bGw7XHJcbiAgICBjb21tdW5pY2F0aW9uX2Rpc2FibGVkX3VudGlsPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIHJlYXNvbj86IHN0cmluZztcclxuICB9KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ1BBVENIJywgYC9ib3QvZ3VpbGRzLyR7Z3VpbGRJZH0vbWVtYmVycy8ke3VzZXJJZH1gLCBkYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZCBhIHJvbGUgdG8gYSBtZW1iZXJcclxuICAgKi9cclxuICBhc3luYyBhZGRNZW1iZXJSb2xlKGd1aWxkSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcsIHJvbGVJZDogc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHF1ZXJ5ID0gcmVhc29uID8gYD9yZWFzb249JHtlbmNvZGVVUklDb21wb25lbnQocmVhc29uKX1gIDogJyc7XHJcbiAgICBhd2FpdCB0aGlzLnJlcXVlc3QoJ1BVVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L21lbWJlcnMvJHt1c2VySWR9L3JvbGVzLyR7cm9sZUlkfSR7cXVlcnl9YCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgYSByb2xlIGZyb20gYSBtZW1iZXJcclxuICAgKi9cclxuICBhc3luYyByZW1vdmVNZW1iZXJSb2xlKGd1aWxkSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcsIHJvbGVJZDogc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHF1ZXJ5ID0gcmVhc29uID8gYD9yZWFzb249JHtlbmNvZGVVUklDb21wb25lbnQocmVhc29uKX1gIDogJyc7XHJcbiAgICBhd2FpdCB0aGlzLnJlcXVlc3QoJ0RFTEVURScsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L21lbWJlcnMvJHt1c2VySWR9L3JvbGVzLyR7cm9sZUlkfSR7cXVlcnl9YCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCdWxrIGFzc2lnbiByb2xlcyB0byBtZW1iZXJzXHJcbiAgICovXHJcbiAgYXN5bmMgYnVsa0Fzc2lnblJvbGVzKGd1aWxkSWQ6IHN0cmluZywgYXNzaWdubWVudHM6IHsgdXNlcl9pZDogc3RyaW5nOyByb2xlX2lkczogc3RyaW5nW10gfVtdKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ1BVVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L21lbWJlcnMvcm9sZXMvYXNzaWduYCwgeyBhc3NpZ25tZW50cyB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1bGsgcmVtb3ZlIHJvbGVzIGZyb20gbWVtYmVyc1xyXG4gICAqL1xyXG4gIGFzeW5jIGJ1bGtSZW1vdmVSb2xlcyhndWlsZElkOiBzdHJpbmcsIHJlbW92YWxzOiB7IHVzZXJfaWQ6IHN0cmluZzsgcm9sZV9pZHM6IHN0cmluZ1tdIH1bXSk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdERUxFVEUnLCBgL2JvdC9ndWlsZHMvJHtndWlsZElkfS9tZW1iZXJzL3JvbGVzL3JlbW92ZWAsIHsgcmVtb3ZhbHMgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCdWxrIGRlbGV0ZSBtZXNzYWdlc1xyXG4gICAqL1xyXG4gIGFzeW5jIGJ1bGtEZWxldGVNZXNzYWdlcyhndWlsZElkOiBzdHJpbmcsIGNoYW5uZWxJZDogc3RyaW5nLCBtZXNzYWdlSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5yZXF1ZXN0KCdQT1NUJywgYC9ib3QvZ3VpbGRzLyR7Z3VpbGRJZH0vY2hhbm5lbHMvJHtjaGFubmVsSWR9L21lc3NhZ2VzL2J1bGstZGVsZXRlYCwge1xyXG4gICAgICBtZXNzYWdlczogbWVzc2FnZUlkc1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBHdWlsZHMgPT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGEgZ3VpbGRcclxuICAgKi9cclxuICBhc3luYyBnZXRHdWlsZChndWlsZElkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnR0VUJywgYC9ib3QvZ3VpbGRzLyR7Z3VpbGRJZH1gKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBndWlsZCBjaGFubmVsc1xyXG4gICAqL1xyXG4gIGFzeW5jIGdldEd1aWxkQ2hhbm5lbHMoZ3VpbGRJZDogc3RyaW5nKTogUHJvbWlzZTxhbnlbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnR0VUJywgYC9ib3QvZ3VpbGRzLyR7Z3VpbGRJZH0vY2hhbm5lbHNgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBndWlsZCByb2xlc1xyXG4gICAqL1xyXG4gIGFzeW5jIGdldFJvbGVzKGd1aWxkSWQ6IHN0cmluZyk6IFByb21pc2U8YW55W10+IHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0dFVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L3JvbGVzYCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSByb2xlXHJcbiAgICovXHJcbiAgYXN5bmMgY3JlYXRlUm9sZShndWlsZElkOiBzdHJpbmcsIGRhdGE6IHtcclxuICAgIG5hbWU/OiBzdHJpbmc7XHJcbiAgICBjb2xvcj86IG51bWJlcjtcclxuICAgIGhvaXN0PzogYm9vbGVhbjtcclxuICAgIG1lbnRpb25hYmxlPzogYm9vbGVhbjtcclxuICAgIHBlcm1pc3Npb25zPzogc3RyaW5nO1xyXG4gIH0pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnUE9TVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L3JvbGVzYCwgZGF0YSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFZGl0IGEgcm9sZVxyXG4gICAqL1xyXG4gIGFzeW5jIGVkaXRSb2xlKGd1aWxkSWQ6IHN0cmluZywgcm9sZUlkOiBzdHJpbmcsIGRhdGE6IHtcclxuICAgIG5hbWU/OiBzdHJpbmc7XHJcbiAgICBjb2xvcj86IG51bWJlcjtcclxuICAgIGhvaXN0PzogYm9vbGVhbjtcclxuICAgIG1lbnRpb25hYmxlPzogYm9vbGVhbjtcclxuICAgIHBlcm1pc3Npb25zPzogc3RyaW5nO1xyXG4gIH0pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnUEFUQ0gnLCBgL2JvdC9ndWlsZHMvJHtndWlsZElkfS9yb2xlcy8ke3JvbGVJZH1gLCBkYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZSBhIHJvbGVcclxuICAgKi9cclxuICBhc3luYyBkZWxldGVSb2xlKGd1aWxkSWQ6IHN0cmluZywgcm9sZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMucmVxdWVzdCgnREVMRVRFJywgYC9ib3QvZ3VpbGRzLyR7Z3VpbGRJZH0vcm9sZXMvJHtyb2xlSWR9YCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgZ3VpbGQgZW1vamlzXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0RW1vamlzKGd1aWxkSWQ6IHN0cmluZyk6IFByb21pc2U8YW55W10+IHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0dFVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2Vtb2ppc2ApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGd1aWxkIGJhbnNcclxuICAgKi9cclxuICBhc3luYyBnZXRCYW5zKGd1aWxkSWQ6IHN0cmluZyk6IFByb21pc2U8YW55W10+IHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0dFVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2JhbnNgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhIHNwZWNpZmljIGJhblxyXG4gICAqL1xyXG4gIGFzeW5jIGdldEJhbihndWlsZElkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0dFVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2JhbnMvJHt1c2VySWR9YCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgZ3VpbGQgaW52aXRlc1xyXG4gICAqL1xyXG4gIGFzeW5jIGdldEd1aWxkSW52aXRlcyhndWlsZElkOiBzdHJpbmcpOiBQcm9taXNlPGFueVtdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdHRVQnLCBgL2JvdC9ndWlsZHMvJHtndWlsZElkfS9pbnZpdGVzYCk7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBQaW5zID09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIC8qKlxyXG4gICAqIFBpbiBhIG1lc3NhZ2VcclxuICAgKi9cclxuICBhc3luYyBwaW5NZXNzYWdlKGd1aWxkSWQ6IHN0cmluZywgY2hhbm5lbElkOiBzdHJpbmcsIG1lc3NhZ2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLnJlcXVlc3QoJ1BVVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9waW5zLyR7bWVzc2FnZUlkfWApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVW5waW4gYSBtZXNzYWdlXHJcbiAgICovXHJcbiAgYXN5bmMgdW5waW5NZXNzYWdlKGd1aWxkSWQ6IHN0cmluZywgY2hhbm5lbElkOiBzdHJpbmcsIG1lc3NhZ2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLnJlcXVlc3QoJ0RFTEVURScsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9waW5zLyR7bWVzc2FnZUlkfWApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHBpbm5lZCBtZXNzYWdlc1xyXG4gICAqL1xyXG4gIGFzeW5jIGdldFBpbm5lZE1lc3NhZ2VzKGd1aWxkSWQ6IHN0cmluZywgY2hhbm5lbElkOiBzdHJpbmcpOiBQcm9taXNlPEFQSU1lc3NhZ2VbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnR0VUJywgYC9ib3QvZ3VpbGRzLyR7Z3VpbGRJZH0vY2hhbm5lbHMvJHtjaGFubmVsSWR9L3BpbnNgKTtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFVzZXJzID09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhIHVzZXJcclxuICAgKi9cclxuICBhc3luYyBnZXRVc2VyKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0dFVCcsIGAvYm90L3VzZXJzLyR7dXNlcklkfWApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGN1cnJlbnQgYm90IHVzZXJcclxuICAgKi9cclxuICBhc3luYyBnZXRDdXJyZW50VXNlcigpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnR0VUJywgYC9ib3QvdXNlcnMvQG1lYCk7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBJbnZpdGVzID09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBpbnZpdGVcclxuICAgKi9cclxuICBhc3luYyBjcmVhdGVJbnZpdGUoZ3VpbGRJZDogc3RyaW5nLCBjaGFubmVsSWQ6IHN0cmluZywgZGF0YT86IHtcclxuICAgIG1heF9hZ2U/OiBudW1iZXI7XHJcbiAgICBtYXhfdXNlcz86IG51bWJlcjtcclxuICAgIHRlbXBvcmFyeT86IGJvb2xlYW47XHJcbiAgICB1bmlxdWU/OiBib29sZWFuO1xyXG4gIH0pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnUE9TVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9pbnZpdGVzYCwgZGF0YSB8fCB7fSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgYW4gaW52aXRlXHJcbiAgICovXHJcbiAgYXN5bmMgZGVsZXRlSW52aXRlKGludml0ZUNvZGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5yZXF1ZXN0KCdERUxFVEUnLCBgL2JvdC9pbnZpdGVzLyR7aW52aXRlQ29kZX1gKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbiBpbnZpdGVcclxuICAgKi9cclxuICBhc3luYyBnZXRJbnZpdGUoaW52aXRlQ29kZTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0dFVCcsIGAvYm90L2ludml0ZXMvJHtpbnZpdGVDb2RlfWApO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gV2ViaG9va3MgPT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGNoYW5uZWwgd2ViaG9va3NcclxuICAgKi9cclxuICBhc3luYyBnZXRDaGFubmVsV2ViaG9va3MoZ3VpbGRJZDogc3RyaW5nLCBjaGFubmVsSWQ6IHN0cmluZyk6IFByb21pc2U8YW55W10+IHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0dFVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2NoYW5uZWxzLyR7Y2hhbm5lbElkfS93ZWJob29rc2ApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGd1aWxkIHdlYmhvb2tzXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0R3VpbGRXZWJob29rcyhndWlsZElkOiBzdHJpbmcpOiBQcm9taXNlPGFueVtdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdHRVQnLCBgL2JvdC9ndWlsZHMvJHtndWlsZElkfS93ZWJob29rc2ApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgd2ViaG9va1xyXG4gICAqL1xyXG4gIGFzeW5jIGNyZWF0ZVdlYmhvb2soZ3VpbGRJZDogc3RyaW5nLCBjaGFubmVsSWQ6IHN0cmluZywgZGF0YToge1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgYXZhdGFyPzogc3RyaW5nO1xyXG4gIH0pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnUE9TVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2NoYW5uZWxzLyR7Y2hhbm5lbElkfS93ZWJob29rc2AsIGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIGEgd2ViaG9va1xyXG4gICAqL1xyXG4gIGFzeW5jIHVwZGF0ZVdlYmhvb2soZ3VpbGRJZDogc3RyaW5nLCB3ZWJob29rSWQ6IHN0cmluZywgZGF0YToge1xyXG4gICAgbmFtZT86IHN0cmluZztcclxuICAgIGF2YXRhcl91cmw/OiBzdHJpbmc7XHJcbiAgfSk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdQQVRDSCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L3dlYmhvb2tzLyR7d2ViaG9va0lkfWAsIGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlIGEgd2ViaG9va1xyXG4gICAqL1xyXG4gIGFzeW5jIGRlbGV0ZVdlYmhvb2soZ3VpbGRJZDogc3RyaW5nLCB3ZWJob29rSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnREVMRVRFJywgYC9ib3QvZ3VpbGRzLyR7Z3VpbGRJZH0vd2ViaG9va3MvJHt3ZWJob29rSWR9YCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==