@foss.global/codefeed 2.0.2 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/changelog.md +34 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.forgeinventory.d.ts +4 -7
- package/dist_ts/classes.forgeinventory.js +20 -76
- package/dist_ts/classes.forgeinventoryscanner.js +1 -1
- package/dist_ts/classes.giteasourceinventory.d.ts +84 -0
- package/dist_ts/classes.giteasourceinventory.js +865 -0
- package/dist_ts/forgeinventory.client.d.ts +40 -0
- package/dist_ts/forgeinventory.client.js +78 -0
- package/dist_ts/forgeinventory.transport.d.ts +5 -4
- package/dist_ts/forgeinventory.transport.js +6 -6
- package/dist_ts/forgeinventory.validation.js +1 -1
- package/dist_ts/giteasourceinventory.git.d.ts +70 -0
- package/dist_ts/giteasourceinventory.git.js +294 -0
- package/dist_ts/index.d.ts +1 -0
- package/dist_ts/index.js +2 -1
- package/dist_ts/plugins.d.ts +4 -1
- package/dist_ts/plugins.js +5 -2
- package/package.json +9 -8
- package/readme.md +38 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.forgeinventory.ts +20 -60
- package/ts/classes.giteasourceinventory.ts +924 -0
- package/ts/forgeinventory.client.ts +95 -0
- package/ts/forgeinventory.transport.ts +10 -9
- package/ts/giteasourceinventory.git.ts +316 -0
- package/ts/index.ts +1 -0
- package/ts/plugins.ts +4 -1
|
@@ -0,0 +1,865 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import * as transport from './forgeinventory.transport.js';
|
|
3
|
+
import * as validation from './forgeinventory.validation.js';
|
|
4
|
+
import { ForgeRequestClient } from './forgeinventory.client.js';
|
|
5
|
+
import { measureGiteaMirror } from './giteasourceinventory.git.js';
|
|
6
|
+
/** The only limitation: data Gitea exposes to no administrator read and that the migration reissues. */
|
|
7
|
+
export const giteaSourceInventoryLimitations = [
|
|
8
|
+
'Gitea has no read that lists user-scoped Actions secrets; they are reissued.',
|
|
9
|
+
];
|
|
10
|
+
const complete = (valueArg) => ({ status: 'complete', value: BigInt(valueArg).toString() });
|
|
11
|
+
const partial = (observedArg, reasonArg) => ({ status: 'partial', observedValue: BigInt(observedArg).toString(), reason: reasonArg });
|
|
12
|
+
const notMeasured = (reasonArg) => ({ status: 'notMeasured', reason: reasonArg });
|
|
13
|
+
const unitDisabled = (unitArg) => notMeasured(`The ${unitArg} unit is disabled; Gitea's API hides its data.`);
|
|
14
|
+
/** The value a measure observed so far. */
|
|
15
|
+
const observed = (measureArg) => measureArg.status === 'complete' ? BigInt(measureArg.value)
|
|
16
|
+
: measureArg.status === 'partial' ? BigInt(measureArg.observedValue) : 0n;
|
|
17
|
+
/**
|
|
18
|
+
* Sums measures: complete only when every addend is, not measured when any
|
|
19
|
+
* addend is, otherwise partial with the observed sum and the first reason.
|
|
20
|
+
*/
|
|
21
|
+
const sumMeasures = (measuresArg) => {
|
|
22
|
+
const missing = measuresArg.find((measureArg) => measureArg.status === 'notMeasured');
|
|
23
|
+
if (missing)
|
|
24
|
+
return missing;
|
|
25
|
+
const total = measuresArg.reduce((sumArg, measureArg) => sumArg + observed(measureArg), 0n);
|
|
26
|
+
const unfinished = measuresArg.find((measureArg) => measureArg.status === 'partial');
|
|
27
|
+
return unfinished?.status === 'partial' ? partial(total, unfinished.reason) : complete(total);
|
|
28
|
+
};
|
|
29
|
+
const listingMeasure = (listingArg, valueArg = BigInt(listingArg.items.length)) => listingArg.failure === null ? complete(valueArg) : partial(valueArg, listingArg.failure);
|
|
30
|
+
/** A sanitized failure reason: adapter-owned error codes only, never remote text. */
|
|
31
|
+
const reason = (errorArg) => errorArg instanceof validation.ForgeInventoryError ? errorArg.code : 'unexpected-error';
|
|
32
|
+
const requiredBoolean = (valueArg) => {
|
|
33
|
+
if (typeof valueArg !== 'boolean')
|
|
34
|
+
throw new validation.ForgeInventoryError('invalid-boolean');
|
|
35
|
+
return valueArg;
|
|
36
|
+
};
|
|
37
|
+
const requiredString = (valueArg) => {
|
|
38
|
+
const value = validation.optionalString(valueArg);
|
|
39
|
+
if (value === null)
|
|
40
|
+
throw new validation.ForgeInventoryError('invalid-string');
|
|
41
|
+
return value;
|
|
42
|
+
};
|
|
43
|
+
/** One provider path segment, as an owner or repository name. */
|
|
44
|
+
const segment = (valueArg) => {
|
|
45
|
+
const segments = validation.segments(valueArg);
|
|
46
|
+
if (segments.length !== 1)
|
|
47
|
+
throw new validation.ForgeInventoryError('invalid-path');
|
|
48
|
+
return segments[0];
|
|
49
|
+
};
|
|
50
|
+
const ownerVisibility = (valueArg) => {
|
|
51
|
+
if (valueArg === 'limited')
|
|
52
|
+
return 'internal';
|
|
53
|
+
const visibility = validation.visibility(valueArg);
|
|
54
|
+
if (visibility === null)
|
|
55
|
+
throw new validation.ForgeInventoryError('invalid-visibility');
|
|
56
|
+
return visibility;
|
|
57
|
+
};
|
|
58
|
+
/** Files attached to an issue, pull request, comment or release, with their bytes. */
|
|
59
|
+
const assets = (valueArg) => {
|
|
60
|
+
if (valueArg === undefined || valueArg === null)
|
|
61
|
+
return { count: 0n, bytes: 0n };
|
|
62
|
+
if (!Array.isArray(valueArg))
|
|
63
|
+
throw new validation.ForgeInventoryError('invalid-assets');
|
|
64
|
+
return valueArg.reduce((sumArg, assetArg) => ({
|
|
65
|
+
count: sumArg.count + 1n, bytes: sumArg.bytes + BigInt(validation.decimal(validation.record(assetArg).size)),
|
|
66
|
+
}), { count: 0n, bytes: 0n });
|
|
67
|
+
};
|
|
68
|
+
/** A `{ <rows>, total_count }` envelope whose rows must match its total. */
|
|
69
|
+
const countedEnvelope = (bodyArg, rowsKeyArg) => {
|
|
70
|
+
const body = validation.record(bodyArg);
|
|
71
|
+
const rows = body[rowsKeyArg] ?? [];
|
|
72
|
+
if (!Array.isArray(rows))
|
|
73
|
+
throw new validation.ForgeInventoryError('invalid-page');
|
|
74
|
+
return { rows, failure: validation.decimal(body.total_count) === String(rows.length) ? null : 'count-mismatch' };
|
|
75
|
+
};
|
|
76
|
+
const unitKey = (unitArg) => unitArg.kind === 'instance' ? 'instance'
|
|
77
|
+
: unitArg.kind === 'owner' ? `owner:${unitArg.ownerKind}:${unitArg.name}` : `repository:${unitArg.owner}/${unitArg.name}`;
|
|
78
|
+
const compareText = (aArg, bArg) => aArg < bArg ? -1 : aArg > bArg ? 1 : 0;
|
|
79
|
+
/**
|
|
80
|
+
* Authenticated, read-only inventory of a Gitea instance, read with a site
|
|
81
|
+
* administrator's token: GET requests to its REST API, a mirror clone of every
|
|
82
|
+
* repository for refs, objects and LFS pointers, and LFS batch `download`
|
|
83
|
+
* requests that check which referenced objects Gitea holds. It counts secrets
|
|
84
|
+
* and variables without retaining their values, and reports every read that
|
|
85
|
+
* did not finish as a partial or unmeasured value instead of a count.
|
|
86
|
+
*/
|
|
87
|
+
export class GiteaSourceInventory {
|
|
88
|
+
#options;
|
|
89
|
+
#transport;
|
|
90
|
+
#client;
|
|
91
|
+
#lfsClient = null;
|
|
92
|
+
#readerLogin = null;
|
|
93
|
+
constructor(optionsArg) {
|
|
94
|
+
const baseUrl = validation.httpUrl(optionsArg.baseUrl);
|
|
95
|
+
if (!baseUrl || !baseUrl.startsWith('https:') || typeof optionsArg.instanceId !== 'string' || !optionsArg.instanceId.trim() ||
|
|
96
|
+
typeof optionsArg.token !== 'string' || !optionsArg.token || /[\s\u0000-\u001f\u007f]/.test(optionsArg.token) ||
|
|
97
|
+
typeof optionsArg.gitWorkDir !== 'string' || !plugins.path.isAbsolute(optionsArg.gitWorkDir)) {
|
|
98
|
+
throw new validation.ForgeInventoryError('invalid-options');
|
|
99
|
+
}
|
|
100
|
+
const limits = {
|
|
101
|
+
pageSize: optionsArg.pageSize ?? 50,
|
|
102
|
+
maxPages: optionsArg.maxPages ?? 10_000,
|
|
103
|
+
requestTimeoutMs: optionsArg.requestTimeoutMs ?? 60_000,
|
|
104
|
+
maxResponseBytes: optionsArg.maxResponseBytes ?? 16 * 1024 * 1024,
|
|
105
|
+
gitTimeoutMs: optionsArg.gitTimeoutMs ?? 30 * 60 * 1000,
|
|
106
|
+
};
|
|
107
|
+
for (const [name, maximum] of [
|
|
108
|
+
['pageSize', 100], ['maxPages', 1_000_000], ['requestTimeoutMs', 300_000], ['maxResponseBytes', 64 * 1024 * 1024], ['gitTimeoutMs', 6 * 60 * 60 * 1000],
|
|
109
|
+
]) {
|
|
110
|
+
const value = limits[name];
|
|
111
|
+
if (!Number.isSafeInteger(value) || value < 1 || value > maximum)
|
|
112
|
+
throw new validation.ForgeInventoryError('invalid-limits');
|
|
113
|
+
}
|
|
114
|
+
const caCertificates = optionsArg.caCertificates === undefined ? undefined : validation.caCertificates(optionsArg.caCertificates);
|
|
115
|
+
this.#options = {
|
|
116
|
+
instanceId: optionsArg.instanceId, baseUrl: baseUrl.replace(/\/+$/, ''), ...limits,
|
|
117
|
+
token: optionsArg.token, caCertificates, gitWorkDir: optionsArg.gitWorkDir,
|
|
118
|
+
};
|
|
119
|
+
this.#transport = caCertificates === undefined ? transport.globalFetchTransport : transport.createHttpsTransport(caCertificates);
|
|
120
|
+
this.#client = new ForgeRequestClient({
|
|
121
|
+
transport: this.#transport,
|
|
122
|
+
headers: { authorization: `token ${optionsArg.token}` },
|
|
123
|
+
requestTimeoutMs: limits.requestTimeoutMs,
|
|
124
|
+
maxResponseBytes: limits.maxResponseBytes,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
/** Validated, normalized instance root; contains no credentials or API suffix. */
|
|
128
|
+
get baseUrl() { return this.#options.baseUrl; }
|
|
129
|
+
/** REST and LFS batch requests together. */
|
|
130
|
+
get metrics() {
|
|
131
|
+
const rest = this.#client.metrics;
|
|
132
|
+
const lfs = this.#lfsClient?.metrics ?? { requests: 0, responseBytes: 0, rateLimitedRequests: 0 };
|
|
133
|
+
return {
|
|
134
|
+
requests: rest.requests + lfs.requests,
|
|
135
|
+
responseBytes: rest.responseBytes + lfs.responseBytes,
|
|
136
|
+
rateLimitedRequests: rest.rateLimitedRequests + lfs.rateLimitedRequests,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Identifies the source and its reader and lists every owner and repository.
|
|
141
|
+
* Rejects unless the token belongs to a site administrator; a listing that
|
|
142
|
+
* does not finish is reported in `incompleteReasons`.
|
|
143
|
+
*/
|
|
144
|
+
async discover(signalArg) {
|
|
145
|
+
const reader = validation.record((await this.#get('/user', { signal: signalArg })).body);
|
|
146
|
+
if (reader.is_admin !== true)
|
|
147
|
+
throw new validation.ForgeInventoryError('reader-not-site-admin');
|
|
148
|
+
const version = validation.record((await this.#get('/version', { signal: signalArg })).body).version;
|
|
149
|
+
if (typeof version !== 'string' || version.length > 128 || !/^\d+\.\d+\.\d+(?:[-+][A-Za-z0-9][A-Za-z0-9.+-]*)?$/.test(version)) {
|
|
150
|
+
throw new validation.ForgeInventoryError('invalid-server-version');
|
|
151
|
+
}
|
|
152
|
+
const incompleteReasons = [];
|
|
153
|
+
const organizations = await this.#list('/admin/orgs', { signal: signalArg });
|
|
154
|
+
const users = await this.#list('/admin/users', { signal: signalArg });
|
|
155
|
+
const repositories = await this.#list('/repos/search', {
|
|
156
|
+
signal: signalArg, query: { private: 'true', sort: 'id', order: 'asc' },
|
|
157
|
+
rows: (bodyArg) => {
|
|
158
|
+
const envelope = validation.record(bodyArg);
|
|
159
|
+
if (envelope.ok !== true)
|
|
160
|
+
throw new validation.ForgeInventoryError('search-not-successful');
|
|
161
|
+
return envelope.data;
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
for (const [name, listing] of [['organizations', organizations], ['users', users], ['repositories', repositories]]) {
|
|
165
|
+
if (listing.failure !== null)
|
|
166
|
+
incompleteReasons.push(`discovery: ${name}: ${listing.failure}`);
|
|
167
|
+
}
|
|
168
|
+
const owners = [
|
|
169
|
+
...organizations.items.map((itemArg) => ({ kind: 'organization', name: segment(validation.record(itemArg).name) })),
|
|
170
|
+
...users.items.map((itemArg) => ({ kind: 'user', name: segment(validation.record(itemArg).login) })),
|
|
171
|
+
].sort((aArg, bArg) => compareText(aArg.kind, bArg.kind) || compareText(aArg.name, bArg.name));
|
|
172
|
+
const discovered = repositories.items.map((itemArg) => {
|
|
173
|
+
const item = validation.record(itemArg);
|
|
174
|
+
return { owner: segment(validation.record(item.owner).login), name: segment(item.name) };
|
|
175
|
+
}).sort((aArg, bArg) => compareText(aArg.owner, bArg.owner) || compareText(aArg.name, bArg.name));
|
|
176
|
+
return {
|
|
177
|
+
source: { instanceId: this.#options.instanceId, kind: 'gitea', baseUrl: this.#options.baseUrl, version },
|
|
178
|
+
reader: { login: segment(reader.login), siteAdmin: true },
|
|
179
|
+
owners,
|
|
180
|
+
repositories: discovered,
|
|
181
|
+
incompleteReasons: incompleteReasons.sort(compareText),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
/** Every unit a run over this discovery measures: the instance, then owners, then repositories. */
|
|
185
|
+
units(discoveryArg) {
|
|
186
|
+
return [
|
|
187
|
+
{ kind: 'instance' },
|
|
188
|
+
...discoveryArg.owners.map((ownerArg) => ({ kind: 'owner', ownerKind: ownerArg.kind, name: ownerArg.name })),
|
|
189
|
+
...discoveryArg.repositories.map((repositoryArg) => ({ kind: 'repository', owner: repositoryArg.owner, name: repositoryArg.name })),
|
|
190
|
+
];
|
|
191
|
+
}
|
|
192
|
+
/** Measures one unit. Never rejects: a unit whose primary record cannot be read is `failed`. */
|
|
193
|
+
async measureUnit(unitArg, signalArg) {
|
|
194
|
+
try {
|
|
195
|
+
if (unitArg.kind === 'instance')
|
|
196
|
+
return { kind: 'instance', instance: await this.#instance(signalArg) };
|
|
197
|
+
if (unitArg.kind === 'owner') {
|
|
198
|
+
return { kind: 'owner', owner: unitArg.ownerKind === 'organization' ? await this.#organization(unitArg.name, signalArg) : await this.#user(unitArg.name, signalArg) };
|
|
199
|
+
}
|
|
200
|
+
return { kind: 'repository', repository: await this.#repository(unitArg.owner, unitArg.name, signalArg) };
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
return { kind: 'failed', unit: unitArg, reason: reason(error) };
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Measures units with bounded concurrency; results keep the order of `unitsArg`.
|
|
208
|
+
* An aborted signal or a rejected `onResult` aborts the units in flight, hands
|
|
209
|
+
* over no further result and rejects once every worker has stopped.
|
|
210
|
+
*/
|
|
211
|
+
async measureUnits(unitsArg, optionsArg = {}) {
|
|
212
|
+
const concurrency = optionsArg.concurrency ?? 4;
|
|
213
|
+
if (!Number.isSafeInteger(concurrency) || concurrency < 1 || concurrency > 16)
|
|
214
|
+
throw new validation.ForgeInventoryError('invalid-concurrency');
|
|
215
|
+
const results = new Array(unitsArg.length);
|
|
216
|
+
// The first failure aborts the units in flight; nothing is handed over after it.
|
|
217
|
+
const controller = new AbortController();
|
|
218
|
+
const abort = () => controller.abort();
|
|
219
|
+
if (optionsArg.signal?.aborted)
|
|
220
|
+
abort();
|
|
221
|
+
optionsArg.signal?.addEventListener('abort', abort, { once: true });
|
|
222
|
+
let failure = null;
|
|
223
|
+
let next = 0;
|
|
224
|
+
const worker = async () => {
|
|
225
|
+
while (failure === null && next < unitsArg.length) {
|
|
226
|
+
const index = next++;
|
|
227
|
+
try {
|
|
228
|
+
if (controller.signal.aborted)
|
|
229
|
+
throw new validation.ForgeInventoryError('request-aborted');
|
|
230
|
+
const result = await this.measureUnit(unitsArg[index], controller.signal);
|
|
231
|
+
if (failure !== null)
|
|
232
|
+
return;
|
|
233
|
+
if (controller.signal.aborted)
|
|
234
|
+
throw new validation.ForgeInventoryError('request-aborted');
|
|
235
|
+
results[index] = result;
|
|
236
|
+
await optionsArg.onResult?.(result);
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
failure ??= { error };
|
|
240
|
+
abort();
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
try {
|
|
245
|
+
await Promise.all(Array.from({ length: Math.min(concurrency, unitsArg.length) }, worker));
|
|
246
|
+
}
|
|
247
|
+
finally {
|
|
248
|
+
optionsArg.signal?.removeEventListener('abort', abort);
|
|
249
|
+
}
|
|
250
|
+
if (failure !== null)
|
|
251
|
+
throw failure.error;
|
|
252
|
+
return results;
|
|
253
|
+
}
|
|
254
|
+
async #instance(signalArg) {
|
|
255
|
+
const users = await this.#list('/admin/users', { signal: signalArg });
|
|
256
|
+
const flagged = (predicateArg) => listingMeasure(users, BigInt(users.items.filter((itemArg) => predicateArg(validation.record(itemArg))).length));
|
|
257
|
+
const runners = await this.#runners('/admin/actions/runners', { signal: signalArg });
|
|
258
|
+
return {
|
|
259
|
+
users: {
|
|
260
|
+
total: listingMeasure(users),
|
|
261
|
+
active: flagged((userArg) => requiredBoolean(userArg.active)),
|
|
262
|
+
admins: flagged((userArg) => requiredBoolean(userArg.is_admin)),
|
|
263
|
+
restricted: flagged((userArg) => requiredBoolean(userArg.restricted)),
|
|
264
|
+
prohibitLogin: flagged((userArg) => requiredBoolean(userArg.prohibit_login)),
|
|
265
|
+
externalAuth: flagged((userArg) => validation.decimal(userArg.source_id) !== '0'),
|
|
266
|
+
twoFactor: await this.#count('/admin/users', { signal: signalArg, query: { is_2fa_enabled: 'true' } }),
|
|
267
|
+
},
|
|
268
|
+
organizations: await this.#count('/admin/orgs', { signal: signalArg }),
|
|
269
|
+
systemWebhooks: await this.#count('/admin/hooks', { signal: signalArg, query: { type: 'all' } }),
|
|
270
|
+
runners,
|
|
271
|
+
unadoptedRepositories: await this.#count('/admin/unadopted', { signal: signalArg }),
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
async #ownerBase(nameArg, recordArg, repositoriesPathArg, signalArg) {
|
|
275
|
+
return {
|
|
276
|
+
name: nameArg,
|
|
277
|
+
id: validation.decimal(recordArg.id),
|
|
278
|
+
visibility: ownerVisibility(recordArg.visibility),
|
|
279
|
+
repositories: await this.#count(repositoriesPathArg, { signal: signalArg }),
|
|
280
|
+
packages: await this.#packages(nameArg, signalArg),
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
async #organization(nameArg, signalArg) {
|
|
284
|
+
const path = `/orgs/${encodeURIComponent(nameArg)}`;
|
|
285
|
+
const organization = validation.record((await this.#get(path, { signal: signalArg })).body);
|
|
286
|
+
if (segment(organization.name) !== nameArg)
|
|
287
|
+
throw new validation.ForgeInventoryError('owner-identity-changed');
|
|
288
|
+
const teams = await this.#list(`${path}/teams`, { signal: signalArg });
|
|
289
|
+
const memberships = [];
|
|
290
|
+
const grants = [];
|
|
291
|
+
for (const team of teams.items) {
|
|
292
|
+
const teamPath = `/teams/${validation.decimal(validation.record(team).id)}`;
|
|
293
|
+
memberships.push(await this.#count(`${teamPath}/members`, { signal: signalArg }));
|
|
294
|
+
grants.push(await this.#count(`${teamPath}/repos`, { signal: signalArg }));
|
|
295
|
+
}
|
|
296
|
+
const teamsMeasure = listingMeasure(teams);
|
|
297
|
+
const fromTeams = (measuresArg) => sumMeasures([...measuresArg, ...(teamsMeasure.status === 'complete' ? [] : [partial(0, teams.failure)])]);
|
|
298
|
+
return {
|
|
299
|
+
kind: 'organization',
|
|
300
|
+
...await this.#ownerBase(nameArg, organization, `${path}/repos`, signalArg),
|
|
301
|
+
webhooks: await this.#count(`${path}/hooks`, { signal: signalArg }),
|
|
302
|
+
actionsVariables: await this.#count(`${path}/actions/variables`, { signal: signalArg }),
|
|
303
|
+
runners: await this.#runners(`${path}/actions/runners`, { signal: signalArg }),
|
|
304
|
+
members: await this.#count(`${path}/members`, { signal: signalArg }),
|
|
305
|
+
teams: teamsMeasure,
|
|
306
|
+
teamMemberships: fromTeams(memberships),
|
|
307
|
+
teamRepositoryGrants: fromTeams(grants),
|
|
308
|
+
labels: await this.#count(`${path}/labels`, { signal: signalArg }),
|
|
309
|
+
actionsSecrets: await this.#count(`${path}/actions/secrets`, { signal: signalArg }),
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
async #user(nameArg, signalArg) {
|
|
313
|
+
const path = `/users/${encodeURIComponent(nameArg)}`;
|
|
314
|
+
const user = validation.record((await this.#get(path, { signal: signalArg })).body);
|
|
315
|
+
if (segment(user.login) !== nameArg)
|
|
316
|
+
throw new validation.ForgeInventoryError('owner-identity-changed');
|
|
317
|
+
// User-scoped settings are only readable as that user, through the administrator's Sudo header.
|
|
318
|
+
const sudo = { signal: signalArg, sudo: nameArg };
|
|
319
|
+
return {
|
|
320
|
+
kind: 'user',
|
|
321
|
+
...await this.#ownerBase(nameArg, user, `${path}/repos`, signalArg),
|
|
322
|
+
account: {
|
|
323
|
+
admin: requiredBoolean(user.is_admin),
|
|
324
|
+
active: requiredBoolean(user.active),
|
|
325
|
+
restricted: requiredBoolean(user.restricted),
|
|
326
|
+
prohibitLogin: requiredBoolean(user.prohibit_login),
|
|
327
|
+
externalAuth: validation.decimal(user.source_id) !== '0',
|
|
328
|
+
},
|
|
329
|
+
webhooks: await this.#count('/user/hooks', sudo),
|
|
330
|
+
actionsVariables: await this.#count('/user/actions/variables', sudo),
|
|
331
|
+
runners: await this.#runners('/user/actions/runners', sudo),
|
|
332
|
+
sshKeys: await this.#count(`${path}/keys`, { signal: signalArg }),
|
|
333
|
+
gpgKeys: await this.#count(`${path}/gpg_keys`, { signal: signalArg }),
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
/** Package versions by type, with their files and bytes. */
|
|
337
|
+
async #packages(ownerArg, signalArg) {
|
|
338
|
+
const ownerPath = `/packages/${encodeURIComponent(ownerArg)}`;
|
|
339
|
+
// Gitea lists one row per package version.
|
|
340
|
+
const versions = await this.#list(ownerPath, { signal: signalArg });
|
|
341
|
+
const byType = new Map();
|
|
342
|
+
for (const itemArg of versions.items) {
|
|
343
|
+
const item = validation.record(itemArg);
|
|
344
|
+
const type = requiredString(item.type);
|
|
345
|
+
// The type is reported and names reason paths, so it must be one of Gitea's plain identifiers.
|
|
346
|
+
if (!/^[a-z][a-z0-9_-]{0,31}$/.test(type))
|
|
347
|
+
throw new validation.ForgeInventoryError('invalid-package-type');
|
|
348
|
+
const name = requiredString(item.name);
|
|
349
|
+
const version = requiredString(item.version);
|
|
350
|
+
const entry = byType.get(type) ?? { names: new Set(), versions: 0, files: [], bytes: [] };
|
|
351
|
+
byType.set(type, entry);
|
|
352
|
+
entry.names.add(name);
|
|
353
|
+
entry.versions++;
|
|
354
|
+
try {
|
|
355
|
+
const files = (await this.#get(`${ownerPath}/${[type, name, version].map(encodeURIComponent).join('/')}/files`, { signal: signalArg })).body;
|
|
356
|
+
if (!Array.isArray(files))
|
|
357
|
+
throw new validation.ForgeInventoryError('invalid-page');
|
|
358
|
+
const bytes = files.reduce((sumArg, fileArg) => sumArg + BigInt(validation.decimal(validation.record(fileArg).size)), 0n);
|
|
359
|
+
entry.files.push(complete(files.length));
|
|
360
|
+
entry.bytes.push(complete(bytes));
|
|
361
|
+
}
|
|
362
|
+
catch (error) {
|
|
363
|
+
entry.files.push(partial(0, reason(error)));
|
|
364
|
+
entry.bytes.push(partial(0, reason(error)));
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
const unfinished = versions.failure === null ? [] : [partial(0, versions.failure)];
|
|
368
|
+
const counts = [...byType.entries()].sort(([aArg], [bArg]) => compareText(aArg, bArg)).map(([type, entry]) => ({
|
|
369
|
+
type,
|
|
370
|
+
packages: sumMeasures([complete(entry.names.size), ...unfinished]),
|
|
371
|
+
versions: sumMeasures([complete(entry.versions), ...unfinished]),
|
|
372
|
+
files: sumMeasures([...entry.files, ...unfinished]),
|
|
373
|
+
bytes: sumMeasures([...entry.bytes, ...unfinished]),
|
|
374
|
+
}));
|
|
375
|
+
// A listing that failed before its first row still has to surface as partial.
|
|
376
|
+
if (counts.length === 0 && versions.failure !== null) {
|
|
377
|
+
const failed = partial(0, versions.failure);
|
|
378
|
+
counts.push({ type: 'unknown', packages: failed, versions: failed, files: failed, bytes: failed });
|
|
379
|
+
}
|
|
380
|
+
return counts;
|
|
381
|
+
}
|
|
382
|
+
async #repository(ownerArg, nameArg, signalArg) {
|
|
383
|
+
const path = `/repos/${encodeURIComponent(ownerArg)}/${encodeURIComponent(nameArg)}`;
|
|
384
|
+
const item = validation.record((await this.#get(path, { signal: signalArg })).body);
|
|
385
|
+
const owner = validation.record(item.owner);
|
|
386
|
+
if (segment(owner.login) !== ownerArg || segment(item.name) !== nameArg)
|
|
387
|
+
throw new validation.ForgeInventoryError('repository-identity-changed');
|
|
388
|
+
const visibility = validation.giteaRepositoryVisibility(item.private, item.internal, owner.visibility);
|
|
389
|
+
if (visibility === null)
|
|
390
|
+
throw new validation.ForgeInventoryError('invalid-visibility');
|
|
391
|
+
const empty = requiredBoolean(item.empty);
|
|
392
|
+
const features = {
|
|
393
|
+
issues: requiredBoolean(item.has_issues),
|
|
394
|
+
pullRequests: requiredBoolean(item.has_pull_requests),
|
|
395
|
+
wiki: requiredBoolean(item.has_wiki),
|
|
396
|
+
releases: requiredBoolean(item.has_releases),
|
|
397
|
+
packages: requiredBoolean(item.has_packages),
|
|
398
|
+
actions: requiredBoolean(item.has_actions),
|
|
399
|
+
projects: requiredBoolean(item.has_projects),
|
|
400
|
+
};
|
|
401
|
+
const fork = requiredBoolean(item.fork);
|
|
402
|
+
const parent = item.parent === undefined || item.parent === null ? null : requiredString(validation.record(item.parent).full_name);
|
|
403
|
+
if (fork !== (parent !== null))
|
|
404
|
+
throw new validation.ForgeInventoryError('inconsistent-fork-parent');
|
|
405
|
+
const options = { signal: signalArg };
|
|
406
|
+
return {
|
|
407
|
+
owner: ownerArg,
|
|
408
|
+
name: nameArg,
|
|
409
|
+
id: validation.decimal(item.id),
|
|
410
|
+
visibility,
|
|
411
|
+
fork,
|
|
412
|
+
parent,
|
|
413
|
+
mirror: requiredBoolean(item.mirror),
|
|
414
|
+
template: requiredBoolean(item.template),
|
|
415
|
+
archived: requiredBoolean(item.archived),
|
|
416
|
+
empty,
|
|
417
|
+
objectFormat: requiredString(item.object_format_name),
|
|
418
|
+
defaultBranch: requiredString(item.default_branch),
|
|
419
|
+
features,
|
|
420
|
+
...await this.#git(ownerArg, nameArg, item, signalArg),
|
|
421
|
+
collaboration: await this.#collaboration(path, features, signalArg),
|
|
422
|
+
// Releases stay readable while their unit is disabled; a disabled wiki answers 404.
|
|
423
|
+
releases: await this.#releases(path, signalArg),
|
|
424
|
+
wikiPages: features.wiki ? await this.#count(`${path}/wiki/pages`, { ...options, missingIsEmpty: true }) : unitDisabled('wiki'),
|
|
425
|
+
access: {
|
|
426
|
+
collaborators: await this.#count(`${path}/collaborators`, options),
|
|
427
|
+
teams: await this.#repositoryTeams(path, options),
|
|
428
|
+
deployKeys: await this.#count(`${path}/keys`, options),
|
|
429
|
+
webhooks: await this.#count(`${path}/hooks`, options),
|
|
430
|
+
branchProtections: await this.#unpagedCount(`${path}/branch_protections`, options),
|
|
431
|
+
tagProtections: await this.#unpagedCount(`${path}/tag_protections`, options),
|
|
432
|
+
pushMirrors: await this.#count(`${path}/push_mirrors`, options),
|
|
433
|
+
},
|
|
434
|
+
actions: await this.#actions(path, empty, signalArg),
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
/** Gitea answers 405 for a repository that no organization owns, which therefore has no teams. */
|
|
438
|
+
async #repositoryTeams(pathArg, optionsArg) {
|
|
439
|
+
try {
|
|
440
|
+
const body = (await this.#get(`${pathArg}/teams`, optionsArg)).body;
|
|
441
|
+
if (!Array.isArray(body))
|
|
442
|
+
throw new validation.ForgeInventoryError('invalid-page');
|
|
443
|
+
return complete(body.length);
|
|
444
|
+
}
|
|
445
|
+
catch (error) {
|
|
446
|
+
if (error instanceof validation.ForgeInventoryError && error.code === 'http-405')
|
|
447
|
+
return complete(0);
|
|
448
|
+
return partial(0, reason(error));
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
/** Refs, objects and LFS objects, read from a mirror clone; only the reported size comes from the API. */
|
|
452
|
+
async #git(ownerArg, nameArg, itemArg, signalArg) {
|
|
453
|
+
const sizeKiB = BigInt(validation.decimal(itemArg.size));
|
|
454
|
+
const username = await this.#login(signalArg);
|
|
455
|
+
const measured = await measureGiteaMirror({
|
|
456
|
+
baseUrl: this.#options.baseUrl, owner: ownerArg, name: nameArg, username, token: this.#options.token,
|
|
457
|
+
caCertificates: this.#options.caCertificates, workDir: this.#options.gitWorkDir, reportedSizeKiB: sizeKiB,
|
|
458
|
+
timeoutMs: this.#options.gitTimeoutMs,
|
|
459
|
+
lfsClient: this.#lfs(username), signal: signalArg,
|
|
460
|
+
});
|
|
461
|
+
return { git: { reportedSizeKiB: complete(sizeKiB), ...measured.git }, lfs: measured.lfs };
|
|
462
|
+
}
|
|
463
|
+
/** The reader's login, the user name of its Git and LFS credentials. */
|
|
464
|
+
#login(signalArg) {
|
|
465
|
+
if (this.#readerLogin === null) {
|
|
466
|
+
const login = this.#get('/user', { signal: signalArg }).then((responseArg) => segment(validation.record(responseArg.body).login));
|
|
467
|
+
// A failed read is retried by the next repository.
|
|
468
|
+
login.catch(() => { if (this.#readerLogin === login)
|
|
469
|
+
this.#readerLogin = null; });
|
|
470
|
+
this.#readerLogin = login;
|
|
471
|
+
}
|
|
472
|
+
return this.#readerLogin;
|
|
473
|
+
}
|
|
474
|
+
/** LFS routes accept the token as a Basic password, not as a `token` authorization. */
|
|
475
|
+
#lfs(usernameArg) {
|
|
476
|
+
this.#lfsClient ??= new ForgeRequestClient({
|
|
477
|
+
transport: this.#transport,
|
|
478
|
+
headers: { authorization: `Basic ${Buffer.from(`${usernameArg}:${this.#options.token}`).toString('base64')}` },
|
|
479
|
+
requestTimeoutMs: this.#options.requestTimeoutMs,
|
|
480
|
+
maxResponseBytes: this.#options.maxResponseBytes,
|
|
481
|
+
});
|
|
482
|
+
return this.#lfsClient;
|
|
483
|
+
}
|
|
484
|
+
async #collaboration(pathArg, featuresArg, signalArg) {
|
|
485
|
+
const options = { signal: signalArg };
|
|
486
|
+
// Labels and milestones stay readable while the issue units are disabled.
|
|
487
|
+
const labels = await this.#count(`${pathArg}/labels`, options);
|
|
488
|
+
const milestones = await this.#count(`${pathArg}/milestones`, { ...options, query: { state: 'all' } });
|
|
489
|
+
if (!featuresArg.issues || !featuresArg.pullRequests) {
|
|
490
|
+
// A disabled unit silently drops its items from the shared issue listing; with both disabled the listings answer 404.
|
|
491
|
+
const hidden = unitDisabled(featuresArg.issues ? 'pull requests' : 'issues');
|
|
492
|
+
return {
|
|
493
|
+
issues: hidden, pullRequests: hidden, comments: hidden, reviews: hidden, reviewComments: hidden,
|
|
494
|
+
labels, milestones, reactions: hidden, attachments: hidden, attachmentBytes: hidden,
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
// Issues and pull requests share one listing and one number sequence.
|
|
498
|
+
const issues = await this.#list(`${pathArg}/issues`, { ...options, query: { state: 'all' } });
|
|
499
|
+
const unfinished = issues.failure === null ? [] : [partial(0, issues.failure)];
|
|
500
|
+
let issueCount = 0n;
|
|
501
|
+
let pullCount = 0n;
|
|
502
|
+
let attachments = { count: 0n, bytes: 0n };
|
|
503
|
+
const reactions = [...unfinished];
|
|
504
|
+
const reviews = [...unfinished];
|
|
505
|
+
const reviewComments = [...unfinished];
|
|
506
|
+
for (const itemArg of issues.items) {
|
|
507
|
+
const item = validation.record(itemArg);
|
|
508
|
+
const number = validation.decimal(item.number);
|
|
509
|
+
const isPull = item.pull_request !== undefined && item.pull_request !== null;
|
|
510
|
+
if (isPull)
|
|
511
|
+
pullCount++;
|
|
512
|
+
else
|
|
513
|
+
issueCount++;
|
|
514
|
+
const itemAssets = assets(item.assets);
|
|
515
|
+
attachments = { count: attachments.count + itemAssets.count, bytes: attachments.bytes + itemAssets.bytes };
|
|
516
|
+
reactions.push(await this.#count(`${pathArg}/issues/${number}/reactions`, { ...options, nullIsEmpty: true }));
|
|
517
|
+
if (isPull) {
|
|
518
|
+
const pullReviews = await this.#list(`${pathArg}/pulls/${number}/reviews`, options);
|
|
519
|
+
reviews.push(listingMeasure(pullReviews));
|
|
520
|
+
const inline = pullReviews.items.reduce((sumArg, reviewArg) => sumArg + BigInt(validation.decimal(validation.record(reviewArg).comments_count)), 0n);
|
|
521
|
+
reviewComments.push(listingMeasure(pullReviews, inline));
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
const comments = await this.#list(`${pathArg}/issues/comments`, options);
|
|
525
|
+
const commentUnfinished = comments.failure === null ? [] : [partial(0, comments.failure)];
|
|
526
|
+
for (const commentArg of comments.items) {
|
|
527
|
+
const comment = validation.record(commentArg);
|
|
528
|
+
const commentAssets = assets(comment.assets);
|
|
529
|
+
attachments = { count: attachments.count + commentAssets.count, bytes: attachments.bytes + commentAssets.bytes };
|
|
530
|
+
reactions.push(await this.#unpagedCount(`${pathArg}/issues/comments/${validation.decimal(comment.id)}/reactions`, { ...options, nullIsEmpty: true }));
|
|
531
|
+
}
|
|
532
|
+
const attachmentUnfinished = [...unfinished, ...commentUnfinished];
|
|
533
|
+
return {
|
|
534
|
+
issues: listingMeasure(issues, issueCount),
|
|
535
|
+
pullRequests: listingMeasure(issues, pullCount),
|
|
536
|
+
comments: listingMeasure(comments),
|
|
537
|
+
reviews: sumMeasures(reviews),
|
|
538
|
+
reviewComments: sumMeasures(reviewComments),
|
|
539
|
+
labels,
|
|
540
|
+
milestones,
|
|
541
|
+
reactions: sumMeasures([...reactions, ...commentUnfinished]),
|
|
542
|
+
attachments: sumMeasures([complete(attachments.count), ...attachmentUnfinished]),
|
|
543
|
+
attachmentBytes: sumMeasures([complete(attachments.bytes), ...attachmentUnfinished]),
|
|
544
|
+
};
|
|
545
|
+
}
|
|
546
|
+
async #releases(pathArg, signalArg) {
|
|
547
|
+
// An administrator's listing includes drafts.
|
|
548
|
+
const releases = await this.#list(`${pathArg}/releases`, { signal: signalArg });
|
|
549
|
+
let drafts = 0n;
|
|
550
|
+
let releaseAssets = { count: 0n, bytes: 0n };
|
|
551
|
+
for (const itemArg of releases.items) {
|
|
552
|
+
const item = validation.record(itemArg);
|
|
553
|
+
if (requiredBoolean(item.draft))
|
|
554
|
+
drafts++;
|
|
555
|
+
const itemAssets = assets(item.assets);
|
|
556
|
+
releaseAssets = { count: releaseAssets.count + itemAssets.count, bytes: releaseAssets.bytes + itemAssets.bytes };
|
|
557
|
+
}
|
|
558
|
+
return {
|
|
559
|
+
releases: listingMeasure(releases),
|
|
560
|
+
drafts: listingMeasure(releases, drafts),
|
|
561
|
+
assets: listingMeasure(releases, releaseAssets.count),
|
|
562
|
+
assetBytes: listingMeasure(releases, releaseAssets.bytes),
|
|
563
|
+
};
|
|
564
|
+
}
|
|
565
|
+
/** Every Actions read stays available while the repository's Actions unit is disabled. */
|
|
566
|
+
async #actions(pathArg, emptyArg, signalArg) {
|
|
567
|
+
const options = { signal: signalArg };
|
|
568
|
+
const settings = {
|
|
569
|
+
secrets: await this.#count(`${pathArg}/actions/secrets`, options),
|
|
570
|
+
variables: await this.#count(`${pathArg}/actions/variables`, options),
|
|
571
|
+
runners: await this.#runners(`${pathArg}/actions/runners`, options),
|
|
572
|
+
};
|
|
573
|
+
let workflows;
|
|
574
|
+
if (emptyArg) {
|
|
575
|
+
workflows = complete(0);
|
|
576
|
+
}
|
|
577
|
+
else {
|
|
578
|
+
try {
|
|
579
|
+
const listing = countedEnvelope((await this.#get(`${pathArg}/actions/workflows`, options)).body, 'workflows');
|
|
580
|
+
workflows = listing.failure === null ? complete(listing.rows.length) : partial(listing.rows.length, listing.failure);
|
|
581
|
+
}
|
|
582
|
+
catch (error) {
|
|
583
|
+
workflows = partial(0, reason(error));
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
let runs;
|
|
587
|
+
try {
|
|
588
|
+
// The run history is archived, not migrated; its total sizes the archive without reading every run.
|
|
589
|
+
const body = validation.record((await this.#get(`${pathArg}/actions/runs`, { ...options, query: { limit: '1', page: '1' } })).body);
|
|
590
|
+
runs = complete(BigInt(validation.decimal(body.total_count)));
|
|
591
|
+
}
|
|
592
|
+
catch (error) {
|
|
593
|
+
runs = partial(0, reason(error));
|
|
594
|
+
}
|
|
595
|
+
let artifacts;
|
|
596
|
+
let artifactBytes;
|
|
597
|
+
try {
|
|
598
|
+
const listing = countedEnvelope((await this.#get(`${pathArg}/actions/artifacts`, options)).body, 'artifacts');
|
|
599
|
+
const bytes = listing.rows.reduce((sumArg, artifactArg) => sumArg + BigInt(validation.decimal(validation.record(artifactArg).size_in_bytes)), 0n);
|
|
600
|
+
artifacts = listing.failure === null ? complete(listing.rows.length) : partial(listing.rows.length, listing.failure);
|
|
601
|
+
artifactBytes = listing.failure === null ? complete(bytes) : partial(bytes, listing.failure);
|
|
602
|
+
}
|
|
603
|
+
catch (error) {
|
|
604
|
+
artifacts = artifactBytes = partial(0, reason(error));
|
|
605
|
+
}
|
|
606
|
+
return { workflows, ...settings, runs, artifacts, artifactBytes };
|
|
607
|
+
}
|
|
608
|
+
/** Runner listings are unpaged `{ runners, total_count }` envelopes. */
|
|
609
|
+
async #runners(pathArg, optionsArg) {
|
|
610
|
+
try {
|
|
611
|
+
const listing = countedEnvelope((await this.#get(pathArg, optionsArg)).body, 'runners');
|
|
612
|
+
return listing.failure === null ? complete(listing.rows.length) : partial(listing.rows.length, listing.failure);
|
|
613
|
+
}
|
|
614
|
+
catch (error) {
|
|
615
|
+
return partial(0, reason(error));
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
async #unpagedCount(pathArg, optionsArg) {
|
|
619
|
+
try {
|
|
620
|
+
const response = (await this.#get(pathArg, optionsArg)).body;
|
|
621
|
+
const body = response === null && optionsArg.nullIsEmpty ? [] : response;
|
|
622
|
+
if (!Array.isArray(body))
|
|
623
|
+
throw new validation.ForgeInventoryError('invalid-page');
|
|
624
|
+
return complete(body.length);
|
|
625
|
+
}
|
|
626
|
+
catch (error) {
|
|
627
|
+
return partial(0, reason(error));
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
async #count(pathArg, optionsArg) {
|
|
631
|
+
return listingMeasure(await this.#list(pathArg, optionsArg));
|
|
632
|
+
}
|
|
633
|
+
/**
|
|
634
|
+
* Reads every page of a listing. It ends at an empty page or once the rows
|
|
635
|
+
* reach `X-Total-Count`, and is partial when the total disagrees with the
|
|
636
|
+
* rows read, a page repeats, the page limit is reached or a page fails.
|
|
637
|
+
*/
|
|
638
|
+
async #list(pathArg, optionsArg) {
|
|
639
|
+
const items = [];
|
|
640
|
+
let previousPage = null;
|
|
641
|
+
let total = null;
|
|
642
|
+
for (let page = 1;; page++) {
|
|
643
|
+
if (page > this.#options.maxPages)
|
|
644
|
+
return { items, failure: 'page-limit' };
|
|
645
|
+
let rows;
|
|
646
|
+
let totalHeader;
|
|
647
|
+
try {
|
|
648
|
+
const response = await this.#get(pathArg, {
|
|
649
|
+
...optionsArg, query: { ...optionsArg.query, limit: String(this.#options.pageSize), page: String(page) },
|
|
650
|
+
});
|
|
651
|
+
rows = optionsArg.rows ? optionsArg.rows(response.body) : response.body;
|
|
652
|
+
if (rows === null && optionsArg.nullIsEmpty)
|
|
653
|
+
rows = [];
|
|
654
|
+
totalHeader = response.headers.get('x-total-count');
|
|
655
|
+
}
|
|
656
|
+
catch (error) {
|
|
657
|
+
if (page === 1 && optionsArg.missingIsEmpty && error instanceof validation.ForgeInventoryError && error.code === 'http-404') {
|
|
658
|
+
return { items, failure: null };
|
|
659
|
+
}
|
|
660
|
+
return { items, failure: reason(error) };
|
|
661
|
+
}
|
|
662
|
+
if (!Array.isArray(rows) || rows.length > this.#options.pageSize)
|
|
663
|
+
return { items, failure: 'invalid-page' };
|
|
664
|
+
if (totalHeader !== null) {
|
|
665
|
+
let pageTotal;
|
|
666
|
+
try {
|
|
667
|
+
pageTotal = BigInt(validation.decimal(totalHeader));
|
|
668
|
+
}
|
|
669
|
+
catch {
|
|
670
|
+
return { items, failure: 'invalid-total-count' };
|
|
671
|
+
}
|
|
672
|
+
if (total !== null && pageTotal !== total)
|
|
673
|
+
return { items, failure: 'total-changed' };
|
|
674
|
+
total = pageTotal;
|
|
675
|
+
}
|
|
676
|
+
if (rows.length === 0)
|
|
677
|
+
break;
|
|
678
|
+
const signature = JSON.stringify(rows);
|
|
679
|
+
if (signature === previousPage)
|
|
680
|
+
return { items, failure: 'repeated-page' };
|
|
681
|
+
previousPage = signature;
|
|
682
|
+
items.push(...rows);
|
|
683
|
+
if (total !== null && BigInt(items.length) >= total)
|
|
684
|
+
break;
|
|
685
|
+
}
|
|
686
|
+
if (total !== null && BigInt(items.length) !== total)
|
|
687
|
+
return { items, failure: 'count-mismatch' };
|
|
688
|
+
return { items, failure: null };
|
|
689
|
+
}
|
|
690
|
+
#get(pathArg, optionsArg) {
|
|
691
|
+
const url = new URL(`${this.#options.baseUrl}/api/v1${pathArg}`);
|
|
692
|
+
for (const [key, value] of Object.entries(optionsArg.query ?? {}))
|
|
693
|
+
url.searchParams.set(key, value);
|
|
694
|
+
const request = { signal: optionsArg.signal };
|
|
695
|
+
if (optionsArg.sudo !== undefined)
|
|
696
|
+
request.headers = { sudo: optionsArg.sudo };
|
|
697
|
+
return this.#client.request(url, request);
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
/** Repository-shaped groups, summed over repositories. */
|
|
701
|
+
const sumGroup = (groupsArg, keysArg, missingArg) => Object.fromEntries(keysArg.map((keyArg) => [keyArg, sumMeasures([...groupsArg.map((groupArg) => groupArg[keyArg]), ...missingArg])]));
|
|
702
|
+
const indicator = (measureArg, predicateArg) => measureArg.status === 'complete' ? complete(predicateArg(BigInt(measureArg.value)) ? 1 : 0)
|
|
703
|
+
: measureArg.status === 'partial' ? partial(predicateArg(BigInt(measureArg.observedValue)) ? 1 : 0, measureArg.reason) : measureArg;
|
|
704
|
+
/** Every measure of a document with its dotted path. */
|
|
705
|
+
const measuresOf = (valueArg, pathArg, outArg) => {
|
|
706
|
+
if (!valueArg || typeof valueArg !== 'object')
|
|
707
|
+
return;
|
|
708
|
+
const value = valueArg;
|
|
709
|
+
if (typeof value.status === 'string' && (value.status === 'complete' || value.status === 'partial' || value.status === 'notMeasured')) {
|
|
710
|
+
outArg.push({ path: pathArg, measure: value });
|
|
711
|
+
return;
|
|
712
|
+
}
|
|
713
|
+
for (const [key, child] of Object.entries(value)) {
|
|
714
|
+
// Package counts are keyed by their type rather than their position.
|
|
715
|
+
const name = Array.isArray(value) && child && typeof child === 'object' && typeof child.type === 'string'
|
|
716
|
+
? child.type : key;
|
|
717
|
+
measuresOf(child, pathArg ? `${pathArg}.${name}` : name, outArg);
|
|
718
|
+
}
|
|
719
|
+
};
|
|
720
|
+
/**
|
|
721
|
+
* Composes the deterministic inventory from a discovery and its unit results.
|
|
722
|
+
* Repeated results for one unit keep the last. Units without a successful
|
|
723
|
+
* result, owner repository counts that disagree with discovery, and every
|
|
724
|
+
* partial or unmeasured value make the inventory incomplete, with reasons
|
|
725
|
+
* aggregated per subject kind, path and reason.
|
|
726
|
+
*/
|
|
727
|
+
export const composeGiteaSourceInventory = (discoveryArg, resultsArg, generatorsArg) => {
|
|
728
|
+
const results = new Map();
|
|
729
|
+
for (const result of resultsArg) {
|
|
730
|
+
const unit = result.kind === 'failed' ? result.unit : result.kind === 'instance' ? { kind: 'instance' }
|
|
731
|
+
: result.kind === 'owner' ? { kind: 'owner', ownerKind: result.owner.kind, name: result.owner.name }
|
|
732
|
+
: { kind: 'repository', owner: result.repository.owner, name: result.repository.name };
|
|
733
|
+
results.set(unitKey(unit), result);
|
|
734
|
+
}
|
|
735
|
+
const reasons = new Map();
|
|
736
|
+
const addReason = (textArg) => reasons.set(textArg, (reasons.get(textArg) ?? 0) + 1);
|
|
737
|
+
for (const text of discoveryArg.incompleteReasons)
|
|
738
|
+
addReason(text);
|
|
739
|
+
const instanceResult = results.get('instance');
|
|
740
|
+
let instance;
|
|
741
|
+
if (instanceResult?.kind === 'instance') {
|
|
742
|
+
instance = instanceResult.instance;
|
|
743
|
+
}
|
|
744
|
+
else {
|
|
745
|
+
const missing = notMeasured(instanceResult?.kind === 'failed' ? `The instance unit failed: ${instanceResult.reason}.` : 'The instance unit was not measured.');
|
|
746
|
+
instance = {
|
|
747
|
+
users: { total: missing, active: missing, admins: missing, restricted: missing, prohibitLogin: missing, externalAuth: missing, twoFactor: missing },
|
|
748
|
+
organizations: missing, systemWebhooks: missing, runners: missing, unadoptedRepositories: missing,
|
|
749
|
+
};
|
|
750
|
+
}
|
|
751
|
+
const owners = [];
|
|
752
|
+
const failedOwners = [];
|
|
753
|
+
for (const owner of discoveryArg.owners) {
|
|
754
|
+
const result = results.get(unitKey({ kind: 'owner', ownerKind: owner.kind, name: owner.name }));
|
|
755
|
+
if (result?.kind === 'owner')
|
|
756
|
+
owners.push(result.owner);
|
|
757
|
+
else {
|
|
758
|
+
failedOwners.push(owner.name);
|
|
759
|
+
addReason(`${owner.kind}: ${result?.kind === 'failed' ? `unit failed: ${result.reason}` : 'unit not measured'}`);
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
const repositories = [];
|
|
763
|
+
const failedRepositories = [];
|
|
764
|
+
for (const repository of discoveryArg.repositories) {
|
|
765
|
+
const result = results.get(unitKey({ kind: 'repository', ...repository }));
|
|
766
|
+
if (result?.kind === 'repository')
|
|
767
|
+
repositories.push(result.repository);
|
|
768
|
+
else {
|
|
769
|
+
failedRepositories.push(`${repository.owner}/${repository.name}`);
|
|
770
|
+
addReason(`repository: ${result?.kind === 'failed' ? `unit failed: ${result.reason}` : 'unit not measured'}`);
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
owners.sort((aArg, bArg) => compareText(aArg.kind, bArg.kind) || compareText(aArg.name, bArg.name));
|
|
774
|
+
repositories.sort((aArg, bArg) => compareText(aArg.owner, bArg.owner) || compareText(aArg.name, bArg.name));
|
|
775
|
+
// Each owner's own repository listing must agree with the instance-wide discovery.
|
|
776
|
+
const discoveredPerOwner = new Map();
|
|
777
|
+
for (const repository of discoveryArg.repositories)
|
|
778
|
+
discoveredPerOwner.set(repository.owner, (discoveredPerOwner.get(repository.owner) ?? 0) + 1);
|
|
779
|
+
for (const owner of owners) {
|
|
780
|
+
if (owner.repositories.status === 'complete' && owner.repositories.value !== String(discoveredPerOwner.get(owner.name) ?? 0)) {
|
|
781
|
+
addReason(`${owner.kind}: repositories: the owner listing disagrees with the instance-wide repository search`);
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
const ownerNames = new Set(discoveryArg.owners.map((ownerArg) => ownerArg.name));
|
|
785
|
+
for (const owner of discoveredPerOwner.keys()) {
|
|
786
|
+
if (!ownerNames.has(owner))
|
|
787
|
+
addReason('repository: owner missing from the owner discovery');
|
|
788
|
+
}
|
|
789
|
+
const missingOwners = failedOwners.length ? [partial(0, `Owner units not measured: ${failedOwners.length}.`)] : [];
|
|
790
|
+
const missingRepositories = failedRepositories.length ? [partial(0, `Repository units not measured: ${failedRepositories.length}.`)] : [];
|
|
791
|
+
const repositoryCount = (predicateArg) => sumMeasures([complete(repositories.filter(predicateArg).length), ...missingRepositories]);
|
|
792
|
+
const organizationOwners = owners.filter((ownerArg) => ownerArg.kind === 'organization');
|
|
793
|
+
const userOwners = owners.filter((ownerArg) => ownerArg.kind === 'user');
|
|
794
|
+
const ownerSum = (measuresArg) => sumMeasures([...measuresArg, ...missingOwners]);
|
|
795
|
+
const packageTypes = new Map();
|
|
796
|
+
for (const owner of owners)
|
|
797
|
+
for (const counts of owner.packages)
|
|
798
|
+
packageTypes.set(counts.type, [...packageTypes.get(counts.type) ?? [], counts]);
|
|
799
|
+
const inventory = {
|
|
800
|
+
generators: [...generatorsArg].sort((aArg, bArg) => compareText(aArg.package, bArg.package)),
|
|
801
|
+
source: discoveryArg.source,
|
|
802
|
+
reader: discoveryArg.reader,
|
|
803
|
+
limitations: [...giteaSourceInventoryLimitations],
|
|
804
|
+
instance,
|
|
805
|
+
owners,
|
|
806
|
+
repositories,
|
|
807
|
+
totals: {
|
|
808
|
+
organizations: instance.organizations,
|
|
809
|
+
users: instance.users.total,
|
|
810
|
+
repositories: {
|
|
811
|
+
total: repositoryCount(() => true),
|
|
812
|
+
private: repositoryCount((repositoryArg) => repositoryArg.visibility === 'private'),
|
|
813
|
+
internal: repositoryCount((repositoryArg) => repositoryArg.visibility === 'internal'),
|
|
814
|
+
forks: repositoryCount((repositoryArg) => repositoryArg.fork),
|
|
815
|
+
mirrors: repositoryCount((repositoryArg) => repositoryArg.mirror),
|
|
816
|
+
templates: repositoryCount((repositoryArg) => repositoryArg.template),
|
|
817
|
+
archived: repositoryCount((repositoryArg) => repositoryArg.archived),
|
|
818
|
+
empty: repositoryCount((repositoryArg) => repositoryArg.empty),
|
|
819
|
+
withWiki: sumMeasures([...repositories.map((repositoryArg) => indicator(repositoryArg.wikiPages, (valueArg) => valueArg > 0n)), ...missingRepositories]),
|
|
820
|
+
},
|
|
821
|
+
git: sumGroup(repositories.map((repositoryArg) => repositoryArg.git), ['reportedSizeKiB', 'branches', 'tags', 'pullRequestRefs', 'otherRefs', 'objects', 'objectBytes'], missingRepositories),
|
|
822
|
+
lfs: sumGroup(repositories.map((repositoryArg) => repositoryArg.lfs), ['objects', 'bytes', 'missingObjects'], missingRepositories),
|
|
823
|
+
collaboration: sumGroup(repositories.map((repositoryArg) => repositoryArg.collaboration), ['issues', 'pullRequests', 'comments', 'reviews', 'reviewComments', 'labels', 'milestones', 'reactions', 'attachments', 'attachmentBytes'], missingRepositories),
|
|
824
|
+
releases: sumGroup(repositories.map((repositoryArg) => repositoryArg.releases), ['releases', 'drafts', 'assets', 'assetBytes'], missingRepositories),
|
|
825
|
+
wikiPages: sumMeasures([...repositories.map((repositoryArg) => repositoryArg.wikiPages), ...missingRepositories]),
|
|
826
|
+
access: sumGroup(repositories.map((repositoryArg) => repositoryArg.access), ['collaborators', 'teams', 'deployKeys', 'webhooks', 'branchProtections', 'tagProtections', 'pushMirrors'], missingRepositories),
|
|
827
|
+
actions: sumGroup(repositories.map((repositoryArg) => repositoryArg.actions), ['workflows', 'secrets', 'variables', 'runners', 'runs', 'artifacts', 'artifactBytes'], missingRepositories),
|
|
828
|
+
owners: {
|
|
829
|
+
webhooks: ownerSum(owners.map((ownerArg) => ownerArg.webhooks)),
|
|
830
|
+
actionsSecrets: ownerSum(organizationOwners.map((ownerArg) => ownerArg.actionsSecrets)),
|
|
831
|
+
actionsVariables: ownerSum(owners.map((ownerArg) => ownerArg.actionsVariables)),
|
|
832
|
+
runners: ownerSum(owners.map((ownerArg) => ownerArg.runners)),
|
|
833
|
+
members: ownerSum(organizationOwners.map((ownerArg) => ownerArg.members)),
|
|
834
|
+
teams: ownerSum(organizationOwners.map((ownerArg) => ownerArg.teams)),
|
|
835
|
+
teamMemberships: ownerSum(organizationOwners.map((ownerArg) => ownerArg.teamMemberships)),
|
|
836
|
+
teamRepositoryGrants: ownerSum(organizationOwners.map((ownerArg) => ownerArg.teamRepositoryGrants)),
|
|
837
|
+
labels: ownerSum(organizationOwners.map((ownerArg) => ownerArg.labels)),
|
|
838
|
+
sshKeys: ownerSum(userOwners.map((ownerArg) => ownerArg.sshKeys)),
|
|
839
|
+
gpgKeys: ownerSum(userOwners.map((ownerArg) => ownerArg.gpgKeys)),
|
|
840
|
+
},
|
|
841
|
+
packages: [...packageTypes.entries()].sort(([aArg], [bArg]) => compareText(aArg, bArg)).map(([type, countsArg]) => ({
|
|
842
|
+
type,
|
|
843
|
+
...sumGroup(countsArg.map(({ type: _type, ...measures }) => measures), ['packages', 'versions', 'files', 'bytes'], missingOwners),
|
|
844
|
+
})),
|
|
845
|
+
},
|
|
846
|
+
};
|
|
847
|
+
// Every value that is not complete is a reason, aggregated per subject kind, path and reason.
|
|
848
|
+
const collected = [];
|
|
849
|
+
measuresOf(instance, 'instance', collected);
|
|
850
|
+
for (const owner of owners) {
|
|
851
|
+
const { name: _name, id: _id, ...measures } = owner;
|
|
852
|
+
measuresOf(measures, owner.kind, collected);
|
|
853
|
+
}
|
|
854
|
+
for (const repository of repositories)
|
|
855
|
+
measuresOf(repository, 'repository', collected);
|
|
856
|
+
for (const { path, measure } of collected) {
|
|
857
|
+
if (measure.status !== 'complete')
|
|
858
|
+
addReason(`${path}: ${measure.reason}`);
|
|
859
|
+
}
|
|
860
|
+
const incompleteReasons = [...reasons.entries()]
|
|
861
|
+
.map(([text, count]) => count > 1 ? `${text} (${count} times)` : text)
|
|
862
|
+
.sort(compareText);
|
|
863
|
+
return { ...inventory, inventoryComplete: incompleteReasons.length === 0, incompleteReasons };
|
|
864
|
+
};
|
|
865
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5naXRlYXNvdXJjZWludmVudG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuZ2l0ZWFzb3VyY2VpbnZlbnRvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxLQUFLLFNBQVMsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEtBQUssVUFBVSxNQUFNLGdDQUFnQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWhFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBb0VuRSx3R0FBd0c7QUFDeEcsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQXNCO0lBQ2hFLDhFQUE4RTtDQUMvRSxDQUFDO0FBRUYsTUFBTSxRQUFRLEdBQUcsQ0FBQyxRQUF5QixFQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN2SCxNQUFNLE9BQU8sR0FBRyxDQUFDLFdBQTRCLEVBQUUsU0FBaUIsRUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztBQUN6SyxNQUFNLFdBQVcsR0FBRyxDQUFDLFNBQWlCLEVBQVksRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0FBQ3BHLE1BQU0sWUFBWSxHQUFHLENBQUMsT0FBZSxFQUFZLEVBQUUsQ0FBQyxXQUFXLENBQUMsT0FBTyxPQUFPLGdEQUFnRCxDQUFDLENBQUM7QUFFaEksMkNBQTJDO0FBQzNDLE1BQU0sUUFBUSxHQUFHLENBQUMsVUFBb0IsRUFBVSxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO0lBQzVHLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBRTVFOzs7R0FHRztBQUNILE1BQU0sV0FBVyxHQUFHLENBQUMsV0FBdUIsRUFBWSxFQUFFO0lBQ3hELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssYUFBYSxDQUFDLENBQUM7SUFDdEYsSUFBSSxPQUFPO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDNUIsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDNUYsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQztJQUNyRixPQUFPLFVBQVUsRUFBRSxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hHLENBQUMsQ0FBQztBQUVGLE1BQU0sY0FBYyxHQUFHLENBQUMsVUFBb0IsRUFBRSxRQUFRLEdBQVcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQVksRUFBRSxDQUM1RyxVQUFVLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUUzRixxRkFBcUY7QUFDckYsTUFBTSxNQUFNLEdBQUcsQ0FBQyxRQUFpQixFQUFVLEVBQUUsQ0FBQyxRQUFRLFlBQVksVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQztBQUV0SSxNQUFNLGVBQWUsR0FBRyxDQUFDLFFBQWlCLEVBQVcsRUFBRTtJQUNyRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFNBQVM7UUFBRSxNQUFNLElBQUksVUFBVSxDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDL0YsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUcsQ0FBQyxRQUFpQixFQUFVLEVBQUU7SUFDbkQsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRCxJQUFJLEtBQUssS0FBSyxJQUFJO1FBQUUsTUFBTSxJQUFJLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQy9FLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyxDQUFDO0FBRUYsaUVBQWlFO0FBQ2pFLE1BQU0sT0FBTyxHQUFHLENBQUMsUUFBaUIsRUFBVSxFQUFFO0lBQzVDLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0MsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxNQUFNLElBQUksVUFBVSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3BGLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGLE1BQU0sZUFBZSxHQUFHLENBQUMsUUFBaUIsRUFBeUQsRUFBRTtJQUNuRyxJQUFJLFFBQVEsS0FBSyxTQUFTO1FBQUUsT0FBTyxVQUFVLENBQUM7SUFDOUMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuRCxJQUFJLFVBQVUsS0FBSyxJQUFJO1FBQUUsTUFBTSxJQUFJLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3hGLE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMsQ0FBQztBQUVGLHNGQUFzRjtBQUN0RixNQUFNLE1BQU0sR0FBRyxDQUFDLFFBQWlCLEVBQW9DLEVBQUU7SUFDckUsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLFFBQVEsS0FBSyxJQUFJO1FBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ2pGLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN6RixPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUF3QyxFQUFFLFFBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdkYsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDN0csQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNoQyxDQUFDLENBQUM7QUFFRiw0RUFBNEU7QUFDNUUsTUFBTSxlQUFlLEdBQUcsQ0FBQyxPQUFnQixFQUFFLFVBQWtCLEVBQStDLEVBQUU7SUFDNUcsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDbkYsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0FBQ25ILENBQUMsQ0FBQztBQUVGLE1BQU0sT0FBTyxHQUFHLENBQUMsT0FBYyxFQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVTtJQUNsRixDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsT0FBTyxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7QUFFNUgsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFZLEVBQUUsSUFBWSxFQUFVLEVBQUUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFbkc7Ozs7Ozs7R0FPRztBQUNILE1BQU0sT0FBTyxvQkFBb0I7SUFDdEIsUUFBUSxDQUdmO0lBQ08sVUFBVSxDQUE0QjtJQUN0QyxPQUFPLENBQXFCO0lBQ3JDLFVBQVUsR0FBOEIsSUFBSSxDQUFDO0lBQzdDLFlBQVksR0FBMkIsSUFBSSxDQUFDO0lBRTVDLFlBQVksVUFBd0M7UUFDbEQsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksT0FBTyxVQUFVLENBQUMsVUFBVSxLQUFLLFFBQVEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFO1lBQ3pILE9BQU8sVUFBVSxDQUFDLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLHlCQUF5QixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1lBQzdHLE9BQU8sVUFBVSxDQUFDLFVBQVUsS0FBSyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUMvRixNQUFNLElBQUksVUFBVSxDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHO1lBQ2IsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRLElBQUksRUFBRTtZQUNuQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVEsSUFBSSxNQUFNO1lBQ3ZDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxnQkFBZ0IsSUFBSSxNQUFNO1lBQ3ZELGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUk7WUFDakUsWUFBWSxFQUFFLFVBQVUsQ0FBQyxZQUFZLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO1NBQ3hELENBQUM7UUFDRixLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7WUFDNUIsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO1NBQy9JLEVBQUUsQ0FBQztZQUNYLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxPQUFPO2dCQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUMvSCxDQUFDO1FBQ0QsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFDLGNBQWMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbEksSUFBSSxDQUFDLFFBQVEsR0FBRztZQUNkLFVBQVUsRUFBRSxVQUFVLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLE1BQU07WUFDbEYsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsVUFBVTtTQUMzRSxDQUFDO1FBQ0YsSUFBSSxDQUFDLFVBQVUsR0FBRyxjQUFjLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNqSSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksa0JBQWtCLENBQUM7WUFDcEMsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzFCLE9BQU8sRUFBRSxFQUFFLGFBQWEsRUFBRSxTQUFTLFVBQVUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN2RCxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO1lBQ3pDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxnQkFBZ0I7U0FDMUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGtGQUFrRjtJQUNsRixJQUFXLE9BQU8sS0FBYSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUU5RCw0Q0FBNEM7SUFDNUMsSUFBVyxPQUFPO1FBQ2hCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ2xDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLG1CQUFtQixFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ2xHLE9BQU87WUFDTCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUTtZQUN0QyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUMsYUFBYTtZQUNyRCxtQkFBbUIsRUFBRSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsR0FBRyxDQUFDLG1CQUFtQjtTQUN4RSxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQXVCO1FBQzNDLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RixJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSTtZQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsbUJBQW1CLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNoRyxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ3JHLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsb0RBQW9ELENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDL0gsTUFBTSxJQUFJLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFDRCxNQUFNLGlCQUFpQixHQUFhLEVBQUUsQ0FBQztRQUN2QyxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDN0UsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUU7WUFDckQsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtZQUN2RSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDaEIsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDNUMsSUFBSSxRQUFRLENBQUMsRUFBRSxLQUFLLElBQUk7b0JBQUUsTUFBTSxJQUFJLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2dCQUM1RixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDdkIsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUNILEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLFlBQVksQ0FBQyxDQUFVLEVBQUUsQ0FBQztZQUM1SCxJQUFJLE9BQU8sQ0FBQyxPQUFPLEtBQUssSUFBSTtnQkFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLEtBQUssT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDakcsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHO1lBQ2IsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxjQUF1QixFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDNUgsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFlLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUM5RyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMvRixNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3BELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMzRixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbEcsT0FBTztZQUNMLE1BQU0sRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUU7WUFDeEcsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRTtZQUN6RCxNQUFNO1lBQ04sWUFBWSxFQUFFLFVBQVU7WUFDeEIsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztTQUN2RCxDQUFDO0lBQ0osQ0FBQztJQUVELG1HQUFtRztJQUM1RixLQUFLLENBQUMsWUFBd0I7UUFDbkMsT0FBTztZQUNMLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUNwQixHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbkgsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsRUFBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQzNJLENBQUM7SUFDSixDQUFDO0lBRUQsZ0dBQWdHO0lBQ3pGLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBYyxFQUFFLFNBQXVCO1FBQzlELElBQUksQ0FBQztZQUNILElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxVQUFVO2dCQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN4RyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQzdCLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsU0FBUyxLQUFLLGNBQWMsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDeEssQ0FBQztZQUNELE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDNUcsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNsRSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQWlCLEVBQUUsVUFBVSxHQUErQixFQUFFO1FBQ3RGLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLFdBQVcsR0FBRyxDQUFDLElBQUksV0FBVyxHQUFHLEVBQUU7WUFBRSxNQUFNLElBQUksVUFBVSxDQUFDLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0ksTUFBTSxPQUFPLEdBQWtCLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxRCxpRkFBaUY7UUFDakYsTUFBTSxVQUFVLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUN6QyxNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdkMsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFLE9BQU87WUFBRSxLQUFLLEVBQUUsQ0FBQztRQUN4QyxVQUFVLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNwRSxJQUFJLE9BQU8sR0FBOEIsSUFBSSxDQUFDO1FBQzlDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNiLE1BQU0sTUFBTSxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQ3hCLE9BQU8sT0FBTyxLQUFLLElBQUksSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNsRCxNQUFNLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDO29CQUNILElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPO3dCQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsQ0FBQztvQkFDM0YsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzFFLElBQUksT0FBTyxLQUFLLElBQUk7d0JBQUUsT0FBTztvQkFDN0IsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU87d0JBQUUsTUFBTSxJQUFJLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29CQUMzRixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDO29CQUN4QixNQUFNLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDdEMsQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO29CQUN0QixLQUFLLEVBQUUsQ0FBQztnQkFDVixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQztRQUNGLElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDNUYsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsVUFBVSxDQUFDLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekQsQ0FBQztRQUNELElBQUksT0FBTyxLQUFLLElBQUk7WUFBRSxNQUFPLE9BQThCLENBQUMsS0FBSyxDQUFDO1FBQ2xFLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQXVCO1FBQ3JDLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN0RSxNQUFNLE9BQU8sR0FBRyxDQUFDLFlBQTJELEVBQVksRUFBRSxDQUFDLGNBQWMsQ0FDdkcsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbkcsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLHdCQUF3QixFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDckYsT0FBTztZQUNMLEtBQUssRUFBRTtnQkFDTCxLQUFLLEVBQUUsY0FBYyxDQUFDLEtBQUssQ0FBQztnQkFDNUIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDN0QsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDL0QsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDckUsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDNUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxDQUFDO2dCQUNqRixTQUFTLEVBQUUsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUM7YUFDdkc7WUFDRCxhQUFhLEVBQUUsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUN0RSxjQUFjLEVBQUUsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDaEcsT0FBTztZQUNQLHFCQUFxQixFQUFFLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztTQUNwRixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBZSxFQUFFLFNBQWtDLEVBQUUsbUJBQTJCLEVBQUUsU0FBdUI7UUFDeEgsT0FBTztZQUNMLElBQUksRUFBRSxPQUFPO1lBQ2IsRUFBRSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNwQyxVQUFVLEVBQUUsZUFBZSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7WUFDakQsWUFBWSxFQUFFLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUMzRSxRQUFRLEVBQUUsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUM7U0FDbkQsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQWUsRUFBRSxTQUF1QjtRQUMxRCxNQUFNLElBQUksR0FBRyxTQUFTLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDcEQsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVGLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxPQUFPO1lBQUUsTUFBTSxJQUFJLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQy9HLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDdkUsTUFBTSxXQUFXLEdBQWUsRUFBRSxDQUFDO1FBQ25DLE1BQU0sTUFBTSxHQUFlLEVBQUUsQ0FBQztRQUM5QixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMvQixNQUFNLFFBQVEsR0FBRyxVQUFVLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzVFLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsUUFBUSxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xGLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsUUFBUSxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFDRCxNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0MsTUFBTSxTQUFTLEdBQUcsQ0FBQyxXQUF1QixFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLFdBQVcsRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxPQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFKLE9BQU87WUFDTCxJQUFJLEVBQUUsY0FBYztZQUNwQixHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsSUFBSSxRQUFRLEVBQUUsU0FBUyxDQUFDO1lBQzNFLFFBQVEsRUFBRSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUNuRSxnQkFBZ0IsRUFBRSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLG9CQUFvQixFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO1lBQ3ZGLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLGtCQUFrQixFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO1lBQzlFLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUNwRSxLQUFLLEVBQUUsWUFBWTtZQUNuQixlQUFlLEVBQUUsU0FBUyxDQUFDLFdBQVcsQ0FBQztZQUN2QyxvQkFBb0IsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDO1lBQ3ZDLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUNsRSxjQUFjLEVBQUUsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztTQUNwRixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBZSxFQUFFLFNBQXVCO1FBQ2xELE1BQU0sSUFBSSxHQUFHLFVBQVUsa0JBQWtCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNyRCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEYsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLE9BQU87WUFBRSxNQUFNLElBQUksVUFBVSxDQUFDLG1CQUFtQixDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDeEcsZ0dBQWdHO1FBQ2hHLE1BQU0sSUFBSSxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDbEQsT0FBTztZQUNMLElBQUksRUFBRSxNQUFNO1lBQ1osR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksUUFBUSxFQUFFLFNBQVMsQ0FBQztZQUNuRSxPQUFPLEVBQUU7Z0JBQ1AsS0FBSyxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNyQyxNQUFNLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7Z0JBQ3BDLFVBQVUsRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFDNUMsYUFBYSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO2dCQUNuRCxZQUFZLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRzthQUN6RDtZQUNELFFBQVEsRUFBRSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQztZQUNoRCxnQkFBZ0IsRUFBRSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMseUJBQXlCLEVBQUUsSUFBSSxDQUFDO1lBQ3BFLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxDQUFDO1lBQzNELE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUNqRSxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUM7U0FDdEUsQ0FBQztJQUNKLENBQUM7SUFFRCw0REFBNEQ7SUFDNUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFnQixFQUFFLFNBQXVCO1FBQ3ZELE1BQU0sU0FBUyxHQUFHLGFBQWEsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUM5RCwyQ0FBMkM7UUFDM0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUEwRixDQUFDO1FBQ2pILEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEMsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QywrRkFBK0Y7WUFDL0YsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQUUsTUFBTSxJQUFJLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQzVHLE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkMsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksR0FBRyxFQUFVLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUNsRyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN4QixLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDO2dCQUNILE1BQU0sS0FBSyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUM3SSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7b0JBQUUsTUFBTSxJQUFJLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDcEYsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQWMsRUFBRSxPQUFnQixFQUFFLEVBQUUsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUMzSSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ3pDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ25GLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBc0IsRUFBRSxDQUFDLENBQUM7WUFDakksSUFBSTtZQUNKLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDO1lBQ2xFLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUM7WUFDaEUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDO1lBQ25ELEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQztTQUNwRCxDQUFDLENBQUMsQ0FBQztRQUNKLDhFQUE4RTtRQUM5RSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDckQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDckcsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQWdCLEVBQUUsT0FBZSxFQUFFLFNBQXVCO1FBQzFFLE1BQU0sSUFBSSxHQUFHLFVBQVUsa0JBQWtCLENBQUMsUUFBUSxDQUFDLElBQUksa0JBQWtCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNyRixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEYsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLE9BQU87WUFBRSxNQUFNLElBQUksVUFBVSxDQUFDLG1CQUFtQixDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDakosTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkcsSUFBSSxVQUFVLEtBQUssSUFBSTtZQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUN4RixNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLE1BQU0sUUFBUSxHQUFHO1lBQ2YsTUFBTSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ3hDLFlBQVksRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQ3JELElBQUksRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNwQyxRQUFRLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7WUFDNUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQzVDLE9BQU8sRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUMxQyxRQUFRLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7U0FDN0MsQ0FBQztRQUNGLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25JLElBQUksSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQztZQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsbUJBQW1CLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUNyRyxNQUFNLE9BQU8sR0FBRyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUN0QyxPQUFPO1lBQ0wsS0FBSyxFQUFFLFFBQVE7WUFDZixJQUFJLEVBQUUsT0FBTztZQUNiLEVBQUUsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDL0IsVUFBVTtZQUNWLElBQUk7WUFDSixNQUFNO1lBQ04sTUFBTSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3BDLFFBQVEsRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUN4QyxRQUFRLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDeEMsS0FBSztZQUNMLFlBQVksRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1lBQ3JELGFBQWEsRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUNsRCxRQUFRO1lBQ1IsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDO1lBQ3RELGFBQWEsRUFBRSxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUM7WUFDbkUsb0ZBQW9GO1lBQ3BGLFFBQVEsRUFBRSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQztZQUMvQyxTQUFTLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxhQUFhLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztZQUMvSCxNQUFNLEVBQUU7Z0JBQ04sYUFBYSxFQUFFLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksZ0JBQWdCLEVBQUUsT0FBTyxDQUFDO2dCQUNsRSxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztnQkFDakQsVUFBVSxFQUFFLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksT0FBTyxFQUFFLE9BQU8sQ0FBQztnQkFDdEQsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksUUFBUSxFQUFFLE9BQU8sQ0FBQztnQkFDckQsaUJBQWlCLEVBQUUsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxxQkFBcUIsRUFBRSxPQUFPLENBQUM7Z0JBQ2xGLGNBQWMsRUFBRSxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxJQUFJLGtCQUFrQixFQUFFLE9BQU8sQ0FBQztnQkFDNUUsV0FBVyxFQUFFLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksZUFBZSxFQUFFLE9BQU8sQ0FBQzthQUNoRTtZQUNELE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUM7U0FDckQsQ0FBQztJQUNKLENBQUM7SUFFRCxrR0FBa0c7SUFDbEcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE9BQWUsRUFBRSxVQUF3QjtRQUM5RCxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3BFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFBRSxNQUFNLElBQUksVUFBVSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ25GLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksS0FBSyxZQUFZLFVBQVUsQ0FBQyxtQkFBbUIsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFVBQVU7Z0JBQUUsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckcsT0FBTyxPQUFPLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRUQsMEdBQTBHO0lBQzFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBZ0IsRUFBRSxPQUFlLEVBQUUsT0FBZ0MsRUFBRSxTQUF1QjtRQUNyRyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN6RCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQztZQUN4QyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLO1lBQ3BHLGNBQWMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsZUFBZSxFQUFFLE9BQU87WUFDekcsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWTtZQUNyQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUztTQUNsRCxDQUFDLENBQUM7UUFDSCxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsZUFBZSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzdGLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsTUFBTSxDQUFDLFNBQXVCO1FBQzVCLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDbEksbURBQW1EO1lBQ25ELEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLEtBQUs7Z0JBQUUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUM1QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCx1RkFBdUY7SUFDdkYsSUFBSSxDQUFDLFdBQW1CO1FBQ3RCLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxrQkFBa0IsQ0FBQztZQUN6QyxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDMUIsT0FBTyxFQUFFLEVBQUUsYUFBYSxFQUFFLFNBQVMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLFdBQVcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUU7WUFDOUcsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0I7WUFDaEQsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0I7U0FDakQsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQWUsRUFBRSxXQUFvQyxFQUFFLFNBQXVCO1FBQ2pHLE1BQU0sT0FBTyxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQ3RDLDBFQUEwRTtRQUMxRSxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxPQUFPLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMvRCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxPQUFPLGFBQWEsRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdkcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDckQsc0hBQXNIO1lBQ3RILE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzdFLE9BQU87Z0JBQ0wsTUFBTSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTTtnQkFDL0YsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLE1BQU07YUFDcEYsQ0FBQztRQUNKLENBQUM7UUFDRCxzRUFBc0U7UUFDdEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxTQUFTLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlGLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUMvRSxJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksV0FBVyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDM0MsTUFBTSxTQUFTLEdBQWUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sT0FBTyxHQUFlLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQztRQUM1QyxNQUFNLGNBQWMsR0FBZSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7UUFDbkQsS0FBSyxNQUFNLE9BQU8sSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkMsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4QyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMvQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQztZQUM3RSxJQUFJLE1BQU07Z0JBQUUsU0FBUyxFQUFFLENBQUM7O2dCQUFNLFVBQVUsRUFBRSxDQUFDO1lBQzNDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkMsV0FBVyxHQUFHLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDM0csU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxPQUFPLFdBQVcsTUFBTSxZQUFZLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzlHLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxVQUFVLE1BQU0sVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNwRixPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUMxQyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQWMsRUFBRSxTQUFrQixFQUFFLEVBQUUsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN0SyxjQUFjLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUMzRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sa0JBQWtCLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDekUsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDMUYsS0FBSyxNQUFNLFVBQVUsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDeEMsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM5QyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdDLFdBQVcsR0FBRyxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pILFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsT0FBTyxvQkFBb0IsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEosQ0FBQztRQUNELE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLFVBQVUsRUFBRSxHQUFHLGlCQUFpQixDQUFDLENBQUM7UUFDbkUsT0FBTztZQUNMLE1BQU0sRUFBRSxjQUFjLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQztZQUMxQyxZQUFZLEVBQUUsY0FBYyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUM7WUFDL0MsUUFBUSxFQUFFLGNBQWMsQ0FBQyxRQUFRLENBQUM7WUFDbEMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUM7WUFDN0IsY0FBYyxFQUFFLFdBQVcsQ0FBQyxjQUFjLENBQUM7WUFDM0MsTUFBTTtZQUNOLFVBQVU7WUFDVixTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUMsR0FBRyxTQUFTLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzVELFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsb0JBQW9CLENBQUMsQ0FBQztZQUNoRixlQUFlLEVBQUUsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLG9CQUFvQixDQUFDLENBQUM7U0FDckYsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQWUsRUFBRSxTQUF1QjtRQUN0RCw4Q0FBOEM7UUFDOUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNoRixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxhQUFhLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUM3QyxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNyQyxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hDLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQUUsTUFBTSxFQUFFLENBQUM7WUFDMUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN2QyxhQUFhLEdBQUcsRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuSCxDQUFDO1FBQ0QsT0FBTztZQUNMLFFBQVEsRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDO1lBQ2xDLE1BQU0sRUFBRSxjQUFjLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQztZQUN4QyxNQUFNLEVBQUUsY0FBYyxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsS0FBSyxDQUFDO1lBQ3JELFVBQVUsRUFBRSxjQUFjLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxLQUFLLENBQUM7U0FDMUQsQ0FBQztJQUNKLENBQUM7SUFFRCwwRkFBMEY7SUFDMUYsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFlLEVBQUUsUUFBaUIsRUFBRSxTQUF1QjtRQUN4RSxNQUFNLE9BQU8sR0FBRyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUN0QyxNQUFNLFFBQVEsR0FBRztZQUNmLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxPQUFPLGtCQUFrQixFQUFFLE9BQU8sQ0FBQztZQUNqRSxTQUFTLEVBQUUsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsT0FBTyxvQkFBb0IsRUFBRSxPQUFPLENBQUM7WUFDckUsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLE9BQU8sa0JBQWtCLEVBQUUsT0FBTyxDQUFDO1NBQ3BFLENBQUM7UUFDRixJQUFJLFNBQW1CLENBQUM7UUFDeEIsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLFNBQVMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxvQkFBb0IsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDOUcsU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN2SCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixTQUFTLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN4QyxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksSUFBYyxDQUFDO1FBQ25CLElBQUksQ0FBQztZQUNILG9HQUFvRztZQUNwRyxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxlQUFlLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwSSxJQUFJLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsSUFBSSxTQUFtQixDQUFDO1FBQ3hCLElBQUksYUFBdUIsQ0FBQztRQUM1QixJQUFJLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQzlHLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBYyxFQUFFLFdBQW9CLEVBQUUsRUFBRSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbkssU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNySCxhQUFhLEdBQUcsT0FBTyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0YsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixTQUFTLEdBQUcsYUFBYSxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUNELE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsQ0FBQztJQUNwRSxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBZSxFQUFFLFVBQXdCO1FBQ3RELElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDeEYsT0FBTyxPQUFPLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEgsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLE9BQU8sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQWUsRUFBRSxVQUF3QjtRQUMzRCxJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDN0QsTUFBTSxJQUFJLEdBQUcsUUFBUSxLQUFLLElBQUksSUFBSSxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUN6RSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQUUsTUFBTSxJQUFJLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNuRixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLE9BQU8sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQWUsRUFBRSxVQUF3QjtRQUNwRCxPQUFPLGNBQWMsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQWUsRUFBRSxVQUF3QjtRQUNuRCxNQUFNLEtBQUssR0FBYyxFQUFFLENBQUM7UUFDNUIsSUFBSSxZQUFZLEdBQWtCLElBQUksQ0FBQztRQUN2QyxJQUFJLEtBQUssR0FBa0IsSUFBSSxDQUFDO1FBQ2hDLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxHQUFJLElBQUksRUFBRSxFQUFFLENBQUM7WUFDNUIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRO2dCQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDO1lBQzNFLElBQUksSUFBYSxDQUFDO1lBQ2xCLElBQUksV0FBMEIsQ0FBQztZQUMvQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtvQkFDeEMsR0FBRyxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQUUsR0FBRyxVQUFVLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO2lCQUN6RyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUN4RSxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksVUFBVSxDQUFDLFdBQVc7b0JBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDdkQsV0FBVyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3RELENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxVQUFVLENBQUMsY0FBYyxJQUFJLEtBQUssWUFBWSxVQUFVLENBQUMsbUJBQW1CLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDNUgsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0JBQ2xDLENBQUM7Z0JBQ0QsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0MsQ0FBQztZQUNELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRO2dCQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxDQUFDO1lBQzVHLElBQUksV0FBVyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUN6QixJQUFJLFNBQWlCLENBQUM7Z0JBQ3RCLElBQUksQ0FBQztvQkFBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFBQyxDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxDQUFDO2dCQUFDLENBQUM7Z0JBQ3hILElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxTQUFTLEtBQUssS0FBSztvQkFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsQ0FBQztnQkFDdEYsS0FBSyxHQUFHLFNBQVMsQ0FBQztZQUNwQixDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQUUsTUFBTTtZQUM3QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZDLElBQUksU0FBUyxLQUFLLFlBQVk7Z0JBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLENBQUM7WUFDM0UsWUFBWSxHQUFHLFNBQVMsQ0FBQztZQUN6QixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDcEIsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSztnQkFBRSxNQUFNO1FBQzdELENBQUM7UUFDRCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLO1lBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztRQUNsRyxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFBSSxDQUFDLE9BQWUsRUFBRSxVQUEyRDtRQUMvRSxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxVQUFVLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDakUsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEcsTUFBTSxPQUFPLEdBQXlCLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNwRSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssU0FBUztZQUFFLE9BQU8sQ0FBQyxPQUFPLEdBQUcsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9FLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLENBQUM7Q0FDRjtBQUVELDBEQUEwRDtBQUMxRCxNQUFNLFFBQVEsR0FBRyxDQUFnRCxTQUFtQixFQUFFLE9BQTRCLEVBQUUsVUFBc0IsRUFBVSxFQUFFLENBQ3BKLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFXLENBQUM7QUFFbEosTUFBTSxTQUFTLEdBQUcsQ0FBQyxVQUFvQixFQUFFLFlBQTJDLEVBQVksRUFBRSxDQUNoRyxVQUFVLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNGLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0FBRXRJLHdEQUF3RDtBQUN4RCxNQUFNLFVBQVUsR0FBRyxDQUFDLFFBQWlCLEVBQUUsT0FBZSxFQUFFLE1BQWtELEVBQUUsRUFBRTtJQUM1RyxJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVE7UUFBRSxPQUFPO0lBQ3RELE1BQU0sS0FBSyxHQUFHLFFBQW1DLENBQUM7SUFDbEQsSUFBSSxPQUFPLEtBQUssQ0FBQyxNQUFNLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxVQUFVLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQ3RJLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFpQixFQUFFLENBQUMsQ0FBQztRQUMzRCxPQUFPO0lBQ1QsQ0FBQztJQUNELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDakQscUVBQXFFO1FBQ3JFLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFRLEtBQTRCLENBQUMsSUFBSSxLQUFLLFFBQVE7WUFDL0gsQ0FBQyxDQUFFLEtBQTBCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDM0MsVUFBVSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbkUsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLENBQ3pDLFlBQXdCLEVBQ3hCLFVBQXlCLEVBQ3pCLGFBQTJFLEVBQy9ELEVBQUU7SUFDZCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBdUIsQ0FBQztJQUMvQyxLQUFLLE1BQU0sTUFBTSxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sSUFBSSxHQUFVLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQzVHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUU7Z0JBQ3BHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pGLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUMxQyxNQUFNLFNBQVMsR0FBRyxDQUFDLE9BQWUsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzdGLEtBQUssTUFBTSxJQUFJLElBQUksWUFBWSxDQUFDLGlCQUFpQjtRQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVuRSxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQy9DLElBQUksUUFBbUIsQ0FBQztJQUN4QixJQUFJLGNBQWMsRUFBRSxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDeEMsUUFBUSxHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUM7SUFDckMsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsY0FBYyxFQUFFLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDL0osUUFBUSxHQUFHO1lBQ1QsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRTtZQUNuSixhQUFhLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxPQUFPO1NBQ2xHLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO0lBQzVCLE1BQU0sWUFBWSxHQUFhLEVBQUUsQ0FBQztJQUNsQyxLQUFLLE1BQU0sS0FBSyxJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN4QyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEcsSUFBSSxNQUFNLEVBQUUsSUFBSSxLQUFLLE9BQU87WUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNuRCxDQUFDO1lBQ0osWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUIsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO1FBQ25ILENBQUM7SUFDSCxDQUFDO0lBQ0QsTUFBTSxZQUFZLEdBQWtCLEVBQUUsQ0FBQztJQUN2QyxNQUFNLGtCQUFrQixHQUFhLEVBQUUsQ0FBQztJQUN4QyxLQUFLLE1BQU0sVUFBVSxJQUFJLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNuRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsR0FBRyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0UsSUFBSSxNQUFNLEVBQUUsSUFBSSxLQUFLLFlBQVk7WUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUNuRSxDQUFDO1lBQ0osa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNsRSxTQUFTLENBQUMsZUFBZSxNQUFNLEVBQUUsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO1FBQ2hILENBQUM7SUFDSCxDQUFDO0lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNwRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRTVHLG1GQUFtRjtJQUNuRixNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ3JELEtBQUssTUFBTSxVQUFVLElBQUksWUFBWSxDQUFDLFlBQVk7UUFBRSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbEosS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMzQixJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLFVBQVUsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzdILFNBQVMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLHNGQUFzRixDQUFDLENBQUM7UUFDakgsQ0FBQztJQUNILENBQUM7SUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDakYsS0FBSyxNQUFNLEtBQUssSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUFFLFNBQVMsQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO0lBQzlGLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsNkJBQTZCLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNuSCxNQUFNLG1CQUFtQixHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLGtDQUFrQyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUMxSSxNQUFNLGVBQWUsR0FBRyxDQUFDLFlBQXFELEVBQUUsRUFBRSxDQUNoRixXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUM1RixNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQTZFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxDQUFDO0lBQ3BLLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQXFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDO0lBQzVJLE1BQU0sUUFBUSxHQUFHLENBQUMsV0FBdUIsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxXQUFXLEVBQUUsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzlGLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUFnQyxDQUFDO0lBQzdELEtBQUssTUFBTSxLQUFLLElBQUksTUFBTTtRQUFFLEtBQUssTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLFFBQVE7WUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRWpKLE1BQU0sU0FBUyxHQUFnRTtRQUM3RSxVQUFVLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1RixNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU07UUFDM0IsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFNO1FBQzNCLFdBQVcsRUFBRSxDQUFDLEdBQUcsK0JBQStCLENBQUM7UUFDakQsUUFBUTtRQUNSLE1BQU07UUFDTixZQUFZO1FBQ1osTUFBTSxFQUFFO1lBQ04sYUFBYSxFQUFFLFFBQVEsQ0FBQyxhQUFhO1lBQ3JDLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUs7WUFDM0IsWUFBWSxFQUFFO2dCQUNaLEtBQUssRUFBRSxlQUFlLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO2dCQUNsQyxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQztnQkFDbkYsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLFVBQVUsS0FBSyxVQUFVLENBQUM7Z0JBQ3JGLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7Z0JBQzdELE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7Z0JBQ2pFLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7Z0JBQ3JFLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7Z0JBQ3BFLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7Z0JBQzlELFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLG1CQUFtQixDQUFDLENBQUM7YUFDeko7WUFDRCxHQUFHLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFDbEUsQ0FBQyxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsYUFBYSxDQUFDLEVBQUUsbUJBQW1CLENBQUM7WUFDekgsR0FBRyxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixDQUFDLEVBQUUsbUJBQW1CLENBQUM7WUFDbEksYUFBYSxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEVBQ3RGLENBQUMsUUFBUSxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLG1CQUFtQixDQUFDO1lBQ2xLLFFBQVEsRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDLEVBQUUsbUJBQW1CLENBQUM7WUFDcEosU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsbUJBQW1CLENBQUMsQ0FBQztZQUNqSCxNQUFNLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFDeEUsQ0FBQyxlQUFlLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLEVBQUUsbUJBQW1CLENBQUM7WUFDbEksT0FBTyxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQzFFLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDLEVBQUUsbUJBQW1CLENBQUM7WUFDOUcsTUFBTSxFQUFFO2dCQUNOLFFBQVEsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMvRCxjQUFjLEVBQUUsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUN2RixnQkFBZ0IsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQy9FLE9BQU8sRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM3RCxPQUFPLEVBQUUsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN6RSxLQUFLLEVBQUUsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyRSxlQUFlLEVBQUUsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUN6RixvQkFBb0IsRUFBRSxRQUFRLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFDbkcsTUFBTSxFQUFFLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDdkUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2pFLE9BQU8sRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ2xFO1lBQ0QsUUFBUSxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDbEgsSUFBSTtnQkFDSixHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUUsYUFBYSxDQUFDO2FBQ2xJLENBQUMsQ0FBQztTQUNKO0tBQ0YsQ0FBQztJQUVGLDhGQUE4RjtJQUM5RixNQUFNLFNBQVMsR0FBK0MsRUFBRSxDQUFDO0lBQ2pFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzVDLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7UUFDM0IsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLFFBQVEsRUFBRSxHQUFHLEtBQUssQ0FBQztRQUNwRCxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELEtBQUssTUFBTSxVQUFVLElBQUksWUFBWTtRQUFFLFVBQVUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZGLEtBQUssTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUMxQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssVUFBVTtZQUFFLFNBQVMsQ0FBQyxHQUFHLElBQUksS0FBSyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBQ0QsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQzdDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1NBQ3JFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQixPQUFPLEVBQUUsR0FBRyxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxDQUFDO0FBQ2hHLENBQUMsQ0FBQyJ9
|