@c9up/atlas 0.1.19 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +63 -14
- package/db.darwin-arm64.node +0 -0
- package/db.darwin-x64.node +0 -0
- package/db.linux-arm64-gnu.node +0 -0
- package/db.linux-x64-gnu.node +0 -0
- package/db.win32-x64-msvc.node +0 -0
- package/dist/AtlasProvider.d.ts +66 -7
- package/dist/AtlasProvider.d.ts.map +1 -1
- package/dist/AtlasProvider.js +205 -39
- package/dist/AtlasProvider.js.map +1 -1
- package/dist/BaseEntity.d.ts +181 -5
- package/dist/BaseEntity.d.ts.map +1 -1
- package/dist/BaseEntity.js +339 -33
- package/dist/BaseEntity.js.map +1 -1
- package/dist/BaseModel.d.ts +127 -0
- package/dist/BaseModel.d.ts.map +1 -0
- package/dist/BaseModel.js +250 -0
- package/dist/BaseModel.js.map +1 -0
- package/dist/BaseRepository.d.ts +81 -15
- package/dist/BaseRepository.d.ts.map +1 -1
- package/dist/BaseRepository.js +1433 -387
- package/dist/BaseRepository.js.map +1 -1
- package/dist/ConnectionManager.d.ts +106 -0
- package/dist/ConnectionManager.d.ts.map +1 -0
- package/dist/ConnectionManager.js +228 -0
- package/dist/ConnectionManager.js.map +1 -0
- package/dist/ModelQuery.d.ts +577 -41
- package/dist/ModelQuery.d.ts.map +1 -1
- package/dist/ModelQuery.js +2188 -291
- package/dist/ModelQuery.js.map +1 -1
- package/dist/Transaction.d.ts +71 -1
- package/dist/Transaction.d.ts.map +1 -1
- package/dist/Transaction.js +138 -24
- package/dist/Transaction.js.map +1 -1
- package/dist/adapters/NapiDbAdapter.d.ts +44 -4
- package/dist/adapters/NapiDbAdapter.d.ts.map +1 -1
- package/dist/adapters/NapiDbAdapter.js +131 -13
- package/dist/adapters/NapiDbAdapter.js.map +1 -1
- package/dist/console/contract.d.ts +62 -0
- package/dist/console/contract.d.ts.map +1 -0
- package/dist/console/contract.js +38 -0
- package/dist/console/contract.js.map +1 -0
- package/dist/console/factoryCommands.d.ts +23 -0
- package/dist/console/factoryCommands.d.ts.map +1 -0
- package/dist/console/factoryCommands.js +62 -0
- package/dist/console/factoryCommands.js.map +1 -0
- package/dist/console/migrationCommands.d.ts +78 -0
- package/dist/console/migrationCommands.d.ts.map +1 -0
- package/dist/console/migrationCommands.js +327 -0
- package/dist/console/migrationCommands.js.map +1 -0
- package/dist/console/schemaCheckCommand.d.ts +11 -17
- package/dist/console/schemaCheckCommand.d.ts.map +1 -1
- package/dist/console/schemaCheckCommand.js +21 -15
- package/dist/console/schemaCheckCommand.js.map +1 -1
- package/dist/console/schemaDumpCommand.d.ts +30 -0
- package/dist/console/schemaDumpCommand.d.ts.map +1 -0
- package/dist/console/schemaDumpCommand.js +69 -0
- package/dist/console/schemaDumpCommand.js.map +1 -0
- package/dist/console/schemaGenerateCommand.d.ts +100 -0
- package/dist/console/schemaGenerateCommand.d.ts.map +1 -0
- package/dist/console/schemaGenerateCommand.js +246 -0
- package/dist/console/schemaGenerateCommand.js.map +1 -0
- package/dist/console/seederCommands.d.ts +46 -0
- package/dist/console/seederCommands.d.ts.map +1 -0
- package/dist/console/seederCommands.js +136 -0
- package/dist/console/seederCommands.js.map +1 -0
- package/dist/decorators/entity.d.ts +50 -8
- package/dist/decorators/entity.d.ts.map +1 -1
- package/dist/decorators/entity.js +42 -2
- package/dist/decorators/entity.js.map +1 -1
- package/dist/decorators/hooks.d.ts +3 -3
- package/dist/decorators/hooks.d.ts.map +1 -1
- package/dist/decorators/hooks.js.map +1 -1
- package/dist/events.d.ts +69 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +82 -0
- package/dist/events.js.map +1 -0
- package/dist/factories.d.ts +8 -0
- package/dist/factories.d.ts.map +1 -0
- package/dist/factories.js +8 -0
- package/dist/factories.js.map +1 -0
- package/dist/index.d.ts +15 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -3
- package/dist/index.js.map +1 -1
- package/dist/lucid-schema.d.ts +15 -0
- package/dist/lucid-schema.d.ts.map +1 -0
- package/dist/lucid-schema.js +16 -0
- package/dist/lucid-schema.js.map +1 -0
- package/dist/metadata-keys.d.ts +3 -2
- package/dist/metadata-keys.d.ts.map +1 -1
- package/dist/naming/NamingStrategy.d.ts +7 -0
- package/dist/naming/NamingStrategy.d.ts.map +1 -1
- package/dist/naming/NamingStrategy.js +16 -0
- package/dist/naming/NamingStrategy.js.map +1 -1
- package/dist/orm.d.ts +14 -0
- package/dist/orm.d.ts.map +1 -0
- package/dist/orm.js +14 -0
- package/dist/orm.js.map +1 -0
- package/dist/query/DatabaseQueryBuilder.d.ts +557 -0
- package/dist/query/DatabaseQueryBuilder.d.ts.map +1 -0
- package/dist/query/DatabaseQueryBuilder.js +1798 -0
- package/dist/query/DatabaseQueryBuilder.js.map +1 -0
- package/dist/query/DmlBuilder.d.ts +62 -0
- package/dist/query/DmlBuilder.d.ts.map +1 -0
- package/dist/query/DmlBuilder.js +84 -0
- package/dist/query/DmlBuilder.js.map +1 -0
- package/dist/query/QueryBuilder.d.ts +5 -0
- package/dist/query/QueryBuilder.d.ts.map +1 -1
- package/dist/query/QueryBuilder.js +7 -0
- package/dist/query/QueryBuilder.js.map +1 -1
- package/dist/query/RawQueryBuilder.d.ts +47 -0
- package/dist/query/RawQueryBuilder.d.ts.map +1 -0
- package/dist/query/RawQueryBuilder.js +138 -0
- package/dist/query/RawQueryBuilder.js.map +1 -0
- package/dist/query/interpolate.d.ts +45 -0
- package/dist/query/interpolate.d.ts.map +1 -0
- package/dist/query/interpolate.js +51 -0
- package/dist/query/interpolate.js.map +1 -0
- package/dist/query/native.d.ts +8 -0
- package/dist/query/native.d.ts.map +1 -1
- package/dist/query/native.js +14 -0
- package/dist/query/native.js.map +1 -1
- package/dist/query/operators.d.ts +4 -0
- package/dist/query/operators.d.ts.map +1 -0
- package/dist/query/operators.js +27 -0
- package/dist/query/operators.js.map +1 -0
- package/dist/schema/Migration.d.ts +50 -3
- package/dist/schema/Migration.d.ts.map +1 -1
- package/dist/schema/Migration.js +60 -24
- package/dist/schema/Migration.js.map +1 -1
- package/dist/schema/MigrationRunner.d.ts +95 -34
- package/dist/schema/MigrationRunner.d.ts.map +1 -1
- package/dist/schema/MigrationRunner.js +523 -68
- package/dist/schema/MigrationRunner.js.map +1 -1
- package/dist/schema/Schema.d.ts +114 -0
- package/dist/schema/Schema.d.ts.map +1 -1
- package/dist/schema/Schema.js +272 -3
- package/dist/schema/Schema.js.map +1 -1
- package/dist/schema/SchemaDumper.d.ts +121 -0
- package/dist/schema/SchemaDumper.d.ts.map +1 -0
- package/dist/schema/SchemaDumper.js +365 -0
- package/dist/schema/SchemaDumper.js.map +1 -0
- package/dist/schema/Seeder.d.ts +13 -0
- package/dist/schema/Seeder.d.ts.map +1 -1
- package/dist/schema/Seeder.js +28 -5
- package/dist/schema/Seeder.js.map +1 -1
- package/dist/schema/TableBuilder.d.ts +274 -16
- package/dist/schema/TableBuilder.d.ts.map +1 -1
- package/dist/schema/TableBuilder.js +656 -52
- package/dist/schema/TableBuilder.js.map +1 -1
- package/dist/schema/catalog.d.ts +71 -0
- package/dist/schema/catalog.d.ts.map +1 -0
- package/dist/schema/catalog.js +158 -0
- package/dist/schema/catalog.js.map +1 -0
- package/dist/schema/introspect.d.ts +1 -1
- package/dist/schema/introspect.d.ts.map +1 -1
- package/dist/schema/introspect.js +26 -11
- package/dist/schema/introspect.js.map +1 -1
- package/dist/schema/types.d.ts +150 -1
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/schema/types.js +11 -0
- package/dist/schema/types.js.map +1 -1
- package/dist/seeders.d.ts +7 -0
- package/dist/seeders.d.ts.map +1 -0
- package/dist/seeders.js +7 -0
- package/dist/seeders.js.map +1 -0
- package/dist/services/db.d.ts +122 -5
- package/dist/services/db.d.ts.map +1 -1
- package/dist/services/db.js +187 -14
- package/dist/services/db.js.map +1 -1
- package/dist/testing/DatabaseCleanup.d.ts +33 -7
- package/dist/testing/DatabaseCleanup.d.ts.map +1 -1
- package/dist/testing/DatabaseCleanup.js +54 -24
- package/dist/testing/DatabaseCleanup.js.map +1 -1
- package/dist/testing/DbAssertions.d.ts +48 -0
- package/dist/testing/DbAssertions.d.ts.map +1 -0
- package/dist/testing/DbAssertions.js +80 -0
- package/dist/testing/DbAssertions.js.map +1 -0
- package/dist/testing/Factory.d.ts +166 -15
- package/dist/testing/Factory.d.ts.map +1 -1
- package/dist/testing/Factory.js +497 -23
- package/dist/testing/Factory.js.map +1 -1
- package/dist/testing/TestUtils.d.ts +49 -0
- package/dist/testing/TestUtils.d.ts.map +1 -0
- package/dist/testing/TestUtils.js +79 -0
- package/dist/testing/TestUtils.js.map +1 -0
- package/dist/testing/index.d.ts +3 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +3 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/types/relations.d.ts +31 -0
- package/dist/types/relations.d.ts.map +1 -0
- package/dist/types/relations.js +20 -0
- package/dist/types/relations.js.map +1 -0
- package/index.darwin-arm64.node +0 -0
- package/index.darwin-x64.node +0 -0
- package/index.linux-arm64-gnu.node +0 -0
- package/index.linux-x64-gnu.node +0 -0
- package/index.win32-x64-msvc.node +0 -0
- package/package.json +32 -2
- package/scripts/guard-publish.mjs +15 -0
- package/src/AtlasProvider.ts +305 -52
- package/src/BaseEntity.ts +460 -41
- package/src/BaseModel.ts +461 -0
- package/src/BaseRepository.ts +1710 -421
- package/src/ConnectionManager.ts +298 -0
- package/src/ModelQuery.ts +2998 -335
- package/src/Transaction.ts +227 -30
- package/src/adapters/NapiDbAdapter.ts +224 -17
- package/src/console/contract.ts +96 -0
- package/src/console/factoryCommands.ts +73 -0
- package/src/console/migrationCommands.ts +448 -0
- package/src/console/schemaCheckCommand.ts +26 -22
- package/src/console/schemaDumpCommand.ts +96 -0
- package/src/console/schemaGenerateCommand.ts +380 -0
- package/src/console/seederCommands.ts +174 -0
- package/src/decorators/entity.ts +71 -8
- package/src/decorators/hooks.ts +5 -3
- package/src/events.ts +117 -0
- package/src/factories.ts +10 -0
- package/src/index.ts +69 -3
- package/src/lucid-schema.ts +22 -0
- package/src/metadata-keys.ts +3 -2
- package/src/naming/NamingStrategy.ts +23 -0
- package/src/orm.ts +13 -0
- package/src/query/DatabaseQueryBuilder.ts +2724 -0
- package/src/query/DmlBuilder.ts +131 -0
- package/src/query/QueryBuilder.ts +8 -0
- package/src/query/RawQueryBuilder.ts +173 -0
- package/src/query/interpolate.ts +73 -0
- package/src/query/native.ts +29 -0
- package/src/query/operators.ts +27 -0
- package/src/schema/Migration.ts +71 -3
- package/src/schema/MigrationRunner.ts +676 -69
- package/src/schema/Schema.ts +359 -3
- package/src/schema/SchemaDumper.ts +518 -0
- package/src/schema/Seeder.ts +47 -10
- package/src/schema/TableBuilder.ts +783 -52
- package/src/schema/catalog.ts +236 -0
- package/src/schema/introspect.ts +26 -9
- package/src/schema/types.ts +137 -2
- package/src/seeders.ts +16 -0
- package/src/services/db.ts +361 -21
- package/src/testing/DatabaseCleanup.ts +78 -25
- package/src/testing/DbAssertions.ts +127 -0
- package/src/testing/Factory.ts +837 -40
- package/src/testing/TestUtils.ts +123 -0
- package/src/testing/index.ts +12 -1
- package/src/types/relations.ts +43 -0
package/dist/testing/Factory.js
CHANGED
|
@@ -13,7 +13,51 @@
|
|
|
13
13
|
*
|
|
14
14
|
* @implements MISS-18, Story 32.13
|
|
15
15
|
*/
|
|
16
|
+
import { faker } from "@faker-js/faker";
|
|
16
17
|
import { BaseRepository } from "../BaseRepository.js";
|
|
18
|
+
import { getPrimaryKey, getRelationMetadata } from "../decorators/entity.js";
|
|
19
|
+
import { getConnection } from "../services/db.js";
|
|
20
|
+
import { transaction } from "../Transaction.js";
|
|
21
|
+
const factoryInternals = new WeakMap();
|
|
22
|
+
/**
|
|
23
|
+
* Process-wide counter for stubbed primary keys (Lucid's stub id). Every
|
|
24
|
+
* `makeStubbed*` build with no explicit PK gets the next value, so stubbed
|
|
25
|
+
* instances have stable, distinct, DB-free identifiers — enough to look
|
|
26
|
+
* persisted and to key relations/serialization without a round trip.
|
|
27
|
+
*/
|
|
28
|
+
let stubIdCounter = 0;
|
|
29
|
+
/**
|
|
30
|
+
* Global stub-id generator override (Adonis Lucid `Factory.stubId`). Set via
|
|
31
|
+
* {@link Factory.stubId} when models use non-integer primary keys (uuid, etc.);
|
|
32
|
+
* receives the running counter and the instance, returns the id to assign.
|
|
33
|
+
*/
|
|
34
|
+
let globalStubId;
|
|
35
|
+
/** Keys that must never be written through a recursive merge — prototype-pollution guard. */
|
|
36
|
+
const FORBIDDEN_MERGE_KEYS = new Set(["__proto__", "constructor", "prototype"]);
|
|
37
|
+
function isPlainObject(value) {
|
|
38
|
+
if (value === null || typeof value !== "object")
|
|
39
|
+
return false;
|
|
40
|
+
const proto = Object.getPrototypeOf(value);
|
|
41
|
+
return proto === Object.prototype || proto === null;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Deep-merge `source` into `target` (Lucid `mergeRecursive`). Plain objects are
|
|
45
|
+
* merged key by key; arrays and every non-plain value replace wholesale. Returns
|
|
46
|
+
* a fresh object — neither argument is mutated. Skips prototype-pollution keys.
|
|
47
|
+
*/
|
|
48
|
+
function deepMerge(target, source) {
|
|
49
|
+
const out = { ...target };
|
|
50
|
+
for (const [key, value] of Object.entries(source)) {
|
|
51
|
+
if (FORBIDDEN_MERGE_KEYS.has(key))
|
|
52
|
+
continue;
|
|
53
|
+
const existing = out[key];
|
|
54
|
+
out[key] =
|
|
55
|
+
isPlainObject(existing) && isPlainObject(value)
|
|
56
|
+
? deepMerge(existing, value)
|
|
57
|
+
: value;
|
|
58
|
+
}
|
|
59
|
+
return out;
|
|
60
|
+
}
|
|
17
61
|
/**
|
|
18
62
|
* Define a model factory.
|
|
19
63
|
*
|
|
@@ -22,32 +66,332 @@ import { BaseRepository } from "../BaseRepository.js";
|
|
|
22
66
|
* name: 'Test User',
|
|
23
67
|
* }))
|
|
24
68
|
*/
|
|
69
|
+
/**
|
|
70
|
+
* Adonis Lucid `Factory.define(Model, callback).build()` entry point. `define`
|
|
71
|
+
* captures the model and its defaults; `build()` returns the usable factory
|
|
72
|
+
* builder. Equivalent to the one-call {@link factory} shorthand, which stays.
|
|
73
|
+
*
|
|
74
|
+
* const UserFactory = Factory.define(User, ({ faker }) => ({
|
|
75
|
+
* email: faker.internet.email(),
|
|
76
|
+
* })).build()
|
|
77
|
+
*/
|
|
78
|
+
export const Factory = {
|
|
79
|
+
define(entityClass, defaults) {
|
|
80
|
+
return { build: () => factory(entityClass, defaults) };
|
|
81
|
+
},
|
|
82
|
+
/**
|
|
83
|
+
* Override the global stub-id generator (Adonis Lucid `Factory.stubId`). Use
|
|
84
|
+
* when your models have non-integer primary keys — the callback receives the
|
|
85
|
+
* running counter and the instance and returns the id to assign. Pass
|
|
86
|
+
* `null`/nothing to restore the default incrementing integer.
|
|
87
|
+
*/
|
|
88
|
+
stubId(generator) {
|
|
89
|
+
globalStubId = generator ?? undefined;
|
|
90
|
+
},
|
|
91
|
+
};
|
|
25
92
|
export function factory(entityClass, defaults) {
|
|
26
93
|
// Persistent state — lives across calls.
|
|
27
94
|
const states = new Map();
|
|
28
95
|
// Transient state — resets after every `make`/`create`.
|
|
29
96
|
let pendingOverrides = {};
|
|
97
|
+
// Per-row overrides from `merge([...])`, applied by row index on makeMany/createMany.
|
|
98
|
+
let pendingOverridesList;
|
|
99
|
+
// `merge(callback)` mutators, applied on the built INSTANCE (with the resolved
|
|
100
|
+
// attributes) after instantiation, in call order.
|
|
101
|
+
let pendingMergeFns = [];
|
|
102
|
+
// Recursive overrides are kept apart from the shallow `pendingOverrides`
|
|
103
|
+
// because they must deep-merge into `defaults()`, which only exists at build
|
|
104
|
+
// time — a shallow spread here would clobber a whole nested object.
|
|
105
|
+
let pendingRecursive = {};
|
|
30
106
|
let pendingStates = [];
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
107
|
+
// Relations: persistent factory resolvers keyed by relation name, plus the
|
|
108
|
+
// transient `.with()` queue consumed by create()/createMany().
|
|
109
|
+
const relations = new Map();
|
|
110
|
+
let pendingWith = [];
|
|
111
|
+
// Transient `.tap()` callbacks run on the built instance before persistence.
|
|
112
|
+
// Adonis Lucid passes the model, the runtime context, and the factory builder.
|
|
113
|
+
let pendingTap = [];
|
|
114
|
+
// Transient pivot columns for the NEXT m2m `.with()` link (Adonis Lucid
|
|
115
|
+
// `.pivotAttributes()`), read by the parent factory's applyRelations. A single
|
|
116
|
+
// object applies to every linked row; an array sets per-row values.
|
|
117
|
+
let pendingPivot;
|
|
118
|
+
// Persistent custom instantiation (Adonis Lucid `.newUp`) — replaces
|
|
119
|
+
// `new Model() + setProp` when set.
|
|
120
|
+
let customNewUp;
|
|
121
|
+
// Persistent connection bound via `.client()`/`.connection()`, used when
|
|
122
|
+
// create()/createMany() are called without an explicit `db`.
|
|
123
|
+
let boundClient;
|
|
124
|
+
/** The connection to persist through: the explicit arg wins over the bound one. */
|
|
125
|
+
const resolveConnection = (db) => {
|
|
126
|
+
const conn = db ?? boundClient;
|
|
127
|
+
if (!conn) {
|
|
128
|
+
throw new Error(`Factory ${entityClass.name}: no connection — pass one to create()/createMany() or bind one with .client()/.connection().`);
|
|
129
|
+
}
|
|
130
|
+
return conn;
|
|
131
|
+
};
|
|
132
|
+
const beforeHooks = {
|
|
133
|
+
create: [],
|
|
134
|
+
makeStubbed: [],
|
|
135
|
+
};
|
|
136
|
+
// `make` has no `before` counterpart in Lucid (nothing to gate before an
|
|
137
|
+
// un-persisted build), so it lives on the after-side only.
|
|
138
|
+
const afterHooks = {
|
|
139
|
+
make: [],
|
|
140
|
+
create: [],
|
|
141
|
+
makeStubbed: [],
|
|
142
|
+
};
|
|
143
|
+
// Primary-key property, resolved once, for stub-id assignment. Same fallback
|
|
144
|
+
// as BaseRepository so a model without an explicit `@PrimaryKey` uses `id`.
|
|
145
|
+
const primaryKey = getPrimaryKey(entityClass) ?? "id";
|
|
146
|
+
/** Hydrate a fresh (not-yet-persisted) instance — or defer to `.newUp` when set. */
|
|
147
|
+
const newInstance = (data, ctx) => {
|
|
148
|
+
if (customNewUp)
|
|
149
|
+
return customNewUp(data, ctx);
|
|
150
|
+
const entity = new entityClass();
|
|
151
|
+
for (const [key, value] of Object.entries(data)) {
|
|
152
|
+
entity.setProp(key, value);
|
|
153
|
+
}
|
|
154
|
+
return entity;
|
|
155
|
+
};
|
|
156
|
+
/** Run every tap with the Lucid `(model, ctx, builder)` signature. */
|
|
157
|
+
const runTaps = (taps, entity, ctx) => {
|
|
158
|
+
for (const tap of taps)
|
|
159
|
+
tap(entity, ctx, builder);
|
|
160
|
+
};
|
|
161
|
+
/** Build a stubbed instance: hydrate, run taps, give it a stub id if none was
|
|
162
|
+
* supplied, then mark persisted so it mirrors a fetched row. Taps run before
|
|
163
|
+
* `markAsPersisted` so tapped fields land in the clean snapshot. */
|
|
164
|
+
/** Build the runtime context for a build (Adonis Lucid factory `ctx`). */
|
|
165
|
+
const makeCtx = (isStubbed) => ({
|
|
166
|
+
faker,
|
|
167
|
+
isStubbed,
|
|
168
|
+
$trx: boundClient,
|
|
169
|
+
});
|
|
170
|
+
const stub = (data, taps, mergeFns, stateNames, ctx) => {
|
|
171
|
+
const entity = newInstance(data, ctx);
|
|
172
|
+
applyMergeFns(entity, data, mergeFns, ctx);
|
|
173
|
+
applyStates(entity, stateNames, ctx);
|
|
174
|
+
runTaps(taps, entity, ctx);
|
|
175
|
+
// before('makeStubbed') runs BEFORE the stub id, so a hook can set the PK.
|
|
176
|
+
for (const hook of beforeHooks.makeStubbed)
|
|
177
|
+
hook(builder, entity, ctx);
|
|
178
|
+
// Assign a stub id only when neither the data NOR a before hook set the PK.
|
|
179
|
+
// A global `Factory.stubId` override generates it (uuid, etc.) when set.
|
|
180
|
+
if (entity[primaryKey] === undefined) {
|
|
181
|
+
const next = ++stubIdCounter;
|
|
182
|
+
entity.setProp(primaryKey, globalStubId ? globalStubId(next, entity) : next);
|
|
183
|
+
}
|
|
184
|
+
entity.markAsPersisted();
|
|
185
|
+
for (const hook of afterHooks.makeStubbed)
|
|
186
|
+
hook(builder, entity, ctx);
|
|
187
|
+
return entity;
|
|
188
|
+
};
|
|
189
|
+
const buildData = (ctx, index = 0) => {
|
|
190
|
+
let data = {
|
|
191
|
+
...defaults(ctx),
|
|
34
192
|
...pendingOverrides,
|
|
193
|
+
// Per-row array overrides (merge([...])) win over the shared object.
|
|
194
|
+
...(pendingOverridesList?.[index] ?? {}),
|
|
35
195
|
};
|
|
36
|
-
|
|
196
|
+
// Deep overrides layer on top of the shallow one so nested defaults survive.
|
|
197
|
+
if (Object.keys(pendingRecursive).length > 0) {
|
|
198
|
+
data = deepMerge(data, pendingRecursive);
|
|
199
|
+
}
|
|
200
|
+
return data;
|
|
201
|
+
};
|
|
202
|
+
/**
|
|
203
|
+
* Run `merge(callback)` mutators on the built INSTANCE (Adonis Lucid passes the
|
|
204
|
+
* model, the resolved attributes, and the context). Runs before states/taps.
|
|
205
|
+
*/
|
|
206
|
+
const applyMergeFns = (entity, attributes, mergeFns, ctx) => {
|
|
207
|
+
for (const fn of mergeFns)
|
|
208
|
+
fn(entity, attributes, ctx);
|
|
209
|
+
};
|
|
210
|
+
/**
|
|
211
|
+
* Run the named states on the built INSTANCE (Adonis Lucid). Separated from
|
|
212
|
+
* {@link buildData} because states mutate the model, not the raw attributes.
|
|
213
|
+
*/
|
|
214
|
+
const applyStates = (entity, stateNames, ctx) => {
|
|
215
|
+
for (const name of stateNames) {
|
|
37
216
|
const fn = states.get(name);
|
|
38
|
-
if (!fn)
|
|
217
|
+
if (!fn) {
|
|
39
218
|
throw new Error(`Factory state '${name}' is not defined on ${entityClass.name}Factory`);
|
|
40
|
-
|
|
219
|
+
}
|
|
220
|
+
fn(entity, ctx);
|
|
41
221
|
}
|
|
222
|
+
};
|
|
223
|
+
/** Build one raw row and clear transient state — the persistence paths
|
|
224
|
+
* (`create`/`createMany`) need the plain object, not an instance. */
|
|
225
|
+
const consumeData = (ctx) => {
|
|
226
|
+
const data = buildData(ctx);
|
|
227
|
+
resetPending();
|
|
42
228
|
return data;
|
|
43
229
|
};
|
|
230
|
+
/** Build `count` raw rows (distinct faker/Date values per row), then reset. */
|
|
231
|
+
const consumeDataMany = (count, ctx) => {
|
|
232
|
+
const rows = [];
|
|
233
|
+
for (let i = 0; i < count; i++)
|
|
234
|
+
rows.push(buildData(ctx, i));
|
|
235
|
+
resetPending();
|
|
236
|
+
return rows;
|
|
237
|
+
};
|
|
44
238
|
const resetPending = () => {
|
|
45
239
|
pendingOverrides = {};
|
|
240
|
+
pendingOverridesList = undefined;
|
|
241
|
+
pendingMergeFns = [];
|
|
242
|
+
pendingRecursive = {};
|
|
46
243
|
pendingStates = [];
|
|
244
|
+
pendingTap = [];
|
|
245
|
+
pendingPivot = undefined;
|
|
246
|
+
// Also clear queued relations, so `.with(...).make()` — which ignores
|
|
247
|
+
// relations — cannot leak them into the NEXT create() (create/createMany
|
|
248
|
+
// capture the queue before make() runs, so they are unaffected).
|
|
249
|
+
pendingWith = [];
|
|
250
|
+
};
|
|
251
|
+
/**
|
|
252
|
+
* Persist one row. With no taps this is the plain `repo.create(data)` path,
|
|
253
|
+
* untouched. With taps, the instance is built, tapped, then saved — so a tap
|
|
254
|
+
* can mutate the model before the INSERT (Adonis Lucid `.tap`). `save` on a
|
|
255
|
+
* fresh instance runs the same create hooks as `create`.
|
|
256
|
+
*/
|
|
257
|
+
const persist = async (repo, data, taps, mergeFns, stateNames, ctx) => {
|
|
258
|
+
if (taps.length === 0 &&
|
|
259
|
+
mergeFns.length === 0 &&
|
|
260
|
+
stateNames.length === 0 &&
|
|
261
|
+
beforeHooks.create.length === 0 &&
|
|
262
|
+
afterHooks.create.length === 0 &&
|
|
263
|
+
!customNewUp) {
|
|
264
|
+
return repo.create(data);
|
|
265
|
+
}
|
|
266
|
+
const entity = newInstance(data, ctx);
|
|
267
|
+
applyMergeFns(entity, data, mergeFns, ctx);
|
|
268
|
+
applyStates(entity, stateNames, ctx);
|
|
269
|
+
runTaps(taps, entity, ctx);
|
|
270
|
+
for (const hook of beforeHooks.create)
|
|
271
|
+
hook(builder, entity, ctx);
|
|
272
|
+
await repo.save(entity);
|
|
273
|
+
for (const hook of afterHooks.create)
|
|
274
|
+
hook(builder, entity, ctx);
|
|
275
|
+
return entity;
|
|
276
|
+
};
|
|
277
|
+
/**
|
|
278
|
+
* Persist a parent and its queued `.with()` relations. With relations, the
|
|
279
|
+
* whole graph runs in a managed transaction (Adonis Lucid: if a related write
|
|
280
|
+
* fails the parent insert rolls back too); the parent is created through a
|
|
281
|
+
* `useTransaction`-bound repo so its `related()` proxies also use the trx.
|
|
282
|
+
* With no relations there's nothing to make atomic — a single insert already
|
|
283
|
+
* is — so it stays on the plain connection.
|
|
284
|
+
*/
|
|
285
|
+
const persistWithRelations = async (conn, withReqs, recursive, build) => {
|
|
286
|
+
if (withReqs.length === 0) {
|
|
287
|
+
// ctx.$trx is the connection actually used to persist (an explicit
|
|
288
|
+
// create(db) client, or the bound one) — not just the bound client.
|
|
289
|
+
return build(new BaseRepository(entityClass, conn), {
|
|
290
|
+
faker,
|
|
291
|
+
isStubbed: false,
|
|
292
|
+
$trx: conn,
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
return transaction(conn, async (trx) => {
|
|
296
|
+
const repo = new BaseRepository(entityClass, conn).useTransaction(trx);
|
|
297
|
+
const entity = await build(repo, { faker, isStubbed: false, $trx: trx });
|
|
298
|
+
await applyRelations(entity, withReqs, trx, recursive);
|
|
299
|
+
return entity;
|
|
300
|
+
});
|
|
301
|
+
};
|
|
302
|
+
/**
|
|
303
|
+
* Persist the queued `.with()` relations for one just-created parent, routing
|
|
304
|
+
* through the parent's relation proxy so the FK / pivot is wired by the
|
|
305
|
+
* already-tested relation-write code (not re-derived here).
|
|
306
|
+
*/
|
|
307
|
+
const applyRelations = async (parent, reqs, db, recursive) => {
|
|
308
|
+
const meta = getRelationMetadata(entityClass);
|
|
309
|
+
const hasRecursive = recursive && Object.keys(recursive).length > 0;
|
|
310
|
+
for (const req of reqs) {
|
|
311
|
+
const relMeta = meta.find((r) => r.propertyKey === req.name);
|
|
312
|
+
if (!relMeta) {
|
|
313
|
+
throw new Error(`Factory .with('${req.name}'): '${req.name}' is not a declared relation on ${entityClass.name}`);
|
|
314
|
+
}
|
|
315
|
+
const resolver = relations.get(req.name);
|
|
316
|
+
if (!resolver) {
|
|
317
|
+
throw new Error(`Factory .with('${req.name}'): no related factory — declare it with .relation('${req.name}', () => XFactory)`);
|
|
318
|
+
}
|
|
319
|
+
const childFactory = resolver();
|
|
320
|
+
// mergeRecursive cascades the SAME overrides onto every related factory
|
|
321
|
+
// (Adonis Lucid) — applied before the callback so an explicit merge in
|
|
322
|
+
// the callback still wins.
|
|
323
|
+
if (hasRecursive && recursive)
|
|
324
|
+
childFactory.mergeRecursive(recursive);
|
|
325
|
+
if (req.callback)
|
|
326
|
+
req.callback(childFactory);
|
|
327
|
+
const childInternals = factoryInternals.get(childFactory);
|
|
328
|
+
const proxy = parent.related(req.name);
|
|
329
|
+
if (proxy.type === "belongsTo") {
|
|
330
|
+
// FK lives on the parent: create() runs the owner's OWN with-graph,
|
|
331
|
+
// then associate re-saves the parent with the FK set.
|
|
332
|
+
const owner = await childFactory.create(db);
|
|
333
|
+
await proxy.associate(owner);
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
// The proxy-persisted branches bypass the child factory's create() path,
|
|
337
|
+
// so its queued nested `.with()` must be captured before make() clears it,
|
|
338
|
+
// then recursed onto each persisted child (Adonis Lucid nested factories:
|
|
339
|
+
// `post.with('comments', 5)` inside the callback).
|
|
340
|
+
const nestedWith = childInternals?.consumeWith() ?? [];
|
|
341
|
+
// Pivot columns from a `.pivotAttributes()` in the callback — captured
|
|
342
|
+
// now, before make() clears the child's transient state.
|
|
343
|
+
const nestedPivot = childInternals?.consumePivot();
|
|
344
|
+
const recurse = async (children) => {
|
|
345
|
+
if (nestedWith.length === 0 || !childInternals)
|
|
346
|
+
return;
|
|
347
|
+
for (const child of children) {
|
|
348
|
+
// Cascade the recursive overrides further down the graph.
|
|
349
|
+
await childInternals.applyRelations(child, nestedWith, db, recursive);
|
|
350
|
+
}
|
|
351
|
+
};
|
|
352
|
+
if (proxy.type === "hasMany") {
|
|
353
|
+
await recurse(await proxy.createMany(childFactory.makeMany(req.count)));
|
|
354
|
+
}
|
|
355
|
+
else if (proxy.type === "hasOne") {
|
|
356
|
+
await recurse([await proxy.create(childFactory.make())]);
|
|
357
|
+
}
|
|
358
|
+
else if (proxy.type === "manyToMany") {
|
|
359
|
+
// The m2m proxy's create() inserts the related row AND the pivot link,
|
|
360
|
+
// with the `.pivotAttributes()` columns on the pivot row. An array of
|
|
361
|
+
// pivot attrs applies per-row (`pivot[i]`); a single object, to all.
|
|
362
|
+
const rows = childFactory.makeMany(req.count);
|
|
363
|
+
// Adonis Lucid: an array's length must match the related-row count —
|
|
364
|
+
// reject a mismatch rather than silently leave rows without pivot data.
|
|
365
|
+
if (Array.isArray(nestedPivot) && nestedPivot.length !== rows.length) {
|
|
366
|
+
throw new Error(`Factory .with('${req.name}'): pivotAttributes array length (${nestedPivot.length}) must match the related-row count (${rows.length}).`);
|
|
367
|
+
}
|
|
368
|
+
for (let i = 0; i < rows.length; i++) {
|
|
369
|
+
const pivot = Array.isArray(nestedPivot)
|
|
370
|
+
? nestedPivot[i]
|
|
371
|
+
: nestedPivot;
|
|
372
|
+
await recurse([await proxy.create(rows[i], pivot)]);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
throw new Error(`Factory .with('${req.name}'): '${relMeta.type}' relations are not supported`);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
47
379
|
};
|
|
48
380
|
const builder = {
|
|
49
381
|
merge(overrides) {
|
|
50
|
-
|
|
382
|
+
if (typeof overrides === "function") {
|
|
383
|
+
pendingMergeFns.push(overrides);
|
|
384
|
+
}
|
|
385
|
+
else if (Array.isArray(overrides)) {
|
|
386
|
+
pendingOverridesList = overrides;
|
|
387
|
+
}
|
|
388
|
+
else {
|
|
389
|
+
pendingOverrides = { ...pendingOverrides, ...overrides };
|
|
390
|
+
}
|
|
391
|
+
return builder;
|
|
392
|
+
},
|
|
393
|
+
mergeRecursive(overrides) {
|
|
394
|
+
pendingRecursive = deepMerge(pendingRecursive, overrides);
|
|
51
395
|
return builder;
|
|
52
396
|
},
|
|
53
397
|
state(name, fn) {
|
|
@@ -58,46 +402,176 @@ export function factory(entityClass, defaults) {
|
|
|
58
402
|
pendingStates.push(...names);
|
|
59
403
|
return builder;
|
|
60
404
|
},
|
|
405
|
+
relation(name, resolver) {
|
|
406
|
+
relations.set(name, resolver);
|
|
407
|
+
return builder;
|
|
408
|
+
},
|
|
409
|
+
with(name, count = 1, callback) {
|
|
410
|
+
pendingWith.push({ name, count, callback });
|
|
411
|
+
return builder;
|
|
412
|
+
},
|
|
413
|
+
tap(fn) {
|
|
414
|
+
pendingTap.push(fn);
|
|
415
|
+
return builder;
|
|
416
|
+
},
|
|
417
|
+
newUp(fn) {
|
|
418
|
+
customNewUp = fn;
|
|
419
|
+
return builder;
|
|
420
|
+
},
|
|
421
|
+
pivotAttributes(attrs) {
|
|
422
|
+
// An array (per-row values) replaces wholesale; objects merge (repeated
|
|
423
|
+
// `.pivotAttributes({...})` accumulate, matching the single-object case).
|
|
424
|
+
pendingPivot =
|
|
425
|
+
Array.isArray(attrs) || Array.isArray(pendingPivot)
|
|
426
|
+
? attrs
|
|
427
|
+
: { ...pendingPivot, ...attrs };
|
|
428
|
+
return builder;
|
|
429
|
+
},
|
|
430
|
+
before(event, callback) {
|
|
431
|
+
beforeHooks[event].push(callback);
|
|
432
|
+
return builder;
|
|
433
|
+
},
|
|
434
|
+
after(event, callback) {
|
|
435
|
+
afterHooks[event].push(callback);
|
|
436
|
+
return builder;
|
|
437
|
+
},
|
|
438
|
+
client(connection) {
|
|
439
|
+
boundClient = connection;
|
|
440
|
+
return builder;
|
|
441
|
+
},
|
|
442
|
+
connection(name) {
|
|
443
|
+
const conn = getConnection(name);
|
|
444
|
+
if (!conn) {
|
|
445
|
+
throw new Error(`Factory ${entityClass.name}: no connection registered under '${name}'.`);
|
|
446
|
+
}
|
|
447
|
+
boundClient = conn;
|
|
448
|
+
return builder;
|
|
449
|
+
},
|
|
450
|
+
query(options) {
|
|
451
|
+
if (options.client) {
|
|
452
|
+
boundClient = options.client;
|
|
453
|
+
}
|
|
454
|
+
else if (options.connection) {
|
|
455
|
+
const conn = getConnection(options.connection);
|
|
456
|
+
if (!conn) {
|
|
457
|
+
throw new Error(`Factory ${entityClass.name}: no connection registered under '${options.connection}'.`);
|
|
458
|
+
}
|
|
459
|
+
boundClient = conn;
|
|
460
|
+
}
|
|
461
|
+
return builder;
|
|
462
|
+
},
|
|
61
463
|
make() {
|
|
62
|
-
|
|
464
|
+
// Lucid `make`: an UN-persisted instance (no PK, `$isPersisted` false).
|
|
465
|
+
// Taps run on it, like the other instance-producing paths.
|
|
466
|
+
const taps = pendingTap;
|
|
467
|
+
const mergeFns = pendingMergeFns;
|
|
468
|
+
const stateNames = pendingStates;
|
|
469
|
+
const ctx = makeCtx(false);
|
|
470
|
+
const data = buildData(ctx);
|
|
471
|
+
const entity = newInstance(data, ctx);
|
|
472
|
+
applyMergeFns(entity, data, mergeFns, ctx);
|
|
473
|
+
applyStates(entity, stateNames, ctx);
|
|
474
|
+
runTaps(taps, entity, ctx);
|
|
475
|
+
for (const hook of afterHooks.make)
|
|
476
|
+
hook(builder, entity, ctx);
|
|
63
477
|
resetPending();
|
|
64
|
-
return
|
|
478
|
+
return entity;
|
|
65
479
|
},
|
|
66
480
|
makeMany(count) {
|
|
67
481
|
// Re-evaluate defaults for each row so `Date.now()` / faker generate
|
|
68
|
-
// distinct values
|
|
69
|
-
|
|
482
|
+
// distinct values, each hydrated into its own un-persisted instance.
|
|
483
|
+
const taps = pendingTap;
|
|
484
|
+
const mergeFns = pendingMergeFns;
|
|
485
|
+
const stateNames = pendingStates;
|
|
486
|
+
const ctx = makeCtx(false);
|
|
70
487
|
const rows = [];
|
|
71
488
|
for (let i = 0; i < count; i++) {
|
|
72
|
-
|
|
489
|
+
const data = buildData(ctx, i);
|
|
490
|
+
const entity = newInstance(data, ctx);
|
|
491
|
+
applyMergeFns(entity, data, mergeFns, ctx);
|
|
492
|
+
applyStates(entity, stateNames, ctx);
|
|
493
|
+
runTaps(taps, entity, ctx);
|
|
494
|
+
for (const hook of afterHooks.make)
|
|
495
|
+
hook(builder, entity, ctx);
|
|
496
|
+
rows.push(entity);
|
|
73
497
|
}
|
|
74
498
|
resetPending();
|
|
75
499
|
return rows;
|
|
76
500
|
},
|
|
77
501
|
makeStubbed() {
|
|
78
|
-
const
|
|
502
|
+
const taps = pendingTap;
|
|
503
|
+
const mergeFns = pendingMergeFns;
|
|
504
|
+
const stateNames = pendingStates;
|
|
505
|
+
const ctx = makeCtx(true);
|
|
506
|
+
const entity = stub(buildData(ctx), taps, mergeFns, stateNames, ctx);
|
|
79
507
|
resetPending();
|
|
80
|
-
const entity = new entityClass();
|
|
81
|
-
for (const [key, value] of Object.entries(data)) {
|
|
82
|
-
entity.setProp(key, value);
|
|
83
|
-
}
|
|
84
508
|
return entity;
|
|
85
509
|
},
|
|
510
|
+
makeStubbedMany(count) {
|
|
511
|
+
// Re-evaluate defaults per row (distinct Date.now()/faker values), same
|
|
512
|
+
// as makeMany; each row then gets its own stub id + taps via `stub`.
|
|
513
|
+
const taps = pendingTap;
|
|
514
|
+
const mergeFns = pendingMergeFns;
|
|
515
|
+
const stateNames = pendingStates;
|
|
516
|
+
const ctx = makeCtx(true);
|
|
517
|
+
const rows = [];
|
|
518
|
+
for (let i = 0; i < count; i++) {
|
|
519
|
+
rows.push(stub(buildData(ctx, i), taps, mergeFns, stateNames, ctx));
|
|
520
|
+
}
|
|
521
|
+
resetPending();
|
|
522
|
+
return rows;
|
|
523
|
+
},
|
|
86
524
|
async create(db) {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
525
|
+
// Capture + clear the relation/tap queues, then consume the raw data
|
|
526
|
+
// (which resets the rest of the pending state) — BEFORE resolveConnection,
|
|
527
|
+
// so a missing connection can't throw with pending overrides/states/with/
|
|
528
|
+
// tap still dirty and leak them into the next create().
|
|
529
|
+
const withReqs = pendingWith;
|
|
530
|
+
pendingWith = [];
|
|
531
|
+
const taps = pendingTap;
|
|
532
|
+
const mergeFns = pendingMergeFns;
|
|
533
|
+
const stateNames = pendingStates;
|
|
534
|
+
// Snapshot the recursive overrides BEFORE consumeData resets them — they
|
|
535
|
+
// cascade onto every related factory (Adonis Lucid `mergeRecursive`).
|
|
536
|
+
const recursive = { ...pendingRecursive };
|
|
537
|
+
const ctx = makeCtx(false);
|
|
538
|
+
const data = consumeData(ctx);
|
|
539
|
+
const conn = resolveConnection(db);
|
|
540
|
+
return persistWithRelations(conn, withReqs, recursive, (repo, txCtx) => persist(repo, data, taps, mergeFns, stateNames, txCtx));
|
|
90
541
|
},
|
|
91
542
|
async createMany(count, db) {
|
|
92
|
-
const
|
|
93
|
-
|
|
543
|
+
const withReqs = pendingWith;
|
|
544
|
+
pendingWith = [];
|
|
545
|
+
const taps = pendingTap;
|
|
546
|
+
const mergeFns = pendingMergeFns;
|
|
547
|
+
const stateNames = pendingStates;
|
|
548
|
+
const recursive = { ...pendingRecursive };
|
|
549
|
+
const ctx = makeCtx(false);
|
|
550
|
+
const rows = consumeDataMany(count, ctx);
|
|
551
|
+
const conn = resolveConnection(db);
|
|
94
552
|
const created = [];
|
|
95
553
|
for (const data of rows) {
|
|
96
|
-
created
|
|
554
|
+
// Each created parent + its relations are atomic (Lucid semantics).
|
|
555
|
+
created.push(await persistWithRelations(conn, withReqs, recursive, (repo, txCtx) => persist(repo, data, taps, mergeFns, stateNames, txCtx)));
|
|
97
556
|
}
|
|
98
557
|
return created;
|
|
99
558
|
},
|
|
100
559
|
};
|
|
560
|
+
// Register this builder's internals so a PARENT factory can drive nested
|
|
561
|
+
// `.with()` on it (kept off the public type, keyed by the builder object).
|
|
562
|
+
factoryInternals.set(builder, {
|
|
563
|
+
consumeWith() {
|
|
564
|
+
const reqs = pendingWith;
|
|
565
|
+
pendingWith = [];
|
|
566
|
+
return reqs;
|
|
567
|
+
},
|
|
568
|
+
consumePivot() {
|
|
569
|
+
const pivot = pendingPivot;
|
|
570
|
+
pendingPivot = undefined;
|
|
571
|
+
return pivot;
|
|
572
|
+
},
|
|
573
|
+
applyRelations,
|
|
574
|
+
});
|
|
101
575
|
return builder;
|
|
102
576
|
}
|
|
103
577
|
//# sourceMappingURL=Factory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Factory.js","sourceRoot":"","sources":["../../src/testing/Factory.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Factory.js","sourceRoot":"","sources":["../../src/testing/Factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAc,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,cAAc,EAA2B,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAqChD,MAAM,gBAAgB,GAAG,IAAI,OAAO,EAA4B,CAAC;AAwBjE;;;;;GAKG;AACH,IAAI,aAAa,GAAG,CAAC,CAAC;AAEtB;;;;GAIG;AACH,IAAI,YAA2E,CAAC;AAEhF,6FAA6F;AAC7F,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;AAEhF,SAAS,aAAa,CAAC,KAAc;IACpC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO,KAAK,KAAK,MAAM,CAAC,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CACjB,MAA+B,EAC/B,MAA+B;IAE/B,MAAM,GAAG,GAA4B,EAAE,GAAG,MAAM,EAAE,CAAC;IACnD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,IAAI,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5C,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,GAAG,CAAC,GAAG,CAAC;YACP,aAAa,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC;gBAC9C,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC;gBAC5B,CAAC,CAAC,KAAK,CAAC;IACX,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC;AAmMD;;;;;;;GAOG;AACH;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACtB,MAAM,CACL,WAAiC,EACjC,QAAoB;QAEpB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC;IACxD,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,SAAoE;QAC1E,YAAY,GAAG,SAAS,IAAI,SAAS,CAAC;IACvC,CAAC;CACD,CAAC;AAEF,MAAM,UAAU,OAAO,CACtB,WAAiC,EACjC,QAAoB;IAEpB,yCAAyC;IACzC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC7C,wDAAwD;IACxD,IAAI,gBAAgB,GAAqC,EAAE,CAAC;IAC5D,sFAAsF;IACtF,IAAI,oBAAyE,CAAC;IAC9E,+EAA+E;IAC/E,kDAAkD;IAClD,IAAI,eAAe,GAAiB,EAAE,CAAC;IACvC,yEAAyE;IACzE,6EAA6E;IAC7E,oEAAoE;IACpE,IAAI,gBAAgB,GAA4B,EAAE,CAAC;IACnD,IAAI,aAAa,GAAa,EAAE,CAAC;IAEjC,2EAA2E;IAC3E,+DAA+D;IAC/D,MAAM,SAAS,GAAG,IAAI,GAAG,EAA4B,CAAC;IACtD,IAAI,WAAW,GAAkB,EAAE,CAAC;IACpC,6EAA6E;IAC7E,+EAA+E;IAC/E,IAAI,UAAU,GAEV,EAAE,CAAC;IACP,wEAAwE;IACxE,+EAA+E;IAC/E,oEAAoE;IACpE,IAAI,YAGQ,CAAC;IACb,qEAAqE;IACrE,oCAAoC;IACpC,IAAI,WAEQ,CAAC;IACb,yEAAyE;IACzE,6DAA6D;IAC7D,IAAI,WAA2C,CAAC;IAEhD,mFAAmF;IACnF,MAAM,iBAAiB,GAAG,CAAC,EAAuB,EAAsB,EAAE;QACzE,MAAM,IAAI,GAAG,EAAE,IAAI,WAAW,CAAC;QAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACd,WAAW,WAAW,CAAC,IAAI,+FAA+F,CAC1H,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC,CAAC;IAQF,MAAM,WAAW,GAA6C;QAC7D,MAAM,EAAE,EAAE;QACV,WAAW,EAAE,EAAE;KACf,CAAC;IACF,yEAAyE;IACzE,2DAA2D;IAC3D,MAAM,UAAU,GAAsD;QACrE,IAAI,EAAE,EAAE;QACR,MAAM,EAAE,EAAE;QACV,WAAW,EAAE,EAAE;KACf,CAAC;IAEF,6EAA6E;IAC7E,4EAA4E;IAC5E,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IAEtD,oFAAoF;IACpF,MAAM,WAAW,GAAG,CACnB,IAA6B,EAC7B,GAAmB,EACf,EAAE;QACN,IAAI,WAAW;YAAE,OAAO,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACjD,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC,CAAC;IAEF,sEAAsE;IACtE,MAAM,OAAO,GAAG,CACf,IAEC,EACD,MAAS,EACT,GAAmB,EACZ,EAAE;QACT,KAAK,MAAM,GAAG,IAAI,IAAI;YAAE,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC,CAAC;IAEF;;wEAEoE;IACpE,0EAA0E;IAC1E,MAAM,OAAO,GAAG,CAAC,SAAkB,EAAkB,EAAE,CAAC,CAAC;QACxD,KAAK;QACL,SAAS;QACT,IAAI,EAAE,WAAW;KACjB,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,CACZ,IAA6B,EAC7B,IAEC,EACD,QAAsB,EACtB,UAAoB,EACpB,GAAmB,EACf,EAAE;QACN,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACtC,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC3C,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAC3B,2EAA2E;QAC3E,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,WAAW;YAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QACvE,4EAA4E;QAC5E,yEAAyE;QACzE,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,EAAE,aAAa,CAAC;YAC7B,MAAM,CAAC,OAAO,CACb,UAAU,EACV,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAChD,CAAC;QACH,CAAC;QACD,MAAM,CAAC,eAAe,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,WAAW;YAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QACtE,OAAO,MAAM,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CACjB,GAAmB,EACnB,KAAK,GAAG,CAAC,EACiB,EAAE;QAC5B,IAAI,IAAI,GAA4B;YACnC,GAAG,QAAQ,CAAC,GAAG,CAAC;YAChB,GAAG,gBAAgB;YACnB,qEAAqE;YACrE,GAAG,CAAC,oBAAoB,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SACxC,CAAC;QACF,6EAA6E;QAC7E,IAAI,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC,CAAC;IAEF;;;OAGG;IACH,MAAM,aAAa,GAAG,CACrB,MAAS,EACT,UAAmC,EACnC,QAAsB,EACtB,GAAmB,EACZ,EAAE;QACT,KAAK,MAAM,EAAE,IAAI,QAAQ;YAAE,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC,CAAC;IAEF;;;OAGG;IACH,MAAM,WAAW,GAAG,CACnB,MAAS,EACT,UAAoB,EACpB,GAAmB,EACZ,EAAE;QACT,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,EAAE,EAAE,CAAC;gBACT,MAAM,IAAI,KAAK,CACd,kBAAkB,IAAI,uBAAuB,WAAW,CAAC,IAAI,SAAS,CACtE,CAAC;YACH,CAAC;YACD,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACjB,CAAC;IACF,CAAC,CAAC;IAEF;yEACqE;IACrE,MAAM,WAAW,GAAG,CAAC,GAAmB,EAA2B,EAAE;QACpE,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC5B,YAAY,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACb,CAAC,CAAC;IAEF,+EAA+E;IAC/E,MAAM,eAAe,GAAG,CACvB,KAAa,EACb,GAAmB,EACS,EAAE;QAC9B,MAAM,IAAI,GAA8B,EAAE,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE;YAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7D,YAAY,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACb,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,GAAS,EAAE;QAC/B,gBAAgB,GAAG,EAAE,CAAC;QACtB,oBAAoB,GAAG,SAAS,CAAC;QACjC,eAAe,GAAG,EAAE,CAAC;QACrB,gBAAgB,GAAG,EAAE,CAAC;QACtB,aAAa,GAAG,EAAE,CAAC;QACnB,UAAU,GAAG,EAAE,CAAC;QAChB,YAAY,GAAG,SAAS,CAAC;QACzB,sEAAsE;QACtE,yEAAyE;QACzE,iEAAiE;QACjE,WAAW,GAAG,EAAE,CAAC;IAClB,CAAC,CAAC;IAEF;;;;;OAKG;IACH,MAAM,OAAO,GAAG,KAAK,EACpB,IAAuB,EACvB,IAA6B,EAC7B,IAEC,EACD,QAAsB,EACtB,UAAoB,EACpB,GAAmB,EACN,EAAE;QACf,IACC,IAAI,CAAC,MAAM,KAAK,CAAC;YACjB,QAAQ,CAAC,MAAM,KAAK,CAAC;YACrB,UAAU,CAAC,MAAM,KAAK,CAAC;YACvB,WAAW,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAC/B,UAAU,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAC9B,CAAC,WAAW,EACX,CAAC;YACF,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACtC,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC3C,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,MAAM;YAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAClE,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,MAAM;YAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QACjE,OAAO,MAAM,CAAC;IACf,CAAC,CAAC;IAEF;;;;;;;OAOG;IACH,MAAM,oBAAoB,GAAG,KAAK,EACjC,IAAwB,EACxB,QAAuB,EACvB,SAAkC,EAClC,KAAmE,EACtD,EAAE;QACf,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,mEAAmE;YACnE,oEAAoE;YACpE,OAAO,KAAK,CAAC,IAAI,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE;gBACnD,KAAK;gBACL,SAAS,EAAE,KAAK;gBAChB,IAAI,EAAE,IAAI;aACV,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACtC,MAAM,IAAI,GAAG,IAAI,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YACvE,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;YACzE,MAAM,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;YACvD,OAAO,MAAM,CAAC;QACf,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF;;;;OAIG;IACH,MAAM,cAAc,GAAG,KAAK,EAC3B,MAAkB,EAClB,IAAmB,EACnB,EAAsB,EACtB,SAAmC,EACnB,EAAE;QAClB,MAAM,IAAI,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,YAAY,GAAG,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QACpE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7D,IAAI,CAAC,OAAO,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CACd,kBAAkB,GAAG,CAAC,IAAI,QAAQ,GAAG,CAAC,IAAI,mCAAmC,WAAW,CAAC,IAAI,EAAE,CAC/F,CAAC;YACH,CAAC;YACD,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CACd,kBAAkB,GAAG,CAAC,IAAI,uDAAuD,GAAG,CAAC,IAAI,oBAAoB,CAC7G,CAAC;YACH,CAAC;YACD,MAAM,YAAY,GAAG,QAAQ,EAAE,CAAC;YAChC,wEAAwE;YACxE,uEAAuE;YACvE,2BAA2B;YAC3B,IAAI,YAAY,IAAI,SAAS;gBAAE,YAAY,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YACtE,IAAI,GAAG,CAAC,QAAQ;gBAAE,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAC7C,MAAM,cAAc,GAAG,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAE1D,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAChC,oEAAoE;gBACpE,sDAAsD;gBACtD,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC5C,MAAM,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBAC7B,SAAS;YACV,CAAC;YAED,yEAAyE;YACzE,2EAA2E;YAC3E,0EAA0E;YAC1E,mDAAmD;YACnD,MAAM,UAAU,GAAG,cAAc,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;YACvD,uEAAuE;YACvE,yDAAyD;YACzD,MAAM,WAAW,GAAG,cAAc,EAAE,YAAY,EAAE,CAAC;YACnD,MAAM,OAAO,GAAG,KAAK,EAAE,QAAsB,EAAiB,EAAE;gBAC/D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,cAAc;oBAAE,OAAO;gBACvD,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;oBAC9B,0DAA0D;oBAC1D,MAAM,cAAc,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;gBACvE,CAAC;YACF,CAAC,CAAC;YAEF,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,OAAO,CAAC,MAAM,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzE,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACpC,MAAM,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1D,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACxC,uEAAuE;gBACvE,sEAAsE;gBACtE,qEAAqE;gBACrE,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC9C,qEAAqE;gBACrE,wEAAwE;gBACxE,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;oBACtE,MAAM,IAAI,KAAK,CACd,kBAAkB,GAAG,CAAC,IAAI,qCAAqC,WAAW,CAAC,MAAM,uCAAuC,IAAI,CAAC,MAAM,IAAI,CACvI,CAAC;gBACH,CAAC;gBACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACtC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;wBACvC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;wBAChB,CAAC,CAAC,WAAW,CAAC;oBACf,MAAM,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;gBACrD,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,MAAM,IAAI,KAAK,CACd,kBAAkB,GAAG,CAAC,IAAI,QAAQ,OAAO,CAAC,IAAI,+BAA+B,CAC7E,CAAC;YACH,CAAC;QACF,CAAC;IACF,CAAC,CAAC;IAEF,MAAM,OAAO,GAAsB;QAClC,KAAK,CAAC,SAAS;YACd,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE,CAAC;gBACrC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACjC,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBACrC,oBAAoB,GAAG,SAAS,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACP,gBAAgB,GAAG,EAAE,GAAG,gBAAgB,EAAE,GAAG,SAAS,EAAE,CAAC;YAC1D,CAAC;YACD,OAAO,OAAO,CAAC;QAChB,CAAC;QAED,cAAc,CAAC,SAAS;YACvB,gBAAgB,GAAG,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;YAC1D,OAAO,OAAO,CAAC;QAChB,CAAC;QAED,KAAK,CAAC,IAAI,EAAE,EAAE;YACb,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACrB,OAAO,OAAO,CAAC;QAChB,CAAC;QAED,KAAK,CAAC,GAAG,KAAK;YACb,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;YAC7B,OAAO,OAAO,CAAC;QAChB,CAAC;QAED,QAAQ,CAAC,IAAI,EAAE,QAAQ;YACtB,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC9B,OAAO,OAAO,CAAC;QAChB,CAAC;QAED,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,QAAQ;YAC7B,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC5C,OAAO,OAAO,CAAC;QAChB,CAAC;QAED,GAAG,CAAC,EAAE;YACL,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpB,OAAO,OAAO,CAAC;QAChB,CAAC;QAED,KAAK,CAAC,EAAE;YACP,WAAW,GAAG,EAAE,CAAC;YACjB,OAAO,OAAO,CAAC;QAChB,CAAC;QAED,eAAe,CAAC,KAAK;YACpB,wEAAwE;YACxE,0EAA0E;YAC1E,YAAY;gBACX,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;oBAClD,CAAC,CAAC,KAAK;oBACP,CAAC,CAAC,EAAE,GAAG,YAAY,EAAE,GAAG,KAAK,EAAE,CAAC;YAClC,OAAO,OAAO,CAAC;QAChB,CAAC;QAED,MAAM,CAAC,KAAK,EAAE,QAAQ;YACrB,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClC,OAAO,OAAO,CAAC;QAChB,CAAC;QAED,KAAK,CAAC,KAAK,EAAE,QAAQ;YACpB,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACjC,OAAO,OAAO,CAAC;QAChB,CAAC;QAED,MAAM,CAAC,UAAU;YAChB,WAAW,GAAG,UAAU,CAAC;YACzB,OAAO,OAAO,CAAC;QAChB,CAAC;QAED,UAAU,CAAC,IAAI;YACd,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CACd,WAAW,WAAW,CAAC,IAAI,qCAAqC,IAAI,IAAI,CACxE,CAAC;YACH,CAAC;YACD,WAAW,GAAG,IAAI,CAAC;YACnB,OAAO,OAAO,CAAC;QAChB,CAAC;QAED,KAAK,CAAC,OAAO;YACZ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACpB,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;YAC9B,CAAC;iBAAM,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBAC/B,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAC/C,IAAI,CAAC,IAAI,EAAE,CAAC;oBACX,MAAM,IAAI,KAAK,CACd,WAAW,WAAW,CAAC,IAAI,qCAAqC,OAAO,CAAC,UAAU,IAAI,CACtF,CAAC;gBACH,CAAC;gBACD,WAAW,GAAG,IAAI,CAAC;YACpB,CAAC;YACD,OAAO,OAAO,CAAC;QAChB,CAAC;QAED,IAAI;YACH,wEAAwE;YACxE,2DAA2D;YAC3D,MAAM,IAAI,GAAG,UAAU,CAAC;YACxB,MAAM,QAAQ,GAAG,eAAe,CAAC;YACjC,MAAM,UAAU,GAAG,aAAa,CAAC;YACjC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC3B,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAC5B,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACtC,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC3C,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YAC3B,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,IAAI;gBAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YAC/D,YAAY,EAAE,CAAC;YACf,OAAO,MAAM,CAAC;QACf,CAAC;QAED,QAAQ,CAAC,KAAK;YACb,qEAAqE;YACrE,qEAAqE;YACrE,MAAM,IAAI,GAAG,UAAU,CAAC;YACxB,MAAM,QAAQ,GAAG,eAAe,CAAC;YACjC,MAAM,UAAU,GAAG,aAAa,CAAC;YACjC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC3B,MAAM,IAAI,GAAQ,EAAE,CAAC;YACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBAChC,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAC/B,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBACtC,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;gBAC3C,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;gBACrC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;gBAC3B,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,IAAI;oBAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;gBAC/D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnB,CAAC;YACD,YAAY,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACb,CAAC;QAED,WAAW;YACV,MAAM,IAAI,GAAG,UAAU,CAAC;YACxB,MAAM,QAAQ,GAAG,eAAe,CAAC;YACjC,MAAM,UAAU,GAAG,aAAa,CAAC;YACjC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;YACrE,YAAY,EAAE,CAAC;YACf,OAAO,MAAM,CAAC;QACf,CAAC;QAED,eAAe,CAAC,KAAK;YACpB,wEAAwE;YACxE,qEAAqE;YACrE,MAAM,IAAI,GAAG,UAAU,CAAC;YACxB,MAAM,QAAQ,GAAG,eAAe,CAAC;YACjC,MAAM,UAAU,GAAG,aAAa,CAAC;YACjC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM,IAAI,GAAQ,EAAE,CAAC;YACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBAChC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;YACrE,CAAC;YACD,YAAY,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACb,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,EAAE;YACd,qEAAqE;YACrE,2EAA2E;YAC3E,0EAA0E;YAC1E,wDAAwD;YACxD,MAAM,QAAQ,GAAG,WAAW,CAAC;YAC7B,WAAW,GAAG,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,UAAU,CAAC;YACxB,MAAM,QAAQ,GAAG,eAAe,CAAC;YACjC,MAAM,UAAU,GAAG,aAAa,CAAC;YACjC,yEAAyE;YACzE,sEAAsE;YACtE,MAAM,SAAS,GAAG,EAAE,GAAG,gBAAgB,EAAE,CAAC;YAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC3B,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;YACnC,OAAO,oBAAoB,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACtE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,CACtD,CAAC;QACH,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE;YACzB,MAAM,QAAQ,GAAG,WAAW,CAAC;YAC7B,WAAW,GAAG,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,UAAU,CAAC;YACxB,MAAM,QAAQ,GAAG,eAAe,CAAC;YACjC,MAAM,UAAU,GAAG,aAAa,CAAC;YACjC,MAAM,SAAS,GAAG,EAAE,GAAG,gBAAgB,EAAE,CAAC;YAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC3B,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACzC,MAAM,IAAI,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;YACnC,MAAM,OAAO,GAAQ,EAAE,CAAC;YACxB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;gBACzB,oEAAoE;gBACpE,OAAO,CAAC,IAAI,CACX,MAAM,oBAAoB,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACrE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,CACtD,CACD,CAAC;YACH,CAAC;YACD,OAAO,OAAO,CAAC;QAChB,CAAC;KACD,CAAC;IAEF,yEAAyE;IACzE,2EAA2E;IAC3E,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE;QAC7B,WAAW;YACV,MAAM,IAAI,GAAG,WAAW,CAAC;YACzB,WAAW,GAAG,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACb,CAAC;QACD,YAAY;YACX,MAAM,KAAK,GAAG,YAAY,CAAC;YAC3B,YAAY,GAAG,SAAS,CAAC;YACzB,OAAO,KAAK,CAAC;QACd,CAAC;QACD,cAAc;KACd,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AAChB,CAAC"}
|