@lyku/lockstep-pg 0.2.0 → 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.
Files changed (45) hide show
  1. package/package.json +30 -30
  2. package/src/buildTableIndexCommand.d.ts.map +1 -1
  3. package/src/buildTableIndexCommand.js +21 -6
  4. package/src/buildTableIndexCommand.js.map +1 -1
  5. package/src/buildTableTriggerCommands.d.ts +13 -1
  6. package/src/buildTableTriggerCommands.d.ts.map +1 -1
  7. package/src/buildTableTriggerCommands.js +33 -14
  8. package/src/buildTableTriggerCommands.js.map +1 -1
  9. package/src/createTable.d.ts.map +1 -1
  10. package/src/createTable.js +16 -2
  11. package/src/createTable.js.map +1 -1
  12. package/src/dateToPostgresString.js +2 -2
  13. package/src/dateToPostgresString.js.map +1 -1
  14. package/src/diff.d.ts +7 -0
  15. package/src/diff.d.ts.map +1 -1
  16. package/src/diff.js +79 -8
  17. package/src/diff.js.map +1 -1
  18. package/src/drift.d.ts +8 -11
  19. package/src/drift.d.ts.map +1 -1
  20. package/src/drift.js +1 -298
  21. package/src/drift.js.map +1 -1
  22. package/src/form.d.ts.map +1 -1
  23. package/src/form.js +43 -2
  24. package/src/form.js.map +1 -1
  25. package/src/generateSql.d.ts.map +1 -1
  26. package/src/generateSql.js +47 -5
  27. package/src/generateSql.js.map +1 -1
  28. package/src/index.d.ts +3 -3
  29. package/src/index.d.ts.map +1 -1
  30. package/src/index.js +2 -4
  31. package/src/index.js.map +1 -1
  32. package/src/introspect.d.ts +12 -0
  33. package/src/introspect.d.ts.map +1 -1
  34. package/src/introspect.js +189 -34
  35. package/src/introspect.js.map +1 -1
  36. package/src/mapColumnType.d.ts.map +1 -1
  37. package/src/mapColumnType.js +3 -0
  38. package/src/mapColumnType.js.map +1 -1
  39. package/src/migrate.d.ts +11 -9
  40. package/src/migrate.d.ts.map +1 -1
  41. package/src/migrate.js +28 -345
  42. package/src/migrate.js.map +1 -1
  43. package/src/seed.d.ts.map +1 -1
  44. package/src/seed.js +6 -1
  45. package/src/seed.js.map +1 -1
