scanoss 0.35.0 → 0.37.0

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 (52) hide show
  1. package/CHANGELOG.md +16 -1
  2. package/build/main/cli/commands/scan.js +34 -35
  3. package/build/main/sdk/Dependencies/LocalDependency/LocalDependency.js +3 -1
  4. package/build/main/sdk/Dependencies/LocalDependency/parsers/parser.spec.js +49 -15
  5. package/build/main/sdk/Dependencies/LocalDependency/parsers/pyParser.d.ts +1 -0
  6. package/build/main/sdk/Dependencies/LocalDependency/parsers/pyParser.js +21 -1
  7. package/build/main/sdk/Dependencies/LocalDependency/parsers/python/PyProjectToml.js +7 -4
  8. package/build/main/sdk/scanner/Dispatcher/Dispatcher.js +3 -2
  9. package/build/main/sdk/scanner/ScanSettingsBuilder.d.ts +6 -1
  10. package/build/main/sdk/scanner/ScanSettingsBuilder.js +51 -3
  11. package/build/main/sdk/scanner/ScanSettingsBuilder.spec.js +55 -1
  12. package/build/main/sdk/scanner/Scannable/ScannableItem.d.ts +3 -0
  13. package/build/main/sdk/scanner/Scannable/ScannableItem.js +8 -1
  14. package/build/main/sdk/scanner/Scanner.d.ts +1 -0
  15. package/build/main/sdk/scanner/Scanner.js +31 -18
  16. package/build/main/sdk/scanner/ScannerCfg.d.ts +2 -0
  17. package/build/main/sdk/scanner/ScannerCfg.js +1 -1
  18. package/build/main/sdk/scanner/ScannerTypes.d.ts +3 -0
  19. package/build/main/sdk/scanner/ScannerTypes.js +1 -1
  20. package/build/main/sdk/scanner/ScannnerResultPostProcessor/interfaces/types.d.ts +11 -0
  21. package/build/main/sdk/scanner/ScannnerResultPostProcessor/rules/remove-rule.js +3 -2
  22. package/build/main/sdk/scanner/WfpProvider/WfpCalculator/HeaderFilter.d.ts +17 -0
  23. package/build/main/sdk/scanner/WfpProvider/WfpCalculator/HeaderFilter.js +313 -0
  24. package/build/main/sdk/scanner/WfpProvider/WfpCalculator/WfpCalculator.d.ts +1 -0
  25. package/build/main/sdk/scanner/WfpProvider/WfpCalculator/WfpCalculator.js +18 -2
  26. package/build/main/tsconfig.tsbuildinfo +1 -1
  27. package/build/module/cli/commands/scan.js +32 -33
  28. package/build/module/sdk/Dependencies/LocalDependency/LocalDependency.js +4 -2
  29. package/build/module/sdk/Dependencies/LocalDependency/parsers/parser.spec.js +50 -16
  30. package/build/module/sdk/Dependencies/LocalDependency/parsers/pyParser.d.ts +1 -0
  31. package/build/module/sdk/Dependencies/LocalDependency/parsers/pyParser.js +19 -1
  32. package/build/module/sdk/Dependencies/LocalDependency/parsers/python/PyProjectToml.js +7 -4
  33. package/build/module/sdk/scanner/Dispatcher/Dispatcher.js +3 -2
  34. package/build/module/sdk/scanner/ScanSettingsBuilder.d.ts +6 -1
  35. package/build/module/sdk/scanner/ScanSettingsBuilder.js +46 -3
  36. package/build/module/sdk/scanner/ScanSettingsBuilder.spec.js +55 -1
  37. package/build/module/sdk/scanner/Scannable/ScannableItem.d.ts +3 -0
  38. package/build/module/sdk/scanner/Scannable/ScannableItem.js +9 -1
  39. package/build/module/sdk/scanner/Scanner.d.ts +1 -0
  40. package/build/module/sdk/scanner/Scanner.js +27 -15
  41. package/build/module/sdk/scanner/ScannerCfg.d.ts +2 -0
  42. package/build/module/sdk/scanner/ScannerCfg.js +2 -1
  43. package/build/module/sdk/scanner/ScannerTypes.d.ts +3 -0
  44. package/build/module/sdk/scanner/ScannerTypes.js +1 -1
  45. package/build/module/sdk/scanner/ScannnerResultPostProcessor/interfaces/types.d.ts +11 -0
  46. package/build/module/sdk/scanner/ScannnerResultPostProcessor/rules/remove-rule.js +2 -2
  47. package/build/module/sdk/scanner/WfpProvider/WfpCalculator/HeaderFilter.d.ts +17 -0
  48. package/build/module/sdk/scanner/WfpProvider/WfpCalculator/HeaderFilter.js +306 -0
  49. package/build/module/sdk/scanner/WfpProvider/WfpCalculator/WfpCalculator.d.ts +1 -0
  50. package/build/module/sdk/scanner/WfpProvider/WfpCalculator/WfpCalculator.js +18 -2
  51. package/build/module/tsconfig.module.tsbuildinfo +1 -1
  52. package/package.json +1 -1
