@bytebrand/export-cars 1.26.27 → 1.26.29
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 +128 -0
- package/dist/configs/config.d.ts +2 -1
- package/dist/configs/config.js +1 -0
- package/dist/configs/config.js.map +1 -1
- package/dist/configs/google.config.js +16 -0
- package/dist/configs/google.config.js.map +1 -1
- package/dist/configs/index.d.ts +1 -0
- package/dist/configs/index.js +1 -0
- package/dist/configs/index.js.map +1 -1
- package/dist/configs/openai-ads.config.d.ts +22 -0
- package/dist/configs/openai-ads.config.js +56 -0
- package/dist/configs/openai-ads.config.js.map +1 -0
- package/dist/enums/export-type.enum.d.ts +2 -1
- package/dist/enums/export-type.enum.js +1 -0
- package/dist/enums/export-type.enum.js.map +1 -1
- package/dist/enums/image-type.enum.d.ts +2 -1
- package/dist/enums/image-type.enum.js +1 -0
- package/dist/enums/image-type.enum.js.map +1 -1
- package/dist/export.schema.d.ts +6 -2
- package/dist/export.schema.js +4 -0
- package/dist/export.schema.js.map +1 -1
- package/dist/exporters/google.exporter.js +12 -2
- package/dist/exporters/google.exporter.js.map +1 -1
- package/dist/exporters/index.d.ts +1 -0
- package/dist/exporters/index.js +1 -0
- package/dist/exporters/index.js.map +1 -1
- package/dist/exporters/openai-ads.exporter.d.ts +13 -0
- package/dist/exporters/openai-ads.exporter.js +91 -0
- package/dist/exporters/openai-ads.exporter.js.map +1 -0
- package/dist/formats/openai-ads-csv.builder.d.ts +15 -0
- package/dist/formats/openai-ads-csv.builder.js +48 -0
- package/dist/formats/openai-ads-csv.builder.js.map +1 -0
- package/dist/interfaces/openai-ads.interface.d.ts +35 -0
- package/dist/interfaces/openai-ads.interface.js +37 -0
- package/dist/interfaces/openai-ads.interface.js.map +1 -0
- package/dist/interfaces/params.interface.d.ts +20 -0
- package/dist/services/feed-guard.d.ts +44 -0
- package/dist/services/feed-guard.js +156 -0
- package/dist/services/feed-guard.js.map +1 -0
- package/dist/services/image-url-validator.service.d.ts +45 -0
- package/dist/services/image-url-validator.service.js +141 -0
- package/dist/services/image-url-validator.service.js.map +1 -0
- package/dist/services/images.service.d.ts +12 -0
- package/dist/services/images.service.js +46 -1
- package/dist/services/images.service.js.map +1 -1
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.js +1 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/openai-ads-feed-run.d.ts +74 -0
- package/dist/services/openai-ads-feed-run.js +151 -0
- package/dist/services/openai-ads-feed-run.js.map +1 -0
- package/dist/services/openai-ads-ledger.d.ts +19 -0
- package/dist/services/openai-ads-ledger.js +72 -0
- package/dist/services/openai-ads-ledger.js.map +1 -0
- package/dist/services/publication-gate.d.ts +15 -0
- package/dist/services/publication-gate.js +107 -0
- package/dist/services/publication-gate.js.map +1 -0
- package/dist/transformers/google-feed-envkv.d.ts +2 -0
- package/dist/transformers/google-feed-envkv.js +62 -31
- package/dist/transformers/google-feed-envkv.js.map +1 -1
- package/dist/transformers/google-feed-item-row.d.ts +6 -1
- package/dist/transformers/google-feed-item-row.js +3 -1
- package/dist/transformers/google-feed-item-row.js.map +1 -1
- package/dist/transformers/openai-ads.transformer.d.ts +28 -0
- package/dist/transformers/openai-ads.transformer.js +144 -0
- package/dist/transformers/openai-ads.transformer.js.map +1 -0
- package/dist/transformers/openai-image-fields.d.ts +16 -0
- package/dist/transformers/openai-image-fields.js +34 -0
- package/dist/transformers/openai-image-fields.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/docs/openai-ads/AUDIT.md +235 -0
- package/docs/openai-ads/RUNBOOK.md +94 -0
- package/package.json +64 -64
- package/schema/feed-items.json +134 -122
- package/src/configs/config.ts +99 -97
- package/src/configs/google.config.ts +41 -26
- package/src/configs/index.ts +1 -0
- package/src/configs/openai-ads.config.ts +70 -0
- package/src/enums/export-type.enum.ts +2 -0
- package/src/enums/image-type.enum.ts +5 -0
- package/src/export.command.ts +38 -38
- package/src/export.schema.ts +6 -0
- package/src/exporters/google.exporter.ts +67 -56
- package/src/exporters/index.ts +1 -0
- package/src/exporters/openai-ads.exporter.ts +93 -0
- package/src/formats/openai-ads-csv.builder.ts +55 -0
- package/src/interfaces/openai-ads.interface.ts +64 -0
- package/src/interfaces/params.interface.ts +56 -29
- package/src/services/feed-guard.ts +219 -0
- package/src/services/feed-items-bigquery.writer.ts +101 -101
- package/src/services/image-url-validator.service.ts +181 -0
- package/src/services/images.service.ts +72 -0
- package/src/services/index.ts +1 -0
- package/src/services/openai-ads-feed-run.ts +226 -0
- package/src/services/openai-ads-ledger.ts +116 -0
- package/src/services/publication-gate.ts +119 -0
- package/src/transformers/google-feed-envkv.ts +81 -33
- package/src/transformers/google-feed-item-row.ts +78 -71
- package/src/transformers/openai-ads.transformer.ts +211 -0
- package/src/transformers/openai-image-fields.ts +60 -0
- package/test/clean-images.test.ts +86 -0
- package/test/fixtures/images-service.harness.ts +32 -0
- package/test/fixtures/images.golden.json +218 -0
- package/test/fixtures/imbo-images.fixture.ts +77 -0
- package/test/fixtures/openai-ads.fixture.ts +89 -0
- package/test/google-feed-item-row.test.ts +135 -121
- package/test/image-url-validator.test.ts +110 -0
- package/test/images-regression.test.ts +23 -0
- package/test/openai-ads-feed-run.test.ts +278 -0
- package/test/openai-ads-mapping.test.ts +136 -0
- package/test/openai-image-fields.test.ts +99 -0
- package/test/publication-gate.test.ts +86 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.googleCo2 = exports.googleEnergyConsumption = exports.googleFuelConsumptionDischarged = exports.googleFuelConsumption = exports.googleElectricRangeSource = exports.googleElectricRange = exports.googleEngine = void 0;
|
|
3
|
+
exports.googleEnvkvSourceFields = exports.googleCo2 = exports.googleEnergyConsumption = exports.googleFuelConsumptionDischarged = exports.googleFuelConsumption = exports.googleElectricRangeSource = exports.googleElectricRange = exports.googleEngine = void 0;
|
|
4
4
|
const lodash_1 = require("lodash");
|
|
5
5
|
const GOOGLE_ENGINE = {
|
|
6
6
|
selector_fuel_petrol: 'Gasoline',
|
|
@@ -47,49 +47,80 @@ function googleElectricRangeSource(car) {
|
|
|
47
47
|
}
|
|
48
48
|
exports.googleElectricRangeSource = googleElectricRangeSource;
|
|
49
49
|
const isConfirmedPlugIn = (car) => isPlugIn(car) && !!googleElectricRange(car);
|
|
50
|
-
|
|
50
|
+
const firstPositive = (car, fields) => {
|
|
51
|
+
for (const field of fields) {
|
|
52
|
+
const value = positive((0, lodash_1.get)(car, field));
|
|
53
|
+
if (value)
|
|
54
|
+
return { field, value };
|
|
55
|
+
}
|
|
56
|
+
return undefined;
|
|
57
|
+
};
|
|
58
|
+
const pickFuelConsumption = (car) => {
|
|
51
59
|
if (isBev(car))
|
|
52
60
|
return undefined;
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
61
|
+
if (isConfirmedPlugIn(car))
|
|
62
|
+
return firstPositive(car, ['consumption.wltpWeightedCombined', 'consumption.consumptionCombined']);
|
|
63
|
+
if (isPlugIn(car))
|
|
64
|
+
return firstPositive(car, ['consumption.consumptionCombined']);
|
|
65
|
+
return firstPositive(car, ['consumption.wltpCombined', 'consumption.consumptionCombined']);
|
|
66
|
+
};
|
|
67
|
+
const pickFuelConsumptionDischarged = (car) => {
|
|
68
|
+
if (!isPlugIn(car))
|
|
69
|
+
return undefined;
|
|
70
|
+
return isConfirmedPlugIn(car)
|
|
71
|
+
? firstPositive(car, ['consumption.wltpCombined'])
|
|
72
|
+
: firstPositive(car, ['consumption.consumptionCombined', 'consumption.wltpCombined']);
|
|
73
|
+
};
|
|
74
|
+
const pickEnergyConsumption = (car) => {
|
|
75
|
+
if (isConfirmedPlugIn(car))
|
|
76
|
+
return firstPositive(car, ['consumption.wltpWeightedPowerCombined']);
|
|
77
|
+
if (isBev(car) || isPlugIn(car))
|
|
78
|
+
return firstPositive(car, ['consumption.wltpPowerCombined', 'consumption.consumptionPowerCombined']);
|
|
79
|
+
return undefined;
|
|
80
|
+
};
|
|
81
|
+
const pickCo2 = (car) => {
|
|
82
|
+
if (isBev(car))
|
|
83
|
+
return undefined;
|
|
84
|
+
return isPlugIn(car) && !isConfirmedPlugIn(car)
|
|
85
|
+
? firstPositive(car, ['environmentEmissions.co2'])
|
|
86
|
+
: firstPositive(car, ['environmentEmissions.wltpCo2', 'environmentEmissions.co2']);
|
|
87
|
+
};
|
|
88
|
+
function googleFuelConsumption(car) {
|
|
89
|
+
const picked = pickFuelConsumption(car);
|
|
90
|
+
return picked ? `${picked.value}l/100km` : undefined;
|
|
64
91
|
}
|
|
65
92
|
exports.googleFuelConsumption = googleFuelConsumption;
|
|
66
93
|
function googleFuelConsumptionDischarged(car) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
const value = isConfirmedPlugIn(car)
|
|
70
|
-
? positive((0, lodash_1.get)(car, 'consumption.wltpCombined'))
|
|
71
|
-
: positive((0, lodash_1.get)(car, 'consumption.consumptionCombined')) ?? positive((0, lodash_1.get)(car, 'consumption.wltpCombined'));
|
|
72
|
-
return value ? `${value}l/100km` : undefined;
|
|
94
|
+
const picked = pickFuelConsumptionDischarged(car);
|
|
95
|
+
return picked ? `${picked.value}l/100km` : undefined;
|
|
73
96
|
}
|
|
74
97
|
exports.googleFuelConsumptionDischarged = googleFuelConsumptionDischarged;
|
|
75
98
|
function googleEnergyConsumption(car) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
value = positive((0, lodash_1.get)(car, 'consumption.wltpWeightedPowerCombined'));
|
|
79
|
-
}
|
|
80
|
-
else if (isBev(car) || isPlugIn(car)) {
|
|
81
|
-
value = positive((0, lodash_1.get)(car, 'consumption.wltpPowerCombined')) ?? positive((0, lodash_1.get)(car, 'consumption.consumptionPowerCombined'));
|
|
82
|
-
}
|
|
83
|
-
return value ? `${value}kWh/100km` : undefined;
|
|
99
|
+
const picked = pickEnergyConsumption(car);
|
|
100
|
+
return picked ? `${picked.value}kWh/100km` : undefined;
|
|
84
101
|
}
|
|
85
102
|
exports.googleEnergyConsumption = googleEnergyConsumption;
|
|
86
103
|
function googleCo2(car) {
|
|
87
104
|
if (isBev(car))
|
|
88
105
|
return '0g/km';
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
: positive((0, lodash_1.get)(car, 'environmentEmissions.wltpCo2')) ?? positive((0, lodash_1.get)(car, 'environmentEmissions.co2'));
|
|
92
|
-
return value ? `${value}g/km` : undefined;
|
|
106
|
+
const picked = pickCo2(car);
|
|
107
|
+
return picked ? `${picked.value}g/km` : undefined;
|
|
93
108
|
}
|
|
94
109
|
exports.googleCo2 = googleCo2;
|
|
110
|
+
function googleEnvkvSourceFields(car) {
|
|
111
|
+
const picks = {
|
|
112
|
+
fuel_consumption: pickFuelConsumption(car),
|
|
113
|
+
fuel_consumption_discharged_battery: pickFuelConsumptionDischarged(car),
|
|
114
|
+
energy_consumption: pickEnergyConsumption(car),
|
|
115
|
+
electric_range: pickElectricRange(car),
|
|
116
|
+
co2_emissions: pickCo2(car),
|
|
117
|
+
};
|
|
118
|
+
const fields = {};
|
|
119
|
+
for (const [attribute, picked] of Object.entries(picks)) {
|
|
120
|
+
if (picked)
|
|
121
|
+
fields[attribute] = picked.field;
|
|
122
|
+
}
|
|
123
|
+
return fields;
|
|
124
|
+
}
|
|
125
|
+
exports.googleEnvkvSourceFields = googleEnvkvSourceFields;
|
|
95
126
|
//# sourceMappingURL=google-feed-envkv.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-feed-envkv.js","sourceRoot":"","sources":["../../src/transformers/google-feed-envkv.ts"],"names":[],"mappings":";;;AAAA,mCAA6B;AAM7B,MAAM,aAAa,GAA2B;IAC5C,oBAAoB,EAAE,UAAU;IAChC,oBAAoB,EAAE,QAAQ;IAC9B,wBAAwB,EAAE,UAAU;IACpC,oCAAoC,EAAE,QAAQ;IAC9C,oCAAoC,EAAE,QAAQ;IAC9C,oBAAoB,EAAE,KAAK;IAC3B,wBAAwB,EAAE,aAAa;IACvC,qBAAqB,EAAE,OAAO;IAC9B,sBAAsB,EAAE,OAAO;IAC/B,gBAAgB,EAAE,OAAO;CAC1B,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,sCAAsC,EAAE,sCAAsC,CAAC,CAAC;AAEtG,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAsB,EAAE;IACtD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,CAAC,CAAC;AAEF,MAAM,KAAK,GAAG,CAAC,GAAoB,EAAW,EAAE,CAAC,IAAA,YAAG,EAAC,GAAG,EAAE,kBAAkB,CAAC,KAAK,0BAA0B,CAAC;AAC7G,MAAM,QAAQ,GAAG,CAAC,GAAoB,EAAW,EAAE,CACjD,YAAY,CAAC,QAAQ,CAAC,IAAA,YAAG,EAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,IAAA,YAAG,EAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC;AAE/F,SAAgB,YAAY,CAAC,GAAoB;IAC/C,MAAM,MAAM,GAAG,aAAa,CAAC,IAAA,YAAG,EAAC,GAAG,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,IAAI,OAAO,CAAC;IAC1F,OAAO,MAAM,KAAK,QAAQ,IAAI,IAAA,YAAG,EAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC;AAChG,CAAC;AAHD,oCAGC;AAID,MAAM,gBAAgB,GAAG,CAAC,mBAAmB,EAAE,8BAA8B,CAAC,CAAC;AAC/E,MAAM,oBAAoB,GAAG,CAAC,wBAAwB,EAAE,mBAAmB,EAAE,8BAA8B,CAAC,CAAC;AAE7G,MAAM,iBAAiB,GAAG,CAAC,GAAoB,EAAgD,EAAE;IAC/F,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;IACzF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QAC1B,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAA,YAAG,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QACxC,IAAI,KAAK;YAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;KACpC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,SAAgB,mBAAmB,CAAC,GAAoB;IACtD,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAHD,kDAGC;AAGD,SAAgB,yBAAyB,CAAC,GAAoB;IAC5D,OAAO,iBAAiB,CAAC,GAAG,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;AAC/C,CAAC;AAFD,8DAEC;AAWD,MAAM,iBAAiB,GAAG,CAAC,GAAoB,EAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"google-feed-envkv.js","sourceRoot":"","sources":["../../src/transformers/google-feed-envkv.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,5 +21,10 @@ export interface FeedItemRow {
|
|
|
21
21
|
rangeSourceField: string | null;
|
|
22
22
|
price: number | null;
|
|
23
23
|
availability: string | null;
|
|
24
|
+
publicationGate: string | null;
|
|
25
|
+
estimatedAttributes: string | null;
|
|
24
26
|
}
|
|
25
|
-
export declare function buildGoogleFeedItemRow(car: DataSchemes.Car, item: GoogleXmlItem, runId: string | null, exportedAt: Date
|
|
27
|
+
export declare function buildGoogleFeedItemRow(car: DataSchemes.Car, item: GoogleXmlItem, runId: string | null, exportedAt: Date, gate?: {
|
|
28
|
+
mode: string;
|
|
29
|
+
estimatedAttributes: string[];
|
|
30
|
+
} | null): FeedItemRow;
|
|
@@ -8,7 +8,7 @@ const sentPrice = (price) => {
|
|
|
8
8
|
const n = parseFloat(price);
|
|
9
9
|
return Number.isFinite(n) ? n : null;
|
|
10
10
|
};
|
|
11
|
-
function buildGoogleFeedItemRow(car, item, runId, exportedAt) {
|
|
11
|
+
function buildGoogleFeedItemRow(car, item, runId, exportedAt, gate = null) {
|
|
12
12
|
const hybridPlugin = (0, lodash_1.get)(car, 'engineData.hybridPlugin');
|
|
13
13
|
return {
|
|
14
14
|
partitionDay: exportedAt.toISOString().slice(0, 10),
|
|
@@ -31,6 +31,8 @@ function buildGoogleFeedItemRow(car, item, runId, exportedAt) {
|
|
|
31
31
|
rangeSourceField: item.electric_range ? (0, google_feed_envkv_1.googleElectricRangeSource)(car) : null,
|
|
32
32
|
price: sentPrice(item.price),
|
|
33
33
|
availability: orNull(item.availability),
|
|
34
|
+
publicationGate: gate ? gate.mode : null,
|
|
35
|
+
estimatedAttributes: gate && gate.estimatedAttributes.length ? gate.estimatedAttributes.join(',') : null,
|
|
34
36
|
};
|
|
35
37
|
}
|
|
36
38
|
exports.buildGoogleFeedItemRow = buildGoogleFeedItemRow;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-feed-item-row.js","sourceRoot":"","sources":["../../src/transformers/google-feed-item-row.ts"],"names":[],"mappings":";;;AAAA,mCAAwC;AAGxC,2DAAgE;
|
|
1
|
+
{"version":3,"file":"google-feed-item-row.js","sourceRoot":"","sources":["../../src/transformers/google-feed-item-row.ts"],"names":[],"mappings":";;;AAAA,mCAAwC;AAGxC,2DAAgE;AAgChE,MAAM,MAAM,GAAG,CAAC,KAAc,EAAiB,EAAE,CAC/C,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAG/E,MAAM,SAAS,GAAG,CAAC,KAAyB,EAAiB,EAAE;IAC7D,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACvC,CAAC,CAAC;AAGF,SAAgB,sBAAsB,CACpC,GAAoB,EACpB,IAAmB,EACnB,KAAoB,EACpB,UAAgB,EAChB,OAA+D,IAAI;IAEnE,MAAM,YAAY,GAAG,IAAA,YAAG,EAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC;IACzD,OAAO;QACL,YAAY,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QACnD,UAAU,EAAE,UAAU,CAAC,WAAW,EAAE;QACpC,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC,IAAA,YAAG,EAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;QACjD,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QACxB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QACzB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;QACjC,IAAI,EAAE,MAAM,CAAC,IAAA,YAAG,EAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;QAC1C,YAAY,EAAE,IAAA,kBAAS,EAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI;QAC3D,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QAC3B,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC;QAC1C,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC;QAC9C,yBAAyB,EAAE,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC;QAC3E,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC;QAClD,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;QACxC,gBAAgB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAA,6CAAyB,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;QAC7E,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;QAC5B,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;QACvC,eAAe,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;QACxC,mBAAmB,EAAE,IAAI,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;KACzG,CAAC;AACJ,CAAC;AAhCD,wDAgCC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { DataSchemes } from '@bytebrand/car-schema';
|
|
2
|
+
import { OpenAiAdsCondition, OpenAiAdsExclusion, OpenAiAdsOutOfStockReason, OpenAiAdsRow } from '../interfaces/openai-ads.interface';
|
|
3
|
+
import { OpenAiImageFields } from './openai-image-fields';
|
|
4
|
+
export declare const OPENAI_TITLE_MAX_LENGTH = 150;
|
|
5
|
+
export declare const OPENAI_DESCRIPTION_MAX_LENGTH = 5000;
|
|
6
|
+
export interface OpenAiAdsMappingContext {
|
|
7
|
+
domain: string;
|
|
8
|
+
sellerName: string;
|
|
9
|
+
translate: (key: string) => string;
|
|
10
|
+
now: Date;
|
|
11
|
+
}
|
|
12
|
+
export type OpenAiAdsBaseRow = Omit<OpenAiAdsRow, 'image_url' | 'additional_image_urls'>;
|
|
13
|
+
export type OpenAiAdsMapResult = {
|
|
14
|
+
ok: true;
|
|
15
|
+
row: OpenAiAdsBaseRow;
|
|
16
|
+
outOfStockReason?: OpenAiAdsOutOfStockReason;
|
|
17
|
+
} | {
|
|
18
|
+
ok: false;
|
|
19
|
+
reason: OpenAiAdsExclusion;
|
|
20
|
+
};
|
|
21
|
+
export declare const mapOpenAiAdsVehicle: (car: DataSchemes.Car, ctx: OpenAiAdsMappingContext) => OpenAiAdsMapResult;
|
|
22
|
+
export declare const withOpenAiImages: (row: OpenAiAdsBaseRow, images: OpenAiImageFields) => OpenAiAdsRow;
|
|
23
|
+
export declare const asOutOfStock: (row: OpenAiAdsRow) => OpenAiAdsRow;
|
|
24
|
+
export declare const formatOpenAiPrice: (value: unknown) => string | null;
|
|
25
|
+
export declare const toOpenAiMinorUnits: (value: unknown) => number | null;
|
|
26
|
+
export declare const buildOpenAiTitle: (car: DataSchemes.Car) => string;
|
|
27
|
+
export declare const resolveOpenAiCondition: (car: DataSchemes.Car, now: Date) => OpenAiAdsCondition | null;
|
|
28
|
+
export declare const buildOpenAiDescription: (car: DataSchemes.Car, title: string, condition: OpenAiAdsCondition, ctx: OpenAiAdsMappingContext) => string;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildOpenAiDescription = exports.resolveOpenAiCondition = exports.buildOpenAiTitle = exports.toOpenAiMinorUnits = exports.formatOpenAiPrice = exports.asOutOfStock = exports.withOpenAiImages = exports.mapOpenAiAdsVehicle = exports.OPENAI_DESCRIPTION_MAX_LENGTH = exports.OPENAI_TITLE_MAX_LENGTH = void 0;
|
|
4
|
+
const lodash_1 = require("lodash");
|
|
5
|
+
const utils_1 = require("../utils");
|
|
6
|
+
const openai_ads_interface_1 = require("../interfaces/openai-ads.interface");
|
|
7
|
+
const openai_image_fields_1 = require("./openai-image-fields");
|
|
8
|
+
exports.OPENAI_TITLE_MAX_LENGTH = 150;
|
|
9
|
+
exports.OPENAI_DESCRIPTION_MAX_LENGTH = 5000;
|
|
10
|
+
const PLACEHOLDER_MAKES = /^(sonstige|sonstiges|andere|other|unknown|unbekannt)$/i;
|
|
11
|
+
const OFFER_AVAILABILITY_OUT_OF_STOCK = {
|
|
12
|
+
selector_offerAvailability_reserved: openai_ads_interface_1.OpenAiAdsOutOfStockReason.reserved,
|
|
13
|
+
selector_offerAvailability_sold: openai_ads_interface_1.OpenAiAdsOutOfStockReason.soldFlag,
|
|
14
|
+
};
|
|
15
|
+
const mapOpenAiAdsVehicle = (car, ctx) => {
|
|
16
|
+
const itemId = (0, lodash_1.toString)((0, lodash_1.get)(car, '_id', '')).trim();
|
|
17
|
+
if (!itemId) {
|
|
18
|
+
return { ok: false, reason: openai_ads_interface_1.OpenAiAdsExclusion.noId };
|
|
19
|
+
}
|
|
20
|
+
const price = (0, exports.formatOpenAiPrice)((0, lodash_1.get)(car, 'price.currentSalesPrice', null));
|
|
21
|
+
if (!price) {
|
|
22
|
+
return { ok: false, reason: openai_ads_interface_1.OpenAiAdsExclusion.invalidPrice };
|
|
23
|
+
}
|
|
24
|
+
const brand = (0, lodash_1.trim)((0, lodash_1.toString)((0, lodash_1.get)(car, 'mainData.make', '')));
|
|
25
|
+
if (!brand || PLACEHOLDER_MAKES.test(brand)) {
|
|
26
|
+
return { ok: false, reason: openai_ads_interface_1.OpenAiAdsExclusion.noBrand };
|
|
27
|
+
}
|
|
28
|
+
const title = (0, exports.buildOpenAiTitle)(car);
|
|
29
|
+
if (!title) {
|
|
30
|
+
return { ok: false, reason: openai_ads_interface_1.OpenAiAdsExclusion.noTitle };
|
|
31
|
+
}
|
|
32
|
+
const condition = (0, exports.resolveOpenAiCondition)(car, ctx.now);
|
|
33
|
+
if (!condition) {
|
|
34
|
+
return { ok: false, reason: openai_ads_interface_1.OpenAiAdsExclusion.conditionUnknown };
|
|
35
|
+
}
|
|
36
|
+
const row = {
|
|
37
|
+
item_id: itemId,
|
|
38
|
+
title,
|
|
39
|
+
description: (0, exports.buildOpenAiDescription)(car, title, condition, ctx),
|
|
40
|
+
url: `https://www.${ctx.domain}/search/vehicle/${itemId}`,
|
|
41
|
+
brand,
|
|
42
|
+
seller_name: ctx.sellerName,
|
|
43
|
+
availability: 'in_stock',
|
|
44
|
+
price,
|
|
45
|
+
condition,
|
|
46
|
+
is_ads_eligible: true,
|
|
47
|
+
};
|
|
48
|
+
const outOfStockReason = OFFER_AVAILABILITY_OUT_OF_STOCK[(0, lodash_1.toString)((0, lodash_1.get)(car, 'offer.offerAvailability', ''))];
|
|
49
|
+
return outOfStockReason ? { ok: true, row, outOfStockReason } : { ok: true, row };
|
|
50
|
+
};
|
|
51
|
+
exports.mapOpenAiAdsVehicle = mapOpenAiAdsVehicle;
|
|
52
|
+
const withOpenAiImages = (row, images) => ({
|
|
53
|
+
...row,
|
|
54
|
+
image_url: images.image_url,
|
|
55
|
+
additional_image_urls: images.additional_image_urls.map(openai_image_fields_1.encodeCommasInUrl).join(','),
|
|
56
|
+
});
|
|
57
|
+
exports.withOpenAiImages = withOpenAiImages;
|
|
58
|
+
const asOutOfStock = (row) => ({
|
|
59
|
+
...row,
|
|
60
|
+
availability: 'out_of_stock',
|
|
61
|
+
is_ads_eligible: false,
|
|
62
|
+
});
|
|
63
|
+
exports.asOutOfStock = asOutOfStock;
|
|
64
|
+
const formatOpenAiPrice = (value) => {
|
|
65
|
+
if (value === null || value === undefined || value === '' || typeof value === 'boolean') {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
const amount = (0, lodash_1.toNumber)(value);
|
|
69
|
+
if (!Number.isFinite(amount) || amount <= 0) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
return `${amount.toFixed(2)} EUR`;
|
|
73
|
+
};
|
|
74
|
+
exports.formatOpenAiPrice = formatOpenAiPrice;
|
|
75
|
+
const toOpenAiMinorUnits = (value) => {
|
|
76
|
+
const formatted = (0, exports.formatOpenAiPrice)(value);
|
|
77
|
+
return formatted ? Math.round((0, lodash_1.toNumber)(formatted.split(' ')[0]) * 100) : null;
|
|
78
|
+
};
|
|
79
|
+
exports.toOpenAiMinorUnits = toOpenAiMinorUnits;
|
|
80
|
+
const buildOpenAiTitle = (car) => {
|
|
81
|
+
const parts = ['mainData.make', 'mainData.model', 'mainData.subModel'].map(path => (0, lodash_1.toString)((0, lodash_1.get)(car, path, '')));
|
|
82
|
+
const title = (0, utils_1.normalizeFeedText)(parts.join(' '));
|
|
83
|
+
return (0, lodash_1.truncate)(title, { length: exports.OPENAI_TITLE_MAX_LENGTH, separator: ' ', omission: '' }).trim();
|
|
84
|
+
};
|
|
85
|
+
exports.buildOpenAiTitle = buildOpenAiTitle;
|
|
86
|
+
const resolveOpenAiCondition = (car, now) => {
|
|
87
|
+
const condition = (0, lodash_1.toString)((0, lodash_1.get)(car, 'mainData.condition', ''));
|
|
88
|
+
if (condition === 'selector_condition_new') {
|
|
89
|
+
return 'new';
|
|
90
|
+
}
|
|
91
|
+
if (condition === 'selector_condition_used') {
|
|
92
|
+
return 'used';
|
|
93
|
+
}
|
|
94
|
+
const firstRegistration = (0, lodash_1.toNumber)((0, lodash_1.get)(car, 'mainData.firstRegistration', 0));
|
|
95
|
+
return firstRegistration > 0 && firstRegistration * 1000 <= now.getTime() ? 'used' : null;
|
|
96
|
+
};
|
|
97
|
+
exports.resolveOpenAiCondition = resolveOpenAiCondition;
|
|
98
|
+
const buildOpenAiDescription = (car, title, condition, ctx) => {
|
|
99
|
+
const label = (path) => {
|
|
100
|
+
const key = (0, lodash_1.toString)((0, lodash_1.get)(car, path, ''));
|
|
101
|
+
if (!key || key === 'selector_unknown') {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
const value = (0, lodash_1.trim)(ctx.translate(key));
|
|
105
|
+
return value && !value.startsWith('selector_') && value !== 'Unbekannt' ? value : null;
|
|
106
|
+
};
|
|
107
|
+
const facts = [
|
|
108
|
+
['Erstzulassung', formatFirstRegistration((0, lodash_1.get)(car, 'mainData.firstRegistration'))],
|
|
109
|
+
['Kilometerstand', formatMileage((0, lodash_1.get)(car, 'mainData.mileage'))],
|
|
110
|
+
['Kraftstoff', label('consumption.fuel')],
|
|
111
|
+
['Getriebe', label('driveSuspension.gearbox')],
|
|
112
|
+
['Leistung', formatPower((0, lodash_1.get)(car, 'engineData.powerKW'), (0, lodash_1.get)(car, 'engineData.powerPS'))],
|
|
113
|
+
['Karosserie', label('mainData.category')],
|
|
114
|
+
['Außenfarbe', label('exterior.exteriorColor')],
|
|
115
|
+
];
|
|
116
|
+
const intro = `${condition === 'new' ? 'Neuwagen' : 'Gebrauchtwagen'}: ${title}.`;
|
|
117
|
+
const details = facts.filter(([, value]) => value).map(([name, value]) => `${name}: ${value}`).join(' · ');
|
|
118
|
+
const text = (details ? `${intro} ${details}` : intro).replace(/\s+/g, ' ').trim();
|
|
119
|
+
return (0, lodash_1.truncate)(text, { length: exports.OPENAI_DESCRIPTION_MAX_LENGTH, separator: ' ', omission: '' }).trim();
|
|
120
|
+
};
|
|
121
|
+
exports.buildOpenAiDescription = buildOpenAiDescription;
|
|
122
|
+
const DE_NUMBER = new Intl.NumberFormat('de-DE', { maximumFractionDigits: 0 });
|
|
123
|
+
const formatFirstRegistration = (value) => {
|
|
124
|
+
const seconds = (0, lodash_1.toNumber)(value);
|
|
125
|
+
if (!Number.isFinite(seconds) || seconds <= 0) {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
const date = new Date(seconds * 1000);
|
|
129
|
+
return `${String(date.getUTCMonth() + 1).padStart(2, '0')}/${date.getUTCFullYear()}`;
|
|
130
|
+
};
|
|
131
|
+
const formatMileage = (value) => {
|
|
132
|
+
const km = (0, lodash_1.toNumber)(value);
|
|
133
|
+
return Number.isFinite(km) && km > 0 ? `${DE_NUMBER.format(km)} km` : null;
|
|
134
|
+
};
|
|
135
|
+
const formatPower = (kw, ps) => {
|
|
136
|
+
const powerKw = (0, lodash_1.toNumber)(kw);
|
|
137
|
+
if (!Number.isFinite(powerKw) || powerKw <= 0) {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
const powerPs = (0, lodash_1.toNumber)(ps);
|
|
141
|
+
const psPart = Number.isFinite(powerPs) && powerPs > 0 ? ` (${DE_NUMBER.format(powerPs)} PS)` : '';
|
|
142
|
+
return `${DE_NUMBER.format(powerKw)} kW${psPart}`;
|
|
143
|
+
};
|
|
144
|
+
//# sourceMappingURL=openai-ads.transformer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-ads.transformer.js","sourceRoot":"","sources":["../../src/transformers/openai-ads.transformer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { CleanImage } from '../services/images.service';
|
|
2
|
+
import { ImageUrlCheck, ImageUrlValidator } from '../services/image-url-validator.service';
|
|
3
|
+
export interface OpenAiImageFields {
|
|
4
|
+
image_url: string;
|
|
5
|
+
additional_image_urls: string[];
|
|
6
|
+
}
|
|
7
|
+
export interface OpenAiImageSelection {
|
|
8
|
+
fields: OpenAiImageFields | null;
|
|
9
|
+
rejected: ImageUrlCheck[];
|
|
10
|
+
}
|
|
11
|
+
export declare const selectOpenAiImageFields: (images: CleanImage[], checks: ImageUrlCheck[]) => OpenAiImageSelection;
|
|
12
|
+
export declare const resolveOpenAiImageFields: (images: CleanImage[], validator: ImageUrlValidator) => Promise<OpenAiImageSelection>;
|
|
13
|
+
export declare const encodeCommasInUrl: (url: string) => string;
|
|
14
|
+
export declare const serializeAdditionalImageUrlsForCsv: (urls: string[]) => string;
|
|
15
|
+
export declare const serializeAdditionalImageUrlsForJsonl: (urls: string[]) => string[];
|
|
16
|
+
export declare const quoteCsvCell: (value: string) => string;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.quoteCsvCell = exports.serializeAdditionalImageUrlsForJsonl = exports.serializeAdditionalImageUrlsForCsv = exports.encodeCommasInUrl = exports.resolveOpenAiImageFields = exports.selectOpenAiImageFields = void 0;
|
|
4
|
+
const selectOpenAiImageFields = (images, checks) => {
|
|
5
|
+
const byUrl = new Map(checks.map(check => [check.url, check]));
|
|
6
|
+
const isValid = (image) => byUrl.get(image.url)?.ok === true;
|
|
7
|
+
const rejected = images.map(image => byUrl.get(image.url)).filter(check => check && !check.ok);
|
|
8
|
+
const hero = images.find(image => image.heroCandidate && isValid(image));
|
|
9
|
+
if (!hero) {
|
|
10
|
+
return { fields: null, rejected };
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
fields: {
|
|
14
|
+
image_url: hero.url,
|
|
15
|
+
additional_image_urls: images.filter(image => image !== hero && isValid(image)).map(image => image.url),
|
|
16
|
+
},
|
|
17
|
+
rejected,
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
exports.selectOpenAiImageFields = selectOpenAiImageFields;
|
|
21
|
+
const resolveOpenAiImageFields = async (images, validator) => {
|
|
22
|
+
const checks = await validator.validateAll(images.map(image => image.url));
|
|
23
|
+
return (0, exports.selectOpenAiImageFields)(images, checks);
|
|
24
|
+
};
|
|
25
|
+
exports.resolveOpenAiImageFields = resolveOpenAiImageFields;
|
|
26
|
+
const encodeCommasInUrl = (url) => url.replace(/,/g, '%2C');
|
|
27
|
+
exports.encodeCommasInUrl = encodeCommasInUrl;
|
|
28
|
+
const serializeAdditionalImageUrlsForCsv = (urls) => (0, exports.quoteCsvCell)(urls.map(exports.encodeCommasInUrl).join(','));
|
|
29
|
+
exports.serializeAdditionalImageUrlsForCsv = serializeAdditionalImageUrlsForCsv;
|
|
30
|
+
const serializeAdditionalImageUrlsForJsonl = (urls) => urls.map(exports.encodeCommasInUrl);
|
|
31
|
+
exports.serializeAdditionalImageUrlsForJsonl = serializeAdditionalImageUrlsForJsonl;
|
|
32
|
+
const quoteCsvCell = (value) => `"${value.replace(/"/g, '""')}"`;
|
|
33
|
+
exports.quoteCsvCell = quoteCsvCell;
|
|
34
|
+
//# sourceMappingURL=openai-image-fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-image-fields.js","sourceRoot":"","sources":["../../src/transformers/openai-image-fields.ts"],"names":[],"mappings":";;;AAsBO,MAAM,uBAAuB,GAAG,CAAC,MAAoB,EAAE,MAAuB,EAAwB,EAAE;IAC7G,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,CAAC,KAAiB,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;IACzE,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAE/F,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACzE,IAAI,CAAC,IAAI,EAAE;QACT,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;KACnC;IAED,OAAO;QACL,MAAM,EAAE;YACN,SAAS,EAAE,IAAI,CAAC,GAAG;YACnB,qBAAqB,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;SACxG;QACD,QAAQ;KACT,CAAC;AACJ,CAAC,CAAC;AAjBW,QAAA,uBAAuB,2BAiBlC;AAEK,MAAM,wBAAwB,GAAG,KAAK,EAC3C,MAAoB,EACpB,SAA4B,EACG,EAAE;IACjC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3E,OAAO,IAAA,+BAAuB,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC,CAAC;AANW,QAAA,wBAAwB,4BAMnC;AAGK,MAAM,iBAAiB,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAAtE,QAAA,iBAAiB,qBAAqD;AAI5E,MAAM,kCAAkC,GAAG,CAAC,IAAc,EAAU,EAAE,CAC3E,IAAA,oBAAY,EAAC,IAAI,CAAC,GAAG,CAAC,yBAAiB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AADzC,QAAA,kCAAkC,sCACO;AAE/C,MAAM,oCAAoC,GAAG,CAAC,IAAc,EAAY,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,yBAAiB,CAAC,CAAC;AAAjG,QAAA,oCAAoC,wCAA6D;AAEvG,MAAM,YAAY,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;AAA3E,QAAA,YAAY,gBAA+D"}
|