@forestadmin/workflow-executor 1.35.8 → 1.37.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/dist/adapters/forest-server-workflow-port.d.ts +6 -2
- package/dist/adapters/forest-server-workflow-port.js +36 -3
- package/dist/adapters/run-to-available-step-mapper.js +6 -1
- package/dist/adapters/server-types.d.ts +10 -6
- package/dist/adapters/server-types.js +1 -1
- package/dist/adapters/step-outcome-to-update-step-mapper.d.ts +3 -1
- package/dist/adapters/step-outcome-to-update-step-mapper.js +9 -2
- package/dist/errors.d.ts +20 -0
- package/dist/errors.js +51 -2
- package/dist/executors/base-step-executor.d.ts +1 -0
- package/dist/executors/base-step-executor.js +20 -18
- package/dist/executors/condition-step-executor.d.ts +5 -0
- package/dist/executors/condition-step-executor.js +170 -15
- package/dist/executors/iteration-run-store.d.ts +24 -0
- package/dist/executors/iteration-run-store.js +98 -0
- package/dist/executors/load-related-record-step-executor.d.ts +7 -3
- package/dist/executors/load-related-record-step-executor.js +158 -138
- package/dist/executors/per-record-step-executor.d.ts +27 -0
- package/dist/executors/per-record-step-executor.js +369 -0
- package/dist/executors/record-step-executor.d.ts +4 -0
- package/dist/executors/record-step-executor.js +44 -22
- package/dist/executors/related-record-picker.d.ts +21 -0
- package/dist/executors/related-record-picker.js +180 -0
- package/dist/executors/step-executor-factory.d.ts +3 -1
- package/dist/executors/step-executor-factory.js +49 -1
- package/dist/executors/summary/step-execution-formatters.js +5 -4
- package/dist/executors/summary/step-summary-builder.js +23 -1
- package/dist/http/mcp-oauth-credentials.d.ts +1 -1
- package/dist/http/pending-data-validators.d.ts +2 -0
- package/dist/http/pending-data-validators.js +21 -6
- package/dist/http/step-serializer.js +54 -27
- package/dist/ports/workflow-port.d.ts +12 -1
- package/dist/runner.d.ts +1 -0
- package/dist/runner.js +52 -12
- package/dist/types/execution-context.d.ts +6 -0
- package/dist/types/step-execution-data.d.ts +65 -12
- package/dist/types/step-execution-data.js +5 -1
- package/dist/types/validated/execution.d.ts +7 -117
- package/dist/types/validated/execution.js +3 -1
- package/dist/types/validated/step-definition.d.ts +23 -117
- package/dist/types/validated/step-definition.js +21 -4
- package/package.json +1 -1
|
@@ -7,6 +7,9 @@ const ai_proxy_1 = require("@forestadmin/ai-proxy");
|
|
|
7
7
|
const zod_1 = require("zod");
|
|
8
8
|
const errors_1 = require("../errors");
|
|
9
9
|
const record_step_executor_1 = __importDefault(require("./record-step-executor"));
|
|
10
|
+
const related_record_picker_1 = require("./related-record-picker");
|
|
11
|
+
const pending_data_validators_1 = require("../http/pending-data-validators");
|
|
12
|
+
const record_id_1 = require("../record-id");
|
|
10
13
|
const step_definition_1 = require("../types/validated/step-definition");
|
|
11
14
|
const SELECT_RELATION_SYSTEM_PROMPT = `You are an AI agent loading a related record based on a user request.
|
|
12
15
|
You are given relations to follow, each shown as "<source record> → <relation> (→ <target collection>)".
|
|
@@ -17,24 +20,6 @@ Important rules:
|
|
|
17
20
|
- Pick the relation whose target collection matches the requested record.
|
|
18
21
|
- Final answer is definitive, you won't receive any other input from the user.
|
|
19
22
|
- Do not refer to yourself as "I" in the response, use a passive formulation instead.`;
|
|
20
|
-
const SELECT_FIELDS_SYSTEM_PROMPT = `You are an AI agent selecting the most relevant fields to identify a related record.
|
|
21
|
-
Choose the fields that are most useful for determining which record best matches the user request.`;
|
|
22
|
-
const SELECT_RECORD_SYSTEM_PROMPT = `You are an AI agent selecting the most relevant related record from a list of candidates.
|
|
23
|
-
Choose the record that best matches the user request based on the provided field values.`;
|
|
24
|
-
// Only appended when -1 is a valid answer. The base prompt tells the AI to always pick, so without
|
|
25
|
-
// this it forces a weak match on an impossible request instead of declining.
|
|
26
|
-
const SELECT_RECORD_NONE_ALLOWED_PROMPT = `If the request states a specific requirement that NO candidate satisfies, return -1 instead of forcing an arbitrary or loosely-related match. Do NOT return -1 merely because a match is imperfect — only when no candidate genuinely fits the request.`;
|
|
27
|
-
// Bound only what is sent to the AI in selectBestRecordIndex — the full candidate list is
|
|
28
|
-
// always returned to the front via availableRecordIds. These cap the prompt size, not the data.
|
|
29
|
-
const MAX_RELEVANT_FIELDS = 6;
|
|
30
|
-
const MAX_FIELD_VALUE_LENGTH = 80; // per-field serialized length before truncation
|
|
31
|
-
const MAX_AI_CANDIDATES_CHARS = 16000; // global budget for the `Candidates:` block (~4k tokens)
|
|
32
|
-
function clampFieldValue(value) {
|
|
33
|
-
const serialized = typeof value === 'string' ? value : JSON.stringify(value) ?? '';
|
|
34
|
-
if (serialized.length <= MAX_FIELD_VALUE_LENGTH)
|
|
35
|
-
return value;
|
|
36
|
-
return `${serialized.slice(0, MAX_FIELD_VALUE_LENGTH)}… (truncated)`;
|
|
37
|
-
}
|
|
38
23
|
// Followable = has a static target (relatedCollectionName) or is a polymorphic relation resolvable
|
|
39
24
|
// per record (polymorphicTypeField names the discriminator). The concrete target is resolved later.
|
|
40
25
|
function isFollowableRelation(field) {
|
|
@@ -49,7 +34,7 @@ class LoadRelatedRecordStepExecutor extends record_step_executor_1.default {
|
|
|
49
34
|
if (conf?.userConfirmed === undefined && conf?.fieldName !== undefined) {
|
|
50
35
|
return this.refreshCandidatesForField(pending, conf.fieldName);
|
|
51
36
|
}
|
|
52
|
-
return this.handleConfirmationFlow(pending, async (exec) => this.resolveFromSelection(exec));
|
|
37
|
+
return this.handleConfirmationFlow(pending, async (exec) => this.isMultiple ? this.resolveRecordsFromSelection(exec) : this.resolveFromSelection(exec));
|
|
53
38
|
}
|
|
54
39
|
// Branches B & C -- First call
|
|
55
40
|
return this.handleFirstCall();
|
|
@@ -58,6 +43,8 @@ class LoadRelatedRecordStepExecutor extends record_step_executor_1.default {
|
|
|
58
43
|
if (!execution.pendingData || !execution.selectedRecordRef) {
|
|
59
44
|
throw new errors_1.StepStateError(`Step at index ${this.context.stepIndex} has no pending data`);
|
|
60
45
|
}
|
|
46
|
+
if (this.isMultiple)
|
|
47
|
+
this.refuseRelationSwitch(fieldName);
|
|
61
48
|
const useAi = this.context.stepDefinition.executionType !== step_definition_1.StepExecutionMode.Manual;
|
|
62
49
|
const schema = await this.getCollectionSchema(execution.selectedRecordRef.collectionName);
|
|
63
50
|
const target = await this.buildTarget(schema, fieldName, execution.selectedRecordRef);
|
|
@@ -95,7 +82,9 @@ class LoadRelatedRecordStepExecutor extends record_step_executor_1.default {
|
|
|
95
82
|
const useAi = step.executionType !== step_definition_1.StepExecutionMode.Manual;
|
|
96
83
|
try {
|
|
97
84
|
if (step.executionType === step_definition_1.StepExecutionMode.FullyAutomated) {
|
|
98
|
-
return await this.
|
|
85
|
+
return await (this.isMultiple
|
|
86
|
+
? this.resolveAndLoadRecordsAutomatic()
|
|
87
|
+
: this.resolveAndLoadAutomatic());
|
|
99
88
|
}
|
|
100
89
|
const target = await this.resolveTarget(useAi);
|
|
101
90
|
const sourceSchema = await this.getCollectionSchema(target.selectedRecordRef.collectionName);
|
|
@@ -209,6 +198,13 @@ class LoadRelatedRecordStepExecutor extends record_step_executor_1.default {
|
|
|
209
198
|
}
|
|
210
199
|
// Save errors propagate directly — the relation-load hasn't run yet, so the step can be retried.
|
|
211
200
|
async saveAndAwaitInput(target, sourceSchema, suggestViaAi) {
|
|
201
|
+
if (this.isMultiple) {
|
|
202
|
+
const candidates = await this.collectMultipleCandidates(target, suggestViaAi);
|
|
203
|
+
return this.persistAwaitInput(target, sourceSchema, {
|
|
204
|
+
...this.multiplePendingFields(candidates),
|
|
205
|
+
suggestNoRecord: suggestViaAi && candidates.suggestedRecords?.length === 0,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
212
208
|
const { availableRecordIds, suggestedRecord } = await this.collectCandidateIds(target, suggestViaAi);
|
|
213
209
|
return this.persistAwaitInput(target, sourceSchema, {
|
|
214
210
|
availableRecordIds,
|
|
@@ -232,7 +228,9 @@ class LoadRelatedRecordStepExecutor extends record_step_executor_1.default {
|
|
|
232
228
|
availableFields: this.followableRelationFields(sourceSchema),
|
|
233
229
|
suggestedField: { name, displayName },
|
|
234
230
|
availableRecordIds: pending.availableRecordIds,
|
|
235
|
-
suggestedRecord: pending.suggestedRecord,
|
|
231
|
+
...(!this.isMultiple && { suggestedRecord: pending.suggestedRecord }),
|
|
232
|
+
...(pending.suggestedRecords && { suggestedRecords: pending.suggestedRecords }),
|
|
233
|
+
...(pending.hasMoreRecords && { hasMoreRecords: true }),
|
|
236
234
|
...(pending.suggestNoRecord && { suggestNoRecord: true }),
|
|
237
235
|
},
|
|
238
236
|
selectedRecordRef,
|
|
@@ -300,7 +298,7 @@ class LoadRelatedRecordStepExecutor extends record_step_executor_1.default {
|
|
|
300
298
|
// each candidate's referenceFieldValue label; without it Full AI's auto-load falls back to the
|
|
301
299
|
// raw recordId (AI-assisted already carries this through its await-then-confirm execution).
|
|
302
300
|
const sourceSchema = await this.getCollectionSchema(target.selectedRecordRef.collectionName);
|
|
303
|
-
return this.persistAndReturn(record, target, {
|
|
301
|
+
return this.persistAndReturn({ record }, target, {
|
|
304
302
|
type: 'load-related-record',
|
|
305
303
|
stepIndex: this.context.stepIndex,
|
|
306
304
|
pendingData: {
|
|
@@ -311,6 +309,125 @@ class LoadRelatedRecordStepExecutor extends record_step_executor_1.default {
|
|
|
311
309
|
},
|
|
312
310
|
});
|
|
313
311
|
}
|
|
312
|
+
get isMultiple() {
|
|
313
|
+
return this.context.stepDefinition.preRecordedArgs?.multiple === true;
|
|
314
|
+
}
|
|
315
|
+
// The relation a Multiple step loads is fixed once its records are offered: the run view never
|
|
316
|
+
// switches it, so a request to is refused rather than loading another relation's records.
|
|
317
|
+
refuseRelationSwitch(fieldName) {
|
|
318
|
+
throw new errors_1.StepStateError(`Step at index ${this.context.stepIndex} loads several records and cannot switch to relation "${fieldName}"`);
|
|
319
|
+
}
|
|
320
|
+
multiplePendingFields(candidates) {
|
|
321
|
+
return {
|
|
322
|
+
availableRecordIds: candidates.availableRecordIds,
|
|
323
|
+
...(candidates.suggestedRecords && { suggestedRecords: candidates.suggestedRecords }),
|
|
324
|
+
...(candidates.hasMoreRecords && { hasMoreRecords: true }),
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
// One candidate more than the list shows is fetched, so a list cut at its cap says so.
|
|
328
|
+
async collectMultipleCandidates(target, suggestViaAi) {
|
|
329
|
+
if (target.relationType === 'BelongsTo' || target.relationType === 'HasOne') {
|
|
330
|
+
const candidate = await this.fetchXToOneCandidate(target);
|
|
331
|
+
const list = candidate ? [candidate] : [];
|
|
332
|
+
return {
|
|
333
|
+
availableRecordIds: list,
|
|
334
|
+
...(suggestViaAi && { suggestedRecords: list }),
|
|
335
|
+
hasMoreRecords: false,
|
|
336
|
+
sure: list.length > 0,
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
const relatedSchema = await this.getCollectionSchema(target.relatedCollectionName);
|
|
340
|
+
const fetched = await this.fetchRelatedData(target, relatedSchema, pending_data_validators_1.MAX_SELECTED_RECORDS + 1);
|
|
341
|
+
const relatedData = fetched.slice(0, pending_data_validators_1.MAX_SELECTED_RECORDS);
|
|
342
|
+
const hasMoreRecords = fetched.length > pending_data_validators_1.MAX_SELECTED_RECORDS;
|
|
343
|
+
const referenceField = relatedSchema.referenceField ?? null;
|
|
344
|
+
const availableRecordIds = relatedData.map(r => ({
|
|
345
|
+
recordId: r.recordId,
|
|
346
|
+
referenceFieldValue: referenceField
|
|
347
|
+
? this.extractReferenceFieldValue(r.values, referenceField)
|
|
348
|
+
: null,
|
|
349
|
+
}));
|
|
350
|
+
if (!suggestViaAi || relatedData.length === 0) {
|
|
351
|
+
return { availableRecordIds, hasMoreRecords, sure: false };
|
|
352
|
+
}
|
|
353
|
+
const { prompt } = this.context.stepDefinition;
|
|
354
|
+
const fieldNames = await this.withAiAssist(() => (0, related_record_picker_1.selectRelevantFields)(this.pickerAi, relatedSchema, prompt));
|
|
355
|
+
const { indexes, confident, sawAll } = await this.withAiAssist(() => (0, related_record_picker_1.selectRelevantRecordIndexes)(this.pickerAi, relatedData, fieldNames, prompt, relatedSchema.collectionDisplayName));
|
|
356
|
+
return {
|
|
357
|
+
availableRecordIds,
|
|
358
|
+
suggestedRecords: indexes.map(index => availableRecordIds[index]),
|
|
359
|
+
hasMoreRecords,
|
|
360
|
+
sure: confident && sawAll && !hasMoreRecords && indexes.length > 0,
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
// Full AI loads its pick only when it saw every candidate and is sure, and pauses otherwise
|
|
364
|
+
// with its pick pre-checked: a pick from a cut list can leave out records no later step notices.
|
|
365
|
+
async resolveAndLoadRecordsAutomatic() {
|
|
366
|
+
const target = await this.resolveTarget(true);
|
|
367
|
+
const candidates = await this.collectMultipleCandidates(target, true);
|
|
368
|
+
if (candidates.availableRecordIds.length === 0)
|
|
369
|
+
return this.persistSkip(target);
|
|
370
|
+
const sourceSchema = await this.getCollectionSchema(target.selectedRecordRef.collectionName);
|
|
371
|
+
const pendingFields = this.multiplePendingFields(candidates);
|
|
372
|
+
if (!candidates.sure) {
|
|
373
|
+
return this.persistAwaitInput(target, sourceSchema, {
|
|
374
|
+
...pendingFields,
|
|
375
|
+
suggestNoRecord: candidates.suggestedRecords?.length === 0,
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
const records = (candidates.suggestedRecords ?? []).map(candidate => ({
|
|
379
|
+
collectionName: target.relatedCollectionName,
|
|
380
|
+
recordId: candidate.recordId,
|
|
381
|
+
stepIndex: this.context.stepIndex,
|
|
382
|
+
}));
|
|
383
|
+
return this.persistAndReturn({ records }, target, {
|
|
384
|
+
type: 'load-related-record',
|
|
385
|
+
stepIndex: this.context.stepIndex,
|
|
386
|
+
pendingData: {
|
|
387
|
+
availableFields: this.followableRelationFields(sourceSchema),
|
|
388
|
+
suggestedField: { name: target.name, displayName: target.displayName },
|
|
389
|
+
...pendingFields,
|
|
390
|
+
},
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
// Every record picked, in the order picked, each among the candidates offered.
|
|
394
|
+
async resolveRecordsFromSelection(execution) {
|
|
395
|
+
const { selectedRecordRef, pendingData, userConfirmation } = execution;
|
|
396
|
+
if (!pendingData || !selectedRecordRef) {
|
|
397
|
+
throw new errors_1.StepStateError(`Step at index ${this.context.stepIndex} has no pending data`);
|
|
398
|
+
}
|
|
399
|
+
const relationRef = pendingData.suggestedField;
|
|
400
|
+
if (userConfirmation?.fieldName !== undefined &&
|
|
401
|
+
userConfirmation.fieldName !== relationRef.name) {
|
|
402
|
+
this.refuseRelationSwitch(userConfirmation.fieldName);
|
|
403
|
+
}
|
|
404
|
+
// One record picked for a step loading several would otherwise fall back to the AI's pick.
|
|
405
|
+
if (userConfirmation?.selectedRecordId !== undefined) {
|
|
406
|
+
throw new errors_1.StepStateError(`Step at index ${this.context.stepIndex} loads several records and cannot take selectedRecordId`);
|
|
407
|
+
}
|
|
408
|
+
const picked = userConfirmation?.selectedRecordIds ??
|
|
409
|
+
pendingData.suggestedRecords?.map(candidate => candidate.recordId) ??
|
|
410
|
+
[];
|
|
411
|
+
if (picked.length === 0) {
|
|
412
|
+
throw new errors_1.RelatedRecordNotFoundError(selectedRecordRef.collectionName, relationRef.name);
|
|
413
|
+
}
|
|
414
|
+
const offered = new Set(pendingData.availableRecordIds.map(candidate => (0, record_id_1.serializeRecordId)(candidate.recordId)));
|
|
415
|
+
const notOffered = picked.find(recordId => !offered.has((0, record_id_1.serializeRecordId)(recordId)));
|
|
416
|
+
if (notOffered)
|
|
417
|
+
throw new errors_1.RecordNotOfferedError((0, record_id_1.serializeRecordId)(notOffered));
|
|
418
|
+
const schema = await this.getCollectionSchema(selectedRecordRef.collectionName);
|
|
419
|
+
const field = schema.fields.find(f => f.fieldName === relationRef.name);
|
|
420
|
+
const relatedCollectionName = field && (await this.resolveTargetCollection(field, selectedRecordRef));
|
|
421
|
+
if (!relatedCollectionName) {
|
|
422
|
+
throw new errors_1.StepStateError(`Step at index ${this.context.stepIndex} could not resolve relatedCollectionName for relation "${relationRef.name}"`);
|
|
423
|
+
}
|
|
424
|
+
const records = picked.map(recordId => ({
|
|
425
|
+
collectionName: relatedCollectionName,
|
|
426
|
+
recordId,
|
|
427
|
+
stepIndex: this.context.stepIndex,
|
|
428
|
+
}));
|
|
429
|
+
return this.persistAndReturn({ records }, { selectedRecordRef, name: relationRef.name, displayName: relationRef.displayName }, execution);
|
|
430
|
+
}
|
|
314
431
|
async fetchXToOneCandidate(target) {
|
|
315
432
|
const relatedSchema = await this.getCollectionSchema(target.relatedCollectionName);
|
|
316
433
|
const referenceField = relatedSchema.referenceField ?? null;
|
|
@@ -342,6 +459,10 @@ class LoadRelatedRecordStepExecutor extends record_step_executor_1.default {
|
|
|
342
459
|
if (!relationRef) {
|
|
343
460
|
throw new errors_1.StepStateError(`Step at index ${this.context.stepIndex} could not resolve relation "${userConfirmation?.fieldName}" from available fields`);
|
|
344
461
|
}
|
|
462
|
+
// Records picked for a step loading one would otherwise fall back to the AI's suggestion.
|
|
463
|
+
if (userConfirmation?.selectedRecordIds !== undefined) {
|
|
464
|
+
throw new errors_1.StepStateError(`Step at index ${this.context.stepIndex} loads one record and cannot take selectedRecordIds`);
|
|
465
|
+
}
|
|
345
466
|
const { name, displayName } = relationRef;
|
|
346
467
|
const selectedRecordId = userConfirmation?.selectedRecordId ?? pendingData.suggestedRecord?.recordId;
|
|
347
468
|
if (!selectedRecordId) {
|
|
@@ -360,7 +481,7 @@ class LoadRelatedRecordStepExecutor extends record_step_executor_1.default {
|
|
|
360
481
|
recordId: selectedRecordId,
|
|
361
482
|
stepIndex: this.context.stepIndex,
|
|
362
483
|
};
|
|
363
|
-
return this.persistAndReturn(record, { selectedRecordRef, name, displayName }, execution);
|
|
484
|
+
return this.persistAndReturn({ record }, { selectedRecordRef, name, displayName }, execution);
|
|
364
485
|
}
|
|
365
486
|
async selectBestFromRelatedData(target, limit,
|
|
366
487
|
// allowNone is meaningful only when ranking, so it's absent from the rank:false variant.
|
|
@@ -386,8 +507,8 @@ class LoadRelatedRecordStepExecutor extends record_step_executor_1.default {
|
|
|
386
507
|
// decline it (-1 → "No X to load") rather than auto-loading a possibly-irrelevant sole record.
|
|
387
508
|
// The final record stays AI-suggested + user-confirmed (or AI-decided in Full AI): only the
|
|
388
509
|
// source and relation are pinned deterministically, not the record index (not revise-safe).
|
|
389
|
-
const suggestedFields = await this.withAiAssist(() =>
|
|
390
|
-
const { index: bestIndex, confident } = await this.withAiAssist(() =>
|
|
510
|
+
const suggestedFields = await this.withAiAssist(() => (0, related_record_picker_1.selectRelevantFields)(this.pickerAi, relatedSchema, this.context.stepDefinition.prompt));
|
|
511
|
+
const { index: bestIndex, confident } = await this.withAiAssist(() => (0, related_record_picker_1.selectBestRecordIndex)(this.pickerAi, relatedData, suggestedFields, this.context.stepDefinition.prompt, opts.allowNone));
|
|
391
512
|
return { relatedData, bestIndex, confident, suggestedFields, relatedSchema };
|
|
392
513
|
}
|
|
393
514
|
async fetchRelatedData(target, relatedSchema, limit) {
|
|
@@ -412,18 +533,27 @@ class LoadRelatedRecordStepExecutor extends record_step_executor_1.default {
|
|
|
412
533
|
});
|
|
413
534
|
return this.buildOutcomeResult({ status: 'success' });
|
|
414
535
|
}
|
|
415
|
-
|
|
536
|
+
// One record for a Single step, several for a Multiple one.
|
|
537
|
+
async persistAndReturn(loaded, target, existingExecution) {
|
|
416
538
|
const { selectedRecordRef, name, displayName } = target;
|
|
417
539
|
await this.context.runStore.saveStepExecution(this.context.runId, {
|
|
418
540
|
...existingExecution,
|
|
419
541
|
type: 'load-related-record',
|
|
420
542
|
stepIndex: this.context.stepIndex,
|
|
421
543
|
executionParams: { displayName, name },
|
|
422
|
-
executionResult: { relation: { name, displayName },
|
|
544
|
+
executionResult: { relation: { name, displayName }, ...loaded },
|
|
423
545
|
selectedRecordRef,
|
|
424
546
|
});
|
|
425
547
|
return this.buildOutcomeResult({ status: 'success' });
|
|
426
548
|
}
|
|
549
|
+
// What the candidate ranking needs of this step: its AI, the context it gives the AI, its logs.
|
|
550
|
+
get pickerAi() {
|
|
551
|
+
return {
|
|
552
|
+
invoke: (messages, tool) => this.invokeWithTool(messages, tool),
|
|
553
|
+
contextMessage: this.buildContextMessage(),
|
|
554
|
+
warn: (message, context) => this.context.logger('Warn', message, { ...this.logCtx, ...context }),
|
|
555
|
+
};
|
|
556
|
+
}
|
|
427
557
|
relationOptionLabel(candidate) {
|
|
428
558
|
const { record, schema, field } = candidate;
|
|
429
559
|
return `Step ${record.stepIndex} - ${schema.collectionDisplayName} #${record.recordId} → ${field.displayName} (→ ${field.relatedCollectionName})`;
|
|
@@ -459,116 +589,6 @@ class LoadRelatedRecordStepExecutor extends record_step_executor_1.default {
|
|
|
459
589
|
return candidates[index];
|
|
460
590
|
});
|
|
461
591
|
}
|
|
462
|
-
/** AI call 1 for HasMany: selects the most relevant fields to compare candidates. */
|
|
463
|
-
async selectRelevantFields(schema, prompt) {
|
|
464
|
-
const nonRelationFields = schema.fields.filter(f => !f.isRelationship);
|
|
465
|
-
if (nonRelationFields.length === 0)
|
|
466
|
-
return [];
|
|
467
|
-
// Use displayName in both the enum and the prompt for consistency — the AI sees human-readable
|
|
468
|
-
// names throughout. Results are mapped back to technical fieldNames before returning.
|
|
469
|
-
const displayNames = nonRelationFields.map(f => f.displayName);
|
|
470
|
-
const tool = new ai_proxy_1.DynamicStructuredTool({
|
|
471
|
-
name: 'select-fields',
|
|
472
|
-
description: 'Select the most relevant fields to identify the right record.',
|
|
473
|
-
schema: zod_1.z.object({
|
|
474
|
-
fieldNames: zod_1.z
|
|
475
|
-
.array(zod_1.z.enum(displayNames))
|
|
476
|
-
.min(1)
|
|
477
|
-
.max(MAX_RELEVANT_FIELDS)
|
|
478
|
-
.describe(`The ${MAX_RELEVANT_FIELDS} fields most useful for identifying the relevant record`),
|
|
479
|
-
}),
|
|
480
|
-
func: undefined,
|
|
481
|
-
});
|
|
482
|
-
const messages = [
|
|
483
|
-
this.buildContextMessage(),
|
|
484
|
-
new ai_proxy_1.SystemMessage(SELECT_FIELDS_SYSTEM_PROMPT),
|
|
485
|
-
new ai_proxy_1.SystemMessage(`The related records are from the "${schema.collectionDisplayName}" collection. ` +
|
|
486
|
-
`Available fields: ${nonRelationFields.map(f => f.displayName).join(', ')}.`),
|
|
487
|
-
new ai_proxy_1.HumanMessage(`**Request**: ${prompt ?? 'Select the most relevant record.'}`),
|
|
488
|
-
];
|
|
489
|
-
const { fieldNames: selectedDisplayNames } = await this.invokeWithTool(messages, tool);
|
|
490
|
-
// Zod's .min(1) shapes the prompt but is NOT validated against the AI response.
|
|
491
|
-
// Guard explicitly to avoid silently passing all fields to selectBestRecordIndex.
|
|
492
|
-
if (selectedDisplayNames.length === 0) {
|
|
493
|
-
throw new errors_1.InvalidAIResponseError(`AI returned no field names for field selection in collection "${schema.collectionName}"`);
|
|
494
|
-
}
|
|
495
|
-
// Map display names back to technical field names — values in RecordData are keyed by fieldName.
|
|
496
|
-
// .max() shapes the prompt only (not validated against the response), so cap explicitly.
|
|
497
|
-
return selectedDisplayNames
|
|
498
|
-
.slice(0, MAX_RELEVANT_FIELDS)
|
|
499
|
-
.map(dn => nonRelationFields.find(f => f.displayName === dn)?.fieldName ?? dn);
|
|
500
|
-
}
|
|
501
|
-
async selectBestRecordIndex(candidates, fieldNames, prompt, allowNone = false) {
|
|
502
|
-
const filteredCandidates = candidates.map((c, i) => {
|
|
503
|
-
const entries = Object.entries(c.values).filter(([k]) => fieldNames.length === 0 || fieldNames.includes(k));
|
|
504
|
-
return {
|
|
505
|
-
index: i,
|
|
506
|
-
values: Object.fromEntries(entries.map(([k, v]) => [k, clampFieldValue(v)])),
|
|
507
|
-
};
|
|
508
|
-
});
|
|
509
|
-
// Bound the prompt only — the full candidate list is still returned upstream. Accumulate
|
|
510
|
-
// lines until the global budget is reached (always keep at least the first candidate).
|
|
511
|
-
const lines = [];
|
|
512
|
-
let usedChars = 0;
|
|
513
|
-
for (const c of filteredCandidates) {
|
|
514
|
-
const line = `[${c.index}] ${JSON.stringify(c.values)}`;
|
|
515
|
-
if (lines.length > 0 && usedChars + line.length > MAX_AI_CANDIDATES_CHARS)
|
|
516
|
-
break;
|
|
517
|
-
lines.push(line);
|
|
518
|
-
usedChars += line.length + 1;
|
|
519
|
-
}
|
|
520
|
-
const shown = lines.length;
|
|
521
|
-
const truncated = shown < candidates.length;
|
|
522
|
-
if (truncated) {
|
|
523
|
-
this.context.logger('Warn', 'load-related-record: candidate list truncated for AI prompt', {
|
|
524
|
-
...this.logCtx,
|
|
525
|
-
shown,
|
|
526
|
-
total: candidates.length,
|
|
527
|
-
});
|
|
528
|
-
}
|
|
529
|
-
// "None relevant" (-1) is only trustworthy when the AI saw the whole list. If it was truncated,
|
|
530
|
-
// force a pick from what was shown — otherwise a match in the unseen tail would be silently skipped.
|
|
531
|
-
const noneAllowed = allowNone && !truncated;
|
|
532
|
-
const maxIndex = shown - 1;
|
|
533
|
-
const minIndex = noneAllowed ? -1 : 0;
|
|
534
|
-
const tool = new ai_proxy_1.DynamicStructuredTool({
|
|
535
|
-
name: 'select-record-by-content',
|
|
536
|
-
description: 'Select the most relevant related record by its index.',
|
|
537
|
-
schema: zod_1.z.object({
|
|
538
|
-
recordIndex: zod_1.z
|
|
539
|
-
.number()
|
|
540
|
-
.int()
|
|
541
|
-
.min(minIndex)
|
|
542
|
-
.max(maxIndex)
|
|
543
|
-
.describe(noneAllowed
|
|
544
|
-
? `0-based index of the most relevant record (0 to ${maxIndex}), or -1 if none of the candidates is relevant`
|
|
545
|
-
: `0-based index of the most relevant record (0 to ${maxIndex})`),
|
|
546
|
-
confident: zod_1.z
|
|
547
|
-
.boolean()
|
|
548
|
-
.describe('true when one candidate clearly best matches the request; false when several ' +
|
|
549
|
-
'candidates fit similarly well and you cannot confidently single one out'),
|
|
550
|
-
reasoning: zod_1.z.string().describe('Why this record was chosen (or why none is relevant)'),
|
|
551
|
-
}),
|
|
552
|
-
func: undefined,
|
|
553
|
-
});
|
|
554
|
-
const messages = [
|
|
555
|
-
this.buildContextMessage(),
|
|
556
|
-
new ai_proxy_1.SystemMessage(SELECT_RECORD_SYSTEM_PROMPT),
|
|
557
|
-
...(noneAllowed ? [new ai_proxy_1.SystemMessage(SELECT_RECORD_NONE_ALLOWED_PROMPT)] : []),
|
|
558
|
-
new ai_proxy_1.SystemMessage(`Candidates:\n${lines.join('\n')}`),
|
|
559
|
-
new ai_proxy_1.HumanMessage(`**Request**: ${prompt ?? 'Select the most relevant record.'}`),
|
|
560
|
-
];
|
|
561
|
-
const { recordIndex, confident: rawConfident } = await this.invokeWithTool(messages, tool);
|
|
562
|
-
// The Zod .min().max() shapes the tool prompt only — NOT validated against the AI response; this
|
|
563
|
-
// guard is the sole runtime enforcement. -1 is accepted only when noneAllowed (allowNone && !truncated).
|
|
564
|
-
if (!Number.isInteger(recordIndex) || recordIndex < minIndex || recordIndex > maxIndex) {
|
|
565
|
-
throw new errors_1.InvalidAIResponseError(`AI selected record index ${recordIndex} which is out of range (${minIndex}-${maxIndex}) or not an integer`);
|
|
566
|
-
}
|
|
567
|
-
// A definitive -1 ("none relevant") is not ambiguity. For a positive pick, honour the AI's
|
|
568
|
-
// confidence flag, defaulting to confident when omitted so a missing flag still auto-loads.
|
|
569
|
-
const confident = recordIndex < 0 ? true : rawConfident !== false;
|
|
570
|
-
return { index: recordIndex, confident };
|
|
571
|
-
}
|
|
572
592
|
}
|
|
573
593
|
exports.default = LoadRelatedRecordStepExecutor;
|
|
574
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC1yZWxhdGVkLXJlY29yZC1zdGVwLWV4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V4ZWN1dG9ycy9sb2FkLXJlbGF0ZWQtcmVjb3JkLXN0ZXAtZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFjQSxvREFBMkY7QUFDM0YsNkJBQXdCO0FBRXhCLHNDQVFtQjtBQUNuQixrRkFBd0Q7QUFDeEQsd0VBQXVFO0FBRXZFLE1BQU0sNkJBQTZCLEdBQUc7Ozs7Ozs7O3NGQVFnRCxDQUFDO0FBRXZGLE1BQU0sMkJBQTJCLEdBQUc7bUdBQytELENBQUM7QUFFcEcsTUFBTSwyQkFBMkIsR0FBRzt5RkFDcUQsQ0FBQztBQUUxRixtR0FBbUc7QUFDbkcsNkVBQTZFO0FBQzdFLE1BQU0saUNBQWlDLEdBQUcseVBBQXlQLENBQUM7QUFFcFMsMEZBQTBGO0FBQzFGLGdHQUFnRztBQUNoRyxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQztBQUM5QixNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQyxDQUFDLGdEQUFnRDtBQUNuRixNQUFNLHVCQUF1QixHQUFHLEtBQU0sQ0FBQyxDQUFDLHlEQUF5RDtBQUVqRyxTQUFTLGVBQWUsQ0FBQyxLQUFjO0lBQ3JDLE1BQU0sVUFBVSxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNuRixJQUFJLFVBQVUsQ0FBQyxNQUFNLElBQUksc0JBQXNCO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFOUQsT0FBTyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLGVBQWUsQ0FBQztBQUN2RSxDQUFDO0FBaUJELG1HQUFtRztBQUNuRyxvR0FBb0c7QUFDcEcsU0FBUyxvQkFBb0IsQ0FBQyxLQUFrQjtJ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
|
|
594
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC1yZWxhdGVkLXJlY29yZC1zdGVwLWV4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V4ZWN1dG9ycy9sb2FkLXJlbGF0ZWQtcmVjb3JkLXN0ZXAtZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFlQSxvREFBMkY7QUFDM0YsNkJBQXdCO0FBRXhCLHNDQVNtQjtBQUNuQixrRkFBd0Q7QUFDeEQsbUVBSWlDO0FBQ2pDLDZFQUF1RTtBQUN2RSw0Q0FBaUQ7QUFDakQsd0VBQXVFO0FBRXZFLE1BQU0sNkJBQTZCLEdBQUc7Ozs7Ozs7O3NGQVFnRCxDQUFDO0FBaUJ2RixtR0FBbUc7QUFDbkcsb0dBQW9HO0FBQ3BHLFNBQVMsb0JBQW9CLENBQUMsS0FBa0I7SUFDOUMsT0FBTyxLQUFLLENBQUMsY0FBYyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMscUJBQXFCLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDcEcsQ0FBQztBQVdELE1BQXFCLDZCQUE4QixTQUFRLDhCQUFtRDtJQUNsRyxLQUFLLENBQUMsU0FBUztRQUN2QixpRUFBaUU7UUFDakUsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQ2xELElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQ2pDLENBQUM7UUFFRixJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDO1lBRXRDLElBQUksSUFBSSxFQUFFLGFBQWEsS0FBSyxTQUFTLElBQUksSUFBSSxFQUFFLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDdkUsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNqRSxDQUFDO1lBRUQsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQXFDLE9BQU8sRUFBRSxLQUFLLEVBQUMsSUFBSSxFQUFDLEVBQUUsQ0FDM0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQzNGLENBQUM7UUFDSixDQUFDO1FBRUQsK0JBQStCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFTyxLQUFLLENBQUMseUJBQXlCLENBQ3JDLFNBQTZDLEVBQzdDLFNBQWlCO1FBRWpCLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0QsTUFBTSxJQUFJLHVCQUFjLENBQUMsaUJBQWlCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFGLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxVQUFVO1lBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTFELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLGFBQWEsS0FBSyxtQ0FBaUIsQ0FBQyxNQUFNLENBQUM7UUFDckYsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzFGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRXRGLDJHQUEyRztRQUMzRyxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxVQUFVLENBQUM7UUFFZixJQUFJLENBQUM7WUFDSCxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLEtBQUssWUFBWSxpQ0FBd0IsQ0FBQztnQkFBRSxNQUFNLEtBQUssQ0FBQztZQUN2RSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUVELE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsR0FBRyxVQUFVLENBQUM7UUFFM0QsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtZQUNoRSxHQUFHLFNBQVM7WUFDWixnQkFBZ0IsRUFBRSxTQUFTO1lBQzNCLCtGQUErRjtZQUMvRixpR0FBaUc7WUFDakcsV0FBVyxFQUFFO2dCQUNYLGVBQWUsRUFBRSxTQUFTLENBQUMsV0FBVyxDQUFDLGVBQWU7Z0JBQ3RELGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFO2dCQUN0RSxrQkFBa0I7Z0JBQ2xCLGVBQWU7Z0JBQ2YsR0FBRyxDQUFDLFdBQVcsSUFBSSxDQUFDLGVBQWUsSUFBSSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQzthQUNsRTtTQUNGLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRU8sS0FBSyxDQUFDLGVBQWU7UUFDM0IsTUFBTSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzlDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLEtBQUssbUNBQWlCLENBQUMsTUFBTSxDQUFDO1FBRTlELElBQUksQ0FBQztZQUNILElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxtQ0FBaUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDNUQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVU7b0JBQzNCLENBQUMsQ0FBQyxJQUFJLENBQUMsOEJBQThCLEVBQUU7b0JBQ3ZDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO1lBQ3RDLENBQUM7WUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0MsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRTdGLE9BQU8sTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLGdGQUFnRjtZQUNoRixJQUFJLEtBQUssSUFBSSxLQUFLLFlBQVksaUNBQXdCLEVBQUUsQ0FBQztnQkFDdkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBRWhDLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDMUMsQ0FBQztZQUVELE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRCxtR0FBbUc7SUFDM0YsS0FBSyxDQUFDLHlCQUF5QjtRQUNyQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0MsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRTdGLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELDhGQUE4RjtJQUM5RixxRkFBcUY7SUFDckYsOEZBQThGO0lBQ3RGLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBYztRQUN4QyxNQUFNLEVBQUUsZUFBZSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUM7UUFFeEQsTUFBTSxhQUFhLEdBQ2pCLGVBQWUsRUFBRSxvQkFBb0IsS0FBSyxTQUFTO1lBQ2pELENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQzNFLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRTFDLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXJFLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksa0NBQXlCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsSUFBSSxTQUFTLENBQUMsQ0FBQztRQUNyRixDQUFDO1FBRUQscUZBQXFGO1FBQ3JGLE1BQU0sTUFBTSxHQUFHLGVBQWUsRUFBRSxZQUFZLENBQUM7UUFDN0MsTUFBTSxRQUFRLEdBQ1osTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFFM0YsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFCLHVFQUF1RTtZQUN2RSxNQUFNLElBQUksb0NBQTJCLENBQ25DLHlCQUF5QixNQUFNLDBCQUEwQixDQUMxRCxDQUFDO1FBQ0osQ0FBQztRQUVELGdHQUFnRztRQUNoRywwR0FBMEc7UUFDMUcsTUFBTSxNQUFNLEdBQ1YsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNGLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxTQUE0QjtRQUN0RCxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLFNBQVMsQ0FBQztRQUVwQyxPQUFPO1lBQ0wsaUJBQWlCLEVBQUUsTUFBTTtZQUN6QixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDOUIsSUFBSSxFQUFFLEtBQUssQ0FBQyxTQUFTO1lBQ3JCLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtZQUNoQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMscUJBQXFCO1NBQ25ELENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLHVCQUF1QixDQUFDLE9BQW9CO1FBQ3hELE1BQU0sVUFBVSxHQUF3QixFQUFFLENBQUM7UUFFM0MsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM3Qiw0Q0FBNEM7WUFDNUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRXJFLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNsQyxJQUFJLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ2hDLDRDQUE0QztvQkFDNUMsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBRWhGLDJGQUEyRjtvQkFDM0YsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO3dCQUMxQixVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDbEYsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQsZ0dBQWdHO0lBQ2hHLGtHQUFrRztJQUNsRyw4RkFBOEY7SUFDOUYsOENBQThDO0lBQ3RDLEtBQUssQ0FBQyx1QkFBdUIsQ0FDbkMsS0FBa0IsRUFDbEIsTUFBaUI7UUFFakIsSUFBSSxLQUFLLENBQUMscUJBQXFCO1lBQUUsT0FBTyxLQUFLLENBQUMscUJBQXFCLENBQUM7UUFDcEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0I7WUFBRSxPQUFPLElBQUksQ0FBQztRQUU3QyxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDO1lBQzlELFVBQVUsRUFBRSxNQUFNLENBQUMsY0FBYztZQUNqQyxFQUFFLEVBQUUsTUFBTSxDQUFDLFFBQVE7WUFDbkIsUUFBUSxFQUFFLEtBQUssQ0FBQyxTQUFTO1NBQzFCLENBQUMsQ0FBQztRQUNILE1BQU0sYUFBYSxHQUFHLE9BQU8sRUFBRSxJQUFJLENBQUM7UUFDcEMsSUFBSSxDQUFDLGFBQWE7WUFBRSxPQUFPLElBQUksQ0FBQztRQUVoQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsMkJBQTJCLElBQUksRUFBRSxDQUFDO1FBRXZELE9BQU8sQ0FDTCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLGFBQWEsQ0FBQztZQUNyQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqRSxJQUFJLENBQ0wsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsV0FBVyxDQUN2QixNQUF3QixFQUN4QixZQUFvQixFQUNwQixpQkFBNEI7UUFFNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUVsRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxNQUFNLElBQUksOEJBQXFCLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBRUQsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUUzRixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksdUJBQWMsQ0FDdEIsaUJBQWlCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUywwREFBMEQsWUFBWSxHQUFHLENBQ2pILENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTztZQUNMLGlCQUFpQjtZQUNqQixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDOUIsSUFBSSxFQUFFLEtBQUssQ0FBQyxTQUFTO1lBQ3JCLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtZQUNoQyxxQkFBcUI7U0FDdEIsQ0FBQztJQUNKLENBQUM7SUFFRCxpR0FBaUc7SUFDekYsS0FBSyxDQUFDLGlCQUFpQixDQUM3QixNQUFzQixFQUN0QixZQUE4QixFQUM5QixZQUFxQjtRQUVyQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFFOUUsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRTtnQkFDbEQsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDO2dCQUN6QyxlQUFlLEVBQUUsWUFBWSxJQUFJLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEtBQUssQ0FBQzthQUMzRSxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsTUFBTSxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUM1RSxNQUFNLEVBQ04sWUFBWSxDQUNiLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFO1lBQ2xELGtCQUFrQjtZQUNsQixlQUFlO1lBQ2Ysa0dBQWtHO1lBQ2xHLCtFQUErRTtZQUMvRSxlQUFlLEVBQUUsWUFBWSxJQUFJLENBQUMsZUFBZTtTQUNsRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sd0JBQXdCLENBQUMsWUFBOEI7UUFDN0QsT0FBTyxZQUFZLENBQUMsTUFBTTthQUN2QixNQUFNLENBQUMsb0JBQW9CLENBQUM7YUFDNUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFTyxLQUFLLENBQUMsaUJBQWlCLENBQzdCLE1BQXNCLEVBQ3RCLFlBQThCLEVBQzlCLE9BTUM7UUFFRCxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUV4RCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO1lBQ2hFLElBQUksRUFBRSxxQkFBcUI7WUFDM0IsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUztZQUNqQyxXQUFXLEVBQUU7Z0JBQ1gsZUFBZSxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxZQUFZLENBQUM7Z0JBQzVELGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBQ3JDLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxrQkFBa0I7Z0JBQzlDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRSxlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUNyRSxHQUFHLENBQUMsT0FBTyxDQUFDLGdCQUFnQixJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQy9FLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxJQUFJLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDO2dCQUN2RCxHQUFHLENBQUMsT0FBTyxDQUFDLGVBQWUsSUFBSSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQzthQUMxRDtZQUNELGlCQUFpQjtTQUNsQixDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVPLEtBQUssQ0FBQyxtQkFBbUIsQ0FDL0IsTUFBc0IsRUFDdEIsWUFBcUI7UUFRckIsSUFBSSxNQUFNLENBQUMsWUFBWSxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsWUFBWSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzVFLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTFELE9BQU8sU0FBUztnQkFDZCxDQUFDLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRTtnQkFDbkYsQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNuRCxDQUFDO1FBRUQsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxHQUN4RCxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FDbEMsTUFBTSxFQUNOLEVBQUU7UUFDRiw2RkFBNkY7UUFDN0YsNkRBQTZEO1FBQzdELFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQ2pFLENBQUM7UUFFSixJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0IsT0FBTyxFQUFFLGtCQUFrQixFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDdEQsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDO1FBQzVELE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBYSxFQUE4QixFQUFFLENBQUMsQ0FBQztZQUNsRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVE7WUFDcEIsbUJBQW1CLEVBQUUsY0FBYztnQkFDakMsQ0FBQyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQztnQkFDM0QsQ0FBQyxDQUFDLElBQUk7U0FDVCxDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ0wsa0JBQWtCLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7WUFDaEQsZUFBZSxFQUFFLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUNqRiwrRUFBK0U7WUFDL0UsU0FBUyxFQUFFLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTO1NBQ3hDLENBQUM7SUFDSixDQUFDO0lBRU8sMEJBQTBCLENBQ2hDLE1BQStCLEVBQy9CLGNBQXNCO1FBRXRCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUVqQyxPQUFPLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVPLEtBQUssQ0FBQyx1QkFBdUI7UUFDbkMsMkZBQTJGO1FBQzNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUN2RixNQUFNLEVBQ04sSUFBSSxDQUNMLENBQUM7UUFFRiw0RkFBNEY7UUFDNUYsMEVBQTBFO1FBQzFFLElBQUksa0JBQWtCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBRUQsZ0dBQWdHO1FBQ2hHLDJGQUEyRjtRQUMzRix3RkFBd0Y7UUFDeEYsSUFBSSxDQUFDLGVBQWUsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNsQyxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFN0YsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRTtnQkFDbEQsa0JBQWtCO2dCQUNsQixlQUFlO2dCQUNmLGVBQWUsRUFBRSxDQUFDLGVBQWU7YUFDbEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFjO1lBQ3hCLGNBQWMsRUFBRSxNQUFNLENBQUMscUJBQXFCO1lBQzVDLFFBQVEsRUFBRSxlQUFlLENBQUMsUUFBUTtZQUNsQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTO1NBQ2xDLENBQUM7UUFFRixtR0FBbUc7UUFDbkcsK0ZBQStGO1FBQy9GLDRGQUE0RjtRQUM1RixNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFN0YsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUU7WUFDL0MsSUFBSSxFQUFFLHFCQUFxQjtZQUMzQixTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTO1lBQ2pDLFdBQVcsRUFBRTtnQkFDWCxlQUFlLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFlBQVksQ0FBQztnQkFDNUQsY0FBYyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUU7Z0JBQ3RFLGtCQUFrQjtnQkFDbEIsZUFBZTthQUNoQjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFZLFVBQVU7UUFDcEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsUUFBUSxLQUFLLElBQUksQ0FBQztJQUN4RSxDQUFDO0lBRUQsK0ZBQStGO0lBQy9GLDBGQUEwRjtJQUNsRixvQkFBb0IsQ0FBQyxTQUFpQjtRQUM1QyxNQUFNLElBQUksdUJBQWMsQ0FDdEIsaUJBQWlCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyx5REFBeUQsU0FBUyxHQUFHLENBQzdHLENBQUM7SUFDSixDQUFDO0lBRU8scUJBQXFCLENBQUMsVUFBOEI7UUFLMUQsT0FBTztZQUNMLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxrQkFBa0I7WUFDakQsR0FBRyxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JGLEdBQUcsQ0FBQyxVQUFVLENBQUMsY0FBYyxJQUFJLEVBQUUsY0FBYyxFQUFFLElBQWEsRUFBRSxDQUFDO1NBQ3BFLENBQUM7SUFDSixDQUFDO0lBRUQsdUZBQXVGO0lBQy9FLEtBQUssQ0FBQyx5QkFBeUIsQ0FDckMsTUFBc0IsRUFDdEIsWUFBcUI7UUFFckIsSUFBSSxNQUFNLENBQUMsWUFBWSxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsWUFBWSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzVFLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFELE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBRTFDLE9BQU87Z0JBQ0wsa0JBQWtCLEVBQUUsSUFBSTtnQkFDeEIsR0FBRyxDQUFDLFlBQVksSUFBSSxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxDQUFDO2dCQUMvQyxjQUFjLEVBQUUsS0FBSztnQkFDckIsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQzthQUN0QixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ25GLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsOENBQW9CLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0YsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsOENBQW9CLENBQUMsQ0FBQztRQUMzRCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLDhDQUFvQixDQUFDO1FBQzdELE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDO1FBQzVELE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0MsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRO1lBQ3BCLG1CQUFtQixFQUFFLGNBQWM7Z0JBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUM7Z0JBQzNELENBQUMsQ0FBQyxJQUFJO1NBQ1QsQ0FBQyxDQUFDLENBQUM7UUFFSixJQUFJLENBQUMsWUFBWSxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDN0QsQ0FBQztRQUVELE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQztRQUMvQyxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQzlDLElBQUEsNENBQW9CLEVBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQzNELENBQUM7UUFDRixNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQ2xFLElBQUEsbURBQTJCLEVBQ3pCLElBQUksQ0FBQyxRQUFRLEVBQ2IsV0FBVyxFQUNYLFVBQVUsRUFDVixNQUFNLEVBQ04sYUFBYSxDQUFDLHFCQUFxQixDQUNwQyxDQUNGLENBQUM7UUFFRixPQUFPO1lBQ0wsa0JBQWtCO1lBQ2xCLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqRSxjQUFjO1lBQ2QsSUFBSSxFQUFFLFNBQVMsSUFBSSxNQUFNLElBQUksQ0FBQyxjQUFjLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDO1NBQ25FLENBQUM7SUFDSixDQUFDO0lBRUQsNEZBQTRGO0lBQzVGLGlHQUFpRztJQUN6RixLQUFLLENBQUMsOEJBQThCO1FBQzFDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFdEUsSUFBSSxVQUFVLENBQUMsa0JBQWtCLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFaEYsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzdGLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUU3RCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3JCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUU7Z0JBQ2xELEdBQUcsYUFBYTtnQkFDaEIsZUFBZSxFQUFFLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEtBQUssQ0FBQzthQUMzRCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwRSxjQUFjLEVBQUUsTUFBTSxDQUFDLHFCQUFxQjtZQUM1QyxRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVE7WUFDNUIsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUztTQUNsQyxDQUFDLENBQUMsQ0FBQztRQUVKLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFO1lBQ2hELElBQUksRUFBRSxxQkFBcUI7WUFDM0IsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUztZQUNqQyxXQUFXLEVBQUU7Z0JBQ1gsZUFBZSxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxZQUFZLENBQUM7Z0JBQzVELGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFO2dCQUN0RSxHQUFHLGFBQWE7YUFDakI7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsK0VBQStFO0lBQ3ZFLEtBQUssQ0FBQywyQkFBMkIsQ0FDdkMsU0FBNkM7UUFFN0MsTUFBTSxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLFNBQVMsQ0FBQztRQUV2RSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN2QyxNQUFNLElBQUksdUJBQWMsQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLHNCQUFzQixDQUFDLENBQUM7UUFDMUYsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxjQUFjLENBQUM7UUFFL0MsSUFDRSxnQkFBZ0IsRUFBRSxTQUFTLEtBQUssU0FBUztZQUN6QyxnQkFBZ0IsQ0FBQyxTQUFTLEtBQUssV0FBVyxDQUFDLElBQUksRUFDL0MsQ0FBQztZQUNELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBRUQsMkZBQTJGO1FBQzNGLElBQUksZ0JBQWdCLEVBQUUsZ0JBQWdCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDckQsTUFBTSxJQUFJLHVCQUFjLENBQ3RCLGlCQUFpQixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMseURBQXlELENBQ2pHLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQ1YsZ0JBQWdCLEVBQUUsaUJBQWlCO1lBQ25DLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO1lBQ2xFLEVBQUUsQ0FBQztRQUVMLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksbUNBQTBCLENBQUMsaUJBQWlCLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzRixDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQ3JCLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFBLDZCQUFpQixFQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUN2RixDQUFDO1FBQ0YsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFBLDZCQUFpQixFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RixJQUFJLFVBQVU7WUFBRSxNQUFNLElBQUksOEJBQXFCLENBQUMsSUFBQSw2QkFBaUIsRUFBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBRS9FLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEUsTUFBTSxxQkFBcUIsR0FDekIsS0FBSyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQztRQUUxRSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksdUJBQWMsQ0FDdEIsaUJBQWlCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUywwREFBMEQsV0FBVyxDQUFDLElBQUksR0FBRyxDQUNySCxDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RDLGNBQWMsRUFBRSxxQkFBcUI7WUFDckMsUUFBUTtZQUNSLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVM7U0FDbEMsQ0FBQyxDQUFDLENBQUM7UUFFSixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FDMUIsRUFBRSxPQUFPLEVBQUUsRUFDWCxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsV0FBVyxFQUFFLEVBQ25GLFNBQVMsQ0FDVixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxvQkFBb0IsQ0FDaEMsTUFBc0I7UUFFdEIsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDbkYsTUFBTSxjQUFjLEdBQUcsYUFBYSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUM7UUFFNUQsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQztZQUM5RCxVQUFVLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGNBQWM7WUFDbkQsRUFBRSxFQUFFLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRO1lBQ3JDLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSTtZQUNyQixhQUFhO1lBQ2IsR0FBRyxDQUFDLGNBQWMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7U0FDcEQsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUU1QixPQUFPO1lBQ0wsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRO1lBQzVCLG1CQUFtQixFQUFFLGNBQWM7Z0JBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUM7Z0JBQ25FLENBQUMsQ0FBQyxJQUFJO1NBQ1QsQ0FBQztJQUNKLENBQUM7SUFFRCxrR0FBa0c7SUFDMUYsS0FBSyxDQUFDLG9CQUFvQixDQUNoQyxTQUE2QztRQUU3QyxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLEdBQUcsU0FBUyxDQUFDO1FBRXZFLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sSUFBSSx1QkFBYyxDQUFDLGlCQUFpQixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsc0JBQXNCLENBQUMsQ0FBQztRQUMxRixDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLEVBQUUsU0FBUztZQUM3QyxDQUFDLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztZQUM5RSxDQUFDLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQztRQUUvQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLHVCQUFjLENBQ3RCLGlCQUFpQixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsZ0NBQWdDLGdCQUFnQixFQUFFLFNBQVMseUJBQXlCLENBQzVILENBQUM7UUFDSixDQUFDO1FBRUQsMEZBQTBGO1FBQzFGLElBQUksZ0JBQWdCLEVBQUUsaUJBQWlCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdEQsTUFBTSxJQUFJLHVCQUFjLENBQ3RCLGlCQUFpQixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMscURBQXFELENBQzdGLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsR0FBRyxXQUFXLENBQUM7UUFDMUMsTUFBTSxnQkFBZ0IsR0FDcEIsZ0JBQWdCLEVBQUUsZ0JBQWdCLElBQUksV0FBVyxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUM7UUFFOUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLG1DQUEwQixDQUFDLGlCQUFpQixDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMvRSxDQUFDO1FBRUQsK0ZBQStGO1FBQy9GLHNGQUFzRjtRQUN0RixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNoRixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDNUQsTUFBTSxxQkFBcUIsR0FDekIsS0FBSyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQztRQUUxRSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksdUJBQWMsQ0FDdEIsaUJBQWlCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUywwREFBMEQsSUFBSSxHQUFHLENBQ3pHLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQWM7WUFDeEIsY0FBYyxFQUFFLHFCQUFxQjtZQUNyQyxRQUFRLEVBQUUsZ0JBQWdCO1lBQzFCLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVM7U0FDbEMsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUVPLEtBQUssQ0FBQyx5QkFBeUIsQ0FDckMsTUFBb0YsRUFDcEYsS0FBYTtJQUNiLHlGQUF5RjtJQUN6RixPQUE2RCxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRTtRQVU3RixNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNuRixNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRTlFLGtEQUFrRDtRQUNsRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxDQUFDO1FBQzdGLENBQUM7UUFFRCw4RkFBOEY7UUFDOUYseURBQXlEO1FBQ3pELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZixPQUFPO2dCQUNMLFdBQVc7Z0JBQ1gsU0FBUyxFQUFFLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUMsU0FBUyxFQUFFLElBQUk7Z0JBQ2YsZUFBZSxFQUFFLEVBQUU7Z0JBQ25CLGFBQWE7YUFDZCxDQUFDO1FBQ0osQ0FBQztRQUVELDRGQUE0RjtRQUM1RiwrRkFBK0Y7UUFFL0YsNEZBQTRGO1FBQzVGLDRGQUE0RjtRQUM1RixNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQ25ELElBQUEsNENBQW9CLEVBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQ3ZGLENBQUM7UUFDRixNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQ25FLElBQUEsNkNBQXFCLEVBQ25CLElBQUksQ0FBQyxRQUFRLEVBQ2IsV0FBVyxFQUNYLGVBQWUsRUFDZixJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQ2xDLElBQUksQ0FBQyxTQUFTLENBQ2YsQ0FDRixDQUFDO1FBRUYsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsQ0FBQztJQUMvRSxDQUFDO0lBRU8sS0FBSyxDQUFDLGdCQUFnQixDQUM1QixNQUEwRCxFQUMxRCxhQUErQixFQUMvQixLQUFhO1FBRWIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7WUFDdkMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjO1lBQ25ELEVBQUUsRUFBRSxNQUFNLENBQUMsaUJBQWlCLENBQUMsUUFBUTtZQUNyQyxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDckIsYUFBYTtZQUNiLEtBQUs7WUFDTCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLE9BQU87U0FDOUQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxXQUFXLENBQ3ZCLE1BQTBFO1FBRTFFLDZGQUE2RjtRQUM3RixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDakIsTUFBTSxFQUNOLHdFQUF3RSxFQUN4RSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUMxQyxDQUFDO1FBRUYsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtZQUNoRSxJQUFJLEVBQUUscUJBQXFCO1lBQzNCLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVM7WUFDakMsZUFBZSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUU7WUFDdkUsZUFBZSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtZQUNsQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsaUJBQWlCO1NBQzVDLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELDREQUE0RDtJQUNwRCxLQUFLLENBQUMsZ0JBQWdCLENBQzVCLE1BQXdELEVBQ3hELE1BQTBFLEVBQzFFLGlCQUFpRTtRQUVqRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUV4RCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO1lBQ2hFLEdBQUcsaUJBQWlCO1lBQ3BCLElBQUksRUFBRSxxQkFBcUI7WUFDM0IsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUztZQUNqQyxlQUFlLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO1lBQ3RDLGVBQWUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsRUFBRSxHQUFHLE1BQU0sRUFBRTtZQUMvRCxpQkFBaUI7U0FDbEIsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsZ0dBQWdHO0lBQ2hHLElBQVksUUFBUTtRQUNsQixPQUFPO1lBQ0wsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDO1lBQy9ELGNBQWMsRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDMUMsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQztTQUN2RSxDQUFDO0lBQ0osQ0FBQztJQUVPLG1CQUFtQixDQUFDLFNBQTRCO1FBQ3RELE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLFNBQVMsQ0FBQztRQUU1QyxPQUFPLFFBQVEsTUFBTSxDQUFDLFNBQVMsTUFBTSxNQUFNLENBQUMscUJBQXFCLEtBQUssTUFBTSxDQUFDLFFBQVEsTUFBTSxLQUFLLENBQUMsV0FBVyxPQUFPLEtBQUssQ0FBQyxxQkFBcUIsR0FBRyxDQUFDO0lBQ3BKLENBQUM7SUFFTyxLQUFLLENBQUMsc0JBQXNCLENBQ2xDLFVBQStCO1FBRS9CLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRSxNQUFNLFVBQVUsR0FBRyxNQUErQixDQUFDO1FBRW5ELE1BQU0sSUFBSSxHQUFHLElBQUksZ0NBQXFCLENBQUM7WUFDckMsSUFBSSxFQUFFLDJCQUEyQjtZQUNqQyxXQUFXLEVBQUUscUVBQXFFO1lBQ2xGLE1BQU0sRUFBRSxPQUFDLENBQUMsTUFBTSxDQUFDO2dCQUNmLFFBQVEsRUFBRSxPQUFDO3FCQUNSLElBQUksQ0FBQyxVQUFVLENBQUM7cUJBQ2hCLFFBQVEsQ0FBQyw4REFBOEQsQ0FBQztnQkFDM0UsU0FBUyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsaURBQWlELENBQUM7YUFDbEYsQ0FBQztZQUNGLElBQUksRUFBRSxTQUFTO1NBQ2hCLENBQUMsQ0FBQztRQUVILE1BQU0sUUFBUSxHQUFHO1lBQ2YsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzFCLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQzVDLElBQUksd0JBQWEsQ0FBQyw2QkFBNkIsQ0FBQztZQUNoRCxJQUFJLHVCQUFZLENBQ2QsZ0JBQWdCLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLE1BQU0sSUFBSSxtQ0FBbUMsRUFBRSxDQUM1RjtTQUNGLENBQUM7UUFFRiw4RkFBOEY7UUFDOUYsMkZBQTJGO1FBQzNGLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNsQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUM1QyxRQUFRLEVBQ1IsSUFBSSxDQUNMLENBQUM7WUFFRixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRXZDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sSUFBSSwrQkFBc0IsQ0FDOUIseUJBQXlCLFFBQVEsNkNBQTZDLENBQy9FLENBQUM7WUFDSixDQUFDO1lBRUQsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFyMEJELGdEQXEwQkMifQ==
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ExecutionContext, IStepExecutor, StepExecutionResult } from '../types/execution-context';
|
|
2
|
+
import type { Step } from '../types/validated/execution';
|
|
3
|
+
export interface PerRecordSource {
|
|
4
|
+
root: Step;
|
|
5
|
+
direct: Step;
|
|
6
|
+
}
|
|
7
|
+
export default class PerRecordStepExecutor implements IStepExecutor {
|
|
8
|
+
private readonly context;
|
|
9
|
+
private readonly source;
|
|
10
|
+
private readonly createInner;
|
|
11
|
+
constructor(context: ExecutionContext, source: PerRecordSource, createInner: (context: ExecutionContext) => IStepExecutor);
|
|
12
|
+
execute(): Promise<StepExecutionResult>;
|
|
13
|
+
private run;
|
|
14
|
+
private listRecords;
|
|
15
|
+
private readRequest;
|
|
16
|
+
private runRecord;
|
|
17
|
+
private failRecord;
|
|
18
|
+
private reachesRecord;
|
|
19
|
+
private withTimeout;
|
|
20
|
+
private withoutRecordId;
|
|
21
|
+
private idOf;
|
|
22
|
+
private labelOf;
|
|
23
|
+
private persist;
|
|
24
|
+
private outcome;
|
|
25
|
+
private get logCtx();
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=per-record-step-executor.d.ts.map
|