postext 1.2.3 → 1.3.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 (44) hide show
  1. package/README.md +18 -0
  2. package/dist/__tests__/bundle.test.d.ts +2 -0
  3. package/dist/__tests__/bundle.test.d.ts.map +1 -0
  4. package/dist/__tests__/bundle.test.js +210 -0
  5. package/dist/__tests__/bundle.test.js.map +1 -0
  6. package/dist/__tests__/exports.test.js +15 -0
  7. package/dist/__tests__/exports.test.js.map +1 -1
  8. package/dist/bundle/adapters.d.ts +38 -0
  9. package/dist/bundle/adapters.d.ts.map +1 -0
  10. package/dist/bundle/adapters.js +142 -0
  11. package/dist/bundle/adapters.js.map +1 -0
  12. package/dist/bundle/api.d.ts +94 -0
  13. package/dist/bundle/api.d.ts.map +1 -0
  14. package/dist/bundle/api.js +91 -0
  15. package/dist/bundle/api.js.map +1 -0
  16. package/dist/bundle/book.d.ts +24 -0
  17. package/dist/bundle/book.d.ts.map +1 -0
  18. package/dist/bundle/book.js +55 -0
  19. package/dist/bundle/book.js.map +1 -0
  20. package/dist/bundle/codec.d.ts +105 -0
  21. package/dist/bundle/codec.d.ts.map +1 -0
  22. package/dist/bundle/codec.js +245 -0
  23. package/dist/bundle/codec.js.map +1 -0
  24. package/dist/bundle/index.d.ts +14 -0
  25. package/dist/bundle/index.d.ts.map +1 -0
  26. package/dist/bundle/index.js +10 -0
  27. package/dist/bundle/index.js.map +1 -0
  28. package/dist/bundle/manifest.d.ts +76 -0
  29. package/dist/bundle/manifest.d.ts.map +1 -0
  30. package/dist/bundle/manifest.js +444 -0
  31. package/dist/bundle/manifest.js.map +1 -0
  32. package/dist/bundle/types.d.ts +141 -0
  33. package/dist/bundle/types.d.ts.map +1 -0
  34. package/dist/bundle/types.js +6 -0
  35. package/dist/bundle/types.js.map +1 -0
  36. package/dist/bundle/zip.d.ts +23 -0
  37. package/dist/bundle/zip.d.ts.map +1 -0
  38. package/dist/bundle/zip.js +87 -0
  39. package/dist/bundle/zip.js.map +1 -0
  40. package/dist/index.d.ts +2 -0
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +3 -0
  43. package/dist/index.js.map +1 -1
  44. package/package.json +6 -1
