velocious 1.0.440 → 1.0.442
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/build/cli/commands/lint/relationships.js +12 -0
- package/build/database/drivers/base.js +4 -1
- package/build/database/query/model-class-query.js +20 -7
- package/build/database/record/index.js +4 -3
- package/build/environment-handlers/base.js +10 -0
- package/build/environment-handlers/node/cli/commands/lint/relationships.js +144 -0
- package/build/environment-handlers/node.js +10 -0
- package/build/src/cli/commands/lint/relationships.d.ts +5 -0
- package/build/src/cli/commands/lint/relationships.d.ts.map +1 -0
- package/build/src/cli/commands/lint/relationships.js +12 -0
- package/build/src/database/drivers/base.d.ts.map +1 -1
- package/build/src/database/drivers/base.js +5 -2
- package/build/src/database/query/model-class-query.d.ts.map +1 -1
- package/build/src/database/query/model-class-query.js +19 -8
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +5 -4
- package/build/src/environment-handlers/base.d.ts +7 -0
- package/build/src/environment-handlers/base.d.ts.map +1 -1
- package/build/src/environment-handlers/base.js +10 -1
- package/build/src/environment-handlers/node/cli/commands/lint/relationships.d.ts +34 -0
- package/build/src/environment-handlers/node/cli/commands/lint/relationships.d.ts.map +1 -0
- package/build/src/environment-handlers/node/cli/commands/lint/relationships.js +123 -0
- package/build/src/environment-handlers/node.d.ts.map +1 -1
- package/build/src/environment-handlers/node.js +10 -1
- package/build/src/utils/is-date.d.ts +10 -0
- package/build/src/utils/is-date.d.ts.map +1 -0
- package/build/src/utils/is-date.js +13 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/utils/is-date.js +13 -0
- package/package.json +1 -1
- package/src/cli/commands/lint/relationships.js +12 -0
- package/src/database/drivers/base.js +4 -1
- package/src/database/query/model-class-query.js +20 -7
- package/src/database/record/index.js +4 -3
- package/src/environment-handlers/base.js +10 -0
- package/src/environment-handlers/node/cli/commands/lint/relationships.js +144 -0
- package/src/environment-handlers/node.js +10 -0
- package/src/utils/is-date.js +13 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import BaseCommand from "../../base-command.js"
|
|
2
|
+
|
|
3
|
+
/** Lints model relationships (e.g. belongs-to relationships missing an inverse on the target model). */
|
|
4
|
+
export default class VelociousCliCommandsLintRelationships extends BaseCommand {
|
|
5
|
+
/**
|
|
6
|
+
* Runs execute.
|
|
7
|
+
* @returns {Promise<?>} - Resolves with the command result.
|
|
8
|
+
*/
|
|
9
|
+
async execute() {
|
|
10
|
+
return await this.getConfiguration().getEnvironmentHandler().cliCommandsLintRelationships(this)
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -103,6 +103,7 @@
|
|
|
103
103
|
|
|
104
104
|
import BacktraceCleaner from "../../utils/backtrace-cleaner.js"
|
|
105
105
|
import { getDatabaseAnnotations } from "../annotations.js"
|
|
106
|
+
import isDate from "../../utils/is-date.js"
|
|
106
107
|
import Logger from "../../logger.js"
|
|
107
108
|
import Query from "../query/index.js"
|
|
108
109
|
import Handler from "../handler.js"
|
|
@@ -644,7 +645,9 @@ export default class VelociousDatabaseDriversBase {
|
|
|
644
645
|
return value ? 1 : 0
|
|
645
646
|
}
|
|
646
647
|
|
|
647
|
-
|
|
648
|
+
// isDate instead of instanceof: a Date created in another realm (e.g. the console REPL) would
|
|
649
|
+
// fail instanceof, skip this conversion, and serialize as an empty SQL value downstream.
|
|
650
|
+
if (isDate(value)) {
|
|
648
651
|
return strftime("%F %T.%L", value)
|
|
649
652
|
}
|
|
650
653
|
|
|
@@ -301,17 +301,30 @@ export default class VelociousDatabaseQueryModelClassQuery extends DatabaseQuery
|
|
|
301
301
|
* @returns {Promise<number>} - Resolves with the count.
|
|
302
302
|
*/
|
|
303
303
|
async count() {
|
|
304
|
-
//
|
|
305
|
-
// legacy tables
|
|
306
|
-
//
|
|
307
|
-
//
|
|
308
|
-
|
|
309
|
-
|
|
304
|
+
// A model without a single primary-key column — setPrimaryKey(null) or a composite
|
|
305
|
+
// setPrimaryKey([...]) on legacy tables — has no column COUNT can reference (an array primary key
|
|
306
|
+
// cannot be quoted as a single COUNT(column), and primaryKey() falls back to "id" for the no-pk
|
|
307
|
+
// case, so hasPrimaryKey() detects that one).
|
|
308
|
+
const hasSingleColumnPrimaryKey = this.getModelClass().hasPrimaryKey() && !Array.isArray(this.getModelClass().primaryKey())
|
|
309
|
+
|
|
310
|
+
// Pagination, or an ungrouped query on a model with no single primary-key column, counts via the
|
|
311
|
+
// subquery form. It references no primary-key column and preserves DISTINCT over joins — which a
|
|
312
|
+
// bare COUNT(*) would not (it would count joined duplicate rows instead of distinct root rows).
|
|
313
|
+
// A grouped query stays on the per-group flow below, because the subquery form would count one
|
|
314
|
+
// row per group instead of summing each group's row count.
|
|
315
|
+
if (this._limit !== null || this._offset !== null || (!hasSingleColumnPrimaryKey && this._groups.length == 0)) {
|
|
310
316
|
return await this.paginatedCount()
|
|
311
317
|
}
|
|
312
318
|
|
|
319
|
+
if (!hasSingleColumnPrimaryKey && this._distinct) {
|
|
320
|
+
throw new Error(`Can't count a grouped distinct query on ${this.getModelClass().name} because it has no single primary-key column to count distinct values of`)
|
|
321
|
+
}
|
|
322
|
+
|
|
313
323
|
const distinctPrefix = this._distinct ? "DISTINCT " : ""
|
|
314
|
-
|
|
324
|
+
const countExpression = hasSingleColumnPrimaryKey
|
|
325
|
+
? `${this.driver.quoteTable(this.getModelClass().tableName())}.${this.driver.quoteColumn(this.getModelClass().primaryKey())}`
|
|
326
|
+
: "*"
|
|
327
|
+
let sql = `COUNT(${distinctPrefix}${countExpression})`
|
|
315
328
|
|
|
316
329
|
if (this.driver.getType() == "pgsql") sql += "::int"
|
|
317
330
|
|
|
@@ -31,6 +31,7 @@ import HasOneRelationship from "./relationships/has-one.js"
|
|
|
31
31
|
import RecordAttachmentHandle from "./attachments/handle.js"
|
|
32
32
|
import * as inflection from "inflection"
|
|
33
33
|
import deburrColumnName from "../../utils/deburr-column-name.js"
|
|
34
|
+
import isDate from "../../utils/is-date.js"
|
|
34
35
|
import ModelClassQuery from "../query/model-class-query.js"
|
|
35
36
|
import Preloader from "../query/preloader.js"
|
|
36
37
|
import {readPayloadAssociationCount, readPayloadComputedAbility, readPayloadQueryData, setPayloadAssociationCount, setPayloadComputedAbility, setPayloadQueryData} from "../../record-payload-values.js"
|
|
@@ -2234,7 +2235,7 @@ class VelociousDatabaseRecord {
|
|
|
2234
2235
|
normalizedValue = this._normalizeDateStringForInsert(normalizedValue)
|
|
2235
2236
|
}
|
|
2236
2237
|
|
|
2237
|
-
if (normalizedValue
|
|
2238
|
+
if (isDate(normalizedValue)) {
|
|
2238
2239
|
const configuration = this._getConfiguration()
|
|
2239
2240
|
const offsetMinutes = configuration.getEnvironmentHandler().getTimezoneOffsetMinutes(configuration)
|
|
2240
2241
|
const offsetMs = offsetMinutes * 60 * 1000
|
|
@@ -3904,7 +3905,7 @@ class VelociousDatabaseRecord {
|
|
|
3904
3905
|
const offsetMinutes = configuration.getEnvironmentHandler().getTimezoneOffsetMinutes(configuration)
|
|
3905
3906
|
const offsetMs = offsetMinutes * 60 * 1000
|
|
3906
3907
|
|
|
3907
|
-
if (value
|
|
3908
|
+
if (isDate(value)) {
|
|
3908
3909
|
return new Date(value.getTime() + offsetMs)
|
|
3909
3910
|
}
|
|
3910
3911
|
|
|
@@ -4063,7 +4064,7 @@ class VelociousDatabaseRecord {
|
|
|
4063
4064
|
|
|
4064
4065
|
const value = data[columnName]
|
|
4065
4066
|
|
|
4066
|
-
if (!(value
|
|
4067
|
+
if (!isDate(value)) continue
|
|
4067
4068
|
|
|
4068
4069
|
data[columnName] = new Date(value.getTime() - offsetMs)
|
|
4069
4070
|
}
|
|
@@ -243,6 +243,16 @@ export default class VelociousEnvironmentHandlerBase {
|
|
|
243
243
|
throw new Error("cliCommandsGenerateModel not implemented")
|
|
244
244
|
}
|
|
245
245
|
|
|
246
|
+
/**
|
|
247
|
+
* Runs cli commands lint relationships.
|
|
248
|
+
* @abstract
|
|
249
|
+
* @param {import("../cli/base-command.js").default} _command - Command.
|
|
250
|
+
* @returns {Promise<?>} - Resolves with the command result.
|
|
251
|
+
*/
|
|
252
|
+
async cliCommandsLintRelationships(_command) {
|
|
253
|
+
throw new Error("cliCommandsLintRelationships not implemented")
|
|
254
|
+
}
|
|
255
|
+
|
|
246
256
|
/**
|
|
247
257
|
* Runs cli commands routes.
|
|
248
258
|
* @abstract
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import BaseCommand from "../../../../../cli/base-command.js"
|
|
4
|
+
import fs from "node:fs/promises"
|
|
5
|
+
import path from "node:path"
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Lints model relationships: every non-polymorphic belongs-to relationship should have an inverse
|
|
9
|
+
* has-many or has-one relationship declared on its target model class. A missing inverse usually
|
|
10
|
+
* means the target model was never told about the association (e.g. an Event model missing
|
|
11
|
+
* `hasMany("priceCategorySettings")` while PriceCategorySetting declares `belongsTo("event")`).
|
|
12
|
+
*
|
|
13
|
+
* Specific relationships can be ignored through a JSON config file (default:
|
|
14
|
+
* `relationship-lint.json` in the project directory, overridable with `--config <path>`):
|
|
15
|
+
*
|
|
16
|
+
* {"ignore": ["PriceCategorySetting#event"]}
|
|
17
|
+
*
|
|
18
|
+
* where each entry is `<model class name>#<belongs-to relationship name>`.
|
|
19
|
+
*/
|
|
20
|
+
export default class VelociousCliCommandsLintRelationships extends BaseCommand {
|
|
21
|
+
/**
|
|
22
|
+
* Runs execute.
|
|
23
|
+
* @returns {Promise<{offences: Array<{ignoreKey: string, message: string}>}>} - Resolves with the found offences (empty when the lint passes).
|
|
24
|
+
*/
|
|
25
|
+
async execute() {
|
|
26
|
+
// Relationship target resolution (getTargetModelClass) looks model classes up through the
|
|
27
|
+
// current configuration, so make this command's configuration the current one.
|
|
28
|
+
this.getConfiguration().setCurrent()
|
|
29
|
+
|
|
30
|
+
await this.getConfiguration().initializeModels()
|
|
31
|
+
|
|
32
|
+
const ignoredRelationships = await this._loadIgnoredRelationships()
|
|
33
|
+
const offences = []
|
|
34
|
+
const modelClasses = Object.values(this.getConfiguration().getModelClasses())
|
|
35
|
+
|
|
36
|
+
for (const modelClass of modelClasses) {
|
|
37
|
+
for (const relationship of modelClass.getRelationships()) {
|
|
38
|
+
if (relationship.getType() != "belongsTo") continue
|
|
39
|
+
if (relationship.getPolymorphic()) continue
|
|
40
|
+
|
|
41
|
+
const ignoreKey = `${modelClass.name}#${relationship.getRelationshipName()}`
|
|
42
|
+
|
|
43
|
+
if (ignoredRelationships.has(ignoreKey)) continue
|
|
44
|
+
|
|
45
|
+
let targetModelClass
|
|
46
|
+
|
|
47
|
+
try {
|
|
48
|
+
targetModelClass = relationship.getTargetModelClass()
|
|
49
|
+
} catch (error) {
|
|
50
|
+
offences.push({
|
|
51
|
+
ignoreKey,
|
|
52
|
+
message: `${ignoreKey}: couldn't resolve the target model class: ${error instanceof Error ? error.message : error}`
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
continue
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (!targetModelClass) {
|
|
59
|
+
offences.push({ignoreKey, message: `${ignoreKey}: couldn't resolve the target model class`})
|
|
60
|
+
|
|
61
|
+
continue
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const inverseRelationship = targetModelClass.getRelationships().find((candidate) => {
|
|
65
|
+
if (candidate.getType() != "hasMany" && candidate.getType() != "hasOne") return false
|
|
66
|
+
if (candidate.through) return false
|
|
67
|
+
|
|
68
|
+
try {
|
|
69
|
+
return candidate.getTargetModelClass() === modelClass
|
|
70
|
+
} catch {
|
|
71
|
+
// A has-many/has-one with an unresolvable target can't be the inverse of this belongs-to.
|
|
72
|
+
// It is reported separately when its own model's belongs-to relationships are linted.
|
|
73
|
+
return false
|
|
74
|
+
}
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
if (inverseRelationship) continue
|
|
78
|
+
|
|
79
|
+
offences.push({
|
|
80
|
+
ignoreKey,
|
|
81
|
+
message: `${targetModelClass.name} is missing an inverse hasMany/hasOne relationship for ${ignoreKey} (belongsTo). ` +
|
|
82
|
+
`Declare the inverse on ${targetModelClass.name} or add "${ignoreKey}" to the ignore config.`
|
|
83
|
+
})
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
for (const offence of offences) {
|
|
88
|
+
console.error(offence.message)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (offences.length > 0) {
|
|
92
|
+
throw new Error(`Relationship lint failed with ${offences.length} offence(s):\n${offences.map((offence) => offence.message).join("\n")}`)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
console.log(`Relationship lint passed for ${modelClasses.length} model(s).`)
|
|
96
|
+
|
|
97
|
+
return {offences}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Loads the ignored relationship keys from the lint config file. The file is optional; when the
|
|
102
|
+
* default path doesn't exist, no relationships are ignored. An explicitly passed `--config` path
|
|
103
|
+
* must exist.
|
|
104
|
+
* @returns {Promise<Set<string>>} - Ignored `<model>#<relationship>` keys.
|
|
105
|
+
*/
|
|
106
|
+
async _loadIgnoredRelationships() {
|
|
107
|
+
const configArgIndex = this.processArgs?.indexOf("--config") ?? -1
|
|
108
|
+
const explicitConfigPath = configArgIndex >= 0 ? this.processArgs?.[configArgIndex + 1] : undefined
|
|
109
|
+
|
|
110
|
+
if (configArgIndex >= 0 && !explicitConfigPath) {
|
|
111
|
+
throw new Error("--config was given without a path argument")
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const configPath = explicitConfigPath
|
|
115
|
+
? path.resolve(this.directory(), explicitConfigPath)
|
|
116
|
+
: path.join(this.directory(), "relationship-lint.json")
|
|
117
|
+
|
|
118
|
+
let configContent
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
configContent = await fs.readFile(configPath, "utf8")
|
|
122
|
+
} catch (error) {
|
|
123
|
+
if (!explicitConfigPath && /** @type {NodeJS.ErrnoException} */ (error).code == "ENOENT") {
|
|
124
|
+
return new Set()
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
throw error
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const config = JSON.parse(configContent)
|
|
131
|
+
|
|
132
|
+
if (config === null || typeof config != "object" || Array.isArray(config)) {
|
|
133
|
+
throw new Error(`Relationship lint config must be a JSON object: ${configPath}`)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const ignore = config.ignore ?? []
|
|
137
|
+
|
|
138
|
+
if (!Array.isArray(ignore) || ignore.some((entry) => typeof entry != "string")) {
|
|
139
|
+
throw new Error(`Relationship lint config "ignore" must be an array of "<model>#<relationship>" strings: ${configPath}`)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return new Set(ignore)
|
|
143
|
+
}
|
|
144
|
+
}
|
|
@@ -8,6 +8,7 @@ import CliCommandsGenerateBaseModels from "./node/cli/commands/generate/base-mod
|
|
|
8
8
|
import CliCommandsGenerateFrontendModels from "./node/cli/commands/generate/frontend-models.js"
|
|
9
9
|
import CliCommandsGenerateMigration from "./node/cli/commands/generate/migration.js"
|
|
10
10
|
import CliCommandsGenerateModel from "./node/cli/commands/generate/model.js"
|
|
11
|
+
import CliCommandsLintRelationships from "./node/cli/commands/lint/relationships.js"
|
|
11
12
|
import CliCommandsRoutes from "./node/cli/commands/routes.js"
|
|
12
13
|
import CliCommandsServer from "./node/cli/commands/server.js"
|
|
13
14
|
import CliCommandsTest from "./node/cli/commands/test.js"
|
|
@@ -509,6 +510,15 @@ export default class VelociousEnvironmentHandlerNode extends Base{
|
|
|
509
510
|
return await this.forwardCommand(command, CliCommandsGenerateModel)
|
|
510
511
|
}
|
|
511
512
|
|
|
513
|
+
/**
|
|
514
|
+
* Runs cli commands lint relationships.
|
|
515
|
+
* @param {import("../cli/base-command.js").default} command - Command.
|
|
516
|
+
* @returns {Promise<?>} - Resolves with the command result.
|
|
517
|
+
*/
|
|
518
|
+
async cliCommandsLintRelationships(command) {
|
|
519
|
+
return await this.forwardCommand(command, CliCommandsLintRelationships)
|
|
520
|
+
}
|
|
521
|
+
|
|
512
522
|
/**
|
|
513
523
|
* Runs cli commands routes.
|
|
514
524
|
* @param {import("../cli/base-command.js").default} command - Command.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Lints model relationships (e.g. belongs-to relationships missing an inverse on the target model). */
|
|
2
|
+
export default class VelociousCliCommandsLintRelationships extends BaseCommand {
|
|
3
|
+
}
|
|
4
|
+
import BaseCommand from "../../base-command.js";
|
|
5
|
+
//# sourceMappingURL=relationships.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relationships.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/lint/relationships.js"],"names":[],"mappings":"AAEA,wGAAwG;AACxG;CAQC;wBAXuB,uBAAuB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import BaseCommand from "../../base-command.js";
|
|
2
|
+
/** Lints model relationships (e.g. belongs-to relationships missing an inverse on the target model). */
|
|
3
|
+
export default class VelociousCliCommandsLintRelationships extends BaseCommand {
|
|
4
|
+
/**
|
|
5
|
+
* Runs execute.
|
|
6
|
+
* @returns {Promise<?>} - Resolves with the command result.
|
|
7
|
+
*/
|
|
8
|
+
async execute() {
|
|
9
|
+
return await this.getConfiguration().getEnvironmentHandler().cliCommandsLintRelationships(this);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsYXRpb25zaGlwcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jbGkvY29tbWFuZHMvbGludC9yZWxhdGlvbnNoaXBzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sV0FBVyxNQUFNLHVCQUF1QixDQUFBO0FBRS9DLHdHQUF3RztBQUN4RyxNQUFNLENBQUMsT0FBTyxPQUFPLHFDQUFzQyxTQUFRLFdBQVc7SUFDNUU7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLE9BQU87UUFDWCxPQUFPLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMscUJBQXFCLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNqRyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmFzZUNvbW1hbmQgZnJvbSBcIi4uLy4uL2Jhc2UtY29tbWFuZC5qc1wiXG5cbi8qKiBMaW50cyBtb2RlbCByZWxhdGlvbnNoaXBzIChlLmcuIGJlbG9uZ3MtdG8gcmVsYXRpb25zaGlwcyBtaXNzaW5nIGFuIGludmVyc2Ugb24gdGhlIHRhcmdldCBtb2RlbCkuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNDbGlDb21tYW5kc0xpbnRSZWxhdGlvbnNoaXBzIGV4dGVuZHMgQmFzZUNvbW1hbmQge1xuICAvKipcbiAgICogUnVucyBleGVjdXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTw/Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjb21tYW5kIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldEVudmlyb25tZW50SGFuZGxlcigpLmNsaUNvbW1hbmRzTGludFJlbGF0aW9uc2hpcHModGhpcylcbiAgfVxufVxuIl19
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/database/drivers/base.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/database/drivers/base.js"],"names":[],"mappings":"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"}
|