@@ -0,0 +1,306 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Copyright (c) 2025, SCANOSS
3
+ import path from 'path';
4
+ const COMPLETE_DOCSTRING_QUOTE_COUNT = 2;
5
+ const LICENSE_HEADER_MAX_LINES = 50;
6
+ const COMMENT_PATTERNS = {
7
+ c_style: {
8
+ single_line: String.raw `^\s*//.*$`,
9
+ multi_start: String.raw `^\s*/\*`,
10
+ multi_end: String.raw `\*/\s*$`,
11
+ multi_single: String.raw `^\s*/\*.*\*/\s*$`,
12
+ },
13
+ python_style: {
14
+ single_line: String.raw `^\s*#.*$`,
15
+ doc_string_start: String.raw `^\s*"""`,
16
+ doc_string_end: String.raw `"""\s*$`,
17
+ },
18
+ lua_style: {
19
+ single_line: String.raw `^\s*--.*$`,
20
+ multi_start: String.raw `^\s*--\[\[`,
21
+ multi_end: String.raw `\]\]\s*$`,
22
+ },
23
+ html_style: {
24
+ multi_start: String.raw `^\s*<!--`,
25
+ multi_end: String.raw `-->\s*$`,
26
+ multi_single: String.raw `^\s*<!--.*-->\s*$`,
27
+ },
28
+ };
29
+ const IMPORT_PATTERNS = {
30
+ python: [String.raw `^\s*import\s+`, String.raw `^\s*from\s+.*\s+import\s+`],
31
+ javascript: [
32
+ String.raw `^\s*import\s+.*\s+from\s+`,
33
+ String.raw `^\s*import\s+['"]`,
34
+ String.raw `^\s*import\s+type\s+`,
35
+ String.raw `^\s*export\s+\*\s+from\s+`,
36
+ String.raw `^\s*export\s+\{.*\}\s+from\s+`,
37
+ String.raw `^\s*const\s+.*\s*=\s*require\(`,
38
+ String.raw `^\s*var\s+.*\s*=\s*require\(`,
39
+ String.raw `^\s*let\s+.*\s*=\s*require\(`,
40
+ ],
41
+ typescript: [
42
+ String.raw `^\s*import\s+`,
43
+ String.raw `^\s*export\s+.*\s+from\s+`,
44
+ String.raw `^\s*import\s+type\s+`,
45
+ String.raw `^\s*import\s+\{.*\}\s+from\s+`,
46
+ ],
47
+ java: [String.raw `^\s*import\s+`, String.raw `^\s*package\s+`],
48
+ kotlin: [String.raw `^\s*import\s+`, String.raw `^\s*package\s+`],
49
+ scala: [String.raw `^\s*import\s+`, String.raw `^\s*package\s+`],
50
+ go: [
51
+ String.raw `^\s*import\s+\(`,
52
+ String.raw `^\s*import\s+"`,
53
+ String.raw `^\s*package\s+`,
54
+ String.raw `^\s*"[^"]*"\s*$`,
55
+ String.raw `^\s*[a-zA-Z_][a-zA-Z0-9_]*\s+"[^"]*"\s*$`,
56
+ String.raw `^\s*_\s+"[^"]*"\s*$`,
57
+ ],
58
+ rust: [String.raw `^\s*use\s+`, String.raw `^\s*extern\s+crate\s+`, String.raw `^\s*mod\s+`],
59
+ cpp: [
60
+ String.raw `^\s*#include\s+`,
61
+ String.raw `^\s*#pragma\s+`,
62
+ String.raw `^\s*#ifndef\s+.*_H.*`,
63
+ String.raw `^\s*#define\s+.*_H.*`,
64
+ String.raw `^\s*#endif\s+(//.*)?\s*$`,
65
+ ],
66
+ csharp: [String.raw `^\s*using\s+`, String.raw `^\s*namespace\s+`],
67
+ php: [
68
+ String.raw `^\s*use\s+`,
69
+ String.raw `^\s*require\s+`,
70
+ String.raw `^\s*require_once\s+`,
71
+ String.raw `^\s*include\s+`,
72
+ String.raw `^\s*include_once\s+`,
73
+ String.raw `^\s*namespace\s+`,
74
+ ],
75
+ swift: [String.raw `^\s*import\s+`],
76
+ ruby: [String.raw `^\s*require\s+`, String.raw `^\s*require_relative\s+`, String.raw `^\s*load\s+`],
77
+ perl: [String.raw `^\s*use\s+`, String.raw `^\s*require\s+`],
78
+ r: [String.raw `^\s*library\(`, String.raw `^\s*require\(`, String.raw `^\s*source\(`],
79
+ lua: [String.raw `^\s*require\s+`, String.raw `^\s*local\s+.*\s*=\s*require\(`],
80
+ dart: [String.raw `^\s*import\s+`, String.raw `^\s*export\s+`, String.raw `^\s*part\s+`],
81
+ haskell: [String.raw `^\s*import\s+`, String.raw `^\s*module\s+`],
82
+ elixir: [
83
+ String.raw `^\s*import\s+`,
84
+ String.raw `^\s*alias\s+`,
85
+ String.raw `^\s*require\s+`,
86
+ String.raw `^\s*use\s+`,
87
+ ],
88
+ clojure: [
89
+ String.raw `^\s*\(\s*ns\s+`,
90
+ String.raw `^\s*\(\s*require\s+`,
91
+ String.raw `^\s*\(\s*import\s+`,
92
+ ],
93
+ };
94
+ const LICENSE_KEYWORDS = [
95
+ 'copyright', 'license', 'licensed', 'all rights reserved',
96
+ 'permission', 'redistribution', 'warranty', 'liability',
97
+ 'apache', 'mit', 'gpl', 'bsd', 'mozilla', 'author:',
98
+ 'spdx-license', 'contributors', 'licensee',
99
+ ];
100
+ const EXT_MAP = {
101
+ '.py': 'python', '.js': 'javascript', '.mjs': 'javascript',
102
+ '.cjs': 'javascript', '.ts': 'typescript', '.tsx': 'typescript',
103
+ '.jsx': 'javascript', '.java': 'java', '.kt': 'kotlin',
104
+ '.kts': 'kotlin', '.scala': 'scala', '.sc': 'scala',
105
+ '.go': 'go', '.rs': 'rust', '.cpp': 'cpp', '.cc': 'cpp',
106
+ '.cxx': 'cpp', '.c': 'cpp', '.h': 'cpp', '.hpp': 'cpp',
107
+ '.hxx': 'cpp', '.cs': 'csharp', '.php': 'php', '.swift': 'swift',
108
+ '.rb': 'ruby', '.pl': 'perl', '.pm': 'perl', '.r': 'r', '.R': 'r',
109
+ '.lua': 'lua', '.dart': 'dart', '.hs': 'haskell', '.ex': 'elixir',
110
+ '.exs': 'elixir', '.clj': 'clojure', '.cljs': 'clojure',
111
+ '.m': 'cpp', '.mm': 'cpp', '.sh': 'python', '.bash': 'python',
112
+ '.zsh': 'python', '.fish': 'python',
113
+ };
114
+ function isBlankLine(stripped) {
115
+ return stripped.length === 0;
116
+ }
117
+ function isShebang(stripped) {
118
+ return stripped.startsWith('#!');
119
+ }
120
+ export class HeaderFilter {
121
+ maxLines;
122
+ constructor(skipLimit) {
123
+ this.maxLines = skipLimit != null && skipLimit > 0 ? skipLimit : null;
124
+ }
125
+ filter(file, decodedContents) {
126
+ if (!decodedContents || !file) {
127
+ return 0;
128
+ }
129
+ const language = this.detectLanguage(file);
130
+ if (!language) {
131
+ return 0;
132
+ }
133
+ const lines = decodedContents.split(/\r?\n/);
134
+ if (lines.length === 0) {
135
+ return 0;
136
+ }
137
+ const implementationStart = this.findFirstImplementationLine(lines, language);
138
+ if (implementationStart === null) {
139
+ return 0;
140
+ }
141
+ let lineOffset = implementationStart - 1;
142
+ if (this.maxLines !== null && this.maxLines > 0 && this.maxLines < lineOffset) {
143
+ lineOffset = this.maxLines;
144
+ }
145
+ return lineOffset;
146
+ }
147
+ detectLanguage(filePath) {
148
+ const ext = path.extname(filePath).toLowerCase();
149
+ if (!ext)
150
+ return null;
151
+ return EXT_MAP[ext] || null;
152
+ }
153
+ getCommentStyle(language) {
154
+ const cStyleLanguages = [
155
+ 'cpp', 'java', 'kotlin', 'scala', 'javascript', 'typescript',
156
+ 'go', 'rust', 'csharp', 'php', 'swift', 'dart',
157
+ ];
158
+ const pythonStyleLanguages = ['python', 'ruby', 'perl', 'r'];
159
+ const luaStyleLanguages = ['lua', 'haskell'];
160
+ if (cStyleLanguages.includes(language))
161
+ return 'c_style';
162
+ if (pythonStyleLanguages.includes(language))
163
+ return 'python_style';
164
+ if (luaStyleLanguages.includes(language))
165
+ return 'lua_style';
166
+ return 'c_style';
167
+ }
168
+ isLicenseHeader(line) {
169
+ const lineLower = line.toLowerCase();
170
+ return LICENSE_KEYWORDS.some(keyword => lineLower.includes(keyword));
171
+ }
172
+ isComment(line, inMultiline, patterns) {
173
+ if (!patterns)
174
+ return [false, inMultiline];
175
+ if (inMultiline) {
176
+ if (patterns.multi_end && new RegExp(patterns.multi_end).test(line)) {
177
+ return [true, false];
178
+ }
179
+ if (patterns.doc_string_end && new RegExp(patterns.doc_string_end).test(line)) {
180
+ return [true, false];
181
+ }
182
+ return [true, true];
183
+ }
184
+ if (patterns.single_line && new RegExp(patterns.single_line).test(line)) {
185
+ return [true, false];
186
+ }
187
+ if (patterns.multi_single && new RegExp(patterns.multi_single).test(line)) {
188
+ return [true, false];
189
+ }
190
+ if (patterns.multi_start && new RegExp(patterns.multi_start).test(line)) {
191
+ if (patterns.multi_end && new RegExp(patterns.multi_end).test(line)) {
192
+ return [true, false];
193
+ }
194
+ return [true, true];
195
+ }
196
+ if (patterns.doc_string_start && line.includes('"""')) {
197
+ const count = (line.match(/"""/g) || []).length;
198
+ if (count === COMPLETE_DOCSTRING_QUOTE_COUNT) {
199
+ return [true, false];
200
+ }
201
+ if (count === 1) {
202
+ return [true, true];
203
+ }
204
+ }
205
+ return [false, inMultiline];
206
+ }
207
+ isImport(line, patterns) {
208
+ if (!patterns)
209
+ return false;
210
+ return patterns.some(pattern => new RegExp(pattern).test(line));
211
+ }
212
+ findFirstImplementationLine(lines, language) {
213
+ if (!lines.length || !language)
214
+ return null;
215
+ let inMultilineComment = false;
216
+ let inLicenseSection = false;
217
+ let inImportBlock = false;
218
+ let consecutiveImportsCount = 0;
219
+ const commentStyle = this.getCommentStyle(language);
220
+ const commentPatterns = COMMENT_PATTERNS[commentStyle];
221
+ const importPatterns = IMPORT_PATTERNS[language];
222
+ for (let i = 0; i < lines.length; i++) {
223
+ const lineNumber = i + 1;
224
+ const stripped = lines[i].trim();
225
+ if ((i === 0 && isShebang(stripped)) || isBlankLine(stripped)) {
226
+ continue;
227
+ }
228
+ const [isAComment, stillInMultiline] = this.isComment(lines[i], inMultilineComment, commentPatterns);
229
+ inMultilineComment = stillInMultiline;
230
+ if (isAComment) {
231
+ if (this.isLicenseHeader(lines[i])) {
232
+ inLicenseSection = true;
233
+ }
234
+ else if (inLicenseSection && lineNumber < LICENSE_HEADER_MAX_LINES) {
235
+ // Continue within license section
236
+ }
237
+ else {
238
+ inLicenseSection = false;
239
+ }
240
+ continue;
241
+ }
242
+ if (!isAComment) {
243
+ inLicenseSection = false;
244
+ }
245
+ // Go import block handling
246
+ if (language === 'go') {
247
+ if (stripped.startsWith('import (')) {
248
+ inImportBlock = true;
249
+ continue;
250
+ }
251
+ if (inImportBlock) {
252
+ if (stripped === ')') {
253
+ inImportBlock = false;
254
+ continue;
255
+ }
256
+ if (stripped.startsWith('"') ||
257
+ stripped.startsWith('_') ||
258
+ /^[a-zA-Z_][a-zA-Z0-9_]*\s+"/.test(stripped)) {
259
+ continue;
260
+ }
261
+ }
262
+ }
263
+ if (this.isImport(lines[i], importPatterns)) {
264
+ if (consecutiveImportsCount === 0) {
265
+ // First import detected
266
+ }
267
+ consecutiveImportsCount += 1;
268
+ continue;
269
+ }
270
+ return lineNumber;
271
+ }
272
+ return null;
273
+ }
274
+ }
275
+ /**
276
+ * Strip WFP snippet lines up to and including the line_offset.
277
+ * Inserts a `start_line=<offset>` tag before the first kept snippet line.
278
+ * Preserves non-snippet lines (file=, fh2=, hpsm=, etc.).
279
+ */
280
+ export function stripLinesUntilOffset(wfp, lineOffset) {
281
+ if (lineOffset <= 0)
282
+ return wfp;
283
+ const lines = wfp.split('\n');
284
+ const filteredLines = [];
285
+ let startLineAdded = false;
286
+ for (const line of lines) {
287
+ const eqIndex = line.indexOf('=');
288
+ if (eqIndex > 0) {
289
+ const prefix = line.substring(0, eqIndex);
290
+ if (/^\d+$/.test(prefix)) {
291
+ const lineNum = parseInt(prefix, 10);
292
+ if (lineNum > lineOffset) {
293
+ if (!startLineAdded) {
294
+ filteredLines.push(`start_line=${lineOffset}`);
295
+ startLineAdded = true;
296
+ }
297
+ filteredLines.push(line);
298
+ }
299
+ continue;
300
+ }
301
+ }
302
+ filteredLines.push(line);
303
+ }
304
+ return filteredLines.join('\n');
305
+ }
306
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGVhZGVyRmlsdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3Nkay9zY2FubmVyL1dmcFByb3ZpZGVyL1dmcENhbGN1bGF0b3IvSGVhZGVyRmlsdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQiw4QkFBOEI7QUFFOUIsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRXhCLE1BQU0sOEJBQThCLEdBQUcsQ0FBQyxDQUFDO0FBQ3pDLE1BQU0sd0JBQXdCLEdBQUcsRUFBRSxDQUFDO0FBV3BDLE1BQU0sZ0JBQWdCLEdBQW9DO0lBQ3hELE9BQU8sRUFBRTtRQUNQLFdBQVcsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFBLFdBQVc7UUFDbEMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUEsU0FBUztRQUNoQyxTQUFTLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQSxTQUFTO1FBQzlCLFlBQVksRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFBLGtCQUFrQjtLQUMzQztJQUNELFlBQVksRUFBRTtRQUNaLFdBQVcsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFBLFVBQVU7UUFDakMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQSxTQUFTO1FBQ3JDLGNBQWMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFBLFNBQVM7S0FDcEM7SUFDRCxTQUFTLEVBQUU7UUFDVCxXQUFXLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQSxXQUFXO1FBQ2xDLFdBQVcsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFBLFlBQVk7UUFDbkMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUEsVUFBVTtLQUNoQztJQUNELFVBQVUsRUFBRTtRQUNWLFdBQVcsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFBLFVBQVU7UUFDakMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUEsU0FBUztRQUM5QixZQUFZLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQSxtQkFBbUI7S0FDNUM7Q0FDRixDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQTZCO0lBQ2hELE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUEsZUFBZSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUEsMkJBQTJCLENBQUM7SUFDMUUsVUFBVSxFQUFFO1FBQ1YsTUFBTSxDQUFDLEdBQUcsQ0FBQSwyQkFBMkI7UUFDckMsTUFBTSxDQUFDLEdBQUcsQ0FBQSxtQkFBbUI7UUFDN0IsTUFBTSxDQUFDLEdBQUcsQ0FBQSxzQkFBc0I7UUFDaEMsTUFBTSxDQUFDLEdBQUcsQ0FBQSwyQkFBMkI7UUFDckMsTUFBTSxDQUFDLEdBQUcsQ0FBQSwrQkFBK0I7UUFDekMsTUFBTSxDQUFDLEdBQUcsQ0FBQSxnQ0FBZ0M7UUFDMUMsTUFBTSxDQUFDLEdBQUcsQ0FBQSw4QkFBOEI7UUFDeEMsTUFBTSxDQUFDLEdBQUcsQ0FBQSw4QkFBOEI7S0FDekM7SUFDRCxVQUFVLEVBQUU7UUFDVixNQUFNLENBQUMsR0FBRyxDQUFBLGVBQWU7UUFDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQSwyQkFBMkI7UUFDckMsTUFBTSxDQUFDLEdBQUcsQ0FBQSxzQkFBc0I7UUFDaEMsTUFBTSxDQUFDLEdBQUcsQ0FBQSwrQkFBK0I7S0FDMUM7SUFDRCxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFBLGVBQWUsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFBLGdCQUFnQixDQUFDO0lBQzdELE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUEsZUFBZSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUEsZ0JBQWdCLENBQUM7SUFDL0QsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQSxlQUFlLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQSxnQkFBZ0IsQ0FBQztJQUM5RCxFQUFFLEVBQUU7UUFDRixNQUFNLENBQUMsR0FBRyxDQUFBLGlCQUFpQjtRQUMzQixNQUFNLENBQUMsR0FBRyxDQUFBLGdCQUFnQjtRQUMxQixNQUFNLENBQUMsR0FBRyxDQUFBLGdCQUFnQjtRQUMxQixNQUFNLENBQUMsR0FBRyxDQUFBLGlCQUFpQjtRQUMzQixNQUFNLENBQUMsR0FBRyxDQUFBLDBDQUEwQztRQUNwRCxNQUFNLENBQUMsR0FBRyxDQUFBLHFCQUFxQjtLQUNoQztJQUNELElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUEsWUFBWSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUEsdUJBQXVCLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQSxZQUFZLENBQUM7SUFDekYsR0FBRyxFQUFFO1FBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBQSxpQkFBaUI7UUFDM0IsTUFBTSxDQUFDLEdBQUcsQ0FBQSxnQkFBZ0I7UUFDMUIsTUFBTSxDQUFDLEdBQUcsQ0FBQSxzQkFBc0I7UUFDaEMsTUFBTSxDQUFDLEdBQUcsQ0FBQSxzQkFBc0I7UUFDaEMsTUFBTSxDQUFDLEdBQUcsQ0FBQSwwQkFBMEI7S0FDckM7SUFDRCxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFBLGNBQWMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFBLGtCQUFrQixDQUFDO0lBQ2hFLEdBQUcsRUFBRTtRQUNILE1BQU0sQ0FBQyxHQUFHLENBQUEsWUFBWTtRQUN0QixNQUFNLENBQUMsR0FBRyxDQUFBLGdCQUFnQjtRQUMxQixNQUFNLENBQUMsR0FBRyxDQUFBLHFCQUFxQjtRQUMvQixNQUFNLENBQUMsR0FBRyxDQUFBLGdCQUFnQjtRQUMxQixNQUFNLENBQUMsR0FBRyxDQUFBLHFCQUFxQjtRQUMvQixNQUFNLENBQUMsR0FBRyxDQUFBLGtCQUFrQjtLQUM3QjtJQUNELEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUEsZUFBZSxDQUFDO0lBQ2xDLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUEsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQSx5QkFBeUIsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFBLGFBQWEsQ0FBQztJQUNoRyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFBLFlBQVksRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFBLGdCQUFnQixDQUFDO0lBQzFELENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUEsZUFBZSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUEsZUFBZSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUEsY0FBYyxDQUFDO0lBQ25GLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUEsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQSxnQ0FBZ0MsQ0FBQztJQUM3RSxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFBLGVBQWUsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFBLGVBQWUsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFBLGFBQWEsQ0FBQztJQUNyRixPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFBLGVBQWUsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFBLGVBQWUsQ0FBQztJQUMvRCxNQUFNLEVBQUU7UUFDTixNQUFNLENBQUMsR0FBRyxDQUFBLGVBQWU7UUFDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQSxjQUFjO1FBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUEsZ0JBQWdCO1FBQzFCLE1BQU0sQ0FBQyxHQUFHLENBQUEsWUFBWTtLQUN2QjtJQUNELE9BQU8sRUFBRTtRQUNQLE1BQU0sQ0FBQyxHQUFHLENBQUEsZ0JBQWdCO1FBQzFCLE1BQU0sQ0FBQyxHQUFHLENBQUEscUJBQXFCO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUEsb0JBQW9CO0tBQy9CO0NBQ0YsQ0FBQztBQUVGLE1BQU0sZ0JBQWdCLEdBQUc7SUFDdkIsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUscUJBQXFCO0lBQ3pELFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsV0FBVztJQUN2RCxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVM7SUFDbkQsY0FBYyxFQUFFLGNBQWMsRUFBRSxVQUFVO0NBQzNDLENBQUM7QUFFRixNQUFNLE9BQU8sR0FBMkI7SUFDdEMsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxZQUFZO0lBQzFELE1BQU0sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsWUFBWTtJQUMvRCxNQUFNLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVE7SUFDdEQsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPO0lBQ25ELEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLO0lBQ3ZELE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLO0lBQ3RELE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPO0lBQ2hFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUc7SUFDakUsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVE7SUFDakUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTO0lBQ3ZELElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRO0lBQzdELE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVE7Q0FDcEMsQ0FBQztBQUVGLFNBQVMsV0FBVyxDQUFDLFFBQWdCO0lBQ25DLE9BQU8sUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLFFBQWdCO0lBQ2pDLE9BQU8sUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsTUFBTSxPQUFPLFlBQVk7SUFDZixRQUFRLENBQWdCO0lBRWhDLFlBQVksU0FBa0I7UUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLElBQUksSUFBSSxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3hFLENBQUM7SUFFRCxNQUFNLENBQUMsSUFBWSxFQUFFLGVBQXVCO1FBQzFDLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM5QixPQUFPLENBQUMsQ0FBQztRQUNYLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0MsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUVELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM5RSxJQUFJLG1CQUFtQixLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUVELElBQUksVUFBVSxHQUFHLG1CQUFtQixHQUFHLENBQUMsQ0FBQztRQUV6QyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxFQUFFLENBQUM7WUFDOUUsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDN0IsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxjQUFjLENBQUMsUUFBZ0I7UUFDN0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqRCxJQUFJLENBQUMsR0FBRztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3RCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRU8sZUFBZSxDQUFDLFFBQWdCO1FBQ3RDLE1BQU0sZUFBZSxHQUFHO1lBQ3RCLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWTtZQUM1RCxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU07U0FDL0MsQ0FBQztRQUNGLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM3RCxNQUFNLGlCQUFpQixHQUFHLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRTdDLElBQUksZUFBZSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUN6RCxJQUFJLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFBRSxPQUFPLGNBQWMsQ0FBQztRQUNuRSxJQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFBRSxPQUFPLFdBQVcsQ0FBQztRQUM3RCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRU8sZUFBZSxDQUFDLElBQVk7UUFDbEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JDLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFTyxTQUFTLENBQUMsSUFBWSxFQUFFLFdBQW9CLEVBQUUsUUFBeUI7UUFDN0UsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRTNDLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsSUFBSSxRQUFRLENBQUMsU0FBUyxJQUFJLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDcEUsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2QixDQUFDO1lBQ0QsSUFBSSxRQUFRLENBQUMsY0FBYyxJQUFJLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDOUUsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2QixDQUFDO1lBQ0QsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0QixDQUFDO1FBRUQsSUFBSSxRQUFRLENBQUMsV0FBVyxJQUFJLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN4RSxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7UUFFRCxJQUFJLFFBQVEsQ0FBQyxZQUFZLElBQUksSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkIsQ0FBQztRQUVELElBQUksUUFBUSxDQUFDLFdBQVcsSUFBSSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDeEUsSUFBSSxRQUFRLENBQUMsU0FBUyxJQUFJLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDcEUsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2QixDQUFDO1lBQ0QsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0QixDQUFDO1FBRUQsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RELE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDaEQsSUFBSSxLQUFLLEtBQUssOEJBQThCLEVBQUUsQ0FBQztnQkFDN0MsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2QixDQUFDO1lBQ0QsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ2hCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTyxRQUFRLENBQUMsSUFBWSxFQUFFLFFBQWtCO1FBQy9DLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDNUIsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELDJCQUEyQixDQUFDLEtBQWUsRUFBRSxRQUFnQjtRQUMzRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLElBQUksQ0FBQztRQUU1QyxJQUFJLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUMvQixJQUFJLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUM3QixJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSx1QkFBdUIsR0FBRyxDQUFDLENBQUM7UUFFaEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwRCxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2RCxNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFakQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN0QyxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVqQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDOUQsU0FBUztZQUNYLENBQUM7WUFFRCxNQUFNLENBQUMsVUFBVSxFQUFFLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFDckcsa0JBQWtCLEdBQUcsZ0JBQWdCLENBQUM7WUFFdEMsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDbkMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO2dCQUMxQixDQUFDO3FCQUFNLElBQUksZ0JBQWdCLElBQUksVUFBVSxHQUFHLHdCQUF3QixFQUFFLENBQUM7b0JBQ3JFLGtDQUFrQztnQkFDcEMsQ0FBQztxQkFBTSxDQUFDO29CQUNOLGdCQUFnQixHQUFHLEtBQUssQ0FBQztnQkFDM0IsQ0FBQztnQkFDRCxTQUFTO1lBQ1gsQ0FBQztZQUVELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDaEIsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1lBQzNCLENBQUM7WUFFRCwyQkFBMkI7WUFDM0IsSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ3RCLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO29CQUNwQyxhQUFhLEdBQUcsSUFBSSxDQUFDO29CQUNyQixTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsSUFBSSxhQUFhLEVBQUUsQ0FBQztvQkFDbEIsSUFBSSxRQUFRLEtBQUssR0FBRyxFQUFFLENBQUM7d0JBQ3JCLGFBQWEsR0FBRyxLQUFLLENBQUM7d0JBQ3RCLFNBQVM7b0JBQ1gsQ0FBQztvQkFDRCxJQUNFLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO3dCQUN4QixRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQzt3QkFDeEIsNkJBQTZCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUM1QyxDQUFDO3dCQUNELFNBQVM7b0JBQ1gsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLEVBQUUsQ0FBQztnQkFDNUMsSUFBSSx1QkFBdUIsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDbEMsd0JBQXdCO2dCQUMxQixDQUFDO2dCQUNELHVCQUF1QixJQUFJLENBQUMsQ0FBQztnQkFDN0IsU0FBUztZQUNYLENBQUM7WUFFRCxPQUFPLFVBQVUsQ0FBQztRQUNwQixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0Y7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEdBQVcsRUFBRSxVQUFrQjtJQUNuRSxJQUFJLFVBQVUsSUFBSSxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFFaEMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixNQUFNLGFBQWEsR0FBYSxFQUFFLENBQUM7SUFDbkMsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDO0lBRTNCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7UUFDekIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNoQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMxQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDekIsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDckMsSUFBSSxPQUFPLEdBQUcsVUFBVSxFQUFFLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3QkFDcEIsYUFBYSxDQUFDLElBQUksQ0FBQyxjQUFjLFVBQVUsRUFBRSxDQUFDLENBQUM7d0JBQy9DLGNBQWMsR0FBRyxJQUFJLENBQUM7b0JBQ3hCLENBQUM7b0JBQ0QsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDM0IsQ0FBQztnQkFDRCxTQUFTO1lBQ1gsQ0FBQztRQUNILENBQUM7UUFDRCxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbEMsQ0FBQyJ9
@@ -5,6 +5,7 @@ export declare class WfpCalculator extends WfpProvider {
5
5
  private fileList;
6
6
  private fileListIndex;
7
7
  private continue;
8
+ private headerFilter;
8
9
  constructor(scannerCfg?: ScannerCfg);
9
10
  init(): void;
10
11
  prepareWorker(): void;
@@ -5,6 +5,7 @@ import { ScannerCfg } from '../../ScannerCfg';
5
5
  import { ScannerEvents } from '../../ScannerTypes';
6
6
  import { FingerprintPackage } from '../FingerprintPackage';
7
7
  import { WfpProvider } from '../WfpProvider';
8
+ import { HeaderFilter, stripLinesUntilOffset } from './HeaderFilter';
8
9
  const stringWorker = `
9
10
  const { parentPort } = require('worker_threads');
10
11
 
@@ -500,9 +501,11 @@ export class WfpCalculator extends WfpProvider {
500
501
  fileList;
501
502
  fileListIndex;
502
503
  continue;
504
+ headerFilter;
503
505
  constructor(scannerCfg = new ScannerCfg()) {
504
506
  super();
505
507
  this.scannerCfg = scannerCfg;
508
+ this.headerFilter = null;
506
509
  }
507
510
  init() {
508
511
  super.init();
@@ -513,7 +516,11 @@ export class WfpCalculator extends WfpProvider {
513
516
  prepareWorker() {
514
517
  this.worker = new Worker(stringWorker, { eval: true });
515
518
  this.worker.on('message', async (scannableItem) => {
516
- this.fingerprintPacker(scannableItem.fingerprint);
519
+ let fingerprint = scannableItem.fingerprint;
520
+ if (scannableItem.lineOffset > 0) {
521
+ fingerprint = stripLinesUntilOffset(fingerprint, scannableItem.lineOffset);
522
+ }
523
+ this.fingerprintPacker(fingerprint);
517
524
  await this.nextStepMachine();
518
525
  });
519
526
  }
@@ -554,6 +561,10 @@ export class WfpCalculator extends WfpProvider {
554
561
  if (!(this.fileListIndex % this.scannerCfg.WINNOWING_REPORT_STATUS_AFTER_X))
555
562
  this.emit(ScannerEvents.WINNOWING_STATUS, this.scannerCfg.WINNOWING_REPORT_STATUS_AFTER_X);
556
563
  const scannable = new ScannableItem(content, contentSource, this.winnowingMode, this.scannerCfg.WFP_FILE_MAX_SIZE);
564
+ if (this.headerFilter && content.length > 0) {
565
+ const lineOffset = this.headerFilter.filter(path, content.toString('utf-8'));
566
+ scannable.setLineOffset(lineOffset);
567
+ }
557
568
  return scannable;
558
569
  }
559
570
  async readFile(path) {
@@ -588,6 +599,11 @@ export class WfpCalculator extends WfpProvider {
588
599
  this.sendLog('[ SCANNER ]: WFP Calculator starting...');
589
600
  this.init();
590
601
  this.prepareWorker();
602
+ const fileSnippet = this.scannerCfg?.SCANOSS_SETTINGS?.settings?.file_snippet;
603
+ if (fileSnippet?.skip_headers) {
604
+ this.headerFilter = new HeaderFilter(fileSnippet.skip_headers_limit);
605
+ this.sendLog('[ SCANNER ]: Header filter enabled');
606
+ }
591
607
  if (params.winnowingMode)
592
608
  this.setWinnowingMode(params.winnowingMode);
593
609
  if (params.obfuscate)
@@ -620,4 +636,4 @@ export class WfpCalculator extends WfpProvider {
620
636
  this.sendFingerprint(fingerprint);
621
637
  }
622
638
  }
623
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ZwQ2FsY3VsYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9zZGsvc2Nhbm5lci9XZnBQcm92aWRlci9XZnBDYWxjdWxhdG9yL1dmcENhbGN1bGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxhQUFhLEVBQStCLE1BQU0sb0JBQW9CLENBQUM7QUFFaEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0QsT0FBTyxFQUFxQixXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRSxNQUFNLFlBQVksR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
639
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ZwQ2FsY3VsYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9zZGsvc2Nhbm5lci9XZnBQcm92aWRlci9XZnBDYWxjdWxhdG9yL1dmcENhbGN1bGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxhQUFhLEVBQStCLE1BQU0sb0JBQW9CLENBQUM7QUFFaEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0QsT0FBTyxFQUFxQixXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckUsTUFBTSxZQUFZLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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