@@ -0,0 +1,76 @@
1
+ import type { CustomFontFamily, CustomFontFormat, Resource } from '../types';
2
+ import type { BundleChapterSpec, BundleFontFamilySpec, BundleImageSize, BundleLocaleOverrides, BundleManifest, BundleManifestV1, BundleResourceSpec } from './types';
3
+ /** The optional showcase fields: wrong types reject the manifest rather
4
+ * than being silently dropped. */
5
+ export declare function hasValidShowcaseMeta(v: Record<string, unknown>): boolean;
6
+ /** True when `data` is a valid `preset.json`, version 1 (`markdown`) or 2
7
+ * (`chapters`). */
8
+ export declare function isBundleManifest(data: unknown): data is BundleManifest;
9
+ /** Which markdown file a version 1 manifest serves for `locale`. */
10
+ export declare function pickMarkdownFile(manifest: BundleManifestV1, locale: string): string;
11
+ /** The per-locale overrides that apply to `locale`, or null when the
12
+ * manifest has none. A bundle whose chapters are a locale map applies the
13
+ * overrides of the locale its chapters were picked from, so text and
14
+ * wording never disagree. */
15
+ export declare function pickLocaleOverrides(manifest: BundleManifest, locale: string): BundleLocaleOverrides | null;
16
+ /** The locale a bundle actually serves for `locale`: the key of its
17
+ * chapter map when the content is a locale map, else the manifest's own
18
+ * locale, else `locale` itself. */
19
+ export declare function resolveBundleLocale(manifest: BundleManifest, locale: string): string;
20
+ /** The chapter files to read for `locale`: a version 1 manifest yields a
21
+ * single untitled chapter. */
22
+ export declare function pickChapterSpecs(manifest: BundleManifest, locale: string): BundleChapterSpec[];
23
+ /** Lowercase, hyphen-separated slug: diacritics stripped, runs of anything
24
+ * else collapsed to one hyphen. '' for symbol-only input. */
25
+ export declare function slugify(input: string): string;
26
+ /** `candidate`, or `candidate-2`, `-3`, … when `taken` has it; a blank
27
+ * candidate falls back to `fallback`. */
28
+ export declare function uniqueSlug(candidate: string, taken: Set<string>, fallback?: string): string;
29
+ /** `chapters/01-intro.md`: zero-padded ordinal (at least two digits) plus a
30
+ * slug of the title, unique against `taken` (which it extends). */
31
+ export declare function chapterFileName(index: number, title: string, taken: Set<string>, count?: number): string;
32
+ export declare function fileExtension(file: string): string;
33
+ export declare function fileBasename(file: string): string;
34
+ /** Media type of a bundle file, from its extension. */
35
+ export declare function mimeForFile(file: string): string;
36
+ /** True when `file` is a bitmap the engine can place. */
37
+ export declare function isBitmapFile(file: string): boolean;
38
+ export declare function isSvgFile(file: string): boolean;
39
+ export declare function isPdfFile(file: string): boolean;
40
+ /** Font format of a file name, or null when it is not a font. */
41
+ export declare function fontFormatFromFile(file: string): CustomFontFormat | null;
42
+ /** File extension to write an image of this media type under, or null when
43
+ * it is not a picture a bundle takes (a cover thumbnail). */
44
+ export declare function extensionForImageMime(mime: string): string | null;
45
+ /** File extension to write a resource's bytes under, or null for resources
46
+ * without a file (tables). */
47
+ export declare function extensionForResource(r: Resource): string | null;
48
+ export interface BundleFontFiles {
49
+ families: CustomFontFamily[];
50
+ files: {
51
+ fileId: string;
52
+ fileName: string;
53
+ format: CustomFontFormat;
54
+ file: string;
55
+ family: string;
56
+ weight: number;
57
+ style: 'normal' | 'italic';
58
+ }[];
59
+ warnings: string[];
60
+ }
61
+ /** Turn manifest font families into `config.customFonts` entries plus the
62
+ * list of files to read. `.woff` is not supported by the PDF backend and
63
+ * is skipped with a warning, as is any unrecognised extension. */
64
+ export declare function fontsToCustomFonts(fonts: BundleFontFamilySpec[], fileIdFor?: (file: string) => string): BundleFontFiles;
65
+ /** Build an engine `Resource` from a manifest entry. `size` supplies the
66
+ * intrinsic dimensions when the spec omits them. Bitmap/SVG kind is
67
+ * derived from the file extension. */
68
+ export declare function resourceFromSpec(spec: BundleResourceSpec, size?: BundleImageSize, fileIdFor?: (file: string) => string): Resource;
69
+ /** An SVG's intrinsic pixel size from its root element: explicit
70
+ * `width`/`height`, else the `viewBox` extent; undefined when neither
71
+ * gives one. Reads the markup textually, so it runs anywhere. */
72
+ export declare function svgSize(markup: string): BundleImageSize | undefined;
73
+ /** A bitmap's pixel size read from its header (PNG, JPEG, GIF, WebP), or
74
+ * undefined when the header is not recognised. */
75
+ export declare function bitmapSize(bytes: ArrayBuffer | Uint8Array): BundleImageSize | undefined;
76
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/bundle/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,444 @@
1
+ // Pure helpers for bundle manifests: validation, locale resolution, file
2
+ // naming, and conversion of manifest entries into engine resources and
3
+ // custom fonts. No DOM or storage access.
4
+ // ---------------------------------------------------------------------------
5
+ // Validation
6
+ function isRecord(v) {
7
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
8
+ }
9
+ function isNonEmptyString(v) {
10
+ return typeof v === 'string' && v.length > 0;
11
+ }
12
+ function isOptionalString(v) {
13
+ return v === undefined || typeof v === 'string';
14
+ }
15
+ function isOptionalStringList(v) {
16
+ return v === undefined || (Array.isArray(v) && v.every(isNonEmptyString));
17
+ }
18
+ /** The optional showcase fields: wrong types reject the manifest rather
19
+ * than being silently dropped. */
20
+ export function hasValidShowcaseMeta(v) {
21
+ return isOptionalStringList(v.locales)
22
+ && isOptionalString(v.thumbnail)
23
+ && isOptionalString(v.license)
24
+ && isOptionalString(v.credits)
25
+ && isOptionalStringList(v.tags);
26
+ }
27
+ function isMarkdownField(v) {
28
+ if (isNonEmptyString(v))
29
+ return true;
30
+ if (!isRecord(v))
31
+ return false;
32
+ const values = Object.values(v);
33
+ return values.length > 0 && values.every(isNonEmptyString);
34
+ }
35
+ function isChapterSpec(v) {
36
+ return isRecord(v) && typeof v.title === 'string' && isNonEmptyString(v.file);
37
+ }
38
+ function isChapterList(v) {
39
+ return Array.isArray(v) && v.length > 0 && v.every(isChapterSpec);
40
+ }
41
+ function isChaptersField(v) {
42
+ if (isChapterList(v))
43
+ return true;
44
+ if (!isRecord(v))
45
+ return false;
46
+ const values = Object.values(v);
47
+ return values.length > 0 && values.every(isChapterList);
48
+ }
49
+ function isLocaleOverrides(v) {
50
+ if (!isRecord(v))
51
+ return false;
52
+ if (v.config !== undefined && !isRecord(v.config))
53
+ return false;
54
+ if (v.resources !== undefined) {
55
+ if (!Array.isArray(v.resources))
56
+ return false;
57
+ if (!v.resources.every((r) => isRecord(r) && isNonEmptyString(r.id)))
58
+ return false;
59
+ }
60
+ return true;
61
+ }
62
+ function isViewField(v) {
63
+ if (!isRecord(v))
64
+ return false;
65
+ return v.canvasScope === undefined || v.canvasScope === 'book' || v.canvasScope === 'chapter';
66
+ }
67
+ function isLocalizedField(v) {
68
+ return isRecord(v) && Object.values(v).every(isLocaleOverrides);
69
+ }
70
+ /** True when `data` is a valid `preset.json`, version 1 (`markdown`) or 2
71
+ * (`chapters`). */
72
+ export function isBundleManifest(data) {
73
+ if (!isRecord(data))
74
+ return false;
75
+ if (data.version !== 1 && data.version !== 2)
76
+ return false;
77
+ if (!isNonEmptyString(data.id) || !isNonEmptyString(data.name))
78
+ return false;
79
+ if (data.version === 1 && !isMarkdownField(data.markdown))
80
+ return false;
81
+ if (data.version === 2 && !isChaptersField(data.chapters))
82
+ return false;
83
+ if (!hasValidShowcaseMeta(data))
84
+ return false;
85
+ if (data.view !== undefined && !isViewField(data.view))
86
+ return false;
87
+ if (data.localized !== undefined && !isLocalizedField(data.localized))
88
+ return false;
89
+ if (data.config !== undefined && !isRecord(data.config))
90
+ return false;
91
+ if (data.resources !== undefined) {
92
+ if (!Array.isArray(data.resources))
93
+ return false;
94
+ if (!data.resources.every((r) => isRecord(r) && isNonEmptyString(r.id) && isNonEmptyString(r.typeId)))
95
+ return false;
96
+ }
97
+ if (data.fonts !== undefined) {
98
+ if (!Array.isArray(data.fonts))
99
+ return false;
100
+ const ok = data.fonts.every((f) => isRecord(f) && isNonEmptyString(f.name) && Array.isArray(f.variants)
101
+ && f.variants.every((v) => isRecord(v) && typeof v.weight === 'number' && isNonEmptyString(v.file)));
102
+ if (!ok)
103
+ return false;
104
+ }
105
+ return true;
106
+ }
107
+ // ---------------------------------------------------------------------------
108
+ // Locale resolution
109
+ /** The key of a locale → value map that serves `locale`: exact tag, base
110
+ * language, the manifest's own locale, then the first key. */
111
+ function pickLocaleKey(keys, locale, manifestLocale) {
112
+ const wanted = locale.toLowerCase();
113
+ const byLower = new Map(keys.map((k) => [k.toLowerCase(), k]));
114
+ const exact = byLower.get(wanted);
115
+ if (exact)
116
+ return exact;
117
+ const base = wanted.split(/[-_]/)[0];
118
+ const baseKey = byLower.get(base);
119
+ if (baseKey)
120
+ return baseKey;
121
+ if (manifestLocale) {
122
+ const own = byLower.get(manifestLocale.toLowerCase())
123
+ ?? byLower.get(manifestLocale.toLowerCase().split(/[-_]/)[0]);
124
+ if (own)
125
+ return own;
126
+ }
127
+ return keys[0];
128
+ }
129
+ function pickByLocale(map, locale, manifestLocale) {
130
+ return map[pickLocaleKey(Object.keys(map), locale, manifestLocale)];
131
+ }
132
+ /** Which markdown file a version 1 manifest serves for `locale`. */
133
+ export function pickMarkdownFile(manifest, locale) {
134
+ const md = manifest.markdown;
135
+ if (typeof md === 'string')
136
+ return md;
137
+ return pickByLocale(md, locale, manifest.locale);
138
+ }
139
+ /** The per-locale overrides that apply to `locale`, or null when the
140
+ * manifest has none. A bundle whose chapters are a locale map applies the
141
+ * overrides of the locale its chapters were picked from, so text and
142
+ * wording never disagree. */
143
+ export function pickLocaleOverrides(manifest, locale) {
144
+ const localized = manifest.localized;
145
+ if (!localized || Object.keys(localized).length === 0)
146
+ return null;
147
+ const chapterMap = manifest.version === 2 && !Array.isArray(manifest.chapters) ? manifest.chapters
148
+ : manifest.version === 1 && typeof manifest.markdown !== 'string' ? manifest.markdown
149
+ : null;
150
+ const key = chapterMap
151
+ ? pickLocaleKey(Object.keys(chapterMap), locale, manifest.locale)
152
+ : pickLocaleKey(Object.keys(localized), locale, manifest.locale);
153
+ // Only that locale's own overrides (exact tag or base language) apply: a
154
+ // locale without any keeps the shared wording.
155
+ const wanted = key.toLowerCase();
156
+ const base = wanted.split(/[-_]/)[0];
157
+ const keys = Object.keys(localized);
158
+ const found = keys.find((k) => k.toLowerCase() === wanted)
159
+ ?? keys.find((k) => k.toLowerCase().split(/[-_]/)[0] === base);
160
+ return found ? localized[found] : null;
161
+ }
162
+ /** The locale a bundle actually serves for `locale`: the key of its
163
+ * chapter map when the content is a locale map, else the manifest's own
164
+ * locale, else `locale` itself. */
165
+ export function resolveBundleLocale(manifest, locale) {
166
+ const map = manifest.version === 2
167
+ ? (Array.isArray(manifest.chapters) ? null : manifest.chapters)
168
+ : (typeof manifest.markdown === 'string' ? null : manifest.markdown);
169
+ if (map)
170
+ return pickLocaleKey(Object.keys(map), locale, manifest.locale);
171
+ return manifest.locale ?? locale;
172
+ }
173
+ /** The chapter files to read for `locale`: a version 1 manifest yields a
174
+ * single untitled chapter. */
175
+ export function pickChapterSpecs(manifest, locale) {
176
+ if (manifest.version === 1)
177
+ return [{ title: '', file: pickMarkdownFile(manifest, locale) }];
178
+ const ch = manifest.chapters;
179
+ return Array.isArray(ch) ? ch : pickByLocale(ch, locale, manifest.locale);
180
+ }
181
+ // ---------------------------------------------------------------------------
182
+ // File names
183
+ /** Lowercase, hyphen-separated slug: diacritics stripped, runs of anything
184
+ * else collapsed to one hyphen. '' for symbol-only input. */
185
+ export function slugify(input) {
186
+ return input
187
+ .normalize('NFKD')
188
+ .replace(/[̀-ͯ]/g, '')
189
+ .toLowerCase()
190
+ .replace(/[^a-z0-9]+/g, '-')
191
+ .replace(/^-+|-+$/g, '');
192
+ }
193
+ /** `candidate`, or `candidate-2`, `-3`, … when `taken` has it; a blank
194
+ * candidate falls back to `fallback`. */
195
+ export function uniqueSlug(candidate, taken, fallback = 'resource') {
196
+ const base = candidate || fallback;
197
+ if (!taken.has(base))
198
+ return base;
199
+ let n = 2;
200
+ while (taken.has(`${base}-${n}`))
201
+ n++;
202
+ return `${base}-${n}`;
203
+ }
204
+ /** `chapters/01-intro.md`: zero-padded ordinal (at least two digits) plus a
205
+ * slug of the title, unique against `taken` (which it extends). */
206
+ export function chapterFileName(index, title, taken, count = 1) {
207
+ const digits = Math.max(2, String(count).length);
208
+ const ordinal = String(index + 1).padStart(digits, '0');
209
+ const name = uniqueSlug(`${ordinal}-${slugify(title) || 'chapter'}`, taken, 'chapter');
210
+ taken.add(name);
211
+ return `chapters/${name}.md`;
212
+ }
213
+ export function fileExtension(file) {
214
+ const base = file.split('/').pop() ?? file;
215
+ const dot = base.lastIndexOf('.');
216
+ return dot === -1 ? '' : base.slice(dot + 1).toLowerCase();
217
+ }
218
+ export function fileBasename(file) {
219
+ return file.split('/').pop() ?? file;
220
+ }
221
+ const MIME_BY_EXT = {
222
+ svg: 'image/svg+xml',
223
+ png: 'image/png',
224
+ jpg: 'image/jpeg',
225
+ jpeg: 'image/jpeg',
226
+ webp: 'image/webp',
227
+ gif: 'image/gif',
228
+ pdf: 'application/pdf',
229
+ ttf: 'font/ttf',
230
+ otf: 'font/otf',
231
+ woff2: 'font/woff2',
232
+ md: 'text/markdown',
233
+ json: 'application/json',
234
+ };
235
+ /** Media type of a bundle file, from its extension. */
236
+ export function mimeForFile(file) {
237
+ return MIME_BY_EXT[fileExtension(file)] ?? 'application/octet-stream';
238
+ }
239
+ const BITMAP_FORMAT_BY_EXT = {
240
+ png: 'png',
241
+ jpg: 'jpeg',
242
+ jpeg: 'jpeg',
243
+ webp: 'webp',
244
+ gif: 'gif',
245
+ };
246
+ /** True when `file` is a bitmap the engine can place. */
247
+ export function isBitmapFile(file) {
248
+ return fileExtension(file) in BITMAP_FORMAT_BY_EXT;
249
+ }
250
+ export function isSvgFile(file) {
251
+ return fileExtension(file) === 'svg';
252
+ }
253
+ export function isPdfFile(file) {
254
+ return fileExtension(file) === 'pdf';
255
+ }
256
+ /** Font format of a file name, or null when it is not a font. */
257
+ export function fontFormatFromFile(file) {
258
+ switch (fileExtension(file)) {
259
+ case 'woff2': return 'woff2';
260
+ case 'woff': return 'woff';
261
+ case 'ttf': return 'ttf';
262
+ case 'otf': return 'otf';
263
+ default: return null;
264
+ }
265
+ }
266
+ const EXT_BY_BITMAP_FORMAT = {
267
+ png: 'png',
268
+ jpeg: 'jpg',
269
+ webp: 'webp',
270
+ gif: 'gif',
271
+ };
272
+ const EXT_BY_IMAGE_MIME = {
273
+ 'image/png': 'png',
274
+ 'image/jpeg': 'jpg',
275
+ 'image/webp': 'webp',
276
+ 'image/gif': 'gif',
277
+ 'image/svg+xml': 'svg',
278
+ };
279
+ /** File extension to write an image of this media type under, or null when
280
+ * it is not a picture a bundle takes (a cover thumbnail). */
281
+ export function extensionForImageMime(mime) {
282
+ return EXT_BY_IMAGE_MIME[mime.toLowerCase()] ?? null;
283
+ }
284
+ /** File extension to write a resource's bytes under, or null for resources
285
+ * without a file (tables). */
286
+ export function extensionForResource(r) {
287
+ if (r.kind === 'svg' && r.svg)
288
+ return 'svg';
289
+ if (r.kind === 'bitmap' && r.bitmap)
290
+ return EXT_BY_BITMAP_FORMAT[r.bitmap.format] ?? r.bitmap.format;
291
+ return null;
292
+ }
293
+ const identity = (file) => file;
294
+ /** Turn manifest font families into `config.customFonts` entries plus the
295
+ * list of files to read. `.woff` is not supported by the PDF backend and
296
+ * is skipped with a warning, as is any unrecognised extension. */
297
+ export function fontsToCustomFonts(fonts, fileIdFor = identity) {
298
+ const families = [];
299
+ const files = [];
300
+ const warnings = [];
301
+ for (const family of fonts) {
302
+ const variants = [];
303
+ for (const v of family.variants) {
304
+ const format = fontFormatFromFile(v.file);
305
+ if (!format || format === 'woff') {
306
+ warnings.push(`${family.name}: unsupported font file "${v.file}"`);
307
+ continue;
308
+ }
309
+ const fileId = fileIdFor(v.file);
310
+ const fileName = fileBasename(v.file);
311
+ const style = v.style === 'italic' ? 'italic' : 'normal';
312
+ variants.push({ weight: v.weight, style, fileId, format, fileName });
313
+ files.push({ fileId, fileName, format, file: v.file, family: family.name, weight: v.weight, style });
314
+ }
315
+ if (variants.length > 0) {
316
+ families.push({ name: family.name, variants, ...(family.redistributable === false ? { redistributable: false } : {}) });
317
+ }
318
+ else
319
+ warnings.push(`${family.name}: no usable variants`);
320
+ }
321
+ return { families, files, warnings };
322
+ }
323
+ /** Build an engine `Resource` from a manifest entry. `size` supplies the
324
+ * intrinsic dimensions when the spec omits them. Bitmap/SVG kind is
325
+ * derived from the file extension. */
326
+ export function resourceFromSpec(spec, size, fileIdFor = identity) {
327
+ const now = Date.now();
328
+ const { file, pdfFile, width, height, ...rest } = spec;
329
+ const base = { ...rest, createdAt: now, updatedAt: now };
330
+ if (!file)
331
+ return base;
332
+ const fileId = fileIdFor(file);
333
+ const w = width ?? size?.width;
334
+ const h = height ?? size?.height;
335
+ if (isSvgFile(file)) {
336
+ const master = pdfFile && isPdfFile(pdfFile) ? { pdfFileId: fileIdFor(pdfFile) } : {};
337
+ return {
338
+ ...base,
339
+ kind: 'svg',
340
+ svg: w && h ? { fileId, width: w, height: h, ...master } : { fileId, ...master },
341
+ };
342
+ }
343
+ const format = BITMAP_FORMAT_BY_EXT[fileExtension(file)];
344
+ if (format) {
345
+ return {
346
+ ...base,
347
+ kind: 'bitmap',
348
+ bitmap: { fileId, format, width: w ?? 0, height: h ?? 0 },
349
+ };
350
+ }
351
+ return base;
352
+ }
353
+ // ---------------------------------------------------------------------------
354
+ // Intrinsic sizes, without a DOM
355
+ function parseSvgLength(value) {
356
+ if (!value)
357
+ return null;
358
+ const trimmed = value.trim();
359
+ if (trimmed.endsWith('%'))
360
+ return null;
361
+ const num = parseFloat(trimmed);
362
+ if (!Number.isFinite(num) || num <= 0)
363
+ return null;
364
+ const unit = trimmed.replace(/^[\d.+-]+/, '').toLowerCase();
365
+ const factor = unit === 'pt' ? 96 / 72 : unit === 'pc' ? 16 : unit === 'in' ? 96 : unit === 'cm' ? 96 / 2.54 : unit === 'mm' ? 96 / 25.4 : 1;
366
+ return num * factor;
367
+ }
368
+ /** An SVG's intrinsic pixel size from its root element: explicit
369
+ * `width`/`height`, else the `viewBox` extent; undefined when neither
370
+ * gives one. Reads the markup textually, so it runs anywhere. */
371
+ export function svgSize(markup) {
372
+ const tag = /<svg\b([^>]*)>/i.exec(markup.replace(/<!--[\s\S]*?-->/g, ''));
373
+ if (!tag)
374
+ return undefined;
375
+ const attrs = {};
376
+ for (const m of tag[1].matchAll(/([\w:-]+)\s*=\s*("([^"]*)"|'([^']*)')/g)) {
377
+ attrs[m[1]] = m[3] ?? m[4] ?? '';
378
+ }
379
+ const w = parseSvgLength(attrs.width);
380
+ const h = parseSvgLength(attrs.height);
381
+ if (w && h)
382
+ return { width: w, height: h };
383
+ const viewBox = attrs.viewBox;
384
+ if (viewBox) {
385
+ const parts = viewBox.trim().split(/[\s,]+/).map(Number);
386
+ if (parts.length === 4 && parts.every(Number.isFinite) && parts[2] > 0 && parts[3] > 0) {
387
+ return { width: parts[2], height: parts[3] };
388
+ }
389
+ }
390
+ return undefined;
391
+ }
392
+ /** A bitmap's pixel size read from its header (PNG, JPEG, GIF, WebP), or
393
+ * undefined when the header is not recognised. */
394
+ export function bitmapSize(bytes) {
395
+ const b = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);
396
+ const view = new DataView(b.buffer, b.byteOffset, b.byteLength);
397
+ const ascii = (at, len) => String.fromCharCode(...b.subarray(at, at + len));
398
+ if (b.length >= 24 && b[0] === 0x89 && ascii(1, 3) === 'PNG') {
399
+ return { width: view.getUint32(16), height: view.getUint32(20) };
400
+ }
401
+ if (b.length >= 10 && ascii(0, 3) === 'GIF') {
402
+ return { width: view.getUint16(6, true), height: view.getUint16(8, true) };
403
+ }
404
+ if (b.length >= 30 && ascii(0, 4) === 'RIFF' && ascii(8, 4) === 'WEBP') {
405
+ const chunk = ascii(12, 4);
406
+ if (chunk === 'VP8X') {
407
+ const w = 1 + (b[24] | (b[25] << 8) | (b[26] << 16));
408
+ const h = 1 + (b[27] | (b[28] << 8) | (b[29] << 16));
409
+ return { width: w, height: h };
410
+ }
411
+ if (chunk === 'VP8 ')
412
+ return { width: view.getUint16(26, true) & 0x3fff, height: view.getUint16(28, true) & 0x3fff };
413
+ if (chunk === 'VP8L') {
414
+ const bits = view.getUint32(21, true);
415
+ return { width: (bits & 0x3fff) + 1, height: ((bits >> 14) & 0x3fff) + 1 };
416
+ }
417
+ return undefined;
418
+ }
419
+ if (b.length >= 4 && b[0] === 0xff && b[1] === 0xd8) {
420
+ let i = 2;
421
+ while (i + 9 < b.length) {
422
+ if (b[i] !== 0xff) {
423
+ i++;
424
+ continue;
425
+ }
426
+ const marker = b[i + 1];
427
+ if (marker === 0xff) {
428
+ i++;
429
+ continue;
430
+ }
431
+ // Start-of-frame markers carry the size (not DHT, JPG, DAC).
432
+ if (marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc) {
433
+ return { width: view.getUint16(i + 7), height: view.getUint16(i + 5) };
434
+ }
435
+ if (marker === 0xd8 || (marker >= 0xd0 && marker <= 0xd7) || marker === 0x01) {
436
+ i += 2;
437
+ continue;
438
+ }
439
+ i += 2 + view.getUint16(i + 2);
440
+ }
441
+ }
442
+ return undefined;
443
+ }
444
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/bundle/manifest.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,uEAAuE;AACvE,0CAA0C;AAc1C,8EAA8E;AAC9E,aAAa;AAEb,SAAS,QAAQ,CAAC,CAAU;IAC1B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAU;IAClC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAU;IAClC,OAAO,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC;AAClD,CAAC;AAED,SAAS,oBAAoB,CAAC,CAAU;IACtC,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED;mCACmC;AACnC,MAAM,UAAU,oBAAoB,CAAC,CAA0B;IAC7D,OAAO,oBAAoB,CAAC,CAAC,CAAC,OAAO,CAAC;WACjC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;WAC7B,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC;WAC3B,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC;WAC3B,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,eAAe,CAAC,CAAU;IACjC,IAAI,gBAAgB,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAChC,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,aAAa,CAAC,CAAU;IAC/B,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,aAAa,CAAC,CAAU;IAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,eAAe,CAAC,CAAU;IACjC,IAAI,aAAa,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAChC,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,iBAAiB,CAAC,CAAU;IACnC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/B,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAChE,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YAAE,OAAO,KAAK,CAAC;QAC9C,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IACrF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,CAAU;IAC7B,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/B,OAAO,CAAC,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,WAAW,KAAK,MAAM,IAAI,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC;AAChG,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAU;IAClC,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;AAClE,CAAC;AAED;oBACoB;AACpB,MAAM,UAAU,gBAAgB,CAAC,IAAa;IAC5C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3D,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7E,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACxE,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACxE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9C,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACrE,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IACpF,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IACtE,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO,KAAK,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IACtH,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAChC,QAAQ,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;eACjE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CACpG,CAAC;QACF,IAAI,CAAC,EAAE;YAAE,OAAO,KAAK,CAAC;IACxB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AAEpB;+DAC+D;AAC/D,SAAS,aAAa,CAAC,IAAc,EAAE,MAAc,EAAE,cAAuB;IAC5E,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,CAAC;IACtC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC;eAChD,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;QACjE,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;IACtB,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,CAAE,CAAC;AAClB,CAAC;AAED,SAAS,YAAY,CAAI,GAAsB,EAAE,MAAc,EAAE,cAAuB;IACtF,OAAO,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,CAAE,CAAC;AACvE,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,gBAAgB,CAAC,QAA0B,EAAE,MAAc;IACzE,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC;IAC7B,IAAI,OAAO,EAAE,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACtC,OAAO,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;AACnD,CAAC;AAED;;;8BAG8B;AAC9B,MAAM,UAAU,mBAAmB,CAAC,QAAwB,EAAE,MAAc;IAC1E,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;IACrC,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnE,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ;QAChG,CAAC,CAAC,QAAQ,CAAC,OAAO,KAAK,CAAC,IAAI,OAAO,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ;YACnF,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,GAAG,GAAG,UAAU;QACpB,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC;QACjE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnE,yEAAyE;IACzE,+CAA+C;IAC/C,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;WACrD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IACjE,OAAO,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1C,CAAC;AAED;;oCAEoC;AACpC,MAAM,UAAU,mBAAmB,CAAC,QAAwB,EAAE,MAAc;IAC1E,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,KAAK,CAAC;QAChC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC/D,CAAC,CAAC,CAAC,OAAO,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACvE,IAAI,GAAG;QAAE,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzE,OAAO,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC;AACnC,CAAC;AAED;+BAC+B;AAC/B,MAAM,UAAU,gBAAgB,CAAC,QAAwB,EAAE,MAAc;IACvE,IAAI,QAAQ,CAAC,OAAO,KAAK,CAAC;QAAE,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7F,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC;IAC7B,OAAO,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC5E,CAAC;AAED,8EAA8E;AAC9E,aAAa;AAEb;8DAC8D;AAC9D,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,KAAK;SACT,SAAS,CAAC,MAAM,CAAC;SACjB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED;0CAC0C;AAC1C,MAAM,UAAU,UAAU,CAAC,SAAiB,EAAE,KAAkB,EAAE,QAAQ,GAAG,UAAU;IACrF,MAAM,IAAI,GAAG,SAAS,IAAI,QAAQ,CAAC;IACnC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;QAAE,CAAC,EAAE,CAAC;IACtC,OAAO,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;AACxB,CAAC;AAED;oEACoE;AACpE,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,KAAa,EAAE,KAAkB,EAAE,KAAK,GAAG,CAAC;IACzF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACvF,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChB,OAAO,YAAY,IAAI,KAAK,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;AACvC,CAAC;AAED,MAAM,WAAW,GAA2B;IAC1C,GAAG,EAAE,eAAe;IACpB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,YAAY;IACjB,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,iBAAiB;IACtB,GAAG,EAAE,UAAU;IACf,GAAG,EAAE,UAAU;IACf,KAAK,EAAE,YAAY;IACnB,EAAE,EAAE,eAAe;IACnB,IAAI,EAAE,kBAAkB;CACzB,CAAC;AAEF,uDAAuD;AACvD,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,0BAA0B,CAAC;AACxE,CAAC;AAED,MAAM,oBAAoB,GAA2B;IACnD,GAAG,EAAE,KAAK;IACV,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;CACX,CAAC;AAEF,yDAAyD;AACzD,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC;AACvC,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,QAAQ,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,KAAK,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC;QAC7B,KAAK,MAAM,CAAC,CAAC,OAAO,MAAM,CAAC;QAC3B,KAAK,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC;QACzB,KAAK,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC;QACzB,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,oBAAoB,GAA2B;IACnD,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,KAAK;IACX,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;CACX,CAAC;AAEF,MAAM,iBAAiB,GAA2B;IAChD,WAAW,EAAE,KAAK;IAClB,YAAY,EAAE,KAAK;IACnB,YAAY,EAAE,MAAM;IACpB,WAAW,EAAE,KAAK;IAClB,eAAe,EAAE,KAAK;CACvB,CAAC;AAEF;8DAC8D;AAC9D,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAC;AACvD,CAAC;AAED;+BAC+B;AAC/B,MAAM,UAAU,oBAAoB,CAAC,CAAW;IAC9C,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM;QAAE,OAAO,oBAAoB,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;IACrG,OAAO,IAAI,CAAC;AACd,CAAC;AAWD,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC;AAEhD;;mEAEmE;AACnE,MAAM,UAAU,kBAAkB,CAChC,KAA6B,EAC7B,YAAsC,QAAQ;IAE9C,MAAM,QAAQ,GAAuB,EAAE,CAAC;IACxC,MAAM,KAAK,GAA6B,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAiC,EAAE,CAAC;QAClD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACjC,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,4BAA4B,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;gBACnE,SAAS;YACX,CAAC;YACD,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;YACzD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YACrE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACvG,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,eAAe,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1H,CAAC;;YAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,sBAAsB,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AACvC,CAAC;AAED;;uCAEuC;AACvC,MAAM,UAAU,gBAAgB,CAC9B,IAAwB,EACxB,IAAsB,EACtB,YAAsC,QAAQ;IAE9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IACvD,MAAM,IAAI,GAAa,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;IACnE,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,CAAC,GAAG,KAAK,IAAI,IAAI,EAAE,KAAK,CAAC;IAC/B,MAAM,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,MAAM,CAAC;IAEjC,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,OAAO;YACL,GAAG,IAAI;YACP,IAAI,EAAE,KAAK;YACX,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;SACjF,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,oBAAoB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;YACL,GAAG,IAAI;YACP,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;SAC1D,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,iCAAiC;AAEjC,SAAS,cAAc,CAAC,KAAyB;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5D,MAAM,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7I,OAAO,GAAG,GAAG,MAAM,CAAC;AACtB,CAAC;AAED;;kEAEkE;AAClE,MAAM,UAAU,OAAO,CAAC,MAAc;IACpC,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3E,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC,EAAE,CAAC;QAC3E,KAAK,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC;IACD,MAAM,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,CAAC,CAAE,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAE,GAAG,CAAC,EAAE,CAAC;YACzF,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,CAAC;QACjD,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;mDACmD;AACnD,MAAM,UAAU,UAAU,CAAC,KAA+B;IACxD,MAAM,CAAC,GAAG,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,GAAW,EAAU,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;IACpG,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;QAC7D,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;QAC5C,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;IAC7E,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QACvE,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3B,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACxD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACxD,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QACjC,CAAC;QACD,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC;QACrH,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YACtC,OAAO,EAAE,KAAK,EAAE,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7E,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACpD,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAAC,CAAC,EAAE,CAAC;gBAAC,SAAS;YAAC,CAAC;YACrC,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;YACzB,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBAAC,CAAC,EAAE,CAAC;gBAAC,SAAS;YAAC,CAAC;YACvC,6DAA6D;YAC7D,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBAC9F,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACzE,CAAC;YACD,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBAAC,CAAC,IAAI,CAAC,CAAC;gBAAC,SAAS;YAAC,CAAC;YACnG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}