@fin.cx/einvoice 5.0.3 → 5.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/einvoice.d.ts +4 -8
- package/dist_ts/einvoice.js +46 -7
- package/dist_ts/formats/converters/xml-to-einvoice.converter.d.ts +21 -0
- package/dist_ts/formats/converters/xml-to-einvoice.converter.js +127 -0
- package/dist_ts/formats/semantic/bt-bg.model.d.ts +445 -0
- package/dist_ts/formats/semantic/bt-bg.model.js +12 -0
- package/dist_ts/formats/semantic/semantic.adapter.d.ts +87 -0
- package/dist_ts/formats/semantic/semantic.adapter.js +538 -0
- package/dist_ts/formats/semantic/semantic.validator.d.ts +48 -0
- package/dist_ts/formats/semantic/semantic.validator.js +596 -0
- package/dist_ts/formats/utils/currency.calculator.decimal.d.ts +98 -0
- package/dist_ts/formats/utils/currency.calculator.decimal.js +212 -0
- package/dist_ts/formats/utils/currency.utils.d.ts +99 -0
- package/dist_ts/formats/utils/currency.utils.js +250 -0
- package/dist_ts/formats/utils/decimal.d.ts +151 -0
- package/dist_ts/formats/utils/decimal.js +435 -0
- package/dist_ts/formats/validation/codelist.validator.d.ts +49 -0
- package/dist_ts/formats/validation/codelist.validator.js +188 -0
- package/dist_ts/formats/validation/conformance.harness.d.ts +99 -0
- package/dist_ts/formats/validation/conformance.harness.js +471 -0
- package/dist_ts/formats/validation/en16931.business-rules.validator.d.ts +58 -0
- package/dist_ts/formats/validation/en16931.business-rules.validator.js +459 -0
- package/dist_ts/formats/validation/facturx.validator.d.ts +75 -0
- package/dist_ts/formats/validation/facturx.validator.js +522 -0
- package/dist_ts/formats/validation/integrated.validator.d.ts +82 -0
- package/dist_ts/formats/validation/integrated.validator.js +311 -0
- package/dist_ts/formats/validation/peppol.validator.d.ts +77 -0
- package/dist_ts/formats/validation/peppol.validator.js +529 -0
- package/dist_ts/formats/validation/schematron.downloader.d.ts +71 -0
- package/dist_ts/formats/validation/schematron.downloader.js +254 -0
- package/dist_ts/formats/validation/schematron.integration.d.ts +60 -0
- package/dist_ts/formats/validation/schematron.integration.js +230 -0
- package/dist_ts/formats/validation/schematron.validator.d.ts +79 -0
- package/dist_ts/formats/validation/schematron.validator.js +288 -0
- package/dist_ts/formats/validation/schematron.worker.d.ts +50 -0
- package/dist_ts/formats/validation/schematron.worker.js +185 -0
- package/dist_ts/formats/validation/validation.types.d.ts +163 -0
- package/dist_ts/formats/validation/validation.types.js +181 -0
- package/dist_ts/formats/validation/vat-categories.validator.d.ts +87 -0
- package/dist_ts/formats/validation/vat-categories.validator.js +497 -0
- package/dist_ts/formats/validation/xrechnung.validator.d.ts +92 -0
- package/dist_ts/formats/validation/xrechnung.validator.js +417 -0
- package/dist_ts/interfaces/common.d.ts +1 -0
- package/dist_ts/interfaces/en16931-metadata.d.ts +83 -0
- package/dist_ts/interfaces/en16931-metadata.js +6 -0
- package/dist_ts/plugins.d.ts +3 -1
- package/dist_ts/plugins.js +7 -2
- package/dist_ts_install/download-schematron.d.ts +6 -0
- package/dist_ts_install/download-schematron.js +62 -0
- package/dist_ts_install/download-test-samples.d.ts +19 -0
- package/dist_ts_install/download-test-samples.js +169 -0
- package/dist_ts_install/download-xrechnung-rules.d.ts +7 -0
- package/dist_ts_install/download-xrechnung-rules.js +146 -0
- package/dist_ts_install/index.d.ts +8 -0
- package/dist_ts_install/index.js +246 -0
- package/package.json +9 -3
- package/readme.md +255 -810
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/einvoice.ts +63 -14
- package/ts/formats/converters/xml-to-einvoice.converter.ts +142 -0
- package/ts/formats/semantic/bt-bg.model.ts +524 -0
- package/ts/formats/semantic/semantic.adapter.ts +600 -0
- package/ts/formats/semantic/semantic.validator.ts +654 -0
- package/ts/formats/utils/currency.calculator.decimal.ts +323 -0
- package/ts/formats/utils/currency.utils.ts +299 -0
- package/ts/formats/utils/decimal.ts +509 -0
- package/ts/formats/validation/codelist.validator.ts +317 -0
- package/ts/formats/validation/conformance.harness.ts +591 -0
- package/ts/formats/validation/en16931.business-rules.validator.ts +694 -0
- package/ts/formats/validation/facturx.validator.ts +579 -0
- package/ts/formats/validation/integrated.validator.ts +405 -0
- package/ts/formats/validation/peppol.validator.ts +589 -0
- package/ts/formats/validation/schematron.downloader.ts +304 -0
- package/ts/formats/validation/schematron.integration.ts +285 -0
- package/ts/formats/validation/schematron.validator.ts +348 -0
- package/ts/formats/validation/schematron.worker.ts +221 -0
- package/ts/formats/validation/validation.types.ts +274 -0
- package/ts/formats/validation/vat-categories.validator.ts +845 -0
- package/ts/formats/validation/xrechnung.validator.ts +494 -0
- package/ts/interfaces/common.ts +1 -0
- package/ts/interfaces/en16931-metadata.ts +104 -0
- package/ts/plugins.ts +8 -0
- package/ts/tspublish.json +3 -0
- package/dist_ts/classes.decoder.d.ts +0 -40
- package/dist_ts/classes.decoder.js +0 -320
- package/dist_ts/classes.encoder.d.ts +0 -51
- package/dist_ts/classes.encoder.js +0 -293
- package/dist_ts/classes.xinvoice.d.ts +0 -136
- package/dist_ts/classes.xinvoice.js +0 -352
- package/dist_ts/formats/base.decoder.d.ts +0 -19
- package/dist_ts/formats/base.decoder.js +0 -130
- package/dist_ts/formats/base.validator.d.ts +0 -44
- package/dist_ts/formats/base.validator.js +0 -39
- package/dist_ts/formats/decoder.factory.d.ts +0 -15
- package/dist_ts/formats/decoder.factory.js +0 -46
- package/dist_ts/formats/factorx.decoder.d.ts +0 -18
- package/dist_ts/formats/factorx.decoder.js +0 -178
- package/dist_ts/formats/factorx.encoder.d.ts +0 -51
- package/dist_ts/formats/factorx.encoder.js +0 -293
- package/dist_ts/formats/facturx.decoder.d.ts +0 -18
- package/dist_ts/formats/facturx.decoder.js +0 -210
- package/dist_ts/formats/facturx.encoder.d.ts +0 -51
- package/dist_ts/formats/facturx.encoder.js +0 -293
- package/dist_ts/formats/facturx.validator.d.ts +0 -67
- package/dist_ts/formats/facturx.validator.js +0 -266
- package/dist_ts/formats/pdf/robust-pdf.extractor.d.ts +0 -40
- package/dist_ts/formats/pdf/robust-pdf.extractor.js +0 -324
- package/dist_ts/formats/ubl.validator.d.ts +0 -82
- package/dist_ts/formats/ubl.validator.js +0 -306
- package/dist_ts/formats/validator.factory.d.ts +0 -18
- package/dist_ts/formats/validator.factory.js +0 -78
- package/dist_ts/formats/xinvoice.decoder.d.ts +0 -28
- package/dist_ts/formats/xinvoice.decoder.js +0 -332
- package/dist_ts/formats/xinvoice.encoder.d.ts +0 -19
- package/dist_ts/formats/xinvoice.encoder.js +0 -282
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Download official EN16931 and PEPPOL test samples for conformance testing
|
|
4
|
+
*/
|
|
5
|
+
interface TestSampleSource {
|
|
6
|
+
name: string;
|
|
7
|
+
description: string;
|
|
8
|
+
repository: string;
|
|
9
|
+
branch: string;
|
|
10
|
+
paths: string[];
|
|
11
|
+
targetDir: string;
|
|
12
|
+
}
|
|
13
|
+
declare const TEST_SAMPLE_SOURCES: TestSampleSource[];
|
|
14
|
+
/**
|
|
15
|
+
* Main function
|
|
16
|
+
*/
|
|
17
|
+
declare function main(): Promise<void>;
|
|
18
|
+
export default main;
|
|
19
|
+
export { TEST_SAMPLE_SOURCES };
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Download official EN16931 and PEPPOL test samples for conformance testing
|
|
4
|
+
*/
|
|
5
|
+
import * as https from 'https';
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import { createWriteStream } from 'fs';
|
|
9
|
+
import { pipeline } from 'stream/promises';
|
|
10
|
+
import { fileURLToPath } from 'url';
|
|
11
|
+
const TEST_SAMPLE_SOURCES = [
|
|
12
|
+
{
|
|
13
|
+
name: 'PEPPOL BIS 3.0 Examples',
|
|
14
|
+
description: 'Official PEPPOL BIS Billing 3.0 example files',
|
|
15
|
+
repository: 'OpenPEPPOL/peppol-bis-invoice-3',
|
|
16
|
+
branch: 'master',
|
|
17
|
+
paths: [
|
|
18
|
+
'rules/examples/Allowance-example.xml',
|
|
19
|
+
'rules/examples/base-example.xml',
|
|
20
|
+
'rules/examples/base-negative-inv-correction.xml',
|
|
21
|
+
'rules/examples/vat-category-E.xml',
|
|
22
|
+
'rules/examples/vat-category-O.xml',
|
|
23
|
+
'rules/examples/vat-category-S.xml',
|
|
24
|
+
'rules/examples/vat-category-Z.xml',
|
|
25
|
+
'rules/examples/vat-category-AE.xml',
|
|
26
|
+
'rules/examples/vat-category-K.xml',
|
|
27
|
+
'rules/examples/vat-category-G.xml'
|
|
28
|
+
],
|
|
29
|
+
targetDir: 'peppol-bis3'
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: 'CEN TC434 Test Files',
|
|
33
|
+
description: 'European Committee for Standardization test files',
|
|
34
|
+
repository: 'ConnectingEurope/eInvoicing-EN16931',
|
|
35
|
+
branch: 'master',
|
|
36
|
+
paths: [
|
|
37
|
+
'ubl/examples/ubl-tc434-example1.xml',
|
|
38
|
+
'ubl/examples/ubl-tc434-example2.xml',
|
|
39
|
+
'ubl/examples/ubl-tc434-example3.xml',
|
|
40
|
+
'ubl/examples/ubl-tc434-example4.xml',
|
|
41
|
+
'ubl/examples/ubl-tc434-example5.xml',
|
|
42
|
+
'ubl/examples/ubl-tc434-example6.xml',
|
|
43
|
+
'ubl/examples/ubl-tc434-example7.xml',
|
|
44
|
+
'ubl/examples/ubl-tc434-example8.xml',
|
|
45
|
+
'ubl/examples/ubl-tc434-example9.xml',
|
|
46
|
+
'cii/examples/cii-tc434-example1.xml',
|
|
47
|
+
'cii/examples/cii-tc434-example2.xml',
|
|
48
|
+
'cii/examples/cii-tc434-example3.xml',
|
|
49
|
+
'cii/examples/cii-tc434-example4.xml',
|
|
50
|
+
'cii/examples/cii-tc434-example5.xml',
|
|
51
|
+
'cii/examples/cii-tc434-example6.xml',
|
|
52
|
+
'cii/examples/cii-tc434-example7.xml',
|
|
53
|
+
'cii/examples/cii-tc434-example8.xml',
|
|
54
|
+
'cii/examples/cii-tc434-example9.xml'
|
|
55
|
+
],
|
|
56
|
+
targetDir: 'cen-tc434'
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: 'PEPPOL Validation Artifacts',
|
|
60
|
+
description: 'PEPPOL validation test files',
|
|
61
|
+
repository: 'OpenPEPPOL/peppol-bis-invoice-3',
|
|
62
|
+
branch: 'master',
|
|
63
|
+
paths: [
|
|
64
|
+
'rules/unit-UBL/PEPPOL-EN16931-UBL.xml'
|
|
65
|
+
],
|
|
66
|
+
targetDir: 'peppol-validation'
|
|
67
|
+
}
|
|
68
|
+
];
|
|
69
|
+
/**
|
|
70
|
+
* Download a file from GitHub
|
|
71
|
+
*/
|
|
72
|
+
async function downloadFile(repo, branch, filePath, targetPath) {
|
|
73
|
+
const url = `https://raw.githubusercontent.com/${repo}/${branch}/${filePath}`;
|
|
74
|
+
return new Promise((resolve, reject) => {
|
|
75
|
+
https.get(url, (response) => {
|
|
76
|
+
if (response.statusCode === 404) {
|
|
77
|
+
console.warn(` ⚠️ File not found: ${filePath}`);
|
|
78
|
+
resolve();
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (response.statusCode !== 200) {
|
|
82
|
+
reject(new Error(`Failed to download ${url}: ${response.statusCode}`));
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const dir = path.dirname(targetPath);
|
|
86
|
+
if (!fs.existsSync(dir)) {
|
|
87
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
88
|
+
}
|
|
89
|
+
const file = createWriteStream(targetPath);
|
|
90
|
+
response.pipe(file);
|
|
91
|
+
file.on('finish', () => {
|
|
92
|
+
file.close();
|
|
93
|
+
console.log(` ✅ Downloaded: ${path.basename(filePath)}`);
|
|
94
|
+
resolve();
|
|
95
|
+
});
|
|
96
|
+
file.on('error', (err) => {
|
|
97
|
+
fs.unlink(targetPath, () => { }); // Delete incomplete file
|
|
98
|
+
reject(err);
|
|
99
|
+
});
|
|
100
|
+
}).on('error', reject);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Download test samples from a source
|
|
105
|
+
*/
|
|
106
|
+
async function downloadTestSamples(source) {
|
|
107
|
+
console.log(`\n📦 ${source.name}`);
|
|
108
|
+
console.log(` ${source.description}`);
|
|
109
|
+
console.log(` Repository: ${source.repository}`);
|
|
110
|
+
const baseDir = path.join('test-samples', source.targetDir);
|
|
111
|
+
for (const filePath of source.paths) {
|
|
112
|
+
const fileName = path.basename(filePath);
|
|
113
|
+
const targetPath = path.join(baseDir, fileName);
|
|
114
|
+
try {
|
|
115
|
+
await downloadFile(source.repository, source.branch, filePath, targetPath);
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
console.error(` ❌ Error downloading ${fileName}: ${error.message}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Create metadata file for downloaded samples
|
|
124
|
+
*/
|
|
125
|
+
function createMetadata(sources) {
|
|
126
|
+
const metadata = {
|
|
127
|
+
downloadDate: new Date().toISOString(),
|
|
128
|
+
sources: sources.map(s => ({
|
|
129
|
+
name: s.name,
|
|
130
|
+
repository: s.repository,
|
|
131
|
+
branch: s.branch,
|
|
132
|
+
fileCount: s.paths.length
|
|
133
|
+
})),
|
|
134
|
+
totalFiles: sources.reduce((sum, s) => sum + s.paths.length, 0)
|
|
135
|
+
};
|
|
136
|
+
const metadataPath = path.join('test-samples', 'metadata.json');
|
|
137
|
+
fs.writeFileSync(metadataPath, JSON.stringify(metadata, null, 2));
|
|
138
|
+
console.log('\n📝 Created metadata.json');
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Main function
|
|
142
|
+
*/
|
|
143
|
+
async function main() {
|
|
144
|
+
console.log('🚀 Downloading official EN16931 test samples...\n');
|
|
145
|
+
// Create base directory
|
|
146
|
+
if (!fs.existsSync('test-samples')) {
|
|
147
|
+
fs.mkdirSync('test-samples');
|
|
148
|
+
}
|
|
149
|
+
// Download samples from each source
|
|
150
|
+
for (const source of TEST_SAMPLE_SOURCES) {
|
|
151
|
+
await downloadTestSamples(source);
|
|
152
|
+
}
|
|
153
|
+
// Create metadata file
|
|
154
|
+
createMetadata(TEST_SAMPLE_SOURCES);
|
|
155
|
+
console.log('\n✨ Test sample download complete!');
|
|
156
|
+
console.log('📁 Samples saved to: test-samples/');
|
|
157
|
+
// Count total files
|
|
158
|
+
const totalFiles = TEST_SAMPLE_SOURCES.reduce((sum, s) => sum + s.paths.length, 0);
|
|
159
|
+
console.log(`📊 Total files: ${totalFiles}`);
|
|
160
|
+
}
|
|
161
|
+
// Run if executed directly
|
|
162
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
163
|
+
const __dirname = path.dirname(__filename);
|
|
164
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
165
|
+
main().catch(console.error);
|
|
166
|
+
}
|
|
167
|
+
export default main;
|
|
168
|
+
export { TEST_SAMPLE_SOURCES };
|
|
169
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG93bmxvYWQtdGVzdC1zYW1wbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfaW5zdGFsbC9kb3dubG9hZC10ZXN0LXNhbXBsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBOztHQUVHO0FBRUgsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBV3BDLE1BQU0sbUJBQW1CLEdBQXVCO0lBQzlDO1FBQ0UsSUFBSSxFQUFFLHlCQUF5QjtRQUMvQixXQUFXLEVBQUUsK0NBQStDO1FBQzVELFVBQVUsRUFBRSxpQ0FBaUM7UUFDN0MsTUFBTSxFQUFFLFFBQVE7UUFDaEIsS0FBSyxFQUFFO1lBQ0wsc0NBQXNDO1lBQ3RDLGlDQUFpQztZQUNqQyxpREFBaUQ7WUFDakQsbUNBQW1DO1lBQ25DLG1DQUFtQztZQUNuQyxtQ0FBbUM7WUFDbkMsbUNBQW1DO1lBQ25DLG9DQUFvQztZQUNwQyxtQ0FBbUM7WUFDbkMsbUNBQW1DO1NBQ3BDO1FBQ0QsU0FBUyxFQUFFLGFBQWE7S0FDekI7SUFDRDtRQUNFLElBQUksRUFBRSxzQkFBc0I7UUFDNUIsV0FBVyxFQUFFLG1EQUFtRDtRQUNoRSxVQUFVLEVBQUUscUNBQXFDO1FBQ2pELE1BQU0sRUFBRSxRQUFRO1FBQ2hCLEtBQUssRUFBRTtZQUNMLHFDQUFxQztZQUNyQyxxQ0FBcUM7WUFDckMscUNBQXFDO1lBQ3JDLHFDQUFxQztZQUNyQyxxQ0FBcUM7WUFDckMscUNBQXFDO1lBQ3JDLHFDQUFxQztZQUNyQyxxQ0FBcUM7WUFDckMs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
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Downloads official XRechnung Schematron validation rules
|
|
4
|
+
* from the KoSIT repositories
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import { execSync } from 'child_process';
|
|
9
|
+
const XRECHNUNG_VERSION = '3.0.2'; // Latest version as of 2025
|
|
10
|
+
const VALIDATOR_VERSION = '2025-07-31'; // Next release date
|
|
11
|
+
const REPOS = {
|
|
12
|
+
schematron: {
|
|
13
|
+
url: 'https://github.com/itplr-kosit/xrechnung-schematron/archive/refs/tags/release-3.0.2.zip',
|
|
14
|
+
dir: 'xrechnung-schematron'
|
|
15
|
+
},
|
|
16
|
+
validator: {
|
|
17
|
+
url: 'https://github.com/itplr-kosit/validator-configuration-xrechnung/releases/download/release-2024-07-31/validator-configuration-xrechnung_3.0.1_2024-07-31.zip',
|
|
18
|
+
dir: 'xrechnung-validator'
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
const ASSETS_DIR = path.join(process.cwd(), 'assets', 'schematron', 'xrechnung');
|
|
22
|
+
async function downloadFile(url, destination) {
|
|
23
|
+
console.log(`Downloading ${url}...`);
|
|
24
|
+
try {
|
|
25
|
+
// Use curl to download the file
|
|
26
|
+
execSync(`curl -L -o "${destination}" "${url}"`, { stdio: 'inherit' });
|
|
27
|
+
console.log(`Downloaded to ${destination}`);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
console.error(`Failed to download ${url}:`, error);
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function extractZip(zipFile, destination) {
|
|
35
|
+
console.log(`Extracting ${zipFile}...`);
|
|
36
|
+
try {
|
|
37
|
+
// Create destination directory if it doesn't exist
|
|
38
|
+
fs.mkdirSync(destination, { recursive: true });
|
|
39
|
+
// Extract using unzip
|
|
40
|
+
execSync(`unzip -o "${zipFile}" -d "${destination}"`, { stdio: 'inherit' });
|
|
41
|
+
console.log(`Extracted to ${destination}`);
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
console.error(`Failed to extract ${zipFile}:`, error);
|
|
45
|
+
throw error;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function downloadXRechnungRules() {
|
|
49
|
+
console.log('Starting XRechnung Schematron rules download...\n');
|
|
50
|
+
// Create assets directory
|
|
51
|
+
fs.mkdirSync(ASSETS_DIR, { recursive: true });
|
|
52
|
+
const tempDir = path.join(ASSETS_DIR, 'temp');
|
|
53
|
+
fs.mkdirSync(tempDir, { recursive: true });
|
|
54
|
+
// Download and extract Schematron rules
|
|
55
|
+
console.log('1. Downloading XRechnung Schematron rules...');
|
|
56
|
+
const schematronZip = path.join(tempDir, 'xrechnung-schematron.zip');
|
|
57
|
+
await downloadFile(REPOS.schematron.url, schematronZip);
|
|
58
|
+
const schematronDir = path.join(ASSETS_DIR, REPOS.schematron.dir);
|
|
59
|
+
await extractZip(schematronZip, schematronDir);
|
|
60
|
+
// Find the actual Schematron files
|
|
61
|
+
const schematronExtractedDir = path.join(schematronDir, `xrechnung-schematron-release-${XRECHNUNG_VERSION}`);
|
|
62
|
+
const schematronValidationDir = path.join(schematronExtractedDir, 'validation', 'schematron');
|
|
63
|
+
if (fs.existsSync(schematronValidationDir)) {
|
|
64
|
+
console.log('\nFound Schematron validation files:');
|
|
65
|
+
// List UBL Schematron files
|
|
66
|
+
const ublDir = path.join(schematronValidationDir, 'ubl-inv');
|
|
67
|
+
if (fs.existsSync(ublDir)) {
|
|
68
|
+
const ublFiles = fs.readdirSync(ublDir).filter(f => f.endsWith('.sch') || f.endsWith('.xsl'));
|
|
69
|
+
console.log(' UBL Invoice Schematron:', ublFiles.join(', '));
|
|
70
|
+
}
|
|
71
|
+
// List CII Schematron files
|
|
72
|
+
const ciiDir = path.join(schematronValidationDir, 'cii');
|
|
73
|
+
if (fs.existsSync(ciiDir)) {
|
|
74
|
+
const ciiFiles = fs.readdirSync(ciiDir).filter(f => f.endsWith('.sch') || f.endsWith('.xsl'));
|
|
75
|
+
console.log(' CII Schematron:', ciiFiles.join(', '));
|
|
76
|
+
}
|
|
77
|
+
// Copy to final location
|
|
78
|
+
const finalUblDir = path.join(ASSETS_DIR, 'ubl');
|
|
79
|
+
const finalCiiDir = path.join(ASSETS_DIR, 'cii');
|
|
80
|
+
fs.mkdirSync(finalUblDir, { recursive: true });
|
|
81
|
+
fs.mkdirSync(finalCiiDir, { recursive: true });
|
|
82
|
+
// Copy UBL files
|
|
83
|
+
if (fs.existsSync(ublDir)) {
|
|
84
|
+
const ublFiles = fs.readdirSync(ublDir);
|
|
85
|
+
for (const file of ublFiles) {
|
|
86
|
+
if (file.endsWith('.sch') || file.endsWith('.xsl')) {
|
|
87
|
+
fs.copyFileSync(path.join(ublDir, file), path.join(finalUblDir, file));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
console.log(`\nCopied UBL Schematron files to ${finalUblDir}`);
|
|
91
|
+
}
|
|
92
|
+
// Copy CII files
|
|
93
|
+
if (fs.existsSync(ciiDir)) {
|
|
94
|
+
const ciiFiles = fs.readdirSync(ciiDir);
|
|
95
|
+
for (const file of ciiFiles) {
|
|
96
|
+
if (file.endsWith('.sch') || file.endsWith('.xsl')) {
|
|
97
|
+
fs.copyFileSync(path.join(ciiDir, file), path.join(finalCiiDir, file));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
console.log(`Copied CII Schematron files to ${finalCiiDir}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Download validator configuration (contains additional rules and scenarios)
|
|
104
|
+
console.log('\n2. Downloading XRechnung validator configuration...');
|
|
105
|
+
const validatorZip = path.join(tempDir, 'xrechnung-validator.zip');
|
|
106
|
+
await downloadFile(REPOS.validator.url, validatorZip);
|
|
107
|
+
const validatorDir = path.join(ASSETS_DIR, REPOS.validator.dir);
|
|
108
|
+
await extractZip(validatorZip, validatorDir);
|
|
109
|
+
// Create metadata file
|
|
110
|
+
const metadata = {
|
|
111
|
+
version: XRECHNUNG_VERSION,
|
|
112
|
+
validatorVersion: VALIDATOR_VERSION,
|
|
113
|
+
downloadDate: new Date().toISOString(),
|
|
114
|
+
sources: {
|
|
115
|
+
schematron: REPOS.schematron.url,
|
|
116
|
+
validator: REPOS.validator.url
|
|
117
|
+
},
|
|
118
|
+
files: {
|
|
119
|
+
ubl: fs.existsSync(path.join(ASSETS_DIR, 'ubl'))
|
|
120
|
+
? fs.readdirSync(path.join(ASSETS_DIR, 'ubl')).filter(f => f.endsWith('.sch'))
|
|
121
|
+
: [],
|
|
122
|
+
cii: fs.existsSync(path.join(ASSETS_DIR, 'cii'))
|
|
123
|
+
? fs.readdirSync(path.join(ASSETS_DIR, 'cii')).filter(f => f.endsWith('.sch'))
|
|
124
|
+
: []
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
fs.writeFileSync(path.join(ASSETS_DIR, 'metadata.json'), JSON.stringify(metadata, null, 2));
|
|
128
|
+
// Clean up temp directory
|
|
129
|
+
console.log('\n3. Cleaning up...');
|
|
130
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
131
|
+
console.log('\n✅ XRechnung Schematron rules downloaded successfully!');
|
|
132
|
+
console.log(`📁 Files are located in: ${ASSETS_DIR}`);
|
|
133
|
+
console.log('\nNext steps:');
|
|
134
|
+
console.log('1. Run Saxon-JS to compile .sch files to SEF format');
|
|
135
|
+
console.log('2. Integrate with SchematronValidator');
|
|
136
|
+
console.log('3. Add XRechnung-specific TypeScript validators');
|
|
137
|
+
}
|
|
138
|
+
// Run if executed directly
|
|
139
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
140
|
+
downloadXRechnungRules().catch(error => {
|
|
141
|
+
console.error('Failed to download XRechnung rules:', error);
|
|
142
|
+
process.exit(1);
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
export default downloadXRechnungRules;
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG93bmxvYWQteHJlY2hudW5nLXJ1bGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfaW5zdGFsbC9kb3dubG9hZC14cmVjaG51bmctcnVsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBOzs7R0FHRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekMsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsQ0FBQyw0QkFBNEI7QUFDL0QsTUFBTSxpQkFBaUIsR0FBRyxZQUFZLENBQUMsQ0FBQyxvQkFBb0I7QUFFNUQsTUFBTSxLQUFLLEdBQUc7SUFDWixVQUFVLEVBQUU7UUFDVixHQUFHLEVBQUUseUZBQXlGO1FBQzlGLEdBQUcsRUFBRSxzQkFBc0I7S0FDNUI7SUFDRCxTQUFTLEVBQUU7UUFDVCxHQUFHLEVBQUUsOEpBQThKO1FBQ25LLEdBQUcsRUFBRSxxQkFBcUI7S0FDM0I7Q0FDRixDQUFDO0FBRUYsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztBQUVqRixLQUFLLFVBQVUsWUFBWSxDQUFDLEdBQVcsRUFBRSxXQUFtQjtJQUMxRCxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUVyQyxJQUFJLENBQUM7UUFDSCxnQ0FBZ0M7UUFDaEMsUUFBUSxDQUFDLGVBQWUsV0FBVyxNQUFNLEdBQUcsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDdkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQUMsT0FBTyxL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
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Post-install script to download required validation resources
|
|
4
|
+
* This script is automatically run after npm/pnpm install
|
|
5
|
+
* All users need validation capabilities, so this is mandatory
|
|
6
|
+
*/
|
|
7
|
+
declare function main(): Promise<void>;
|
|
8
|
+
export default main;
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Post-install script to download required validation resources
|
|
4
|
+
* This script is automatically run after npm/pnpm install
|
|
5
|
+
* All users need validation capabilities, so this is mandatory
|
|
6
|
+
*/
|
|
7
|
+
import { SchematronDownloader } from '../dist_ts/formats/validation/schematron.downloader.js';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import * as fs from 'fs';
|
|
10
|
+
import * as crypto from 'crypto';
|
|
11
|
+
// Version for cache invalidation
|
|
12
|
+
const RESOURCES_VERSION = '1.0.0';
|
|
13
|
+
/**
|
|
14
|
+
* Check if we're in a proper npm install context
|
|
15
|
+
*/
|
|
16
|
+
function isValidInstallContext() {
|
|
17
|
+
// Skip if we're in a git install or similar
|
|
18
|
+
if (process.env.npm_lifecycle_event !== 'postinstall') {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
// Skip in CI if explicitly disabled
|
|
22
|
+
if (process.env.CI && process.env.EINVOICE_SKIP_RESOURCES) {
|
|
23
|
+
console.log('⏭️ Skipping resource download (EINVOICE_SKIP_RESOURCES set)');
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Create a checksum for a file
|
|
30
|
+
*/
|
|
31
|
+
function getFileChecksum(filePath) {
|
|
32
|
+
try {
|
|
33
|
+
if (!fs.existsSync(filePath))
|
|
34
|
+
return null;
|
|
35
|
+
const content = fs.readFileSync(filePath);
|
|
36
|
+
return crypto.createHash('sha256').update(content).digest('hex');
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Check if resources are already downloaded and valid
|
|
44
|
+
*/
|
|
45
|
+
function checkExistingResources() {
|
|
46
|
+
const versionFile = path.join('assets_downloaded', 'schematron', '.version');
|
|
47
|
+
try {
|
|
48
|
+
if (!fs.existsSync(versionFile))
|
|
49
|
+
return false;
|
|
50
|
+
const version = fs.readFileSync(versionFile, 'utf-8').trim();
|
|
51
|
+
if (version !== RESOURCES_VERSION) {
|
|
52
|
+
console.log('📦 Resource version mismatch, re-downloading...');
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
// Check if key files exist
|
|
56
|
+
const keyFiles = [
|
|
57
|
+
'assets_downloaded/schematron/EN16931-UBL-v1.3.14.sch',
|
|
58
|
+
'assets_downloaded/schematron/EN16931-CII-v1.3.14.sch',
|
|
59
|
+
'assets_downloaded/schematron/PEPPOL-EN16931-UBL-v3.0.17.sch'
|
|
60
|
+
];
|
|
61
|
+
for (const file of keyFiles) {
|
|
62
|
+
if (!fs.existsSync(file)) {
|
|
63
|
+
console.log(`📦 Missing ${file}, re-downloading resources...`);
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Save version file after successful download
|
|
75
|
+
*/
|
|
76
|
+
function saveVersionFile() {
|
|
77
|
+
const versionFile = path.join('assets_downloaded', 'schematron', '.version');
|
|
78
|
+
try {
|
|
79
|
+
fs.mkdirSync(path.dirname(versionFile), { recursive: true });
|
|
80
|
+
fs.writeFileSync(versionFile, RESOURCES_VERSION);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
console.warn('⚠️ Could not save version file:', error.message);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async function downloadSchematron() {
|
|
87
|
+
console.log('📥 Downloading Schematron validation files...\n');
|
|
88
|
+
const downloader = new SchematronDownloader('assets_downloaded/schematron');
|
|
89
|
+
await downloader.initialize();
|
|
90
|
+
let successCount = 0;
|
|
91
|
+
let failCount = 0;
|
|
92
|
+
// Download EN16931 Schematron files
|
|
93
|
+
console.log('🔵 Downloading EN16931 Schematron files...');
|
|
94
|
+
try {
|
|
95
|
+
const en16931Files = await downloader.downloadStandard('EN16931');
|
|
96
|
+
console.log(`✅ Downloaded ${en16931Files.length} EN16931 files`);
|
|
97
|
+
successCount += en16931Files.length;
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
console.error(`⚠️ Failed to download EN16931: ${error.message}`);
|
|
101
|
+
failCount++;
|
|
102
|
+
}
|
|
103
|
+
// Download PEPPOL Schematron files
|
|
104
|
+
console.log('\n🔵 Downloading PEPPOL Schematron files...');
|
|
105
|
+
try {
|
|
106
|
+
const peppolFiles = await downloader.downloadStandard('PEPPOL');
|
|
107
|
+
console.log(`✅ Downloaded ${peppolFiles.length} PEPPOL files`);
|
|
108
|
+
successCount += peppolFiles.length;
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
console.error(`⚠️ Failed to download PEPPOL: ${error.message}`);
|
|
112
|
+
failCount++;
|
|
113
|
+
}
|
|
114
|
+
// Download XRechnung Schematron files
|
|
115
|
+
console.log('\n🔵 Downloading XRechnung Schematron files...');
|
|
116
|
+
try {
|
|
117
|
+
const xrechnungFiles = await downloader.downloadStandard('XRECHNUNG');
|
|
118
|
+
console.log(`✅ Downloaded ${xrechnungFiles.length} XRechnung files`);
|
|
119
|
+
successCount += xrechnungFiles.length;
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
console.error(`⚠️ Failed to download XRechnung: ${error.message}`);
|
|
123
|
+
failCount++;
|
|
124
|
+
}
|
|
125
|
+
// Report results
|
|
126
|
+
if (successCount > 0) {
|
|
127
|
+
saveVersionFile();
|
|
128
|
+
console.log(`\n✅ Successfully downloaded ${successCount} validation files`);
|
|
129
|
+
}
|
|
130
|
+
if (failCount > 0) {
|
|
131
|
+
console.log(`⚠️ Failed to download ${failCount} resource sets`);
|
|
132
|
+
console.log(' Some validation features may be limited');
|
|
133
|
+
}
|
|
134
|
+
return { successCount, failCount };
|
|
135
|
+
}
|
|
136
|
+
async function main() {
|
|
137
|
+
// Check if we should run
|
|
138
|
+
if (!isValidInstallContext()) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
console.log('='.repeat(60));
|
|
142
|
+
console.log('🚀 @fin.cx/einvoice - Validation Resources Setup');
|
|
143
|
+
console.log('='.repeat(60));
|
|
144
|
+
console.log();
|
|
145
|
+
try {
|
|
146
|
+
// Check if resources already exist and are current
|
|
147
|
+
if (checkExistingResources()) {
|
|
148
|
+
console.log('✅ Validation resources already installed and up-to-date');
|
|
149
|
+
console.log();
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
// Check if we're in the right directory
|
|
153
|
+
const packageJsonPath = path.join(process.cwd(), 'package.json');
|
|
154
|
+
if (!fs.existsSync(packageJsonPath)) {
|
|
155
|
+
console.error('❌ Error: package.json not found');
|
|
156
|
+
console.error(' Installation context issue - skipping resource download');
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
// Check if dist_ts exists (module should be built)
|
|
160
|
+
const distPath = path.join(process.cwd(), 'dist_ts');
|
|
161
|
+
if (!fs.existsSync(distPath)) {
|
|
162
|
+
console.log('⚠️ Module not yet built - skipping resource download');
|
|
163
|
+
console.log(' Resources will be downloaded on first use');
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
// Check network connectivity (simple DNS check)
|
|
167
|
+
try {
|
|
168
|
+
await import('dns').then(dns => new Promise((resolve, reject) => {
|
|
169
|
+
dns.lookup('github.com', (err) => {
|
|
170
|
+
if (err)
|
|
171
|
+
reject(err);
|
|
172
|
+
else
|
|
173
|
+
resolve(true);
|
|
174
|
+
});
|
|
175
|
+
}));
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
console.log('⚠️ No network connectivity detected');
|
|
179
|
+
console.log(' Validation resources will be downloaded on first use');
|
|
180
|
+
console.log(' when network is available');
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
// Download resources with retry logic
|
|
184
|
+
let attempts = 0;
|
|
185
|
+
const maxAttempts = 3;
|
|
186
|
+
let lastError;
|
|
187
|
+
while (attempts < maxAttempts) {
|
|
188
|
+
attempts++;
|
|
189
|
+
if (attempts > 1) {
|
|
190
|
+
console.log(`\n🔄 Retry attempt ${attempts}/${maxAttempts}...`);
|
|
191
|
+
}
|
|
192
|
+
try {
|
|
193
|
+
const { successCount, failCount } = await downloadSchematron();
|
|
194
|
+
if (successCount > 0) {
|
|
195
|
+
console.log();
|
|
196
|
+
console.log('='.repeat(60));
|
|
197
|
+
console.log('✅ Validation resources installed successfully!');
|
|
198
|
+
console.log('='.repeat(60));
|
|
199
|
+
console.log();
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
if (failCount > 0 && attempts < maxAttempts) {
|
|
203
|
+
console.log(`\n⚠️ Some downloads failed, retrying...`);
|
|
204
|
+
await new Promise(resolve => setTimeout(resolve, 2000)); // Wait 2s before retry
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
lastError = error;
|
|
211
|
+
if (attempts < maxAttempts) {
|
|
212
|
+
console.log(`\n⚠️ Download failed: ${error.message}`);
|
|
213
|
+
console.log(' Retrying...');
|
|
214
|
+
await new Promise(resolve => setTimeout(resolve, 3000)); // Wait 3s before retry
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
// If we get here, downloads failed after retries
|
|
219
|
+
console.error();
|
|
220
|
+
console.error('⚠️ Could not download all validation resources');
|
|
221
|
+
console.error(' The library will work but validation features may be limited');
|
|
222
|
+
console.error(' Resources will be attempted again on first use');
|
|
223
|
+
console.error();
|
|
224
|
+
if (lastError) {
|
|
225
|
+
console.error(' Last error:', lastError.message);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
// Catch-all for unexpected errors
|
|
230
|
+
console.error();
|
|
231
|
+
console.error('⚠️ Unexpected error during resource setup:', error.message);
|
|
232
|
+
console.error(' This won\'t affect library installation');
|
|
233
|
+
console.error(' Resources will be downloaded on first use');
|
|
234
|
+
console.error();
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// Only run if this is the main module
|
|
238
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
239
|
+
main().catch(error => {
|
|
240
|
+
console.error('⚠️ Resource setup error:', error.message);
|
|
241
|
+
// Never fail the install
|
|
242
|
+
process.exit(0);
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
export default main;
|
|
246
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19pbnN0YWxsL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFFQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFDOUYsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFakMsaUNBQWlDO0FBQ2pDLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDO0FBRWxDOztHQUVHO0FBQ0gsU0FBUyxxQkFBcUI7SUFDNUIsNENBQTRDO0lBQzVDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsS0FBSyxhQUFhLEVBQUUsQ0FBQztRQUN0RCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxvQ0FBb0M7SUFDcEMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDMUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO1FBQzVFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxlQUFlLENBQUMsUUFBZ0I7SUFDdkMsSUFBSSxDQUFDO1FBQ0gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDMUMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQyxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxL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
|