package/src/migrate.js CHANGED
@@ -1,350 +1,33 @@
1
- import { detectDrift } from './drift';
2
- import { mapColumnType } from './mapColumnType';
3
- import { buildTableCreationCommand } from './createTable';
4
- import { buildTableIndexCommands } from './buildTableIndexCommand';
5
- import { buildTableTriggerCommands } from './buildTableTriggerCommands';
6
- import { dateToPostgresString } from './dateToPostgresString';
7
- const escapeString = (str) => {
8
- if (str === undefined || str === null)
9
- return 'NULL';
10
- return `'${str.replace(/'/g, "''")}'`;
11
- };
12
- const formatSqlValue = (value) => {
13
- if (value === undefined || value === null)
14
- return 'NULL';
15
- if (typeof value === 'bigint')
16
- return value.toString();
17
- if (typeof value === 'number')
18
- return value.toString();
19
- if (typeof value === 'boolean')
20
- return value ? 'true' : 'false';
21
- if (value instanceof Date)
22
- return `'${dateToPostgresString(value)}'`;
23
- if (typeof value === 'string')
24
- return escapeString(value);
25
- return 'NULL';
26
- };
27
- function formatDefault(def) {
28
- if (def === null)
29
- return 'NULL';
30
- if (typeof def === 'object' && def !== null && 'sql' in def) {
31
- return def.sql;
32
- }
33
- if (typeof def === 'string')
34
- return `'${def}'`;
35
- if (typeof def === 'boolean')
36
- return def ? 'TRUE' : 'FALSE';
37
- return String(def);
38
- }
39
- function getExpectedSqlType(columnName, schema) {
40
- return mapColumnType(columnName, schema);
41
- }
42
- export function driftToSql(drifts, config) {
43
- const safe = [];
44
- const destructive = [];
45
- for (const drift of drifts) {
46
- switch (drift.type) {
47
- case 'missing_table': {
48
- const tableModel = config.tables[drift.table];
49
- if (!tableModel) {
50
- safe.push(`-- WARNING: Table "${drift.table}" not found in config`);
51
- break;
52
- }
53
- safe.push(`-- Create table: ${drift.table}`);
54
- safe.push(buildTableCreationCommand(drift.table, tableModel));
55
- const indexCommands = buildTableIndexCommands(drift.table, tableModel);
56
- if (indexCommands.length > 0) {
57
- safe.push(...indexCommands);
58
- }
59
- const triggerCommands = buildTableTriggerCommands(drift.table, tableModel);
60
- if (triggerCommands.length > 0) {
61
- safe.push('');
62
- safe.push(`-- Triggers for: ${drift.table}`);
63
- safe.push(...triggerCommands);
64
- }
65
- safe.push('');
66
- break;
67
- }
68
- case 'missing_column': {
69
- const tableModel = config.tables[drift.table];
70
- if (!tableModel || !('properties' in tableModel.schema)) {
71
- safe.push(`-- WARNING: Cannot find schema for "${drift.table}"`);
72
- break;
73
- }
74
- const columnName = drift.column;
75
- if (!columnName) {
76
- safe.push(`-- WARNING: Missing column name for drift in "${drift.table}"`);
77
- break;
78
- }
79
- // eslint-disable-next-line security/detect-object-injection -- columnName is from schema
80
- const colSchema = tableModel.schema.properties[columnName];
81
- if (!colSchema) {
82
- safe.push(`-- WARNING: Column "${columnName}" not found in schema for "${drift.table}"`);
83
- break;
84
- }
85
- const required = 'required' in tableModel.schema
86
- ? tableModel.schema.required
87
- : [];
88
- const isRequired = required.includes(columnName);
89
- const sqlType = getExpectedSqlType(columnName, colSchema);
90
- const hasDefault = 'default' in colSchema && colSchema.default !== undefined;
91
- if (isRequired && !hasDefault) {
92
- safe.push(`-- Add column "${columnName}" to "${drift.table}" (NOT NULL, requires backfill)`);
93
- safe.push(`ALTER TABLE "${drift.table}" ADD COLUMN IF NOT EXISTS "${columnName}" ${sqlType};`);
94
- safe.push(`-- TODO: Backfill existing rows with appropriate value:`);
95
- safe.push(`-- UPDATE "${drift.table}" SET "${columnName}" = <default_value> WHERE "${columnName}" IS NULL;`);
96
- safe.push(`ALTER TABLE "${drift.table}" ALTER COLUMN "${columnName}" SET NOT NULL;`);
97
- }
98
- else {
99
- const notNull = isRequired ? ' NOT NULL' : '';
100
- const defaultClause = hasDefault
101
- ? ` DEFAULT ${formatDefault(colSchema.default)}`
102
- : '';
103
- safe.push(`-- Add column "${columnName}" to "${drift.table}"`);
104
- safe.push(`ALTER TABLE "${drift.table}" ADD COLUMN IF NOT EXISTS "${columnName}" ${sqlType}${defaultClause}${notNull};`);
105
- }
106
- safe.push('');
107
- break;
108
- }
109
- case 'missing_index': {
110
- const match = drift.details.match(/column\(s\): (.+)$/);
111
- if (match) {
112
- const cols = match[1].split(', ').map((c) => c.trim());
113
- const colNames = cols.map((c) => c.split(' ')[0]);
114
- const indexName = `idx_${drift.table}_${colNames.join('_')}`;
115
- const formattedCols = cols.map((c) => {
116
- const parts = c.split(' ');
117
- const colName = parts[0];
118
- const modifiers = parts.slice(1).join(' ');
119
- return modifiers ? `"${colName}" ${modifiers}` : `"${colName}"`;
120
- });
121
- safe.push(`-- Add missing index on "${drift.table}"`);
122
- safe.push(`CREATE INDEX IF NOT EXISTS "${indexName}" ON "${drift.table}" (${formattedCols.join(', ')});`);
123
- safe.push('');
124
- }
125
- break;
126
- }
127
- case 'column_type_mismatch': {
128
- const columnName = drift.column ?? '';
129
- let sqlType;
130
- let castType;
131
- if (drift.expected === 'array') {
132
- const tableModel = config.tables[drift.table];
133
- let arrayItemType = null;
134
- if (tableModel && 'properties' in tableModel.schema) {
135
- // eslint-disable-next-line security/detect-object-injection -- columnName is from schema
136
- const colSchema = tableModel.schema.properties[columnName];
137
- if (colSchema &&
138
- colSchema.type === 'array' &&
139
- 'items' in colSchema &&
140
- colSchema.items &&
141
- typeof colSchema.items === 'object') {
142
- const items = colSchema.items;
143
- if (items.type) {
144
- arrayItemType = items.type;
145
- if (arrayItemType === 'int8')
146
- arrayItemType = 'bigint';
147
- if (arrayItemType === 'int4' || arrayItemType === 'int')
148
- arrayItemType = 'integer';
149
- if (arrayItemType === 'int2')
150
- arrayItemType = 'smallint';
151
- if (arrayItemType === 'float8')
152
- arrayItemType = 'double precision';
153
- if (arrayItemType === 'float4')
154
- arrayItemType = 'real';
155
- if (arrayItemType === 'bool')
156
- arrayItemType = 'boolean';
157
- }
158
- }
159
- }
160
- const simpleArrayTypes = new Set([
161
- 'bigint',
162
- 'integer',
163
- 'smallint',
164
- 'double precision',
165
- 'real',
166
- 'text',
167
- 'varchar',
168
- 'char',
169
- 'boolean',
170
- 'timestamptz',
171
- 'timestamp',
172
- 'date',
173
- ]);
174
- if (arrayItemType && simpleArrayTypes.has(arrayItemType)) {
175
- const pgType = arrayItemType.toUpperCase();
176
- sqlType = `${pgType}[]`;
177
- castType = `${arrayItemType}[]`;
178
- }
179
- else {
180
- sqlType = 'JSONB';
181
- castType = 'jsonb';
182
- }
183
- }
184
- else {
185
- sqlType = drift.expected?.toUpperCase() ?? 'TEXT';
186
- castType = drift.expected ?? 'text';
187
- }
188
- safe.push(`-- Type change for "${drift.table}"."${columnName}": ${drift.actual} → ${drift.expected}`);
189
- safe.push(`-- WARNING: Verify data compatibility before running`);
190
- safe.push(`ALTER TABLE "${drift.table}" ALTER COLUMN "${columnName}" TYPE ${sqlType} USING "${columnName}"::${castType};`);
191
- safe.push('');
192
- break;
193
- }
194
- case 'nullable_mismatch': {
195
- const columnName = drift.column ?? '';
196
- if (drift.expected === 'not null') {
197
- safe.push(`-- Make "${drift.table}"."${columnName}" NOT NULL`);
198
- safe.push(`-- WARNING: Ensure no NULL values exist first`);
199
- safe.push(`ALTER TABLE "${drift.table}" ALTER COLUMN "${columnName}" SET NOT NULL;`);
200
- }
201
- else {
202
- safe.push(`-- Make "${drift.table}"."${columnName}" nullable`);
203
- safe.push(`ALTER TABLE "${drift.table}" ALTER COLUMN "${columnName}" DROP NOT NULL;`);
204
- }
205
- safe.push('');
206
- break;
207
- }
208
- case 'extra_table': {
209
- destructive.push(`-- Drop table "${drift.table}" (exists in DB but not in schema)`);
210
- destructive.push(`DROP TABLE IF EXISTS "${drift.table}" CASCADE;`);
211
- destructive.push('');
212
- break;
213
- }
214
- case 'extra_column': {
215
- const columnName = drift.column ?? '';
216
- destructive.push(`-- Drop column "${columnName}" from "${drift.table}" (exists in DB but not in schema)`);
217
- destructive.push(`ALTER TABLE "${drift.table}" DROP COLUMN IF EXISTS "${columnName}";`);
218
- destructive.push('');
219
- break;
220
- }
221
- case 'extra_index': {
222
- destructive.push(`-- ${drift.details}`);
223
- destructive.push(`-- DROP INDEX IF EXISTS "...";`);
224
- destructive.push('');
225
- break;
226
- }
227
- case 'missing_stock_doc': {
228
- const tableModel = config.tables[drift.table];
229
- if (!tableModel || !tableModel.docs) {
230
- safe.push(`-- WARNING: Cannot find docs for table "${drift.table}"`);
231
- break;
232
- }
233
- const primaryKey = tableModel.primaryKey || 'id';
234
- const doc = tableModel.docs.find((d) => d &&
235
- typeof d === 'object' &&
236
- !Array.isArray(d) &&
237
- 'id' in d &&
238
- String(d['id']) ===
239
- String(drift.docId));
240
- if (!doc) {
241
- safe.push(`-- WARNING: Stock doc id=${drift.docId} not found in config for "${drift.table}"`);
242
- break;
243
- }
244
- const columns = Object.keys(doc);
245
- const values = columns.map((col) =>
246
- // eslint-disable-next-line security/detect-object-injection -- col is from Object.keys
247
- formatSqlValue(doc[col]));
248
- safe.push(`-- Insert missing stock doc: ${drift.details}`);
249
- safe.push(`INSERT INTO "${drift.table}" (${columns.map((c) => `"${c}"`).join(', ')})`);
250
- safe.push(`VALUES (${values.join(', ')})`);
251
- safe.push(`ON CONFLICT ("${primaryKey}") DO NOTHING;`);
252
- safe.push('');
253
- break;
254
- }
255
- case 'check_constraint_mismatch': {
256
- const columnName = drift.column ?? '';
257
- const constraintName = drift.constraintName;
258
- const tableModel = config.tables[drift.table];
259
- if (!tableModel || !('properties' in tableModel.schema)) {
260
- safe.push(`-- WARNING: Cannot find schema for "${drift.table}"`);
261
- break;
262
- }
263
- // eslint-disable-next-line security/detect-object-injection -- columnName is from schema
264
- const colSchema = tableModel.schema.properties[columnName];
265
- if (!colSchema || colSchema.type !== 'enum' || !colSchema.enum) {
266
- safe.push(`-- WARNING: Column "${columnName}" is not an enum in schema`);
267
- break;
268
- }
269
- const newValues = colSchema.enum.map((v) => `'${v}'`).join(', ');
270
- const newConstraintName = `${drift.table}_${columnName}_check`;
271
- safe.push(`-- Update CHECK constraint for "${drift.table}"."${columnName}"`);
272
- safe.push(`-- Old values: ${drift.actual}`);
273
- safe.push(`-- New values: ${drift.expected}`);
274
- if (constraintName) {
275
- safe.push(`ALTER TABLE "${drift.table}" DROP CONSTRAINT IF EXISTS "${constraintName}";`);
276
- }
277
- if (constraintName !== newConstraintName) {
278
- safe.push(`ALTER TABLE "${drift.table}" DROP CONSTRAINT IF EXISTS "${newConstraintName}";`);
279
- }
280
- safe.push(`ALTER TABLE "${drift.table}" ADD CONSTRAINT "${newConstraintName}" CHECK ("${columnName}" IN (${newValues}));`);
281
- safe.push('');
282
- break;
283
- }
284
- case 'missing_constraint': {
285
- const columnName = drift.column ?? '';
286
- const tableModel = config.tables[drift.table];
287
- if (!tableModel || !('properties' in tableModel.schema)) {
288
- safe.push(`-- WARNING: Cannot find schema for "${drift.table}"`);
289
- break;
290
- }
291
- // eslint-disable-next-line security/detect-object-injection -- columnName is from schema
292
- const colSchema = tableModel.schema.properties[columnName];
293
- if (!colSchema || colSchema.type !== 'enum' || !colSchema.enum) {
294
- safe.push(`-- WARNING: Column "${columnName}" is not an enum in schema`);
295
- break;
296
- }
297
- const newValues = colSchema.enum.map((v) => `'${v}'`).join(', ');
298
- const newConstraintName = `${drift.table}_${columnName}_check`;
299
- safe.push(`-- Add missing CHECK constraint for "${drift.table}"."${columnName}"`);
300
- safe.push(`ALTER TABLE "${drift.table}" DROP CONSTRAINT IF EXISTS "${newConstraintName}";`);
301
- safe.push(`ALTER TABLE "${drift.table}" ADD CONSTRAINT "${newConstraintName}" CHECK ("${columnName}" IN (${newValues}));`);
302
- safe.push('');
303
- break;
304
- }
305
- default:
306
- safe.push(`-- Unhandled drift type: ${drift.type}`);
307
- safe.push(`-- ${drift.details}`);
308
- safe.push('');
1
+ import { Client } from 'pg';
2
+ import { introspectDatabase, modelToIntrospected } from './introspect';
3
+ import { diffDatabase } from './diff';
4
+ import { generateMigrationSql } from './generateSql';
5
+ /**
6
+ * Generate migration SQL by diffing the live database against the model config.
7
+ *
8
+ * This is the single source of truth: introspect the DB → convert each model with
9
+ * modelToIntrospected → diffDatabase → generateMigrationSql. (Replaces the old narrow
10
+ * detectDrift/driftToSql path; schemaDiff.ts uses the same pipeline for --apply.)
11
+ */
12
+ export async function generateMigration(connectionString, config) {
13
+ const client = new Client({
14
+ connectionString,
15
+ ssl: true,
16
+ connectionTimeoutMillis: 30000,
17
+ });
18
+ await client.connect();
19
+ try {
20
+ const dbTables = await introspectDatabase(client);
21
+ const codeTables = new Map();
22
+ for (const [tableName, tableModel] of Object.entries(config.tables)) {
23
+ codeTables.set(tableName, modelToIntrospected(tableName, tableModel));
309
24
  }
25
+ const ops = diffDatabase(dbTables, codeTables);
26
+ const { safe, destructive } = generateMigrationSql(ops);
27
+ return { safe, destructive, driftCount: ops.length };
310
28
  }
311
- return { safe, destructive };
312
- }
313
- export async function generateMigration(connectionString, config) {
314
- const drifts = await detectDrift(connectionString, config);
315
- if (drifts.length === 0) {
316
- return { safe: '', destructive: '', driftCount: 0 };
29
+ finally {
30
+ await client.end();
317
31
  }
318
- const { safe, destructive } = driftToSql(drifts, config);
319
- const timestamp = new Date().toISOString();
320
- const safeContent = safe.length > 0
321
- ? [
322
- '-- Schema Migration (Safe Operations)',
323
- `-- Generated: ${timestamp}`,
324
- `-- Drifts detected: ${drifts.length}`,
325
- '',
326
- 'BEGIN;',
327
- '',
328
- ...safe,
329
- 'COMMIT;',
330
- ].join('\n')
331
- : '';
332
- const destructiveContent = destructive.length > 0
333
- ? [
334
- '-- Schema Migration (DESTRUCTIVE Operations)',
335
- `-- Generated: ${timestamp}`,
336
- '-- WARNING: These operations will DELETE data!',
337
- '',
338
- 'BEGIN;',
339
- '',
340
- ...destructive,
341
- 'COMMIT;',
342
- ].join('\n')
343
- : '';
344
- return {
345
- safe: safeContent,
346
- destructive: destructiveContent,
347
- driftCount: drifts.length,
348
- };
349
32
  }
350
33
  //# sourceMappingURL=migrate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../../libs/lockstep-pg/src/migrate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../../libs/lockstep-pg/src/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAE5B,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAQrD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACtC,gBAAwB,EACxB,MAAsB;IAEtB,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;QACzB,gBAAgB;QAChB,GAAG,EAAE,IAAI;QACT,uBAAuB,EAAE,KAAK;KAC9B,CAAC,CAAC;IACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACvB,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,UAAU,GAAG,IAAI,GAAG,EAGvB,CAAC;QACJ,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACrE,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,mBAAmB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC/C,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;QACxD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;IACtD,CAAC;YAAS,CAAC;QACV,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;IACpB,CAAC;AACF,CAAC"}
package/src/seed.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../../../libs/lockstep-pg/src/seed.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AA+B9C,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAoC9D"}
1
+ {"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../../../libs/lockstep-pg/src/seed.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAoC9C,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAoC9D"}
package/src/seed.js CHANGED
@@ -17,6 +17,11 @@ const formatValue = (value) => {
17
17
  return `'${dateToPostgresString(value)}'`;
18
18
  if (typeof value === 'string')
19
19
  return escapeString(value);
20
+ // Arrays and plain objects are jsonb/array columns — serialize as a JSON literal.
21
+ // Previously these fell through to NULL, silently dropping seed data.
22
+ if (Array.isArray(value) || typeof value === 'object') {
23
+ return `'${JSON.stringify(value).replace(/'/g, "''")}'::jsonb`;
24
+ }
20
25
  return 'NULL';
21
26
  };
22
27
  function generateInsert(tableName, record, primaryKey = 'id') {
@@ -45,7 +50,7 @@ export function generateSeedSql(config) {
45
50
  if (doc &&
46
51
  typeof doc === 'object' &&
47
52
  !Array.isArray(doc) &&
48
- 'id' in doc) {
53
+ primaryKey in doc) {
49
54
  statements.push(generateInsert(tableName, doc, primaryKey));
50
55
  }
51
56
  }
package/src/seed.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"seed.js","sourceRoot":"","sources":["../../../../libs/lockstep-pg/src/seed.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seed.js","sourceRoot":"","sources":["../../../../libs/lockstep-pg/src/seed.ts"],"names":[],"mappings":"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"}