@chinchillaenterprises/mcp-slack 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,2317 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { ListToolsRequestSchema, CallToolRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
5
+ import { WebClient } from "@slack/web-api";
6
+ import { z } from "zod";
7
+ // =====================================================================================
8
+ // CREDENTIAL MANAGER CLASS
9
+ // =====================================================================================
10
+ class CredentialManager {
11
+ SERVICE_NAME = 'mcp-slacker-v3';
12
+ keytar = null;
13
+ isKeytarAvailable = false;
14
+ initPromise;
15
+ constructor() {
16
+ this.initPromise = this.initKeytar();
17
+ }
18
+ async initKeytar() {
19
+ try {
20
+ this.keytar = await import('keytar');
21
+ this.isKeytarAvailable = true;
22
+ }
23
+ catch (error) {
24
+ console.warn('Keytar module not available - credential persistence disabled');
25
+ this.isKeytarAvailable = false;
26
+ }
27
+ }
28
+ async ensureInitialized() {
29
+ await this.initPromise;
30
+ }
31
+ async saveAccount(account) {
32
+ await this.ensureInitialized();
33
+ if (!this.isKeytarAvailable || !this.keytar) {
34
+ console.warn('Credential storage unavailable - account will not persist');
35
+ return;
36
+ }
37
+ const persistedAccount = {
38
+ ...account,
39
+ addedAt: new Date().toISOString(),
40
+ lastUsed: new Date().toISOString()
41
+ };
42
+ try {
43
+ await this.keytar.setPassword(this.SERVICE_NAME, `slack-${account.id}`, JSON.stringify(persistedAccount));
44
+ }
45
+ catch (error) {
46
+ console.error('Failed to save account to keychain:', error);
47
+ }
48
+ }
49
+ async updateAccount(account) {
50
+ await this.ensureInitialized();
51
+ if (!this.isKeytarAvailable || !this.keytar) {
52
+ console.warn('Credential storage unavailable - account update will not persist');
53
+ return;
54
+ }
55
+ // Get existing to preserve addedAt
56
+ const existing = await this.getAccount(account.id);
57
+ const persistedAccount = {
58
+ ...account,
59
+ addedAt: existing?.addedAt || new Date().toISOString(),
60
+ lastUsed: new Date().toISOString()
61
+ };
62
+ try {
63
+ await this.keytar.setPassword(this.SERVICE_NAME, `slack-${account.id}`, JSON.stringify(persistedAccount));
64
+ }
65
+ catch (error) {
66
+ console.error('Failed to update account in keychain:', error);
67
+ }
68
+ }
69
+ async loadAllAccounts() {
70
+ await this.ensureInitialized();
71
+ if (!this.isKeytarAvailable || !this.keytar) {
72
+ return [];
73
+ }
74
+ try {
75
+ const credentials = await this.keytar.findCredentials(this.SERVICE_NAME);
76
+ const accounts = [];
77
+ for (const cred of credentials) {
78
+ try {
79
+ const account = JSON.parse(cred.password);
80
+ accounts.push(account);
81
+ }
82
+ catch (error) {
83
+ console.error(`Failed to parse account ${cred.account}:`, error);
84
+ }
85
+ }
86
+ return accounts;
87
+ }
88
+ catch (error) {
89
+ console.error('Failed to load accounts from keychain:', error);
90
+ return [];
91
+ }
92
+ }
93
+ async getAccount(accountId) {
94
+ await this.ensureInitialized();
95
+ if (!this.isKeytarAvailable || !this.keytar) {
96
+ return null;
97
+ }
98
+ try {
99
+ const password = await this.keytar.getPassword(this.SERVICE_NAME, `slack-${accountId}`);
100
+ if (password) {
101
+ return JSON.parse(password);
102
+ }
103
+ return null;
104
+ }
105
+ catch (error) {
106
+ console.error(`Failed to get account ${accountId}:`, error);
107
+ return null;
108
+ }
109
+ }
110
+ async deleteAccount(accountId) {
111
+ await this.ensureInitialized();
112
+ if (!this.isKeytarAvailable || !this.keytar) {
113
+ return;
114
+ }
115
+ try {
116
+ await this.keytar.deletePassword(this.SERVICE_NAME, `slack-${accountId}`);
117
+ }
118
+ catch (error) {
119
+ console.error(`Failed to delete account ${accountId}:`, error);
120
+ }
121
+ }
122
+ async isAvailable() {
123
+ await this.ensureInitialized();
124
+ return this.isKeytarAvailable;
125
+ }
126
+ }
127
+ // =====================================================================================
128
+ // VALIDATION SCHEMAS - Account Management Tools
129
+ // =====================================================================================
130
+ const ListAccountsArgsSchema = z.object({});
131
+ const SwitchAccountArgsSchema = z.object({
132
+ account_id: z.string().describe("Account ID to switch to")
133
+ });
134
+ const AddAccountArgsSchema = z.object({
135
+ name: z.string().describe("Human-friendly name for this account"),
136
+ bot_token: z.string().describe("Bot User OAuth Token (starts with xoxb-)"),
137
+ user_token: z.string().optional().describe("User OAuth Token (starts with xoxp-) - optional"),
138
+ team_id: z.string().describe("Slack team ID")
139
+ });
140
+ const RemoveAccountArgsSchema = z.object({
141
+ account_id: z.string().describe("Account ID to remove")
142
+ });
143
+ const GetActiveAccountArgsSchema = z.object({});
144
+ const SetDefaultAccountArgsSchema = z.object({
145
+ account_id: z.string().describe("Account ID to set as default")
146
+ });
147
+ const UpdateAccountArgsSchema = z.object({
148
+ account_id: z.string().describe("Account ID to update"),
149
+ bot_token: z.string().optional().describe("New Bot User OAuth Token (starts with xoxb-)"),
150
+ user_token: z.string().optional().describe("New User OAuth Token (starts with xoxp-)")
151
+ });
152
+ // =====================================================================================
153
+ // EXISTING TOOL SCHEMAS (from original mcp-slacker)
154
+ // =====================================================================================
155
+ const ListChannelsArgsSchema = z.object({
156
+ types: z.string().optional().describe("Comma-separated list of channel types: public_channel, private_channel, mpim, im"),
157
+ limit: z.number().optional().describe("Maximum number of channels to return (default: 100)")
158
+ });
159
+ const SendMessageArgsSchema = z.object({
160
+ channel: z.string().describe("Channel ID or name (e.g., C1234567890 or #general)"),
161
+ text: z.string().describe("Text content of the message"),
162
+ thread_ts: z.string().optional().describe("Timestamp of the parent message to reply in thread")
163
+ });
164
+ const GetChannelHistoryArgsSchema = z.object({
165
+ channel: z.string().describe("Channel ID to fetch history from"),
166
+ limit: z.number().optional().describe("Number of messages to return (default: 100)")
167
+ });
168
+ const AddReactionArgsSchema = z.object({
169
+ channel: z.string().describe("Channel ID where the message is"),
170
+ timestamp: z.string().describe("Timestamp of the message to react to"),
171
+ name: z.string().describe("Reaction emoji name (without colons)")
172
+ });
173
+ const ListUsersArgsSchema = z.object({
174
+ limit: z.number().optional().describe("Maximum number of users to return (default: 100)")
175
+ });
176
+ const GetUserByNameArgsSchema = z.object({
177
+ name: z.string().describe("Name or display name to search for")
178
+ });
179
+ const GetUserInfoArgsSchema = z.object({
180
+ user_id: z.string().describe("User ID to get detailed info for")
181
+ });
182
+ const SearchFilesArgsSchema = z.object({
183
+ query: z.string().describe("Search query for files"),
184
+ count: z.number().optional().describe("Number of results to return (default: 20)"),
185
+ page: z.number().optional().describe("Page number of results (default: 1)")
186
+ });
187
+ const SearchMessagesArgsSchema = z.object({
188
+ query: z.string().describe("Search query for messages"),
189
+ count: z.number().optional().describe("Number of results to return (default: 20)"),
190
+ page: z.number().optional().describe("Page number of results (default: 1)")
191
+ });
192
+ const SearchByUserArgsSchema = z.object({
193
+ user_id: z.string().describe("User ID to search messages from"),
194
+ query: z.string().optional().describe("Additional search query"),
195
+ count: z.number().optional().describe("Number of results to return (default: 20)")
196
+ });
197
+ const SearchByDateRangeArgsSchema = z.object({
198
+ from_date: z.string().describe("Start date (YYYY-MM-DD)"),
199
+ to_date: z.string().describe("End date (YYYY-MM-DD)"),
200
+ query: z.string().optional().describe("Additional search query"),
201
+ count: z.number().optional().describe("Number of results to return (default: 20)")
202
+ });
203
+ const PinMessageArgsSchema = z.object({
204
+ channel: z.string().describe("Channel ID where the message is"),
205
+ timestamp: z.string().describe("Timestamp of the message to pin")
206
+ });
207
+ const UnpinMessageArgsSchema = z.object({
208
+ channel: z.string().describe("Channel ID where the message is"),
209
+ timestamp: z.string().describe("Timestamp of the message to unpin")
210
+ });
211
+ const DeleteMessageArgsSchema = z.object({
212
+ channel: z.string().describe("Channel ID where the message is"),
213
+ timestamp: z.string().describe("Timestamp of the message to delete")
214
+ });
215
+ const EditMessageArgsSchema = z.object({
216
+ channel: z.string().describe("Channel ID where the message is"),
217
+ timestamp: z.string().describe("Timestamp of the message to edit"),
218
+ text: z.string().describe("New text for the message")
219
+ });
220
+ const ScheduleMessageArgsSchema = z.object({
221
+ channel: z.string().describe("Channel ID to send to"),
222
+ text: z.string().describe("Message text"),
223
+ post_at: z.number().describe("Unix timestamp when message should be sent")
224
+ });
225
+ const GetUserStatusArgsSchema = z.object({
226
+ user_id: z.string().describe("User ID to get status for")
227
+ });
228
+ const GetUserProfileArgsSchema = z.object({
229
+ user_id: z.string().describe("User ID to get profile for")
230
+ });
231
+ const CreateReminderArgsSchema = z.object({
232
+ text: z.string().describe("Reminder text"),
233
+ time: z.string().describe("When to be reminded (e.g., 'in 20 minutes', 'tomorrow', '3:00pm')")
234
+ });
235
+ const ListRemindersArgsSchema = z.object({});
236
+ const GetCustomEmojiArgsSchema = z.object({});
237
+ const GetWorkspaceStatsArgsSchema = z.object({});
238
+ const SendFormattedMessageArgsSchema = z.object({
239
+ channel: z.string().describe("Channel ID or name"),
240
+ blocks: z.array(z.any()).describe("Slack Block Kit blocks for rich formatting"),
241
+ text: z.string().optional().describe("Fallback text")
242
+ });
243
+ const BulkReactMessagesArgsSchema = z.object({
244
+ channel: z.string().describe("Channel ID"),
245
+ timestamps: z.array(z.string()).describe("Array of message timestamps"),
246
+ reaction: z.string().describe("Emoji name to react with")
247
+ });
248
+ const ForwardMessageArgsSchema = z.object({
249
+ source_channel: z.string().describe("Source channel ID"),
250
+ timestamp: z.string().describe("Message timestamp to forward"),
251
+ target_channel: z.string().describe("Target channel ID to forward to"),
252
+ comment: z.string().optional().describe("Optional comment when forwarding")
253
+ });
254
+ const BulkForwardMessagesArgsSchema = z.object({
255
+ source_channel: z.string().describe("Source channel ID"),
256
+ timestamps: z.array(z.string()).describe("Array of message timestamps"),
257
+ target_channels: z.array(z.string()).describe("Array of target channel IDs"),
258
+ comment: z.string().optional().describe("Optional comment when forwarding")
259
+ });
260
+ const AuditUserActivityArgsSchema = z.object({
261
+ user_id: z.string().describe("User ID to audit"),
262
+ limit: z.number().optional().describe("Number of audit entries to return")
263
+ });
264
+ const GetThreadRepliesArgsSchema = z.object({
265
+ channel: z.string().describe("Channel ID where the thread is"),
266
+ thread_ts: z.string().describe("Timestamp of the parent message (thread starter)"),
267
+ limit: z.number().optional().describe("Number of replies to return (default: 100)")
268
+ });
269
+ // =====================================================================================
270
+ // MAIN SERVER CLASS
271
+ // =====================================================================================
272
+ class SlackerV3Server {
273
+ server;
274
+ accountState;
275
+ credentialManager;
276
+ constructor() {
277
+ this.server = new Server({
278
+ name: "mcp-slacker-v3",
279
+ version: "3.0.0",
280
+ }, {
281
+ capabilities: {
282
+ tools: {},
283
+ },
284
+ });
285
+ // Initialize account state
286
+ this.accountState = {
287
+ accounts: new Map(),
288
+ activeAccountId: null,
289
+ clients: new Map(),
290
+ userClients: new Map()
291
+ };
292
+ // Initialize credential manager
293
+ this.credentialManager = new CredentialManager();
294
+ // Initialize with default account if environment variables are provided
295
+ this.initializeDefaultAccount();
296
+ // Setup handlers immediately so the server can start
297
+ this.setupHandlers();
298
+ }
299
+ // =====================================================================================
300
+ // ACCOUNT MANAGEMENT METHODS
301
+ // =====================================================================================
302
+ async loadPersistedAccounts() {
303
+ try {
304
+ const startTime = Date.now();
305
+ const persistedAccounts = await this.credentialManager.loadAllAccounts();
306
+ console.error(`Loading ${persistedAccounts.length} persisted accounts from keychain...`);
307
+ for (const account of persistedAccounts) {
308
+ // Don't overwrite if already loaded from env
309
+ if (!this.accountState.accounts.has(account.id)) {
310
+ this.accountState.accounts.set(account.id, account);
311
+ this.initializeClient(account);
312
+ // Set first loaded account as active if none set
313
+ if (!this.accountState.activeAccountId) {
314
+ this.accountState.activeAccountId = account.id;
315
+ }
316
+ }
317
+ }
318
+ const loadTime = Date.now() - startTime;
319
+ console.error(`Loaded accounts in ${loadTime}ms`);
320
+ }
321
+ catch (error) {
322
+ console.error('Failed to load persisted accounts (continuing without):', error);
323
+ }
324
+ }
325
+ initializeDefaultAccount() {
326
+ const defaultBotToken = process.env.DEFAULT_BOT_TOKEN;
327
+ const defaultUserToken = process.env.DEFAULT_USER_TOKEN;
328
+ const defaultTeamId = process.env.DEFAULT_TEAM_ID;
329
+ const defaultAccountName = process.env.DEFAULT_ACCOUNT_NAME;
330
+ console.error("Environment variables:", {
331
+ DEFAULT_BOT_TOKEN: defaultBotToken ? "Set" : "Not set",
332
+ DEFAULT_USER_TOKEN: defaultUserToken ? "Set" : "Not set",
333
+ DEFAULT_TEAM_ID: defaultTeamId,
334
+ DEFAULT_ACCOUNT_NAME: defaultAccountName
335
+ });
336
+ if (defaultBotToken && defaultTeamId) {
337
+ const defaultAccount = {
338
+ id: 'default',
339
+ name: defaultAccountName || 'Default Workspace',
340
+ workspace: 'Unknown', // Will be fetched on first use
341
+ teamId: defaultTeamId,
342
+ botToken: defaultBotToken,
343
+ userToken: defaultUserToken,
344
+ isDefault: true
345
+ };
346
+ this.accountState.accounts.set(defaultAccount.id, defaultAccount);
347
+ this.accountState.activeAccountId = defaultAccount.id;
348
+ this.initializeClient(defaultAccount);
349
+ // Save env-based account to keychain for next time
350
+ this.credentialManager.saveAccount(defaultAccount).catch(error => {
351
+ console.error('Failed to persist env-based account:', error);
352
+ });
353
+ }
354
+ }
355
+ initializeClient(account) {
356
+ // Initialize bot client
357
+ const botClient = new WebClient(account.botToken);
358
+ this.accountState.clients.set(account.id, botClient);
359
+ // Initialize user client if user token is provided
360
+ if (account.userToken) {
361
+ const userClient = new WebClient(account.userToken);
362
+ this.accountState.userClients.set(account.id, userClient);
363
+ }
364
+ }
365
+ validateTokenFormat(token, type) {
366
+ if (type === 'bot') {
367
+ return token.startsWith('xoxb-');
368
+ }
369
+ else {
370
+ return token.startsWith('xoxp-');
371
+ }
372
+ }
373
+ generateAccountId(name) {
374
+ // Generate a safe account ID from the name
375
+ const baseId = name.toLowerCase()
376
+ .replace(/[^a-z0-9]/g, '-')
377
+ .replace(/-+/g, '-')
378
+ .replace(/^-|-$/g, '');
379
+ let id = baseId;
380
+ let counter = 1;
381
+ // Ensure uniqueness
382
+ while (this.accountState.accounts.has(id)) {
383
+ id = `${baseId}-${counter}`;
384
+ counter++;
385
+ }
386
+ return id;
387
+ }
388
+ async getActiveClient() {
389
+ if (!this.accountState.activeAccountId) {
390
+ throw new Error("No active Slack account. Use 'list_accounts' to see available accounts, or 'add_account' to add one.");
391
+ }
392
+ const client = this.accountState.clients.get(this.accountState.activeAccountId);
393
+ if (!client) {
394
+ throw new Error("Active account client not found. This shouldn't happen - please try switching accounts.");
395
+ }
396
+ // Debug: Log token being used
397
+ const activeAccount = this.accountState.accounts.get(this.accountState.activeAccountId);
398
+ console.error("Using bot token:", activeAccount?.botToken);
399
+ return client;
400
+ }
401
+ async getActiveUserClient() {
402
+ if (!this.accountState.activeAccountId) {
403
+ throw new Error("No active Slack account. Use 'switch_account' first.");
404
+ }
405
+ // Try to get user client first, fall back to bot client
406
+ let client = this.accountState.userClients.get(this.accountState.activeAccountId);
407
+ if (!client) {
408
+ client = this.accountState.clients.get(this.accountState.activeAccountId);
409
+ }
410
+ if (!client) {
411
+ throw new Error("Active account client not found.");
412
+ }
413
+ return client;
414
+ }
415
+ maskToken(token) {
416
+ if (token.length <= 8)
417
+ return "***";
418
+ return token.substring(0, 8) + "***" + token.substring(token.length - 4);
419
+ }
420
+ // =====================================================================================
421
+ // ACCOUNT MANAGEMENT TOOL IMPLEMENTATIONS
422
+ // =====================================================================================
423
+ async listAccounts(args) {
424
+ ListAccountsArgsSchema.parse(args);
425
+ const accounts = Array.from(this.accountState.accounts.values()).map(account => ({
426
+ id: account.id,
427
+ name: account.name,
428
+ workspace: account.workspace,
429
+ team_id: account.teamId,
430
+ is_default: account.isDefault || false,
431
+ is_active: account.id === this.accountState.activeAccountId,
432
+ has_user_token: !!account.userToken,
433
+ bot_token: this.maskToken(account.botToken),
434
+ user_token: account.userToken ? this.maskToken(account.userToken) : null
435
+ }));
436
+ return {
437
+ content: [
438
+ {
439
+ type: "text",
440
+ text: JSON.stringify({
441
+ total_accounts: accounts.length,
442
+ active_account_id: this.accountState.activeAccountId,
443
+ accounts: accounts
444
+ }, null, 2)
445
+ }
446
+ ]
447
+ };
448
+ }
449
+ async switchAccount(args) {
450
+ const validatedArgs = SwitchAccountArgsSchema.parse(args);
451
+ const account = this.accountState.accounts.get(validatedArgs.account_id);
452
+ if (!account) {
453
+ throw new Error(`Account '${validatedArgs.account_id}' not found. Use 'list_accounts' to see available accounts.`);
454
+ }
455
+ // Initialize client if not exists
456
+ if (!this.accountState.clients.has(account.id)) {
457
+ this.initializeClient(account);
458
+ }
459
+ // Switch active account
460
+ this.accountState.activeAccountId = account.id;
461
+ // Fetch workspace info if not cached
462
+ if (account.workspace === 'Unknown') {
463
+ try {
464
+ const client = this.accountState.clients.get(account.id);
465
+ const teamInfo = await client.team.info();
466
+ account.workspace = teamInfo.team?.name || 'Unknown';
467
+ }
468
+ catch (error) {
469
+ // If we can't fetch workspace info, that's ok - we'll use 'Unknown'
470
+ console.error(`Could not fetch workspace info for ${account.id}:`, error);
471
+ }
472
+ }
473
+ return {
474
+ content: [
475
+ {
476
+ type: "text",
477
+ text: JSON.stringify({
478
+ success: true,
479
+ message: `Switched to ${account.name} (${account.workspace})`,
480
+ account: {
481
+ id: account.id,
482
+ name: account.name,
483
+ workspace: account.workspace,
484
+ team_id: account.teamId
485
+ }
486
+ }, null, 2)
487
+ }
488
+ ]
489
+ };
490
+ }
491
+ async addAccount(args) {
492
+ const validatedArgs = AddAccountArgsSchema.parse(args);
493
+ // Validate token formats
494
+ if (!this.validateTokenFormat(validatedArgs.bot_token, 'bot')) {
495
+ throw new Error("Invalid bot token format. Bot tokens must start with 'xoxb-'");
496
+ }
497
+ if (validatedArgs.user_token && !this.validateTokenFormat(validatedArgs.user_token, 'user')) {
498
+ throw new Error("Invalid user token format. User tokens must start with 'xoxp-'");
499
+ }
500
+ // Generate unique account ID
501
+ const accountId = this.generateAccountId(validatedArgs.name);
502
+ // Create new account
503
+ const newAccount = {
504
+ id: accountId,
505
+ name: validatedArgs.name,
506
+ workspace: 'Unknown', // Will be fetched on first use
507
+ teamId: validatedArgs.team_id,
508
+ botToken: validatedArgs.bot_token,
509
+ userToken: validatedArgs.user_token,
510
+ isDefault: false
511
+ };
512
+ // Test the bot token by trying to get team info
513
+ try {
514
+ const testClient = new WebClient(validatedArgs.bot_token);
515
+ const teamInfo = await testClient.team.info();
516
+ newAccount.workspace = teamInfo.team?.name || 'Unknown';
517
+ // Verify team ID matches
518
+ if (teamInfo.team?.id && teamInfo.team.id !== validatedArgs.team_id) {
519
+ throw new Error(`Team ID mismatch. Token belongs to team ${teamInfo.team.id}, but ${validatedArgs.team_id} was provided.`);
520
+ }
521
+ }
522
+ catch (error) {
523
+ throw new Error(`Failed to verify bot token: ${error instanceof Error ? error.message : String(error)}`);
524
+ }
525
+ // Add to accounts
526
+ this.accountState.accounts.set(accountId, newAccount);
527
+ this.initializeClient(newAccount);
528
+ // If this is the first account, make it active
529
+ if (!this.accountState.activeAccountId) {
530
+ this.accountState.activeAccountId = accountId;
531
+ }
532
+ // Persist to keychain
533
+ try {
534
+ await this.credentialManager.saveAccount(newAccount);
535
+ return {
536
+ content: [
537
+ {
538
+ type: "text",
539
+ text: JSON.stringify({
540
+ success: true,
541
+ message: `Account '${validatedArgs.name}' added and saved to secure storage`,
542
+ account: {
543
+ id: accountId,
544
+ name: newAccount.name,
545
+ workspace: newAccount.workspace,
546
+ team_id: newAccount.teamId,
547
+ is_active: accountId === this.accountState.activeAccountId
548
+ }
549
+ }, null, 2)
550
+ }
551
+ ]
552
+ };
553
+ }
554
+ catch (error) {
555
+ // Still works, just not persisted
556
+ return {
557
+ content: [
558
+ {
559
+ type: "text",
560
+ text: JSON.stringify({
561
+ success: true,
562
+ message: `Account '${validatedArgs.name}' added (temporary - secure storage unavailable)`,
563
+ account: {
564
+ id: accountId,
565
+ name: newAccount.name,
566
+ workspace: newAccount.workspace,
567
+ team_id: newAccount.teamId,
568
+ is_active: accountId === this.accountState.activeAccountId
569
+ }
570
+ }, null, 2)
571
+ }
572
+ ]
573
+ };
574
+ }
575
+ }
576
+ async removeAccount(args) {
577
+ const validatedArgs = RemoveAccountArgsSchema.parse(args);
578
+ const account = this.accountState.accounts.get(validatedArgs.account_id);
579
+ if (!account) {
580
+ throw new Error(`Account '${validatedArgs.account_id}' not found.`);
581
+ }
582
+ // Check if this is the active account
583
+ const wasActive = this.accountState.activeAccountId === validatedArgs.account_id;
584
+ // Remove from all maps
585
+ this.accountState.accounts.delete(validatedArgs.account_id);
586
+ this.accountState.clients.delete(validatedArgs.account_id);
587
+ this.accountState.userClients.delete(validatedArgs.account_id);
588
+ // If this was the active account, switch to another one or clear active
589
+ if (wasActive) {
590
+ const remainingAccounts = Array.from(this.accountState.accounts.keys());
591
+ this.accountState.activeAccountId = remainingAccounts.length > 0 ? remainingAccounts[0] : null;
592
+ }
593
+ // Remove from keychain
594
+ try {
595
+ await this.credentialManager.deleteAccount(validatedArgs.account_id);
596
+ return {
597
+ content: [
598
+ {
599
+ type: "text",
600
+ text: JSON.stringify({
601
+ success: true,
602
+ message: `Account '${account.name}' removed from memory and secure storage`,
603
+ new_active_account: this.accountState.activeAccountId,
604
+ remaining_accounts: this.accountState.accounts.size
605
+ }, null, 2)
606
+ }
607
+ ]
608
+ };
609
+ }
610
+ catch (error) {
611
+ return {
612
+ content: [
613
+ {
614
+ type: "text",
615
+ text: JSON.stringify({
616
+ success: true,
617
+ message: `Account '${account.name}' removed from memory (secure storage removal failed)`,
618
+ new_active_account: this.accountState.activeAccountId,
619
+ remaining_accounts: this.accountState.accounts.size
620
+ }, null, 2)
621
+ }
622
+ ]
623
+ };
624
+ }
625
+ }
626
+ async getActiveAccount(args) {
627
+ GetActiveAccountArgsSchema.parse(args);
628
+ if (!this.accountState.activeAccountId) {
629
+ return {
630
+ content: [
631
+ {
632
+ type: "text",
633
+ text: JSON.stringify({
634
+ active_account: null,
635
+ message: "No active account. Use 'list_accounts' to see available accounts, or 'add_account' to add one."
636
+ }, null, 2)
637
+ }
638
+ ]
639
+ };
640
+ }
641
+ const account = this.accountState.accounts.get(this.accountState.activeAccountId);
642
+ if (!account) {
643
+ return {
644
+ content: [
645
+ {
646
+ type: "text",
647
+ text: JSON.stringify({
648
+ active_account: null,
649
+ error: "Active account not found in registry"
650
+ }, null, 2)
651
+ }
652
+ ]
653
+ };
654
+ }
655
+ return {
656
+ content: [
657
+ {
658
+ type: "text",
659
+ text: JSON.stringify({
660
+ active_account: {
661
+ id: account.id,
662
+ name: account.name,
663
+ workspace: account.workspace,
664
+ team_id: account.teamId,
665
+ is_default: account.isDefault || false,
666
+ has_user_token: !!account.userToken
667
+ }
668
+ }, null, 2)
669
+ }
670
+ ]
671
+ };
672
+ }
673
+ async setDefaultAccount(args) {
674
+ const validatedArgs = SetDefaultAccountArgsSchema.parse(args);
675
+ const account = this.accountState.accounts.get(validatedArgs.account_id);
676
+ if (!account) {
677
+ throw new Error(`Account '${validatedArgs.account_id}' not found.`);
678
+ }
679
+ // Clear default flag from all accounts
680
+ for (const acc of this.accountState.accounts.values()) {
681
+ acc.isDefault = false;
682
+ }
683
+ // Set new default
684
+ account.isDefault = true;
685
+ return {
686
+ content: [
687
+ {
688
+ type: "text",
689
+ text: JSON.stringify({
690
+ success: true,
691
+ message: `Account '${account.name}' set as default`,
692
+ default_account: {
693
+ id: account.id,
694
+ name: account.name,
695
+ workspace: account.workspace
696
+ }
697
+ }, null, 2)
698
+ }
699
+ ]
700
+ };
701
+ }
702
+ async updateAccount(args) {
703
+ const validatedArgs = UpdateAccountArgsSchema.parse(args);
704
+ const account = this.accountState.accounts.get(validatedArgs.account_id);
705
+ if (!account) {
706
+ throw new Error(`Account '${validatedArgs.account_id}' not found.`);
707
+ }
708
+ // Validate new tokens if provided
709
+ if (validatedArgs.bot_token && !this.validateTokenFormat(validatedArgs.bot_token, 'bot')) {
710
+ throw new Error("Invalid bot token format. Bot tokens must start with 'xoxb-'");
711
+ }
712
+ if (validatedArgs.user_token && !this.validateTokenFormat(validatedArgs.user_token, 'user')) {
713
+ throw new Error("Invalid user token format. User tokens must start with 'xoxp-'");
714
+ }
715
+ // Update tokens in memory
716
+ let tokensUpdated = false;
717
+ if (validatedArgs.bot_token && validatedArgs.bot_token !== account.botToken) {
718
+ account.botToken = validatedArgs.bot_token;
719
+ tokensUpdated = true;
720
+ }
721
+ if (validatedArgs.user_token !== undefined && validatedArgs.user_token !== account.userToken) {
722
+ account.userToken = validatedArgs.user_token;
723
+ tokensUpdated = true;
724
+ }
725
+ if (!tokensUpdated) {
726
+ return {
727
+ content: [
728
+ {
729
+ type: "text",
730
+ text: JSON.stringify({
731
+ success: false,
732
+ message: "No token changes provided"
733
+ }, null, 2)
734
+ }
735
+ ]
736
+ };
737
+ }
738
+ // Re-initialize clients with new tokens
739
+ this.initializeClient(account);
740
+ // Update workspace info if bot token changed
741
+ if (validatedArgs.bot_token) {
742
+ try {
743
+ const client = this.accountState.clients.get(account.id);
744
+ const teamInfo = await client.team.info();
745
+ account.workspace = teamInfo.team?.name || account.workspace;
746
+ }
747
+ catch (error) {
748
+ console.error('Failed to update workspace info:', error);
749
+ }
750
+ }
751
+ // Persist updated account
752
+ try {
753
+ await this.credentialManager.updateAccount(account);
754
+ return {
755
+ content: [
756
+ {
757
+ type: "text",
758
+ text: JSON.stringify({
759
+ success: true,
760
+ message: `Updated tokens for '${account.name}' and saved to secure storage`,
761
+ account: {
762
+ id: account.id,
763
+ name: account.name,
764
+ workspace: account.workspace,
765
+ team_id: account.teamId,
766
+ has_user_token: !!account.userToken
767
+ }
768
+ }, null, 2)
769
+ }
770
+ ]
771
+ };
772
+ }
773
+ catch (error) {
774
+ return {
775
+ content: [
776
+ {
777
+ type: "text",
778
+ text: JSON.stringify({
779
+ success: true,
780
+ message: `Updated tokens for '${account.name}' (temporary - secure storage unavailable)`,
781
+ account: {
782
+ id: account.id,
783
+ name: account.name,
784
+ workspace: account.workspace,
785
+ team_id: account.teamId,
786
+ has_user_token: !!account.userToken
787
+ }
788
+ }, null, 2)
789
+ }
790
+ ]
791
+ };
792
+ }
793
+ }
794
+ // =====================================================================================
795
+ // EXISTING SLACK TOOL IMPLEMENTATIONS (Modified for Multi-Account)
796
+ // =====================================================================================
797
+ async slackListChannels(args) {
798
+ const validatedArgs = ListChannelsArgsSchema.parse(args);
799
+ const client = await this.getActiveClient();
800
+ // Collect all channels with pagination
801
+ const allChannels = [];
802
+ let cursor;
803
+ try {
804
+ do {
805
+ const result = await client.conversations.list({
806
+ types: validatedArgs.types || "public_channel,private_channel",
807
+ limit: validatedArgs.limit || 200,
808
+ exclude_archived: true,
809
+ cursor: cursor
810
+ });
811
+ if (result.channels) {
812
+ allChannels.push(...result.channels);
813
+ }
814
+ // Get next cursor for pagination
815
+ cursor = result.response_metadata?.next_cursor;
816
+ } while (cursor);
817
+ const channels = allChannels.map(channel => ({
818
+ id: channel.id,
819
+ name: channel.name,
820
+ is_private: channel.is_private,
821
+ is_member: channel.is_member,
822
+ topic: channel.topic?.value,
823
+ purpose: channel.purpose?.value,
824
+ num_members: channel.num_members
825
+ }));
826
+ return {
827
+ content: [
828
+ {
829
+ type: "text",
830
+ text: JSON.stringify(channels, null, 2)
831
+ }
832
+ ]
833
+ };
834
+ }
835
+ catch (error) {
836
+ // Debug the exact error
837
+ console.error("Slack API Error:", error);
838
+ console.error("Error details:", {
839
+ message: error.message,
840
+ data: error.data,
841
+ code: error.code,
842
+ statusCode: error.statusCode
843
+ });
844
+ // Get current account info for debugging
845
+ const activeAccount = this.accountState.accounts.get(this.accountState.activeAccountId);
846
+ console.error("Active account:", {
847
+ id: activeAccount?.id,
848
+ name: activeAccount?.name,
849
+ teamId: activeAccount?.teamId,
850
+ botToken: activeAccount?.botToken ? "Set" : "Not set"
851
+ });
852
+ throw error;
853
+ }
854
+ }
855
+ async slackSendMessage(args) {
856
+ const validatedArgs = SendMessageArgsSchema.parse(args);
857
+ const client = await this.getActiveClient();
858
+ // Handle channel names that start with #
859
+ let channelId = validatedArgs.channel;
860
+ if (channelId.startsWith('#')) {
861
+ // Try to find the channel by name
862
+ const channelName = channelId.substring(1);
863
+ const result = await client.conversations.list({
864
+ types: "public_channel,private_channel",
865
+ limit: 1000
866
+ });
867
+ const channel = result.channels?.find(ch => ch.name === channelName);
868
+ if (channel) {
869
+ channelId = channel.id;
870
+ }
871
+ else {
872
+ throw new Error(`Channel #${channelName} not found`);
873
+ }
874
+ }
875
+ const result = await client.chat.postMessage({
876
+ channel: channelId,
877
+ text: validatedArgs.text,
878
+ thread_ts: validatedArgs.thread_ts
879
+ });
880
+ return {
881
+ content: [
882
+ {
883
+ type: "text",
884
+ text: `Message sent successfully! Channel: ${result.channel}, Timestamp: ${result.ts}`
885
+ }
886
+ ]
887
+ };
888
+ }
889
+ async slackGetChannelHistory(args) {
890
+ const validatedArgs = GetChannelHistoryArgsSchema.parse(args);
891
+ const client = await this.getActiveClient();
892
+ const result = await client.conversations.history({
893
+ channel: validatedArgs.channel,
894
+ limit: validatedArgs.limit || 100
895
+ });
896
+ const messages = result.messages?.map(msg => ({
897
+ user: msg.user,
898
+ text: msg.text,
899
+ ts: msg.ts,
900
+ thread_ts: msg.thread_ts,
901
+ reply_count: msg.reply_count,
902
+ reactions: msg.reactions?.map(r => ({
903
+ name: r.name,
904
+ count: r.count,
905
+ users: r.users
906
+ }))
907
+ })) || [];
908
+ return {
909
+ content: [
910
+ {
911
+ type: "text",
912
+ text: JSON.stringify(messages, null, 2)
913
+ }
914
+ ]
915
+ };
916
+ }
917
+ async slackAddReaction(args) {
918
+ const validatedArgs = AddReactionArgsSchema.parse(args);
919
+ const client = await this.getActiveClient();
920
+ await client.reactions.add({
921
+ channel: validatedArgs.channel,
922
+ timestamp: validatedArgs.timestamp,
923
+ name: validatedArgs.name
924
+ });
925
+ return {
926
+ content: [
927
+ {
928
+ type: "text",
929
+ text: `Reaction :${validatedArgs.name}: added successfully`
930
+ }
931
+ ]
932
+ };
933
+ }
934
+ async slackListUsers(args) {
935
+ const validatedArgs = ListUsersArgsSchema.parse(args);
936
+ const client = await this.getActiveClient();
937
+ const result = await client.users.list({
938
+ limit: validatedArgs.limit || 100
939
+ });
940
+ const users = result.members?.filter(user => !user.deleted && !user.is_bot).map(user => ({
941
+ id: user.id,
942
+ name: user.name,
943
+ real_name: user.real_name,
944
+ display_name: user.profile?.display_name,
945
+ email: user.profile?.email,
946
+ is_admin: user.is_admin,
947
+ is_owner: user.is_owner,
948
+ status_text: user.profile?.status_text,
949
+ status_emoji: user.profile?.status_emoji
950
+ })) || [];
951
+ return {
952
+ content: [
953
+ {
954
+ type: "text",
955
+ text: JSON.stringify(users, null, 2)
956
+ }
957
+ ]
958
+ };
959
+ }
960
+ async slackGetUserByName(args) {
961
+ const validatedArgs = GetUserByNameArgsSchema.parse(args);
962
+ const client = await this.getActiveClient();
963
+ const result = await client.users.list({});
964
+ const searchTerm = validatedArgs.name.toLowerCase();
965
+ const user = result.members?.find(u => !u.deleted && (u.name?.toLowerCase().includes(searchTerm) ||
966
+ u.real_name?.toLowerCase().includes(searchTerm) ||
967
+ u.profile?.display_name?.toLowerCase().includes(searchTerm)));
968
+ if (!user) {
969
+ throw new Error(`User not found with name: ${validatedArgs.name}`);
970
+ }
971
+ return {
972
+ content: [
973
+ {
974
+ type: "text",
975
+ text: JSON.stringify({
976
+ id: user.id,
977
+ name: user.name,
978
+ real_name: user.real_name,
979
+ display_name: user.profile?.display_name,
980
+ email: user.profile?.email,
981
+ is_admin: user.is_admin,
982
+ is_owner: user.is_owner
983
+ }, null, 2)
984
+ }
985
+ ]
986
+ };
987
+ }
988
+ async slackGetUserInfo(args) {
989
+ const validatedArgs = GetUserInfoArgsSchema.parse(args);
990
+ const client = await this.getActiveClient();
991
+ const result = await client.users.info({
992
+ user: validatedArgs.user_id
993
+ });
994
+ if (!result.user) {
995
+ throw new Error("User not found");
996
+ }
997
+ return {
998
+ content: [
999
+ {
1000
+ type: "text",
1001
+ text: JSON.stringify({
1002
+ id: result.user.id,
1003
+ name: result.user.name,
1004
+ real_name: result.user.real_name,
1005
+ display_name: result.user.profile?.display_name,
1006
+ email: result.user.profile?.email,
1007
+ phone: result.user.profile?.phone,
1008
+ title: result.user.profile?.title,
1009
+ status_text: result.user.profile?.status_text,
1010
+ status_emoji: result.user.profile?.status_emoji,
1011
+ is_admin: result.user.is_admin,
1012
+ is_owner: result.user.is_owner,
1013
+ is_bot: result.user.is_bot,
1014
+ timezone: result.user.tz,
1015
+ locale: result.user.locale
1016
+ }, null, 2)
1017
+ }
1018
+ ]
1019
+ };
1020
+ }
1021
+ async slackSearchFiles(args) {
1022
+ const validatedArgs = SearchFilesArgsSchema.parse(args);
1023
+ const client = await this.getActiveUserClient();
1024
+ const result = await client.search.files({
1025
+ query: validatedArgs.query,
1026
+ count: validatedArgs.count || 20,
1027
+ page: validatedArgs.page || 1
1028
+ });
1029
+ const files = result.files?.matches?.map(file => ({
1030
+ id: file.id,
1031
+ name: file.name,
1032
+ title: file.title,
1033
+ mimetype: file.mimetype,
1034
+ size: file.size,
1035
+ url: file.url_private,
1036
+ user: file.user,
1037
+ created: file.created,
1038
+ channels: file.channels,
1039
+ preview: file.preview?.substring(0, 200)
1040
+ })) || [];
1041
+ return {
1042
+ content: [
1043
+ {
1044
+ type: "text",
1045
+ text: JSON.stringify({
1046
+ total: result.files?.total || 0,
1047
+ pagination: result.files?.pagination,
1048
+ files: files
1049
+ }, null, 2)
1050
+ }
1051
+ ]
1052
+ };
1053
+ }
1054
+ async slackSearchMessages(args) {
1055
+ const validatedArgs = SearchMessagesArgsSchema.parse(args);
1056
+ const client = await this.getActiveUserClient();
1057
+ const result = await client.search.messages({
1058
+ query: validatedArgs.query,
1059
+ count: validatedArgs.count || 20,
1060
+ page: validatedArgs.page || 1
1061
+ });
1062
+ const messages = result.messages?.matches?.map(msg => ({
1063
+ text: msg.text,
1064
+ user: msg.user,
1065
+ channel: msg.channel?.name,
1066
+ channel_id: msg.channel?.id,
1067
+ timestamp: msg.ts,
1068
+ permalink: msg.permalink
1069
+ })) || [];
1070
+ return {
1071
+ content: [
1072
+ {
1073
+ type: "text",
1074
+ text: JSON.stringify({
1075
+ total: result.messages?.total || 0,
1076
+ pagination: result.messages?.pagination,
1077
+ messages: messages
1078
+ }, null, 2)
1079
+ }
1080
+ ]
1081
+ };
1082
+ }
1083
+ async slackSearchByUser(args) {
1084
+ const validatedArgs = SearchByUserArgsSchema.parse(args);
1085
+ const client = await this.getActiveUserClient();
1086
+ let query = `from:<@${validatedArgs.user_id}>`;
1087
+ if (validatedArgs.query) {
1088
+ query += ` ${validatedArgs.query}`;
1089
+ }
1090
+ const result = await client.search.messages({
1091
+ query: query,
1092
+ count: validatedArgs.count || 20
1093
+ });
1094
+ const messages = result.messages?.matches?.map(msg => ({
1095
+ text: msg.text,
1096
+ channel: msg.channel?.name,
1097
+ channel_id: msg.channel?.id,
1098
+ timestamp: msg.ts,
1099
+ permalink: msg.permalink
1100
+ })) || [];
1101
+ return {
1102
+ content: [
1103
+ {
1104
+ type: "text",
1105
+ text: JSON.stringify({
1106
+ total: result.messages?.total || 0,
1107
+ messages: messages
1108
+ }, null, 2)
1109
+ }
1110
+ ]
1111
+ };
1112
+ }
1113
+ async slackSearchByDateRange(args) {
1114
+ const validatedArgs = SearchByDateRangeArgsSchema.parse(args);
1115
+ const client = await this.getActiveUserClient();
1116
+ let query = `after:${validatedArgs.from_date} before:${validatedArgs.to_date}`;
1117
+ if (validatedArgs.query) {
1118
+ query += ` ${validatedArgs.query}`;
1119
+ }
1120
+ const result = await client.search.messages({
1121
+ query: query,
1122
+ count: validatedArgs.count || 20
1123
+ });
1124
+ const messages = result.messages?.matches?.map(msg => ({
1125
+ text: msg.text,
1126
+ user: msg.user,
1127
+ channel: msg.channel?.name,
1128
+ channel_id: msg.channel?.id,
1129
+ timestamp: msg.ts,
1130
+ permalink: msg.permalink
1131
+ })) || [];
1132
+ return {
1133
+ content: [
1134
+ {
1135
+ type: "text",
1136
+ text: JSON.stringify({
1137
+ total: result.messages?.total || 0,
1138
+ date_range: {
1139
+ from: validatedArgs.from_date,
1140
+ to: validatedArgs.to_date
1141
+ },
1142
+ messages: messages
1143
+ }, null, 2)
1144
+ }
1145
+ ]
1146
+ };
1147
+ }
1148
+ async slackPinMessage(args) {
1149
+ const validatedArgs = PinMessageArgsSchema.parse(args);
1150
+ const client = await this.getActiveClient();
1151
+ await client.pins.add({
1152
+ channel: validatedArgs.channel,
1153
+ timestamp: validatedArgs.timestamp
1154
+ });
1155
+ return {
1156
+ content: [
1157
+ {
1158
+ type: "text",
1159
+ text: "Message pinned successfully"
1160
+ }
1161
+ ]
1162
+ };
1163
+ }
1164
+ async slackUnpinMessage(args) {
1165
+ const validatedArgs = UnpinMessageArgsSchema.parse(args);
1166
+ const client = await this.getActiveClient();
1167
+ await client.pins.remove({
1168
+ channel: validatedArgs.channel,
1169
+ timestamp: validatedArgs.timestamp
1170
+ });
1171
+ return {
1172
+ content: [
1173
+ {
1174
+ type: "text",
1175
+ text: "Message unpinned successfully"
1176
+ }
1177
+ ]
1178
+ };
1179
+ }
1180
+ async slackDeleteMessage(args) {
1181
+ const validatedArgs = DeleteMessageArgsSchema.parse(args);
1182
+ const client = await this.getActiveUserClient();
1183
+ await client.chat.delete({
1184
+ channel: validatedArgs.channel,
1185
+ ts: validatedArgs.timestamp
1186
+ });
1187
+ return {
1188
+ content: [
1189
+ {
1190
+ type: "text",
1191
+ text: "Message deleted successfully"
1192
+ }
1193
+ ]
1194
+ };
1195
+ }
1196
+ async slackEditMessage(args) {
1197
+ const validatedArgs = EditMessageArgsSchema.parse(args);
1198
+ const client = await this.getActiveUserClient();
1199
+ await client.chat.update({
1200
+ channel: validatedArgs.channel,
1201
+ ts: validatedArgs.timestamp,
1202
+ text: validatedArgs.text
1203
+ });
1204
+ return {
1205
+ content: [
1206
+ {
1207
+ type: "text",
1208
+ text: "Message edited successfully"
1209
+ }
1210
+ ]
1211
+ };
1212
+ }
1213
+ async slackScheduleMessage(args) {
1214
+ const validatedArgs = ScheduleMessageArgsSchema.parse(args);
1215
+ const client = await this.getActiveClient();
1216
+ const result = await client.chat.scheduleMessage({
1217
+ channel: validatedArgs.channel,
1218
+ text: validatedArgs.text,
1219
+ post_at: validatedArgs.post_at
1220
+ });
1221
+ return {
1222
+ content: [
1223
+ {
1224
+ type: "text",
1225
+ text: `Message scheduled successfully. Scheduled message ID: ${result.scheduled_message_id}`
1226
+ }
1227
+ ]
1228
+ };
1229
+ }
1230
+ async slackGetUserStatus(args) {
1231
+ const validatedArgs = GetUserStatusArgsSchema.parse(args);
1232
+ const client = await this.getActiveClient();
1233
+ const result = await client.users.info({
1234
+ user: validatedArgs.user_id
1235
+ });
1236
+ if (!result.user) {
1237
+ throw new Error("User not found");
1238
+ }
1239
+ return {
1240
+ content: [
1241
+ {
1242
+ type: "text",
1243
+ text: JSON.stringify({
1244
+ user_id: result.user.id,
1245
+ status_text: result.user.profile?.status_text || "",
1246
+ status_emoji: result.user.profile?.status_emoji || "",
1247
+ status_expiration: result.user.profile?.status_expiration || 0
1248
+ }, null, 2)
1249
+ }
1250
+ ]
1251
+ };
1252
+ }
1253
+ async slackGetUserProfile(args) {
1254
+ const validatedArgs = GetUserProfileArgsSchema.parse(args);
1255
+ const client = await this.getActiveClient();
1256
+ const result = await client.users.profile.get({
1257
+ user: validatedArgs.user_id
1258
+ });
1259
+ return {
1260
+ content: [
1261
+ {
1262
+ type: "text",
1263
+ text: JSON.stringify(result.profile, null, 2)
1264
+ }
1265
+ ]
1266
+ };
1267
+ }
1268
+ async slackCreateReminder(args) {
1269
+ const validatedArgs = CreateReminderArgsSchema.parse(args);
1270
+ const client = await this.getActiveUserClient();
1271
+ const result = await client.reminders.add({
1272
+ text: validatedArgs.text,
1273
+ time: validatedArgs.time
1274
+ });
1275
+ return {
1276
+ content: [
1277
+ {
1278
+ type: "text",
1279
+ text: JSON.stringify({
1280
+ reminder_id: result.reminder?.id,
1281
+ text: result.reminder?.text,
1282
+ time: result.reminder?.time,
1283
+ complete_ts: result.reminder?.complete_ts
1284
+ }, null, 2)
1285
+ }
1286
+ ]
1287
+ };
1288
+ }
1289
+ async slackListReminders() {
1290
+ const client = await this.getActiveUserClient();
1291
+ const result = await client.reminders.list();
1292
+ const reminders = result.reminders?.map(r => ({
1293
+ id: r.id,
1294
+ text: r.text,
1295
+ time: r.time,
1296
+ complete_ts: r.complete_ts,
1297
+ recurring: r.recurring
1298
+ })) || [];
1299
+ return {
1300
+ content: [
1301
+ {
1302
+ type: "text",
1303
+ text: JSON.stringify(reminders, null, 2)
1304
+ }
1305
+ ]
1306
+ };
1307
+ }
1308
+ async slackGetCustomEmoji() {
1309
+ const client = await this.getActiveClient();
1310
+ const result = await client.emoji.list();
1311
+ return {
1312
+ content: [
1313
+ {
1314
+ type: "text",
1315
+ text: JSON.stringify(result.emoji || {}, null, 2)
1316
+ }
1317
+ ]
1318
+ };
1319
+ }
1320
+ async slackSendFormattedMessage(args) {
1321
+ const validatedArgs = SendFormattedMessageArgsSchema.parse(args);
1322
+ const client = await this.getActiveClient();
1323
+ const result = await client.chat.postMessage({
1324
+ channel: validatedArgs.channel,
1325
+ blocks: validatedArgs.blocks,
1326
+ text: validatedArgs.text || "Formatted message"
1327
+ });
1328
+ return {
1329
+ content: [
1330
+ {
1331
+ type: "text",
1332
+ text: `Formatted message sent successfully! Channel: ${result.channel}, Timestamp: ${result.ts}`
1333
+ }
1334
+ ]
1335
+ };
1336
+ }
1337
+ async slackAuditUserActivity(args) {
1338
+ const validatedArgs = AuditUserActivityArgsSchema.parse(args);
1339
+ const client = await this.getActiveUserClient();
1340
+ // Search for recent messages from the user
1341
+ const result = await client.search.messages({
1342
+ query: `from:<@${validatedArgs.user_id}>`,
1343
+ count: validatedArgs.limit || 20,
1344
+ sort: "timestamp",
1345
+ sort_dir: "desc"
1346
+ });
1347
+ const activity = result.messages?.matches?.map(msg => ({
1348
+ text: msg.text?.substring(0, 100) + (msg.text && msg.text.length > 100 ? "..." : ""),
1349
+ channel: msg.channel?.name,
1350
+ timestamp: msg.ts,
1351
+ permalink: msg.permalink
1352
+ })) || [];
1353
+ return {
1354
+ content: [
1355
+ {
1356
+ type: "text",
1357
+ text: JSON.stringify({
1358
+ user_id: validatedArgs.user_id,
1359
+ total_messages_found: result.messages?.total || 0,
1360
+ recent_activity: activity
1361
+ }, null, 2)
1362
+ }
1363
+ ]
1364
+ };
1365
+ }
1366
+ async slackBulkReactMessages(args) {
1367
+ const validatedArgs = BulkReactMessagesArgsSchema.parse(args);
1368
+ const client = await this.getActiveClient();
1369
+ const results = {
1370
+ successful: 0,
1371
+ failed: 0,
1372
+ errors: []
1373
+ };
1374
+ for (const timestamp of validatedArgs.timestamps) {
1375
+ try {
1376
+ await client.reactions.add({
1377
+ channel: validatedArgs.channel,
1378
+ timestamp: timestamp,
1379
+ name: validatedArgs.reaction
1380
+ });
1381
+ results.successful++;
1382
+ }
1383
+ catch (error) {
1384
+ results.failed++;
1385
+ results.errors.push(`${timestamp}: ${error instanceof Error ? error.message : String(error)}`);
1386
+ }
1387
+ }
1388
+ return {
1389
+ content: [
1390
+ {
1391
+ type: "text",
1392
+ text: JSON.stringify(results, null, 2)
1393
+ }
1394
+ ]
1395
+ };
1396
+ }
1397
+ async slackForwardMessage(args) {
1398
+ const validatedArgs = ForwardMessageArgsSchema.parse(args);
1399
+ const client = await this.getActiveClient();
1400
+ // Get the original message
1401
+ const history = await client.conversations.history({
1402
+ channel: validatedArgs.source_channel,
1403
+ latest: validatedArgs.timestamp,
1404
+ limit: 1,
1405
+ inclusive: true
1406
+ });
1407
+ const originalMessage = history.messages?.[0];
1408
+ if (!originalMessage) {
1409
+ throw new Error("Original message not found");
1410
+ }
1411
+ // Get user info
1412
+ let userName = "Unknown User";
1413
+ if (originalMessage.user) {
1414
+ try {
1415
+ const userInfo = await client.users.info({ user: originalMessage.user });
1416
+ userName = userInfo.user?.real_name || userInfo.user?.name || "Unknown User";
1417
+ }
1418
+ catch {
1419
+ // Ignore user lookup errors
1420
+ }
1421
+ }
1422
+ // Format the forwarded message
1423
+ let forwardedText = `Forwarded from <#${validatedArgs.source_channel}> (originally by ${userName}):\n>>> ${originalMessage.text}`;
1424
+ if (validatedArgs.comment) {
1425
+ forwardedText = `${validatedArgs.comment}\n\n${forwardedText}`;
1426
+ }
1427
+ // Send to target channel
1428
+ const result = await client.chat.postMessage({
1429
+ channel: validatedArgs.target_channel,
1430
+ text: forwardedText
1431
+ });
1432
+ return {
1433
+ content: [
1434
+ {
1435
+ type: "text",
1436
+ text: `Message forwarded successfully to <#${validatedArgs.target_channel}>. Timestamp: ${result.ts}`
1437
+ }
1438
+ ]
1439
+ };
1440
+ }
1441
+ async slackBulkForwardMessages(args) {
1442
+ const validatedArgs = BulkForwardMessagesArgsSchema.parse(args);
1443
+ const client = await this.getActiveClient();
1444
+ // Get all messages
1445
+ const messages = [];
1446
+ for (const timestamp of validatedArgs.timestamps) {
1447
+ const history = await client.conversations.history({
1448
+ channel: validatedArgs.source_channel,
1449
+ latest: timestamp,
1450
+ limit: 1,
1451
+ inclusive: true
1452
+ });
1453
+ if (history.messages?.[0]) {
1454
+ messages.push(history.messages[0]);
1455
+ }
1456
+ }
1457
+ if (messages.length === 0) {
1458
+ throw new Error("No messages found to forward");
1459
+ }
1460
+ // Forward to each target channel
1461
+ const results = {
1462
+ successful: 0,
1463
+ failed: 0,
1464
+ errors: []
1465
+ };
1466
+ for (const targetChannel of validatedArgs.target_channels) {
1467
+ try {
1468
+ // Combine all messages into one
1469
+ let combinedText = `Forwarded ${messages.length} messages from <#${validatedArgs.source_channel}>:\n\n`;
1470
+ if (validatedArgs.comment) {
1471
+ combinedText = `${validatedArgs.comment}\n\n${combinedText}`;
1472
+ }
1473
+ for (const msg of messages) {
1474
+ let userName = "Unknown User";
1475
+ if (msg.user) {
1476
+ try {
1477
+ const userInfo = await client.users.info({ user: msg.user });
1478
+ userName = userInfo.user?.real_name || userInfo.user?.name || "Unknown User";
1479
+ }
1480
+ catch {
1481
+ // Ignore user lookup errors
1482
+ }
1483
+ }
1484
+ combinedText += `>>> *${userName}*: ${msg.text}\n\n`;
1485
+ }
1486
+ await client.chat.postMessage({
1487
+ channel: targetChannel,
1488
+ text: combinedText
1489
+ });
1490
+ results.successful++;
1491
+ }
1492
+ catch (error) {
1493
+ results.failed++;
1494
+ results.errors.push(`${targetChannel}: ${error instanceof Error ? error.message : String(error)}`);
1495
+ }
1496
+ }
1497
+ return {
1498
+ content: [
1499
+ {
1500
+ type: "text",
1501
+ text: JSON.stringify(results, null, 2)
1502
+ }
1503
+ ]
1504
+ };
1505
+ }
1506
+ async slackGetThreadReplies(args) {
1507
+ const validatedArgs = GetThreadRepliesArgsSchema.parse(args);
1508
+ const client = await this.getActiveClient();
1509
+ const result = await client.conversations.replies({
1510
+ channel: validatedArgs.channel,
1511
+ ts: validatedArgs.thread_ts,
1512
+ limit: validatedArgs.limit || 100
1513
+ });
1514
+ const replies = result.messages?.map(msg => ({
1515
+ user: msg.user,
1516
+ text: msg.text,
1517
+ ts: msg.ts,
1518
+ thread_ts: msg.thread_ts,
1519
+ parent_user_id: msg.parent_user_id,
1520
+ reactions: msg.reactions?.map(r => ({
1521
+ name: r.name,
1522
+ count: r.count,
1523
+ users: r.users
1524
+ }))
1525
+ })) || [];
1526
+ return {
1527
+ content: [
1528
+ {
1529
+ type: "text",
1530
+ text: JSON.stringify({
1531
+ thread_ts: validatedArgs.thread_ts,
1532
+ reply_count: replies.length,
1533
+ replies: replies
1534
+ }, null, 2)
1535
+ }
1536
+ ]
1537
+ };
1538
+ }
1539
+ async slackGetWorkspaceStats() {
1540
+ const client = await this.getActiveClient();
1541
+ // Get team info
1542
+ const teamInfo = await client.team.info();
1543
+ // Get user count
1544
+ const users = await client.users.list({});
1545
+ const activeUsers = users.members?.filter(u => !u.deleted && !u.is_bot) || [];
1546
+ // Get channel count
1547
+ const channels = await client.conversations.list({
1548
+ types: "public_channel,private_channel"
1549
+ });
1550
+ return {
1551
+ content: [
1552
+ {
1553
+ type: "text",
1554
+ text: JSON.stringify({
1555
+ team: {
1556
+ name: teamInfo.team?.name,
1557
+ domain: teamInfo.team?.domain,
1558
+ email_domain: teamInfo.team?.email_domain
1559
+ },
1560
+ stats: {
1561
+ total_users: activeUsers.length,
1562
+ total_channels: channels.channels?.length || 0,
1563
+ admins: activeUsers.filter(u => u.is_admin).length,
1564
+ owners: activeUsers.filter(u => u.is_owner).length
1565
+ }
1566
+ }, null, 2)
1567
+ }
1568
+ ]
1569
+ };
1570
+ }
1571
+ // =====================================================================================
1572
+ // TOOL REGISTRATION AND HANDLER SETUP
1573
+ // =====================================================================================
1574
+ setupHandlers() {
1575
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => {
1576
+ const tools = [
1577
+ // Account Management Tools
1578
+ {
1579
+ name: "list_accounts",
1580
+ description: "List all configured Slack accounts with their status",
1581
+ inputSchema: {
1582
+ type: "object",
1583
+ properties: {}
1584
+ }
1585
+ },
1586
+ {
1587
+ name: "switch_account",
1588
+ description: "Switch to a different Slack workspace",
1589
+ inputSchema: {
1590
+ type: "object",
1591
+ properties: {
1592
+ account_id: {
1593
+ type: "string",
1594
+ description: "Account ID to switch to"
1595
+ }
1596
+ },
1597
+ required: ["account_id"]
1598
+ }
1599
+ },
1600
+ {
1601
+ name: "add_account",
1602
+ description: "Add a new Slack workspace configuration",
1603
+ inputSchema: {
1604
+ type: "object",
1605
+ properties: {
1606
+ name: {
1607
+ type: "string",
1608
+ description: "Human-friendly name for this account"
1609
+ },
1610
+ bot_token: {
1611
+ type: "string",
1612
+ description: "Bot User OAuth Token (starts with xoxb-)"
1613
+ },
1614
+ user_token: {
1615
+ type: "string",
1616
+ description: "User OAuth Token (starts with xoxp-) - optional"
1617
+ },
1618
+ team_id: {
1619
+ type: "string",
1620
+ description: "Slack team ID"
1621
+ }
1622
+ },
1623
+ required: ["name", "bot_token", "team_id"]
1624
+ }
1625
+ },
1626
+ {
1627
+ name: "remove_account",
1628
+ description: "Remove a Slack workspace configuration",
1629
+ inputSchema: {
1630
+ type: "object",
1631
+ properties: {
1632
+ account_id: {
1633
+ type: "string",
1634
+ description: "Account ID to remove"
1635
+ }
1636
+ },
1637
+ required: ["account_id"]
1638
+ }
1639
+ },
1640
+ {
1641
+ name: "get_active_account",
1642
+ description: "Get details of the currently active account",
1643
+ inputSchema: {
1644
+ type: "object",
1645
+ properties: {}
1646
+ }
1647
+ },
1648
+ {
1649
+ name: "set_default_account",
1650
+ description: "Set an account as the default for new sessions",
1651
+ inputSchema: {
1652
+ type: "object",
1653
+ properties: {
1654
+ account_id: {
1655
+ type: "string",
1656
+ description: "Account ID to set as default"
1657
+ }
1658
+ },
1659
+ required: ["account_id"]
1660
+ }
1661
+ },
1662
+ {
1663
+ name: "update_account",
1664
+ description: "Update account credentials (e.g. for token rotation)",
1665
+ inputSchema: {
1666
+ type: "object",
1667
+ properties: {
1668
+ account_id: {
1669
+ type: "string",
1670
+ description: "Account ID to update"
1671
+ },
1672
+ bot_token: {
1673
+ type: "string",
1674
+ description: "New Bot User OAuth Token (starts with xoxb-)"
1675
+ },
1676
+ user_token: {
1677
+ type: "string",
1678
+ description: "New User OAuth Token (starts with xoxp-)"
1679
+ }
1680
+ },
1681
+ required: ["account_id"]
1682
+ }
1683
+ },
1684
+ // Original Slack Tools (same as v1, but now account-aware)
1685
+ {
1686
+ name: "slack_list_channels",
1687
+ description: "List all accessible Slack channels",
1688
+ inputSchema: {
1689
+ type: "object",
1690
+ properties: {
1691
+ types: {
1692
+ type: "string",
1693
+ description: "Comma-separated list of channel types: public_channel, private_channel, mpim, im"
1694
+ },
1695
+ limit: {
1696
+ type: "number",
1697
+ description: "Maximum number of channels to return (default: 100)"
1698
+ }
1699
+ }
1700
+ }
1701
+ },
1702
+ {
1703
+ name: "slack_send_message",
1704
+ description: "Send a message to a Slack channel",
1705
+ inputSchema: {
1706
+ type: "object",
1707
+ properties: {
1708
+ channel: {
1709
+ type: "string",
1710
+ description: "Channel ID or name (e.g., C1234567890 or #general)"
1711
+ },
1712
+ text: {
1713
+ type: "string",
1714
+ description: "Text content of the message"
1715
+ },
1716
+ thread_ts: {
1717
+ type: "string",
1718
+ description: "Timestamp of the parent message to reply in thread"
1719
+ }
1720
+ },
1721
+ required: ["channel", "text"]
1722
+ }
1723
+ },
1724
+ {
1725
+ name: "slack_get_channel_history",
1726
+ description: "Get recent messages from a Slack channel",
1727
+ inputSchema: {
1728
+ type: "object",
1729
+ properties: {
1730
+ channel: {
1731
+ type: "string",
1732
+ description: "Channel ID to fetch history from"
1733
+ },
1734
+ limit: {
1735
+ type: "number",
1736
+ description: "Number of messages to return (default: 100)"
1737
+ }
1738
+ },
1739
+ required: ["channel"]
1740
+ }
1741
+ },
1742
+ {
1743
+ name: "slack_add_reaction",
1744
+ description: "Add a reaction emoji to a message",
1745
+ inputSchema: {
1746
+ type: "object",
1747
+ properties: {
1748
+ channel: {
1749
+ type: "string",
1750
+ description: "Channel ID where the message is"
1751
+ },
1752
+ timestamp: {
1753
+ type: "string",
1754
+ description: "Timestamp of the message to react to"
1755
+ },
1756
+ name: {
1757
+ type: "string",
1758
+ description: "Reaction emoji name (without colons)"
1759
+ }
1760
+ },
1761
+ required: ["channel", "timestamp", "name"]
1762
+ }
1763
+ },
1764
+ {
1765
+ name: "slack_list_users",
1766
+ description: "List all users in the workspace",
1767
+ inputSchema: {
1768
+ type: "object",
1769
+ properties: {
1770
+ limit: {
1771
+ type: "number",
1772
+ description: "Maximum number of users to return (default: 100)"
1773
+ }
1774
+ }
1775
+ }
1776
+ },
1777
+ {
1778
+ name: "slack_get_user_by_name",
1779
+ description: "Find specific user by name or display name",
1780
+ inputSchema: {
1781
+ type: "object",
1782
+ properties: {
1783
+ name: {
1784
+ type: "string",
1785
+ description: "Name or display name to search for"
1786
+ }
1787
+ },
1788
+ required: ["name"]
1789
+ }
1790
+ },
1791
+ {
1792
+ name: "slack_get_user_info",
1793
+ description: "Get detailed info for specific user ID",
1794
+ inputSchema: {
1795
+ type: "object",
1796
+ properties: {
1797
+ user_id: {
1798
+ type: "string",
1799
+ description: "User ID to get detailed info for"
1800
+ }
1801
+ },
1802
+ required: ["user_id"]
1803
+ }
1804
+ },
1805
+ {
1806
+ name: "slack_search_files",
1807
+ description: "Search for files in the workspace",
1808
+ inputSchema: {
1809
+ type: "object",
1810
+ properties: {
1811
+ query: {
1812
+ type: "string",
1813
+ description: "Search query for files"
1814
+ },
1815
+ count: {
1816
+ type: "number",
1817
+ description: "Number of results to return (default: 20)"
1818
+ },
1819
+ page: {
1820
+ type: "number",
1821
+ description: "Page number of results (default: 1)"
1822
+ }
1823
+ },
1824
+ required: ["query"]
1825
+ }
1826
+ },
1827
+ {
1828
+ name: "slack_search_messages",
1829
+ description: "Search for messages across the workspace",
1830
+ inputSchema: {
1831
+ type: "object",
1832
+ properties: {
1833
+ query: {
1834
+ type: "string",
1835
+ description: "Search query for messages"
1836
+ },
1837
+ count: {
1838
+ type: "number",
1839
+ description: "Number of results to return (default: 20)"
1840
+ },
1841
+ page: {
1842
+ type: "number",
1843
+ description: "Page number of results (default: 1)"
1844
+ }
1845
+ },
1846
+ required: ["query"]
1847
+ }
1848
+ },
1849
+ {
1850
+ name: "slack_search_by_user",
1851
+ description: "Search for messages from a specific user",
1852
+ inputSchema: {
1853
+ type: "object",
1854
+ properties: {
1855
+ user_id: {
1856
+ type: "string",
1857
+ description: "User ID to search messages from"
1858
+ },
1859
+ query: {
1860
+ type: "string",
1861
+ description: "Additional search query"
1862
+ },
1863
+ count: {
1864
+ type: "number",
1865
+ description: "Number of results to return (default: 20)"
1866
+ }
1867
+ },
1868
+ required: ["user_id"]
1869
+ }
1870
+ },
1871
+ {
1872
+ name: "slack_search_by_date_range",
1873
+ description: "Search for messages within a date range",
1874
+ inputSchema: {
1875
+ type: "object",
1876
+ properties: {
1877
+ from_date: {
1878
+ type: "string",
1879
+ description: "Start date (YYYY-MM-DD)"
1880
+ },
1881
+ to_date: {
1882
+ type: "string",
1883
+ description: "End date (YYYY-MM-DD)"
1884
+ },
1885
+ query: {
1886
+ type: "string",
1887
+ description: "Additional search query"
1888
+ },
1889
+ count: {
1890
+ type: "number",
1891
+ description: "Number of results to return (default: 20)"
1892
+ }
1893
+ },
1894
+ required: ["from_date", "to_date"]
1895
+ }
1896
+ },
1897
+ {
1898
+ name: "slack_get_workspace_stats",
1899
+ description: "Get workspace analytics and statistics",
1900
+ inputSchema: {
1901
+ type: "object",
1902
+ properties: {}
1903
+ }
1904
+ },
1905
+ {
1906
+ name: "slack_pin_message",
1907
+ description: "Pin a message to a channel",
1908
+ inputSchema: {
1909
+ type: "object",
1910
+ properties: {
1911
+ channel: {
1912
+ type: "string",
1913
+ description: "Channel ID where the message is"
1914
+ },
1915
+ timestamp: {
1916
+ type: "string",
1917
+ description: "Timestamp of the message to pin"
1918
+ }
1919
+ },
1920
+ required: ["channel", "timestamp"]
1921
+ }
1922
+ },
1923
+ {
1924
+ name: "slack_unpin_message",
1925
+ description: "Unpin a message from a channel",
1926
+ inputSchema: {
1927
+ type: "object",
1928
+ properties: {
1929
+ channel: {
1930
+ type: "string",
1931
+ description: "Channel ID where the message is"
1932
+ },
1933
+ timestamp: {
1934
+ type: "string",
1935
+ description: "Timestamp of the message to unpin"
1936
+ }
1937
+ },
1938
+ required: ["channel", "timestamp"]
1939
+ }
1940
+ },
1941
+ {
1942
+ name: "slack_delete_message",
1943
+ description: "Delete a message",
1944
+ inputSchema: {
1945
+ type: "object",
1946
+ properties: {
1947
+ channel: {
1948
+ type: "string",
1949
+ description: "Channel ID where the message is"
1950
+ },
1951
+ timestamp: {
1952
+ type: "string",
1953
+ description: "Timestamp of the message to delete"
1954
+ }
1955
+ },
1956
+ required: ["channel", "timestamp"]
1957
+ }
1958
+ },
1959
+ {
1960
+ name: "slack_edit_message",
1961
+ description: "Edit an existing message",
1962
+ inputSchema: {
1963
+ type: "object",
1964
+ properties: {
1965
+ channel: {
1966
+ type: "string",
1967
+ description: "Channel ID where the message is"
1968
+ },
1969
+ timestamp: {
1970
+ type: "string",
1971
+ description: "Timestamp of the message to edit"
1972
+ },
1973
+ text: {
1974
+ type: "string",
1975
+ description: "New text for the message"
1976
+ }
1977
+ },
1978
+ required: ["channel", "timestamp", "text"]
1979
+ }
1980
+ },
1981
+ {
1982
+ name: "slack_schedule_message",
1983
+ description: "Schedule a message to be sent later",
1984
+ inputSchema: {
1985
+ type: "object",
1986
+ properties: {
1987
+ channel: {
1988
+ type: "string",
1989
+ description: "Channel ID to send to"
1990
+ },
1991
+ text: {
1992
+ type: "string",
1993
+ description: "Message text"
1994
+ },
1995
+ post_at: {
1996
+ type: "number",
1997
+ description: "Unix timestamp when message should be sent"
1998
+ }
1999
+ },
2000
+ required: ["channel", "text", "post_at"]
2001
+ }
2002
+ },
2003
+ {
2004
+ name: "slack_get_user_status",
2005
+ description: "Get a user's current status",
2006
+ inputSchema: {
2007
+ type: "object",
2008
+ properties: {
2009
+ user_id: {
2010
+ type: "string",
2011
+ description: "User ID to get status for"
2012
+ }
2013
+ },
2014
+ required: ["user_id"]
2015
+ }
2016
+ },
2017
+ {
2018
+ name: "slack_get_user_profile",
2019
+ description: "Get detailed user profile information",
2020
+ inputSchema: {
2021
+ type: "object",
2022
+ properties: {
2023
+ user_id: {
2024
+ type: "string",
2025
+ description: "User ID to get profile for"
2026
+ }
2027
+ },
2028
+ required: ["user_id"]
2029
+ }
2030
+ },
2031
+ {
2032
+ name: "slack_create_reminder",
2033
+ description: "Create a reminder",
2034
+ inputSchema: {
2035
+ type: "object",
2036
+ properties: {
2037
+ text: {
2038
+ type: "string",
2039
+ description: "Reminder text"
2040
+ },
2041
+ time: {
2042
+ type: "string",
2043
+ description: "When to be reminded (e.g., 'in 20 minutes', 'tomorrow', '3:00pm')"
2044
+ }
2045
+ },
2046
+ required: ["text", "time"]
2047
+ }
2048
+ },
2049
+ {
2050
+ name: "slack_list_reminders",
2051
+ description: "List all active reminders",
2052
+ inputSchema: {
2053
+ type: "object",
2054
+ properties: {}
2055
+ }
2056
+ },
2057
+ {
2058
+ name: "slack_get_custom_emoji",
2059
+ description: "Get list of custom emoji in the workspace",
2060
+ inputSchema: {
2061
+ type: "object",
2062
+ properties: {}
2063
+ }
2064
+ },
2065
+ {
2066
+ name: "slack_send_formatted_message",
2067
+ description: "Send a message with rich formatting using Block Kit",
2068
+ inputSchema: {
2069
+ type: "object",
2070
+ properties: {
2071
+ channel: {
2072
+ type: "string",
2073
+ description: "Channel ID or name"
2074
+ },
2075
+ blocks: {
2076
+ type: "array",
2077
+ description: "Slack Block Kit blocks for rich formatting"
2078
+ },
2079
+ text: {
2080
+ type: "string",
2081
+ description: "Fallback text"
2082
+ }
2083
+ },
2084
+ required: ["channel", "blocks"]
2085
+ }
2086
+ },
2087
+ {
2088
+ name: "slack_audit_user_activity",
2089
+ description: "Get audit logs for user activity",
2090
+ inputSchema: {
2091
+ type: "object",
2092
+ properties: {
2093
+ user_id: {
2094
+ type: "string",
2095
+ description: "User ID to audit"
2096
+ },
2097
+ limit: {
2098
+ type: "number",
2099
+ description: "Number of audit entries to return"
2100
+ }
2101
+ },
2102
+ required: ["user_id"]
2103
+ }
2104
+ },
2105
+ {
2106
+ name: "slack_bulk_react_messages",
2107
+ description: "Add the same reaction to multiple messages",
2108
+ inputSchema: {
2109
+ type: "object",
2110
+ properties: {
2111
+ channel: {
2112
+ type: "string",
2113
+ description: "Channel ID"
2114
+ },
2115
+ timestamps: {
2116
+ type: "array",
2117
+ items: {
2118
+ type: "string"
2119
+ },
2120
+ description: "Array of message timestamps"
2121
+ },
2122
+ reaction: {
2123
+ type: "string",
2124
+ description: "Emoji name to react with"
2125
+ }
2126
+ },
2127
+ required: ["channel", "timestamps", "reaction"]
2128
+ }
2129
+ },
2130
+ {
2131
+ name: "slack_forward_message",
2132
+ description: "Forward a single message to another channel",
2133
+ inputSchema: {
2134
+ type: "object",
2135
+ properties: {
2136
+ source_channel: {
2137
+ type: "string",
2138
+ description: "Source channel ID"
2139
+ },
2140
+ timestamp: {
2141
+ type: "string",
2142
+ description: "Message timestamp to forward"
2143
+ },
2144
+ target_channel: {
2145
+ type: "string",
2146
+ description: "Target channel ID to forward to"
2147
+ },
2148
+ comment: {
2149
+ type: "string",
2150
+ description: "Optional comment when forwarding"
2151
+ }
2152
+ },
2153
+ required: ["source_channel", "timestamp", "target_channel"]
2154
+ }
2155
+ },
2156
+ {
2157
+ name: "slack_bulk_forward_messages",
2158
+ description: "Forward multiple messages to multiple channels",
2159
+ inputSchema: {
2160
+ type: "object",
2161
+ properties: {
2162
+ source_channel: {
2163
+ type: "string",
2164
+ description: "Source channel ID"
2165
+ },
2166
+ timestamps: {
2167
+ type: "array",
2168
+ items: {
2169
+ type: "string"
2170
+ },
2171
+ description: "Array of message timestamps"
2172
+ },
2173
+ target_channels: {
2174
+ type: "array",
2175
+ items: {
2176
+ type: "string"
2177
+ },
2178
+ description: "Array of target channel IDs"
2179
+ },
2180
+ comment: {
2181
+ type: "string",
2182
+ description: "Optional comment when forwarding"
2183
+ }
2184
+ },
2185
+ required: ["source_channel", "timestamps", "target_channels"]
2186
+ }
2187
+ },
2188
+ {
2189
+ name: "slack_get_thread_replies",
2190
+ description: "Get all replies in a message thread",
2191
+ inputSchema: {
2192
+ type: "object",
2193
+ properties: {
2194
+ channel: {
2195
+ type: "string",
2196
+ description: "Channel ID where the thread is"
2197
+ },
2198
+ thread_ts: {
2199
+ type: "string",
2200
+ description: "Timestamp of the parent message (thread starter)"
2201
+ },
2202
+ limit: {
2203
+ type: "number",
2204
+ description: "Number of replies to return (default: 100)"
2205
+ }
2206
+ },
2207
+ required: ["channel", "thread_ts"]
2208
+ }
2209
+ }
2210
+ ];
2211
+ return { tools };
2212
+ });
2213
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
2214
+ try {
2215
+ const { name, arguments: args } = request.params;
2216
+ switch (name) {
2217
+ // Account Management Tools
2218
+ case "list_accounts":
2219
+ return await this.listAccounts(args);
2220
+ case "switch_account":
2221
+ return await this.switchAccount(args);
2222
+ case "add_account":
2223
+ return await this.addAccount(args);
2224
+ case "remove_account":
2225
+ return await this.removeAccount(args);
2226
+ case "get_active_account":
2227
+ return await this.getActiveAccount(args);
2228
+ case "set_default_account":
2229
+ return await this.setDefaultAccount(args);
2230
+ case "update_account":
2231
+ return await this.updateAccount(args);
2232
+ // Original Slack Tools
2233
+ case "slack_list_channels":
2234
+ return await this.slackListChannels(args);
2235
+ case "slack_send_message":
2236
+ return await this.slackSendMessage(args);
2237
+ case "slack_get_channel_history":
2238
+ return await this.slackGetChannelHistory(args);
2239
+ case "slack_add_reaction":
2240
+ return await this.slackAddReaction(args);
2241
+ case "slack_list_users":
2242
+ return await this.slackListUsers(args);
2243
+ case "slack_get_user_by_name":
2244
+ return await this.slackGetUserByName(args);
2245
+ case "slack_get_user_info":
2246
+ return await this.slackGetUserInfo(args);
2247
+ case "slack_search_files":
2248
+ return await this.slackSearchFiles(args);
2249
+ case "slack_search_messages":
2250
+ return await this.slackSearchMessages(args);
2251
+ case "slack_search_by_user":
2252
+ return await this.slackSearchByUser(args);
2253
+ case "slack_search_by_date_range":
2254
+ return await this.slackSearchByDateRange(args);
2255
+ case "slack_get_workspace_stats":
2256
+ return await this.slackGetWorkspaceStats();
2257
+ case "slack_pin_message":
2258
+ return await this.slackPinMessage(args);
2259
+ case "slack_unpin_message":
2260
+ return await this.slackUnpinMessage(args);
2261
+ case "slack_delete_message":
2262
+ return await this.slackDeleteMessage(args);
2263
+ case "slack_edit_message":
2264
+ return await this.slackEditMessage(args);
2265
+ case "slack_schedule_message":
2266
+ return await this.slackScheduleMessage(args);
2267
+ case "slack_get_user_status":
2268
+ return await this.slackGetUserStatus(args);
2269
+ case "slack_get_user_profile":
2270
+ return await this.slackGetUserProfile(args);
2271
+ case "slack_create_reminder":
2272
+ return await this.slackCreateReminder(args);
2273
+ case "slack_list_reminders":
2274
+ return await this.slackListReminders();
2275
+ case "slack_get_custom_emoji":
2276
+ return await this.slackGetCustomEmoji();
2277
+ case "slack_send_formatted_message":
2278
+ return await this.slackSendFormattedMessage(args);
2279
+ case "slack_audit_user_activity":
2280
+ return await this.slackAuditUserActivity(args);
2281
+ case "slack_bulk_react_messages":
2282
+ return await this.slackBulkReactMessages(args);
2283
+ case "slack_forward_message":
2284
+ return await this.slackForwardMessage(args);
2285
+ case "slack_bulk_forward_messages":
2286
+ return await this.slackBulkForwardMessages(args);
2287
+ case "slack_get_thread_replies":
2288
+ return await this.slackGetThreadReplies(args);
2289
+ default:
2290
+ throw new Error(`Unknown tool: ${name}`);
2291
+ }
2292
+ }
2293
+ catch (error) {
2294
+ const errorMessage = error instanceof Error ? error.message : String(error);
2295
+ return {
2296
+ content: [
2297
+ {
2298
+ type: "text",
2299
+ text: `Error: ${errorMessage}`
2300
+ }
2301
+ ],
2302
+ isError: true
2303
+ };
2304
+ }
2305
+ });
2306
+ }
2307
+ async run() {
2308
+ const transport = new StdioServerTransport();
2309
+ await this.server.connect(transport);
2310
+ console.error("Slack MCP v3 server running on stdio");
2311
+ // Load persisted accounts after server is connected
2312
+ await this.loadPersistedAccounts();
2313
+ }
2314
+ }
2315
+ const server = new SlackerV3Server();
2316
+ server.run().catch(console.error);
2317
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHFCQUFxQixHQUV0QixNQUFNLG9DQUFvQyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBNEJ4Qix3RkFBd0Y7QUFDeEYsMkJBQTJCO0FBQzNCLHdGQUF3RjtBQUV4RixNQUFNLGlCQUFpQjtJQUNKLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQztJQUN6QyxNQUFNLEdBQVEsSUFBSSxDQUFDO0lBQ25CLGlCQUFpQixHQUFHLEtBQUssQ0FBQztJQUMxQixXQUFXLENBQWdCO0lBRW5DO1FBQ0UsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVPLEtBQUssQ0FBQyxVQUFVO1FBQ3RCLElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUNoQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsK0RBQStELENBQUMsQ0FBQztZQUM5RSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLGlCQUFpQjtRQUM3QixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDekIsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBcUI7UUFDckMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUUvQixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzVDLE9BQU8sQ0FBQyxJQUFJLENBQUMsMkRBQTJELENBQUMsQ0FBQztZQUMxRSxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sZ0JBQWdCLEdBQXFCO1lBQ3pDLEdBQUcsT0FBTztZQUNWLE9BQU8sRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUNqQyxRQUFRLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7U0FDbkMsQ0FBQztRQUVGLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQzdCLElBQUksQ0FBQyxZQUFZLEVBQ2pCLFNBQVMsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQy9CLENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMscUNBQXFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDOUQsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQXFCO1FBQ3ZDLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM1QyxPQUFPLENBQUMsSUFBSSxDQUFDLGtFQUFrRSxDQUFDLENBQUM7WUFDakYsT0FBTztRQUNULENBQUM7UUFFRCxtQ0FBbUM7UUFDbkMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuRCxNQUFNLGdCQUFnQixHQUFxQjtZQUN6QyxHQUFHLE9BQU87WUFDVixPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUN0RCxRQUFRLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7U0FDbkMsQ0FBQztRQUVGLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQzdCLElBQUksQ0FBQyxZQUFZLEVBQ2pCLFNBQVMsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQy9CLENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUNBQXVDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEUsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZTtRQUNuQixNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRS9CLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDNUMsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDekUsTUFBTSxRQUFRLEdBQXVCLEVBQUUsQ0FBQztZQUV4QyxLQUFLLE1BQU0sSUFBSSxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUMvQixJQUFJLENBQUM7b0JBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFxQixDQUFDO29CQUM5RCxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN6QixDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNuRSxDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMvRCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFpQjtRQUNoQyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRS9CLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDNUMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFNBQVMsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUN4RixJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQXFCLENBQUM7WUFDbEQsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLHlCQUF5QixTQUFTLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM1RCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFpQjtRQUNuQyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRS9CLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDNUMsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsU0FBUyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsU0FBUyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakUsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVztRQUNmLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDL0IsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztDQUNGO0FBRUQsd0ZBQXdGO0FBQ3hGLGdEQUFnRDtBQUNoRCx3RkFBd0Y7QUFFeEYsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRTVDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN2QyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQztDQUMzRCxDQUFDLENBQUM7QUFFSCxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDcEMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsc0NBQXNDLENBQUM7SUFDakUsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsMENBQTBDLENBQUM7SUFDMUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsaURBQWlELENBQUM7SUFDN0YsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO0NBQzlDLENBQUMsQ0FBQztBQUVILE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN2QyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQztDQUN4RCxDQUFDLENBQUM7QUFFSCxNQUFNLDBCQUEwQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFaEQsTUFBTSwyQkFBMkIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzNDLFVBQVUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLDhCQUE4QixDQUFDO0NBQ2hFLENBQUMsQ0FBQztBQUVILE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN2QyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQztJQUN2RCxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyw4Q0FBOEMsQ0FBQztJQUN6RixVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQywwQ0FBMEMsQ0FBQztDQUN2RixDQUFDLENBQUM7QUFFSCx3RkFBd0Y7QUFDeEYsb0RBQW9EO0FBQ3BELHdGQUF3RjtBQUV4RixNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDdEMsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsa0ZBQWtGLENBQUM7SUFDekgsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMscURBQXFELENBQUM7Q0FDN0YsQ0FBQyxDQUFDO0FBRUgsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3JDLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLG9EQUFvRCxDQUFDO0lBQ2xGLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLDZCQUE2QixDQUFDO0lBQ3hELFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLG9EQUFvRCxDQUFDO0NBQ2hHLENBQUMsQ0FBQztBQUVILE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMzQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxrQ0FBa0MsQ0FBQztJQUNoRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyw2Q0FBNkMsQ0FBQztDQUNyRixDQUFDLENBQUM7QUFFSCxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDckMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsaUNBQWlDLENBQUM7SUFDL0QsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsc0NBQXNDLENBQUM7SUFDdEUsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsc0NBQXNDLENBQUM7Q0FDbEUsQ0FBQyxDQUFDO0FBRUgsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ25DLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLGtEQUFrRCxDQUFDO0NBQzFGLENBQUMsQ0FBQztBQUVILE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN2QyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxvQ0FBb0MsQ0FBQztDQUNoRSxDQUFDLENBQUM7QUFFSCxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDckMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsa0NBQWtDLENBQUM7Q0FDakUsQ0FBQyxDQUFDO0FBRUgsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3JDLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDO0lBQ3BELEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLDJDQUEyQyxDQUFDO0lBQ2xGLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLHFDQUFxQyxDQUFDO0NBQzVFLENBQUMsQ0FBQztBQUVILE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN4QyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQztJQUN2RCxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQywyQ0FBMkMsQ0FBQztJQUNsRixJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxxQ0FBcUMsQ0FBQztDQUM1RSxDQUFDLENBQUM7QUFFSCxNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDdEMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsaUNBQWlDLENBQUM7SUFDL0QsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUM7SUFDaEUsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsMkNBQTJDLENBQUM7Q0FDbkYsQ0FBQyxDQUFDO0FBRUgsTUFBTSwyQkFBMkIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzNDLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLHlCQUF5QixDQUFDO0lBQ3pELE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDO0lBQ3JELEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLHlCQUF5QixDQUFDO0lBQ2hFLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLDJDQUEyQyxDQUFDO0NBQ25GLENBQUMsQ0FBQztBQUVILE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNwQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxpQ0FBaUMsQ0FBQztJQUMvRCxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxpQ0FBaUMsQ0FBQztDQUNsRSxDQUFDLENBQUM7QUFFSCxNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDdEMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsaUNBQWlDLENBQUM7SUFDL0QsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsbUNBQW1DLENBQUM7Q0FDcEUsQ0FBQyxDQUFDO0FBRUgsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3ZDLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGlDQUFpQyxDQUFDO0lBQy9ELFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLG9DQUFvQyxDQUFDO0NBQ3JFLENBQUMsQ0FBQztBQUVILE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNyQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxpQ0FBaUMsQ0FBQztJQUMvRCxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxrQ0FBa0MsQ0FBQztJQUNsRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQztDQUN0RCxDQUFDLENBQUM7QUFFSCxNQUFNLHlCQUF5QixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDekMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUM7SUFDckQsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDO0lBQ3pDLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLDRDQUE0QyxDQUFDO0NBQzNFLENBQUMsQ0FBQztBQUVILE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN2QyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQztDQUMxRCxDQUFDLENBQUM7QUFFSCxNQUFNLHdCQUF3QixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDeEMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsNEJBQTRCLENBQUM7Q0FDM0QsQ0FBQyxDQUFDO0FBRUgsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3hDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQztJQUMxQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxtRUFBbUUsQ0FBQztDQUMvRixDQUFDLENBQUM7QUFFSCxNQUFNLHVCQUF1QixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFN0MsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRTlDLE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUVqRCxNQUFNLDhCQUE4QixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDOUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUM7SUFDbEQsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLDRDQUE0QyxDQUFDO0lBQy9FLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQztDQUN0RCxDQUFDLENBQUM7QUFFSCxNQUFNLDJCQUEyQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDM0MsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO0lBQzFDLFVBQVUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyw2QkFBNkIsQ0FBQztJQUN2RSxRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQztDQUMxRCxDQUFDLENBQUM7QUFFSCxNQUFNLHdCQUF3QixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDeEMsY0FBYyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUM7SUFDeEQsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsOEJBQThCLENBQUM7SUFDOUQsY0FBYyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsaUNBQWlDLENBQUM7SUFDdEUsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsa0NBQWtDLENBQUM7Q0FDNUUsQ0FBQyxDQUFDO0FBRUgsTUFBTSw2QkFBNkIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzdDLGNBQWMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDO0lBQ3hELFVBQVUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyw2QkFBNkIsQ0FBQztJQUN2RSxlQUFlLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsNkJBQTZCLENBQUM7SUFDNUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsa0NBQWtDLENBQUM7Q0FDNUUsQ0FBQyxDQUFDO0FBRUgsTUFBTSwyQkFBMkIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzNDLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDO0lBQ2hELEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLG1DQUFtQyxDQUFDO0NBQzNFLENBQUMsQ0FBQztBQUVILE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMxQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxnQ0FBZ0MsQ0FBQztJQUM5RCxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxrREFBa0QsQ0FBQztJQUNsRixLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyw0Q0FBNEMsQ0FBQztDQUNwRixDQUFDLENBQUM7QUFFSCx3RkFBd0Y7QUFDeEYsb0JBQW9CO0FBQ3BCLHdGQUF3RjtBQUV4RixNQUFNLGVBQWU7SUFDWCxNQUFNLENBQVM7SUFDZixZQUFZLENBQWU7SUFDM0IsaUJBQWlCLENBQW9CO0lBRTdDO1FBQ0UsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FDdEI7WUFDRSxJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCLE9BQU8sRUFBRSxPQUFPO1NBQ2pCLEVBQ0Q7WUFDRSxZQUFZLEVBQUU7Z0JBQ1osS0FBSyxFQUFFLEVBQUU7YUFDVjtTQUNGLENBQ0YsQ0FBQztRQUVGLDJCQUEyQjtRQUMzQixJQUFJLENBQUMsWUFBWSxHQUFHO1lBQ2xCLFFBQVEsRUFBRSxJQUFJLEdBQUcsRUFBRTtZQUNuQixlQUFlLEVBQUUsSUFBSTtZQUNyQixPQUFPLEVBQUUsSUFBSSxHQUFHLEVBQUU7WUFDbEIsV0FBVyxFQUFFLElBQUksR0FBRyxFQUFFO1NBQ3ZCLENBQUM7UUFFRixnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUVqRCx3RUFBd0U7UUFDeEUsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFFaEMscURBQXFEO1FBQ3JELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsd0ZBQXdGO0lBQ3hGLDZCQUE2QjtJQUM3Qix3RkFBd0Y7SUFFaEYsS0FBSyxDQUFDLHFCQUFxQjtRQUNqQyxJQUFJLENBQUM7WUFDSCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDN0IsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUV6RSxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsaUJBQWlCLENBQUMsTUFBTSxzQ0FBc0MsQ0FBQyxDQUFDO1lBRXpGLEtBQUssTUFBTSxPQUFPLElBQUksaUJBQWlCLEVBQUUsQ0FBQztnQkFDeEMsNkNBQTZDO2dCQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO29CQUNoRCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDcEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUUvQixpREFBaUQ7b0JBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxDQUFDO3dCQUN2QyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO29CQUNqRCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQztZQUN4QyxPQUFPLENBQUMsS0FBSyxDQUFDLHNCQUFzQixRQUFRLElBQUksQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyx5REFBeUQsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsRixDQUFDO0lBQ0gsQ0FBQztJQUVPLHdCQUF3QjtRQUM5QixNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDO1FBQ3RELE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQztRQUN4RCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQztRQUNsRCxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUM7UUFFNUQsT0FBTyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsRUFBRTtZQUN0QyxpQkFBaUIsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUztZQUN0RCxrQkFBa0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ3hELGVBQWUsRUFBRSxhQUFhO1lBQzlCLG9CQUFvQixFQUFFLGtCQUFrQjtTQUN6QyxDQUFDLENBQUM7UUFFSCxJQUFJLGVBQWUsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNyQyxNQUFNLGNBQWMsR0FBaUI7Z0JBQ25DLEVBQUUsRUFBRSxTQUFTO2dCQUNiLElBQUksRUFBRSxrQkFBa0IsSUFBSSxtQkFBbUI7Z0JBQy9DLFNBQVMsRUFBRSxTQUFTLEVBQUUsK0JBQStCO2dCQUNyRCxNQUFNLEVBQUUsYUFBYTtnQkFDckIsUUFBUSxFQUFFLGVBQWU7Z0JBQ3pCLFNBQVMsRUFBRSxnQkFBZ0I7Z0JBQzNCLFNBQVMsRUFBRSxJQUFJO2FBQ2hCLENBQUM7WUFFRixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUNsRSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ3RELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUV0QyxtREFBbUQ7WUFDbkQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQy9ELE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0QsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVPLGdCQUFnQixDQUFDLE9BQXFCO1FBQzVDLHdCQUF3QjtRQUN4QixNQUFNLFNBQVMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFckQsbURBQW1EO1FBQ25ELElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sVUFBVSxHQUFHLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM1RCxDQUFDO0lBQ0gsQ0FBQztJQUVPLG1CQUFtQixDQUFDLEtBQWEsRUFBRSxJQUFvQjtRQUM3RCxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNuQixPQUFPLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkMsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxJQUFZO1FBQ3BDLDJDQUEyQztRQUMzQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFO2FBQzlCLE9BQU8sQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDO2FBQzFCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO2FBQ25CLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFekIsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQ2hCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUVoQixvQkFBb0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUMxQyxFQUFFLEdBQUcsR0FBRyxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7WUFDNUIsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRU8sS0FBSyxDQUFDLGVBQWU7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzR0FBc0csQ0FBQyxDQUFDO1FBQzFILENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksS0FBSyxDQUFDLHlGQUF5RixDQUFDLENBQUM7UUFDN0csQ0FBQztRQUVELDhCQUE4QjtRQUM5QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN4RixPQUFPLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUUzRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sS0FBSyxDQUFDLG1CQUFtQjtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7UUFDMUUsQ0FBQztRQUVELHdEQUF3RDtRQUN4RCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNsRixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLFNBQVMsQ0FBQyxLQUFhO1FBQzdCLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDcEMsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRCx3RkFBd0Y7SUFDeEYsMENBQTBDO0lBQzFDLHdGQUF3RjtJQUVoRixLQUFLLENBQUMsWUFBWSxDQUFDLElBQWE7UUFDdEMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRW5DLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQy9FLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTtZQUNkLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtZQUNsQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDNUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNO1lBQ3ZCLFVBQVUsRUFBRSxPQUFPLENBQUMsU0FBUyxJQUFJLEtBQUs7WUFDdEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlO1lBQzNELGNBQWMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVM7WUFDbkMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUMzQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7U0FDekUsQ0FBQyxDQUFDLENBQUM7UUFFSixPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO3dCQUNuQixjQUFjLEVBQUUsUUFBUSxDQUFDLE1BQU07d0JBQy9CLGlCQUFpQixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZTt3QkFDcEQsUUFBUSxFQUFFLFFBQVE7cUJBQ25CLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDWjthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQWE7UUFDdkMsTUFBTSxhQUFhLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFekUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLGFBQWEsQ0FBQyxVQUFVLDZEQUE2RCxDQUFDLENBQUM7UUFDckgsQ0FBQztRQUVELGtDQUFrQztRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBRUQsd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFFL0MscUNBQXFDO1FBQ3JDLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUUsQ0FBQztnQkFDMUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUMxQyxPQUFPLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLFNBQVMsQ0FBQztZQUN2RCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixvRUFBb0U7Z0JBQ3BFLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM1RSxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ25CLE9BQU8sRUFBRSxJQUFJO3dCQUNiLE9BQU8sRUFBRSxlQUFlLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLFNBQVMsR0FBRzt3QkFDN0QsT0FBTyxFQUFFOzRCQUNQLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTs0QkFDZCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7NEJBQ2xCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUzs0QkFDNUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNO3lCQUN4QjtxQkFDRixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQ1o7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFhO1FBQ3BDLE1BQU0sYUFBYSxHQUFHLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV2RCx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO1FBQ2xGLENBQUM7UUFFRCxJQUFJLGFBQWEsQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzVGLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztRQUNwRixDQUFDO1FBRUQsNkJBQTZCO1FBQzdCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFN0QscUJBQXFCO1FBQ3JCLE1BQU0sVUFBVSxHQUFpQjtZQUMvQixFQUFFLEVBQUUsU0FBUztZQUNiLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSTtZQUN4QixTQUFTLEVBQUUsU0FBUyxFQUFFLCtCQUErQjtZQUNyRCxNQUFNLEVBQUUsYUFBYSxDQUFDLE9BQU87WUFDN0IsUUFBUSxFQUFFLGFBQWEsQ0FBQyxTQUFTO1lBQ2pDLFNBQVMsRUFBRSxhQUFhLENBQUMsVUFBVTtZQUNuQyxTQUFTLEVBQUUsS0FBSztTQUNqQixDQUFDO1FBRUYsZ0RBQWdEO1FBQ2hELElBQUksQ0FBQztZQUNILE1BQU0sVUFBVSxHQUFHLElBQUksU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMxRCxNQUFNLFFBQVEsR0FBRyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDOUMsVUFBVSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxTQUFTLENBQUM7WUFFeEQseUJBQXlCO1lBQ3pCLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNwRSxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxhQUFhLENBQUMsT0FBTyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzdILENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0csQ0FBQztRQUVELGtCQUFrQjtRQUNsQixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVsQywrQ0FBK0M7UUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO1FBQ2hELENBQUM7UUFFRCxzQkFBc0I7UUFDdEIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3JELE9BQU87Z0JBQ0wsT0FBTyxFQUFFO29CQUNQO3dCQUNFLElBQUksRUFBRSxNQUFNO3dCQUNaLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDOzRCQUNuQixPQUFPLEVBQUUsSUFBSTs0QkFDYixPQUFPLEVBQUUsWUFBWSxhQUFhLENBQUMsSUFBSSxxQ0FBcUM7NEJBQzVFLE9BQU8sRUFBRTtnQ0FDUCxFQUFFLEVBQUUsU0FBUztnQ0FDYixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7Z0NBQ3JCLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUztnQ0FDakMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxNQUFNO2dDQUMxQixTQUFTLEVBQUUsU0FBUyxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZTs2QkFDM0Q7eUJBQ0YsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO3FCQUNaO2lCQUNGO2FBQ0YsQ0FBQztRQUNGLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2Ysa0NBQWtDO1lBQ2xDLE9BQU87Z0JBQ0wsT0FBTyxFQUFFO29CQUNQO3dCQUNFLElBQUksRUFBRSxNQUFNO3dCQUNaLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDOzRCQUNuQixPQUFPLEVBQUUsSUFBSTs0QkFDYixPQUFPLEVBQUUsWUFBWSxhQUFhLENBQUMsSUFBSSxrREFBa0Q7NEJBQ3pGLE9BQU8sRUFBRTtnQ0FDUCxFQUFFLEVBQUUsU0FBUztnQ0FDYixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7Z0NBQ3JCLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUztnQ0FDL0IsT0FBTyxFQUFFLFVBQVUsQ0FBQyxNQUFNO2dDQUMxQixTQUFTLEVBQUUsU0FBUyxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZTs2QkFDM0Q7eUJBQ0YsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO3FCQUNaO2lCQUNGO2FBQ0YsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFhO1FBQ3ZDLE1BQU0sYUFBYSxHQUFHLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXpFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxhQUFhLENBQUMsVUFBVSxjQUFjLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBRUQsc0NBQXNDO1FBQ3RDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxLQUFLLGFBQWEsQ0FBQyxVQUFVLENBQUM7UUFFakYsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRS9ELHdFQUF3RTtRQUN4RSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNqRyxDQUFDO1FBRUQsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDckUsT0FBTztnQkFDTCxPQUFPLEVBQUU7b0JBQ1A7d0JBQ0UsSUFBSSxFQUFFLE1BQU07d0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7NEJBQ25CLE9BQU8sRUFBRSxJQUFJOzRCQUNiLE9BQU8sRUFBRSxZQUFZLE9BQU8sQ0FBQyxJQUFJLDBDQUEwQzs0QkFDM0Usa0JBQWtCLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlOzRCQUNyRCxrQkFBa0IsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJO3lCQUNwRCxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7cUJBQ1o7aUJBQ0Y7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPO2dCQUNMLE9BQU8sRUFBRTtvQkFDUDt3QkFDRSxJQUFJLEVBQUUsTUFBTTt3QkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQzs0QkFDbkIsT0FBTyxFQUFFLElBQUk7NEJBQ2IsT0FBTyxFQUFFLFlBQVksT0FBTyxDQUFDLElBQUksdURBQXVEOzRCQUN4RixrQkFBa0IsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWU7NEJBQ3JELGtCQUFrQixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUk7eUJBQ3BELEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztxQkFDWjtpQkFDRjthQUNGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFhO1FBQzFDLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV2QyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN2QyxPQUFPO2dCQUNMLE9BQU8sRUFBRTtvQkFDUDt3QkFDRSxJQUFJLEVBQUUsTUFBTTt3QkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQzs0QkFDbkIsY0FBYyxFQUFFLElBQUk7NEJBQ3BCLE9BQU8sRUFBRSxnR0FBZ0c7eUJBQzFHLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztxQkFDWjtpQkFDRjthQUNGLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsT0FBTztnQkFDTCxPQUFPLEVBQUU7b0JBQ1A7d0JBQ0UsSUFBSSxFQUFFLE1BQU07d0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7NEJBQ25CLGNBQWMsRUFBRSxJQUFJOzRCQUNwQixLQUFLLEVBQUUsc0NBQXNDO3lCQUM5QyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7cUJBQ1o7aUJBQ0Y7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ25CLGNBQWMsRUFBRTs0QkFDZCxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7NEJBQ2QsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJOzRCQUNsQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7NEJBQzVCLE9BQU8sRUFBRSxPQUFPLENBQUMsTUFBTTs0QkFDdkIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxTQUFTLElBQUksS0FBSzs0QkFDdEMsY0FBYyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUzt5QkFDcEM7cUJBQ0YsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUNaO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFhO1FBQzNDLE1BQU0sYUFBYSxHQUFHLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXpFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxhQUFhLENBQUMsVUFBVSxjQUFjLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBRUQsdUNBQXVDO1FBQ3ZDLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUN0RCxHQUFHLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN4QixDQUFDO1FBRUQsa0JBQWtCO1FBQ2xCLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBRXpCLE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ25CLE9BQU8sRUFBRSxJQUFJO3dCQUNiLE9BQU8sRUFBRSxZQUFZLE9BQU8sQ0FBQyxJQUFJLGtCQUFrQjt3QkFDbkQsZUFBZSxFQUFFOzRCQUNmLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTs0QkFDZCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7NEJBQ2xCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUzt5QkFDN0I7cUJBQ0YsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUNaO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBYTtRQUN2QyxNQUFNLGFBQWEsR0FBRyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUV6RSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLFlBQVksYUFBYSxDQUFDLFVBQVUsY0FBYyxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUVELGtDQUFrQztRQUNsQyxJQUFJLGFBQWEsQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pGLE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztRQUNsRixDQUFDO1FBRUQsSUFBSSxhQUFhLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUM1RixNQUFNLElBQUksS0FBSyxDQUFDLGdFQUFnRSxDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUVELDBCQUEwQjtRQUMxQixJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxhQUFhLENBQUMsU0FBUyxJQUFJLGFBQWEsQ0FBQyxTQUFTLEtBQUssT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzVFLE9BQU8sQ0FBQyxRQUFRLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQztZQUMzQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7UUFFRCxJQUFJLGFBQWEsQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLGFBQWEsQ0FBQyxVQUFVLEtBQUssT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzdGLE9BQU8sQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQztZQUM3QyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7UUFFRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkIsT0FBTztnQkFDTCxPQUFPLEVBQUU7b0JBQ1A7d0JBQ0UsSUFBSSxFQUFFLE1BQU07d0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7NEJBQ25CLE9BQU8sRUFBRSxLQUFLOzRCQUNkLE9BQU8sRUFBRSwyQkFBMkI7eUJBQ3JDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztxQkFDWjtpQkFDRjthQUNGLENBQUM7UUFDSixDQUFDO1FBRUQsd0NBQXdDO1FBQ3hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUvQiw2Q0FBNkM7UUFDN0MsSUFBSSxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDO2dCQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFFLENBQUM7Z0JBQzFELE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDMUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDO1lBQy9ELENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDM0QsQ0FBQztRQUNILENBQUM7UUFFRCwwQkFBMEI7UUFDMUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELE9BQU87Z0JBQ0wsT0FBTyxFQUFFO29CQUNQO3dCQUNFLElBQUksRUFBRSxNQUFNO3dCQUNaLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDOzRCQUNuQixPQUFPLEVBQUUsSUFBSTs0QkFDYixPQUFPLEVBQUUsdUJBQXVCLE9BQU8sQ0FBQyxJQUFJLCtCQUErQjs0QkFDM0UsT0FBTyxFQUFFO2dDQUNQLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTtnQ0FDZCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7Z0NBQ2xCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztnQ0FDNUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNO2dDQUN2QixjQUFjLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTOzZCQUNwQzt5QkFDRixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7cUJBQ1o7aUJBQ0Y7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPO2dCQUNMLE9BQU8sRUFBRTtvQkFDUDt3QkFDRSxJQUFJLEVBQUUsTUFBTTt3QkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQzs0QkFDbkIsT0FBTyxFQUFFLElBQUk7NEJBQ2IsT0FBTyxFQUFFLHVCQUF1QixPQUFPLENBQUMsSUFBSSw0Q0FBNEM7NEJBQ3hGLE9BQU8sRUFBRTtnQ0FDUCxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7Z0NBQ2QsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO2dDQUNsQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7Z0NBQzVCLE9BQU8sRUFBRSxPQUFPLENBQUMsTUFBTTtnQ0FDdkIsY0FBYyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUzs2QkFDcEM7eUJBQ0YsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO3FCQUNaO2lCQUNGO2FBQ0YsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsd0ZBQXdGO0lBQ3hGLG1FQUFtRTtJQUNuRSx3RkFBd0Y7SUFFaEYsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQWE7UUFDM0MsTUFBTSxhQUFhLEdBQUcsc0JBQXNCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTVDLHVDQUF1QztRQUN2QyxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxNQUEwQixDQUFDO1FBRS9CLElBQUksQ0FBQztZQUNILEdBQUcsQ0FBQztnQkFDRixNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO29CQUM3QyxLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUssSUFBSSxnQ0FBZ0M7b0JBQzlELEtBQUssRUFBRSxhQUFhLENBQUMsS0FBSyxJQUFJLEdBQUc7b0JBQ2pDLGdCQUFnQixFQUFFLElBQUk7b0JBQ3RCLE1BQU0sRUFBRSxNQUFNO2lCQUNmLENBQUMsQ0FBQztnQkFFSCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDcEIsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdkMsQ0FBQztnQkFFRCxpQ0FBaUM7Z0JBQ2pDLE1BQU0sR0FBRyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxDQUFDO1lBQ2pELENBQUMsUUFBUSxNQUFNLEVBQUU7WUFFakIsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzNDLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTtnQkFDZCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7Z0JBQ2xCLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtnQkFDOUIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO2dCQUM1QixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLO2dCQUMzQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxLQUFLO2dCQUMvQixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7YUFDakMsQ0FBQyxDQUFDLENBQUM7WUFFSixPQUFPO2dCQUNMLE9BQU8sRUFBRTtvQkFDUDt3QkFDRSxJQUFJLEVBQUUsTUFBTTt3QkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztxQkFDeEM7aUJBQ0Y7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7WUFDcEIsd0JBQXdCO1lBQ3hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDekMsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDOUIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO2dCQUN0QixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7Z0JBQ2hCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtnQkFDaEIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO2FBQzdCLENBQUMsQ0FBQztZQUVILHlDQUF5QztZQUN6QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFnQixDQUFDLENBQUM7WUFDekYsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRTtnQkFDL0IsRUFBRSxFQUFFLGFBQWEsRUFBRSxFQUFFO2dCQUNyQixJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUk7Z0JBQ3pCLE1BQU0sRUFBRSxhQUFhLEVBQUUsTUFBTTtnQkFDN0IsUUFBUSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUzthQUN0RCxDQUFDLENBQUM7WUFFSCxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQWE7UUFDMUMsTUFBTSxhQUFhLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTVDLHlDQUF5QztRQUN6QyxJQUFJLFNBQVMsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDO1FBQ3RDLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlCLGtDQUFrQztZQUNsQyxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7Z0JBQzdDLEtBQUssRUFBRSxnQ0FBZ0M7Z0JBQ3ZDLEtBQUssRUFBRSxJQUFJO2FBQ1osQ0FBQyxDQUFDO1lBRUgsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFDO1lBQ3JFLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osU0FBUyxHQUFHLE9BQU8sQ0FBQyxFQUFHLENBQUM7WUFDMUIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxXQUFXLFlBQVksQ0FBQyxDQUFDO1lBQ3ZELENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUMzQyxPQUFPLEVBQUUsU0FBUztZQUNsQixJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUk7WUFDeEIsU0FBUyxFQUFFLGFBQWEsQ0FBQyxTQUFTO1NBQ25DLENBQUMsQ0FBQztRQUVILE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLHVDQUF1QyxNQUFNLENBQUMsT0FBTyxnQkFBZ0IsTUFBTSxDQUFDLEVBQUUsRUFBRTtpQkFDdkY7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLHNCQUFzQixDQUFDLElBQWE7UUFDaEQsTUFBTSxhQUFhLEdBQUcsMkJBQTJCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTVDLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUM7WUFDaEQsT0FBTyxFQUFFLGFBQWEsQ0FBQyxPQUFPO1lBQzlCLEtBQUssRUFBRSxhQUFhLENBQUMsS0FBSyxJQUFJLEdBQUc7U0FDbEMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtZQUNkLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtZQUNkLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUNWLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUztZQUN4QixXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7WUFDNUIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO2dCQUNaLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztnQkFDZCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7YUFDZixDQUFDLENBQUM7U0FDSixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFVixPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUN4QzthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBYTtRQUMxQyxNQUFNLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFNUMsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztZQUN6QixPQUFPLEVBQUUsYUFBYSxDQUFDLE9BQU87WUFDOUIsU0FBUyxFQUFFLGFBQWEsQ0FBQyxTQUFTO1lBQ2xDLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSTtTQUN6QixDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxhQUFhLGFBQWEsQ0FBQyxJQUFJLHNCQUFzQjtpQkFDNUQ7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFhO1FBQ3hDLE1BQU0sYUFBYSxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUU1QyxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ3JDLEtBQUssRUFBRSxhQUFhLENBQUMsS0FBSyxJQUFJLEdBQUc7U0FDbEMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2RixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDWCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWTtZQUN4QyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLO1lBQzFCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVztZQUN0QyxZQUFZLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZO1NBQ3pDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVWLE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQ3JDO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFhO1FBQzVDLE1BQU0sYUFBYSxHQUFHLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUU1QyxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFcEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDcEMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQ1osQ0FBQyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1lBQzFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztZQUMvQyxDQUFDLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQzVELENBQ0YsQ0FBQztRQUVGLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFFRCxPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO3dCQUNuQixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO3dCQUNmLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUzt3QkFDekIsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWTt3QkFDeEMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSzt3QkFDMUIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO3dCQUN2QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7cUJBQ3hCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDWjthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBYTtRQUMxQyxNQUFNLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFNUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUNyQyxJQUFJLEVBQUUsYUFBYSxDQUFDLE9BQU87U0FDNUIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUVELE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ25CLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQ2xCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUk7d0JBQ3RCLFNBQVMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVM7d0JBQ2hDLFlBQVksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZO3dCQUMvQyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSzt3QkFDakMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUs7d0JBQ2pDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLO3dCQUNqQyxXQUFXLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVzt3QkFDN0MsWUFBWSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFlBQVk7d0JBQy9DLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVE7d0JBQzlCLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVE7d0JBQzlCLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU07d0JBQzFCLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQ3hCLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU07cUJBQzNCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDWjthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBYTtRQUMxQyxNQUFNLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUVoRCxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ3ZDLEtBQUssRUFBRSxhQUFhLENBQUMsS0FBSztZQUMxQixLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2hDLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSSxJQUFJLENBQUM7U0FDOUIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoRCxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDWCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLEdBQUcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUNyQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1NBQ3pDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVWLE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ25CLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxDQUFDO3dCQUMvQixVQUFVLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxVQUFVO3dCQUNwQyxLQUFLLEVBQUUsS0FBSztxQkFDYixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQ1o7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLG1CQUFtQixDQUFDLElBQWE7UUFDN0MsTUFBTSxhQUFhLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFaEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUMxQyxLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUs7WUFDMUIsS0FBSyxFQUFFLGFBQWEsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNoQyxJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUksSUFBSSxDQUFDO1NBQzlCLENBQUMsQ0FBQztRQUVILE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckQsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1lBQ2QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1lBQ2QsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSTtZQUMxQixVQUFVLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzNCLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUNqQixTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVM7U0FDekIsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRVYsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQzt3QkFDbkIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLENBQUM7d0JBQ2xDLFVBQVUsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLFVBQVU7d0JBQ3ZDLFFBQVEsRUFBRSxRQUFRO3FCQUNuQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQ1o7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQWE7UUFDM0MsTUFBTSxhQUFhLEdBQUcsc0JBQXNCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFaEQsSUFBSSxLQUFLLEdBQUcsVUFBVSxhQUFhLENBQUMsT0FBTyxHQUFHLENBQUM7UUFDL0MsSUFBSSxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDeEIsS0FBSyxJQUFJLElBQUksYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JDLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1lBQzFDLEtBQUssRUFBRSxLQUFLO1lBQ1osS0FBSyxFQUFFLGFBQWEsQ0FBQyxLQUFLLElBQUksRUFBRTtTQUNqQyxDQUFDLENBQUM7UUFFSCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JELElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtZQUNkLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUk7WUFDMUIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUMzQixTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDakIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTO1NBQ3pCLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVWLE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ25CLEtBQUssRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxDQUFDO3dCQUNsQyxRQUFRLEVBQUUsUUFBUTtxQkFDbkIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUNaO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxJQUFhO1FBQ2hELE1BQU0sYUFBYSxHQUFHLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5RCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRWhELElBQUksS0FBSyxHQUFHLFNBQVMsYUFBYSxDQUFDLFNBQVMsV0FBVyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDL0UsSUFBSSxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDeEIsS0FBSyxJQUFJLElBQUksYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JDLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1lBQzFDLEtBQUssRUFBRSxLQUFLO1lBQ1osS0FBSyxFQUFFLGFBQWEsQ0FBQyxLQUFLLElBQUksRUFBRTtTQUNqQyxDQUFDLENBQUM7UUFFSCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JELElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtZQUNkLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtZQUNkLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUk7WUFDMUIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUMzQixTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDakIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTO1NBQ3pCLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVWLE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ25CLEtBQUssRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxDQUFDO3dCQUNsQyxVQUFVLEVBQUU7NEJBQ1YsSUFBSSxFQUFFLGFBQWEsQ0FBQyxTQUFTOzRCQUM3QixFQUFFLEVBQUUsYUFBYSxDQUFDLE9BQU87eUJBQzFCO3dCQUNELFFBQVEsRUFBRSxRQUFRO3FCQUNuQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQ1o7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFhO1FBQ3pDLE1BQU0sYUFBYSxHQUFHLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2RCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUU1QyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ3BCLE9BQU8sRUFBRSxhQUFhLENBQUMsT0FBTztZQUM5QixTQUFTLEVBQUUsYUFBYSxDQUFDLFNBQVM7U0FDbkMsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsNkJBQTZCO2lCQUNwQzthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBYTtRQUMzQyxNQUFNLGFBQWEsR0FBRyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFNUMsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUN2QixPQUFPLEVBQUUsYUFBYSxDQUFDLE9BQU87WUFDOUIsU0FBUyxFQUFFLGFBQWEsQ0FBQyxTQUFTO1NBQ25DLENBQUMsQ0FBQztRQUVILE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLCtCQUErQjtpQkFDdEM7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQWE7UUFDNUMsTUFBTSxhQUFhLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFaEQsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUN2QixPQUFPLEVBQUUsYUFBYSxDQUFDLE9BQU87WUFDOUIsRUFBRSxFQUFFLGFBQWEsQ0FBQyxTQUFTO1NBQzVCLENBQUMsQ0FBQztRQUVILE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLDhCQUE4QjtpQkFDckM7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQWE7UUFDMUMsTUFBTSxhQUFhLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFaEQsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUN2QixPQUFPLEVBQUUsYUFBYSxDQUFDLE9BQU87WUFDOUIsRUFBRSxFQUFFLGFBQWEsQ0FBQyxTQUFTO1lBQzNCLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSTtTQUN6QixDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSw2QkFBNkI7aUJBQ3BDO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxJQUFhO1FBQzlDLE1BQU0sYUFBYSxHQUFHLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1RCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUU1QyxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQy9DLE9BQU8sRUFBRSxhQUFhLENBQUMsT0FBTztZQUM5QixJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUk7WUFDeEIsT0FBTyxFQUFFLGFBQWEsQ0FBQyxPQUFPO1NBQy9CLENBQUMsQ0FBQztRQUVILE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLHlEQUF5RCxNQUFNLENBQUMsb0JBQW9CLEVBQUU7aUJBQzdGO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFhO1FBQzVDLE1BQU0sYUFBYSxHQUFHLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUU1QyxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ3JDLElBQUksRUFBRSxhQUFhLENBQUMsT0FBTztTQUM1QixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBRUQsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQzt3QkFDbkIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDdkIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsSUFBSSxFQUFFO3dCQUNuRCxZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxJQUFJLEVBQUU7d0JBQ3JELGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGlCQUFpQixJQUFJLENBQUM7cUJBQy9ELEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDWjthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsbUJBQW1CLENBQUMsSUFBYTtRQUM3QyxNQUFNLGFBQWEsR0FBRyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFNUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDNUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxPQUFPO1NBQzVCLENBQUMsQ0FBQztRQUVILE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUM5QzthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsbUJBQW1CLENBQUMsSUFBYTtRQUM3QyxNQUFNLGFBQWEsR0FBRyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUVoRCxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO1lBQ3hDLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSTtZQUN4QixJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUk7U0FDekIsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQzt3QkFDbkIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRTt3QkFDaEMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSTt3QkFDM0IsSUFBSSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSTt3QkFDM0IsV0FBVyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsV0FBVztxQkFDMUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUNaO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxrQkFBa0I7UUFDOUIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUVoRCxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFN0MsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtZQUNSLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtZQUNaLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtZQUNaLFdBQVcsRUFBRSxDQUFDLENBQUMsV0FBVztZQUMxQixTQUFTLEVBQUUsQ0FBQyxDQUFDLFNBQVM7U0FDdkIsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRVYsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDekM7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLG1CQUFtQjtRQUMvQixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUU1QyxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFekMsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUNsRDthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMseUJBQXlCLENBQUMsSUFBYTtRQUNuRCxNQUFNLGFBQWEsR0FBRyw4QkFBOEIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakUsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFNUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUMzQyxPQUFPLEVBQUUsYUFBYSxDQUFDLE9BQU87WUFDOUIsTUFBTSxFQUFFLGFBQWEsQ0FBQyxNQUFNO1lBQzVCLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSSxJQUFJLG1CQUFtQjtTQUNoRCxDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxpREFBaUQsTUFBTSxDQUFDLE9BQU8sZ0JBQWdCLE1BQU0sQ0FBQyxFQUFFLEVBQUU7aUJBQ2pHO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxJQUFhO1FBQ2hELE1BQU0sYUFBYSxHQUFHLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5RCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRWhELDJDQUEyQztRQUMzQyxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1lBQzFDLEtBQUssRUFBRSxVQUFVLGFBQWEsQ0FBQyxPQUFPLEdBQUc7WUFDekMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNoQyxJQUFJLEVBQUUsV0FBVztZQUNqQixRQUFRLEVBQUUsTUFBTTtTQUNqQixDQUFDLENBQUM7UUFFSCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JELElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDcEYsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSTtZQUMxQixTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDakIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTO1NBQ3pCLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVWLE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ25CLE9BQU8sRUFBRSxhQUFhLENBQUMsT0FBTzt3QkFDOUIsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksQ0FBQzt3QkFDakQsZUFBZSxFQUFFLFFBQVE7cUJBQzFCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDWjthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsc0JBQXNCLENBQUMsSUFBYTtRQUNoRCxNQUFNLGFBQWEsR0FBRywyQkFBMkIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFNUMsTUFBTSxPQUFPLEdBQUc7WUFDZCxVQUFVLEVBQUUsQ0FBQztZQUNiLE1BQU0sRUFBRSxDQUFDO1lBQ1QsTUFBTSxFQUFFLEVBQWM7U0FDdkIsQ0FBQztRQUVGLEtBQUssTUFBTSxTQUFTLElBQUksYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQztnQkFDSCxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO29CQUN6QixPQUFPLEVBQUUsYUFBYSxDQUFDLE9BQU87b0JBQzlCLFNBQVMsRUFBRSxTQUFTO29CQUNwQixJQUFJLEVBQUUsYUFBYSxDQUFDLFFBQVE7aUJBQzdCLENBQUMsQ0FBQztnQkFDSCxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdkIsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNqQixPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsS0FBSyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2pHLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDdkM7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLG1CQUFtQixDQUFDLElBQWE7UUFDN0MsTUFBTSxhQUFhLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTVDLDJCQUEyQjtRQUMzQixNQUFNLE9BQU8sR0FBRyxNQUFNLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDO1lBQ2pELE9BQU8sRUFBRSxhQUFhLENBQUMsY0FBYztZQUNyQyxNQUFNLEVBQUUsYUFBYSxDQUFDLFNBQVM7WUFDL0IsS0FBSyxFQUFFLENBQUM7WUFDUixTQUFTLEVBQUUsSUFBSTtTQUNoQixDQUFDLENBQUM7UUFFSCxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBRUQsZ0JBQWdCO1FBQ2hCLElBQUksUUFBUSxHQUFHLGNBQWMsQ0FBQztRQUM5QixJQUFJLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDekUsUUFBUSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLGNBQWMsQ0FBQztZQUMvRSxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLDRCQUE0QjtZQUM5QixDQUFDO1FBQ0gsQ0FBQztRQUVELCtCQUErQjtRQUMvQixJQUFJLGFBQWEsR0FBRyxvQkFBb0IsYUFBYSxDQUFDLGNBQWMsb0JBQW9CLFFBQVEsV0FBVyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEksSUFBSSxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDMUIsYUFBYSxHQUFHLEdBQUcsYUFBYSxDQUFDLE9BQU8sT0FBTyxhQUFhLEVBQUUsQ0FBQztRQUNqRSxDQUFDO1FBRUQseUJBQXlCO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDM0MsT0FBTyxFQUFFLGFBQWEsQ0FBQyxjQUFjO1lBQ3JDLElBQUksRUFBRSxhQUFhO1NBQ3BCLENBQUMsQ0FBQztRQUVILE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLHVDQUF1QyxhQUFhLENBQUMsY0FBYyxpQkFBaUIsTUFBTSxDQUFDLEVBQUUsRUFBRTtpQkFDdEc7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLHdCQUF3QixDQUFDLElBQWE7UUFDbEQsTUFBTSxhQUFhLEdBQUcsNkJBQTZCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTVDLG1CQUFtQjtRQUNuQixNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDcEIsS0FBSyxNQUFNLFNBQVMsSUFBSSxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDakQsTUFBTSxPQUFPLEdBQUcsTUFBTSxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztnQkFDakQsT0FBTyxFQUFFLGFBQWEsQ0FBQyxjQUFjO2dCQUNyQyxNQUFNLEVBQUUsU0FBUztnQkFDakIsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsU0FBUyxFQUFFLElBQUk7YUFDaEIsQ0FBQyxDQUFDO1lBRUgsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckMsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFFRCxpQ0FBaUM7UUFDakMsTUFBTSxPQUFPLEdBQUc7WUFDZCxVQUFVLEVBQUUsQ0FBQztZQUNiLE1BQU0sRUFBRSxDQUFDO1lBQ1QsTUFBTSxFQUFFLEVBQWM7U0FDdkIsQ0FBQztRQUVGLEtBQUssTUFBTSxhQUFhLElBQUksYUFBYSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzFELElBQUksQ0FBQztnQkFDSCxnQ0FBZ0M7Z0JBQ2hDLElBQUksWUFBWSxHQUFHLGFBQWEsUUFBUSxDQUFDLE1BQU0sb0JBQW9CLGFBQWEsQ0FBQyxjQUFjLFFBQVEsQ0FBQztnQkFDeEcsSUFBSSxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQzFCLFlBQVksR0FBRyxHQUFHLGFBQWEsQ0FBQyxPQUFPLE9BQU8sWUFBWSxFQUFFLENBQUM7Z0JBQy9ELENBQUM7Z0JBRUQsS0FBSyxNQUFNLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDM0IsSUFBSSxRQUFRLEdBQUcsY0FBYyxDQUFDO29CQUM5QixJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDYixJQUFJLENBQUM7NEJBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQzs0QkFDN0QsUUFBUSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLGNBQWMsQ0FBQzt3QkFDL0UsQ0FBQzt3QkFBQyxNQUFNLENBQUM7NEJBQ1AsNEJBQTRCO3dCQUM5QixDQUFDO29CQUNILENBQUM7b0JBQ0QsWUFBWSxJQUFJLFFBQVEsUUFBUSxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQztnQkFDdkQsQ0FBQztnQkFFRCxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO29CQUM1QixPQUFPLEVBQUUsYUFBYTtvQkFDdEIsSUFBSSxFQUFFLFlBQVk7aUJBQ25CLENBQUMsQ0FBQztnQkFDSCxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdkIsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNqQixPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLGFBQWEsS0FBSyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JHLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDdkM7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLHFCQUFxQixDQUFDLElBQWE7UUFDL0MsTUFBTSxhQUFhLEdBQUcsMEJBQTBCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTVDLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUM7WUFDaEQsT0FBTyxFQUFFLGFBQWEsQ0FBQyxPQUFPO1lBQzlCLEVBQUUsRUFBRSxhQUFhLENBQUMsU0FBUztZQUMzQixLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUssSUFBSSxHQUFHO1NBQ2xDLENBQUMsQ0FBQztRQUVILE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMzQyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7WUFDZCxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7WUFDZCxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDVixTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVM7WUFDeEIsY0FBYyxFQUFFLEdBQUcsQ0FBQyxjQUFjO1lBQ2xDLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2xDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtnQkFDWixLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7Z0JBQ2QsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO2FBQ2YsQ0FBQyxDQUFDO1NBQ0osQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRVYsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQzt3QkFDbkIsU0FBUyxFQUFFLGFBQWEsQ0FBQyxTQUFTO3dCQUNsQyxXQUFXLEVBQUUsT0FBTyxDQUFDLE1BQU07d0JBQzNCLE9BQU8sRUFBRSxPQUFPO3FCQUNqQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQ1o7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLHNCQUFzQjtRQUNsQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUU1QyxnQkFBZ0I7UUFDaEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRTFDLGlCQUFpQjtRQUNqQixNQUFNLEtBQUssR0FBRyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUU5RSxvQkFBb0I7UUFDcEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztZQUMvQyxLQUFLLEVBQUUsZ0NBQWdDO1NBQ3hDLENBQUMsQ0FBQztRQUVILE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ25CLElBQUksRUFBRTs0QkFDSixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJOzRCQUN6QixNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNOzRCQUM3QixZQUFZLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxZQUFZO3lCQUMxQzt3QkFDRCxLQUFLLEVBQUU7NEJBQ0wsV0FBVyxFQUFFLFdBQVcsQ0FBQyxNQUFNOzRCQUMvQixjQUFjLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxNQUFNLElBQUksQ0FBQzs0QkFDOUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTTs0QkFDbEQsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTTt5QkFDbkQ7cUJBQ0YsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUNaO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELHdGQUF3RjtJQUN4RixzQ0FBc0M7SUFDdEMsd0ZBQXdGO0lBRWhGLGFBQWE7UUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxzQkFBc0IsRUFBRSxLQUFLLElBQUksRUFBRTtZQUMvRCxNQUFNLEtBQUssR0FBVztnQkFDcEIsMkJBQTJCO2dCQUMzQjtvQkFDRSxJQUFJLEVBQUUsZUFBZTtvQkFDckIsV0FBVyxFQUFFLHNEQUFzRDtvQkFDbkUsV0FBVyxFQUFFO3dCQUNYLElBQUksRUFBRSxRQUFRO3dCQUNkLFVBQVUsRUFBRSxFQUFFO3FCQUNmO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSxnQkFBZ0I7b0JBQ3RCLFdBQVcsRUFBRSx1Q0FBdUM7b0JBQ3BELFdBQVcsRUFBRTt3QkFDWCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsVUFBVSxFQUFFO2dDQUNWLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSx5QkFBeUI7NkJBQ3ZDO3lCQUNGO3dCQUNELFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQztxQkFDekI7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLGFBQWE7b0JBQ25CLFdBQVcsRUFBRSx5Q0FBeUM7b0JBQ3RELFdBQVcsRUFBRTt3QkFDWCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsSUFBSSxFQUFFO2dDQUNKLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxzQ0FBc0M7NkJBQ3BEOzRCQUNELFNBQVMsRUFBRTtnQ0FDVCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsMENBQTBDOzZCQUN4RDs0QkFDRCxVQUFVLEVBQUU7Z0NBQ1YsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLGlEQUFpRDs2QkFDL0Q7NEJBQ0QsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxlQUFlOzZCQUM3Qjt5QkFDRjt3QkFDRCxRQUFRLEVBQUUsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQztxQkFDM0M7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLGdCQUFnQjtvQkFDdEIsV0FBVyxFQUFFLHdDQUF3QztvQkFDckQsV0FBVyxFQUFFO3dCQUNYLElBQUksRUFBRSxRQUFRO3dCQUNkLFVBQVUsRUFBRTs0QkFDVixVQUFVLEVBQUU7Z0NBQ1YsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLHNCQUFzQjs2QkFDcEM7eUJBQ0Y7d0JBQ0QsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO3FCQUN6QjtpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsb0JBQW9CO29CQUMxQixXQUFXLEVBQUUsNkNBQTZDO29CQUMxRCxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFLEVBQUU7cUJBQ2Y7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLHFCQUFxQjtvQkFDM0IsV0FBVyxFQUFFLGdEQUFnRDtvQkFDN0QsV0FBVyxFQUFFO3dCQUNYLElBQUksRUFBRSxRQUFRO3dCQUNkLFVBQVUsRUFBRTs0QkFDVixVQUFVLEVBQUU7Z0NBQ1YsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLDhCQUE4Qjs2QkFDNUM7eUJBQ0Y7d0JBQ0QsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO3FCQUN6QjtpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsZ0JBQWdCO29CQUN0QixXQUFXLEVBQUUsc0RBQXNEO29CQUNuRSxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFOzRCQUNWLFVBQVUsRUFBRTtnQ0FDVixJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsc0JBQXNCOzZCQUNwQzs0QkFDRCxTQUFTLEVBQUU7Z0NBQ1QsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLDhDQUE4Qzs2QkFDNUQ7NEJBQ0QsVUFBVSxFQUFFO2dDQUNWLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSwwQ0FBMEM7NkJBQ3hEO3lCQUNGO3dCQUNELFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQztxQkFDekI7aUJBQ0Y7Z0JBRUQsMkRBQTJEO2dCQUMzRDtvQkFDRSxJQUFJLEVBQUUscUJBQXFCO29CQUMzQixXQUFXLEVBQUUsb0NBQW9DO29CQUNqRCxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFOzRCQUNWLEtBQUssRUFBRTtnQ0FDTCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsa0ZBQWtGOzZCQUNoRzs0QkFDRCxLQUFLLEVBQUU7Z0NBQ0wsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLHFEQUFxRDs2QkFDbkU7eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLG9CQUFvQjtvQkFDMUIsV0FBVyxFQUFFLG1DQUFtQztvQkFDaEQsV0FBVyxFQUFFO3dCQUNYLElBQUksRUFBRSxRQUFRO3dCQUNkLFVBQVUsRUFBRTs0QkFDVixPQUFPLEVBQUU7Z0NBQ1AsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLG9EQUFvRDs2QkFDbEU7NEJBQ0QsSUFBSSxFQUFFO2dDQUNKLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSw2QkFBNkI7NkJBQzNDOzRCQUNELFNBQVMsRUFBRTtnQ0FDVCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsb0RBQW9EOzZCQUNsRTt5QkFDRjt3QkFDRCxRQUFRLEVBQUUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDO3FCQUM5QjtpQkFDRjtnQkFFRDtvQkFDRSxJQUFJLEVBQUUsMkJBQTJCO29CQUNqQyxXQUFXLEVBQUUsMENBQTBDO29CQUN2RCxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFOzRCQUNWLE9BQU8sRUFBRTtnQ0FDUCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsa0NBQWtDOzZCQUNoRDs0QkFDRCxLQUFLLEVBQUU7Z0NBQ0wsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLDZDQUE2Qzs2QkFDM0Q7eUJBQ0Y7d0JBQ0QsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDO3FCQUN0QjtpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsb0JBQW9CO29CQUMxQixXQUFXLEVBQUUsbUNBQW1DO29CQUNoRCxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFOzRCQUNWLE9BQU8sRUFBRTtnQ0FDUCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsaUNBQWlDOzZCQUMvQzs0QkFDRCxTQUFTLEVBQUU7Z0NBQ1QsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLHNDQUFzQzs2QkFDcEQ7NEJBQ0QsSUFBSSxFQUFFO2dDQUNKLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxzQ0FBc0M7NkJBQ3BEO3lCQUNGO3dCQUNELFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDO3FCQUMzQztpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsa0JBQWtCO29CQUN4QixXQUFXLEVBQUUsaUNBQWlDO29CQUM5QyxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFOzRCQUNWLEtBQUssRUFBRTtnQ0FDTCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsa0RBQWtEOzZCQUNoRTt5QkFDRjtxQkFDRjtpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsd0JBQXdCO29CQUM5QixXQUFXLEVBQUUsNENBQTRDO29CQUN6RCxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFOzRCQUNWLElBQUksRUFBRTtnQ0FDSixJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsb0NBQW9DOzZCQUNsRDt5QkFDRjt3QkFDRCxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUM7cUJBQ25CO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSxxQkFBcUI7b0JBQzNCLFdBQVcsRUFBRSx3Q0FBd0M7b0JBQ3JELFdBQVcsRUFBRTt3QkFDWCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxrQ0FBa0M7NkJBQ2hEO3lCQUNGO3dCQUNELFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQztxQkFDdEI7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLG9CQUFvQjtvQkFDMUIsV0FBVyxFQUFFLG1DQUFtQztvQkFDaEQsV0FBVyxFQUFFO3dCQUNYLElBQUksRUFBRSxRQUFRO3dCQUNkLFVBQVUsRUFBRTs0QkFDVixLQUFLLEVBQUU7Z0NBQ0wsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLHdCQUF3Qjs2QkFDdEM7NEJBQ0QsS0FBSyxFQUFFO2dDQUNMLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSwyQ0FBMkM7NkJBQ3pEOzRCQUNELElBQUksRUFBRTtnQ0FDSixJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUscUNBQXFDOzZCQUNuRDt5QkFDRjt3QkFDRCxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUM7cUJBQ3BCO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSx1QkFBdUI7b0JBQzdCLFdBQVcsRUFBRSwwQ0FBMEM7b0JBQ3ZELFdBQVcsRUFBRTt3QkFDWCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsS0FBSyxFQUFFO2dDQUNMLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSwyQkFBMkI7NkJBQ3pDOzRCQUNELEtBQUssRUFBRTtnQ0FDTCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsMkNBQTJDOzZCQUN6RDs0QkFDRCxJQUFJLEVBQUU7Z0NBQ0osSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLHFDQUFxQzs2QkFDbkQ7eUJBQ0Y7d0JBQ0QsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDO3FCQUNwQjtpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsc0JBQXNCO29CQUM1QixXQUFXLEVBQUUsMENBQTBDO29CQUN2RCxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFOzRCQUNWLE9BQU8sRUFBRTtnQ0FDUCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsaUNBQWlDOzZCQUMvQzs0QkFDRCxLQUFLLEVBQUU7Z0NBQ0wsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLHlCQUF5Qjs2QkFDdkM7NEJBQ0QsS0FBSyxFQUFFO2dDQUNMLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSwyQ0FBMkM7NkJBQ3pEO3lCQUNGO3dCQUNELFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQztxQkFDdEI7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLDRCQUE0QjtvQkFDbEMsV0FBVyxFQUFFLHlDQUF5QztvQkFDdEQsV0FBVyxFQUFFO3dCQUNYLElBQUksRUFBRSxRQUFRO3dCQUNkLFVBQVUsRUFBRTs0QkFDVixTQUFTLEVBQUU7Z0NBQ1QsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLHlCQUF5Qjs2QkFDdkM7NEJBQ0QsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSx1QkFBdUI7NkJBQ3JDOzRCQUNELEtBQUssRUFBRTtnQ0FDTCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUseUJBQXlCOzZCQUN2Qzs0QkFDRCxLQUFLLEVBQUU7Z0NBQ0wsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLDJDQUEyQzs2QkFDekQ7eUJBQ0Y7d0JBQ0QsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQztxQkFDbkM7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLDJCQUEyQjtvQkFDakMsV0FBVyxFQUFFLHdDQUF3QztvQkFDckQsV0FBVyxFQUFFO3dCQUNYLElBQUksRUFBRSxRQUFRO3dCQUNkLFVBQVUsRUFBRSxFQUFFO3FCQUNmO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSxtQkFBbUI7b0JBQ3pCLFdBQVcsRUFBRSw0QkFBNEI7b0JBQ3pDLFdBQVcsRUFBRTt3QkFDWCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxpQ0FBaUM7NkJBQy9DOzRCQUNELFNBQVMsRUFBRTtnQ0FDVCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsaUNBQWlDOzZCQUMvQzt5QkFDRjt3QkFDRCxRQUFRLEVBQUUsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDO3FCQUNuQztpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUscUJBQXFCO29CQUMzQixXQUFXLEVBQUUsZ0NBQWdDO29CQUM3QyxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFOzRCQUNWLE9BQU8sRUFBRTtnQ0FDUCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsaUNBQWlDOzZCQUMvQzs0QkFDRCxTQUFTLEVBQUU7Z0NBQ1QsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLG1DQUFtQzs2QkFDakQ7eUJBQ0Y7d0JBQ0QsUUFBUSxFQUFFLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQztxQkFDbkM7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLHNCQUFzQjtvQkFDNUIsV0FBVyxFQUFFLGtCQUFrQjtvQkFDL0IsV0FBVyxFQUFFO3dCQUNYLElBQUksRUFBRSxRQUFRO3dCQUNkLFVBQVUsRUFBRTs0QkFDVixPQUFPLEVBQUU7Z0NBQ1AsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLGlDQUFpQzs2QkFDL0M7NEJBQ0QsU0FBUyxFQUFFO2dDQUNULElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxvQ0FBb0M7NkJBQ2xEO3lCQUNGO3dCQUNELFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUM7cUJBQ25DO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSxvQkFBb0I7b0JBQzFCLFdBQVcsRUFBRSwwQkFBMEI7b0JBQ3ZDLFdBQVcsRUFBRTt3QkFDWCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxpQ0FBaUM7NkJBQy9DOzRCQUNELFNBQVMsRUFBRTtnQ0FDVCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsa0NBQWtDOzZCQUNoRDs0QkFDRCxJQUFJLEVBQUU7Z0NBQ0osSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLDBCQUEwQjs2QkFDeEM7eUJBQ0Y7d0JBQ0QsUUFBUSxFQUFFLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUM7cUJBQzNDO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSx3QkFBd0I7b0JBQzlCLFdBQVcsRUFBRSxxQ0FBcUM7b0JBQ2xELFdBQVcsRUFBRTt3QkFDWCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSx1QkFBdUI7NkJBQ3JDOzRCQUNELElBQUksRUFBRTtnQ0FDSixJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsY0FBYzs2QkFDNUI7NEJBQ0QsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSw0Q0FBNEM7NkJBQzFEO3lCQUNGO3dCQUNELFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDO3FCQUN6QztpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsdUJBQXVCO29CQUM3QixXQUFXLEVBQUUsNkJBQTZCO29CQUMxQyxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFOzRCQUNWLE9BQU8sRUFBRTtnQ0FDUCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsMkJBQTJCOzZCQUN6Qzt5QkFDRjt3QkFDRCxRQUFRLEVBQUUsQ0FBQyxTQUFTLENBQUM7cUJBQ3RCO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSx3QkFBd0I7b0JBQzlCLFdBQVcsRUFBRSx1Q0FBdUM7b0JBQ3BELFdBQVcsRUFBRTt3QkFDWCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSw0QkFBNEI7NkJBQzFDO3lCQUNGO3dCQUNELFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQztxQkFDdEI7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLHVCQUF1QjtvQkFDN0IsV0FBVyxFQUFFLG1CQUFtQjtvQkFDaEMsV0FBVyxFQUFFO3dCQUNYLElBQUksRUFBRSxRQUFRO3dCQUNkLFVBQVUsRUFBRTs0QkFDVixJQUFJLEVBQUU7Z0NBQ0osSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLGVBQWU7NkJBQzdCOzRCQUNELElBQUksRUFBRTtnQ0FDSixJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsbUVBQW1FOzZCQUNqRjt5QkFDRjt3QkFDRCxRQUFRLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO3FCQUMzQjtpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsc0JBQXNCO29CQUM1QixXQUFXLEVBQUUsMkJBQTJCO29CQUN4QyxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFLEVBQUU7cUJBQ2Y7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLHdCQUF3QjtvQkFDOUIsV0FBVyxFQUFFLDJDQUEyQztvQkFDeEQsV0FBVyxFQUFFO3dCQUNYLElBQUksRUFBRSxRQUFRO3dCQUNkLFVBQVUsRUFBRSxFQUFFO3FCQUNmO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSw4QkFBOEI7b0JBQ3BDLFdBQVcsRUFBRSxxREFBcUQ7b0JBQ2xFLFdBQVcsRUFBRTt3QkFDWCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxvQkFBb0I7NkJBQ2xDOzRCQUNELE1BQU0sRUFBRTtnQ0FDTixJQUFJLEVBQUUsT0FBTztnQ0FDYixXQUFXLEVBQUUsNENBQTRDOzZCQUMxRDs0QkFDRCxJQUFJLEVBQUU7Z0NBQ0osSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLGVBQWU7NkJBQzdCO3lCQUNGO3dCQUNELFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUM7cUJBQ2hDO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSwyQkFBMkI7b0JBQ2pDLFdBQVcsRUFBRSxrQ0FBa0M7b0JBQy9DLFdBQVcsRUFBRTt3QkFDWCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxrQkFBa0I7NkJBQ2hDOzRCQUNELEtBQUssRUFBRTtnQ0FDTCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsbUNBQW1DOzZCQUNqRDt5QkFDRjt3QkFDRCxRQUFRLEVBQUUsQ0FBQyxTQUFTLENBQUM7cUJBQ3RCO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSwyQkFBMkI7b0JBQ2pDLFdBQVcsRUFBRSw0Q0FBNEM7b0JBQ3pELFdBQVcsRUFBRTt3QkFDWCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxZQUFZOzZCQUMxQjs0QkFDRCxVQUFVLEVBQUU7Z0NBQ1YsSUFBSSxFQUFFLE9BQU87Z0NBQ2IsS0FBSyxFQUFFO29DQUNMLElBQUksRUFBRSxRQUFRO2lDQUNmO2dDQUNELFdBQVcsRUFBRSw2QkFBNkI7NkJBQzNDOzRCQUNELFFBQVEsRUFBRTtnQ0FDUixJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsMEJBQTBCOzZCQUN4Qzt5QkFDRjt3QkFDRCxRQUFRLEVBQUUsQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsQ0FBQztxQkFDaEQ7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLHVCQUF1QjtvQkFDN0IsV0FBVyxFQUFFLDZDQUE2QztvQkFDMUQsV0FBVyxFQUFFO3dCQUNYLElBQUksRUFBRSxRQUFRO3dCQUNkLFVBQVUsRUFBRTs0QkFDVixjQUFjLEVBQUU7Z0NBQ2QsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLG1CQUFtQjs2QkFDakM7NEJBQ0QsU0FBUyxFQUFFO2dDQUNULElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSw4QkFBOEI7NkJBQzVDOzRCQUNELGNBQWMsRUFBRTtnQ0FDZCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsaUNBQWlDOzZCQUMvQzs0QkFDRCxPQUFPLEVBQUU7Z0NBQ1AsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLGtDQUFrQzs2QkFDaEQ7eUJBQ0Y7d0JBQ0QsUUFBUSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixDQUFDO3FCQUM1RDtpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsNkJBQTZCO29CQUNuQyxXQUFXLEVBQUUsZ0RBQWdEO29CQUM3RCxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsVUFBVSxFQUFFOzRCQUNWLGNBQWMsRUFBRTtnQ0FDZCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsbUJBQW1COzZCQUNqQzs0QkFDRCxVQUFVLEVBQUU7Z0NBQ1YsSUFBSSxFQUFFLE9BQU87Z0NBQ2IsS0FBSyxFQUFFO29DQUNMLElBQUksRUFBRSxRQUFRO2lDQUNmO2dDQUNELFdBQVcsRUFBRSw2QkFBNkI7NkJBQzNDOzRCQUNELGVBQWUsRUFBRTtnQ0FDZixJQUFJLEVBQUUsT0FBTztnQ0FDYixLQUFLLEVBQUU7b0NBQ0wsSUFBSSxFQUFFLFFBQVE7aUNBQ2Y7Z0NBQ0QsV0FBVyxFQUFFLDZCQUE2Qjs2QkFDM0M7NEJBQ0QsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxrQ0FBa0M7NkJBQ2hEO3lCQUNGO3dCQUNELFFBQVEsRUFBRSxDQUFDLGdCQUFnQixFQUFFLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztxQkFDOUQ7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLDBCQUEwQjtvQkFDaEMsV0FBVyxFQUFFLHFDQUFxQztvQkFDbEQsV0FBVyxFQUFFO3dCQUNYLElBQUksRUFBRSxRQUFRO3dCQUNkLFVBQVUsRUFBRTs0QkFDVixPQUFPLEVBQUU7Z0NBQ1AsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLGdDQUFnQzs2QkFDOUM7NEJBQ0QsU0FBUyxFQUFFO2dDQUNULElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSxrREFBa0Q7NkJBQ2hFOzRCQUNELEtBQUssRUFBRTtnQ0FDTCxJQUFJLEVBQUUsUUFBUTtnQ0FDZCxXQUFXLEVBQUUsNENBQTRDOzZCQUMxRDt5QkFDRjt3QkFDRCxRQUFRLEVBQUUsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDO3FCQUNuQztpQkFDRjthQUNGLENBQUM7WUFFRixPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUNyRSxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztnQkFFakQsUUFBUSxJQUFJLEVBQUUsQ0FBQztvQkFDYiwyQkFBMkI7b0JBQzNCLEtBQUssZUFBZTt3QkFDbEIsT0FBTyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3ZDLEtBQUssZ0JBQWdCO3dCQUNuQixPQUFPLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDeEMsS0FBSyxhQUFhO3dCQUNoQixPQUFPLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDckMsS0FBSyxnQkFBZ0I7d0JBQ25CLE9BQU8sTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN4QyxLQUFLLG9CQUFvQjt3QkFDdkIsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDM0MsS0FBSyxxQkFBcUI7d0JBQ3hCLE9BQU8sTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzVDLEtBQUssZ0JBQWdCO3dCQUNuQixPQUFPLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFFeEMsdUJBQXVCO29CQUN2QixLQUFLLHFCQUFxQjt3QkFDeEIsT0FBTyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDNUMsS0FBSyxvQkFBb0I7d0JBQ3ZCLE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzNDLEtBQUssMkJBQTJCO3dCQUM5QixPQUFPLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNqRCxLQUFLLG9CQUFvQjt3QkFDdkIsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDM0MsS0FBSyxrQkFBa0I7d0JBQ3JCLE9BQU8sTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN6QyxLQUFLLHdCQUF3Qjt3QkFDM0IsT0FBTyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDN0MsS0FBSyxxQkFBcUI7d0JBQ3hCLE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzNDLEtBQUssb0JBQW9CO3dCQUN2QixPQUFPLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMzQyxLQUFLLHVCQUF1Qjt3QkFDMUIsT0FBTyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDOUMsS0FBSyxzQkFBc0I7d0JBQ3pCLE9BQU8sTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzVDLEtBQUssNEJBQTRCO3dCQUMvQixPQUFPLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNqRCxLQUFLLDJCQUEyQjt3QkFDOUIsT0FBTyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO29CQUM3QyxLQUFLLG1CQUFtQjt3QkFDdEIsT0FBTyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzFDLEtBQUsscUJBQXFCO3dCQUN4QixPQUFPLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM1QyxLQUFLLHNCQUFzQjt3QkFDekIsT0FBTyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDN0MsS0FBSyxvQkFBb0I7d0JBQ3ZCLE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzNDLEtBQUssd0JBQXdCO3dCQUMzQixPQUFPLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMvQyxLQUFLLHVCQUF1Qjt3QkFDMUIsT0FBTyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDN0MsS0FBSyx3QkFBd0I7d0JBQzNCLE9BQU8sTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzlDLEtBQUssdUJBQXVCO3dCQUMxQixPQUFPLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM5QyxLQUFLLHNCQUFzQjt3QkFDekIsT0FBTyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUN6QyxLQUFLLHdCQUF3Qjt3QkFDM0IsT0FBTyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO29CQUMxQyxLQUFLLDhCQUE4Qjt3QkFDakMsT0FBTyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDcEQsS0FBSywyQkFBMkI7d0JBQzlCLE9BQU8sTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ2pELEtBQUssMkJBQTJCO3dCQUM5QixPQUFPLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNqRCxLQUFLLHVCQUF1Qjt3QkFDMUIsT0FBTyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDOUMsS0FBSyw2QkFBNkI7d0JBQ2hDLE9BQU8sTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ25ELEtBQUssMEJBQTBCO3dCQUM3QixPQUFPLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUVoRDt3QkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QyxDQUFDO1lBQ0gsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxZQUFZLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM1RSxPQUFPO29CQUNMLE9BQU8sRUFBRTt3QkFDUDs0QkFDRSxJQUFJLEVBQUUsTUFBTTs0QkFDWixJQUFJLEVBQUUsVUFBVSxZQUFZLEVBQUU7eUJBQy9CO3FCQUNGO29CQUNELE9BQU8sRUFBRSxJQUFJO2lCQUNkLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLEdBQUc7UUFDUCxNQUFNLFNBQVMsR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDN0MsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyQyxPQUFPLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFFdEQsb0RBQW9EO1FBQ3BELE1BQU0sSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztBQUNyQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyJ9