@serve.zone/dcrouter 20.2.0 → 32.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/deno.json +1 -1
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.dcrouter.js +2 -3
- package/dist_ts/db/documents/classes.webpush-spool.doc.d.ts +0 -1
- package/dist_ts/db/documents/classes.webpush-spool.doc.js +2 -8
- package/dist_ts/email/classes.coremail-gateway.manager.js +2 -3
- package/dist_ts/email/coremail-gateway-authority.d.ts +1 -1
- package/dist_ts/email/coremail-gateway-authority.js +1 -1
- package/dist_ts/opsserver/handlers/gatewayclient.handler.d.ts +0 -1
- package/dist_ts/opsserver/handlers/gatewayclient.handler.js +13 -34
- package/dist_ts/opsserver/helpers/gateway-client-route-key.d.ts +26 -0
- package/dist_ts/opsserver/helpers/gateway-client-route-key.js +51 -0
- package/dist_ts/webpush/classes.webpush-crypto.d.ts +9 -1
- package/dist_ts/webpush/classes.webpush-crypto.js +69 -56
- package/dist_ts/webpush/classes.webpush-manager.js +3 -4
- package/dist_ts_migrations/index.d.ts +18 -9
- package/dist_ts_migrations/index.js +602 -1776
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/package.json +5 -5
- package/readme.md +22 -7
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.dcrouter.ts +2 -4
- package/ts/db/documents/classes.webpush-spool.doc.ts +0 -3
- package/ts/email/classes.coremail-gateway.manager.ts +1 -2
- package/ts/email/coremail-gateway-authority.ts +1 -1
- package/ts/opsserver/handlers/gatewayclient.handler.ts +19 -36
- package/ts/opsserver/helpers/gateway-client-route-key.ts +64 -0
- package/ts/webpush/classes.webpush-crypto.ts +80 -57
- package/ts/webpush/classes.webpush-manager.ts +2 -3
- package/ts_web/00_commitinfo_data.ts +1 -1
|
@@ -1,19 +1,55 @@
|
|
|
1
1
|
import * as nodeCrypto from 'node:crypto';
|
|
2
|
-
import * as nodeFs from 'node:fs/promises';
|
|
3
|
-
import * as nodePath from 'node:path';
|
|
4
2
|
import { domainToASCII } from 'node:url';
|
|
5
|
-
import {
|
|
6
|
-
import { getSmartMtaTextNamespace, hashSmartMtaStorageKey, normalizeSmartMtaStorageKey, validateSmartMtaTextValue, } from '../dist_ts/email/smartmta-storage-policy.js';
|
|
3
|
+
import { hashSmartMtaStorageKey } from '../dist_ts/email/smartmta-storage-policy.js';
|
|
7
4
|
import { createGatewayMailDomainId, groupGatewayMailIdentities, normalizeGatewayMailDomain, normalizeGatewayMailDomainOwner, } from '../dist_ts/email/gateway-mail-domain-authority.js';
|
|
8
5
|
import { deriveSmtpScramVerifier } from '../dist_ts/email/smtp-scram.js';
|
|
9
6
|
import { evaluateInboundAcceptance } from '../dist_ts/email/helpers.inbound-security.js';
|
|
10
7
|
import { getWebPushIndexSpecifications } from '../dist_ts/webpush/webpush-indexes.js';
|
|
8
|
+
import { canonicalJson as canonicalWebPushJson, openWebPushEnvelope, parseWebPushKeyRing, sealWebPushEnvelope, } from '../dist_ts/webpush/classes.webpush-crypto.js';
|
|
9
|
+
import { buildGatewayClientRouteName, gatewayClientHostRouteKeyPrefix, parseGatewayClientHostRouteKey, } from '../dist_ts/opsserver/helpers/gateway-client-route-key.js';
|
|
10
|
+
import { data as servezoneInterfacesData } from '@serve.zone/interfaces';
|
|
11
|
+
/** The verifier contract token CoreMail peers are stored under from interfaces 32.0.0 on. */
|
|
12
|
+
const coreMailVerifierFormat = servezoneInterfacesData.coreMailCredentialVerifierPolicy.format;
|
|
13
|
+
/**
|
|
14
|
+
* dcrouter migration runner.
|
|
15
|
+
*
|
|
16
|
+
* Uses @push.rocks/smartmigration via dynamic import so smartmigration's type
|
|
17
|
+
* chain (which pulls in mongodb 7.x and related types) doesn't leak into
|
|
18
|
+
* compile-time type checking for this folder.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* A refusal dcrouter's own migration code authored. smartmigration redacts every
|
|
22
|
+
* unknown failure that crosses one of its boundaries, so this class is how a
|
|
23
|
+
* message that names the condition and the way out — and carries no secret —
|
|
24
|
+
* is told apart from an unknown throw and allowed through the sanitizer.
|
|
25
|
+
*/
|
|
26
|
+
export class DcRouterMigrationError extends Error {
|
|
27
|
+
constructor(messageArg, optionsArg) {
|
|
28
|
+
super(messageArg, optionsArg);
|
|
29
|
+
this.name = 'DcRouterMigrationError';
|
|
30
|
+
}
|
|
31
|
+
}
|
|
11
32
|
// Advance only with a registered schema migration, not each package release.
|
|
12
33
|
// Released bridge-only ledgers must remain readable without rewriting history.
|
|
13
|
-
export const dcRouterSchemaVersion = '
|
|
34
|
+
export const dcRouterSchemaVersion = '32.0.1';
|
|
14
35
|
export async function createApplicationMigrationRunner(db, options = {}) {
|
|
15
|
-
|
|
16
|
-
return
|
|
36
|
+
const runner = await createMigrationRunner(db, dcRouterSchemaVersion, options);
|
|
37
|
+
return {
|
|
38
|
+
getCurrentVersion: () => runner.getCurrentVersion(),
|
|
39
|
+
run: async () => {
|
|
40
|
+
// smartmigration plans a reverse run whenever the ledger is ahead of the
|
|
41
|
+
// target, and in bridge mode the generated bridge is reversible, so a
|
|
42
|
+
// database a newer dcrouter wrote would be walked back instead of
|
|
43
|
+
// refused. Starting an application against data it cannot read is never
|
|
44
|
+
// what an operator meant, so this release refuses it by name.
|
|
45
|
+
const ledgerVersion = await runner.getCurrentVersion();
|
|
46
|
+
if (ledgerVersion && compareSemver(ledgerVersion, dcRouterSchemaVersion) > 0) {
|
|
47
|
+
throw new DcRouterMigrationError(`The migration ledger is at "${ledgerVersion}", which a newer dcrouter wrote. `
|
|
48
|
+
+ `This release migrates data up to "${dcRouterSchemaVersion}" and refuses to run against it.`);
|
|
49
|
+
}
|
|
50
|
+
return await runner.run();
|
|
51
|
+
},
|
|
52
|
+
};
|
|
17
53
|
}
|
|
18
54
|
const DEFAULT_SOURCE_PROFILES = [
|
|
19
55
|
{
|
|
@@ -59,7 +95,6 @@ const DEFAULT_SOURCE_PROFILES = [
|
|
|
59
95
|
},
|
|
60
96
|
},
|
|
61
97
|
];
|
|
62
|
-
const remoteIngressHubSettingsMigrationBaseVersion = '13.43.5';
|
|
63
98
|
function compareSemver(a, b) {
|
|
64
99
|
const aParts = a.split('.').map((part) => Number.parseInt(part, 10) || 0);
|
|
65
100
|
const bParts = b.split('.').map((part) => Number.parseInt(part, 10) || 0);
|
|
@@ -121,85 +156,6 @@ function resolveMigrationSourceProfileSecurity(profileId, profiles, visited = ne
|
|
|
121
156
|
}
|
|
122
157
|
return mergeMigrationSecurityFields(baseSecurity, profile.security || {});
|
|
123
158
|
}
|
|
124
|
-
async function rematerializeSourceProfileRouteSecurity(ctx) {
|
|
125
|
-
const profileCollection = ctx.mongo.collection('SourceProfileDoc');
|
|
126
|
-
const routeCollection = ctx.mongo.collection('RouteDoc');
|
|
127
|
-
const profiles = new Map();
|
|
128
|
-
for await (const profile of profileCollection.find({})) {
|
|
129
|
-
if (typeof profile.id === 'string') {
|
|
130
|
-
profiles.set(profile.id, profile);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
let inspected = 0;
|
|
134
|
-
let migrated = 0;
|
|
135
|
-
let skippedMissingProfile = 0;
|
|
136
|
-
const now = Date.now();
|
|
137
|
-
for await (const routeDoc of routeCollection.find({})) {
|
|
138
|
-
const sourceProfileRef = routeDoc.metadata?.sourceProfileRef;
|
|
139
|
-
if (typeof sourceProfileRef !== 'string' || sourceProfileRef.trim() === '')
|
|
140
|
-
continue;
|
|
141
|
-
inspected++;
|
|
142
|
-
const resolvedSecurity = resolveMigrationSourceProfileSecurity(sourceProfileRef, profiles);
|
|
143
|
-
const profile = profiles.get(sourceProfileRef);
|
|
144
|
-
if (!resolvedSecurity || !profile) {
|
|
145
|
-
skippedMissingProfile++;
|
|
146
|
-
continue;
|
|
147
|
-
}
|
|
148
|
-
const currentSecurity = routeDoc.route?.security || {};
|
|
149
|
-
const securityChanged = JSON.stringify(currentSecurity) !== JSON.stringify(resolvedSecurity);
|
|
150
|
-
const profileNameChanged = routeDoc.metadata?.sourceProfileName !== profile.name;
|
|
151
|
-
if (!securityChanged && !profileNameChanged)
|
|
152
|
-
continue;
|
|
153
|
-
const query = routeDoc._id
|
|
154
|
-
? { _id: routeDoc._id }
|
|
155
|
-
: { id: routeDoc.id };
|
|
156
|
-
await routeCollection.updateOne(query, {
|
|
157
|
-
$set: {
|
|
158
|
-
'route.security': structuredClone(resolvedSecurity),
|
|
159
|
-
'metadata.sourceProfileName': profile.name,
|
|
160
|
-
'metadata.lastResolvedAt': now,
|
|
161
|
-
updatedAt: now,
|
|
162
|
-
},
|
|
163
|
-
});
|
|
164
|
-
migrated++;
|
|
165
|
-
}
|
|
166
|
-
ctx.log.log('info', `rematerialize-source-profile-route-security: migrated ${migrated}/${inspected} route(s), skipped ${skippedMissingProfile} missing profile ref(s)`);
|
|
167
|
-
}
|
|
168
|
-
async function migrateTargetProfileTargetHosts(ctx) {
|
|
169
|
-
const collection = ctx.mongo.collection('TargetProfileDoc');
|
|
170
|
-
const cursor = collection.find({ 'targets.host': { $exists: true } });
|
|
171
|
-
let migrated = 0;
|
|
172
|
-
for await (const doc of cursor) {
|
|
173
|
-
const targets = (doc.targets || []).map((target) => {
|
|
174
|
-
if (target && typeof target === 'object' && 'host' in target && !('ip' in target)) {
|
|
175
|
-
const { host, ...rest } = target;
|
|
176
|
-
return { ...rest, ip: host };
|
|
177
|
-
}
|
|
178
|
-
return target;
|
|
179
|
-
});
|
|
180
|
-
await collection.updateOne({ _id: doc._id }, { $set: { targets } });
|
|
181
|
-
migrated++;
|
|
182
|
-
}
|
|
183
|
-
ctx.log.log('info', `rename-target-profile-host-to-ip: migrated ${migrated} profile(s)`);
|
|
184
|
-
}
|
|
185
|
-
async function backfillSystemRouteKeys(ctx) {
|
|
186
|
-
const collection = ctx.mongo.collection('RouteDoc');
|
|
187
|
-
const cursor = collection.find({
|
|
188
|
-
origin: { $in: ['config', 'email', 'dns'] },
|
|
189
|
-
systemKey: { $exists: false },
|
|
190
|
-
'route.name': { $type: 'string' },
|
|
191
|
-
});
|
|
192
|
-
let migrated = 0;
|
|
193
|
-
for await (const doc of cursor) {
|
|
194
|
-
const origin = typeof doc.origin === 'string' ? doc.origin : undefined;
|
|
195
|
-
const routeName = typeof doc.route?.name === 'string' ? doc.route.name.trim() : '';
|
|
196
|
-
if (!origin || !routeName)
|
|
197
|
-
continue;
|
|
198
|
-
await collection.updateOne({ _id: doc._id }, { $set: { systemKey: `${origin}:${routeName}` } });
|
|
199
|
-
migrated++;
|
|
200
|
-
}
|
|
201
|
-
ctx.log.log('info', `backfill-system-route-keys: migrated ${migrated} route(s)`);
|
|
202
|
-
}
|
|
203
159
|
async function seedMissingDefaultSourceProfiles(ctx) {
|
|
204
160
|
const collection = ctx.mongo.collection('SourceProfileDoc');
|
|
205
161
|
const now = Date.now();
|
|
@@ -382,101 +338,6 @@ async function backfillGatewayDnsProxyIntent(ctx) {
|
|
|
382
338
|
}
|
|
383
339
|
ctx.log.log('info', `backfill-gateway-dns-proxy-intent: migrated ${migrated}/${inspected} route(s)`);
|
|
384
340
|
}
|
|
385
|
-
function normalizeMigrationSourceBinding(binding, profiles) {
|
|
386
|
-
if (!binding || typeof binding !== 'object')
|
|
387
|
-
return undefined;
|
|
388
|
-
const sourceProfileRef = typeof binding.sourceProfileRef === 'string'
|
|
389
|
-
? binding.sourceProfileRef.trim()
|
|
390
|
-
: '';
|
|
391
|
-
if (!sourceProfileRef)
|
|
392
|
-
return undefined;
|
|
393
|
-
const profile = profiles.get(sourceProfileRef);
|
|
394
|
-
const normalizedBinding = structuredClone(binding);
|
|
395
|
-
normalizedBinding.sourceProfileRef = sourceProfileRef;
|
|
396
|
-
const sourceProfileName = typeof normalizedBinding.sourceProfileName === 'string'
|
|
397
|
-
? normalizedBinding.sourceProfileName.trim()
|
|
398
|
-
: '';
|
|
399
|
-
if (sourceProfileName) {
|
|
400
|
-
normalizedBinding.sourceProfileName = sourceProfileName;
|
|
401
|
-
}
|
|
402
|
-
else if (typeof profile?.name === 'string' && profile.name.trim()) {
|
|
403
|
-
normalizedBinding.sourceProfileName = profile.name.trim();
|
|
404
|
-
}
|
|
405
|
-
else {
|
|
406
|
-
delete normalizedBinding.sourceProfileName;
|
|
407
|
-
}
|
|
408
|
-
return normalizedBinding;
|
|
409
|
-
}
|
|
410
|
-
async function convertRouteAccessMetadataToSourceBindings(ctx) {
|
|
411
|
-
const profileCollection = ctx.mongo.collection('SourceProfileDoc');
|
|
412
|
-
const routeCollection = ctx.mongo.collection('RouteDoc');
|
|
413
|
-
const profiles = new Map();
|
|
414
|
-
const now = Date.now();
|
|
415
|
-
for await (const profile of profileCollection.find({})) {
|
|
416
|
-
if (typeof profile.id === 'string') {
|
|
417
|
-
profiles.set(profile.id, profile);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
let inspected = 0;
|
|
421
|
-
let migrated = 0;
|
|
422
|
-
for await (const routeDoc of routeCollection.find({})) {
|
|
423
|
-
const metadata = routeDoc.metadata || {};
|
|
424
|
-
const existingSourceBindings = Array.isArray(metadata.sourceBindings)
|
|
425
|
-
? metadata.sourceBindings
|
|
426
|
-
: [];
|
|
427
|
-
const legacyPolicyBindings = Array.isArray(metadata.sourcePolicy?.bindings)
|
|
428
|
-
? metadata.sourcePolicy.bindings
|
|
429
|
-
: [];
|
|
430
|
-
const legacySourceProfileRef = typeof metadata.sourceProfileRef === 'string'
|
|
431
|
-
? metadata.sourceProfileRef.trim()
|
|
432
|
-
: '';
|
|
433
|
-
const hasLegacyAccessFields = legacyPolicyBindings.length > 0
|
|
434
|
-
|| legacySourceProfileRef.length > 0
|
|
435
|
-
|| metadata.sourcePolicy !== undefined
|
|
436
|
-
|| metadata.sourceProfileRef !== undefined
|
|
437
|
-
|| metadata.sourceProfileName !== undefined;
|
|
438
|
-
if (!hasLegacyAccessFields && existingSourceBindings.length === 0) {
|
|
439
|
-
continue;
|
|
440
|
-
}
|
|
441
|
-
inspected++;
|
|
442
|
-
const sourceBindings = existingSourceBindings.length > 0
|
|
443
|
-
? existingSourceBindings
|
|
444
|
-
.map((binding) => normalizeMigrationSourceBinding(binding, profiles))
|
|
445
|
-
.filter(Boolean)
|
|
446
|
-
: legacyPolicyBindings.length > 0
|
|
447
|
-
? legacyPolicyBindings
|
|
448
|
-
.map((binding) => normalizeMigrationSourceBinding(binding, profiles))
|
|
449
|
-
.filter(Boolean)
|
|
450
|
-
: legacySourceProfileRef
|
|
451
|
-
? [normalizeMigrationSourceBinding({
|
|
452
|
-
sourceProfileRef: legacySourceProfileRef,
|
|
453
|
-
sourceProfileName: metadata.sourceProfileName,
|
|
454
|
-
}, profiles)].filter(Boolean)
|
|
455
|
-
: [];
|
|
456
|
-
const $set = { updatedAt: now };
|
|
457
|
-
const $unset = {
|
|
458
|
-
'metadata.sourcePolicy': '',
|
|
459
|
-
'metadata.sourceProfileRef': '',
|
|
460
|
-
'metadata.sourceProfileName': '',
|
|
461
|
-
};
|
|
462
|
-
if (sourceBindings.length > 0) {
|
|
463
|
-
$set['metadata.sourceBindings'] = sourceBindings;
|
|
464
|
-
$set['metadata.lastResolvedAt'] = now;
|
|
465
|
-
}
|
|
466
|
-
else if (existingSourceBindings.length === 0) {
|
|
467
|
-
$unset['metadata.sourceBindings'] = '';
|
|
468
|
-
}
|
|
469
|
-
if (existingSourceBindings.length === 0 && legacyPolicyBindings.length === 0 && legacySourceProfileRef) {
|
|
470
|
-
$unset['route.security'] = '';
|
|
471
|
-
}
|
|
472
|
-
const query = routeDoc._id
|
|
473
|
-
? { _id: routeDoc._id }
|
|
474
|
-
: { id: routeDoc.id };
|
|
475
|
-
await routeCollection.updateOne(query, { $set, $unset });
|
|
476
|
-
migrated++;
|
|
477
|
-
}
|
|
478
|
-
ctx.log.log('info', `convert-route-access-metadata-to-source-bindings: migrated ${migrated}/${inspected} route(s)`);
|
|
479
|
-
}
|
|
480
341
|
async function backfillRemoteIngressHubSettings(ctx, options) {
|
|
481
342
|
const collection = ctx.mongo.collection('RemoteIngressHubSettingsDoc');
|
|
482
343
|
const seed = options.remoteIngressHubSettings || {};
|
|
@@ -553,73 +414,6 @@ async function backfillEmailServerSettings(ctx, options) {
|
|
|
553
414
|
await collection.updateOne(doc._id ? { _id: doc._id } : { settingsId: 'email-server-settings' }, { $set });
|
|
554
415
|
ctx.log.log('info', `backfill-email-server-settings: set ${Object.keys($set).length - 2} missing field(s)`);
|
|
555
416
|
}
|
|
556
|
-
async function backfillEmailOutboundMode(ctx, options) {
|
|
557
|
-
const collection = ctx.mongo.collection('EmailServerSettingsDoc');
|
|
558
|
-
const seed = options.emailServerSettings || {};
|
|
559
|
-
const now = Date.now();
|
|
560
|
-
const doc = await collection.findOne({ settingsId: 'email-server-settings' });
|
|
561
|
-
const outboundMode = seed.outboundMode || 'direct';
|
|
562
|
-
if (!doc) {
|
|
563
|
-
await collection.insertOne({
|
|
564
|
-
settingsId: 'email-server-settings',
|
|
565
|
-
enabled: seed.enabled ?? Boolean(seed.emailConfig),
|
|
566
|
-
outboundMode,
|
|
567
|
-
emailConfig: seed.emailConfig || undefined,
|
|
568
|
-
emailPortConfig: seed.emailPortConfig || undefined,
|
|
569
|
-
updatedAt: now,
|
|
570
|
-
updatedBy: 'migration',
|
|
571
|
-
});
|
|
572
|
-
ctx.log.log('info', 'backfill-email-outbound-mode: inserted singleton settings document');
|
|
573
|
-
return;
|
|
574
|
-
}
|
|
575
|
-
if (doc.outboundMode !== undefined) {
|
|
576
|
-
ctx.log.log('info', 'backfill-email-outbound-mode: no changes needed');
|
|
577
|
-
return;
|
|
578
|
-
}
|
|
579
|
-
await collection.updateOne(doc._id ? { _id: doc._id } : { settingsId: 'email-server-settings' }, {
|
|
580
|
-
$set: {
|
|
581
|
-
outboundMode,
|
|
582
|
-
updatedAt: now,
|
|
583
|
-
updatedBy: doc.updatedBy || 'migration',
|
|
584
|
-
},
|
|
585
|
-
});
|
|
586
|
-
ctx.log.log('info', 'backfill-email-outbound-mode: set missing outboundMode');
|
|
587
|
-
}
|
|
588
|
-
async function backfillRemoteIngressEdgeEgressDefaults(ctx) {
|
|
589
|
-
const collection = ctx.mongo.collection('RemoteIngressEdgeDoc');
|
|
590
|
-
const result = await collection.updateMany({ egress: { $exists: false } }, { $set: { egress: { enabled: false } } });
|
|
591
|
-
ctx.log.log('info', `backfill-remote-ingress-edge-egress-defaults: set ${result.modifiedCount || 0} edge(s) to disabled egress`);
|
|
592
|
-
}
|
|
593
|
-
async function backfillEmailOutboundAndRemoteIngressEgressSettings(ctx, options) {
|
|
594
|
-
await backfillEmailOutboundMode(ctx, options);
|
|
595
|
-
await backfillRemoteIngressEdgeEgressDefaults(ctx);
|
|
596
|
-
}
|
|
597
|
-
async function flipEmailOutboundModeToRemoteIngress(ctx) {
|
|
598
|
-
const collection = ctx.mongo.collection('EmailServerSettingsDoc');
|
|
599
|
-
const doc = await collection.findOne({ settingsId: 'email-server-settings' });
|
|
600
|
-
if (!doc) {
|
|
601
|
-
ctx.log.log('info', 'flip-email-outbound-mode: no settings document, nothing to flip');
|
|
602
|
-
return;
|
|
603
|
-
}
|
|
604
|
-
const mode = doc.outboundMode;
|
|
605
|
-
const updatedBy = String(doc.updatedBy || '');
|
|
606
|
-
// Operator-explicit 'direct' (set by a real identity) is preserved as opt-out;
|
|
607
|
-
// missing or default/migration-authored 'direct' flips to the new default.
|
|
608
|
-
const shouldFlip = mode === undefined
|
|
609
|
-
|| (mode === 'direct' && ['default', 'migration', ''].includes(updatedBy));
|
|
610
|
-
if (!shouldFlip) {
|
|
611
|
-
ctx.log.log('info', `flip-email-outbound-mode: keeping ${mode} (updatedBy: ${updatedBy || 'unknown'})`);
|
|
612
|
-
return;
|
|
613
|
-
}
|
|
614
|
-
await collection.updateOne(doc._id ? { _id: doc._id } : { settingsId: 'email-server-settings' }, {
|
|
615
|
-
$set: {
|
|
616
|
-
outboundMode: 'remoteIngress',
|
|
617
|
-
updatedAt: Date.now(),
|
|
618
|
-
updatedBy: 'migration',
|
|
619
|
-
},
|
|
620
|
-
});
|
|
621
|
-
ctx.log.log('info', 'flip-email-outbound-mode: outboundMode set to remoteIngress');
|
|
622
|
-
}
|
|
623
417
|
/**
|
|
624
418
|
* The legacy bootstrap config carried a `central.eu-incoming` route with a
|
|
625
419
|
* `deliver` action. SmartMTA's `deliver` action is an unimplemented stub that
|
|
@@ -743,152 +537,6 @@ async function convertLegacySmtpAuthUsers(ctx) {
|
|
|
743
537
|
});
|
|
744
538
|
ctx.log.log('info', `convert-legacy-smtp-auth-users: converted ${converted}, skipped ${skipped}; plaintext auth users stripped from persisted settings`);
|
|
745
539
|
}
|
|
746
|
-
async function backfillCachedEmailDirections(ctx) {
|
|
747
|
-
const collection = ctx.mongo.collection('CachedEmail');
|
|
748
|
-
const cursor = collection.find({ direction: { $exists: false } });
|
|
749
|
-
let updated = 0;
|
|
750
|
-
for await (const doc of cursor) {
|
|
751
|
-
let routeData = {};
|
|
752
|
-
try {
|
|
753
|
-
routeData = JSON.parse(doc.routeData || '{}');
|
|
754
|
-
}
|
|
755
|
-
catch {
|
|
756
|
-
routeData = {};
|
|
757
|
-
}
|
|
758
|
-
const authenticated = routeData?.session?.authenticated === true;
|
|
759
|
-
const recipientDomains = [...new Set((doc.to || [])
|
|
760
|
-
.map((address) => {
|
|
761
|
-
const match = String(address).match(/@([^>]+)>?$/);
|
|
762
|
-
return match ? match[1].toLowerCase() : undefined;
|
|
763
|
-
})
|
|
764
|
-
.filter(Boolean))];
|
|
765
|
-
const acceptedAtParsed = Date.parse(routeData?.acceptedAt || '');
|
|
766
|
-
await collection.updateOne({ _id: doc._id }, {
|
|
767
|
-
$set: {
|
|
768
|
-
direction: authenticated ? 'outbound' : 'inbound',
|
|
769
|
-
recipientDomains,
|
|
770
|
-
acceptedAt: Number.isFinite(acceptedAtParsed) ? acceptedAtParsed : Date.now(),
|
|
771
|
-
},
|
|
772
|
-
});
|
|
773
|
-
updated++;
|
|
774
|
-
}
|
|
775
|
-
ctx.log.log('info', `backfill-cached-email-directions: annotated ${updated} cached email(s)`);
|
|
776
|
-
}
|
|
777
|
-
async function migrateGatewayCredentialPolicyBindings(ctx) {
|
|
778
|
-
const gatewayClients = ctx.mongo.collection('GatewayClientDoc');
|
|
779
|
-
const apiTokens = ctx.mongo.collection('ApiTokenDoc');
|
|
780
|
-
const batchSize = 100;
|
|
781
|
-
let migratedClients = 0;
|
|
782
|
-
let migratedTokens = 0;
|
|
783
|
-
let disabledOrphanTokens = 0;
|
|
784
|
-
const digestClientPolicy = (clientArg, generationArg) => {
|
|
785
|
-
const canonicalize = (valueArg) => {
|
|
786
|
-
if (Array.isArray(valueArg))
|
|
787
|
-
return valueArg.map((entryArg) => canonicalize(entryArg));
|
|
788
|
-
if (valueArg && typeof valueArg === 'object') {
|
|
789
|
-
return Object.fromEntries(Object.keys(valueArg)
|
|
790
|
-
.sort((left, right) => left.localeCompare(right))
|
|
791
|
-
.map((keyArg) => [keyArg, canonicalize(valueArg[keyArg])]));
|
|
792
|
-
}
|
|
793
|
-
return valueArg;
|
|
794
|
-
};
|
|
795
|
-
return nodeCrypto.createHash('sha256').update(JSON.stringify(canonicalize({
|
|
796
|
-
id: clientArg.id,
|
|
797
|
-
generation: generationArg,
|
|
798
|
-
policy: {
|
|
799
|
-
type: clientArg.type,
|
|
800
|
-
hostnamePatterns: clientArg.hostnamePatterns || [],
|
|
801
|
-
allowedRouteTargets: clientArg.allowedRouteTargets || [],
|
|
802
|
-
capabilities: clientArg.capabilities || {},
|
|
803
|
-
enabled: clientArg.enabled !== false,
|
|
804
|
-
},
|
|
805
|
-
}))).digest('hex');
|
|
806
|
-
};
|
|
807
|
-
while (true) {
|
|
808
|
-
const batch = await gatewayClients.find({
|
|
809
|
-
$or: [
|
|
810
|
-
{ policyGeneration: { $exists: false } },
|
|
811
|
-
{ policyGeneration: { $in: [null, 0] } },
|
|
812
|
-
{ credentialSequence: { $exists: false } },
|
|
813
|
-
{ credentialSequence: null },
|
|
814
|
-
{ activeCredentialSequence: { $exists: false } },
|
|
815
|
-
{ activeCredentialSequence: null },
|
|
816
|
-
{ pendingProvisioning: { $exists: false } },
|
|
817
|
-
],
|
|
818
|
-
}).limit(batchSize).toArray();
|
|
819
|
-
if (batch.length === 0)
|
|
820
|
-
break;
|
|
821
|
-
for (const client of batch) {
|
|
822
|
-
const policyGeneration = Number.isSafeInteger(client.policyGeneration)
|
|
823
|
-
&& Number(client.policyGeneration) >= 1
|
|
824
|
-
? Number(client.policyGeneration)
|
|
825
|
-
: 1;
|
|
826
|
-
const credentialSequence = Number.isSafeInteger(client.credentialSequence)
|
|
827
|
-
&& Number(client.credentialSequence) >= 0
|
|
828
|
-
? Number(client.credentialSequence)
|
|
829
|
-
: 0;
|
|
830
|
-
let activeCredentialSequence = Number.isSafeInteger(client.activeCredentialSequence)
|
|
831
|
-
&& Number(client.activeCredentialSequence) >= 0
|
|
832
|
-
? Number(client.activeCredentialSequence)
|
|
833
|
-
: 0;
|
|
834
|
-
if (activeCredentialSequence === 0) {
|
|
835
|
-
const activeDigest = digestClientPolicy(client, policyGeneration);
|
|
836
|
-
const activeTokens = await apiTokens.find({
|
|
837
|
-
enabled: true,
|
|
838
|
-
'policy.role': 'gatewayClient',
|
|
839
|
-
'policy.gatewayClient.id': client.id,
|
|
840
|
-
'gatewayCredentialLifecycle.source': 'provisioned',
|
|
841
|
-
'gatewayCredentialLifecycle.state': 'active',
|
|
842
|
-
'gatewayCredentialLifecycle.policyGeneration': policyGeneration,
|
|
843
|
-
'gatewayCredentialLifecycle.policyDigest': activeDigest,
|
|
844
|
-
}).sort({ 'gatewayCredentialLifecycle.sequence': -1 }).limit(1).toArray();
|
|
845
|
-
const activeSequence = activeTokens[0]?.gatewayCredentialLifecycle?.sequence;
|
|
846
|
-
if (Number.isSafeInteger(activeSequence) && Number(activeSequence) >= 1) {
|
|
847
|
-
activeCredentialSequence = Number(activeSequence);
|
|
848
|
-
}
|
|
849
|
-
}
|
|
850
|
-
await gatewayClients.updateOne(client._id === undefined ? { id: client.id } : { _id: client._id, id: client.id }, {
|
|
851
|
-
$set: {
|
|
852
|
-
policyGeneration,
|
|
853
|
-
credentialSequence,
|
|
854
|
-
activeCredentialSequence,
|
|
855
|
-
pendingProvisioning: client.pendingProvisioning ?? null,
|
|
856
|
-
},
|
|
857
|
-
});
|
|
858
|
-
migratedClients++;
|
|
859
|
-
}
|
|
860
|
-
}
|
|
861
|
-
while (true) {
|
|
862
|
-
const batch = await apiTokens.find({
|
|
863
|
-
'policy.role': 'gatewayClient',
|
|
864
|
-
$or: [
|
|
865
|
-
{ 'policy.gatewayClient.policyGeneration': { $exists: false } },
|
|
866
|
-
{ 'policy.gatewayClient.policyGeneration': { $in: [null, 0] } },
|
|
867
|
-
],
|
|
868
|
-
}).limit(batchSize).toArray();
|
|
869
|
-
if (batch.length === 0)
|
|
870
|
-
break;
|
|
871
|
-
for (const token of batch) {
|
|
872
|
-
const gatewayClientId = typeof token.policy?.gatewayClient?.id === 'string'
|
|
873
|
-
? token.policy.gatewayClient.id.trim().toLowerCase()
|
|
874
|
-
: '';
|
|
875
|
-
const client = gatewayClientId
|
|
876
|
-
? await gatewayClients.findOne({ id: gatewayClientId })
|
|
877
|
-
: null;
|
|
878
|
-
const selector = token._id === undefined ? { id: token.id } : { _id: token._id, id: token.id };
|
|
879
|
-
await apiTokens.updateOne(selector, {
|
|
880
|
-
$set: {
|
|
881
|
-
'policy.gatewayClient.policyGeneration': client?.policyGeneration || 1,
|
|
882
|
-
...(!client ? { enabled: false } : {}),
|
|
883
|
-
},
|
|
884
|
-
});
|
|
885
|
-
migratedTokens++;
|
|
886
|
-
if (!client)
|
|
887
|
-
disabledOrphanTokens++;
|
|
888
|
-
}
|
|
889
|
-
}
|
|
890
|
-
ctx.log.log(disabledOrphanTokens > 0 ? 'warn' : 'info', `gateway-credential-policy-bindings: migrated ${migratedClients} client(s), ${migratedTokens} token(s), disabled ${disabledOrphanTokens} orphan token(s)`);
|
|
891
|
-
}
|
|
892
540
|
async function migrateWebPushProviderSchema(ctx) {
|
|
893
541
|
const migrationBatchSize = 100;
|
|
894
542
|
const bindingCollection = ctx.mongo.collection('WebPushBindingDoc');
|
|
@@ -896,7 +544,7 @@ async function migrateWebPushProviderSchema(ctx) {
|
|
|
896
544
|
const spoolCollection = ctx.mongo.collection('WebPushSpoolDoc');
|
|
897
545
|
const requireMongoDocumentId = (documentArg, documentTypeArg) => {
|
|
898
546
|
if (documentArg?._id === undefined || documentArg?._id === null) {
|
|
899
|
-
throw new
|
|
547
|
+
throw new DcRouterMigrationError(`web-push-provider-schema: ${documentTypeArg} document has no MongoDB id`);
|
|
900
548
|
}
|
|
901
549
|
return documentArg._id;
|
|
902
550
|
};
|
|
@@ -917,7 +565,7 @@ async function migrateWebPushProviderSchema(ctx) {
|
|
|
917
565
|
},
|
|
918
566
|
})), { ordered: false });
|
|
919
567
|
if (result.modifiedCount === 0) {
|
|
920
|
-
throw new
|
|
568
|
+
throw new DcRouterMigrationError(`web-push-provider-schema: ${documentTypeArg} backfill made no progress`);
|
|
921
569
|
}
|
|
922
570
|
}
|
|
923
571
|
};
|
|
@@ -945,7 +593,7 @@ async function migrateWebPushProviderSchema(ctx) {
|
|
|
945
593
|
|| binding.id !== binding.id.trim()
|
|
946
594
|
|| !Number.isSafeInteger(binding.lifecycleGeneration)
|
|
947
595
|
|| binding.lifecycleGeneration < 1) {
|
|
948
|
-
throw new
|
|
596
|
+
throw new DcRouterMigrationError('web-push-provider-schema: malformed binding lifecycle authority');
|
|
949
597
|
}
|
|
950
598
|
}
|
|
951
599
|
const backfillDependentLifecycles = async (collectionArg, documentTypeArg) => {
|
|
@@ -960,13 +608,13 @@ async function migrateWebPushProviderSchema(ctx) {
|
|
|
960
608
|
if (typeof document.bindingId !== 'string'
|
|
961
609
|
|| document.bindingId.trim().length === 0
|
|
962
610
|
|| document.bindingId !== document.bindingId.trim()) {
|
|
963
|
-
throw new
|
|
611
|
+
throw new DcRouterMigrationError(`web-push-provider-schema: malformed ${documentTypeArg} lifecycle authority`);
|
|
964
612
|
}
|
|
965
613
|
const binding = await bindingCollection.findOne({ id: document.bindingId }, { projection: { lifecycleGeneration: 1 } });
|
|
966
614
|
if (!binding
|
|
967
615
|
|| !Number.isSafeInteger(binding.lifecycleGeneration)
|
|
968
616
|
|| binding.lifecycleGeneration < 1) {
|
|
969
|
-
throw new
|
|
617
|
+
throw new DcRouterMigrationError(`web-push-provider-schema: orphan ${documentTypeArg} lifecycle authority`);
|
|
970
618
|
}
|
|
971
619
|
operations.push({
|
|
972
620
|
updateOne: {
|
|
@@ -981,7 +629,7 @@ async function migrateWebPushProviderSchema(ctx) {
|
|
|
981
629
|
}
|
|
982
630
|
const result = await collectionArg.bulkWrite(operations, { ordered: false });
|
|
983
631
|
if (result.modifiedCount === 0) {
|
|
984
|
-
throw new
|
|
632
|
+
throw new DcRouterMigrationError(`web-push-provider-schema: ${documentTypeArg} backfill made no progress`);
|
|
985
633
|
}
|
|
986
634
|
}
|
|
987
635
|
};
|
|
@@ -997,13 +645,13 @@ async function migrateWebPushProviderSchema(ctx) {
|
|
|
997
645
|
&& (typeof documentArg.id !== 'string'
|
|
998
646
|
|| documentArg.id.trim().length === 0
|
|
999
647
|
|| documentArg.id !== documentArg.id.trim()))) {
|
|
1000
|
-
throw new
|
|
648
|
+
throw new DcRouterMigrationError(`web-push-provider-schema: malformed ${documentTypeArg} lifecycle authority`);
|
|
1001
649
|
}
|
|
1002
650
|
const binding = await bindingCollection.findOne({ id: documentArg.bindingId }, { projection: { lifecycleGeneration: 1 } });
|
|
1003
651
|
if (!binding
|
|
1004
652
|
|| !Number.isSafeInteger(binding.lifecycleGeneration)
|
|
1005
653
|
|| documentArg.lifecycleGeneration > binding.lifecycleGeneration) {
|
|
1006
|
-
throw new
|
|
654
|
+
throw new DcRouterMigrationError(`web-push-provider-schema: orphan ${documentTypeArg} lifecycle authority`);
|
|
1007
655
|
}
|
|
1008
656
|
};
|
|
1009
657
|
const streamLifecycleCollection = async (collectionArg, documentTypeArg) => {
|
|
@@ -1075,7 +723,7 @@ async function migrateServiceMailIdempotencyIndex(ctx) {
|
|
|
1075
723
|
continue;
|
|
1076
724
|
}
|
|
1077
725
|
if (document._id === undefined || document._id === null) {
|
|
1078
|
-
throw new
|
|
726
|
+
throw new DcRouterMigrationError('index-service-mail-idempotency: CachedEmail document has no _id');
|
|
1079
727
|
}
|
|
1080
728
|
pendingUnsets.push({
|
|
1081
729
|
updateOne: {
|
|
@@ -1118,829 +766,260 @@ async function migrateServiceMailIdempotencyIndex(ctx) {
|
|
|
1118
766
|
*/
|
|
1119
767
|
export async function createMigrationRunner(db, targetVersion, options = {}) {
|
|
1120
768
|
const sm = await import('@push.rocks/smartmigration');
|
|
1121
|
-
const freshInstallVersion = compareSemver(targetVersion, serviceMailIdempotencyMigrationVersion) >= 0
|
|
1122
|
-
? serviceMailIdempotencyPreviousVersion
|
|
1123
|
-
: targetVersion;
|
|
1124
769
|
const migration = new sm.SmartMigration({
|
|
1125
770
|
targetVersion,
|
|
1126
771
|
db: db,
|
|
1127
|
-
//
|
|
1128
|
-
|
|
1129
|
-
|
|
772
|
+
// A fresh install enters the chain at its start, so it still runs the mail
|
|
773
|
+
// idempotency and Web Push index steps that create its indexes.
|
|
774
|
+
freshInstallVersion: serviceMailIdempotencyPreviousVersion,
|
|
775
|
+
// 32.0.0 deleted every released step below the chain start. Without this
|
|
776
|
+
// floor a ledger from before it would be skip-forward resumed and stamped
|
|
777
|
+
// as if the deleted work had happened; with it, such a ledger is refused
|
|
778
|
+
// by name on the first read, before the lock and before any write.
|
|
779
|
+
oldestSupportedVersion: serviceMailIdempotencyPreviousVersion,
|
|
780
|
+
// A target that is not a step boundary is bridged rather than overshot.
|
|
1130
781
|
targetVersionStrategy: 'bridge',
|
|
782
|
+
// dcrouter's own refusals name the condition and the way out and carry no
|
|
783
|
+
// secret, so they reach the operator unchanged; anything else is reported
|
|
784
|
+
// as the step or phase it failed in and nothing more.
|
|
785
|
+
errorSanitizer: (errorArg, contextArg) => (errorArg instanceof DcRouterMigrationError
|
|
786
|
+
? { message: errorArg.message }
|
|
787
|
+
: {
|
|
788
|
+
message: contextArg.stepId
|
|
789
|
+
? `Migration step "${contextArg.stepId}" failed.`
|
|
790
|
+
: `Migration ${contextArg.phase} failed.`,
|
|
791
|
+
}),
|
|
1131
792
|
// A replacement process must be able to wait out the complete stale-lock TTL.
|
|
1132
793
|
lockWaitMs: 11 * 60_000,
|
|
1133
794
|
lockTtlMs: 10 * 60_000,
|
|
1134
795
|
});
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
if (
|
|
1157
|
-
|
|
1158
|
-
}
|
|
1159
|
-
if (metadata.ownerType === 'workhoster') {
|
|
1160
|
-
set['metadata.ownerType'] = 'gatewayClient';
|
|
796
|
+
// Register steps in execution order; each `.from()` is the previous `.to()`,
|
|
797
|
+
// and `oldestSupportedVersion` pins the first one as the floor of this
|
|
798
|
+
// release. Registration stops at `targetVersion` so a target that is not a
|
|
799
|
+
// step boundary is bridged by smartmigration instead of overshooting.
|
|
800
|
+
const reaches = (versionArg) => compareSemver(targetVersion, versionArg) >= 0;
|
|
801
|
+
/**
|
|
802
|
+
* Close the chain. A `targetVersion` that is not a step boundary is bridged,
|
|
803
|
+
* and that bridge repeats the settings safeguards the chain reached rather
|
|
804
|
+
* than being a no-op: the persisted settings document can be seeded from
|
|
805
|
+
* bootstrap config in the very run that bridges it.
|
|
806
|
+
*/
|
|
807
|
+
const finish = (chainEndArg) => {
|
|
808
|
+
if (compareSemver(targetVersion, chainEndArg) <= 0)
|
|
809
|
+
return migration;
|
|
810
|
+
migration
|
|
811
|
+
.step('backfill-settings-to-target')
|
|
812
|
+
.from(chainEndArg).to(targetVersion)
|
|
813
|
+
.description('Bridge to a target between two chain boundaries, repeating the settings safeguards')
|
|
814
|
+
.up(async (ctx) => {
|
|
815
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
816
|
+
await backfillEmailServerSettings(ctx, options);
|
|
817
|
+
if (compareSemver(chainEndArg, legacyCentralEuDeliverRouteMigrationVersion) >= 0) {
|
|
818
|
+
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
1161
819
|
}
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
'metadata.workHosterType': '',
|
|
1165
|
-
'metadata.workHosterId': '',
|
|
1166
|
-
'metadata.workAppId': '',
|
|
1167
|
-
},
|
|
1168
|
-
};
|
|
1169
|
-
if (Object.keys(set).length > 0) {
|
|
1170
|
-
update.$set = set;
|
|
820
|
+
if (compareSemver(chainEndArg, smtpAuthAccountsMigrationVersion) >= 0) {
|
|
821
|
+
await convertLegacySmtpAuthUsers(ctx);
|
|
1171
822
|
}
|
|
1172
|
-
await collection.updateOne({ _id: doc._id }, update);
|
|
1173
|
-
}
|
|
1174
|
-
ctx.log.log('info', `normalize-gateway-client-route-metadata: migrated ${docs.length} route(s)`);
|
|
1175
|
-
}
|
|
1176
|
-
function isStandardSourceBinding(binding) {
|
|
1177
|
-
if (!binding || typeof binding !== 'object')
|
|
1178
|
-
return false;
|
|
1179
|
-
const sourceProfileRef = typeof binding.sourceProfileRef === 'string'
|
|
1180
|
-
? binding.sourceProfileRef.trim().toLowerCase()
|
|
1181
|
-
: '';
|
|
1182
|
-
const sourceProfileName = typeof binding.sourceProfileName === 'string'
|
|
1183
|
-
? binding.sourceProfileName.trim().toLowerCase()
|
|
1184
|
-
: '';
|
|
1185
|
-
return sourceProfileRef === 'standard' || sourceProfileName === 'standard';
|
|
1186
|
-
}
|
|
1187
|
-
async function preferPublicSourceBindingsForGatewayClientRoutes(ctx) {
|
|
1188
|
-
const profileCollection = ctx.mongo.collection('SourceProfileDoc');
|
|
1189
|
-
const routeCollection = ctx.mongo.collection('RouteDoc');
|
|
1190
|
-
const profiles = await profileCollection.find({}).toArray();
|
|
1191
|
-
const publicProfile = profiles.find((profile) => {
|
|
1192
|
-
return typeof profile.id === 'string' && profile.id.trim().toLowerCase() === 'public';
|
|
1193
|
-
}) || profiles.find((profile) => {
|
|
1194
|
-
return typeof profile.name === 'string' && profile.name.trim().toLowerCase() === 'public';
|
|
1195
|
-
});
|
|
1196
|
-
if (!publicProfile?.id) {
|
|
1197
|
-
ctx.log.log('warn', 'gateway-client-routes-use-public-source-profile: PUBLIC source profile not found, skipping');
|
|
1198
|
-
return;
|
|
1199
|
-
}
|
|
1200
|
-
const publicBinding = {
|
|
1201
|
-
sourceProfileRef: String(publicProfile.id),
|
|
1202
|
-
sourceProfileName: typeof publicProfile.name === 'string' ? publicProfile.name : 'PUBLIC',
|
|
1203
|
-
};
|
|
1204
|
-
const cursor = routeCollection.find({
|
|
1205
|
-
'metadata.ownerType': 'gatewayClient',
|
|
1206
823
|
});
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
inspected++;
|
|
1212
|
-
const metadata = doc.metadata || {};
|
|
1213
|
-
const sourceBindings = Array.isArray(metadata.sourceBindings)
|
|
1214
|
-
? metadata.sourceBindings
|
|
1215
|
-
: [];
|
|
1216
|
-
const shouldMigrate = sourceBindings.length === 0
|
|
1217
|
-
|| sourceBindings.every((binding) => isStandardSourceBinding(binding));
|
|
1218
|
-
if (!shouldMigrate) {
|
|
1219
|
-
continue;
|
|
1220
|
-
}
|
|
1221
|
-
await routeCollection.updateOne(doc._id ? { _id: doc._id } : { id: doc.id }, {
|
|
1222
|
-
$set: {
|
|
1223
|
-
'metadata.sourceBindings': [publicBinding],
|
|
1224
|
-
'metadata.lastResolvedAt': now,
|
|
1225
|
-
updatedAt: now,
|
|
1226
|
-
},
|
|
1227
|
-
$unset: {
|
|
1228
|
-
'route.security': '',
|
|
1229
|
-
},
|
|
1230
|
-
});
|
|
1231
|
-
migrated++;
|
|
1232
|
-
}
|
|
1233
|
-
ctx.log.log('info', `gateway-client-routes-use-public-source-profile: migrated ${migrated}/${inspected} route(s)`);
|
|
1234
|
-
}
|
|
1235
|
-
// Register steps in execution order. Each step's .from() must match the
|
|
1236
|
-
// previous step's .to() to form a contiguous chain.
|
|
824
|
+
return migration;
|
|
825
|
+
};
|
|
826
|
+
if (!reaches(serviceMailIdempotencyMigrationVersion))
|
|
827
|
+
return finish(serviceMailIdempotencyPreviousVersion);
|
|
1237
828
|
migration
|
|
1238
|
-
.step('
|
|
1239
|
-
.from(
|
|
1240
|
-
.description('
|
|
1241
|
-
.up(async (ctx) => migrateTargetProfileTargetHosts(ctx))
|
|
1242
|
-
.step('rename-domain-source-manual-to-dcrouter')
|
|
1243
|
-
.from('13.1.0').to('13.8.1')
|
|
1244
|
-
.description('Rename DomainDoc.source value from "manual" to "dcrouter"')
|
|
829
|
+
.step('index-service-mail-idempotency')
|
|
830
|
+
.from(serviceMailIdempotencyPreviousVersion).to(serviceMailIdempotencyMigrationVersion)
|
|
831
|
+
.description('Repair replay metadata and create the credential-scoped sparse unique service-mail index')
|
|
1245
832
|
.up(async (ctx) => {
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
.
|
|
1252
|
-
.
|
|
833
|
+
await migrateServiceMailIdempotencyIndex(ctx);
|
|
834
|
+
});
|
|
835
|
+
if (!reaches(webPushSchemaMigrationVersion))
|
|
836
|
+
return finish(serviceMailIdempotencyMigrationVersion);
|
|
837
|
+
migration
|
|
838
|
+
.step('web-push-provider-schema')
|
|
839
|
+
.from(webPushSchemaPreviousVersion).to(webPushSchemaMigrationVersion)
|
|
840
|
+
.description('Create durable Web Push binding, delivery, idempotency, and retention indexes')
|
|
1253
841
|
.up(async (ctx) => {
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
ctx
|
|
1257
|
-
})
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
842
|
+
await migrateWebPushProviderSchema(ctx);
|
|
843
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
844
|
+
await backfillEmailServerSettings(ctx, options);
|
|
845
|
+
});
|
|
846
|
+
if (!reaches(routeIngressPolicyMigrationVersion))
|
|
847
|
+
return finish(webPushSchemaMigrationVersion);
|
|
848
|
+
migration
|
|
849
|
+
.step('backfill-route-ingress-policies')
|
|
850
|
+
.from(routeIngressPolicyPreviousVersion).to(routeIngressPolicyMigrationVersion)
|
|
851
|
+
.description('Preserve existing route reachability with explicit direct hub and SmartVPN ingress policy')
|
|
1261
852
|
.up(async (ctx) => {
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
ctx.log.log('info', `Set origin='api' on ${result.modifiedCount} migrated route(s)`);
|
|
1273
|
-
// 3. Drop RouteOverrideDoc collection
|
|
1274
|
-
const overrideCollections = await db.listCollections({ name: 'RouteOverrideDoc' }).toArray();
|
|
1275
|
-
if (overrideCollections.length > 0) {
|
|
1276
|
-
await db.collection('RouteOverrideDoc').drop();
|
|
1277
|
-
ctx.log.log('info', 'Dropped RouteOverrideDoc collection');
|
|
1278
|
-
}
|
|
1279
|
-
})
|
|
1280
|
-
.step('repair-target-profile-ip-migration')
|
|
1281
|
-
.from('13.16.0').to('13.17.4')
|
|
1282
|
-
.description('Repair TargetProfileDoc.targets host→ip migration for already-upgraded installs')
|
|
853
|
+
await backfillRouteIngressPolicies(ctx);
|
|
854
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
855
|
+
await backfillEmailServerSettings(ctx, options);
|
|
856
|
+
});
|
|
857
|
+
if (!reaches(sourceProfileNetworkNormalizationMigrationVersion))
|
|
858
|
+
return finish(routeIngressPolicyMigrationVersion);
|
|
859
|
+
migration
|
|
860
|
+
.step('normalize-private-source-profile-networks')
|
|
861
|
+
.from(routeIngressPolicyMigrationVersion).to(sourceProfileNetworkNormalizationMigrationVersion)
|
|
862
|
+
.description('Normalize legacy private source-profile wildcards to valid CIDR notation')
|
|
1283
863
|
.up(async (ctx) => {
|
|
1284
|
-
await
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
864
|
+
await normalizeLegacyPrivateSourceProfileNetworks(ctx);
|
|
865
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
866
|
+
await backfillEmailServerSettings(ctx, options);
|
|
867
|
+
});
|
|
868
|
+
if (!reaches(gatewayDnsProxyIntentMigrationVersion))
|
|
869
|
+
return finish(sourceProfileNetworkNormalizationMigrationVersion);
|
|
870
|
+
migration
|
|
871
|
+
.step('backfill-gateway-dns-proxy-intent')
|
|
872
|
+
.from(sourceProfileNetworkNormalizationMigrationVersion).to(gatewayDnsProxyIntentMigrationVersion)
|
|
873
|
+
.description('Recover gateway route DNS proxy intent from owned provider record state')
|
|
1289
874
|
.up(async (ctx) => {
|
|
1290
|
-
await
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
875
|
+
await backfillGatewayDnsProxyIntent(ctx);
|
|
876
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
877
|
+
await backfillEmailServerSettings(ctx, options);
|
|
878
|
+
});
|
|
879
|
+
if (!reaches(legacyCentralEuDeliverRouteMigrationVersion))
|
|
880
|
+
return finish(gatewayDnsProxyIntentMigrationVersion);
|
|
881
|
+
migration
|
|
882
|
+
.step('remove-legacy-central-eu-deliver-route')
|
|
883
|
+
.from(gatewayDnsProxyIntentMigrationVersion).to(legacyCentralEuDeliverRouteMigrationVersion)
|
|
884
|
+
.description('Remove the legacy central.eu-incoming deliver route so accepted mail falls through to the domain inbound store policy')
|
|
1295
885
|
.up(async (ctx) => {
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
.
|
|
1299
|
-
|
|
1300
|
-
|
|
886
|
+
// Backfills run first so a leapfrog upgrade that seeds the settings doc
|
|
887
|
+
// (including the legacy route) in this very step is normalized before
|
|
888
|
+
// the step completes.
|
|
889
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
890
|
+
await backfillEmailServerSettings(ctx, options);
|
|
891
|
+
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
892
|
+
});
|
|
893
|
+
if (!reaches(smtpAuthAccountsMigrationVersion))
|
|
894
|
+
return finish(legacyCentralEuDeliverRouteMigrationVersion);
|
|
895
|
+
migration
|
|
896
|
+
.step('convert-legacy-smtp-auth-users')
|
|
897
|
+
.from(legacyCentralEuDeliverRouteMigrationVersion).to(smtpAuthAccountsMigrationVersion)
|
|
898
|
+
.description('Convert legacy plaintext emailConfig.auth.users into hashed SMTP account documents and strip the plaintext from persisted settings')
|
|
1301
899
|
.up(async (ctx) => {
|
|
1302
|
-
await
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
900
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
901
|
+
await backfillEmailServerSettings(ctx, options);
|
|
902
|
+
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
903
|
+
await convertLegacySmtpAuthUsers(ctx);
|
|
904
|
+
});
|
|
905
|
+
if (!reaches(monitoringEventsMigrationVersion))
|
|
906
|
+
return finish(smtpAuthAccountsMigrationVersion);
|
|
907
|
+
migration
|
|
908
|
+
.step('create-monitoring-event-indexes')
|
|
909
|
+
.from(smtpAuthAccountsMigrationVersion).to(monitoringEventsMigrationVersion)
|
|
910
|
+
.description('Create durable authentication event and email traffic bucket indexes')
|
|
1307
911
|
.up(async (ctx) => {
|
|
1308
|
-
await
|
|
912
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
913
|
+
await backfillEmailServerSettings(ctx, options);
|
|
914
|
+
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
915
|
+
await convertLegacySmtpAuthUsers(ctx);
|
|
916
|
+
await createMonitoringEventIndexes(ctx);
|
|
917
|
+
});
|
|
918
|
+
if (!reaches(cachedEmailAcceptedAtIndexMigrationVersion))
|
|
919
|
+
return finish(monitoringEventsMigrationVersion);
|
|
920
|
+
migration
|
|
921
|
+
.step('index-cached-email-accepted-at')
|
|
922
|
+
.from(monitoringEventsMigrationVersion).to(cachedEmailAcceptedAtIndexMigrationVersion)
|
|
923
|
+
.description('Index CachedEmail.acceptedAt for retained email traffic and security views')
|
|
924
|
+
.up(async (ctx) => {
|
|
925
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
926
|
+
await backfillEmailServerSettings(ctx, options);
|
|
927
|
+
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
928
|
+
await convertLegacySmtpAuthUsers(ctx);
|
|
929
|
+
await createCachedEmailAcceptedAtIndex(ctx);
|
|
930
|
+
});
|
|
931
|
+
if (!reaches(cachedEmailSecurityDispositionMigrationVersion))
|
|
932
|
+
return finish(cachedEmailAcceptedAtIndexMigrationVersion);
|
|
933
|
+
migration
|
|
934
|
+
.step('backfill-cached-email-security-disposition')
|
|
935
|
+
.from(cachedEmailAcceptedAtIndexMigrationVersion).to(cachedEmailSecurityDispositionMigrationVersion)
|
|
936
|
+
.description('Classify retained inbound authentication results without overwriting delivery state')
|
|
937
|
+
.up(async (ctx) => {
|
|
938
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
939
|
+
await backfillEmailServerSettings(ctx, options);
|
|
940
|
+
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
941
|
+
await convertLegacySmtpAuthUsers(ctx);
|
|
942
|
+
await backfillCachedEmailSecurityDisposition(ctx);
|
|
943
|
+
});
|
|
944
|
+
if (!reaches(gatewayMailDomainAuthorityMigrationVersion))
|
|
945
|
+
return finish(cachedEmailSecurityDispositionMigrationVersion);
|
|
946
|
+
migration
|
|
947
|
+
.step('bridge-cached-email-security-disposition-to-gateway-mail-domain-authority')
|
|
948
|
+
.from(cachedEmailSecurityDispositionMigrationVersion).to(gatewayMailDomainAuthorityPreviousVersion)
|
|
949
|
+
.description('Bridge the 18.5.0 release before migrating WorkApp mail identity authority')
|
|
950
|
+
.up(async (ctx) => {
|
|
951
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
952
|
+
await backfillEmailServerSettings(ctx, options);
|
|
953
|
+
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
954
|
+
await convertLegacySmtpAuthUsers(ctx);
|
|
1309
955
|
})
|
|
1310
|
-
.step('
|
|
1311
|
-
.from(
|
|
1312
|
-
.description('
|
|
956
|
+
.step('migrate-gateway-mail-domain-authority')
|
|
957
|
+
.from(gatewayMailDomainAuthorityPreviousVersion).to(gatewayMailDomainAuthorityMigrationVersion)
|
|
958
|
+
.description('Move WorkApp mail identities into authoritative owner/domain SmartData documents')
|
|
1313
959
|
.up(async (ctx) => {
|
|
1314
960
|
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1315
961
|
await backfillEmailServerSettings(ctx, options);
|
|
962
|
+
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
963
|
+
await convertLegacySmtpAuthUsers(ctx);
|
|
964
|
+
await migrateGatewayMailDomainAuthority(ctx);
|
|
1316
965
|
});
|
|
1317
|
-
if (
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
await backfillCachedEmailDirections(ctx);
|
|
1374
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1375
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1376
|
-
});
|
|
1377
|
-
if (compareSemver(targetVersion, mailOverEdgesMigrationVersion) > 0) {
|
|
1378
|
-
if (compareSemver(targetVersion, cachedEmailStatusIndexMigrationVersion) >= 0) {
|
|
1379
|
-
migration
|
|
1380
|
-
.step('backfill-remote-ingress-hub-settings-before-cached-email-status-index')
|
|
1381
|
-
.from(mailOverEdgesMigrationVersion).to(cachedEmailStatusIndexPreviousVersion)
|
|
1382
|
-
.description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
|
|
1383
|
-
.up(async (ctx) => {
|
|
1384
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1385
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1386
|
-
});
|
|
1387
|
-
migration
|
|
1388
|
-
.step('index-cached-email-status')
|
|
1389
|
-
.from(cachedEmailStatusIndexPreviousVersion).to(cachedEmailStatusIndexMigrationVersion)
|
|
1390
|
-
.description('Index CachedEmail.status for bounded spool delivery scans')
|
|
1391
|
-
.up(async (ctx) => {
|
|
1392
|
-
const collection = ctx.mongo.collection('CachedEmail');
|
|
1393
|
-
await collection.createIndex({ status: 1 }, { name: 'status_1' });
|
|
1394
|
-
ctx.log.log('info', 'index-cached-email-status: ensured CachedEmail.status index');
|
|
1395
|
-
});
|
|
1396
|
-
if (compareSemver(targetVersion, cachedEmailStatusIndexMigrationVersion) > 0) {
|
|
1397
|
-
if (compareSemver(targetVersion, emailDnsLifecycleMigrationVersion) >= 0) {
|
|
1398
|
-
migration
|
|
1399
|
-
.step('email-dns-lifecycle')
|
|
1400
|
-
.from(cachedEmailStatusIndexMigrationVersion).to(emailDnsLifecycleMigrationVersion)
|
|
1401
|
-
.description('Add durable email DNS lifecycle state, unique domains, and explicit managed record ownership')
|
|
1402
|
-
.up(async (ctx) => {
|
|
1403
|
-
await migrateEmailDnsLifecycle(ctx);
|
|
1404
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1405
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1406
|
-
});
|
|
1407
|
-
if (compareSemver(targetVersion, smartMtaManagedStorageMigrationVersion) >= 0) {
|
|
1408
|
-
migration
|
|
1409
|
-
.step('migrate-smartmta-managed-storage')
|
|
1410
|
-
.from(emailDnsLifecycleMigrationVersion).to(smartMtaManagedStorageMigrationVersion)
|
|
1411
|
-
.description('Import legacy SmartMTA text state into SmartData and repair sparse DNS ownership indexing')
|
|
1412
|
-
.up(async (ctx) => {
|
|
1413
|
-
await migrateSmartMtaManagedStorage(ctx, options);
|
|
1414
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1415
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1416
|
-
});
|
|
1417
|
-
if (compareSemver(targetVersion, smartMtaManagedStorageMigrationVersion) > 0) {
|
|
1418
|
-
if (compareSemver(targetVersion, emailDnsProviderProvenanceMigrationVersion) >= 0) {
|
|
1419
|
-
migration
|
|
1420
|
-
.step('bridge-smartmta-storage-to-dcrouter-17')
|
|
1421
|
-
.from(smartMtaManagedStorageMigrationVersion).to(emailDnsProviderProvenancePreviousVersion)
|
|
1422
|
-
.description('Bridge SmartMTA storage schema to dcrouter 17.0.0')
|
|
1423
|
-
.up(async (ctx) => {
|
|
1424
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1425
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1426
|
-
})
|
|
1427
|
-
.step('email-dns-provider-provenance')
|
|
1428
|
-
.from(emailDnsProviderProvenancePreviousVersion).to(emailDnsProviderProvenanceMigrationVersion)
|
|
1429
|
-
.description('Backfill durable provider-zone provenance for safe email DNS cleanup')
|
|
1430
|
-
.up(async (ctx) => {
|
|
1431
|
-
await migrateCachedEmailRawContentToBlobStorage(ctx, options);
|
|
1432
|
-
await migrateEmailDnsProviderProvenance(ctx);
|
|
1433
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1434
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1435
|
-
});
|
|
1436
|
-
if (compareSemver(targetVersion, emailDnsProviderProvenanceMigrationVersion) > 0) {
|
|
1437
|
-
if (compareSemver(targetVersion, ipIntelligenceRetentionMigrationVersion) >= 0) {
|
|
1438
|
-
migration
|
|
1439
|
-
.step('bridge-email-dns-provenance-to-ip-intelligence-retention')
|
|
1440
|
-
.from(emailDnsProviderProvenanceMigrationVersion).to(ipIntelligenceRetentionPreviousVersion)
|
|
1441
|
-
.description('Bridge email DNS provenance to the IP intelligence retention migration')
|
|
1442
|
-
.up(async (ctx) => {
|
|
1443
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1444
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1445
|
-
})
|
|
1446
|
-
.step('bound-ip-intelligence-retention')
|
|
1447
|
-
.from(ipIntelligenceRetentionPreviousVersion).to(ipIntelligenceRetentionMigrationVersion)
|
|
1448
|
-
.description('Reset and index the rebuildable bounded IP intelligence cache')
|
|
1449
|
-
.resumable()
|
|
1450
|
-
.up(async (ctx) => {
|
|
1451
|
-
await migrateIpIntelligenceRetention(ctx);
|
|
1452
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1453
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1454
|
-
});
|
|
1455
|
-
if (compareSemver(targetVersion, ipIntelligenceRetentionMigrationVersion) > 0) {
|
|
1456
|
-
if (compareSemver(targetVersion, gatewayCredentialPolicyMigrationVersion) >= 0) {
|
|
1457
|
-
migration
|
|
1458
|
-
.step('gateway-credential-policy-bindings')
|
|
1459
|
-
.from(ipIntelligenceRetentionMigrationVersion).to(gatewayCredentialPolicyMigrationVersion)
|
|
1460
|
-
.description('Bind legacy gateway credentials to a durable live policy generation')
|
|
1461
|
-
.up(async (ctx) => {
|
|
1462
|
-
await migrateGatewayCredentialPolicyBindings(ctx);
|
|
1463
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1464
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1465
|
-
});
|
|
1466
|
-
if (compareSemver(targetVersion, gatewayCredentialPolicyMigrationVersion) > 0) {
|
|
1467
|
-
if (compareSemver(targetVersion, serviceMailIdempotencyMigrationVersion) >= 0) {
|
|
1468
|
-
migration
|
|
1469
|
-
.step('bridge-gateway-credential-policy-to-service-mail-idempotency')
|
|
1470
|
-
.from(gatewayCredentialPolicyMigrationVersion).to(serviceMailIdempotencyPreviousVersion)
|
|
1471
|
-
.description('Bridge dcrouter releases before the service-mail idempotency index')
|
|
1472
|
-
.up(async (ctx) => {
|
|
1473
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1474
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1475
|
-
})
|
|
1476
|
-
.step('index-service-mail-idempotency')
|
|
1477
|
-
.from(serviceMailIdempotencyPreviousVersion).to(serviceMailIdempotencyMigrationVersion)
|
|
1478
|
-
.description('Repair replay metadata and create the credential-scoped sparse unique service-mail index')
|
|
1479
|
-
.up(async (ctx) => {
|
|
1480
|
-
await migrateServiceMailIdempotencyIndex(ctx);
|
|
1481
|
-
});
|
|
1482
|
-
if (compareSemver(targetVersion, webPushSchemaMigrationVersion) >= 0) {
|
|
1483
|
-
migration
|
|
1484
|
-
.step('web-push-provider-schema')
|
|
1485
|
-
.from(webPushSchemaPreviousVersion).to(webPushSchemaMigrationVersion)
|
|
1486
|
-
.description('Create durable Web Push binding, delivery, idempotency, and retention indexes')
|
|
1487
|
-
.up(async (ctx) => {
|
|
1488
|
-
await migrateWebPushProviderSchema(ctx);
|
|
1489
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1490
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1491
|
-
});
|
|
1492
|
-
if (compareSemver(targetVersion, routeIngressPolicyMigrationVersion) >= 0) {
|
|
1493
|
-
migration
|
|
1494
|
-
.step('backfill-route-ingress-policies')
|
|
1495
|
-
.from(routeIngressPolicyPreviousVersion).to(routeIngressPolicyMigrationVersion)
|
|
1496
|
-
.description('Preserve existing route reachability with explicit direct hub and SmartVPN ingress policy')
|
|
1497
|
-
.up(async (ctx) => {
|
|
1498
|
-
await backfillRouteIngressPolicies(ctx);
|
|
1499
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1500
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1501
|
-
});
|
|
1502
|
-
if (compareSemver(targetVersion, routeIngressPolicyMigrationVersion) > 0) {
|
|
1503
|
-
if (compareSemver(targetVersion, sourceProfileNetworkNormalizationMigrationVersion) >= 0) {
|
|
1504
|
-
migration
|
|
1505
|
-
.step('normalize-private-source-profile-networks')
|
|
1506
|
-
.from(routeIngressPolicyMigrationVersion).to(sourceProfileNetworkNormalizationMigrationVersion)
|
|
1507
|
-
.description('Normalize legacy private source-profile wildcards to valid CIDR notation')
|
|
1508
|
-
.up(async (ctx) => {
|
|
1509
|
-
await normalizeLegacyPrivateSourceProfileNetworks(ctx);
|
|
1510
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1511
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1512
|
-
});
|
|
1513
|
-
if (compareSemver(targetVersion, sourceProfileNetworkNormalizationMigrationVersion) > 0) {
|
|
1514
|
-
if (compareSemver(targetVersion, gatewayDnsProxyIntentMigrationVersion) >= 0) {
|
|
1515
|
-
migration
|
|
1516
|
-
.step('backfill-gateway-dns-proxy-intent')
|
|
1517
|
-
.from(sourceProfileNetworkNormalizationMigrationVersion).to(gatewayDnsProxyIntentMigrationVersion)
|
|
1518
|
-
.description('Recover gateway route DNS proxy intent from owned provider record state')
|
|
1519
|
-
.up(async (ctx) => {
|
|
1520
|
-
await backfillGatewayDnsProxyIntent(ctx);
|
|
1521
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1522
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1523
|
-
});
|
|
1524
|
-
if (compareSemver(targetVersion, gatewayDnsProxyIntentMigrationVersion) > 0) {
|
|
1525
|
-
if (compareSemver(targetVersion, legacyCentralEuDeliverRouteMigrationVersion) >= 0) {
|
|
1526
|
-
migration
|
|
1527
|
-
.step('remove-legacy-central-eu-deliver-route')
|
|
1528
|
-
.from(gatewayDnsProxyIntentMigrationVersion).to(legacyCentralEuDeliverRouteMigrationVersion)
|
|
1529
|
-
.description('Remove the legacy central.eu-incoming deliver route so accepted mail falls through to the domain inbound store policy')
|
|
1530
|
-
.up(async (ctx) => {
|
|
1531
|
-
// Backfills run first so a leapfrog upgrade that seeds the
|
|
1532
|
-
// settings doc (including the legacy route) in this very
|
|
1533
|
-
// step is normalized before the step completes.
|
|
1534
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1535
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1536
|
-
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
1537
|
-
});
|
|
1538
|
-
if (compareSemver(targetVersion, legacyCentralEuDeliverRouteMigrationVersion) > 0) {
|
|
1539
|
-
if (compareSemver(targetVersion, smtpAuthAccountsMigrationVersion) >= 0) {
|
|
1540
|
-
migration
|
|
1541
|
-
.step('convert-legacy-smtp-auth-users')
|
|
1542
|
-
.from(legacyCentralEuDeliverRouteMigrationVersion).to(smtpAuthAccountsMigrationVersion)
|
|
1543
|
-
.description('Convert legacy plaintext emailConfig.auth.users into hashed SMTP account documents and strip the plaintext from persisted settings')
|
|
1544
|
-
.up(async (ctx) => {
|
|
1545
|
-
// Backfills run first so a leapfrog upgrade that seeds
|
|
1546
|
-
// the settings doc (including plaintext users) in this
|
|
1547
|
-
// very step is normalized before the step completes.
|
|
1548
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1549
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1550
|
-
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
1551
|
-
await convertLegacySmtpAuthUsers(ctx);
|
|
1552
|
-
});
|
|
1553
|
-
if (compareSemver(targetVersion, smtpAuthAccountsMigrationVersion) > 0) {
|
|
1554
|
-
if (compareSemver(targetVersion, monitoringEventsMigrationVersion) >= 0) {
|
|
1555
|
-
migration
|
|
1556
|
-
.step('create-monitoring-event-indexes')
|
|
1557
|
-
.from(smtpAuthAccountsMigrationVersion).to(monitoringEventsMigrationVersion)
|
|
1558
|
-
.description('Create durable authentication event and email traffic bucket indexes')
|
|
1559
|
-
.up(async (ctx) => {
|
|
1560
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1561
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1562
|
-
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
1563
|
-
await convertLegacySmtpAuthUsers(ctx);
|
|
1564
|
-
await createMonitoringEventIndexes(ctx);
|
|
1565
|
-
});
|
|
1566
|
-
if (compareSemver(targetVersion, monitoringEventsMigrationVersion) > 0) {
|
|
1567
|
-
if (compareSemver(targetVersion, cachedEmailAcceptedAtIndexMigrationVersion) >= 0) {
|
|
1568
|
-
migration
|
|
1569
|
-
.step('index-cached-email-accepted-at')
|
|
1570
|
-
.from(monitoringEventsMigrationVersion).to(cachedEmailAcceptedAtIndexMigrationVersion)
|
|
1571
|
-
.description('Index CachedEmail.acceptedAt for retained email traffic and security views')
|
|
1572
|
-
.up(async (ctx) => {
|
|
1573
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1574
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1575
|
-
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
1576
|
-
await convertLegacySmtpAuthUsers(ctx);
|
|
1577
|
-
await createCachedEmailAcceptedAtIndex(ctx);
|
|
1578
|
-
});
|
|
1579
|
-
if (compareSemver(targetVersion, cachedEmailAcceptedAtIndexMigrationVersion) > 0) {
|
|
1580
|
-
if (compareSemver(targetVersion, cachedEmailSecurityDispositionMigrationVersion) >= 0) {
|
|
1581
|
-
migration
|
|
1582
|
-
.step('backfill-cached-email-security-disposition')
|
|
1583
|
-
.from(cachedEmailAcceptedAtIndexMigrationVersion).to(cachedEmailSecurityDispositionMigrationVersion)
|
|
1584
|
-
.description('Classify retained inbound authentication results without overwriting delivery state')
|
|
1585
|
-
.up(async (ctx) => {
|
|
1586
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1587
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1588
|
-
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
1589
|
-
await convertLegacySmtpAuthUsers(ctx);
|
|
1590
|
-
await backfillCachedEmailSecurityDisposition(ctx);
|
|
1591
|
-
});
|
|
1592
|
-
if (compareSemver(targetVersion, cachedEmailSecurityDispositionMigrationVersion) > 0) {
|
|
1593
|
-
if (compareSemver(targetVersion, gatewayMailDomainAuthorityMigrationVersion) >= 0) {
|
|
1594
|
-
migration
|
|
1595
|
-
.step('bridge-cached-email-security-disposition-to-gateway-mail-domain-authority')
|
|
1596
|
-
.from(cachedEmailSecurityDispositionMigrationVersion).to(gatewayMailDomainAuthorityPreviousVersion)
|
|
1597
|
-
.description('Bridge the 18.5.0 release before migrating WorkApp mail identity authority')
|
|
1598
|
-
.up(async (ctx) => {
|
|
1599
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1600
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1601
|
-
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
1602
|
-
await convertLegacySmtpAuthUsers(ctx);
|
|
1603
|
-
})
|
|
1604
|
-
.step('migrate-gateway-mail-domain-authority')
|
|
1605
|
-
.from(gatewayMailDomainAuthorityPreviousVersion).to(gatewayMailDomainAuthorityMigrationVersion)
|
|
1606
|
-
.description('Move WorkApp mail identities into authoritative owner/domain SmartData documents')
|
|
1607
|
-
.up(async (ctx) => {
|
|
1608
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1609
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1610
|
-
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
1611
|
-
await convertLegacySmtpAuthUsers(ctx);
|
|
1612
|
-
await migrateGatewayMailDomainAuthority(ctx);
|
|
1613
|
-
});
|
|
1614
|
-
if (compareSemver(targetVersion, smartDb5ManagedRecordKeyRepairMigrationVersion) >= 0) {
|
|
1615
|
-
migration
|
|
1616
|
-
.step('repair-smartdb5-managed-record-key-index')
|
|
1617
|
-
.from(gatewayMailDomainAuthorityMigrationVersion).to(smartDb5ManagedRecordKeyRepairMigrationVersion)
|
|
1618
|
-
.description('Replace the legacy partial managedRecordKey index with a SmartDB 5-compatible sparse unique index')
|
|
1619
|
-
.up(async (ctx) => {
|
|
1620
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1621
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1622
|
-
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
1623
|
-
await convertLegacySmtpAuthUsers(ctx);
|
|
1624
|
-
await repairManagedRecordKeyIndex(ctx, 'smartdb5-managed-record-key-index');
|
|
1625
|
-
});
|
|
1626
|
-
if (compareSemver(targetVersion, testingAccessMigrationVersion) >= 0) {
|
|
1627
|
-
migration
|
|
1628
|
-
.step('testing-access-and-exact-certificate-identities')
|
|
1629
|
-
.from(smartDb5ManagedRecordKeyRepairMigrationVersion).to(testingAccessMigrationVersion)
|
|
1630
|
-
.description('Isolate exact certificates and initialize durable testing access and recovery indexes')
|
|
1631
|
-
.up(async (ctx) => {
|
|
1632
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1633
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1634
|
-
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
1635
|
-
await convertLegacySmtpAuthUsers(ctx);
|
|
1636
|
-
await migrateTestingAccess(ctx);
|
|
1637
|
-
});
|
|
1638
|
-
}
|
|
1639
|
-
else if (compareSemver(targetVersion, smartDb5ManagedRecordKeyRepairMigrationVersion) > 0) {
|
|
1640
|
-
migration
|
|
1641
|
-
.step('backfill-settings-after-smartdb5-managed-record-key-repair')
|
|
1642
|
-
.from(smartDb5ManagedRecordKeyRepairMigrationVersion).to(targetVersion)
|
|
1643
|
-
.description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
|
|
1644
|
-
.up(async (ctx) => {
|
|
1645
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1646
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1647
|
-
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
1648
|
-
await convertLegacySmtpAuthUsers(ctx);
|
|
1649
|
-
});
|
|
1650
|
-
}
|
|
1651
|
-
}
|
|
1652
|
-
else if (compareSemver(targetVersion, gatewayMailDomainAuthorityMigrationVersion) > 0) {
|
|
1653
|
-
migration
|
|
1654
|
-
.step('backfill-settings-after-gateway-mail-domain-authority')
|
|
1655
|
-
.from(gatewayMailDomainAuthorityMigrationVersion).to(targetVersion)
|
|
1656
|
-
.description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
|
|
1657
|
-
.up(async (ctx) => {
|
|
1658
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1659
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1660
|
-
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
1661
|
-
await convertLegacySmtpAuthUsers(ctx);
|
|
1662
|
-
});
|
|
1663
|
-
}
|
|
1664
|
-
}
|
|
1665
|
-
else {
|
|
1666
|
-
migration
|
|
1667
|
-
.step('backfill-settings-after-cached-email-security-disposition')
|
|
1668
|
-
.from(cachedEmailSecurityDispositionMigrationVersion).to(targetVersion)
|
|
1669
|
-
.description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
|
|
1670
|
-
.up(async (ctx) => {
|
|
1671
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1672
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1673
|
-
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
1674
|
-
await convertLegacySmtpAuthUsers(ctx);
|
|
1675
|
-
});
|
|
1676
|
-
}
|
|
1677
|
-
}
|
|
1678
|
-
}
|
|
1679
|
-
else {
|
|
1680
|
-
migration
|
|
1681
|
-
.step('backfill-settings-after-cached-email-accepted-at-index')
|
|
1682
|
-
.from(cachedEmailAcceptedAtIndexMigrationVersion).to(targetVersion)
|
|
1683
|
-
.description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
|
|
1684
|
-
.up(async (ctx) => {
|
|
1685
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1686
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1687
|
-
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
1688
|
-
await convertLegacySmtpAuthUsers(ctx);
|
|
1689
|
-
});
|
|
1690
|
-
}
|
|
1691
|
-
}
|
|
1692
|
-
}
|
|
1693
|
-
else {
|
|
1694
|
-
migration
|
|
1695
|
-
.step('backfill-settings-after-monitoring-event-indexes')
|
|
1696
|
-
.from(monitoringEventsMigrationVersion).to(targetVersion)
|
|
1697
|
-
.description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
|
|
1698
|
-
.up(async (ctx) => {
|
|
1699
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1700
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1701
|
-
// Later bridges must keep every settings safeguard:
|
|
1702
|
-
// legacy bootstrap config can reintroduce retired
|
|
1703
|
-
// routes and plaintext SMTP auth users.
|
|
1704
|
-
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
1705
|
-
await convertLegacySmtpAuthUsers(ctx);
|
|
1706
|
-
});
|
|
1707
|
-
}
|
|
1708
|
-
}
|
|
1709
|
-
}
|
|
1710
|
-
else {
|
|
1711
|
-
migration
|
|
1712
|
-
.step('backfill-settings-after-smtp-auth-account-conversion')
|
|
1713
|
-
.from(smtpAuthAccountsMigrationVersion).to(targetVersion)
|
|
1714
|
-
.description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
|
|
1715
|
-
.up(async (ctx) => {
|
|
1716
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1717
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1718
|
-
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
1719
|
-
await convertLegacySmtpAuthUsers(ctx);
|
|
1720
|
-
});
|
|
1721
|
-
}
|
|
1722
|
-
}
|
|
1723
|
-
}
|
|
1724
|
-
else {
|
|
1725
|
-
migration
|
|
1726
|
-
.step('backfill-settings-after-legacy-deliver-route-removal')
|
|
1727
|
-
.from(legacyCentralEuDeliverRouteMigrationVersion).to(targetVersion)
|
|
1728
|
-
.description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
|
|
1729
|
-
.up(async (ctx) => {
|
|
1730
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1731
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1732
|
-
// The backfill re-seeds emailConfig from a legacy
|
|
1733
|
-
// config.json whenever the persisted doc lost it, so
|
|
1734
|
-
// every later upgrade must strip the legacy route again.
|
|
1735
|
-
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
1736
|
-
});
|
|
1737
|
-
}
|
|
1738
|
-
}
|
|
1739
|
-
}
|
|
1740
|
-
else {
|
|
1741
|
-
migration
|
|
1742
|
-
.step('backfill-settings-after-gateway-dns-proxy-intent')
|
|
1743
|
-
.from(gatewayDnsProxyIntentMigrationVersion).to(targetVersion)
|
|
1744
|
-
.description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
|
|
1745
|
-
.up(async (ctx) => {
|
|
1746
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1747
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1748
|
-
});
|
|
1749
|
-
}
|
|
1750
|
-
}
|
|
1751
|
-
}
|
|
1752
|
-
else {
|
|
1753
|
-
migration
|
|
1754
|
-
.step('backfill-settings-after-source-profile-network-normalization')
|
|
1755
|
-
.from(sourceProfileNetworkNormalizationMigrationVersion).to(targetVersion)
|
|
1756
|
-
.description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
|
|
1757
|
-
.up(async (ctx) => {
|
|
1758
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1759
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1760
|
-
});
|
|
1761
|
-
}
|
|
1762
|
-
}
|
|
1763
|
-
}
|
|
1764
|
-
else {
|
|
1765
|
-
migration
|
|
1766
|
-
.step('backfill-settings-after-route-ingress-policies')
|
|
1767
|
-
.from(routeIngressPolicyMigrationVersion).to(targetVersion)
|
|
1768
|
-
.description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
|
|
1769
|
-
.up(async (ctx) => {
|
|
1770
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1771
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1772
|
-
});
|
|
1773
|
-
}
|
|
1774
|
-
}
|
|
1775
|
-
}
|
|
1776
|
-
else if (compareSemver(targetVersion, webPushSchemaMigrationVersion) > 0) {
|
|
1777
|
-
migration
|
|
1778
|
-
.step('backfill-settings-after-web-push-provider-schema')
|
|
1779
|
-
.from(webPushSchemaMigrationVersion).to(targetVersion)
|
|
1780
|
-
.description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
|
|
1781
|
-
.up(async (ctx) => {
|
|
1782
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1783
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1784
|
-
});
|
|
1785
|
-
}
|
|
1786
|
-
}
|
|
1787
|
-
else if (compareSemver(targetVersion, serviceMailIdempotencyMigrationVersion) > 0) {
|
|
1788
|
-
migration
|
|
1789
|
-
.step('backfill-settings-after-service-mail-idempotency')
|
|
1790
|
-
.from(serviceMailIdempotencyMigrationVersion).to(targetVersion)
|
|
1791
|
-
.description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
|
|
1792
|
-
.up(async (ctx) => {
|
|
1793
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1794
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1795
|
-
});
|
|
1796
|
-
}
|
|
1797
|
-
}
|
|
1798
|
-
else {
|
|
1799
|
-
migration
|
|
1800
|
-
.step('backfill-settings-after-gateway-credential-policy-bindings')
|
|
1801
|
-
.from(gatewayCredentialPolicyMigrationVersion).to(targetVersion)
|
|
1802
|
-
.description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
|
|
1803
|
-
.up(async (ctx) => {
|
|
1804
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1805
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1806
|
-
});
|
|
1807
|
-
}
|
|
1808
|
-
}
|
|
1809
|
-
}
|
|
1810
|
-
else {
|
|
1811
|
-
migration
|
|
1812
|
-
.step('backfill-remote-ingress-hub-settings-after-ip-intelligence-retention')
|
|
1813
|
-
.from(ipIntelligenceRetentionMigrationVersion).to(targetVersion)
|
|
1814
|
-
.description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
|
|
1815
|
-
.up(async (ctx) => {
|
|
1816
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1817
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1818
|
-
});
|
|
1819
|
-
}
|
|
1820
|
-
}
|
|
1821
|
-
}
|
|
1822
|
-
else {
|
|
1823
|
-
migration
|
|
1824
|
-
.step('backfill-remote-ingress-hub-settings-after-email-dns-provenance')
|
|
1825
|
-
.from(emailDnsProviderProvenanceMigrationVersion).to(targetVersion)
|
|
1826
|
-
.description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
|
|
1827
|
-
.up(async (ctx) => {
|
|
1828
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1829
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1830
|
-
});
|
|
1831
|
-
}
|
|
1832
|
-
}
|
|
1833
|
-
}
|
|
1834
|
-
else {
|
|
1835
|
-
migration
|
|
1836
|
-
.step('backfill-remote-ingress-hub-settings-after-smartmta-storage')
|
|
1837
|
-
.from(smartMtaManagedStorageMigrationVersion).to(targetVersion)
|
|
1838
|
-
.description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
|
|
1839
|
-
.up(async (ctx) => {
|
|
1840
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1841
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1842
|
-
});
|
|
1843
|
-
}
|
|
1844
|
-
}
|
|
1845
|
-
}
|
|
1846
|
-
}
|
|
1847
|
-
else {
|
|
1848
|
-
migration
|
|
1849
|
-
.step('backfill-remote-ingress-hub-settings-after-cached-email-status-index')
|
|
1850
|
-
.from(cachedEmailStatusIndexMigrationVersion).to(targetVersion)
|
|
1851
|
-
.description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
|
|
1852
|
-
.up(async (ctx) => {
|
|
1853
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1854
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1855
|
-
});
|
|
1856
|
-
}
|
|
1857
|
-
}
|
|
1858
|
-
}
|
|
1859
|
-
else {
|
|
1860
|
-
migration
|
|
1861
|
-
.step('backfill-remote-ingress-hub-settings-after-mail-over-edges')
|
|
1862
|
-
.from(mailOverEdgesMigrationVersion).to(targetVersion)
|
|
1863
|
-
.description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
|
|
1864
|
-
.up(async (ctx) => {
|
|
1865
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1866
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1867
|
-
});
|
|
1868
|
-
}
|
|
1869
|
-
}
|
|
1870
|
-
}
|
|
1871
|
-
else {
|
|
1872
|
-
migration
|
|
1873
|
-
.step('backfill-remote-ingress-hub-settings-after-email-egress')
|
|
1874
|
-
.from(emailOutboundEgressSettingsMigrationVersion).to(targetVersion)
|
|
1875
|
-
.description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
|
|
1876
|
-
.up(async (ctx) => {
|
|
1877
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1878
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1879
|
-
});
|
|
1880
|
-
}
|
|
1881
|
-
}
|
|
1882
|
-
}
|
|
1883
|
-
else {
|
|
1884
|
-
migration
|
|
1885
|
-
.step('backfill-remote-ingress-hub-settings')
|
|
1886
|
-
.from(domainNameUniqueMigrationBaseVersion).to(targetVersion)
|
|
1887
|
-
.description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
|
|
1888
|
-
.up(async (ctx) => {
|
|
1889
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1890
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1891
|
-
});
|
|
1892
|
-
}
|
|
1893
|
-
}
|
|
1894
|
-
}
|
|
1895
|
-
else {
|
|
1896
|
-
migration
|
|
1897
|
-
.step('backfill-remote-ingress-hub-settings')
|
|
1898
|
-
.from(gatewayClientRoutePublicSourceMigrationVersion).to(targetVersion)
|
|
1899
|
-
.description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
|
|
1900
|
-
.up(async (ctx) => {
|
|
1901
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1902
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1903
|
-
});
|
|
1904
|
-
}
|
|
1905
|
-
}
|
|
1906
|
-
}
|
|
1907
|
-
else {
|
|
1908
|
-
migration
|
|
1909
|
-
.step('backfill-remote-ingress-hub-settings')
|
|
1910
|
-
.from(gatewayClientRouteMetadataMigrationVersion).to(targetVersion)
|
|
1911
|
-
.description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
|
|
1912
|
-
.up(async (ctx) => {
|
|
1913
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1914
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1915
|
-
});
|
|
1916
|
-
}
|
|
1917
|
-
}
|
|
1918
|
-
}
|
|
1919
|
-
else if (compareSemver(targetVersion, remoteIngressHubSettingsMigrationBaseVersion) > 0) {
|
|
1920
|
-
migration
|
|
1921
|
-
.step('backfill-remote-ingress-hub-settings')
|
|
1922
|
-
.from(remoteIngressHubSettingsMigrationBaseVersion).to(targetVersion)
|
|
1923
|
-
.description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
|
|
1924
|
-
.up(async (ctx) => {
|
|
1925
|
-
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1926
|
-
await backfillEmailServerSettings(ctx, options);
|
|
1927
|
-
});
|
|
1928
|
-
}
|
|
1929
|
-
return migration;
|
|
966
|
+
if (!reaches(smartDb5ManagedRecordKeyRepairMigrationVersion))
|
|
967
|
+
return finish(gatewayMailDomainAuthorityMigrationVersion);
|
|
968
|
+
migration
|
|
969
|
+
.step('repair-smartdb5-managed-record-key-index')
|
|
970
|
+
.from(gatewayMailDomainAuthorityMigrationVersion).to(smartDb5ManagedRecordKeyRepairMigrationVersion)
|
|
971
|
+
.description('Replace the legacy partial managedRecordKey index with a SmartDB 5-compatible sparse unique index')
|
|
972
|
+
.up(async (ctx) => {
|
|
973
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
974
|
+
await backfillEmailServerSettings(ctx, options);
|
|
975
|
+
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
976
|
+
await convertLegacySmtpAuthUsers(ctx);
|
|
977
|
+
await repairManagedRecordKeyIndex(ctx, 'smartdb5-managed-record-key-index');
|
|
978
|
+
});
|
|
979
|
+
if (!reaches(testingAccessMigrationVersion))
|
|
980
|
+
return finish(smartDb5ManagedRecordKeyRepairMigrationVersion);
|
|
981
|
+
migration
|
|
982
|
+
.step('testing-access-and-exact-certificate-identities')
|
|
983
|
+
.from(smartDb5ManagedRecordKeyRepairMigrationVersion).to(testingAccessMigrationVersion)
|
|
984
|
+
.description('Isolate exact certificates and initialize durable testing access and recovery indexes')
|
|
985
|
+
.up(async (ctx) => {
|
|
986
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
987
|
+
await backfillEmailServerSettings(ctx, options);
|
|
988
|
+
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
989
|
+
await convertLegacySmtpAuthUsers(ctx);
|
|
990
|
+
await migrateTestingAccess(ctx);
|
|
991
|
+
});
|
|
992
|
+
if (!reaches(webPushEncryptionContextMigrationVersion))
|
|
993
|
+
return finish(testingAccessMigrationVersion);
|
|
994
|
+
migration
|
|
995
|
+
.step('webpush-encryption-context')
|
|
996
|
+
.from(testingAccessMigrationVersion).to(webPushEncryptionContextMigrationVersion)
|
|
997
|
+
.description('Reseal every Web Push envelope under the associated data of interfaces 32')
|
|
998
|
+
.resumable()
|
|
999
|
+
.up(async (ctx) => {
|
|
1000
|
+
await migrateWebPushEncryptionContext(ctx, options);
|
|
1001
|
+
});
|
|
1002
|
+
if (!reaches(coreMailPeerVerifierFormatMigrationVersion))
|
|
1003
|
+
return finish(webPushEncryptionContextMigrationVersion);
|
|
1004
|
+
migration
|
|
1005
|
+
.step('coremail-peer-verifier-format')
|
|
1006
|
+
.from(webPushEncryptionContextMigrationVersion).to(coreMailPeerVerifierFormatMigrationVersion)
|
|
1007
|
+
.description('Rewrite stored CoreMail gateway peer verifier formats to the unsuffixed argon2id contract token')
|
|
1008
|
+
.up(async (ctx) => {
|
|
1009
|
+
await migrateCoreMailPeerVerifierFormat(ctx);
|
|
1010
|
+
});
|
|
1011
|
+
if (!reaches(gatewayClientHostRouteKeyMigrationVersion))
|
|
1012
|
+
return finish(coreMailPeerVerifierFormatMigrationVersion);
|
|
1013
|
+
migration
|
|
1014
|
+
.step('host-route-key')
|
|
1015
|
+
.from(coreMailPeerVerifierFormatMigrationVersion).to(gatewayClientHostRouteKeyMigrationVersion)
|
|
1016
|
+
.description('Rewrite stored gateway-client route keys to the unsuffixed combined host-route prefix')
|
|
1017
|
+
.resumable()
|
|
1018
|
+
.up(async (ctx) => {
|
|
1019
|
+
await migrateGatewayClientHostRouteKey(ctx);
|
|
1020
|
+
});
|
|
1021
|
+
return finish(gatewayClientHostRouteKeyMigrationVersion);
|
|
1930
1022
|
}
|
|
1931
|
-
const domainNameUniqueMigrationBaseVersion = '15.0.5';
|
|
1932
|
-
const emailOutboundEgressSettingsMigrationPreviousVersion = '15.6.1';
|
|
1933
|
-
const emailOutboundEgressSettingsMigrationVersion = '15.6.2';
|
|
1934
|
-
const mailOverEdgesMigrationVersion = '16.0.0';
|
|
1935
|
-
const cachedEmailStatusIndexPreviousVersion = '16.4.0';
|
|
1936
|
-
const cachedEmailStatusIndexMigrationVersion = '16.4.1';
|
|
1937
|
-
const emailDnsLifecycleMigrationVersion = '16.5.0';
|
|
1938
|
-
const smartMtaManagedStorageMigrationVersion = '16.5.1';
|
|
1939
|
-
const emailDnsProviderProvenancePreviousVersion = '17.0.0';
|
|
1940
|
-
const emailDnsProviderProvenanceMigrationVersion = '17.1.0';
|
|
1941
|
-
const ipIntelligenceRetentionPreviousVersion = '17.1.4';
|
|
1942
|
-
const ipIntelligenceRetentionMigrationVersion = '17.1.5';
|
|
1943
|
-
const gatewayCredentialPolicyMigrationVersion = '17.3.0';
|
|
1944
1023
|
const serviceMailIdempotencyPreviousVersion = '17.7.2';
|
|
1945
1024
|
const serviceMailIdempotencyMigrationVersion = '17.7.3';
|
|
1946
1025
|
const webPushSchemaPreviousVersion = serviceMailIdempotencyMigrationVersion;
|
|
@@ -1958,12 +1037,14 @@ const gatewayMailDomainAuthorityPreviousVersion = '18.5.0';
|
|
|
1958
1037
|
const gatewayMailDomainAuthorityMigrationVersion = '18.6.0';
|
|
1959
1038
|
const smartDb5ManagedRecordKeyRepairMigrationVersion = '18.8.0';
|
|
1960
1039
|
const testingAccessMigrationVersion = '19.1.0';
|
|
1961
|
-
const
|
|
1040
|
+
const webPushEncryptionContextMigrationVersion = '19.2.0';
|
|
1041
|
+
const coreMailPeerVerifierFormatMigrationVersion = '32.0.0';
|
|
1042
|
+
const gatewayClientHostRouteKeyMigrationVersion = '32.0.1';
|
|
1962
1043
|
const legacyWorkAppMailIdentityStorageKey = '/workhosters/mail-identities.json';
|
|
1963
1044
|
const gatewayMailDomainOwnerIndexName = 'gateway_mail_domain_owner_domain_unique';
|
|
1964
1045
|
function normalizeGatewayMailDomainMigrationDocument(documentArg) {
|
|
1965
1046
|
if (!documentArg || typeof documentArg !== 'object' || Array.isArray(documentArg)) {
|
|
1966
|
-
throw new
|
|
1047
|
+
throw new DcRouterMigrationError('GatewayMailDomainDoc must be an object');
|
|
1967
1048
|
}
|
|
1968
1049
|
const owner = normalizeGatewayMailDomainOwner({
|
|
1969
1050
|
gatewayClientType: documentArg.ownerGatewayClientType,
|
|
@@ -1972,14 +1053,14 @@ function normalizeGatewayMailDomainMigrationDocument(documentArg) {
|
|
|
1972
1053
|
const domain = normalizeGatewayMailDomain(documentArg.domain);
|
|
1973
1054
|
const expectedId = createGatewayMailDomainId(owner, domain);
|
|
1974
1055
|
if (documentArg.id !== expectedId) {
|
|
1975
|
-
throw new
|
|
1056
|
+
throw new DcRouterMigrationError(`GatewayMailDomainDoc has a non-canonical id: ${documentArg.id}`);
|
|
1976
1057
|
}
|
|
1977
1058
|
const groups = groupGatewayMailIdentities(documentArg.identities || []);
|
|
1978
1059
|
if (groups.length !== 1 || groups[0].id !== expectedId) {
|
|
1979
|
-
throw new
|
|
1060
|
+
throw new DcRouterMigrationError(`GatewayMailDomainDoc identities do not match owner/domain: ${expectedId}`);
|
|
1980
1061
|
}
|
|
1981
1062
|
if (!Number.isSafeInteger(documentArg.createdAt) || !Number.isSafeInteger(documentArg.updatedAt)) {
|
|
1982
|
-
throw new
|
|
1063
|
+
throw new DcRouterMigrationError(`GatewayMailDomainDoc timestamps are invalid: ${expectedId}`);
|
|
1983
1064
|
}
|
|
1984
1065
|
return {
|
|
1985
1066
|
id: expectedId,
|
|
@@ -1997,14 +1078,14 @@ function parseLegacyWorkAppMailIdentities(documentArg) {
|
|
|
1997
1078
|
|| documentArg.id !== expectedId
|
|
1998
1079
|
|| documentArg.key !== legacyWorkAppMailIdentityStorageKey
|
|
1999
1080
|
|| typeof documentArg.value !== 'string') {
|
|
2000
|
-
throw new
|
|
1081
|
+
throw new DcRouterMigrationError('Legacy WorkApp mail identity storage document is corrupt');
|
|
2001
1082
|
}
|
|
2002
1083
|
let parsed;
|
|
2003
1084
|
try {
|
|
2004
1085
|
parsed = JSON.parse(documentArg.value);
|
|
2005
1086
|
}
|
|
2006
1087
|
catch (error) {
|
|
2007
|
-
throw new
|
|
1088
|
+
throw new DcRouterMigrationError(`Legacy WorkApp mail identity JSON is malformed: ${error.message}`);
|
|
2008
1089
|
}
|
|
2009
1090
|
if (Array.isArray(parsed))
|
|
2010
1091
|
return parsed;
|
|
@@ -2012,7 +1093,7 @@ function parseLegacyWorkAppMailIdentities(documentArg) {
|
|
|
2012
1093
|
|| typeof parsed !== 'object'
|
|
2013
1094
|
|| parsed.version !== 1
|
|
2014
1095
|
|| !Array.isArray(parsed.identities)) {
|
|
2015
|
-
throw new
|
|
1096
|
+
throw new DcRouterMigrationError('Legacy WorkApp mail identity state must use version 1 with an identities array');
|
|
2016
1097
|
}
|
|
2017
1098
|
return parsed.identities;
|
|
2018
1099
|
}
|
|
@@ -2045,7 +1126,7 @@ async function migrateGatewayMailDomainAuthority(ctx) {
|
|
|
2045
1126
|
normalized.domain,
|
|
2046
1127
|
]);
|
|
2047
1128
|
if (canonicalKeys.has(canonicalKey) || existingById.has(normalized.id)) {
|
|
2048
|
-
throw new
|
|
1129
|
+
throw new DcRouterMigrationError(`Conflicting GatewayMailDomainDoc authority: ${normalized.id}`);
|
|
2049
1130
|
}
|
|
2050
1131
|
canonicalKeys.add(canonicalKey);
|
|
2051
1132
|
existingById.set(normalized.id, normalized);
|
|
@@ -2054,7 +1135,7 @@ async function migrateGatewayMailDomainAuthority(ctx) {
|
|
|
2054
1135
|
for (const existingDocument of existingById.values()) {
|
|
2055
1136
|
const desiredDocument = desiredById.get(existingDocument.id);
|
|
2056
1137
|
if (!desiredDocument || JSON.stringify(existingDocument) !== JSON.stringify(desiredDocument)) {
|
|
2057
|
-
throw new
|
|
1138
|
+
throw new DcRouterMigrationError(`GatewayMailDomainDoc conflicts with legacy authority: ${existingDocument.id}`);
|
|
2058
1139
|
}
|
|
2059
1140
|
}
|
|
2060
1141
|
for (const desiredDocument of desiredDocuments) {
|
|
@@ -2071,7 +1152,7 @@ async function migrateGatewayMailDomainAuthority(ctx) {
|
|
|
2071
1152
|
? [...desiredDocuments].sort((leftArg, rightArg) => leftArg.id.localeCompare(rightArg.id))
|
|
2072
1153
|
: normalizedPersisted;
|
|
2073
1154
|
if (JSON.stringify(normalizedPersisted) !== JSON.stringify(expectedDocuments)) {
|
|
2074
|
-
throw new
|
|
1155
|
+
throw new DcRouterMigrationError('GatewayMailDomainDoc migration verification failed');
|
|
2075
1156
|
}
|
|
2076
1157
|
await domainCollection.createIndex({
|
|
2077
1158
|
ownerGatewayClientType: 1,
|
|
@@ -2090,7 +1171,7 @@ async function migrateGatewayMailDomainAuthority(ctx) {
|
|
|
2090
1171
|
ownerGatewayClientId: 1,
|
|
2091
1172
|
domain: 1,
|
|
2092
1173
|
})) {
|
|
2093
|
-
throw new
|
|
1174
|
+
throw new DcRouterMigrationError('GatewayMailDomainDoc unique owner/domain index verification failed');
|
|
2094
1175
|
}
|
|
2095
1176
|
if (sourceDocument) {
|
|
2096
1177
|
const deleted = await storageCollection.deleteOne({
|
|
@@ -2100,7 +1181,7 @@ async function migrateGatewayMailDomainAuthority(ctx) {
|
|
|
2100
1181
|
value: sourceDocument.value,
|
|
2101
1182
|
});
|
|
2102
1183
|
if (deleted.deletedCount !== 1) {
|
|
2103
|
-
throw new
|
|
1184
|
+
throw new DcRouterMigrationError('Legacy WorkApp mail identity authority changed during migration');
|
|
2104
1185
|
}
|
|
2105
1186
|
}
|
|
2106
1187
|
ctx.log.log('info', `migrate-gateway-mail-domain-authority: verified ${normalizedPersisted.length} owner/domain document(s)`);
|
|
@@ -2213,148 +1294,6 @@ async function createMonitoringEventIndexes(ctx) {
|
|
|
2213
1294
|
]);
|
|
2214
1295
|
ctx.log.log('info', 'create-monitoring-event-indexes: ensured authentication and email traffic indexes');
|
|
2215
1296
|
}
|
|
2216
|
-
async function lstatOrNull(targetPath) {
|
|
2217
|
-
try {
|
|
2218
|
-
return await nodeFs.lstat(targetPath);
|
|
2219
|
-
}
|
|
2220
|
-
catch (error) {
|
|
2221
|
-
if (error.code === 'ENOENT')
|
|
2222
|
-
return null;
|
|
2223
|
-
throw error;
|
|
2224
|
-
}
|
|
2225
|
-
}
|
|
2226
|
-
function assertLegacyPathContained(rootPath, targetPath) {
|
|
2227
|
-
const resolvedRoot = nodePath.resolve(rootPath);
|
|
2228
|
-
const resolvedTarget = nodePath.resolve(targetPath);
|
|
2229
|
-
if (resolvedTarget !== resolvedRoot
|
|
2230
|
-
&& !resolvedTarget.startsWith(`${resolvedRoot}${nodePath.sep}`)) {
|
|
2231
|
-
throw new Error(`Legacy SmartMTA path escapes configured root: ${targetPath}`);
|
|
2232
|
-
}
|
|
2233
|
-
}
|
|
2234
|
-
async function collectLegacySmartMtaEntry(rootPath, relativePath, recursive, entries) {
|
|
2235
|
-
const targetPath = nodePath.resolve(rootPath, relativePath);
|
|
2236
|
-
assertLegacyPathContained(rootPath, targetPath);
|
|
2237
|
-
const stat = await lstatOrNull(targetPath);
|
|
2238
|
-
if (!stat)
|
|
2239
|
-
return;
|
|
2240
|
-
if (stat.isSymbolicLink()) {
|
|
2241
|
-
throw new Error(`Legacy SmartMTA migration refuses symbolic link: ${targetPath}`);
|
|
2242
|
-
}
|
|
2243
|
-
if (stat.isDirectory()) {
|
|
2244
|
-
if (!recursive) {
|
|
2245
|
-
throw new Error(`Expected regular legacy SmartMTA file: ${targetPath}`);
|
|
2246
|
-
}
|
|
2247
|
-
const children = await nodeFs.readdir(targetPath);
|
|
2248
|
-
for (const child of children.sort()) {
|
|
2249
|
-
await collectLegacySmartMtaEntry(rootPath, nodePath.join(relativePath, child), true, entries);
|
|
2250
|
-
}
|
|
2251
|
-
return;
|
|
2252
|
-
}
|
|
2253
|
-
if (!stat.isFile()) {
|
|
2254
|
-
throw new Error(`Legacy SmartMTA migration refuses non-regular file: ${targetPath}`);
|
|
2255
|
-
}
|
|
2256
|
-
const storageKey = normalizeSmartMtaStorageKey(`/${relativePath.split(nodePath.sep).join('/')}`);
|
|
2257
|
-
const namespace = getSmartMtaTextNamespace(storageKey);
|
|
2258
|
-
if (stat.size > namespace.maxBytes) {
|
|
2259
|
-
throw new Error(`Legacy SmartMTA file ${targetPath} exceeds ${namespace.maxBytes} bytes`);
|
|
2260
|
-
}
|
|
2261
|
-
const contents = await nodeFs.readFile(targetPath);
|
|
2262
|
-
let value;
|
|
2263
|
-
try {
|
|
2264
|
-
value = new TextDecoder('utf-8', { fatal: true }).decode(contents);
|
|
2265
|
-
}
|
|
2266
|
-
catch {
|
|
2267
|
-
throw new Error(`Legacy SmartMTA file is not valid UTF-8: ${targetPath}`);
|
|
2268
|
-
}
|
|
2269
|
-
validateSmartMtaTextValue(storageKey, value);
|
|
2270
|
-
entries.push({
|
|
2271
|
-
key: storageKey,
|
|
2272
|
-
value,
|
|
2273
|
-
createdAt: stat.birthtime?.toISOString?.() || stat.mtime.toISOString(),
|
|
2274
|
-
});
|
|
2275
|
-
}
|
|
2276
|
-
function validateSmartMtaStorageDocument(document) {
|
|
2277
|
-
const normalizedKey = normalizeSmartMtaStorageKey(document.key);
|
|
2278
|
-
const expectedId = hashSmartMtaStorageKey(normalizedKey);
|
|
2279
|
-
if (document._id !== expectedId
|
|
2280
|
-
|| document.id !== expectedId
|
|
2281
|
-
|| document.key !== normalizedKey
|
|
2282
|
-
|| typeof document.value !== 'string') {
|
|
2283
|
-
throw new Error(`Corrupt SmartMtaStorageDoc encountered during migration: ${document._id}`);
|
|
2284
|
-
}
|
|
2285
|
-
validateSmartMtaTextValue(document.key, document.value);
|
|
2286
|
-
}
|
|
2287
|
-
function validateDkimPair(domain, selector, privateKeyPem, publicKeyPem) {
|
|
2288
|
-
let privateKey;
|
|
2289
|
-
let publicKey;
|
|
2290
|
-
try {
|
|
2291
|
-
privateKey = nodeCrypto.createPrivateKey(privateKeyPem);
|
|
2292
|
-
publicKey = nodeCrypto.createPublicKey(publicKeyPem);
|
|
2293
|
-
}
|
|
2294
|
-
catch (error) {
|
|
2295
|
-
throw new Error(`Invalid DKIM PEM for ${selector}._domainkey.${domain}: ${error.message}`);
|
|
2296
|
-
}
|
|
2297
|
-
const derivedPublicKey = nodeCrypto.createPublicKey(privateKeyPem).export({
|
|
2298
|
-
type: 'spki',
|
|
2299
|
-
format: 'der',
|
|
2300
|
-
});
|
|
2301
|
-
const storedPublicKey = publicKey.export({
|
|
2302
|
-
type: 'spki',
|
|
2303
|
-
format: 'der',
|
|
2304
|
-
});
|
|
2305
|
-
if (derivedPublicKey.length !== storedPublicKey.length
|
|
2306
|
-
|| !nodeCrypto.timingSafeEqual(derivedPublicKey, storedPublicKey)) {
|
|
2307
|
-
throw new Error(`DKIM private/public key mismatch for ${selector}._domainkey.${domain}`);
|
|
2308
|
-
}
|
|
2309
|
-
const rsaKeySize = privateKey.asymmetricKeyDetails?.modulusLength;
|
|
2310
|
-
return {
|
|
2311
|
-
domain,
|
|
2312
|
-
selector,
|
|
2313
|
-
publicKey: storedPublicKey.toString('base64'),
|
|
2314
|
-
keySize: rsaKeySize || (privateKey.asymmetricKeyType === 'ed25519' ? 256 : 2048),
|
|
2315
|
-
};
|
|
2316
|
-
}
|
|
2317
|
-
function extractDkimPairs(storageDocuments) {
|
|
2318
|
-
const grouped = new Map();
|
|
2319
|
-
for (const document of storageDocuments) {
|
|
2320
|
-
validateSmartMtaStorageDocument(document);
|
|
2321
|
-
const segments = document.key.split('/').filter(Boolean);
|
|
2322
|
-
if (segments[0] !== 'email' || segments[1] !== 'dkim')
|
|
2323
|
-
continue;
|
|
2324
|
-
let domain;
|
|
2325
|
-
let selector;
|
|
2326
|
-
let filename;
|
|
2327
|
-
if (segments.length === 4) {
|
|
2328
|
-
[, , domain, filename] = segments;
|
|
2329
|
-
selector = 'default';
|
|
2330
|
-
}
|
|
2331
|
-
else if (segments.length === 5) {
|
|
2332
|
-
[, , domain, selector, filename] = segments;
|
|
2333
|
-
}
|
|
2334
|
-
else {
|
|
2335
|
-
continue;
|
|
2336
|
-
}
|
|
2337
|
-
if (filename !== 'private.key' && filename !== 'public.key')
|
|
2338
|
-
continue;
|
|
2339
|
-
domain = domain.trim().toLowerCase();
|
|
2340
|
-
selector = selector.trim().toLowerCase();
|
|
2341
|
-
const groupKey = `${domain}\0${selector}`;
|
|
2342
|
-
const group = grouped.get(groupKey) || { domain, selector };
|
|
2343
|
-
if (filename === 'private.key')
|
|
2344
|
-
group.privateKey = document.value;
|
|
2345
|
-
if (filename === 'public.key')
|
|
2346
|
-
group.publicKey = document.value;
|
|
2347
|
-
grouped.set(groupKey, group);
|
|
2348
|
-
}
|
|
2349
|
-
const pairs = [];
|
|
2350
|
-
for (const group of grouped.values()) {
|
|
2351
|
-
if (!group.privateKey || !group.publicKey) {
|
|
2352
|
-
throw new Error(`Incomplete DKIM keypair for ${group.selector}._domainkey.${group.domain}`);
|
|
2353
|
-
}
|
|
2354
|
-
pairs.push(validateDkimPair(group.domain, group.selector, group.privateKey, group.publicKey));
|
|
2355
|
-
}
|
|
2356
|
-
return pairs;
|
|
2357
|
-
}
|
|
2358
1297
|
async function repairManagedRecordKeyIndex(ctx, logPrefix) {
|
|
2359
1298
|
const collection = ctx.mongo.collection('DnsRecordDoc');
|
|
2360
1299
|
if (typeof collection.dropIndex === 'function') {
|
|
@@ -2384,408 +1323,6 @@ async function repairManagedRecordKeyIndex(ctx, logPrefix) {
|
|
|
2384
1323
|
});
|
|
2385
1324
|
ctx.log.log('info', `${logPrefix}: repaired managedRecordKey index and removed ${cleaned} non-string key(s)`);
|
|
2386
1325
|
}
|
|
2387
|
-
async function migrateSmartMtaManagedStorage(ctx, options) {
|
|
2388
|
-
const storageCollection = ctx.mongo.collection('SmartMtaStorageDoc');
|
|
2389
|
-
const legacyRoot = options.legacySmartMtaStoragePath;
|
|
2390
|
-
let imported = 0;
|
|
2391
|
-
let existing = 0;
|
|
2392
|
-
if (legacyRoot) {
|
|
2393
|
-
const rootStat = await lstatOrNull(legacyRoot);
|
|
2394
|
-
if (rootStat?.isSymbolicLink()) {
|
|
2395
|
-
throw new Error(`Legacy SmartMTA storage root must not be a symbolic link: ${legacyRoot}`);
|
|
2396
|
-
}
|
|
2397
|
-
if (rootStat && !rootStat.isDirectory()) {
|
|
2398
|
-
throw new Error(`Legacy SmartMTA storage root must be a directory: ${legacyRoot}`);
|
|
2399
|
-
}
|
|
2400
|
-
const legacyEntries = [];
|
|
2401
|
-
for (const relativePath of [
|
|
2402
|
-
'email/dkim',
|
|
2403
|
-
'email/dns',
|
|
2404
|
-
'email/bounces',
|
|
2405
|
-
'email/templates',
|
|
2406
|
-
'security',
|
|
2407
|
-
]) {
|
|
2408
|
-
await collectLegacySmartMtaEntry(legacyRoot, relativePath, true, legacyEntries);
|
|
2409
|
-
}
|
|
2410
|
-
for (const relativePath of [
|
|
2411
|
-
'email/routes/config.json',
|
|
2412
|
-
'workhosters/mail-identities.json',
|
|
2413
|
-
]) {
|
|
2414
|
-
await collectLegacySmartMtaEntry(legacyRoot, relativePath, false, legacyEntries);
|
|
2415
|
-
}
|
|
2416
|
-
for (const entry of legacyEntries) {
|
|
2417
|
-
const id = hashSmartMtaStorageKey(entry.key);
|
|
2418
|
-
const stored = await storageCollection.findOne({ _id: id });
|
|
2419
|
-
if (stored) {
|
|
2420
|
-
validateSmartMtaStorageDocument(stored);
|
|
2421
|
-
if (stored.key !== entry.key || stored.value !== entry.value) {
|
|
2422
|
-
throw new Error(`Legacy SmartMTA storage conflict for ${entry.key}`);
|
|
2423
|
-
}
|
|
2424
|
-
existing++;
|
|
2425
|
-
continue;
|
|
2426
|
-
}
|
|
2427
|
-
const now = new Date().toISOString();
|
|
2428
|
-
await storageCollection.insertOne({
|
|
2429
|
-
_id: id,
|
|
2430
|
-
id,
|
|
2431
|
-
key: entry.key,
|
|
2432
|
-
value: entry.value,
|
|
2433
|
-
createdAt: entry.createdAt,
|
|
2434
|
-
updatedAt: now,
|
|
2435
|
-
});
|
|
2436
|
-
imported++;
|
|
2437
|
-
}
|
|
2438
|
-
}
|
|
2439
|
-
const dkimDocuments = await storageCollection.find({
|
|
2440
|
-
key: {
|
|
2441
|
-
$gte: '/email/dkim/',
|
|
2442
|
-
$lt: '/email/dkim/\uffff',
|
|
2443
|
-
},
|
|
2444
|
-
}).toArray();
|
|
2445
|
-
const dkimPairs = extractDkimPairs(dkimDocuments);
|
|
2446
|
-
const pairsByDomain = new Map(dkimPairs.map((pair) => [`${pair.domain}\0${pair.selector}`, pair]));
|
|
2447
|
-
const emailCollection = ctx.mongo.collection('EmailDomainDoc');
|
|
2448
|
-
const emailDomains = await emailCollection.find({}).toArray();
|
|
2449
|
-
let hydratedDomains = 0;
|
|
2450
|
-
for (const emailDomain of emailDomains) {
|
|
2451
|
-
const domain = String(emailDomain.domain || '').trim().toLowerCase();
|
|
2452
|
-
const selector = String(emailDomain.dkim?.selector || 'default').trim().toLowerCase();
|
|
2453
|
-
const pair = pairsByDomain.get(`${domain}\0${selector}`);
|
|
2454
|
-
if (!pair)
|
|
2455
|
-
continue;
|
|
2456
|
-
const setPatch = {};
|
|
2457
|
-
if (typeof emailDomain.dkim?.publicKey !== 'string' || !emailDomain.dkim.publicKey.trim()) {
|
|
2458
|
-
setPatch['dkim.publicKey'] = pair.publicKey;
|
|
2459
|
-
}
|
|
2460
|
-
if (!emailDomain.activeDkim) {
|
|
2461
|
-
setPatch.activeDkim = {
|
|
2462
|
-
selector: pair.selector,
|
|
2463
|
-
keySize: Number(emailDomain.dkim?.keySize) || pair.keySize,
|
|
2464
|
-
publicKey: pair.publicKey,
|
|
2465
|
-
createdAt: String(emailDomain.createdAt || new Date().toISOString()),
|
|
2466
|
-
};
|
|
2467
|
-
}
|
|
2468
|
-
const reconciliationErrors = Array.isArray(emailDomain.reconciliation?.errors)
|
|
2469
|
-
? emailDomain.reconciliation.errors
|
|
2470
|
-
: [];
|
|
2471
|
-
if (reconciliationErrors.some((error) => error?.code === 'DKIM_KEY_UNAVAILABLE')) {
|
|
2472
|
-
setPatch.reconciliation = {
|
|
2473
|
-
...emailDomain.reconciliation,
|
|
2474
|
-
lifecycleStatus: 'pending',
|
|
2475
|
-
desiredGeneration: Number(emailDomain.reconciliation?.desiredGeneration || 0) + 1,
|
|
2476
|
-
errors: reconciliationErrors.filter((error) => error?.code !== 'DKIM_KEY_UNAVAILABLE'),
|
|
2477
|
-
retryAt: new Date().toISOString(),
|
|
2478
|
-
};
|
|
2479
|
-
}
|
|
2480
|
-
if (Object.keys(setPatch).length > 0) {
|
|
2481
|
-
await emailCollection.updateOne({ _id: emailDomain._id }, { $set: setPatch });
|
|
2482
|
-
hydratedDomains++;
|
|
2483
|
-
}
|
|
2484
|
-
}
|
|
2485
|
-
await repairManagedRecordKeyIndex(ctx, 'smartmta-managed-storage');
|
|
2486
|
-
ctx.log.log('info', `smartmta-managed-storage: imported ${imported}, already present ${existing}, validated ${dkimPairs.length} DKIM pair(s), hydrated ${hydratedDomains} domain(s)`);
|
|
2487
|
-
}
|
|
2488
|
-
async function migrateEmailDnsLifecycle(ctx) {
|
|
2489
|
-
const emailCollection = ctx.mongo.collection('EmailDomainDoc');
|
|
2490
|
-
const dnsCollection = ctx.mongo.collection('DnsRecordDoc');
|
|
2491
|
-
const emailDocs = await emailCollection.find({}).toArray();
|
|
2492
|
-
const byDomain = new Map();
|
|
2493
|
-
for (const doc of emailDocs) {
|
|
2494
|
-
const normalizedDomain = String(doc.domain || '').trim().toLowerCase();
|
|
2495
|
-
if (!normalizedDomain)
|
|
2496
|
-
continue;
|
|
2497
|
-
if (doc.domain !== normalizedDomain) {
|
|
2498
|
-
await emailCollection.updateOne({ _id: doc._id }, { $set: { domain: normalizedDomain } });
|
|
2499
|
-
doc.domain = normalizedDomain;
|
|
2500
|
-
}
|
|
2501
|
-
const group = byDomain.get(normalizedDomain) || [];
|
|
2502
|
-
group.push(doc);
|
|
2503
|
-
byDomain.set(normalizedDomain, group);
|
|
2504
|
-
}
|
|
2505
|
-
let duplicateDomainsRemoved = 0;
|
|
2506
|
-
for (const [domain, docs] of byDomain) {
|
|
2507
|
-
docs.sort((a, b) => String(a.createdAt || '').localeCompare(String(b.createdAt || '')));
|
|
2508
|
-
const survivor = docs[0];
|
|
2509
|
-
for (const duplicate of docs.slice(1)) {
|
|
2510
|
-
const patch = {};
|
|
2511
|
-
for (const field of ['rateLimits', 'remoteIngress']) {
|
|
2512
|
-
if (survivor[field] === undefined && duplicate[field] !== undefined) {
|
|
2513
|
-
patch[field] = duplicate[field];
|
|
2514
|
-
survivor[field] = duplicate[field];
|
|
2515
|
-
}
|
|
2516
|
-
}
|
|
2517
|
-
if (Object.keys(patch).length > 0) {
|
|
2518
|
-
await emailCollection.updateOne({ _id: survivor._id }, { $set: patch });
|
|
2519
|
-
}
|
|
2520
|
-
await emailCollection.deleteOne({ _id: duplicate._id });
|
|
2521
|
-
duplicateDomainsRemoved++;
|
|
2522
|
-
}
|
|
2523
|
-
const dkim = survivor.dkim || {};
|
|
2524
|
-
const publicKey = typeof dkim.publicKey === 'string' ? dkim.publicKey.trim() : '';
|
|
2525
|
-
const now = new Date().toISOString();
|
|
2526
|
-
const setPatch = {};
|
|
2527
|
-
if (!Number.isInteger(dkim.retirementOverlapDays)) {
|
|
2528
|
-
setPatch['dkim.retirementOverlapDays'] = 30;
|
|
2529
|
-
}
|
|
2530
|
-
if (!survivor.reconciliation) {
|
|
2531
|
-
setPatch.reconciliation = {
|
|
2532
|
-
lifecycleStatus: 'pending',
|
|
2533
|
-
desiredGeneration: 1,
|
|
2534
|
-
intents: [],
|
|
2535
|
-
errors: [{
|
|
2536
|
-
code: 'EGRESS_IDENTITY_PROOF_UNAVAILABLE',
|
|
2537
|
-
message: 'RemoteIngress egress identity proof is unavailable until the capability release is consumed',
|
|
2538
|
-
retryable: true,
|
|
2539
|
-
}],
|
|
2540
|
-
capability: {
|
|
2541
|
-
egressIdentityProof: 'unsupported',
|
|
2542
|
-
selectorCorrectSigning: dkim.selector === 'default' ? 'supported' : 'unsupported',
|
|
2543
|
-
},
|
|
2544
|
-
retryAt: new Date(Date.now() + 300_000).toISOString(),
|
|
2545
|
-
};
|
|
2546
|
-
}
|
|
2547
|
-
if (publicKey && !survivor.activeDkim) {
|
|
2548
|
-
setPatch.activeDkim = {
|
|
2549
|
-
selector: String(dkim.selector || 'default'),
|
|
2550
|
-
keySize: Number(dkim.keySize) || 2048,
|
|
2551
|
-
publicKey,
|
|
2552
|
-
createdAt: String(survivor.createdAt || now),
|
|
2553
|
-
};
|
|
2554
|
-
}
|
|
2555
|
-
if (Object.keys(setPatch).length > 0) {
|
|
2556
|
-
await emailCollection.updateOne({ _id: survivor._id }, { $set: setPatch });
|
|
2557
|
-
}
|
|
2558
|
-
byDomain.set(domain, [survivor]);
|
|
2559
|
-
}
|
|
2560
|
-
await emailCollection.createIndex({ domain: 1 }, { name: 'email_domain_unique', unique: true });
|
|
2561
|
-
const survivingEmails = (await emailCollection.find({}).toArray());
|
|
2562
|
-
const claimedKeys = new Set();
|
|
2563
|
-
let adoptedRecords = 0;
|
|
2564
|
-
for await (const record of dnsCollection.find({
|
|
2565
|
-
managedRecordKey: { $exists: false },
|
|
2566
|
-
createdBy: { $in: ['mail-edge-sync', 'email-domain-manager'] },
|
|
2567
|
-
})) {
|
|
2568
|
-
const type = String(record.type || '');
|
|
2569
|
-
const name = String(record.name || '').toLowerCase();
|
|
2570
|
-
const value = String(record.value || '').trim();
|
|
2571
|
-
let managedOwnerId = '';
|
|
2572
|
-
let managedRecordKey = '';
|
|
2573
|
-
if (record.createdBy === 'mail-edge-sync' && ['A', 'AAAA'].includes(type)) {
|
|
2574
|
-
managedOwnerId = `topology:legacy:${name}:${value}`;
|
|
2575
|
-
managedRecordKey = `mail-topology:legacy:${type}:${name}:${value}`;
|
|
2576
|
-
}
|
|
2577
|
-
else if (record.createdBy === 'email-domain-manager') {
|
|
2578
|
-
const candidates = survivingEmails.filter((email) => {
|
|
2579
|
-
if (String(email.linkedDomainId) !== String(record.domainId))
|
|
2580
|
-
return false;
|
|
2581
|
-
const domain = String(email.domain || '').toLowerCase();
|
|
2582
|
-
const selector = String(email.dkim?.selector || 'default').toLowerCase();
|
|
2583
|
-
return name === domain
|
|
2584
|
-
|| name === `_dmarc.${domain}`
|
|
2585
|
-
|| name === `${selector}._domainkey.${domain}`
|
|
2586
|
-
|| name === `mx.${domain}`;
|
|
2587
|
-
});
|
|
2588
|
-
if (candidates.length === 1) {
|
|
2589
|
-
managedOwnerId = `domain:${candidates[0].id}`;
|
|
2590
|
-
managedRecordKey = `mail-domain:${candidates[0].id}:${type}:${name}:${value}`;
|
|
2591
|
-
}
|
|
2592
|
-
}
|
|
2593
|
-
if (!managedRecordKey || claimedKeys.has(managedRecordKey)) {
|
|
2594
|
-
continue;
|
|
2595
|
-
}
|
|
2596
|
-
claimedKeys.add(managedRecordKey);
|
|
2597
|
-
await dnsCollection.updateOne({ _id: record._id }, { $set: { managedBy: 'mail-dns-reconciler', managedOwnerId, managedRecordKey } });
|
|
2598
|
-
adoptedRecords++;
|
|
2599
|
-
}
|
|
2600
|
-
await repairManagedRecordKeyIndex(ctx, 'email-dns-lifecycle');
|
|
2601
|
-
ctx.log.log('info', `email-dns-lifecycle: removed ${duplicateDomainsRemoved} duplicate domain(s), adopted ${adoptedRecords} unambiguous legacy record(s)`);
|
|
2602
|
-
}
|
|
2603
|
-
async function dedupeDomainDocsByName(ctx) {
|
|
2604
|
-
const collection = ctx.mongo.collection('DomainDoc');
|
|
2605
|
-
const docs = await collection.find({}).toArray();
|
|
2606
|
-
const seen = new Map();
|
|
2607
|
-
let removed = 0;
|
|
2608
|
-
const sorted = [...docs].sort((a, b) => (a.createdAt || 0) - (b.createdAt || 0));
|
|
2609
|
-
for (const doc of sorted) {
|
|
2610
|
-
const name = String(doc.name || '').toLowerCase();
|
|
2611
|
-
if (!name)
|
|
2612
|
-
continue;
|
|
2613
|
-
if (seen.has(name)) {
|
|
2614
|
-
await collection.deleteOne({ _id: doc._id });
|
|
2615
|
-
removed++;
|
|
2616
|
-
}
|
|
2617
|
-
else {
|
|
2618
|
-
seen.set(name, doc);
|
|
2619
|
-
}
|
|
2620
|
-
}
|
|
2621
|
-
ctx.log.log('info', `dedupe-domain-docs-by-name: removed ${removed} duplicate domain doc(s)`);
|
|
2622
|
-
}
|
|
2623
|
-
async function migrateEmailDnsProviderProvenance(ctx) {
|
|
2624
|
-
const emailCollection = ctx.mongo.collection('EmailDomainDoc');
|
|
2625
|
-
const domainCollection = ctx.mongo.collection('DomainDoc');
|
|
2626
|
-
const dnsCollection = ctx.mongo.collection('DnsRecordDoc');
|
|
2627
|
-
const domains = await domainCollection.find({}).toArray();
|
|
2628
|
-
const providerZoneIds = new Set(domains
|
|
2629
|
-
.filter((domain) => domain?.source === 'provider')
|
|
2630
|
-
.map((domain) => String(domain.id || domain._id || ''))
|
|
2631
|
-
.filter(Boolean));
|
|
2632
|
-
const records = await dnsCollection.find({}).toArray();
|
|
2633
|
-
const retainedRecords = [];
|
|
2634
|
-
let normalizedProviderIds = 0;
|
|
2635
|
-
let deletedStaleProviderMirrors = 0;
|
|
2636
|
-
for (const record of records) {
|
|
2637
|
-
if (typeof record.providerRecordId === 'string' && !record.providerRecordId.trim()) {
|
|
2638
|
-
const identitySelector = record._id !== undefined && record._id !== null
|
|
2639
|
-
? { _id: record._id }
|
|
2640
|
-
: typeof record.id === 'string' && record.id.trim()
|
|
2641
|
-
? { id: record.id }
|
|
2642
|
-
: undefined;
|
|
2643
|
-
if (!identitySelector) {
|
|
2644
|
-
throw new Error('DnsRecordDoc with empty providerRecordId has no usable identity');
|
|
2645
|
-
}
|
|
2646
|
-
if (record.source === 'synced'
|
|
2647
|
-
&& providerZoneIds.has(String(record.domainId || ''))) {
|
|
2648
|
-
const result = await dnsCollection.deleteOne({
|
|
2649
|
-
...identitySelector,
|
|
2650
|
-
source: 'synced',
|
|
2651
|
-
providerRecordId: record.providerRecordId,
|
|
2652
|
-
});
|
|
2653
|
-
deletedStaleProviderMirrors += result.deletedCount || 0;
|
|
2654
|
-
continue;
|
|
2655
|
-
}
|
|
2656
|
-
await dnsCollection.updateOne({ ...identitySelector, providerRecordId: record.providerRecordId }, { $unset: { providerRecordId: '' } });
|
|
2657
|
-
delete record.providerRecordId;
|
|
2658
|
-
normalizedProviderIds++;
|
|
2659
|
-
}
|
|
2660
|
-
retainedRecords.push(record);
|
|
2661
|
-
}
|
|
2662
|
-
let backfilledDomains = 0;
|
|
2663
|
-
let backfilledActiveRevisionGenerations = 0;
|
|
2664
|
-
for (const email of await emailCollection.find({}).toArray()) {
|
|
2665
|
-
const reconciliation = email.reconciliation;
|
|
2666
|
-
const activeRevision = reconciliation?.activeRevision;
|
|
2667
|
-
const desiredGeneration = reconciliation?.desiredGeneration;
|
|
2668
|
-
const identitySelector = email._id !== undefined && email._id !== null
|
|
2669
|
-
? { _id: email._id }
|
|
2670
|
-
: typeof email.id === 'string' && email.id.trim()
|
|
2671
|
-
? { id: email.id }
|
|
2672
|
-
: undefined;
|
|
2673
|
-
if (!identitySelector) {
|
|
2674
|
-
throw new Error('EmailDomainDoc has no usable identity');
|
|
2675
|
-
}
|
|
2676
|
-
if (reconciliation?.lifecycleStatus === 'active'
|
|
2677
|
-
&& activeRevision
|
|
2678
|
-
&& typeof activeRevision === 'object'
|
|
2679
|
-
&& Number.isInteger(desiredGeneration)
|
|
2680
|
-
&& !Object.prototype.hasOwnProperty.call(activeRevision, 'generation')) {
|
|
2681
|
-
const result = await emailCollection.updateOne({
|
|
2682
|
-
...identitySelector,
|
|
2683
|
-
'reconciliation.lifecycleStatus': 'active',
|
|
2684
|
-
'reconciliation.desiredGeneration': desiredGeneration,
|
|
2685
|
-
'reconciliation.activeRevision': { $exists: true },
|
|
2686
|
-
'reconciliation.activeRevision.generation': { $exists: false },
|
|
2687
|
-
}, { $set: { 'reconciliation.activeRevision.generation': desiredGeneration } });
|
|
2688
|
-
if ((result.modifiedCount || 0) > 0) {
|
|
2689
|
-
activeRevision.generation = desiredGeneration;
|
|
2690
|
-
backfilledActiveRevisionGenerations++;
|
|
2691
|
-
}
|
|
2692
|
-
}
|
|
2693
|
-
if (Array.isArray(email.reconciliation?.providerZoneIds))
|
|
2694
|
-
continue;
|
|
2695
|
-
const provenance = new Set();
|
|
2696
|
-
if (providerZoneIds.has(String(email.linkedDomainId || ''))) {
|
|
2697
|
-
provenance.add(String(email.linkedDomainId));
|
|
2698
|
-
}
|
|
2699
|
-
for (const intent of Array.isArray(email.reconciliation?.intents)
|
|
2700
|
-
? email.reconciliation.intents
|
|
2701
|
-
: []) {
|
|
2702
|
-
const zoneId = String(intent?.domainId || '');
|
|
2703
|
-
if (providerZoneIds.has(zoneId))
|
|
2704
|
-
provenance.add(zoneId);
|
|
2705
|
-
}
|
|
2706
|
-
const ownerId = `domain:${String(email.id || email._id || '')}`;
|
|
2707
|
-
for (const record of retainedRecords) {
|
|
2708
|
-
const zoneId = String(record.domainId || '');
|
|
2709
|
-
if (record.managedBy === 'mail-dns-reconciler'
|
|
2710
|
-
&& record.managedOwnerId === ownerId
|
|
2711
|
-
&& providerZoneIds.has(zoneId))
|
|
2712
|
-
provenance.add(zoneId);
|
|
2713
|
-
}
|
|
2714
|
-
await emailCollection.updateOne(identitySelector, { $set: { 'reconciliation.providerZoneIds': [...provenance].sort() } });
|
|
2715
|
-
backfilledDomains++;
|
|
2716
|
-
}
|
|
2717
|
-
ctx.log.log('info', `email-dns-provider-provenance: backfilled ${backfilledDomains} provider provenance set(s) and ${backfilledActiveRevisionGenerations} active revision generation(s), deleted ${deletedStaleProviderMirrors} stale provider mirror(s), normalized ${normalizedProviderIds} other empty provider id(s)`);
|
|
2718
|
-
}
|
|
2719
|
-
async function migrateCachedEmailRawContentToBlobStorage(ctx, options) {
|
|
2720
|
-
const collection = ctx.mongo.collection('CachedEmail');
|
|
2721
|
-
let migratedCount = 0;
|
|
2722
|
-
while (true) {
|
|
2723
|
-
const legacyEmails = await collection
|
|
2724
|
-
.find({
|
|
2725
|
-
rawContent: { $exists: true },
|
|
2726
|
-
rawContentObjectKey: { $exists: false },
|
|
2727
|
-
})
|
|
2728
|
-
.sort({ acceptedAt: 1, _id: 1 })
|
|
2729
|
-
.limit(cachedEmailRawContentMigrationBatchSize)
|
|
2730
|
-
.toArray();
|
|
2731
|
-
if (legacyEmails.length === 0)
|
|
2732
|
-
break;
|
|
2733
|
-
const blobStorage = options.legacyRawMessageBlobStorage;
|
|
2734
|
-
if (!blobStorage) {
|
|
2735
|
-
throw new Error('SmartBucket storage is unavailable for the 17.1.0 CachedEmail rawContent migration');
|
|
2736
|
-
}
|
|
2737
|
-
for (const legacyEmail of legacyEmails) {
|
|
2738
|
-
const id = typeof legacyEmail.id === 'string' ? legacyEmail.id.trim() : '';
|
|
2739
|
-
if (!id) {
|
|
2740
|
-
throw new Error('Legacy CachedEmail has a missing or malformed id');
|
|
2741
|
-
}
|
|
2742
|
-
if (typeof legacyEmail.rawContent !== 'string') {
|
|
2743
|
-
throw new Error(`Legacy CachedEmail ${id} has invalid inline RFC822 data`);
|
|
2744
|
-
}
|
|
2745
|
-
const rawMessage = Buffer.from(legacyEmail.rawContent, 'utf8');
|
|
2746
|
-
const objectKey = `/email/messages/${id}.eml`;
|
|
2747
|
-
await blobStorage.set(objectKey, rawMessage);
|
|
2748
|
-
const persistedRawMessage = await blobStorage.get(objectKey);
|
|
2749
|
-
if (!persistedRawMessage || !Buffer.from(persistedRawMessage).equals(rawMessage)) {
|
|
2750
|
-
throw new Error(`SmartBucket verification failed for legacy CachedEmail ${id}`);
|
|
2751
|
-
}
|
|
2752
|
-
const identitySelector = legacyEmail._id === undefined
|
|
2753
|
-
? { id }
|
|
2754
|
-
: { _id: legacyEmail._id, id };
|
|
2755
|
-
const completed = await collection.updateOne({
|
|
2756
|
-
...identitySelector,
|
|
2757
|
-
rawContent: legacyEmail.rawContent,
|
|
2758
|
-
rawContentObjectKey: { $exists: false },
|
|
2759
|
-
}, {
|
|
2760
|
-
$set: {
|
|
2761
|
-
rawContentObjectKey: objectKey,
|
|
2762
|
-
rawContentSize: rawMessage.length,
|
|
2763
|
-
_updatedAt: new Date().toISOString(),
|
|
2764
|
-
},
|
|
2765
|
-
$unset: { rawContent: '' },
|
|
2766
|
-
});
|
|
2767
|
-
if (completed.modifiedCount !== 1) {
|
|
2768
|
-
const current = await collection.findOne(identitySelector);
|
|
2769
|
-
const currentPayload = await blobStorage.get(objectKey);
|
|
2770
|
-
if (current?.rawContentObjectKey === objectKey
|
|
2771
|
-
&& current.rawContentSize === rawMessage.length
|
|
2772
|
-
&& !Object.prototype.hasOwnProperty.call(current, 'rawContent')
|
|
2773
|
-
&& currentPayload
|
|
2774
|
-
&& Buffer.from(currentPayload).equals(rawMessage)) {
|
|
2775
|
-
continue;
|
|
2776
|
-
}
|
|
2777
|
-
throw new Error(`Legacy CachedEmail ${id} changed during migration`);
|
|
2778
|
-
}
|
|
2779
|
-
migratedCount++;
|
|
2780
|
-
}
|
|
2781
|
-
ctx.log.log('info', `migrate-cached-email-raw-content: completed batch of ${legacyEmails.length} payload(s); ${migratedCount} migrated total`);
|
|
2782
|
-
}
|
|
2783
|
-
ctx.log.log('info', `migrate-cached-email-raw-content: moved ${migratedCount} payload(s) to SmartBucket`);
|
|
2784
|
-
}
|
|
2785
|
-
function isMigrationNamespaceMissing(error) {
|
|
2786
|
-
const candidate = error;
|
|
2787
|
-
return candidate.code === 26 || candidate.codeName === 'NamespaceNotFound';
|
|
2788
|
-
}
|
|
2789
1326
|
async function migrateTestingAccess(ctx) {
|
|
2790
1327
|
const certificates = ctx.mongo.collection('AcmeCertDoc');
|
|
2791
1328
|
// One bounded, replayable batch at a time. PEM data is never rewritten.
|
|
@@ -2796,14 +1333,14 @@ async function migrateTestingAccess(ctx) {
|
|
|
2796
1333
|
for (const certificate of legacy) {
|
|
2797
1334
|
if (typeof certificate.domainName !== 'string' || !certificate.domainName
|
|
2798
1335
|
|| certificate.domainName !== certificate.domainName.trim())
|
|
2799
|
-
throw new
|
|
1336
|
+
throw new DcRouterMigrationError('Invalid legacy certificate domain');
|
|
2800
1337
|
const identityKey = `legacy:${certificate.domainName}`;
|
|
2801
1338
|
if (certificate.identityKey !== undefined && certificate.identityKey !== identityKey) {
|
|
2802
|
-
throw new
|
|
1339
|
+
throw new DcRouterMigrationError('Conflicting legacy certificate identity');
|
|
2803
1340
|
}
|
|
2804
1341
|
const changed = await certificates.updateOne({ _id: certificate._id, kind: { $exists: false } }, { $set: { identityKey, kind: 'legacy' } });
|
|
2805
1342
|
if (changed.modifiedCount !== 1)
|
|
2806
|
-
throw new
|
|
1343
|
+
throw new DcRouterMigrationError('Certificate changed during identity migration');
|
|
2807
1344
|
}
|
|
2808
1345
|
}
|
|
2809
1346
|
await certificates.createIndex({ identityKey: 1 }, { name: 'identityKey_1', unique: true });
|
|
@@ -2848,21 +1385,310 @@ async function migrateTestingAccess(ctx) {
|
|
|
2848
1385
|
]);
|
|
2849
1386
|
ctx.log.log('info', 'testing-access: isolated legacy certificate keys and initialized durable testing indexes');
|
|
2850
1387
|
}
|
|
2851
|
-
|
|
2852
|
-
|
|
2853
|
-
|
|
2854
|
-
|
|
2855
|
-
|
|
2856
|
-
|
|
2857
|
-
|
|
2858
|
-
|
|
1388
|
+
// -------------------------------------------- Web Push encryption context (32)
|
|
1389
|
+
/**
|
|
1390
|
+
* Associated data every Web Push envelope was sealed under before interfaces
|
|
1391
|
+
* 32.0.0 removed the shape version from the push payload contract. It is
|
|
1392
|
+
* private to this module on purpose: a superseded computation belongs to the
|
|
1393
|
+
* migration that retires it and must not be reachable from `ts/`.
|
|
1394
|
+
*/
|
|
1395
|
+
const legacyWebPushAadShapeVersion = 1;
|
|
1396
|
+
const legacyWebPushEnvelopeVersion = 1;
|
|
1397
|
+
const webPushEncryptionContextChunkSize = 100;
|
|
1398
|
+
function buildLegacyWebPushAad(contextArg) {
|
|
1399
|
+
return Buffer.from(canonicalWebPushJson({
|
|
1400
|
+
schemaVersion: legacyWebPushAadShapeVersion,
|
|
1401
|
+
gatewayClientId: contextArg.gatewayClientId,
|
|
1402
|
+
appInstanceId: contextArg.appInstanceId,
|
|
1403
|
+
bindingId: contextArg.bindingId,
|
|
1404
|
+
documentType: contextArg.documentType,
|
|
1405
|
+
documentId: contextArg.documentId,
|
|
1406
|
+
}), 'utf8');
|
|
1407
|
+
}
|
|
1408
|
+
/**
|
|
1409
|
+
* A sealed envelope is pre-32 exactly when it still declares the shape version
|
|
1410
|
+
* the contract dropped. The discriminator is the stored shape, never a trial
|
|
1411
|
+
* decryption: a failed decryption cannot tell "already resealed" from "wrong
|
|
1412
|
+
* key" and would silently skip readable secrets.
|
|
1413
|
+
*/
|
|
1414
|
+
function isLegacyWebPushEnvelope(valueArg) {
|
|
1415
|
+
return valueArg !== null
|
|
1416
|
+
&& typeof valueArg === 'object'
|
|
1417
|
+
&& !Array.isArray(valueArg)
|
|
1418
|
+
&& valueArg.version !== undefined;
|
|
1419
|
+
}
|
|
1420
|
+
function openLegacyWebPushEnvelope(envelopeArg, aadContextArg, keyRingArg) {
|
|
1421
|
+
if (envelopeArg.version !== legacyWebPushEnvelopeVersion
|
|
1422
|
+
|| envelopeArg.algorithm !== 'aes-256-gcm') {
|
|
1423
|
+
throw new DcRouterMigrationError('Web Push envelope predates 32.0.0 but states an unknown format');
|
|
1424
|
+
}
|
|
1425
|
+
const key = keyRingArg.keys.get(envelopeArg.keyId);
|
|
1426
|
+
if (!key) {
|
|
1427
|
+
throw new DcRouterMigrationError(`Web Push envelope references key "${envelopeArg.keyId}", which the configured key ring does not hold`);
|
|
1428
|
+
}
|
|
1429
|
+
const decipher = nodeCrypto.createDecipheriv('aes-256-gcm', key, Buffer.from(envelopeArg.nonce, 'base64url'));
|
|
1430
|
+
decipher.setAAD(buildLegacyWebPushAad(aadContextArg));
|
|
1431
|
+
decipher.setAuthTag(Buffer.from(envelopeArg.tag, 'base64url'));
|
|
1432
|
+
return JSON.parse(Buffer.concat([
|
|
1433
|
+
decipher.update(Buffer.from(envelopeArg.ciphertext, 'base64url')),
|
|
1434
|
+
decipher.final(),
|
|
1435
|
+
]).toString('utf8'));
|
|
1436
|
+
}
|
|
1437
|
+
/**
|
|
1438
|
+
* Reseal one envelope under the 32 associated data with a fresh nonce, then
|
|
1439
|
+
* read it back before the caller is allowed to store it: an envelope that
|
|
1440
|
+
* cannot be opened again is a lost secret, not a migration.
|
|
1441
|
+
*/
|
|
1442
|
+
function resealWebPushEnvelope(envelopeArg, aadContextArg, keyRingArg, transformPlaintextArg) {
|
|
1443
|
+
const plaintext = transformPlaintextArg(openLegacyWebPushEnvelope(envelopeArg, aadContextArg, keyRingArg));
|
|
1444
|
+
const resealed = sealWebPushEnvelope(keyRingArg, plaintext, aadContextArg);
|
|
1445
|
+
const verified = openWebPushEnvelope(keyRingArg, resealed, aadContextArg);
|
|
1446
|
+
if (canonicalWebPushJson(verified) !== canonicalWebPushJson(plaintext)) {
|
|
1447
|
+
throw new DcRouterMigrationError('Resealed Web Push envelope did not decrypt to its original plaintext');
|
|
1448
|
+
}
|
|
1449
|
+
return resealed;
|
|
1450
|
+
}
|
|
1451
|
+
/** interfaces 32.0.0 removed `schemaVersion` from the push payload, so the resealed plaintext drops it. */
|
|
1452
|
+
function withoutWebPushPayloadShapeVersion(plaintextArg) {
|
|
1453
|
+
if (plaintextArg === null || typeof plaintextArg !== 'object' || Array.isArray(plaintextArg)) {
|
|
1454
|
+
return plaintextArg;
|
|
1455
|
+
}
|
|
1456
|
+
const payload = { ...plaintextArg };
|
|
1457
|
+
delete payload.schemaVersion;
|
|
1458
|
+
return payload;
|
|
1459
|
+
}
|
|
1460
|
+
function keepWebPushPlaintext(plaintextArg) {
|
|
1461
|
+
return plaintextArg;
|
|
1462
|
+
}
|
|
1463
|
+
async function resealWebPushBindings(collectionArg, keyRingArg, checkpointArg, logArg) {
|
|
1464
|
+
let cursor = (await checkpointArg?.read('bindingCursor')) ?? '';
|
|
1465
|
+
let resealed = 0;
|
|
1466
|
+
for (;;) {
|
|
1467
|
+
const chunk = await collectionArg
|
|
1468
|
+
.find({ id: { $gt: cursor } })
|
|
1469
|
+
.sort({ id: 1 })
|
|
1470
|
+
.limit(webPushEncryptionContextChunkSize)
|
|
1471
|
+
.toArray();
|
|
1472
|
+
if (chunk.length === 0)
|
|
1473
|
+
break;
|
|
1474
|
+
for (const document of chunk) {
|
|
1475
|
+
const owner = {
|
|
1476
|
+
gatewayClientId: String(document.ownerGatewayClientId),
|
|
1477
|
+
appInstanceId: String(document.ownerAppInstanceId),
|
|
1478
|
+
};
|
|
1479
|
+
const vapidKeys = Array.isArray(document.vapidKeys) ? document.vapidKeys : [];
|
|
1480
|
+
const recovery = document.credentialRotationRecovery;
|
|
1481
|
+
const update = {};
|
|
1482
|
+
const nextVapidKeys = vapidKeys.map((vapidKey) => {
|
|
1483
|
+
if (!isLegacyWebPushEnvelope(vapidKey?.privateKeyEnvelope))
|
|
1484
|
+
return vapidKey;
|
|
1485
|
+
return {
|
|
1486
|
+
...vapidKey,
|
|
1487
|
+
privateKeyEnvelope: resealWebPushEnvelope(vapidKey.privateKeyEnvelope, {
|
|
1488
|
+
...owner,
|
|
1489
|
+
bindingId: String(document.id),
|
|
1490
|
+
documentType: 'vapid-private-key',
|
|
1491
|
+
documentId: String(vapidKey.id),
|
|
1492
|
+
}, keyRingArg, keepWebPushPlaintext),
|
|
1493
|
+
};
|
|
1494
|
+
});
|
|
1495
|
+
if (nextVapidKeys.some((vapidKey, index) => vapidKey !== vapidKeys[index])) {
|
|
1496
|
+
update.vapidKeys = nextVapidKeys;
|
|
1497
|
+
}
|
|
1498
|
+
if (isLegacyWebPushEnvelope(recovery?.secretEnvelope)) {
|
|
1499
|
+
update.credentialRotationRecovery = {
|
|
1500
|
+
...recovery,
|
|
1501
|
+
secretEnvelope: resealWebPushEnvelope(recovery.secretEnvelope, {
|
|
1502
|
+
...owner,
|
|
1503
|
+
bindingId: String(document.id),
|
|
1504
|
+
documentType: 'credential-rotation-recovery',
|
|
1505
|
+
documentId: canonicalWebPushJson({
|
|
1506
|
+
lifecycleGeneration: recovery.lifecycleGeneration,
|
|
1507
|
+
requestedCredentialId: recovery.requestedCredentialId,
|
|
1508
|
+
resultingCredentialId: recovery.resultingCredentialId,
|
|
1509
|
+
}),
|
|
1510
|
+
}, keyRingArg, keepWebPushPlaintext),
|
|
1511
|
+
};
|
|
1512
|
+
}
|
|
1513
|
+
if (Object.keys(update).length > 0) {
|
|
1514
|
+
await collectionArg.updateOne({ _id: document._id }, { $set: update });
|
|
1515
|
+
resealed++;
|
|
1516
|
+
}
|
|
1517
|
+
cursor = String(document.id);
|
|
1518
|
+
}
|
|
1519
|
+
await checkpointArg?.write('bindingCursor', cursor);
|
|
2859
1520
|
}
|
|
2860
|
-
|
|
2861
|
-
|
|
2862
|
-
|
|
1521
|
+
logArg(`resealed ${resealed} binding document(s)`);
|
|
1522
|
+
}
|
|
1523
|
+
/**
|
|
1524
|
+
* Resolve a spool row's owner from its binding. It is read on demand rather
|
|
1525
|
+
* than collected during the binding walk, because that walk resumes from a
|
|
1526
|
+
* cursor and would otherwise hand the spool an owner map missing every binding
|
|
1527
|
+
* an earlier run already passed.
|
|
1528
|
+
*/
|
|
1529
|
+
function createWebPushOwnerResolver(bindingCollectionArg) {
|
|
1530
|
+
const owners = new Map();
|
|
1531
|
+
return async (bindingIdArg) => {
|
|
1532
|
+
if (owners.has(bindingIdArg))
|
|
1533
|
+
return owners.get(bindingIdArg);
|
|
1534
|
+
const document = await bindingCollectionArg.findOne({ id: bindingIdArg });
|
|
1535
|
+
const owner = document
|
|
1536
|
+
? {
|
|
1537
|
+
gatewayClientId: String(document.ownerGatewayClientId),
|
|
1538
|
+
appInstanceId: String(document.ownerAppInstanceId),
|
|
1539
|
+
}
|
|
1540
|
+
: undefined;
|
|
1541
|
+
owners.set(bindingIdArg, owner);
|
|
1542
|
+
return owner;
|
|
1543
|
+
};
|
|
1544
|
+
}
|
|
1545
|
+
async function resealWebPushSpool(collectionArg, resolveOwnerArg, keyRingArg, checkpointArg, logArg) {
|
|
1546
|
+
let cursor = (await checkpointArg?.read('spoolCursor')) ?? '';
|
|
1547
|
+
let resealed = 0;
|
|
1548
|
+
let orphaned = 0;
|
|
1549
|
+
for (;;) {
|
|
1550
|
+
const chunk = await collectionArg
|
|
1551
|
+
.find({ id: { $gt: cursor } })
|
|
1552
|
+
.sort({ id: 1 })
|
|
1553
|
+
.limit(webPushEncryptionContextChunkSize)
|
|
1554
|
+
.toArray();
|
|
1555
|
+
if (chunk.length === 0)
|
|
1556
|
+
break;
|
|
1557
|
+
for (const document of chunk) {
|
|
1558
|
+
cursor = String(document.id);
|
|
1559
|
+
const legacySubscription = isLegacyWebPushEnvelope(document.subscriptionEnvelope);
|
|
1560
|
+
const legacyPayload = isLegacyWebPushEnvelope(document.payloadEnvelope);
|
|
1561
|
+
if (!legacySubscription && !legacyPayload && document.schemaVersion === undefined)
|
|
1562
|
+
continue;
|
|
1563
|
+
const owner = await resolveOwnerArg(String(document.bindingId));
|
|
1564
|
+
if (!owner) {
|
|
1565
|
+
// The owning binding is gone, so no version of dcrouter can rebuild
|
|
1566
|
+
// this row's associated data or deliver it. It is left exactly as it
|
|
1567
|
+
// is rather than rewritten from a guess or deleted.
|
|
1568
|
+
orphaned++;
|
|
1569
|
+
continue;
|
|
1570
|
+
}
|
|
1571
|
+
const aadBase = {
|
|
1572
|
+
...owner,
|
|
1573
|
+
bindingId: String(document.bindingId),
|
|
1574
|
+
documentId: String(document.id),
|
|
1575
|
+
};
|
|
1576
|
+
const update = {};
|
|
1577
|
+
if (legacySubscription) {
|
|
1578
|
+
update.subscriptionEnvelope = resealWebPushEnvelope(document.subscriptionEnvelope, { ...aadBase, documentType: 'spool-subscription' }, keyRingArg, keepWebPushPlaintext);
|
|
1579
|
+
}
|
|
1580
|
+
if (legacyPayload) {
|
|
1581
|
+
update.payloadEnvelope = resealWebPushEnvelope(document.payloadEnvelope, { ...aadBase, documentType: 'spool-payload' }, keyRingArg, withoutWebPushPayloadShapeVersion);
|
|
1582
|
+
}
|
|
1583
|
+
await collectionArg.updateOne({ _id: document._id }, {
|
|
1584
|
+
...(Object.keys(update).length > 0 ? { $set: update } : {}),
|
|
1585
|
+
$unset: { schemaVersion: '' },
|
|
1586
|
+
});
|
|
1587
|
+
resealed++;
|
|
1588
|
+
}
|
|
1589
|
+
await checkpointArg?.write('spoolCursor', cursor);
|
|
1590
|
+
}
|
|
1591
|
+
logArg(`resealed ${resealed} spool document(s)`
|
|
1592
|
+
+ (orphaned > 0 ? `; left ${orphaned} undeliverable row(s) whose binding no longer exists` : ''));
|
|
1593
|
+
}
|
|
1594
|
+
async function migrateWebPushEncryptionContext(ctx, options) {
|
|
1595
|
+
const bindings = ctx.mongo.collection('WebPushBindingDoc');
|
|
1596
|
+
const spool = ctx.mongo.collection('WebPushSpoolDoc');
|
|
1597
|
+
const hasSealedMaterial = Boolean(await bindings.findOne({}, { projection: { _id: 1 } })
|
|
1598
|
+
|| await spool.findOne({}, { projection: { _id: 1 } }));
|
|
1599
|
+
if (!hasSealedMaterial) {
|
|
1600
|
+
ctx.log.log('info', 'webpush-encryption-context: no Web Push documents to reseal');
|
|
1601
|
+
return;
|
|
1602
|
+
}
|
|
1603
|
+
if (!options.webPushMasterKeyRing) {
|
|
1604
|
+
throw new DcRouterMigrationError('webpush-encryption-context: stored Web Push documents have to be resealed under the '
|
|
1605
|
+
+ 'interfaces 32 associated data, but DCROUTER_WEB_PUSH_MASTER_KEY_RING is not configured');
|
|
1606
|
+
}
|
|
1607
|
+
const keyRing = parseWebPushKeyRing(options.webPushMasterKeyRing, 'DCROUTER_WEB_PUSH_MASTER_KEY_RING');
|
|
1608
|
+
await resealWebPushBindings(bindings, keyRing, ctx.checkpoint, (message) => ctx.log.log('info', `webpush-encryption-context: ${message}`));
|
|
1609
|
+
await resealWebPushSpool(spool, createWebPushOwnerResolver(bindings), keyRing, ctx.checkpoint, (message) => ctx.log.log('info', `webpush-encryption-context: ${message}`));
|
|
1610
|
+
}
|
|
1611
|
+
// ----------------------------------------- CoreMail peer verifier format (32)
|
|
1612
|
+
/** The verifier contract token CoreMail peers were stored under before interfaces 32.0.0. */
|
|
1613
|
+
const legacyCoreMailVerifierFormat = 'argon2id-v1';
|
|
1614
|
+
async function migrateCoreMailPeerVerifierFormat(ctx) {
|
|
1615
|
+
const collection = ctx.mongo.collection('CoreMailGatewayPeerDoc');
|
|
1616
|
+
const documents = await collection.find({}).sort({ id: 1 }).toArray();
|
|
1617
|
+
let migrated = 0;
|
|
1618
|
+
for (const document of documents) {
|
|
1619
|
+
const credentials = Array.isArray(document.credentials) ? document.credentials : [];
|
|
1620
|
+
if (!credentials.some((credential) => credential?.format === legacyCoreMailVerifierFormat)) {
|
|
1621
|
+
continue;
|
|
1622
|
+
}
|
|
1623
|
+
await collection.updateOne({ _id: document._id }, {
|
|
1624
|
+
$set: {
|
|
1625
|
+
credentials: credentials.map((credential) => (credential?.format === legacyCoreMailVerifierFormat
|
|
1626
|
+
? { ...credential, format: coreMailVerifierFormat }
|
|
1627
|
+
: credential)),
|
|
1628
|
+
},
|
|
1629
|
+
});
|
|
1630
|
+
migrated++;
|
|
1631
|
+
}
|
|
1632
|
+
ctx.log.log('info', `coremail-peer-verifier-format: rewrote ${migrated} peer record(s)`);
|
|
1633
|
+
}
|
|
1634
|
+
// ----------------------------------------- Gateway-client route key (32.0.1)
|
|
1635
|
+
/** The combined gateway-client route key prefix releases 16.2.0 through 32.0.0 wrote. */
|
|
1636
|
+
const legacyGatewayClientHostRouteKeyPrefix = 'v2:host-route:';
|
|
1637
|
+
const gatewayClientHostRouteKeyChunkSize = 100;
|
|
1638
|
+
/**
|
|
1639
|
+
* Rewrite every stored `RouteDoc.metadata.externalKey` that still spells the combined
|
|
1640
|
+
* gateway-client route key with its released version token.
|
|
1641
|
+
*
|
|
1642
|
+
* The walk is ordered by `id` and resumes from a step-owned checkpoint cursor, and a document is
|
|
1643
|
+
* selected by the stored spelling alone, so a resumed or re-run step re-reads rewritten documents
|
|
1644
|
+
* without touching them. `updatedAt` is deliberately left alone: nothing about the route's
|
|
1645
|
+
* effective configuration changes here, and that field is the operator-visible edit state of
|
|
1646
|
+
* every gateway route.
|
|
1647
|
+
*/
|
|
1648
|
+
async function migrateGatewayClientHostRouteKey(ctx) {
|
|
1649
|
+
const routes = ctx.mongo.collection('RouteDoc');
|
|
1650
|
+
let cursor = (await ctx.checkpoint?.read('routeCursor')) ?? '';
|
|
1651
|
+
let inspected = 0;
|
|
1652
|
+
let rewritten = 0;
|
|
1653
|
+
for (;;) {
|
|
1654
|
+
const chunk = await routes
|
|
1655
|
+
.find({ id: { $gt: cursor } })
|
|
1656
|
+
.sort({ id: 1 })
|
|
1657
|
+
.limit(gatewayClientHostRouteKeyChunkSize)
|
|
1658
|
+
.toArray();
|
|
1659
|
+
if (chunk.length === 0)
|
|
1660
|
+
break;
|
|
1661
|
+
for (const document of chunk) {
|
|
1662
|
+
cursor = String(document.id);
|
|
1663
|
+
inspected++;
|
|
1664
|
+
const externalKey = document.metadata?.externalKey;
|
|
1665
|
+
if (typeof externalKey !== 'string')
|
|
1666
|
+
continue;
|
|
1667
|
+
// The legacy token always follows the `<type>:<clientId>:<appId>:` ownership prefix, and the
|
|
1668
|
+
// payload it introduces is base64url, so the first occurrence is the only one.
|
|
1669
|
+
const legacyIndex = externalKey.indexOf(`:${legacyGatewayClientHostRouteKeyPrefix}`);
|
|
1670
|
+
if (legacyIndex < 0)
|
|
1671
|
+
continue;
|
|
1672
|
+
const routeKey = gatewayClientHostRouteKeyPrefix
|
|
1673
|
+
+ externalKey.slice(legacyIndex + 1 + legacyGatewayClientHostRouteKeyPrefix.length);
|
|
1674
|
+
if (!parseGatewayClientHostRouteKey(routeKey)) {
|
|
1675
|
+
throw new DcRouterMigrationError(`host-route-key: route "${document.id}" stores the combined ownership key `
|
|
1676
|
+
+ `"${externalKey}", whose payload does not decode into a hostname and route reference. `
|
|
1677
|
+
+ 'No release can tell what it claimed. Delete that route or repair its '
|
|
1678
|
+
+ 'metadata.externalKey, then start dcrouter again.');
|
|
1679
|
+
}
|
|
1680
|
+
const nextExternalKey = externalKey.slice(0, legacyIndex + 1) + routeKey;
|
|
1681
|
+
const update = { 'metadata.externalKey': nextExternalKey };
|
|
1682
|
+
// Only a name generated from the old key is machine-derived; an operator- or
|
|
1683
|
+
// producer-chosen name means what it says and is never rewritten.
|
|
1684
|
+
if (document.route?.name === buildGatewayClientRouteName(externalKey)) {
|
|
1685
|
+
update['route.name'] = buildGatewayClientRouteName(nextExternalKey);
|
|
1686
|
+
}
|
|
1687
|
+
await routes.updateOne({ _id: document._id }, { $set: update });
|
|
1688
|
+
rewritten++;
|
|
1689
|
+
}
|
|
1690
|
+
await ctx.checkpoint?.write('routeCursor', cursor);
|
|
2863
1691
|
}
|
|
2864
|
-
|
|
2865
|
-
await collection.createIndex({ lastSeenAt: -1, _id: -1 }, { name: 'lastSeenAt_-1__id_-1' });
|
|
2866
|
-
ctx.log.log('info', 'bound-ip-intelligence-retention: reset rebuildable cache and recreated indexes');
|
|
1692
|
+
ctx.log.log('info', `host-route-key: rewrote ${rewritten} of ${inspected} route(s)`);
|
|
2867
1693
|
}
|
|
2868
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19taWdyYXRpb25zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxVQUFVLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxLQUFLLFFBQVEsTUFBTSxXQUFXLENBQUM7QUFDdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsc0JBQXNCLEVBQ3RCLDJCQUEyQixFQUMzQix5QkFBeUIsR0FDMUIsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRCxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLDBCQUEwQixFQUMxQiwwQkFBMEIsRUFDMUIsK0JBQStCLEdBQ2hDLE1BQU0sOENBQThDLENBQUM7QUFDdEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDcEYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUF3QmpGLDZFQUE2RTtBQUM3RSwrRUFBK0U7QUFDL0UsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsUUFBUSxDQUFDO0FBRTlDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0NBQWdDLENBQ3BELEVBQVcsRUFDWCxVQUFxQyxFQUFFO0lBRXZDLDRFQUE0RTtJQUM1RSxPQUFPLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxxQkFBcUIsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBNEJELE1BQU0sdUJBQXVCLEdBSXhCO0lBQ0g7UUFDRSxJQUFJLEVBQUUsa0JBQWtCO1FBQ3hCLFdBQVcsRUFBRSw0RkFBNEY7UUFD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QUssU0FBUyxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQztJQUN2QyxDQUFDO0lBQ0QsSUFBSyxHQUFXLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUM7SUFDNUMsQ0FBQztJQUNELElBQUssR0FBVyxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsSUFBSyxHQUFXLENBQUMsV0FBVyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ25DLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSx5REFBeUQsQ0FBQyxDQUFDO1FBQy9FLE9BQU87SUFDVCxDQUFDO0lBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7SUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBSSxHQUFXLENBQUMsU0FBUyxJQUFJLFdBQVcsQ0FBQztJQUV2RCxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQ3ZCLEdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFHLEdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsNkJBQTZCLEVBQUUsRUFDNUYsRUFBRSxJQUFJLEVBQUUsQ0FDVCxDQUFDO0lBQ0YsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLDZDQUE2QyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFDcEgsQ0FBQztBQUVELEtBQUssVUFBVSwyQkFBMkIsQ0FBQyxHQUcxQyxFQUFFLE9BQWtDO0lBQ25DLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDbkUsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixJQUFJLEVBQUUsQ0FBQztJQUMvQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDdkIsTUFBTSxHQUFHLEdBQUcsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixFQUFFLENBQUMsQ0FBQztJQUU5RSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDVCxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQUM7WUFDekIsVUFBVSxFQUFFLHVCQUF1QjtZQUNuQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUNsRCxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxTQUFTO1lBQzFDLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZSxJQUFJLFNBQVM7WUFDbEQsU0FBUyxFQUFFLEdBQUc7WUFDZCxTQUFTLEVBQUUsV0FBVztTQUN2QixDQUFDLENBQUM7UUFDSCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsc0VBQXNFLENBQUMsQ0FBQztRQUM1RixPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUF3QixFQUFFLENBQUM7SUFDckMsSUFBSyxHQUFXLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFDRCxJQUFLLEdBQVcsQ0FBQyxXQUFXLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMvRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDdEMsQ0FBQztJQUNELElBQUssR0FBVyxDQUFDLGVBQWUsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QyxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsbURBQW1ELENBQUMsQ0FBQztRQUN6RSxPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO0lBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUksR0FBVyxDQUFDLFNBQVMsSUFBSSxXQUFXLENBQUM7SUFFdkQsTUFBTSxVQUFVLENBQUMsU0FBUyxDQUN2QixHQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRyxHQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixFQUFFLEVBQ3RGLEVBQUUsSUFBSSxFQUFFLENBQ1QsQ0FBQztJQUNGLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSx1Q0FBdUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQzlHLENBQUM7QUFFRCxLQUFLLFVBQVUseUJBQXlCLENBQUMsR0FHeEMsRUFBRSxPQUFrQztJQUNuQyxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsS0FBTSxDQUFDLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQ25FLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsSUFBSSxFQUFFLENBQUM7SUFDL0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLE1BQU0sR0FBRyxHQUFHLE1BQU0sVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFVBQVUsRUFBRSx1QkFBdUIsRUFBRSxDQUFDLENBQUM7SUFDOUUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksSUFBSSxRQUFRLENBQUM7SUFFbkQsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1QsTUFBTSxVQUFVLENBQUMsU0FBUyxDQUFDO1lBQ3pCLFVBQVUsRUFBRSx1QkFBdUI7WUFDbkMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDbEQsWUFBWTtZQUNaLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxJQUFJLFNBQVM7WUFDMUMsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlLElBQUksU0FBUztZQUNsRCxTQUFTLEVBQUUsR0FBRztZQUNkLFNBQVMsRUFBRSxXQUFXO1NBQ3ZCLENBQUMsQ0FBQztRQUNILEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxvRUFBb0UsQ0FBQyxDQUFDO1FBQzFGLE9BQU87SUFDVCxDQUFDO0lBRUQsSUFBSyxHQUFXLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzVDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxpREFBaUQsQ0FBQyxDQUFDO1FBQ3ZFLE9BQU87SUFDVCxDQUFDO0lBRUQsTUFBTSxVQUFVLENBQUMsU0FBUyxDQUN2QixHQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRyxHQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixFQUFFLEVBQ3RGO1FBQ0UsSUFBSSxFQUFFO1lBQ0osWUFBWTtZQUNaLFNBQVMsRUFBRSxHQUFHO1lBQ2QsU0FBUyxFQUFHLEdBQVcsQ0FBQyxTQUFTLElBQUksV0FBVztTQUNqRDtLQUNGLENBQ0YsQ0FBQztJQUNGLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSx3REFBd0QsQ0FBQyxDQUFDO0FBQ2hGLENBQUM7QUFFRCxLQUFLLFVBQVUsdUNBQXVDLENBQUMsR0FHdEQ7SUFDQyxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsS0FBTSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sTUFBTSxHQUFHLE1BQU0sVUFBVSxDQUFDLFVBQVUsQ0FDeEMsRUFBRSxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFDOUIsRUFBRSxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUN6QyxDQUFDO0lBQ0YsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLHFEQUFxRCxNQUFNLENBQUMsYUFBYSxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQztBQUNuSSxDQUFDO0FBRUQsS0FBSyxVQUFVLG1EQUFtRCxDQUFDLEdBR2xFLEVBQUUsT0FBa0M7SUFDbkMsTUFBTSx5QkFBeUIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUMsTUFBTSx1Q0FBdUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBRUQsS0FBSyxVQUFVLG9DQUFvQyxDQUFDLEdBR25EO0lBQ0MsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUNuRSxNQUFNLEdBQUcsR0FBRyxNQUFNLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxVQUFVLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNULEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxpRUFBaUUsQ0FBQyxDQUFDO1FBQ3ZGLE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUksR0FBVyxDQUFDLFlBQVksQ0FBQztJQUN2QyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUUsR0FBVyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN2RCwrRUFBK0U7SUFDL0UsMkVBQTJFO0lBQzNFLE1BQU0sVUFBVSxHQUFHLElBQUksS0FBSyxTQUFTO1dBQ2hDLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDN0UsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxxQ0FBcUMsSUFBSSxnQkFBZ0IsU0FBUyxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDeEcsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQ3ZCLEdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFHLEdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsdUJBQXVCLEVBQUUsRUFDdEY7UUFDRSxJQUFJLEVBQUU7WUFDSixZQUFZLEVBQUUsZUFBZTtZQUM3QixTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNyQixTQUFTLEVBQUUsV0FBVztTQUN2QjtLQUNGLENBQ0YsQ0FBQztJQUNGLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSw2REFBNkQsQ0FBQyxDQUFDO0FBQ3JGLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILEtBQUssVUFBVSxpQ0FBaUMsQ0FBQyxHQUdoRDtJQUNDLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDbkUsTUFBTSxHQUFHLEdBQUcsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixFQUFFLENBQUMsQ0FBQztJQUM5RSxNQUFNLE1BQU0sR0FBSSxHQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQztJQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzNCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxzRkFBc0YsQ0FBQyxDQUFDO1FBQzVHLE9BQU87SUFDVCxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLDZFQUE2RTtJQUM3RSw0RUFBNEU7SUFDNUUsTUFBTSw2QkFBNkIsR0FBRyxDQUFDLEtBQVUsRUFBVyxFQUFFLENBQzVELEtBQUssRUFBRSxJQUFJLEtBQUsscUJBQXFCLElBQUksS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEtBQUssU0FBUyxDQUFDO0lBQzdFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsNkJBQTZCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN2RixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFFdEQsNkVBQTZFO0lBQzdFLHdFQUF3RTtJQUN4RSxNQUFNLDBCQUEwQixHQUFHLFNBQVM7U0FDekMsTUFBTSxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksS0FBSyxTQUFTLENBQUM7U0FDekQsR0FBRyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3pELElBQUksMEJBQTBCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUNULE1BQU0sRUFDTiwyQ0FBMkMsMEJBQTBCLENBQUMsTUFBTSxnRUFBZ0UsMEJBQTBCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnR0FBZ0csQ0FDbFIsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLFlBQVksS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN2QixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsMkRBQTJELENBQUMsQ0FBQztRQUNqRixPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sVUFBVSxDQUFDLFNBQVMsQ0FDdkIsR0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUcsR0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSx1QkFBdUIsRUFBRSxFQUN0RjtRQUNFLElBQUksRUFBRTtZQUNKLG9CQUFvQixFQUFFLFNBQVM7WUFDL0IsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDckIsU0FBUyxFQUFHLEdBQVcsQ0FBQyxTQUFTLElBQUksV0FBVztTQUNqRDtLQUNGLENBQ0YsQ0FBQztJQUNGLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUNULE1BQU0sRUFDTixtREFBbUQsWUFBWSxnR0FBZ0csQ0FDaEssQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxLQUFLLFVBQVUsMEJBQTBCLENBQUMsR0FHekM7SUFDQyxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDM0UsTUFBTSxHQUFHLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxVQUFVLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO0lBQ3RGLE1BQU0sS0FBSyxHQUFJLEdBQVcsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQztJQUNyRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2hELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxvRkFBb0YsQ0FBQyxDQUFDO1FBQzFHLE9BQU87SUFDVCxDQUFDO0lBRUQsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUMsS0FBTSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN2QixNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ3hDLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNsQixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFFaEIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixNQUFNLFFBQVEsR0FBRyxPQUFRLElBQVksRUFBRSxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBRSxJQUFZLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbEcsTUFBTSxRQUFRLEdBQUcsT0FBUSxJQUFZLEVBQUUsUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUUsSUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzNGLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMzQixPQUFPLEVBQUUsQ0FBQztZQUNWLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxvRkFBb0YsQ0FBQyxDQUFDO1lBQzFHLFNBQVM7UUFDWCxDQUFDO1FBQ0QsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDcEMsdUVBQXVFO1lBQ3ZFLE9BQU8sRUFBRSxDQUFDO1lBQ1YsU0FBUztRQUNYLENBQUM7UUFDRCxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxPQUFPLEVBQUUsQ0FBQztZQUNWLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSw4REFBOEQsUUFBUSw0QkFBNEIsQ0FBQyxDQUFDO1lBQ3hILFNBQVM7UUFDWCxDQUFDO1FBQ0QsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QixJQUFJLE1BQU0saUJBQWlCLENBQUMsT0FBTyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2xELE9BQU8sRUFBRSxDQUFDO1lBQ1YsU0FBUztRQUNYLENBQUM7UUFFRCxNQUFNLGlCQUFpQixDQUFDLFNBQVMsQ0FBQztZQUNoQyxFQUFFLEVBQUUsWUFBWSxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQy9FLFFBQVE7WUFDUixXQUFXLEVBQUUsa0RBQWtELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLHdFQUF3RTtZQUMvSyxPQUFPLEVBQUUsSUFBSTtZQUNiLGtCQUFrQixFQUFFLHVCQUF1QixDQUFDLFFBQVEsQ0FBQztZQUNyRCxXQUFXLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7WUFDM0MsY0FBYyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7WUFDM0QsVUFBVSxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtZQUMvQixTQUFTLEVBQUUsR0FBRztZQUNkLFNBQVMsRUFBRSxHQUFHO1lBQ2QsU0FBUyxFQUFFLFdBQVc7U0FDdkIsQ0FBQyxDQUFDO1FBQ0gsU0FBUyxFQUFFLENBQUM7UUFDWixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsOENBQThDLFFBQVEsZ0dBQWdHLENBQUMsQ0FBQztJQUM5SyxDQUFDO0lBRUQsTUFBTSxrQkFBa0IsQ0FBQyxTQUFTLENBQy9CLEdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFHLEdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsdUJBQXVCLEVBQUUsRUFDdEY7UUFDRSxJQUFJLEVBQUU7WUFDSix3QkFBd0IsRUFBRSxFQUFFO1lBQzVCLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3JCLFNBQVMsRUFBRyxHQUFXLENBQUMsU0FBUyxJQUFJLFdBQVc7U0FDakQ7S0FDRixDQUNGLENBQUM7SUFDRixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDVCxNQUFNLEVBQ04sNkNBQTZDLFNBQVMsYUFBYSxPQUFPLHlEQUF5RCxDQUNwSSxDQUFDO0FBQ0osQ0FBQztBQUVELEtBQUssVUFBVSw2QkFBNkIsQ0FBQyxHQUc1QztJQUNDLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztJQUNoQixJQUFJLEtBQUssRUFBRSxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMvQixJQUFJLFNBQVMsR0FBUSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDO1lBQ0gsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUUsR0FBVyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNqQixDQUFDO1FBQ0QsTUFBTSxhQUFhLEdBQUcsU0FBUyxFQUFFLE9BQU8sRUFBRSxhQUFhLEtBQUssSUFBSSxDQUFDO1FBQ2pFLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUNsQyxDQUFFLEdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO2lCQUNwQixHQUFHLENBQUMsQ0FBQyxPQUFlLEVBQUUsRUFBRTtnQkFDdkIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDbkQsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3BELENBQUMsQ0FBQztpQkFDRCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQ25CLENBQUMsQ0FBQztRQUNILE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sVUFBVSxDQUFDLFNBQVMsQ0FDeEIsRUFBRSxHQUFHLEVBQUcsR0FBVyxDQUFDLEdBQUcsRUFBRSxFQUN6QjtZQUNFLElBQUksRUFBRTtnQkFDSixTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVM7Z0JBQ2pELGdCQUFnQjtnQkFDaEIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7YUFDOUU7U0FDRixDQUNGLENBQUM7UUFDRixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsK0NBQStDLE9BQU8sa0JBQWtCLENBQUMsQ0FBQztBQUNoRyxDQUFDO0FBRUQsS0FBSyxVQUFVLHNDQUFzQyxDQUFDLEdBR3JEO0lBQ0MsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNqRSxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsS0FBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2RCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUM7SUFDdEIsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztJQUN2QixJQUFJLG9CQUFvQixHQUFHLENBQUMsQ0FBQztJQUU3QixNQUFNLGtCQUFrQixHQUFHLENBQUMsU0FBOEIsRUFBRSxhQUFxQixFQUFVLEVBQUU7UUFDM0YsTUFBTSxZQUFZLEdBQUcsQ0FBQyxRQUFpQixFQUFXLEVBQUU7WUFDbEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztnQkFBRSxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3ZGLElBQUksUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM3QyxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFtQyxDQUFDO3FCQUN2RSxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO3FCQUNoRCxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBRSxRQUFvQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0YsQ0FBQztZQUNELE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUMsQ0FBQztRQUNGLE9BQU8sVUFBVSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUM7WUFDeEUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxFQUFFO1lBQ2hCLFVBQVUsRUFBRSxhQUFhO1lBQ3pCLE1BQU0sRUFBRTtnQkFDTixJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUk7Z0JBQ3BCLGdCQUFnQixFQUFFLFNBQVMsQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFO2dCQUNsRCxtQkFBbUIsRUFBRSxTQUFTLENBQUMsbUJBQW1CLElBQUksRUFBRTtnQkFDeEQsWUFBWSxFQUFFLFNBQVMsQ0FBQyxZQUFZLElBQUksRUFBRTtnQkFDMUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLEtBQUssS0FBSzthQUNyQztTQUNGLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JCLENBQUMsQ0FBQztJQUVGLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDWixNQUFNLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQyxJQUFJLENBQUM7WUFDdEMsR0FBRyxFQUFFO2dCQUNILEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ3hDLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDeEMsRUFBRSxrQkFBa0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDMUMsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUU7Z0JBQzVCLEVBQUUsd0JBQXdCLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ2hELEVBQUUsd0JBQXdCLEVBQUUsSUFBSSxFQUFFO2dCQUNsQyxFQUFFLG1CQUFtQixFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFO2FBQzVDO1NBQ0YsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM5QixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE1BQU07UUFDOUIsS0FBSyxNQUFNLE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUMzQixNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDO21CQUNqRSxNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQztnQkFDdkMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ2pDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDTixNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDO21CQUNyRSxNQUFNLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztnQkFDekMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUM7Z0JBQ25DLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDTixJQUFJLHdCQUF3QixHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDO21CQUMvRSxNQUFNLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQztnQkFDL0MsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUM7Z0JBQ3pDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDTixJQUFJLHdCQUF3QixLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNuQyxNQUFNLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztnQkFDbEUsTUFBTSxZQUFZLEdBQUcsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUFDO29CQUN4QyxPQUFPLEVBQUUsSUFBSTtvQkFDYixhQUFhLEVBQUUsZUFBZTtvQkFDOUIseUJBQXlCLEVBQUUsTUFBTSxDQUFDLEVBQUU7b0JBQ3BDLG1DQUFtQyxFQUFFLGFBQWE7b0JBQ2xELGtDQUFrQyxFQUFFLFFBQVE7b0JBQzVDLDZDQUE2QyxFQUFFLGdCQUFnQjtvQkFDL0QseUNBQXlDLEVBQUUsWUFBWTtpQkFDeEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLHFDQUFxQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzFFLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSwwQkFBMEIsRUFBRSxRQUFRLENBQUM7Z0JBQzdFLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ3hFLHdCQUF3QixHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDcEQsQ0FBQztZQUNILENBQUM7WUFDRCxNQUFNLGNBQWMsQ0FBQyxTQUFTLENBQzVCLE1BQU0sQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFDakY7Z0JBQ0UsSUFBSSxFQUFFO29CQUNKLGdCQUFnQjtvQkFDaEIsa0JBQWtCO29CQUNsQix3QkFBd0I7b0JBQ3hCLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxtQkFBbUIsSUFBSSxJQUFJO2lCQUN4RDthQUNGLENBQ0YsQ0FBQztZQUNGLGVBQWUsRUFBRSxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNaLE1BQU0sS0FBSyxHQUFHLE1BQU0sU0FBUyxDQUFDLElBQUksQ0FBQztZQUNqQyxhQUFhLEVBQUUsZUFBZTtZQUM5QixHQUFHLEVBQUU7Z0JBQ0gsRUFBRSx1Q0FBdUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDL0QsRUFBRSx1Q0FBdUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO2FBQ2hFO1NBQ0YsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM5QixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE1BQU07UUFDOUIsS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUMxQixNQUFNLGVBQWUsR0FBRyxPQUFPLEtBQUssQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLEVBQUUsS0FBSyxRQUFRO2dCQUN6RSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtnQkFDcEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNQLE1BQU0sTUFBTSxHQUFHLGVBQWU7Z0JBQzVCLENBQUMsQ0FBQyxNQUFNLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsZUFBZSxFQUFFLENBQUM7Z0JBQ3ZELENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDVCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDL0YsTUFBTSxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRTtnQkFDbEMsSUFBSSxFQUFFO29CQUNKLHVDQUF1QyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsSUFBSSxDQUFDO29CQUN0RSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQ3ZDO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsY0FBYyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLE1BQU07Z0JBQUUsb0JBQW9CLEVBQUUsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQztJQUVELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUNULG9CQUFvQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQzFDLGdEQUFnRCxlQUFlLGVBQWUsY0FBYyx1QkFBdUIsb0JBQW9CLGtCQUFrQixDQUMxSixDQUFDO0FBQ0osQ0FBQztBQUVELEtBQUssVUFBVSw0QkFBNEIsQ0FBQyxHQUczQztJQUNDLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0lBQy9CLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNyRSxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDekUsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUVqRSxNQUFNLHNCQUFzQixHQUFHLENBQzdCLFdBQWdCLEVBQ2hCLGVBQXVCLEVBQ2QsRUFBRTtRQUNYLElBQUksV0FBVyxFQUFFLEdBQUcsS0FBSyxTQUFTLElBQUksV0FBVyxFQUFFLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNoRSxNQUFNLElBQUksS0FBSyxDQUNiLDZCQUE2QixlQUFlLDZCQUE2QixDQUMxRSxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sV0FBVyxDQUFDLEdBQUcsQ0FBQztJQUN6QixDQUFDLENBQUM7SUFDRixNQUFNLHVCQUF1QixHQUFHLEtBQUssRUFDbkMsYUFBa0IsRUFDbEIsV0FBb0MsRUFDcEMsU0FBa0MsRUFDbEMsZUFBdUIsRUFDUixFQUFFO1FBQ2pCLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDWixNQUFNLEtBQUssR0FBRyxNQUFNLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNsRCxVQUFVLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO2FBQ3ZCLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4RCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxNQUFNO1lBQzlCLE1BQU0sTUFBTSxHQUFHLE1BQU0sYUFBYSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDNUUsU0FBUyxFQUFFO29CQUNULE1BQU0sRUFBRTt3QkFDTixHQUFHLEVBQUUsc0JBQXNCLENBQUMsV0FBVyxFQUFFLGVBQWUsQ0FBQzt3QkFDekQsR0FBRyxXQUFXO3FCQUNmO29CQUNELE1BQU0sRUFBRSxTQUFTO2lCQUNsQjthQUNGLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDekIsSUFBSSxNQUFNLENBQUMsYUFBYSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMvQixNQUFNLElBQUksS0FBSyxDQUNiLDZCQUE2QixlQUFlLDRCQUE0QixDQUN6RSxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDLENBQUM7SUFDRixNQUFNLHdCQUF3QixHQUFHO1FBQy9CLEdBQUcsRUFBRTtZQUNILEVBQUUsbUJBQW1CLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDM0MsRUFBRSxtQkFBbUIsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO1NBQzVDO0tBQ0YsQ0FBQztJQUVGLE1BQU0sdUJBQXVCLENBQzNCLGlCQUFpQixFQUNqQix3QkFBd0IsRUFDeEIsRUFBRSxJQUFJLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUNwQyxTQUFTLENBQ1YsQ0FBQztJQUNGLE1BQU0sdUJBQXVCLENBQzNCLGlCQUFpQixFQUNqQixFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFDbkIsRUFBRSxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFDN0IsU0FBUyxDQUNWLENBQUM7SUFDRixNQUFNLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQy9DLFVBQVUsRUFBRTtZQUNWLEdBQUcsRUFBRSxDQUFDO1lBQ04sRUFBRSxFQUFFLENBQUM7WUFDTCxtQkFBbUIsRUFBRSxDQUFDO1NBQ3ZCO0tBQ0YsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxxQkFBcUIsR0FBRyxPQUFPLGFBQWEsQ0FBQyxTQUFTLEtBQUssVUFBVTtRQUN6RSxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQztRQUM3QyxDQUFDLENBQUMsYUFBYSxDQUFDO0lBQ2xCLElBQUksS0FBSyxFQUFFLE1BQU0sT0FBTyxJQUFJLHFCQUFxQixFQUFFLENBQUM7UUFDbEQsSUFDRSxPQUFPLE9BQU8sQ0FBQyxFQUFFLEtBQUssUUFBUTtlQUMzQixPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDO2VBQzlCLE9BQU8sQ0FBQyxFQUFFLEtBQUssT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUU7ZUFDaEMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztlQUNsRCxPQUFPLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxFQUNsQyxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSwyQkFBMkIsR0FBRyxLQUFLLEVBQ3ZDLGFBQWtCLEVBQ2xCLGVBQXNDLEVBQ3ZCLEVBQUU7UUFDakIsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUNaLE1BQU0sS0FBSyxHQUFHLE1BQU0sYUFBYSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtnQkFDL0QsVUFBVSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFO2FBQ3JDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4RCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxNQUFNO1lBQzlCLE1BQU0sVUFBVSxHQUtYLEVBQUUsQ0FBQztZQUNSLEtBQUssTUFBTSxRQUFRLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQzdCLElBQ0UsT0FBTyxRQUFRLENBQUMsU0FBUyxLQUFLLFFBQVE7dUJBQ25DLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUM7dUJBQ3RDLFFBQVEsQ0FBQyxTQUFTLEtBQUssUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFDbkQsQ0FBQztvQkFDRCxNQUFNLElBQUksS0FBSyxDQUNiLHVDQUF1QyxlQUFlLHNCQUFzQixDQUM3RSxDQUFDO2dCQUNKLENBQUM7Z0JBQ0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxPQUFPLENBQzdDLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsRUFDMUIsRUFBRSxVQUFVLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUMzQyxDQUFDO2dCQUNGLElBQ0UsQ0FBQyxPQUFPO3VCQUNMLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUM7dUJBQ2xELE9BQU8sQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLEVBQ2xDLENBQUM7b0JBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDYixvQ0FBb0MsZUFBZSxzQkFBc0IsQ0FDMUUsQ0FBQztnQkFDSixDQUFDO2dCQUNELFVBQVUsQ0FBQyxJQUFJLENBQUM7b0JBQ2QsU0FBUyxFQUFFO3dCQUNULE1BQU0sRUFBRTs0QkFDTixHQUFHLEVBQUUsc0JBQXNCLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQzs0QkFDdEQsU0FBUyxFQUFFLFFBQVEsQ0FBQyxTQUFTOzRCQUM3QixHQUFHLHdCQUF3Qjt5QkFDNUI7d0JBQ0QsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLG1CQUFtQixFQUFFLEVBQUU7cUJBQ3ZFO2lCQUNGLENBQUMsQ0FBQztZQUNMLENBQUM7WUFDRCxNQUFNLE1BQU0sR0FBRyxNQUFNLGFBQWEsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDN0UsSUFBSSxNQUFNLENBQUMsYUFBYSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMvQixNQUFNLElBQUksS0FBSyxDQUNiLDZCQUE2QixlQUFlLDRCQUE0QixDQUN6RSxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDLENBQUM7SUFDRixNQUFNLDJCQUEyQixDQUFDLG1CQUFtQixFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sMkJBQTJCLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRTVELE1BQU0sMEJBQTBCLEdBQUcsS0FBSyxFQUN0QyxXQUFnQixFQUNoQixlQUFzQyxFQUN2QixFQUFFO1FBQ2pCLElBQ0UsT0FBTyxXQUFXLENBQUMsU0FBUyxLQUFLLFFBQVE7ZUFDdEMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQztlQUN6QyxXQUFXLENBQUMsU0FBUyxLQUFLLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO2VBQ3RELENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUM7ZUFDdEQsV0FBVyxDQUFDLG1CQUFtQixHQUFHLENBQUM7ZUFDbkMsQ0FDRCxlQUFlLEtBQUssT0FBTzttQkFDeEIsQ0FDRCxPQUFPLFdBQVcsQ0FBQyxFQUFFLEtBQUssUUFBUTt1QkFDL0IsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQzt1QkFDbEMsV0FBVyxDQUFDLEVBQUUsS0FBSyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUM1QyxDQUNGLEVBQ0QsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLGVBQWUsc0JBQXNCLENBQUMsQ0FBQztRQUNoRyxDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxPQUFPLENBQzdDLEVBQUUsRUFBRSxFQUFFLFdBQVcsQ0FBQyxTQUFTLEVBQUUsRUFDN0IsRUFBRSxVQUFVLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUMzQyxDQUFDO1FBQ0YsSUFDRSxDQUFDLE9BQU87ZUFDTCxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDO2VBQ2xELFdBQVcsQ0FBQyxtQkFBbUIsR0FBRyxPQUFPLENBQUMsbUJBQW1CLEVBQ2hFLENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxlQUFlLHNCQUFzQixDQUFDLENBQUM7UUFDN0YsQ0FBQztJQUNILENBQUMsQ0FBQztJQUNGLE1BQU0seUJBQXlCLEdBQUcsS0FBSyxFQUNyQyxhQUFrQixFQUNsQixlQUFzQyxFQUN2QixFQUFFO1FBQ2pCLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ3BDLFVBQVUsRUFBRTtnQkFDVixHQUFHLEVBQUUsQ0FBQztnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxTQUFTLEVBQUUsQ0FBQztnQkFDWixtQkFBbUIsRUFBRSxDQUFDO2FBQ3ZCO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxjQUFjLEdBQUcsT0FBTyxNQUFNLENBQUMsU0FBUyxLQUFLLFVBQVU7WUFDM0QsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUM7WUFDdEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNYLElBQUksS0FBSyxFQUFFLE1BQU0sUUFBUSxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQzVDLE1BQU0sMEJBQTBCLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzlELENBQUM7SUFDSCxDQUFDLENBQUM7SUFDRixNQUFNLHlCQUF5QixDQUFDLG1CQUFtQixFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0seUJBQXlCLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRTFELE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxpQkFFMUIsRUFBRSxFQUFFLENBQUMsNkJBQTZCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxHQUFHLENBQzNELENBQUMsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEdBQUcsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQ3ZFLENBQUM7SUFDRixNQUFNLGlCQUFpQixDQUFDLGFBQWEsQ0FDbkMsb0JBQW9CLENBQUMsbUJBQW1CLENBQUMsQ0FDMUMsQ0FBQztJQUVGLE1BQU0sbUJBQW1CLENBQUMsYUFBYSxDQUNyQyxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUM1QyxDQUFDO0lBRUYsTUFBTSxlQUFlLENBQUMsYUFBYSxDQUNqQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUN4QyxDQUFDO0lBRUYsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQ1QsTUFBTSxFQUNOLHlFQUF5RSxDQUMxRSxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sNEJBQTRCLEdBQUcscUNBQXFDLENBQUM7QUFDM0UsTUFBTSxnQ0FBZ0MsR0FBRyxzQ0FBc0MsQ0FBQztBQUNoRixNQUFNLGtDQUFrQyxHQUFHLHVCQUF1QixDQUFDO0FBRW5FLEtBQUssVUFBVSxrQ0FBa0MsQ0FBQyxHQUdqRDtJQUNDLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDekMsTUFBTSxhQUFhLEdBQVUsRUFBRSxDQUFDO0lBQ2hDLElBQUksb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLElBQUksb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0lBRTdCLE1BQU0sV0FBVyxHQUFHLEtBQUssSUFBSSxFQUFFO1FBQzdCLElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTztRQUN2QyxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDL0YsQ0FBQyxDQUFDO0lBRUYsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDakMsVUFBVSxFQUFFO1lBQ1YsR0FBRyxFQUFFLENBQUM7WUFDTixzQkFBc0IsRUFBRSxDQUFDO1lBQ3pCLHdCQUF3QixFQUFFLENBQUM7WUFDM0IsZ0JBQWdCLEVBQUUsQ0FBQztTQUNwQjtLQUNGLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwQixNQUFNLGNBQWMsR0FBRyxPQUFPLE1BQU0sQ0FBQyxTQUFTLEtBQUssVUFBVTtRQUMzRCxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7UUFDdkIsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUVYLElBQUksS0FBSyxFQUFFLE1BQU0sUUFBUSxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQzVDLE1BQU0sZ0JBQWdCLEdBQUc7WUFDdkIsUUFBUSxDQUFDLHNCQUFzQjtZQUMvQixRQUFRLENBQUMsd0JBQXdCO1lBQ2pDLFFBQVEsQ0FBQyxnQkFBZ0I7U0FDMUIsQ0FBQztRQUNGLElBQUksZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDO1lBQUUsU0FBUztRQUUzRSxNQUFNLGVBQWUsR0FBRyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDO2VBQ3JGLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUM7ZUFDeEUsa0NBQWtDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sU0FBUyxHQUFHLGVBQWU7WUFDL0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsUUFBUSxDQUFDLHdCQUF3QixDQUFDLENBQUM7WUFDdEYsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNULE1BQU0sV0FBVyxHQUFHLFNBQVMsS0FBSyxJQUFJLElBQUksY0FBYyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV4RSxJQUFJLGVBQWUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLGNBQWMsQ0FBQyxHQUFHLENBQUMsU0FBVSxDQUFDLENBQUM7WUFDL0IsU0FBUztRQUNYLENBQUM7UUFFRCxJQUFJLFFBQVEsQ0FBQyxHQUFHLEtBQUssU0FBUyxJQUFJLFFBQVEsQ0FBQyxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDeEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7UUFDRCxhQUFhLENBQUMsSUFBSSxDQUFDO1lBQ2pCLFNBQVMsRUFBRTtnQkFDVCxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRTtnQkFDN0IsTUFBTSxFQUFFO29CQUNOLE1BQU0sRUFBRTt3QkFDTixzQkFBc0IsRUFBRSxFQUFFO3dCQUMxQix3QkFBd0IsRUFBRSxFQUFFO3dCQUM1QixnQkFBZ0IsRUFBRSxFQUFFO3FCQUNyQjtpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxXQUFXO1lBQUUsb0JBQW9CLEVBQUUsQ0FBQzs7WUFDbkMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLGFBQWEsQ0FBQyxNQUFNLElBQUksR0FBRztZQUFFLE1BQU0sV0FBVyxFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUNELE1BQU0sV0FBVyxFQUFFLENBQUM7SUFFcEIsTUFBTSxVQUFVLENBQUMsV0FBVyxDQUMxQjtRQUNFLHNCQUFzQixFQUFFLENBQUM7UUFDekIsd0JBQXdCLEVBQUUsQ0FBQztLQUM1QixFQUNEO1FBQ0UsSUFBSSxFQUFFLDRDQUE0QztRQUNsRCxNQUFNLEVBQUUsSUFBSTtRQUNaLE1BQU0sRUFBRSxJQUFJO0tBQ2IsQ0FDRixDQUFDO0lBQ0YsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQ1QsTUFBTSxFQUNOLGlHQUFpRyxvQkFBb0IsZ0JBQWdCLG9CQUFvQiwrQkFBK0IsQ0FDekwsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUscUJBQXFCLENBQ3pDLEVBQVcsRUFDWCxhQUFxQixFQUNyQixVQUFxQyxFQUFFO0lBRXZDLE1BQU0sRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDdEQsTUFBTSxtQkFBbUIsR0FBRyxhQUFhLENBQUMsYUFBYSxFQUFFLHNDQUFzQyxDQUFDLElBQUksQ0FBQztRQUNuRyxDQUFDLENBQUMscUNBQXFDO1FBQ3ZDLENBQUMsQ0FBQyxhQUFhLENBQUM7SUFDbEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxFQUFFLENBQUMsY0FBYyxDQUFDO1FBQ3RDLGFBQWE7UUFDYixFQUFFLEVBQUUsRUFBUztRQUNiLDBFQUEwRTtRQUMxRSxtQkFBbUI7UUFDbkIsK0VBQStFO1FBQy9FLHFCQUFxQixFQUFFLFFBQVE7UUFDL0IsOEVBQThFO1FBQzlFLFVBQVUsRUFBRSxFQUFFLEdBQUcsTUFBTTtRQUN2QixTQUFTLEVBQUUsRUFBRSxHQUFHLE1BQU07S0FDdkIsQ0FBQyxDQUFDO0lBR0wsTUFBTSwwQ0FBMEMsR0FBRyxRQUFRLENBQUM7SUFDNUQsTUFBTSw4Q0FBOEMsR0FBRyxRQUFRLENBQUM7SUFFaEUsS0FBSyxVQUFVLG1DQUFtQyxDQUFDLEdBR2xEO1FBQ0MsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckQsTUFBTSxJQUFJLEdBQUcsTUFBTSxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQ2pDLEdBQUcsRUFBRTtnQkFDSCxFQUFFLHlCQUF5QixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFO2dCQUNoRCxFQUFFLHVCQUF1QixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFO2dCQUM5QyxFQUFFLG9CQUFvQixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFO2dCQUMzQyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRTthQUN2QztTQUNGLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdkIsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDcEMsTUFBTSxHQUFHLEdBQTRCLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixJQUFJLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDM0QsR0FBRyxDQUFDLDRCQUE0QixDQUFDLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQztZQUM5RCxDQUFDO1lBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLElBQUksUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN2RCxHQUFHLENBQUMsMEJBQTBCLENBQUMsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDO1lBQzFELENBQUM7WUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixJQUFJLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDdkQsR0FBRyxDQUFDLDZCQUE2QixDQUFDLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztZQUMxRCxDQUFDO1lBQ0QsSUFBSSxRQUFRLENBQUMsU0FBUyxLQUFLLFlBQVksRUFBRSxDQUFDO2dCQUN4QyxHQUFHLENBQUMsb0JBQW9CLENBQUMsR0FBRyxlQUFlLENBQUM7WUFDOUMsQ0FBQztZQUNELE1BQU0sTUFBTSxHQUE0QjtnQkFDdEMsTUFBTSxFQUFFO29CQUNOLHlCQUF5QixFQUFFLEVBQUU7b0JBQzdCLHVCQUF1QixFQUFFLEVBQUU7b0JBQzNCLG9CQUFvQixFQUFFLEVBQUU7aUJBQ3pCO2FBQ0YsQ0FBQztZQUNGLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1lBQ3BCLENBQUM7WUFDRCxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDVCxNQUFNLEVBQ04scURBQXFELElBQUksQ0FBQyxNQUFNLFdBQVcsQ0FDNUUsQ0FBQztJQUNKLENBQUM7SUFFRCxTQUFTLHVCQUF1QixDQUFDLE9BQVk7UUFDM0MsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDMUQsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLE9BQU8sQ0FBQyxnQkFBZ0IsS0FBSyxRQUFRO1lBQ25FLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQy9DLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxNQUFNLGlCQUFpQixHQUFHLE9BQU8sT0FBTyxDQUFDLGlCQUFpQixLQUFLLFFBQVE7WUFDckUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDaEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNQLE9BQU8sZ0JBQWdCLEtBQUssVUFBVSxJQUFJLGlCQUFpQixLQUFLLFVBQVUsQ0FBQztJQUM3RSxDQUFDO0lBRUQsS0FBSyxVQUFVLGdEQUFnRCxDQUFDLEdBRy9EO1FBQ0MsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUMsS0FBTSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzFELE1BQU0sUUFBUSxHQUFHLE1BQU0saUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzVELE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRTtZQUNuRCxPQUFPLE9BQU8sT0FBTyxDQUFDLEVBQUUsS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFRLENBQUM7UUFDeEYsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFO1lBQ25DLE9BQU8sT0FBTyxPQUFPLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxLQUFLLFFBQVEsQ0FBQztRQUM1RixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDdkIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLDRGQUE0RixDQUFDLENBQUM7WUFDbEgsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBRztZQUNwQixnQkFBZ0IsRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUMxQyxpQkFBaUIsRUFBRSxPQUFPLGFBQWEsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRO1NBQzFGLENBQUM7UUFDRixNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDO1lBQ2xDLG9CQUFvQixFQUFFLGVBQWU7U0FDdEMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFFakIsSUFBSSxLQUFLLEVBQUUsTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7WUFDL0IsU0FBUyxFQUFFLENBQUM7WUFDWixNQUFNLFFBQVEsR0FBSSxHQUFXLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUM3QyxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUM7Z0JBQzNELENBQUMsQ0FBQyxRQUFRLENBQUMsY0FBYztnQkFDekIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNQLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQzttQkFDNUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUM5RSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ25CLFNBQVM7WUFDWCxDQUFDO1lBRUQsTUFBTSxlQUFlLENBQUMsU0FBUyxDQUM1QixHQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRyxHQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFHLEdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFDdEU7Z0JBQ0UsSUFBSSxFQUFFO29CQUNKLHlCQUF5QixFQUFFLENBQUMsYUFBYSxDQUFDO29CQUMxQyx5QkFBeUIsRUFBRSxHQUFHO29CQUM5QixTQUFTLEVBQUUsR0FBRztpQkFDZjtnQkFDRCxNQUFNLEVBQUU7b0JBQ04sZ0JBQWdCLEVBQUUsRUFBRTtpQkFDckI7YUFDRixDQUNGLENBQUM7WUFDRixRQUFRLEVBQUUsQ0FBQztRQUNiLENBQUM7UUFFRCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDVCxNQUFNLEVBQ04sNkRBQTZELFFBQVEsSUFBSSxTQUFTLFdBQVcsQ0FDOUYsQ0FBQztJQUNKLENBQUM7SUFFQyx3RUFBd0U7SUFDeEUsb0RBQW9EO0lBQ3BELFNBQVM7U0FDTixJQUFJLENBQUMsa0NBQWtDLENBQUM7U0FDeEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDNUIsV0FBVyxDQUFDLDhEQUE4RCxDQUFDO1NBQzNFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN2RCxJQUFJLENBQUMseUNBQXlDLENBQUM7U0FDL0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDM0IsV0FBVyxDQUFDLDJEQUEyRCxDQUFDO1NBQ3hFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDaEIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsVUFBVSxDQUN4QyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFDcEIsRUFBRSxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FDakMsQ0FBQztRQUNGLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUNULE1BQU0sRUFDTixxREFBcUQsTUFBTSxDQUFDLGFBQWEsWUFBWSxDQUN0RixDQUFDO0lBQ0osQ0FBQyxDQUFDO1NBQ0QsSUFBSSxDQUFDLHNDQUFzQyxDQUFDO1NBQzVDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQzNCLFdBQVcsQ0FBQywyREFBMkQsQ0FBQztTQUN4RSxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ2hCLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sTUFBTSxHQUFHLE1BQU0sVUFBVSxDQUFDLFVBQVUsQ0FDeEMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQ3BCLEVBQUUsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQzlCLENBQUM7UUFDRixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDVCxNQUFNLEVBQ04sa0RBQWtELE1BQU0sQ0FBQyxhQUFhLFlBQVksQ0FDbkYsQ0FBQztJQUNKLENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQztTQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQztTQUM1QixXQUFXLENBQUMsMkVBQTJFLENBQUM7U0FDeEYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNoQixNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBTSxDQUFDO1FBRXRCLHlFQUF5RTtRQUN6RSxNQUFNLFdBQVcsR0FBRyxNQUFNLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25GLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzQixNQUFNLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN4RCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBRUQsbUVBQW1FO1FBQ25FLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsVUFBVSxDQUN0QyxFQUFFLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUM5QixFQUFFLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUM1QixDQUFDO1FBQ0YsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLHVCQUF1QixNQUFNLENBQUMsYUFBYSxvQkFBb0IsQ0FBQyxDQUFDO1FBRXJGLHNDQUFzQztRQUN0QyxNQUFNLG1CQUFtQixHQUFHLE1BQU0sRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDN0YsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbkMsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDL0MsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLHFDQUFxQyxDQUFDLENBQUM7UUFDN0QsQ0FBQztJQUNILENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyxvQ0FBb0MsQ0FBQztTQUMxQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQztTQUM3QixXQUFXLENBQUMsaUZBQWlGLENBQUM7U0FDOUYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNoQixNQUFNLCtCQUErQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyw0QkFBNEIsQ0FBQztTQUNsQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQztTQUM3QixXQUFXLENBQUMsbUVBQW1FLENBQUM7U0FDaEYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNoQixNQUFNLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDLENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyw2Q0FBNkMsQ0FBQztTQUNuRCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQztTQUM3QixXQUFXLENBQUMsb0VBQW9FLENBQUM7U0FDakYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNoQixNQUFNLHVDQUF1QyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyxzQ0FBc0MsQ0FBQztTQUM1QyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQztTQUM3QixXQUFXLENBQUMsZ0VBQWdFLENBQUM7U0FDN0UsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNoQixNQUFNLGdDQUFnQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlDLENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyxrREFBa0QsQ0FBQztTQUN4RCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQztTQUM3QixXQUFXLENBQUMsa0ZBQWtGLENBQUM7U0FDL0YsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNoQixNQUFNLDBDQUEwQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3hELENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyw4Q0FBOEMsQ0FBQztTQUNwRCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLDRDQUE0QyxDQUFDO1NBQ2hFLFdBQVcsQ0FBQyxxRkFBcUYsQ0FBQztTQUNsRyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQyxDQUFDO0lBRUwsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLDBDQUEwQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbEYsU0FBUzthQUNOLElBQUksQ0FBQyx5Q0FBeUMsQ0FBQzthQUMvQyxJQUFJLENBQUMsNENBQTRDLENBQUMsQ0FBQyxFQUFFLENBQUMsMENBQTBDLENBQUM7YUFDakcsV0FBVyxDQUFDLDZGQUE2RixDQUFDO2FBQzFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDaEIsTUFBTSxtQ0FBbUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQyxNQUFNLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztRQUNMLElBQUksYUFBYSxDQUFDLGFBQWEsRUFBRSwwQ0FBMEMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pGLElBQUksYUFBYSxDQUFDLGFBQWEsRUFBRSw4Q0FBOEMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN0RixTQUFTO3FCQUNOLElBQUksQ0FBQyxpREFBaUQsQ0FBQztxQkFDdkQsSUFBSSxDQUFDLDBDQUEwQyxDQUFDLENBQUMsRUFBRSxDQUFDLDhDQUE4QyxDQUFDO3FCQUNuRyxXQUFXLENBQUMsMkVBQTJFLENBQUM7cUJBQ3hGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7b0JBQ2hCLE1BQU0sZ0RBQWdELENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzVELE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDbEQsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLDhDQUE4QyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3JGLElBQUksYUFBYSxDQUFDLGFBQWEsRUFBRSxvQ0FBb0MsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO3dCQUM1RSxTQUFTOzZCQUNOLElBQUksQ0FBQyw0QkFBNEIsQ0FBQzs2QkFDbEMsSUFBSSxDQUFDLDhDQUE4QyxDQUFDLENBQUMsRUFBRSxDQUFDLG9DQUFvQyxDQUFDOzZCQUM3RixXQUFXLENBQUMscUZBQXFGLENBQUM7NkJBQ2xHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7NEJBQ2hCLE1BQU0sc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ2xDLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDOzRCQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzt3QkFDbEQsQ0FBQyxDQUFDLENBQUM7d0JBQ0wsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLG9DQUFvQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7NEJBQzNFLElBQUksYUFBYSxDQUFDLGFBQWEsRUFBRSwyQ0FBMkMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dDQUNuRixTQUFTO3FDQUNOLElBQUksQ0FBQywwREFBMEQsQ0FBQztxQ0FDaEUsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLENBQUMsRUFBRSxDQUFDLG1EQUFtRCxDQUFDO3FDQUNsRyxXQUFXLENBQUMsNEVBQTRFLENBQUM7cUNBQ3pGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7b0NBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29DQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztnQ0FDbEQsQ0FBQyxDQUFDO3FDQUNELElBQUksQ0FBQyw0REFBNEQsQ0FBQztxQ0FDbEUsSUFBSSxDQUFDLG1EQUFtRCxDQUFDLENBQUMsRUFBRSxDQUFDLDJDQUEyQyxDQUFDO3FDQUN6RyxXQUFXLENBQUMsb0ZBQW9GLENBQUM7cUNBQ2pHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7b0NBQ2hCLE1BQU0sbURBQW1ELENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dDQUMxRSxDQUFDLENBQUMsQ0FBQztnQ0FDTCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsMkNBQTJDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQ0FDbEYsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLDZCQUE2QixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7d0NBQ3JFLFNBQVM7NkNBQ04sSUFBSSxDQUFDLDBCQUEwQixDQUFDOzZDQUNoQyxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxFQUFFLENBQUMsNkJBQTZCLENBQUM7NkNBQ25GLFdBQVcsQ0FBQywwRkFBMEYsQ0FBQzs2Q0FDdkcsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTs0Q0FDaEIsTUFBTSxvQ0FBb0MsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0Q0FDaEQsTUFBTSw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0Q0FDekMsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7NENBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dDQUNsRCxDQUFDLENBQUMsQ0FBQzt3Q0FDTCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsNkJBQTZCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs0Q0FDcEUsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLHNDQUFzQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0RBQzlFLFNBQVM7cURBQ04sSUFBSSxDQUFDLHVFQUF1RSxDQUFDO3FEQUM3RSxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxFQUFFLENBQUMscUNBQXFDLENBQUM7cURBQzdFLFdBQVcsQ0FBQyw0RUFBNEUsQ0FBQztxREFDekYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtvREFDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7b0RBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dEQUNsRCxDQUFDLENBQUMsQ0FBQztnREFDTCxTQUFTO3FEQUNOLElBQUksQ0FBQywyQkFBMkIsQ0FBQztxREFDakMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLENBQUMsRUFBRSxDQUFDLHNDQUFzQyxDQUFDO3FEQUN0RixXQUFXLENBQUMsMkRBQTJELENBQUM7cURBQ3hFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7b0RBQ2hCLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO29EQUN4RCxNQUFNLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztvREFDbEUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLDZEQUE2RCxDQUFDLENBQUM7Z0RBQ3JGLENBQUMsQ0FBQyxDQUFDO2dEQUNMLElBQUksYUFBYSxDQUFDLGFBQWEsRUFBRSxzQ0FBc0MsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29EQUM3RSxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsaUNBQWlDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzt3REFDekUsU0FBUzs2REFDTixJQUFJLENBQUMscUJBQXFCLENBQUM7NkRBQzNCLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxpQ0FBaUMsQ0FBQzs2REFDbEYsV0FBVyxDQUFDLDhGQUE4RixDQUFDOzZEQUMzRyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFOzREQUNoQixNQUFNLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxDQUFDOzREQUNwQyxNQUFNLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzs0REFDckQsTUFBTSwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7d0RBQ2xELENBQUMsQ0FBQyxDQUFDO3dEQUNMLElBQ0UsYUFBYSxDQUFDLGFBQWEsRUFBRSxzQ0FBc0MsQ0FBQyxJQUFJLENBQUMsRUFDekUsQ0FBQzs0REFDRCxTQUFTO2lFQUNOLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQztpRUFDeEMsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLENBQUMsRUFBRSxDQUFDLHNDQUFzQyxDQUFDO2lFQUNsRixXQUFXLENBQUMsMkZBQTJGLENBQUM7aUVBQ3hHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0VBQ2hCLE1BQU0sNkJBQTZCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dFQUNsRCxNQUFNLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztnRUFDckQsTUFBTSwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7NERBQ2xELENBQUMsQ0FBQyxDQUFDOzREQUNMLElBQ0UsYUFBYSxDQUFDLGFBQWEsRUFBRSxzQ0FBc0MsQ0FBQyxHQUFHLENBQUMsRUFDeEUsQ0FBQztnRUFDRCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsMENBQTBDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvRUFDbEYsU0FBUzt5RUFDTixJQUFJLENBQUMsd0NBQXdDLENBQUM7eUVBQzlDLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyx5Q0FBeUMsQ0FBQzt5RUFDMUYsV0FBVyxDQUFDLG1EQUFtRCxDQUFDO3lFQUNoRSxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO3dFQUNoQixNQUFNLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzt3RUFDckQsTUFBTSwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7b0VBQ2xELENBQUMsQ0FBQzt5RUFDRCxJQUFJLENBQUMsK0JBQStCLENBQUM7eUVBQ3JDLElBQUksQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQywwQ0FBMEMsQ0FBQzt5RUFDOUYsV0FBVyxDQUFDLHNFQUFzRSxDQUFDO3lFQUNuRixFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO3dFQUNoQixNQUFNLHlDQUF5QyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzt3RUFDOUQsTUFBTSxpQ0FBaUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3RUFDN0MsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7d0VBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29FQUNsRCxDQUFDLENBQUMsQ0FBQztvRUFDTCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsMENBQTBDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3RUFDakYsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLHVDQUF1QyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7NEVBQy9FLFNBQVM7aUZBQ04sSUFBSSxDQUFDLDBEQUEwRCxDQUFDO2lGQUNoRSxJQUFJLENBQUMsMENBQTBDLENBQUMsQ0FBQyxFQUFFLENBQUMsc0NBQXNDLENBQUM7aUZBQzNGLFdBQVcsQ0FBQyx3RUFBd0UsQ0FBQztpRkFDckYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtnRkFDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0ZBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDOzRFQUNsRCxDQUFDLENBQUM7aUZBQ0QsSUFBSSxDQUFDLGlDQUFpQyxDQUFDO2lGQUN2QyxJQUFJLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxFQUFFLENBQUMsdUNBQXVDLENBQUM7aUZBQ3hGLFdBQVcsQ0FBQywrREFBK0QsQ0FBQztpRkFDNUUsU0FBUyxFQUFFO2lGQUNYLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0ZBQ2hCLE1BQU0sOEJBQThCLENBQUMsR0FBRyxDQUFDLENBQUM7Z0ZBQzFDLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dGQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzs0RUFDbEQsQ0FBQyxDQUFDLENBQUM7NEVBQ0wsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLHVDQUF1QyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0ZBQzlFLElBQUksYUFBYSxDQUFDLGFBQWEsRUFBRSx1Q0FBdUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29GQUMvRSxTQUFTO3lGQUNOLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQzt5RkFDMUMsSUFBSSxDQUFDLHVDQUF1QyxDQUFDLENBQUMsRUFBRSxDQUFDLHVDQUF1QyxDQUFDO3lGQUN6RixXQUFXLENBQUMscUVBQXFFLENBQUM7eUZBQ2xGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7d0ZBQ2hCLE1BQU0sc0NBQXNDLENBQUMsR0FBRyxDQUFDLENBQUM7d0ZBQ2xELE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dGQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztvRkFDbEQsQ0FBQyxDQUFDLENBQUM7b0ZBQ0wsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLHVDQUF1QyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0ZBQzlFLElBQUksYUFBYSxDQUFDLGFBQWEsRUFBRSxzQ0FBc0MsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDOzRGQUM5RSxTQUFTO2lHQUNOLElBQUksQ0FBQyw4REFBOEQsQ0FBQztpR0FDcEUsSUFBSSxDQUFDLHVDQUF1QyxDQUFDLENBQUMsRUFBRSxDQUFDLHFDQUFxQyxDQUFDO2lHQUN2RixXQUFXLENBQUMsb0VBQW9FLENBQUM7aUdBQ2pGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0dBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dHQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzs0RkFDbEQsQ0FBQyxDQUFDO2lHQUNELElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQztpR0FDdEMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLENBQUMsRUFBRSxDQUFDLHNDQUFzQyxDQUFDO2lHQUN0RixXQUFXLENBQUMsMEZBQTBGLENBQUM7aUdBQ3ZHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0dBQ2hCLE1BQU0sa0NBQWtDLENBQUMsR0FBRyxDQUFDLENBQUM7NEZBQ2hELENBQUMsQ0FBQyxDQUFDOzRGQUNMLElBQUksYUFBYSxDQUFDLGFBQWEsRUFBRSw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dHQUNyRSxTQUFTO3FHQUNOLElBQUksQ0FBQywwQkFBMEIsQ0FBQztxR0FDaEMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUMsRUFBRSxDQUFDLDZCQUE2QixDQUFDO3FHQUNwRSxXQUFXLENBQUMsK0VBQStFLENBQUM7cUdBQzVGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7b0dBQ2hCLE1BQU0sNEJBQTRCLENBQUMsR0FBRyxDQUFDLENBQUM7b0dBQ3hDLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29HQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztnR0FDbEQsQ0FBQyxDQUFDLENBQUM7Z0dBQ0wsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLGtDQUFrQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0dBQzFFLFNBQVM7eUdBQ04sSUFBSSxDQUFDLGlDQUFpQyxDQUFDO3lHQUN2QyxJQUFJLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxFQUFFLENBQUMsa0NBQWtDLENBQUM7eUdBQzlFLFdBQVcsQ0FBQywyRkFBMkYsQ0FBQzt5R0FDeEcsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTt3R0FDaEIsTUFBTSw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3R0FDeEMsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7d0dBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29HQUNsRCxDQUFDLENBQUMsQ0FBQztvR0FDTCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsa0NBQWtDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3R0FDekUsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLGlEQUFpRCxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7NEdBQ3pGLFNBQVM7aUhBQ04sSUFBSSxDQUFDLDJDQUEyQyxDQUFDO2lIQUNqRCxJQUFJLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxFQUFFLENBQUMsaURBQWlELENBQUM7aUhBQzlGLFdBQVcsQ0FBQywwRUFBMEUsQ0FBQztpSEFDdkYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtnSEFDaEIsTUFBTSwyQ0FBMkMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnSEFDdkQsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0hBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDOzRHQUNsRCxDQUFDLENBQUMsQ0FBQzs0R0FDTCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsaURBQWlELENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnSEFDeEYsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLHFDQUFxQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0hBQzdFLFNBQVM7eUhBQ04sSUFBSSxDQUFDLG1DQUFtQyxDQUFDO3lIQUN6QyxJQUFJLENBQUMsaURBQWlELENBQUMsQ0FBQyxFQUFFLENBQUMscUNBQXFDLENBQUM7eUhBQ2pHLFdBQVcsQ0FBQyx5RUFBeUUsQ0FBQzt5SEFDdEYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTt3SEFDaEIsTUFBTSw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3SEFDekMsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7d0hBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29IQUNsRCxDQUFDLENBQUMsQ0FBQztvSEFDTCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUscUNBQXFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3SEFDNUUsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLDJDQUEyQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7NEhBQ25GLFNBQVM7aUlBQ04sSUFBSSxDQUFDLHdDQUF3QyxDQUFDO2lJQUM5QyxJQUFJLENBQUMscUNBQXFDLENBQUMsQ0FBQyxFQUFFLENBQUMsMkNBQTJDLENBQUM7aUlBQzNGLFdBQVcsQ0FBQyx1SEFBdUgsQ0FBQztpSUFDcEksRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtnSUFDaEIsMkRBQTJEO2dJQUMzRCx5REFBeUQ7Z0lBQ3pELGdEQUFnRDtnSUFDaEQsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0lBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dJQUNoRCxNQUFNLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRIQUMvQyxDQUFDLENBQUMsQ0FBQzs0SEFDTCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsMkNBQTJDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnSUFDbEYsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0lBQ3hFLFNBQVM7eUlBQ04sSUFBSSxDQUFDLGdDQUFnQyxDQUFDO3lJQUN0QyxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxFQUFFLENBQUMsZ0NBQWdDLENBQUM7eUlBQ3RGLFdBQVcsQ0FBQyxvSUFBb0ksQ0FBQzt5SUFDakosRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTt3SUFDaEIsdURBQXVEO3dJQUN2RCx1REFBdUQ7d0lBQ3ZELHFEQUFxRDt3SUFDckQsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7d0lBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dJQUNoRCxNQUFNLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dJQUM3QyxNQUFNLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDO29JQUN4QyxDQUFDLENBQUMsQ0FBQztvSUFDTCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsZ0NBQWdDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3SUFDdkUsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7NElBQ3hFLFNBQVM7aUpBQ04sSUFBSSxDQUFDLGlDQUFpQyxDQUFDO2lKQUN2QyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxFQUFFLENBQUMsZ0NBQWdDLENBQUM7aUpBQzNFLFdBQVcsQ0FBQyxzRUFBc0UsQ0FBQztpSkFDbkYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtnSkFDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0pBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dKQUNoRCxNQUFNLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dKQUM3QyxNQUFNLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2dKQUN0QyxNQUFNLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxDQUFDOzRJQUMxQyxDQUFDLENBQUMsQ0FBQzs0SUFDTCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsZ0NBQWdDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnSkFDdkUsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLDBDQUEwQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0pBQ2xGLFNBQVM7eUpBQ04sSUFBSSxDQUFDLGdDQUFnQyxDQUFDO3lKQUN0QyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxFQUFFLENBQUMsMENBQTBDLENBQUM7eUpBQ3JGLFdBQVcsQ0FBQyw0RUFBNEUsQ0FBQzt5SkFDekYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTt3SkFDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7d0pBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dKQUNoRCxNQUFNLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dKQUM3QyxNQUFNLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDO3dKQUN0QyxNQUFNLGdDQUFnQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29KQUM5QyxDQUFDLENBQUMsQ0FBQztvSkFDTCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsMENBQTBDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3SkFDakYsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLDhDQUE4QyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7NEpBQ3RGLFNBQVM7aUtBQ04sSUFBSSxDQUFDLDRDQUE0QyxDQUFDO2lLQUNsRCxJQUFJLENBQUMsMENBQTBDLENBQUMsQ0FBQyxFQUFFLENBQUMsOENBQThDLENBQUM7aUtBQ25HLFdBQVcsQ0FBQyxxRkFBcUYsQ0FBQztpS0FDbEcsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtnS0FDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0tBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dLQUNoRCxNQUFNLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dLQUM3QyxNQUFNLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2dLQUN0QyxNQUFNLHNDQUFzQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRKQUNwRCxDQUFDLENBQUMsQ0FBQzs0SkFDTCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsOENBQThDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnS0FDckYsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLDBDQUEwQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0tBQ2xGLFNBQVM7eUtBQ04sSUFBSSxDQUFDLDJFQUEyRSxDQUFDO3lLQUNqRixJQUFJLENBQUMsOENBQThDLENBQUMsQ0FBQyxFQUFFLENBQUMseUNBQXlDLENBQUM7eUtBQ2xHLFdBQVcsQ0FBQyw0RUFBNEUsQ0FBQzt5S0FDekYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTt3S0FDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7d0tBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dLQUNoRCxNQUFNLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dLQUM3QyxNQUFNLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDO29LQUN4QyxDQUFDLENBQUM7eUtBQ0QsSUFBSSxDQUFDLHVDQUF1QyxDQUFDO3lLQUM3QyxJQUFJLENBQUMseUNBQXlDLENBQUMsQ0FBQyxFQUFFLENBQUMsMENBQTBDLENBQUM7eUtBQzlGLFdBQVcsQ0FBQyxrRkFBa0YsQ0FBQzt5S0FDL0YsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTt3S0FDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7d0tBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dLQUNoRCxNQUFNLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dLQUM3QyxNQUFNLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDO3dLQUN0QyxNQUFNLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29LQUMvQyxDQUFDLENBQUMsQ0FBQztvS0FDTCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsOENBQThDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzt3S0FDdEYsU0FBUzs2S0FDTixJQUFJLENBQUMsMENBQTBDLENBQUM7NktBQ2hELElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyw4Q0FBOEMsQ0FBQzs2S0FDbkcsV0FBVyxDQUFDLG1HQUFtRyxDQUFDOzZLQUNoSCxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFOzRLQUNoQixNQUFNLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzs0S0FDckQsTUFBTSwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7NEtBQ2hELE1BQU0saUNBQWlDLENBQUMsR0FBRyxDQUFDLENBQUM7NEtBQzdDLE1BQU0sMEJBQTBCLENBQUMsR0FBRyxDQUFDLENBQUM7NEtBQ3RDLE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLG1DQUFtQyxDQUFDLENBQUM7d0tBQzlFLENBQUMsQ0FBQyxDQUFDO3dLQUNMLElBQUksYUFBYSxDQUFDLGFBQWEsRUFBRSw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDOzRLQUNyRSxTQUFTO2lMQUNOLElBQUksQ0FBQyxpREFBaUQsQ0FBQztpTEFDdkQsSUFBSSxDQUFDLDhDQUE4QyxDQUFDLENBQUMsRUFBRSxDQUFDLDZCQUE2QixDQUFDO2lMQUN0RixXQUFXLENBQUMsdUZBQXVGLENBQUM7aUxBQ3BHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0xBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dMQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztnTEFDaEQsTUFBTSxpQ0FBaUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnTEFDN0MsTUFBTSwwQkFBMEIsQ0FBQyxHQUFHLENBQUMsQ0FBQztnTEFDdEMsTUFBTSxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0S0FDbEMsQ0FBQyxDQUFDLENBQUM7d0tBQ1AsQ0FBQzs2S0FBTSxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsOENBQThDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs0S0FDNUYsU0FBUztpTEFDTixJQUFJLENBQUMsNERBQTRELENBQUM7aUxBQ2xFLElBQUksQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7aUxBQ3RFLFdBQVcsQ0FBQyw0RUFBNEUsQ0FBQztpTEFDekYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtnTEFDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0xBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dMQUNoRCxNQUFNLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dMQUM3QyxNQUFNLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDOzRLQUN4QyxDQUFDLENBQUMsQ0FBQzt3S0FDUCxDQUFDO29LQUNILENBQUM7eUtBQU0sSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLDBDQUEwQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0tBQ3hGLFNBQVM7NktBQ04sSUFBSSxDQUFDLHVEQUF1RCxDQUFDOzZLQUM3RCxJQUFJLENBQUMsMENBQTBDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDOzZLQUNsRSxXQUFXLENBQUMsNEVBQTRFLENBQUM7NktBQ3pGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7NEtBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDOzRLQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzs0S0FDaEQsTUFBTSxpQ0FBaUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0S0FDN0MsTUFBTSwwQkFBMEIsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3S0FDeEMsQ0FBQyxDQUFDLENBQUM7b0tBQ1AsQ0FBQztnS0FDSCxDQUFDO3FLQUFNLENBQUM7b0tBQ04sU0FBUzt5S0FDTixJQUFJLENBQUMsMkRBQTJELENBQUM7eUtBQ2pFLElBQUksQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7eUtBQ3RFLFdBQVcsQ0FBQyw0RUFBNEUsQ0FBQzt5S0FDekYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTt3S0FDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7d0tBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dLQUNoRCxNQUFNLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dLQUM3QyxNQUFNLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDO29LQUN4QyxDQUFDLENBQUMsQ0FBQztnS0FDUCxDQUFDOzRKQUNILENBQUM7d0pBQ0gsQ0FBQzs2SkFBTSxDQUFDOzRKQUNOLFNBQVM7aUtBQ04sSUFBSSxDQUFDLHdEQUF3RCxDQUFDO2lLQUM5RCxJQUFJLENBQUMsMENBQTBDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO2lLQUNsRSxXQUFXLENBQUMsNEVBQTRFLENBQUM7aUtBQ3pGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0tBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dLQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztnS0FDaEQsTUFBTSxpQ0FBaUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnS0FDN0MsTUFBTSwwQkFBMEIsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0SkFDeEMsQ0FBQyxDQUFDLENBQUM7d0pBQ1AsQ0FBQztvSkFDSCxDQUFDO2dKQUNILENBQUM7cUpBQU0sQ0FBQztvSkFDTixTQUFTO3lKQUNOLElBQUksQ0FBQyxrREFBa0QsQ0FBQzt5SkFDeEQsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQzt5SkFDeEQsV0FBVyxDQUFDLDRFQUE0RSxDQUFDO3lKQUN6RixFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO3dKQUNoQixNQUFNLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzt3SkFDckQsTUFBTSwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7d0pBQ2hELG9EQUFvRDt3SkFDcEQsa0RBQWtEO3dKQUNsRCx3Q0FBd0M7d0pBQ3hDLE1BQU0saUNBQWlDLENBQUMsR0FBRyxDQUFDLENBQUM7d0pBQzdDLE1BQU0sMEJBQTBCLENBQUMsR0FBRyxDQUFDLENBQUM7b0pBQ3hDLENBQUMsQ0FBQyxDQUFDO2dKQUNQLENBQUM7NElBQ0gsQ0FBQzt3SUFDSCxDQUFDOzZJQUFNLENBQUM7NElBQ04sU0FBUztpSkFDTixJQUFJLENBQUMsc0RBQXNELENBQUM7aUpBQzVELElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7aUpBQ3hELFdBQVcsQ0FBQyw0RUFBNEUsQ0FBQztpSkFDekYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtnSkFDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0pBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dKQUNoRCxNQUFNLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dKQUM3QyxNQUFNLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDOzRJQUN4QyxDQUFDLENBQUMsQ0FBQzt3SUFDUCxDQUFDO29JQUNILENBQUM7Z0lBQ0gsQ0FBQztxSUFBTSxDQUFDO29JQUNOLFNBQVM7eUlBQ04sSUFBSSxDQUFDLHNEQUFzRCxDQUFDO3lJQUM1RCxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO3lJQUNuRSxXQUFXLENBQUMsNEVBQTRFLENBQUM7eUlBQ3pGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7d0lBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dJQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzt3SUFDaEQsa0RBQWtEO3dJQUNsRCxxREFBcUQ7d0lBQ3JELHlEQUF5RDt3SUFDekQsTUFBTSxpQ0FBaUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvSUFDL0MsQ0FBQyxDQUFDLENBQUM7Z0lBQ1AsQ0FBQzs0SEFDSCxDQUFDO3dIQUNILENBQUM7NkhBQU0sQ0FBQzs0SEFDTixTQUFTO2lJQUNOLElBQUksQ0FBQyxrREFBa0QsQ0FBQztpSUFDeEQsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztpSUFDN0QsV0FBVyxDQUFDLDRFQUE0RSxDQUFDO2lJQUN6RixFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO2dJQUNoQixNQUFNLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztnSUFDckQsTUFBTSwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7NEhBQ2xELENBQUMsQ0FBQyxDQUFDO3dIQUNQLENBQUM7b0hBQ0gsQ0FBQztnSEFDSCxDQUFDO3FIQUFNLENBQUM7b0hBQ04sU0FBUzt5SEFDTixJQUFJLENBQUMsOERBQThELENBQUM7eUhBQ3BFLElBQUksQ0FBQyxpREFBaUQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7eUhBQ3pFLFdBQVcsQ0FBQyw0RUFBNEUsQ0FBQzt5SEFDekYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTt3SEFDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7d0hBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29IQUNsRCxDQUFDLENBQUMsQ0FBQztnSEFDUCxDQUFDOzRHQUNILENBQUM7d0dBQ0gsQ0FBQzs2R0FBTSxDQUFDOzRHQUNOLFNBQVM7aUhBQ04sSUFBSSxDQUFDLGdEQUFnRCxDQUFDO2lIQUN0RCxJQUFJLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO2lIQUMxRCxXQUFXLENBQUMsNEVBQTRFLENBQUM7aUhBQ3pGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0hBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dIQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzs0R0FDbEQsQ0FBQyxDQUFDLENBQUM7d0dBQ1AsQ0FBQztvR0FDSCxDQUFDO2dHQUNILENBQUM7cUdBQU0sSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0dBQzNFLFNBQVM7eUdBQ04sSUFBSSxDQUFDLGtEQUFrRCxDQUFDO3lHQUN4RCxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO3lHQUNyRCxXQUFXLENBQUMsNEVBQTRFLENBQUM7eUdBQ3pGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7d0dBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dHQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztvR0FDbEQsQ0FBQyxDQUFDLENBQUM7Z0dBQ1AsQ0FBQzs0RkFDSCxDQUFDO2lHQUFNLElBQUksYUFBYSxDQUFDLGFBQWEsRUFBRSxzQ0FBc0MsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dHQUNwRixTQUFTO3FHQUNOLElBQUksQ0FBQyxrREFBa0QsQ0FBQztxR0FDeEQsSUFBSSxDQUFDLHNDQUFzQyxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztxR0FDOUQsV0FBVyxDQUFDLDRFQUE0RSxDQUFDO3FHQUN6RixFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO29HQUNoQixNQUFNLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztvR0FDckQsTUFBTSwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0dBQ2xELENBQUMsQ0FBQyxDQUFDOzRGQUNQLENBQUM7d0ZBQ0gsQ0FBQzs2RkFBTSxDQUFDOzRGQUNOLFNBQVM7aUdBQ04sSUFBSSxDQUFDLDREQUE0RCxDQUFDO2lHQUNsRSxJQUFJLENBQUMsdUNBQXVDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO2lHQUMvRCxXQUFXLENBQUMsNEVBQTRFLENBQUM7aUdBQ3pGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0dBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dHQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzs0RkFDbEQsQ0FBQyxDQUFDLENBQUM7d0ZBQ1AsQ0FBQztvRkFDSCxDQUFDO2dGQUNILENBQUM7cUZBQU0sQ0FBQztvRkFDTixTQUFTO3lGQUNOLElBQUksQ0FBQyxzRUFBc0UsQ0FBQzt5RkFDNUUsSUFBSSxDQUFDLHVDQUF1QyxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQzt5RkFDL0QsV0FBVyxDQUFDLDRFQUE0RSxDQUFDO3lGQUN6RixFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO3dGQUNoQixNQUFNLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzt3RkFDckQsTUFBTSwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7b0ZBQ2xELENBQUMsQ0FBQyxDQUFDO2dGQUNQLENBQUM7NEVBQ0gsQ0FBQzt3RUFDSCxDQUFDOzZFQUFNLENBQUM7NEVBQ04sU0FBUztpRkFDTixJQUFJLENBQUMsaUVBQWlFLENBQUM7aUZBQ3ZFLElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7aUZBQ2xFLFdBQVcsQ0FBQyw0RUFBNEUsQ0FBQztpRkFDekYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtnRkFDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0ZBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDOzRFQUNsRCxDQUFDLENBQUMsQ0FBQzt3RUFDUCxDQUFDO29FQUNILENBQUM7Z0VBQ0gsQ0FBQztxRUFBTSxDQUFDO29FQUNOLFNBQVM7eUVBQ04sSUFBSSxDQUFDLDZEQUE2RCxDQUFDO3lFQUNuRSxJQUFJLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO3lFQUM5RCxXQUFXLENBQUMsNEVBQTRFLENBQUM7eUVBQ3pGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7d0VBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dFQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztvRUFDbEQsQ0FBQyxDQUFDLENBQUM7Z0VBQ1AsQ0FBQzs0REFDSCxDQUFDO3dEQUNILENBQUM7b0RBQ0gsQ0FBQzt5REFBTSxDQUFDO3dEQUNOLFNBQVM7NkRBQ04sSUFBSSxDQUFDLHNFQUFzRSxDQUFDOzZEQUM1RSxJQUFJLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDOzZEQUM5RCxXQUFXLENBQUMsNEVBQTRFLENBQUM7NkRBQ3pGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7NERBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDOzREQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzt3REFDbEQsQ0FBQyxDQUFDLENBQUM7b0RBQ1AsQ0FBQztnREFDSCxDQUFDOzRDQUNILENBQUM7aURBQU0sQ0FBQztnREFDTixTQUFTO3FEQUNOLElBQUksQ0FBQyw0REFBNEQsQ0FBQztxREFDbEUsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztxREFDckQsV0FBVyxDQUFDLDRFQUE0RSxDQUFDO3FEQUN6RixFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO29EQUNoQixNQUFNLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztvREFDckQsTUFBTSwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0RBQ2xELENBQUMsQ0FBQyxDQUFDOzRDQUNQLENBQUM7d0NBQ0gsQ0FBQztvQ0FDSCxDQUFDO3lDQUFNLENBQUM7d0NBQ04sU0FBUzs2Q0FDTixJQUFJLENBQUMseURBQXlELENBQUM7NkNBQy9ELElBQUksQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7NkNBQ25FLFdBQVcsQ0FBQyw0RUFBNEUsQ0FBQzs2Q0FDekYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTs0Q0FDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7NENBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dDQUNsRCxDQUFDLENBQUMsQ0FBQztvQ0FDUCxDQUFDO2dDQUNILENBQUM7NEJBQ0gsQ0FBQztpQ0FBTSxDQUFDO2dDQUNOLFNBQVM7cUNBQ04sSUFBSSxDQUFDLHNDQUFzQyxDQUFDO3FDQUM1QyxJQUFJLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO3FDQUM1RCxXQUFXLENBQUMsNEVBQTRFLENBQUM7cUNBQ3pGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7b0NBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29DQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztnQ0FDbEQsQ0FBQyxDQUFDLENBQUM7NEJBQ1AsQ0FBQzt3QkFDSCxDQUFDO29CQUNILENBQUM7eUJBQU0sQ0FBQzt3QkFDTixTQUFTOzZCQUNOLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQzs2QkFDNUMsSUFBSSxDQUFDLDhDQUE4QyxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQzs2QkFDdEUsV0FBVyxDQUFDLDRFQUE0RSxDQUFDOzZCQUN6RixFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFOzRCQUNoQixNQUFNLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzs0QkFDckQsTUFBTSwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7d0JBQ2xELENBQUMsQ0FBQyxDQUFDO29CQUNQLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixTQUFTO3FCQUNOLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQztxQkFDNUMsSUFBSSxDQUFDLDBDQUEwQyxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztxQkFDbEUsV0FBVyxDQUFDLDRFQUE0RSxDQUFDO3FCQUN6RixFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO29CQUNoQixNQUFNLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDckQsTUFBTSwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2xELENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO1NBQU0sSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLDRDQUE0QyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUYsU0FBUzthQUNOLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQzthQUM1QyxJQUFJLENBQUMsNENBQTRDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO2FBQ3BFLFdBQVcsQ0FBQyw0RUFBNEUsQ0FBQzthQUN6RixFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxNQUFNLG9DQUFvQyxHQUFHLFFBQVEsQ0FBQztBQUN0RCxNQUFNLG1EQUFtRCxHQUFHLFFBQVEsQ0FBQztBQUNyRSxNQUFNLDJDQUEyQyxHQUFHLFFBQVEsQ0FBQztBQUM3RCxNQUFNLDZCQUE2QixHQUFHLFFBQVEsQ0FBQztBQUMvQyxNQUFNLHFDQUFxQyxHQUFHLFFBQVEsQ0FBQztBQUN2RCxNQUFNLHNDQUFzQyxHQUFHLFFBQVEsQ0FBQztBQUN4RCxNQUFNLGlDQUFpQyxHQUFHLFFBQVEsQ0FBQztBQUNuRCxNQUFNLHNDQUFzQyxHQUFHLFFBQVEsQ0FBQztBQUN4RCxNQUFNLHlDQUF5QyxHQUFHLFFBQVEsQ0FBQztBQUMzRCxNQUFNLDBDQUEwQyxHQUFHLFFBQVEsQ0FBQztBQUM1RCxNQUFNLHNDQUFzQyxHQUFHLFFBQVEsQ0FBQztBQUN4RCxNQUFNLHVDQUF1QyxHQUFHLFFBQVEsQ0FBQztBQUN6RCxNQUFNLHVDQUF1QyxHQUFHLFFBQVEsQ0FBQztBQUN6RCxNQUFNLHFDQUFxQyxHQUFHLFFBQVEsQ0FBQztBQUN2RCxNQUFNLHNDQUFzQyxHQUFHLFFBQVEsQ0FBQztBQUN4RCxNQUFNLDRCQUE0QixHQUFHLHNDQUFzQyxDQUFDO0FBQzVFLE1BQU0sNkJBQTZCLEdBQUcsUUFBUSxDQUFDO0FBQy9DLE1BQU0saUNBQWlDLEdBQUcsNkJBQTZCLENBQUM7QUFDeEUsTUFBTSxrQ0FBa0MsR0FBRyxRQUFRLENBQUM7QUFDcEQsTUFBTSxpREFBaUQsR0FBRyxRQUFRLENBQUM7QUFDbkUsTUFBTSxxQ0FBcUMsR0FBRyxTQUFTLENBQUM7QUFDeEQsTUFBTSwyQ0FBMkMsR0FBRyxRQUFRLENBQUM7QUFDN0QsTUFBTSxnQ0FBZ0MsR0FBRyxRQUFRLENBQUM7QUFDbEQsTUFBTSxnQ0FBZ0MsR0FBRyxRQUFRLENBQUM7QUFDbEQsTUFBTSwwQ0FBMEMsR0FBRyxRQUFRLENBQUM7QUFDNUQsTUFBTSw4Q0FBOEMsR0FBRyxRQUFRLENBQUM7QUFDaEUsTUFBTSx5Q0FBeUMsR0FBRyxRQUFRLENBQUM7QUFDM0QsTUFBTSwwQ0FBMEMsR0FBRyxRQUFRLENBQUM7QUFDNUQsTUFBTSw4Q0FBOEMsR0FBRyxRQUFRLENBQUM7QUFDaEUsTUFBTSw2QkFBNkIsR0FBRyxRQUFRLENBQUM7QUFDL0MsTUFBTSx1Q0FBdUMsR0FBRyxFQUFFLENBQUM7QUFFbkQsTUFBTSxtQ0FBbUMsR0FBRyxtQ0FBbUMsQ0FBQztBQUNoRixNQUFNLCtCQUErQixHQUFHLHlDQUF5QyxDQUFDO0FBRWxGLFNBQVMsMkNBQTJDLENBQUMsV0FBZ0I7SUFDbkUsSUFBSSxDQUFDLFdBQVcsSUFBSSxPQUFPLFdBQVcsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQ2xGLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsK0JBQStCLENBQUM7UUFDNUMsaUJBQWlCLEVBQUUsV0FBVyxDQUFDLHNCQUFzQjtRQUNyRCxlQUFlLEVBQUUsV0FBVyxDQUFDLG9CQUFvQjtLQUNsRCxDQUFDLENBQUM7SUFDSCxNQUFNLE1BQU0sR0FBRywwQkFBMEIsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUQsTUFBTSxVQUFVLEdBQUcseUJBQXlCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzVELElBQUksV0FBVyxDQUFDLEVBQUUsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsMEJBQTBCLENBQUMsV0FBVyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN4RSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDdkQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4REFBOEQsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUNqRyxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFDRCxPQUFPO1FBQ0wsRUFBRSxFQUFFLFVBQVU7UUFDZCxzQkFBc0IsRUFBRSxLQUFLLENBQUMsaUJBQWlCO1FBQy9DLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxlQUFlO1FBQzNDLE1BQU07UUFDTixVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVU7UUFDaEMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxTQUFTO1FBQ2hDLFNBQVMsRUFBRSxXQUFXLENBQUMsU0FBUztLQUNqQyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsZ0NBQWdDLENBQUMsV0FBZ0I7SUFDeEQsTUFBTSxVQUFVLEdBQUcsc0JBQXNCLENBQUMsbUNBQW1DLENBQUMsQ0FBQztJQUMvRSxJQUNFLFdBQVcsQ0FBQyxHQUFHLEtBQUssVUFBVTtXQUMzQixXQUFXLENBQUMsRUFBRSxLQUFLLFVBQVU7V0FDN0IsV0FBVyxDQUFDLEdBQUcsS0FBSyxtQ0FBbUM7V0FDdkQsT0FBTyxXQUFXLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFDeEMsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBQ0QsSUFBSSxNQUFXLENBQUM7SUFDaEIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFBQyxPQUFPLEtBQWMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW9ELEtBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDekMsSUFDRSxDQUFDLE1BQU07V0FDSixPQUFPLE1BQU0sS0FBSyxRQUFRO1dBQzFCLE1BQU0sQ0FBQyxPQUFPLEtBQUssQ0FBQztXQUNwQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUNwQyxDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxnRkFBZ0YsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUM7QUFDM0IsQ0FBQztBQUVELEtBQUssVUFBVSxpQ0FBaUMsQ0FBQyxHQUdoRDtJQUNDLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN0RSxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDdkUsTUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUMsbUNBQW1DLENBQUMsQ0FBQztJQUM3RSxNQUFNLGNBQWMsR0FBRyxNQUFNLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sYUFBYSxHQUFHLGNBQWM7UUFDbEMsQ0FBQyxDQUFDLDBCQUEwQixDQUFDLGdDQUFnQyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzlFLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDUCxNQUFNLGdCQUFnQixHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEQsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFO1FBQ2Ysc0JBQXNCLEVBQUUsUUFBUSxDQUFDLGlCQUFpQjtRQUNsRCxvQkFBb0IsRUFBRSxRQUFRLENBQUMsZUFBZTtRQUM5QyxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07UUFDdkIsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO1FBQy9CLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2RixTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDeEYsQ0FBQyxDQUFDLENBQUM7SUFDSixNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEcsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNwRSxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztJQUM1RCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ3hDLEtBQUssTUFBTSxnQkFBZ0IsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1FBQ2pELE1BQU0sVUFBVSxHQUFHLDJDQUEyQyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDakYsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNsQyxVQUFVLENBQUMsc0JBQXNCO1lBQ2pDLFVBQVUsQ0FBQyxvQkFBb0I7WUFDL0IsVUFBVSxDQUFDLE1BQU07U0FDbEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDdkUsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUNELGFBQWEsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ25CLEtBQUssTUFBTSxnQkFBZ0IsSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUNyRCxNQUFNLGVBQWUsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdELElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztnQkFDN0YsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNsRyxDQUFDO1FBQ0gsQ0FBQztRQUNELEtBQUssTUFBTSxlQUFlLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDMUMsTUFBTSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDcEQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNyRSxNQUFNLG1CQUFtQixHQUFHLGtCQUFrQjtTQUMzQyxHQUFHLENBQUMsQ0FBQyxXQUFnQixFQUFFLEVBQUUsQ0FBQywyQ0FBMkMsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUNuRixJQUFJLENBQUMsQ0FBQyxPQUFZLEVBQUUsUUFBYSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRixNQUFNLGlCQUFpQixHQUFHLGNBQWM7UUFDdEMsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxRixDQUFDLENBQUMsbUJBQW1CLENBQUM7SUFDeEIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7UUFDOUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxNQUFNLGdCQUFnQixDQUFDLFdBQVcsQ0FDaEM7UUFDRSxzQkFBc0IsRUFBRSxDQUFDO1FBQ3pCLG9CQUFvQixFQUFFLENBQUM7UUFDdkIsTUFBTSxFQUFFLENBQUM7S0FDVixFQUNEO1FBQ0UsSUFBSSxFQUFFLCtCQUErQjtRQUNyQyxNQUFNLEVBQUUsSUFBSTtLQUNiLENBQ0YsQ0FBQztJQUNGLE1BQU0sT0FBTyxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDL0QsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSywrQkFBK0IsQ0FBQyxDQUFDO0lBQ3RHLElBQ0UsQ0FBQyxVQUFVO1dBQ1IsVUFBVSxDQUFDLE1BQU0sS0FBSyxJQUFJO1dBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDbkQsc0JBQXNCLEVBQUUsQ0FBQztZQUN6QixvQkFBb0IsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sRUFBRSxDQUFDO1NBQ1YsQ0FBQyxFQUNGLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVELElBQUksY0FBYyxFQUFFLENBQUM7UUFDbkIsTUFBTSxPQUFPLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxTQUFTLENBQUM7WUFDaEQsR0FBRyxFQUFFLFFBQVE7WUFDYixFQUFFLEVBQUUsUUFBUTtZQUNaLEdBQUcsRUFBRSxtQ0FBbUM7WUFDeEMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxLQUFLO1NBQzVCLENBQUMsQ0FBQztRQUNILElBQUksT0FBTyxDQUFDLFlBQVksS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7UUFDckYsQ0FBQztJQUNILENBQUM7SUFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDVCxNQUFNLEVBQ04sbURBQW1ELG1CQUFtQixDQUFDLE1BQU0sMkJBQTJCLENBQ3pHLENBQUM7QUFDSixDQUFDO0FBRUQsS0FBSyxVQUFVLHNDQUFzQyxDQUFDLEdBR3JEO0lBQ0MsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDeEQsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FDNUI7UUFDRSxTQUFTLEVBQUUsU0FBUztRQUNwQixzQkFBc0IsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRTtLQUNyRCxFQUNELEVBQUUsVUFBVSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxzQkFBc0IsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FDakYsQ0FBQztJQUNGLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNsQixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDbkIsTUFBTSxVQUFVLEdBQVUsRUFBRSxDQUFDO0lBQzdCLE1BQU0sS0FBSyxHQUFHLEtBQUssSUFBbUIsRUFBRTtRQUN0QyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU87UUFDcEMsTUFBTSxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzFGLENBQUMsQ0FBQztJQUNGLElBQUksQ0FBQztRQUNILElBQUksS0FBSyxFQUFFLE1BQU0sUUFBUSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ3BDLFNBQVMsRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDO2dCQUNILE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLENBQUM7Z0JBQ3BFLE1BQU0sVUFBVSxHQUFHLHlCQUF5QixDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsV0FBVztvQkFDeEMsQ0FBQyxDQUFDLFVBQVU7b0JBQ1osQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7Z0JBQ3RCLE1BQU0sU0FBUyxHQUE0QjtvQkFDekMsMEJBQTBCLEVBQUUsV0FBVztpQkFDeEMsQ0FBQztnQkFDRixNQUFNLE1BQU0sR0FBNEIsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7Z0JBQzVELElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDbEMsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7b0JBQzlCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUM7Z0JBQ3BDLENBQUM7Z0JBQ0QsVUFBVSxDQUFDLElBQUksQ0FBQztvQkFDZCxTQUFTLEVBQUU7d0JBQ1QsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUU7d0JBQzdCLE1BQU07cUJBQ1A7aUJBQ0YsQ0FBQyxDQUFDO2dCQUNILFVBQVUsRUFBRSxDQUFDO1lBQ2YsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssU0FBUztvQkFDM0MsQ0FBQyxDQUFDO3dCQUNFLFNBQVMsRUFBRTs0QkFDVCxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRTs0QkFDN0IsTUFBTSxFQUFFO2dDQUNOLElBQUksRUFBRTtvQ0FDSixNQUFNLEVBQUUsVUFBVTtvQ0FDbEIsMEJBQTBCLEVBQUUsU0FBUztpQ0FDdEM7Z0NBQ0QsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTs2QkFDMUI7eUJBQ0Y7cUJBQ0Y7b0JBQ0gsQ0FBQyxDQUFDO3dCQUNFLFNBQVMsRUFBRTs0QkFDVCxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRTs0QkFDN0IsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsMEJBQTBCLEVBQUUsRUFBRSxFQUFFLEVBQUU7eUJBQ3ZEO3FCQUNGLENBQUMsQ0FBQztZQUNULENBQUM7WUFDRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLElBQUksR0FBRztnQkFBRSxNQUFNLEtBQUssRUFBRSxDQUFDO1FBQzlDLENBQUM7UUFDRCxNQUFNLEtBQUssRUFBRSxDQUFDO0lBQ2hCLENBQUM7WUFBUyxDQUFDO1FBQ1QsTUFBTSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUNELE1BQU0sVUFBVSxDQUFDLFdBQVcsQ0FDMUIsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLDBCQUEwQixFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFDL0QsRUFBRSxJQUFJLEVBQUUsd0RBQXdELEVBQUUsQ0FDbkUsQ0FBQztJQUNGLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSwwREFBMEQsVUFBVSxJQUFJLFNBQVMsNEJBQTRCLENBQUMsQ0FBQztBQUNySSxDQUFDO0FBRUQsS0FBSyxVQUFVLGdDQUFnQyxDQUFDLEdBRy9DO0lBQ0MsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDeEQsTUFBTSxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDMUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLHNFQUFzRSxDQUFDLENBQUM7QUFDOUYsQ0FBQztBQUVELEtBQUssVUFBVSw0QkFBNEIsQ0FBQyxHQUczQztJQUNDLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUM3RSxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFFM0UsTUFBTSxvQkFBb0IsQ0FBQyxhQUFhLENBQUM7UUFDdkM7WUFDRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ2QsSUFBSSxFQUFFLGdDQUFnQztZQUN0QyxNQUFNLEVBQUUsSUFBSTtTQUNiO1FBQ0Q7WUFDRSxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUU7WUFDdEIsSUFBSSxFQUFFLGdDQUFnQztTQUN2QztRQUNEO1lBQ0UsR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUU7WUFDbEMsSUFBSSxFQUFFLHdDQUF3QztTQUMvQztLQUNGLENBQUMsQ0FBQztJQUNILE1BQU0sbUJBQW1CLENBQUMsYUFBYSxDQUFDO1FBQ3RDO1lBQ0UsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNkLElBQUksRUFBRSxnQ0FBZ0M7WUFDdEMsTUFBTSxFQUFFLElBQUk7U0FDYjtRQUNEO1lBQ0UsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRTtZQUN2QixJQUFJLEVBQUUsbUNBQW1DO1lBQ3pDLE1BQU0sRUFBRSxJQUFJO1NBQ2I7S0FDRixDQUFDLENBQUM7SUFFSCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDVCxNQUFNLEVBQ04sbUZBQW1GLENBQ3BGLENBQUM7QUFDSixDQUFDO0FBZ0JELEtBQUssVUFBVSxXQUFXLENBQUMsVUFBa0I7SUFDM0MsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7UUFDeEIsSUFBSyxLQUErQixDQUFDLElBQUksS0FBSyxRQUFRO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDcEUsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMseUJBQXlCLENBQUMsUUFBZ0IsRUFBRSxVQUFrQjtJQUNyRSxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEQsSUFDRSxjQUFjLEtBQUssWUFBWTtXQUM1QixDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsR0FBRyxZQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQy9ELENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7QUFDSCxDQUFDO0FBRUQsS0FBSyxVQUFVLDBCQUEwQixDQUN2QyxRQUFnQixFQUNoQixZQUFvQixFQUNwQixTQUFrQixFQUNsQixPQUFtQztJQUVuQyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUM1RCx5QkFBeUIsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDaEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDM0MsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPO0lBQ2xCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEQsS0FBSyxNQUFNLEtBQUssSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNwQyxNQUFNLDBCQUEwQixDQUM5QixRQUFRLEVBQ1IsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLEVBQ2xDLElBQUksRUFDSixPQUFPLENBQ1IsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPO0lBQ1QsQ0FBQztJQUNELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRywyQkFBMkIsQ0FDNUMsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FDakQsQ0FBQztJQUNGLE1BQU0sU0FBUyxHQUFHLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZELElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FDYix3QkFBd0IsVUFBVSxZQUFZLFNBQVMsQ0FBQyxRQUFRLFFBQVEsQ0FDekUsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkQsSUFBSSxLQUFhLENBQUM7SUFDbEIsSUFBSSxDQUFDO1FBQ0gsS0FBSyxHQUFHLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBQ0QseUJBQXlCLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDWCxHQUFHLEVBQUUsVUFBVTtRQUNmLEtBQUs7UUFDTCxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFO0tBQ3ZFLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLCtCQUErQixDQUFDLFFBQWE7SUFDcEQsTUFBTSxhQUFhLEdBQUcsMkJBQTJCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sVUFBVSxHQUFHLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3pELElBQ0UsUUFBUSxDQUFDLEdBQUcsS0FBSyxVQUFVO1dBQ3hCLFFBQVEsQ0FBQyxFQUFFLEtBQUssVUFBVTtXQUMxQixRQUFRLENBQUMsR0FBRyxLQUFLLGFBQWE7V0FDOUIsT0FBTyxRQUFRLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFDckMsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsNERBQTRELFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzlGLENBQUM7SUFDRCx5QkFBeUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FDdkIsTUFBYyxFQUNkLFFBQWdCLEVBQ2hCLGFBQXFCLEVBQ3JCLFlBQW9CO0lBRXBCLElBQUksVUFBZ0MsQ0FBQztJQUNyQyxJQUFJLFNBQStCLENBQUM7SUFDcEMsSUFBSSxDQUFDO1FBQ0gsVUFBVSxHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN4RCxTQUFTLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztRQUN4QixNQUFNLElBQUksS0FBSyxDQUNiLHdCQUF3QixRQUFRLGVBQWUsTUFBTSxLQUFNLEtBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FDckYsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3hFLElBQUksRUFBRSxNQUFNO1FBQ1osTUFBTSxFQUFFLEtBQUs7S0FDZCxDQUFDLENBQUM7SUFDSCxNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQ3ZDLElBQUksRUFBRSxNQUFNO1FBQ1osTUFBTSxFQUFFLEtBQUs7S0FDZCxDQUFDLENBQUM7SUFDSCxJQUNFLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxlQUFlLENBQUMsTUFBTTtXQUMvQyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLEVBQUUsZUFBZSxDQUFDLEVBQ2pFLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxRQUFRLGVBQWUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLG9CQUFvQixFQUFFLGFBQWEsQ0FBQztJQUNsRSxPQUFPO1FBQ0wsTUFBTTtRQUNOLFFBQVE7UUFDUixTQUFTLEVBQUUsZUFBZSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDN0MsT0FBTyxFQUFFLFVBQVUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0tBQ2pGLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxnQkFBdUI7SUFDL0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBS25CLENBQUM7SUFFTCxLQUFLLE1BQU0sUUFBUSxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDeEMsK0JBQStCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pELElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLE9BQU8sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTTtZQUFFLFNBQVM7UUFFaEUsSUFBSSxNQUFjLENBQUM7UUFDbkIsSUFBSSxRQUFnQixDQUFDO1FBQ3JCLElBQUksUUFBZ0IsQ0FBQztRQUNyQixJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUIsQ0FBQyxFQUFFLEFBQUQsRUFBRyxNQUFNLEVBQUUsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDO1lBQ2xDLFFBQVEsR0FBRyxTQUFTLENBQUM7UUFDdkIsQ0FBQzthQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxDQUFDLEVBQUUsQUFBRCxFQUFHLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQzlDLENBQUM7YUFBTSxDQUFDO1lBQ04sU0FBUztRQUNYLENBQUM7UUFDRCxJQUFJLFFBQVEsS0FBSyxhQUFhLElBQUksUUFBUSxLQUFLLFlBQVk7WUFBRSxTQUFTO1FBRXRFLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN6QyxNQUFNLFFBQVEsR0FBRyxHQUFHLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMxQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDO1FBQzVELElBQUksUUFBUSxLQUFLLGFBQWE7WUFBRSxLQUFLLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDbEUsSUFBSSxRQUFRLEtBQUssWUFBWTtZQUFFLEtBQUssQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUNoRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQXlCLEVBQUUsQ0FBQztJQUN2QyxLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzFDLE1BQU0sSUFBSSxLQUFLLENBQ2IsK0JBQStCLEtBQUssQ0FBQyxRQUFRLGVBQWUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUMzRSxDQUFDO1FBQ0osQ0FBQztRQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQ3pCLEtBQUssQ0FBQyxNQUFNLEVBQ1osS0FBSyxDQUFDLFFBQVEsRUFDZCxLQUFLLENBQUMsVUFBVSxFQUNoQixLQUFLLENBQUMsU0FBUyxDQUNoQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsS0FBSyxVQUFVLDJCQUEyQixDQUFDLEdBRzFDLEVBQUUsU0FHb0M7SUFDckMsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDekQsSUFBSSxPQUFPLFVBQVUsQ0FBQyxTQUFTLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDO1lBQ0gsTUFBTSxVQUFVLENBQUMsU0FBUyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7WUFDeEIsTUFBTSxPQUFPLEdBQUksS0FBZSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDL0MsTUFBTSxJQUFJLEdBQUksS0FBMkIsQ0FBQyxJQUFJLENBQUM7WUFDL0MsSUFBSSxJQUFJLEtBQUssRUFBRSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztnQkFBRSxNQUFNLEtBQUssQ0FBQztRQUM3RSxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztJQUNoQixNQUFNLE9BQU8sR0FBRyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDcEQsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM3QixJQUNFLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUM7ZUFDN0QsT0FBTyxNQUFNLENBQUMsZ0JBQWdCLEtBQUssUUFBUSxFQUM5QyxDQUFDO1lBQ0QsTUFBTSxVQUFVLENBQUMsU0FBUyxDQUN4QixFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQ25CLEVBQUUsTUFBTSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FDckMsQ0FBQztZQUNGLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLFVBQVUsQ0FBQyxXQUFXLENBQzFCLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLEVBQ3ZCO1FBQ0UsSUFBSSxFQUFFLDJCQUEyQjtRQUNqQyxNQUFNLEVBQUUsSUFBSTtRQUNaLE1BQU0sRUFBRSxJQUFJO0tBQ2IsQ0FDRixDQUFDO0lBQ0YsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQ1QsTUFBTSxFQUNOLEdBQUcsU0FBUyxpREFBaUQsT0FBTyxvQkFBb0IsQ0FDekYsQ0FBQztBQUNKLENBQUM7QUFFRCxLQUFLLFVBQVUsNkJBQTZCLENBQzFDLEdBR0MsRUFDRCxPQUFrQztJQUVsQyxNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDdEUsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLHlCQUF5QixDQUFDO0lBQ3JELElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztJQUNqQixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFFakIsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNmLE1BQU0sUUFBUSxHQUFHLE1BQU0sV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLElBQUksUUFBUSxFQUFFLGNBQWMsRUFBRSxFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyw2REFBNkQsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUM3RixDQUFDO1FBQ0QsSUFBSSxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBK0IsRUFBRSxDQUFDO1FBQ3JELEtBQUssTUFBTSxZQUFZLElBQUk7WUFDekIsWUFBWTtZQUNaLFdBQVc7WUFDWCxlQUFlO1lBQ2YsaUJBQWlCO1lBQ2pCLFVBQVU7U0FDWCxFQUFFLENBQUM7WUFDRixNQUFNLDBCQUEwQixDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2xGLENBQUM7UUFDRCxLQUFLLE1BQU0sWUFBWSxJQUFJO1lBQ3pCLDBCQUEwQjtZQUMxQixrQ0FBa0M7U0FDbkMsRUFBRSxDQUFDO1lBQ0YsTUFBTSwwQkFBMEIsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNuRixDQUFDO1FBRUQsS0FBSyxNQUFNLEtBQUssSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQyxNQUFNLEVBQUUsR0FBRyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM1RCxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLCtCQUErQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN4QyxJQUFJLE1BQU0sQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDN0QsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQ3ZFLENBQUM7Z0JBQ0QsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsU0FBUztZQUNYLENBQUM7WUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLE1BQU0saUJBQWlCLENBQUMsU0FBUyxDQUFDO2dCQUNoQyxHQUFHLEVBQUUsRUFBRTtnQkFDUCxFQUFFO2dCQUNGLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztnQkFDZCxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7Z0JBQ2xCLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztnQkFDMUIsU0FBUyxFQUFFLEdBQUc7YUFDZixDQUFDLENBQUM7WUFDSCxRQUFRLEVBQUUsQ0FBQztRQUNiLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxhQUFhLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7UUFDakQsR0FBRyxFQUFFO1lBQ0gsSUFBSSxFQUFFLGNBQWM7WUFDcEIsR0FBRyxFQUFFLG9CQUFvQjtTQUMxQjtLQUNGLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNiLE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2xELE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxDQUMzQixTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FDcEUsQ0FBQztJQUVGLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDaEUsTUFBTSxZQUFZLEdBQUcsTUFBTSxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzlELElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQztJQUN4QixLQUFLLE1BQU0sV0FBVyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JFLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFFBQVEsSUFBSSxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN0RixNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLElBQUk7WUFBRSxTQUFTO1FBRXBCLE1BQU0sUUFBUSxHQUE0QixFQUFFLENBQUM7UUFDN0MsSUFBSSxPQUFPLFdBQVcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxLQUFLLFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7WUFDMUYsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUM1QixRQUFRLENBQUMsVUFBVSxHQUFHO2dCQUNwQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ3ZCLE9BQU8sRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTztnQkFDMUQsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUN6QixTQUFTLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUNyRSxDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQztZQUM1RSxDQUFDLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNO1lBQ25DLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksS0FBSyxzQkFBc0IsQ0FBQyxFQUFFLENBQUM7WUFDdEYsUUFBUSxDQUFDLGNBQWMsR0FBRztnQkFDeEIsR0FBRyxXQUFXLENBQUMsY0FBYztnQkFDN0IsZUFBZSxFQUFFLFNBQVM7Z0JBQzFCLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLGlCQUFpQixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ2pGLE1BQU0sRUFBRSxvQkFBb0IsQ0FBQyxNQUFNLENBQ2pDLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxLQUFLLHNCQUFzQixDQUN2RDtnQkFDRCxPQUFPLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7YUFDbEMsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sZUFBZSxDQUFDLFNBQVMsQ0FDN0IsRUFBRSxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUcsRUFBRSxFQUN4QixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FDbkIsQ0FBQztZQUNGLGVBQWUsRUFBRSxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztJQUNuRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDVCxNQUFNLEVBQ04sc0NBQXNDLFFBQVEscUJBQXFCLFFBQVEsZUFBZSxTQUFTLENBQUMsTUFBTSwyQkFBMkIsZUFBZSxZQUFZLENBQ2pLLENBQUM7QUFDSixDQUFDO0FBRUQsS0FBSyxVQUFVLHdCQUF3QixDQUFDLEdBR3ZDO0lBQ0MsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNoRSxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsS0FBTSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM1RCxNQUFNLFNBQVMsR0FBRyxNQUFNLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQWlCLENBQUM7SUFFMUMsS0FBSyxNQUFNLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUM1QixNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxnQkFBZ0I7WUFBRSxTQUFTO1FBQ2hDLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sZUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDMUYsR0FBRyxDQUFDLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNuRCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLFFBQVEsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELElBQUksdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsS0FBSyxNQUFNLFNBQVMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdEMsTUFBTSxLQUFLLEdBQTRCLEVBQUUsQ0FBQztZQUMxQyxLQUFLLE1BQU0sS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFLGVBQWUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BELElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLFNBQVMsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3BFLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2hDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3JDLENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsTUFBTSxlQUFlLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzFFLENBQUM7WUFDRCxNQUFNLGVBQWUsQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDeEQsdUJBQXVCLEVBQUUsQ0FBQztRQUM1QixDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDakMsTUFBTSxTQUFTLEdBQUcsT0FBTyxJQUFJLENBQUMsU0FBUyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2xGLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckMsTUFBTSxRQUFRLEdBQTRCLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDO1lBQ2xELFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM3QixRQUFRLENBQUMsY0FBYyxHQUFHO2dCQUN4QixlQUFlLEVBQUUsU0FBUztnQkFDMUIsaUJBQWlCLEVBQUUsQ0FBQztnQkFDcEIsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsTUFBTSxFQUFFLENBQUM7d0JBQ1AsSUFBSSxFQUFFLG1DQUFtQzt3QkFDekMsT0FBTyxFQUFFLDZGQUE2Rjt3QkFDdEcsU0FBUyxFQUFFLElBQUk7cUJBQ2hCLENBQUM7Z0JBQ0YsVUFBVSxFQUFFO29CQUNWLG1CQUFtQixFQUFFLGFBQWE7b0JBQ2xDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGFBQWE7aUJBQ2xGO2dCQUNELE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFO2FBQ3RELENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxTQUFTLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdEMsUUFBUSxDQUFDLFVBQVUsR0FBRztnQkFDcEIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBQztnQkFDNUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSTtnQkFDckMsU0FBUztnQkFDVCxTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLElBQUksR0FBRyxDQUFDO2FBQzdDLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxNQUFNLGVBQWUsQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDN0UsQ0FBQztRQUNELFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsTUFBTSxlQUFlLENBQUMsV0FBVyxDQUMvQixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFDYixFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQzlDLENBQUM7SUFFRixNQUFNLGVBQWUsR0FBRyxDQUFDLE1BQU0sZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBVSxDQUFDO0lBQzVFLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDdEMsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLElBQUksS0FBSyxFQUFFLE1BQU0sTUFBTSxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUM7UUFDNUMsZ0JBQWdCLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFO1FBQ3BDLFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixFQUFFLHNCQUFzQixDQUFDLEVBQUU7S0FDL0QsQ0FBQyxFQUFFLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUUsTUFBYyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNoRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUUsTUFBYyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM5RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUUsTUFBYyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6RCxJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFFMUIsSUFBSyxNQUFjLENBQUMsU0FBUyxLQUFLLGdCQUFnQixJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ25GLGNBQWMsR0FBRyxtQkFBbUIsSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3BELGdCQUFnQixHQUFHLHdCQUF3QixJQUFJLElBQUksSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3JFLENBQUM7YUFBTSxJQUFLLE1BQWMsQ0FBQyxTQUFTLEtBQUssc0JBQXNCLEVBQUUsQ0FBQztZQUNoRSxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2xELElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsS0FBSyxNQUFNLENBQUUsTUFBYyxDQUFDLFFBQVEsQ0FBQztvQkFBRSxPQUFPLEtBQUssQ0FBQztnQkFDcEYsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3hELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFFBQVEsSUFBSSxTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDekUsT0FBTyxJQUFJLEtBQUssTUFBTTt1QkFDakIsSUFBSSxLQUFLLFVBQVUsTUFBTSxFQUFFO3VCQUMzQixJQUFJLEtBQUssR0FBRyxRQUFRLGVBQWUsTUFBTSxFQUFFO3VCQUMzQyxJQUFJLEtBQUssTUFBTSxNQUFNLEVBQUUsQ0FBQztZQUMvQixDQUFDLENBQUMsQ0FBQztZQUNILElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsY0FBYyxHQUFHLFVBQVUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM5QyxnQkFBZ0IsR0FBRyxlQUFlLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNoRixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztZQUMzRCxTQUFTO1FBQ1gsQ0FBQztRQUNELFdBQVcsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNsQyxNQUFNLGFBQWEsQ0FBQyxTQUFTLENBQzNCLEVBQUUsR0FBRyxFQUFHLE1BQWMsQ0FBQyxHQUFHLEVBQUUsRUFDNUIsRUFBRSxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUscUJBQXFCLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLEVBQUUsQ0FDakYsQ0FBQztRQUNGLGNBQWMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQzlELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUNULE1BQU0sRUFDTixnQ0FBZ0MsdUJBQXVCLGlDQUFpQyxjQUFjLCtCQUErQixDQUN0SSxDQUFDO0FBQ0osQ0FBQztBQUVELEtBQUssVUFBVSxzQkFBc0IsQ0FBQyxHQUdyQztJQUNDLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sSUFBSSxHQUFHLE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqRCxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBZSxDQUFDO0lBQ3BDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztJQUNoQixNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7UUFDekIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbEQsSUFBSSxDQUFDLElBQUk7WUFBRSxTQUFTO1FBQ3BCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ25CLE1BQU0sVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUM3QyxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsdUNBQXVDLE9BQU8sMEJBQTBCLENBQUMsQ0FBQztBQUNoRyxDQUFDO0FBRUQsS0FBSyxVQUFVLGlDQUFpQyxDQUFDLEdBR2hEO0lBQ0MsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNoRSxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzVELE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzVELE1BQU0sT0FBTyxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzFELE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxDQUM3QixPQUFPO1NBQ0osTUFBTSxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxLQUFLLFVBQVUsQ0FBQztTQUN0RCxHQUFHLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7U0FDM0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUNuQixDQUFDO0lBQ0YsTUFBTSxPQUFPLEdBQUcsTUFBTSxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3ZELE1BQU0sZUFBZSxHQUFVLEVBQUUsQ0FBQztJQUNsQyxJQUFJLHFCQUFxQixHQUFHLENBQUMsQ0FBQztJQUM5QixJQUFJLDJCQUEyQixHQUFHLENBQUMsQ0FBQztJQUNwQyxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzdCLElBQUksT0FBTyxNQUFNLENBQUMsZ0JBQWdCLEtBQUssUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7WUFDbkYsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsR0FBRyxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsR0FBRyxLQUFLLElBQUk7Z0JBQ3RFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUNyQixDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsRUFBRSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRTtvQkFDakQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUU7b0JBQ25CLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDaEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUVBQWlFLENBQUMsQ0FBQztZQUNyRixDQUFDO1lBRUQsSUFDRSxNQUFNLENBQUMsTUFBTSxLQUFLLFFBQVE7bUJBQ3ZCLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsRUFDckQsQ0FBQztnQkFDRCxNQUFNLE1BQU0sR0FBRyxNQUFNLGFBQWEsQ0FBQyxTQUFTLENBQUM7b0JBQzNDLEdBQUcsZ0JBQWdCO29CQUNuQixNQUFNLEVBQUUsUUFBUTtvQkFDaEIsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtpQkFDMUMsQ0FBQyxDQUFDO2dCQUNILDJCQUEyQixJQUFJLE1BQU0sQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDO2dCQUN4RCxTQUFTO1lBQ1gsQ0FBQztZQUVELE1BQU0sYUFBYSxDQUFDLFNBQVMsQ0FDM0IsRUFBRSxHQUFHLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxFQUNsRSxFQUFFLE1BQU0sRUFBRSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxFQUFFLENBQ3JDLENBQUM7WUFDRixPQUFPLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztZQUMvQixxQkFBcUIsRUFBRSxDQUFDO1FBQzFCLENBQUM7UUFDRCxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQztJQUMxQixJQUFJLG1DQUFtQyxHQUFHLENBQUMsQ0FBQztJQUM1QyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQzdELE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7UUFDNUMsTUFBTSxjQUFjLEdBQUcsY0FBYyxFQUFFLGNBQWMsQ0FBQztRQUN0RCxNQUFNLGlCQUFpQixHQUFHLGNBQWMsRUFBRSxpQkFBaUIsQ0FBQztRQUM1RCxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxHQUFHLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssSUFBSTtZQUNwRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRTtZQUNwQixDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsRUFBRSxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRTtnQkFDL0MsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xCLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDaEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxJQUNFLGNBQWMsRUFBRSxlQUFlLEtBQUssUUFBUTtlQUN6QyxjQUFjO2VBQ2QsT0FBTyxjQUFjLEtBQUssUUFBUTtlQUNsQyxNQUFNLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDO2VBQ25DLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxZQUFZLENBQUMsRUFDdEUsQ0FBQztZQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sZUFBZSxDQUFDLFNBQVMsQ0FDNUM7Z0JBQ0UsR0FBRyxnQkFBZ0I7Z0JBQ25CLGdDQUFnQyxFQUFFLFFBQVE7Z0JBQzFDLGtDQUFrQyxFQUFFLGlCQUFpQjtnQkFDckQsK0JBQStCLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFO2dCQUNsRCwwQ0FBMEMsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7YUFDL0QsRUFDRCxFQUFFLElBQUksRUFBRSxFQUFFLDBDQUEwQyxFQUFFLGlCQUFpQixFQUFFLEVBQUUsQ0FDNUUsQ0FBQztZQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNwQyxjQUFjLENBQUMsVUFBVSxHQUFHLGlCQUFpQixDQUFDO2dCQUM5QyxtQ0FBbUMsRUFBRSxDQUFDO1lBQ3hDLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsZUFBZSxDQUFDO1lBQUUsU0FBUztRQUNuRSxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ3JDLElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDNUQsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUNELEtBQUssTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQztZQUMvRCxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPO1lBQzlCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNQLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7Z0JBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsVUFBVSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDaEUsS0FBSyxNQUFNLE1BQU0sSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNyQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM3QyxJQUNFLE1BQU0sQ0FBQyxTQUFTLEtBQUsscUJBQXFCO21CQUN2QyxNQUFNLENBQUMsY0FBYyxLQUFLLE9BQU87bUJBQ2pDLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO2dCQUM5QixVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFDRCxNQUFNLGVBQWUsQ0FBQyxTQUFTLENBQzdCLGdCQUFnQixFQUNoQixFQUFFLElBQUksRUFBRSxFQUFFLGdDQUFnQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQ3ZFLENBQUM7UUFDRixpQkFBaUIsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDVCxNQUFNLEVBQ04sNkNBQTZDLGlCQUFpQixtQ0FBbUMsbUNBQW1DLDJDQUEyQywyQkFBMkIseUNBQXlDLHFCQUFxQiw2QkFBNkIsQ0FDdFMsQ0FBQztBQUNKLENBQUM7QUFFRCxLQUFLLFVBQVUseUNBQXlDLENBQ3RELEdBR0MsRUFDRCxPQUFrQztJQUVsQyxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsS0FBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN4RCxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUM7SUFFdEIsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNaLE1BQU0sWUFBWSxHQUFHLE1BQU0sVUFBVTthQUNsQyxJQUFJLENBQUM7WUFDSixVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFO1lBQzdCLG1CQUFtQixFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtTQUN4QyxDQUFDO2FBQ0QsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7YUFDL0IsS0FBSyxDQUFDLHVDQUF1QyxDQUFDO2FBQzlDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxNQUFNO1FBRXJDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQztRQUN4RCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FDYixvRkFBb0YsQ0FDckYsQ0FBQztRQUNKLENBQUM7UUFFRCxLQUFLLE1BQU0sV0FBVyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sRUFBRSxHQUFHLE9BQU8sV0FBVyxDQUFDLEVBQUUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMzRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ1IsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1lBQ3RFLENBQUM7WUFDRCxJQUFJLE9BQU8sV0FBVyxDQUFDLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDL0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1lBQzdFLENBQUM7WUFFRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDL0QsTUFBTSxTQUFTLEdBQUcsbUJBQW1CLEVBQUUsTUFBTSxDQUFDO1lBQzlDLE1BQU0sV0FBVyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDN0MsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLFdBQVcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDN0QsSUFBSSxDQUFDLG1CQUFtQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUNqRixNQUFNLElBQUksS0FBSyxDQUFDLDBEQUEwRCxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2xGLENBQUM7WUFFRCxNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxHQUFHLEtBQUssU0FBUztnQkFDcEQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO2dCQUNSLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sU0FBUyxHQUFHLE1BQU0sVUFBVSxDQUFDLFNBQVMsQ0FDMUM7Z0JBQ0UsR0FBRyxnQkFBZ0I7Z0JBQ25CLFVBQVUsRUFBRSxXQUFXLENBQUMsVUFBVTtnQkFDbEMsbUJBQW1CLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFO2FBQ3hDLEVBQ0Q7Z0JBQ0UsSUFBSSxFQUFFO29CQUNKLG1CQUFtQixFQUFFLFNBQVM7b0JBQzlCLGNBQWMsRUFBRSxVQUFVLENBQUMsTUFBTTtvQkFDakMsVUFBVSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO2lCQUNyQztnQkFDRCxNQUFNLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFO2FBQzNCLENBQ0YsQ0FBQztZQUNGLElBQUksU0FBUyxDQUFDLGFBQWEsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNELE1BQU0sY0FBYyxHQUFHLE1BQU0sV0FBVyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDeEQsSUFDRSxPQUFPLEVBQUUsbUJBQW1CLEtBQUssU0FBUzt1QkFDdkMsT0FBTyxDQUFDLGNBQWMsS0FBSyxVQUFVLENBQUMsTUFBTTt1QkFDNUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQzt1QkFDNUQsY0FBYzt1QkFDZCxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFDakQsQ0FBQztvQkFDRCxTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO1lBQ3ZFLENBQUM7WUFDRCxhQUFhLEVBQUUsQ0FBQztRQUNsQixDQUFDO1FBRUQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQ1QsTUFBTSxFQUNOLHdEQUF3RCxZQUFZLENBQUMsTUFBTSxnQkFBZ0IsYUFBYSxpQkFBaUIsQ0FDMUgsQ0FBQztJQUNKLENBQUM7SUFFRCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDVCxNQUFNLEVBQ04sMkNBQTJDLGFBQWEsNEJBQTRCLENBQ3JGLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUywyQkFBMkIsQ0FBQyxLQUFjO0lBQ2pELE1BQU0sU0FBUyxHQUFHLEtBQStDLENBQUM7SUFDbEUsT0FBTyxTQUFTLENBQUMsSUFBSSxLQUFLLEVBQUUsSUFBSSxTQUFTLENBQUMsUUFBUSxLQUFLLG1CQUFtQixDQUFDO0FBQzdFLENBQUM7QUFFRCxLQUFLLFVBQVUsb0JBQW9CLENBQUMsR0FHbkM7SUFDQyxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsS0FBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMxRCx3RUFBd0U7SUFDeEUsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNaLE1BQU0sTUFBTSxHQUFHLE1BQU0sWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzFGLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtZQUFFLE1BQU07UUFDMUIsS0FBSyxNQUFNLFdBQVcsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNqQyxJQUFJLE9BQU8sV0FBVyxDQUFDLFVBQVUsS0FBSyxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVTttQkFDcEUsV0FBVyxDQUFDLFVBQVUsS0FBSyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRTtnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7WUFDcEgsTUFBTSxXQUFXLEdBQUcsVUFBVSxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdkQsSUFBSSxXQUFXLENBQUMsV0FBVyxLQUFLLFNBQVMsSUFBSSxXQUFXLENBQUMsV0FBVyxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUNyRixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7WUFDN0QsQ0FBQztZQUNELE1BQU0sT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUM3RixFQUFFLElBQUksRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLElBQUksT0FBTyxDQUFDLGFBQWEsS0FBSyxDQUFDO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUNwRyxDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDNUYsdUVBQXVFO0lBQ3ZFLE1BQU0sT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNELEtBQUssTUFBTSxLQUFLLElBQUksT0FBTyxFQUFFLENBQUM7UUFDNUIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9GLE1BQU0sWUFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsQ0FBQztJQUNILENBQUM7SUFDRCxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsd0JBQXdCLEVBQUUsZ0JBQWdCO1FBQ3hILHVCQUF1QixFQUFFLDBCQUEwQixFQUFFLHVCQUF1QixFQUFFLDBCQUEwQixDQUFDLEVBQUUsQ0FBQztRQUM1RyxNQUFNLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDM0YsQ0FBQztJQUNELE1BQU0sR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLHlCQUF5QixFQUFFLENBQUMsQ0FBQztJQUNoSSxNQUFNLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLENBQUMsYUFBYSxDQUFDO1FBQy9ELEVBQUUsR0FBRyxFQUFFLEVBQUUsZUFBZSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFO1FBQy9ELEVBQUUsR0FBRyxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUU7UUFDbkUsRUFBRSxHQUFHLEVBQUUsRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7S0FDaEUsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxHQUFHLENBQUMsS0FBTSxDQUFDLFVBQVUsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLGFBQWEsQ0FBQztRQUNwRSxFQUFFLEdBQUcsRUFBRSxFQUFFLHdCQUF3QixFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7UUFDOUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxxQ0FBcUMsRUFBRTtRQUN6RixFQUFFLEdBQUcsRUFBRSxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxpQ0FBaUMsRUFBRTtRQUN4RixFQUFFLEdBQUcsRUFBRSxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUMsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSw0QkFBNEIsRUFBRTtRQUNwSCxFQUFFLEdBQUcsRUFBRSxFQUFFLGdCQUFnQixFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLCtCQUErQixFQUFFO0tBQy9FLENBQUMsQ0FBQztJQUNILE1BQU0sR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFDakUsRUFBRSxHQUFHLEVBQUUsRUFBRSxlQUFlLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLCtCQUErQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7UUFDcEYsRUFBRSxHQUFHLEVBQUUsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSwrQkFBK0IsRUFBRTtRQUNuRixFQUFFLEdBQUcsRUFBRSxFQUFFLG1CQUFtQixFQUFFLENBQUMsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRTtLQUNwRyxDQUFDLENBQUM7SUFDSCxNQUFNLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLDBCQUEwQixDQUFDLENBQUMsV0FBVyxDQUNqRSxFQUFFLHFCQUFxQixFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsOEJBQThCLEVBQUUsQ0FBQyxDQUFDO0lBQ2pGLE1BQU0sR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxXQUFXLENBQ2pFLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSwyQkFBMkIsRUFBRSxDQUFDLENBQUM7SUFDekUsTUFBTSxHQUFHLENBQUMsS0FBTSxDQUFDLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLGFBQWEsQ0FBQztRQUNqRSxFQUFFLEdBQUcsRUFBRSxFQUFFLHdCQUF3QixFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSw2QkFBNkIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7UUFDekcsRUFBRSxHQUFHLEVBQUUsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSw2QkFBNkIsRUFBRTtRQUNqRixFQUFFLEdBQUcsRUFBRSxFQUFFLGVBQWUsRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRTtRQUNsRixFQUFFLEdBQUcsRUFBRSxFQUFFLGlCQUFpQixFQUFFLENBQUMsRUFBRSx3QkFBd0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsNkJBQTZCLEVBQUU7UUFDbkcsRUFBRSxHQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUU7UUFDNUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRTtLQUN2RSxDQUFDLENBQUM7SUFDSCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsMEZBQTBGLENBQUMsQ0FBQztBQUNsSCxDQUFDO0FBRUQsS0FBSyxVQUFVLDhCQUE4QixDQUFDLEdBRzdDO0lBQ0MseUVBQXlFO0lBQ3pFLDJFQUEyRTtJQUMzRSw0RUFBNEU7SUFDNUUscURBQXFEO0lBQ3JELE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDOUQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEtBQUssQ0FBQztZQUFFLE1BQU0sS0FBSyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxNQUFNLFVBQVUsQ0FBQyxXQUFXLENBQzFCLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUNoQixFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUN0QyxDQUFDO0lBQ0YsTUFBTSxVQUFVLENBQUMsV0FBVyxDQUMxQixFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFDM0IsRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsQ0FDakMsQ0FBQztJQUVGLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUNULE1BQU0sRUFDTixnRkFBZ0YsQ0FDakYsQ0FBQztBQUNKLENBQUMifQ==
|
|
1694
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19taWdyYXRpb25zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxVQUFVLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDaEYsT0FBTyxFQUNMLHlCQUF5QixFQUN6QiwwQkFBMEIsRUFDMUIsMEJBQTBCLEVBQzFCLCtCQUErQixHQUNoQyxNQUFNLDhDQUE4QyxDQUFDO0FBQ3RELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pGLE9BQU8sRUFDTCxhQUFhLElBQUksb0JBQW9CLEVBQ3JDLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsbUJBQW1CLEdBQ3BCLE1BQU0seUNBQXlDLENBQUM7QUFNakQsT0FBTyxFQUNMLDJCQUEyQixFQUMzQiwrQkFBK0IsRUFDL0IsOEJBQThCLEdBQy9CLE1BQU0scURBQXFELENBQUM7QUFDN0QsT0FBTyxFQUFFLElBQUksSUFBSSx1QkFBdUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXpFLDZGQUE2RjtBQUM3RixNQUFNLHNCQUFzQixHQUFHLHVCQUF1QixDQUFDLGdDQUFnQyxDQUFDLE1BQU0sQ0FBQztBQUUvRjs7Ozs7O0dBTUc7QUFFSDs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxLQUFLO0lBQy9DLFlBQVksVUFBa0IsRUFBRSxVQUFnQztRQUM5RCxLQUFLLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxJQUFJLEdB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
|