omni-viewer-core 0.18.0 → 0.20.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 (77) hide show
  1. package/README.md +217 -3
  2. package/dist/i18n/catalog.en.js +361 -0
  3. package/dist/i18n/catalog.ja.js +361 -0
  4. package/dist/i18n/catalog.ko.js +361 -0
  5. package/dist/i18n/catalog.zh-cn.js +361 -0
  6. package/dist/parsers/epub/index.d.ts +102 -0
  7. package/dist/parsers/epub/index.js +951 -0
  8. package/dist/parsers/epub/model.d.ts +107 -0
  9. package/dist/parsers/epub/model.js +5 -0
  10. package/dist/parsers/epub/xml.d.ts +37 -0
  11. package/dist/parsers/epub/xml.js +292 -0
  12. package/dist/parsers/epub/zip.d.ts +43 -0
  13. package/dist/parsers/epub/zip.js +203 -0
  14. package/dist/parsers/har/index.d.ts +54 -0
  15. package/dist/parsers/har/index.js +833 -0
  16. package/dist/parsers/har/model.d.ts +172 -0
  17. package/dist/parsers/har/model.js +5 -0
  18. package/dist/parsers/notebook/index.d.ts +17 -0
  19. package/dist/parsers/notebook/index.js +212 -0
  20. package/dist/parsers/notebook/model.d.ts +40 -0
  21. package/dist/parsers/notebook/model.js +1 -0
  22. package/dist/parsers/pt2/index.js +136 -69
  23. package/dist/parsers/pte/index.d.ts +211 -0
  24. package/dist/parsers/pte/index.js +1196 -0
  25. package/dist/parsers/xml/index.d.ts +13 -0
  26. package/dist/parsers/xml/index.js +60 -0
  27. package/dist/parsers/xml/model.d.ts +86 -0
  28. package/dist/parsers/xml/model.js +19 -0
  29. package/dist/parsers/xml/parse.d.ts +18 -0
  30. package/dist/parsers/xml/parse.js +649 -0
  31. package/dist/registry/index.d.ts +10 -1
  32. package/dist/registry/index.js +42 -4
  33. package/dist/registry/probe.js +3 -0
  34. package/dist/registry/sniff.d.ts +23 -2
  35. package/dist/registry/sniff.js +98 -1
  36. package/dist/styles/epub.css +61 -0
  37. package/dist/styles/har.css +94 -0
  38. package/dist/styles/notebook.css +17 -0
  39. package/dist/styles/pte.css +3 -0
  40. package/dist/styles/xml.css +76 -0
  41. package/dist/viewers/epub/content.d.ts +129 -0
  42. package/dist/viewers/epub/content.js +1585 -0
  43. package/dist/viewers/epub/controller.d.ts +54 -0
  44. package/dist/viewers/epub/controller.js +81 -0
  45. package/dist/viewers/epub/index.d.ts +47 -0
  46. package/dist/viewers/epub/index.js +1006 -0
  47. package/dist/viewers/epub/self-loading.d.ts +3 -0
  48. package/dist/viewers/epub/self-loading.js +6 -0
  49. package/dist/viewers/epub/styles.d.ts +1 -0
  50. package/dist/viewers/epub/styles.js +66 -0
  51. package/dist/viewers/har/index.d.ts +29 -0
  52. package/dist/viewers/har/index.js +804 -0
  53. package/dist/viewers/har/styles.d.ts +1 -0
  54. package/dist/viewers/har/styles.js +98 -0
  55. package/dist/viewers/markdown/index.js +1 -5
  56. package/dist/viewers/markdown/math.d.ts +11 -1
  57. package/dist/viewers/markdown/math.js +315 -19
  58. package/dist/viewers/markdown/sanitize.d.ts +9 -0
  59. package/dist/viewers/markdown/sanitize.js +7 -0
  60. package/dist/viewers/notebook/index.d.ts +24 -0
  61. package/dist/viewers/notebook/index.js +516 -0
  62. package/dist/viewers/notebook/self-loading.d.ts +3 -0
  63. package/dist/viewers/notebook/self-loading.js +18 -0
  64. package/dist/viewers/notebook/styles.d.ts +1 -0
  65. package/dist/viewers/notebook/styles.js +9 -0
  66. package/dist/viewers/pt2/index.js +188 -52
  67. package/dist/viewers/pte/index.d.ts +20 -0
  68. package/dist/viewers/pte/index.js +883 -0
  69. package/dist/viewers/pte/styles.d.ts +1 -0
  70. package/dist/viewers/pte/styles.js +4 -0
  71. package/dist/viewers/xml/controller.d.ts +83 -0
  72. package/dist/viewers/xml/controller.js +459 -0
  73. package/dist/viewers/xml/index.d.ts +62 -0
  74. package/dist/viewers/xml/index.js +836 -0
  75. package/dist/viewers/xml/styles.d.ts +1 -0
  76. package/dist/viewers/xml/styles.js +81 -0
  77. package/package.json +62 -1
package/README.md CHANGED
@@ -13,11 +13,14 @@ models, viewers mount into a DOM element, and everything host-specific
13
13
  ## Supported formats
14
14
 
15
15
  - **Documents** — PDF, Word (DOCX and legacy DOC), HWP, PowerPoint (PPTX and
16
- legacy PPT), Markdown, LaTeX (structure and math preview, not typesetting)
17
- - **Data & spreadsheets** — Excel, CSV/TSV, JSON, JSONL/NDJSON, YAML, TOML,
16
+ legacy PPT), Markdown, Jupyter Notebook (.ipynb), EPUB e-books (2 and 3),
17
+ LaTeX (structure and math preview, not typesetting)
18
+ - **Data & spreadsheets** — Excel, CSV/TSV, JSON, JSONL/NDJSON, YAML, TOML, XML,
18
19
  Parquet, Avro, HDF5, MATLAB MAT, NumPy (NPY/NPZ), Safetensors, GGUF, ONNX, TFLite/LiteRT,
19
20
  Keras (.keras and legacy .h5), Core ML (.mlmodel and .mlpackage),
20
- OpenVINO IR (.xml + .bin), PyTorch Export (.pt2), Protocol Buffers, ReqIF, SQLite
21
+ OpenVINO IR (.xml + .bin), PyTorch Export (.pt2), ExecuTorch (.pte), Protocol
22
+ Buffers, ReqIF, SQLite
23
+ - **Web & network** — HAR (HTTP Archive) request logs
21
24
  - **Media & graphics** — audio (waveform/spectrogram), video, images,
22
25
  Photoshop PSD
23
26
  - **Engineering & automotive** — CAN DBC, AUTOSAR ARXML, ASAM A2L, Vector
@@ -299,6 +302,217 @@ through `probeContainer`, which recognizes the `archive_format` marker
299
302
  A plain `torch.save` checkpoint (`.pt` / `.pth`) is not an Export package and
300
303
  is not claimed.
301
304
 
305
+ ### ExecuTorch programs (.pte)
306
+
307
+ A `.pte` is what `to_executorch().save()` writes: a FlatBuffer following
308
+ ExecuTorch's `program.fbs` (file identifier `ET12`), optionally followed by data
309
+ segments — constant tensors, delegate blobs, mutable initial state, and named
310
+ blobs — that an extended header (`eh00`, inserted right after the identifier)
311
+ locates. The parser reads the FlatBuffer directly with no schema compiler and no
312
+ runtime dependency, and never decodes a segment or buffer payload:
313
+
314
+ ```ts
315
+ import { mountPteViewer } from 'omni-viewer-core/viewers/pte';
316
+
317
+ await mountPteViewer({ fileName: file.name, data: bytes }, container, ctx);
318
+ ```
319
+
320
+ `parsePte` keeps every method (`ExecutionPlan`) with its values, instructions,
321
+ operators, and delegates, and resolves where each tensor's bytes live: the
322
+ deprecated inline `constant_buffer`, the constant segment (`constant_segment`
323
+ offsets, with the alignment-padded slot size and absolute file offset), a
324
+ mutable data segment for buffers with initial state, an external `.ptd` file
325
+ (`ExtraTensorInfo.location = EXTERNAL`), a memory-planned arena slot
326
+ (`AllocationDetails`), or nothing at all for runtime inputs. A kernel call's
327
+ outputs come from the return value the emitter appends after the schema
328
+ arguments (the out tensor, a TensorList of the out tensors, or a fresh scalar
329
+ for a symbolic op), and only the out-argument positions in front of it are
330
+ dropped from the inputs; a delegate call carries inputs then outputs with no marker,
331
+ so those are split by data flow — the trailing arguments nothing defined yet.
332
+ A view or alias the emitter gave its own EValue — a tensor nothing writes that
333
+ shares a memory-planned slot with an earlier one — is resolved to the value it
334
+ aliases when the file leaves no other reading, so a delegate fed through
335
+ aliases keeps its inputs and the graph keeps its edges. Every EValue kind
336
+ gets a preview, delegate compile specs are decoded when they are short text,
337
+ and the leading instructions keep their emitter stack traces.
338
+
339
+ The viewer draws each method's kernel, delegate, and move calls as a graph with
340
+ inputs, consumed constants, and outputs, plus an inspector (arguments with their
341
+ values, backend and compile specs for a delegate call, jump destination, stack
342
+ trace), and searchable instruction, value, input/output, delegate, segment, and
343
+ model-information panels; a multi-method program gets a method selector.
344
+ Warnings cover backends the runtime must register, tensors stored in a separate
345
+ `.ptd`, segments the file cannot locate or that run past its end, constant data
346
+ the program never provides, references to segments the program never declares,
347
+ and unrecognized scalar types, value kinds, or instruction kinds.
348
+
349
+ Routing is by the `.pte` extension, validated against the `ET12` identifier at
350
+ offset 4; an extensionless program is detected from the same bytes. A `.ptd`
351
+ data file (`FT01`) is not a program and is not claimed.
352
+
353
+ ### Jupyter notebooks (.ipynb)
354
+
355
+ View nbformat 4 notebooks with their code and saved results in file order.
356
+ Markdown cells reuse the Markdown renderer, syntax highlighter, math renderer,
357
+ and prose styles. Code cells show `In`/`Out` execution counts, stdout/stderr,
358
+ HTML tables, PNG/JPEG/GIF/WebP/SVG images, Markdown, LaTeX, JSON, plain text,
359
+ and error tracebacks. Raw cells display as text. Code is never executed.
360
+
361
+ ```ts
362
+ import { mountNotebookViewer } from 'omni-viewer-core/viewers/notebook';
363
+ import { loadNotebookViewerDeps } from 'omni-viewer-core/viewers/notebook/self-loading';
364
+
365
+ const deps = await loadNotebookViewerDeps();
366
+ const handle = await mountNotebookViewer(
367
+ { fileName: 'analysis.ipynb', data: notebookBytes }, container, hostContext, deps
368
+ );
369
+ // Release the viewer, listeners, and any host-resolved assets on close.
370
+ handle.dispose();
371
+ ```
372
+
373
+ The loader requires the existing optional peers `marked` and `dompurify`;
374
+ `highlight.js` and `katex` enhance code and formulas when installed. Adapters
375
+ can inject the same dependencies they use for Markdown. Load KaTeX CSS and
376
+ fonts inside the viewer's shadow root when using KaTeX, as with Markdown.
377
+ Scoped mounting uses `styles/notebook.css`.
378
+
379
+ Search cells and results, hide all code or outputs, or expand individual cells.
380
+ Persisted `source_hidden`, `outputs_hidden`, and `collapsed` hints set the
381
+ initial expansion state. One static representation is selected per MIME bundle;
382
+ interactive widget/JavaScript outputs fall back to saved plain text, or a
383
+ clear unsupported-output notice. Markdown `attachment:` images work offline.
384
+ Relative images use the optional `documentAssets` service, external links use
385
+ `navigation`, and remote resources and active HTML are blocked.
386
+
387
+ `parseNotebook` is also available from `parsers/notebook`. It returns a typed
388
+ `ParseOutcome<NotebookDocument>` and uses the core JSON parser, retaining raw
389
+ JSON output tokens. Defaults: 64 MiB input, 2,000 cells, 10,000 outputs, 4 MiB
390
+ per preview, and 16 MiB cumulative previews. `limits.maxEntries` counts cells;
391
+ `maxOutputs` and `maxTotalPreviewBytes` are independent limits. Truncation
392
+ returns `partial` with diagnostics. Invalid JSON and unsupported major versions
393
+ return typed failures. See [viewer details](examples/notebook/README.md) and the
394
+ [sample notebook](examples/notebook/analysis.ipynb).
395
+
396
+ ### HAR network logs (.har)
397
+
398
+ A `.har` file is the HTTP Archive a browser's network panel (or curl, Charles,
399
+ Fiddler, Playwright) exports: one JSON `log` holding every request of a session
400
+ with its headers, bodies, sizes, and phase timings. It is the artifact a web or
401
+ API failure usually arrives as, so the viewer is built for triage rather than
402
+ for reading JSON:
403
+
404
+ ```ts
405
+ import { mountHarViewer } from 'omni-viewer-core/viewers/har';
406
+
407
+ await mountHarViewer({ fileName: file.name, data: bytes }, container, ctx);
408
+ ```
409
+
410
+ `parseHar` is a contract parser (`ParseOutcome<HarDocument>`) and reads the
411
+ archive through the core JSON layer, so a truncated export still yields the
412
+ requests it did hold. Each entry keeps its request and response headers, query
413
+ string, cookies, request payload, and response body, and gains what the table
414
+ needs: host, path, status class, resource type (from `_resourceType` when the
415
+ writer supplied one, from the MIME type otherwise), transferred bytes
416
+ (`_transferSize` when present), decoded resource size, and a phase breakdown
417
+ with the TLS handshake taken out of `connect` so a waterfall cannot
418
+ double-count it. Timestamps go through a core ISO-8601 parser rather than
419
+ `new Date(string)`, and the timeline's origin is the earliest entry, so offsets
420
+ and bar positions are the same on every platform. A base64 body is decoded when
421
+ its MIME type is textual (the URL-safe alphabet included) and reported by size
422
+ only when it is not; bodies are kept up to a preview limit, and entries up to
423
+ `HAR_DEFAULT_MAX_ENTRIES` (a larger archive comes back `partial` with a
424
+ diagnostic). A body cut by the preview limit and one the archive stored
425
+ incompletely — several padded base64 chunks, or a tail outside the alphabet —
426
+ are reported as two different things, and a size or start time the archive never
427
+ gave is kept unknown rather than shown as a confident zero.
428
+
429
+ The viewer shows summary figures (requests, elapsed, transferred, resources,
430
+ domains, errors), a request table sortable by every column with a per-entry
431
+ waterfall bar, and filters for method, status class, resource type, domain, and
432
+ free text over URLs, status text, and headers — with an opt-in toggle that
433
+ extends the search to bodies. Selecting a request opens headers (general,
434
+ request, response), payload (query string and request body, form fields
435
+ expanded), response (body pretty-printed through the JSON serializer when it
436
+ really is JSON), cookies, and timings (drawn phases plus the values the archive
437
+ reported, with `-1` shown as not applicable). Page load timings and archive
438
+ metadata get their own tabs. Routing is by the `.har` extension; an
439
+ extensionless archive is recognized by content — a `log` object holding an
440
+ `entries` array — and claimed before the generic JSON viewer.
441
+
442
+ ### EPUB e-books (.epub)
443
+
444
+ EPUB 2.0.1 and EPUB 3.x books open in a reflowable reading pane with the
445
+ book's table of contents, chapter navigation, text scaling, and a book-info
446
+ panel (metadata, cover, diagnostics). Sanitizing chapter markup is mandatory,
447
+ so the viewer takes a DOMPurify factory — `loadEpubViewerDeps` imports the
448
+ optional `dompurify` peer for you:
449
+
450
+ ```ts
451
+ import { mountEpubViewer } from 'omni-viewer-core/viewers/epub';
452
+ import { loadEpubViewerDeps } from 'omni-viewer-core/viewers/epub/self-loading';
453
+
454
+ await mountEpubViewer({ fileName: file.name, data: bytes }, container,
455
+ { ...ctx, navigation }, await loadEpubViewerDeps());
456
+ ```
457
+
458
+ `parseEpub` is a contract parser (`ParseOutcome<EpubDocument>`) that reads
459
+ only the package files — `container.xml`, the OPF package document, the EPUB 3
460
+ navigation document or the EPUB 2 NCX, and `encryption.xml` — so opening a
461
+ large illustrated book costs its package files, not its images. EPUB 2
462
+ `opf:` attributes and EPUB 3 `refines` metadata map onto one model (title and
463
+ subtitles, creators with roles and sort names, identifiers with schemes,
464
+ publication date, series, subjects, plain-text description). Chapters and
465
+ images are inflated on demand through `openEpubArchive`, each read capped per
466
+ member and against a cumulative budget, and a member that inflates past the
467
+ size its directory record declares is rejected as corrupt. Inflation uses the
468
+ platform's `DecompressionStream('deflate-raw')`; pass `inflate` to supply one
469
+ on hosts without it.
470
+
471
+ Chapter markup is parsed and sanitized in an inert document before it reaches
472
+ the page: scripts, forms, frames, media, and **publisher CSS** (`<link>`,
473
+ `<style>`, `style=""`) are dropped and the viewer's own reading typography
474
+ applies; container images become blob URLs revoked on chapter change; remote
475
+ images are blocked and counted. Internal links move through the spine,
476
+ fragments scroll within the chapter, and external links go only through the
477
+ host `navigation` service (allow-listed schemes). Next/previous walk the linear
478
+ spine (`linear="no"` covers and notes stay reachable by link), arrow keys turn
479
+ pages in the book's progression direction, and `Ctrl/Cmd` `+`/`-`/`0` scale
480
+ text. A book whose every chapter is DRM-encrypted fails with
481
+ `password-required` (font obfuscation is ignored); partly encrypted, missing,
482
+ or fixed-layout content is reported as diagnostics. Routing is by the `.epub`
483
+ extension; an extensionless book is recognized by `probeContainer` from its
484
+ stored `mimetype` member.
485
+
486
+ ### XML (.xml and XML dialects)
487
+
488
+ Configuration and integration documents (`pom.xml`, Android manifests,
489
+ MSBuild projects, SOAP/WSDL, RSS/Atom, XLIFF, KML/GPX…) open as an
490
+ element/attribute tree with a node inspector and the original source side by
491
+ side:
492
+
493
+ ```ts
494
+ import { mountXmlViewer } from 'omni-viewer-core/viewers/xml';
495
+
496
+ const handle = await mountXmlViewer({ fileName: file.name, data: bytes }, container, { ...ctx, clipboard });
497
+ ```
498
+
499
+ `parseXml` is a contract parser (`ParseOutcome<XmlDocument>`) with no DOM
500
+ dependency. Every node keeps its source range, and namespaces are resolved.
501
+ Well-formedness errors (mismatched or unclosed tags, duplicate attributes,
502
+ undeclared prefixes…) are reported with line and column, then recovered, so a
503
+ broken file still opens as a `partial` tree. External entities are never
504
+ loaded. Internal DTD entities expand one level only, under a budget, which
505
+ rules out XXE and billion-laughs expansion.
506
+
507
+ Selecting a node highlights its range in the source. Clicking a tag or
508
+ attribute in the source selects that node. Search covers names, values, or
509
+ comments and PIs, with next/previous and a matches-only filter. Copy gives the
510
+ XPath (positions appear only where names repeat), the value, or the node's XML.
511
+ Both panes are virtualized, and long single-line sources are split into
512
+ display segments. Defaults are 64 MiB input, 500,000 nodes, and depth 1,000.
513
+ ARXML and ReqIF keep their dedicated viewers by extension. An `.xml` whose root
514
+ is an OpenVINO IR goes to the OpenVINO viewer when a text sample is provided.
515
+
302
516
  ### Archive host integration
303
517
 
304
518
  Archive decompression remains adapter-owned: pass an `ArchiveDecoder` to
@@ -4,6 +4,36 @@
4
4
  // this catalog at build time. Diagnostics (§3-① messageKey) and viewer UI
5
5
  // strings share this key space.
6
6
  export const CATALOG_EN = {
7
+ 'notebook.title': 'Jupyter Notebook',
8
+ 'notebook.summary': '{cells} / {total} cells · {outputs} outputs · {errors} errors',
9
+ 'notebook.savedOutputs': 'Saved results · Code is displayed without execution.',
10
+ 'notebook.search': 'Search cells and outputs',
11
+ 'notebook.showCode': 'Show code',
12
+ 'notebook.showOutputs': 'Show outputs',
13
+ 'notebook.cells': 'Notebook cells',
14
+ 'notebook.cell': 'Cell {index}',
15
+ 'notebook.markdown': 'Markdown',
16
+ 'notebook.code': 'Code',
17
+ 'notebook.raw': 'Raw',
18
+ 'notebook.unknown': 'Unknown cell',
19
+ 'notebook.outputs': 'Outputs ({count})',
20
+ 'notebook.noOutputs': 'No saved outputs.',
21
+ 'notebook.empty': 'This notebook has no cells.',
22
+ 'notebook.noMatches': 'No matching cells.',
23
+ 'notebook.imageOutput': 'Saved image output',
24
+ 'notebook.assetUnavailable': 'Image unavailable',
25
+ 'notebook.unsupportedOutput': 'No supported static representation is available for this output.',
26
+ 'notebook.truncatedOutput': 'This output exceeds the preview limit.',
27
+ 'notebook.renderFailed': 'Preview failed. The source is shown below.',
28
+ 'notebook.blockedResources': 'External resources were blocked.',
29
+ 'diag.notebook.invalid': 'Invalid Jupyter Notebook document.',
30
+ 'diag.notebook.version': 'Only nbformat version 4 notebooks are supported.',
31
+ 'diag.notebook.malformed': 'Some malformed cells or outputs could not be read.',
32
+ 'diag.notebook.unknownCell': 'An unknown cell type is shown as source.',
33
+ 'diag.notebook.unknownOutput': 'An unknown output type could not be rendered.',
34
+ 'diag.notebook.cellLimit': 'The cell preview limit was reached. Some cells are omitted.',
35
+ 'diag.notebook.outputLimit': 'The output preview limit was reached. Some outputs are omitted.',
36
+ 'diag.notebook.previewLimit': 'Some content exceeds the preview size budget and was truncated.',
7
37
  'audio.title': 'Audio', 'video.title': 'Video', 'dbc.title': 'CAN database',
8
38
  'audio.play': 'Play', 'audio.pause': 'Pause', 'audio.stop': 'Stop',
9
39
  'audio.volume': 'Volume',
@@ -215,6 +245,324 @@ export const CATALOG_EN = {
215
245
  'tflite.inspector.inputs': 'Inputs', 'tflite.inspector.outputs': 'Outputs',
216
246
  'tflite.inspector.intermediates': 'Intermediates', 'tflite.inspector.options': 'Options',
217
247
  'tflite.inspector.customOptions': 'Custom options', 'tflite.inspector.subgraphs': 'Referenced subgraphs',
248
+ 'pte.title': 'ExecuTorch program', 'pte.search': 'Search instructions, values, delegates, and segments…',
249
+ 'pte.copyJson': 'Copy JSON', 'pte.method': 'Method', 'pte.unnamed': 'unnamed',
250
+ 'pte.graph': 'Graph', 'pte.instructions': 'Instructions', 'pte.values': 'Values',
251
+ 'pte.io': 'Inputs & Outputs', 'pte.delegates': 'Delegates', 'pte.segments': 'Segments', 'pte.modelInfo': 'Model Info',
252
+ 'pte.rows': '{shown} / {total} rows shown', 'pte.noMatches': 'No rows match the current search.',
253
+ 'pte.selectNode': 'Select an instruction or value to inspect it.',
254
+ 'pte.emptyGraph': 'This method has no kernel or delegate calls.',
255
+ 'pte.graphLimited': 'Graph preview shows {shown} of {total} items.',
256
+ 'pte.graphEdgesLimited': 'Only the first {count} connections are shown.',
257
+ 'pte.moreItems': '{count} more…', 'pte.schema': 'schema v{version}',
258
+ 'pte.scalar': 'scalar', 'pte.none': 'None', 'pte.yes': 'yes',
259
+ 'pte.instructionDetail': '#{index} · chain {chain}', 'pte.jumpTo': 'jump to #{index}',
260
+ 'pte.jumpEnd': 'jump past the end of this chain',
261
+ 'pte.jumpInvalid': 'jump to {index}, outside this chain',
262
+ 'pte.binaryBytes': '{bytes} bytes (binary)', 'pte.missingDelegate': 'Delegate {index} is not declared by this method.',
263
+ 'pte.inRange': 'In file', 'pte.outOfRange': 'Past end of file',
264
+ 'pte.unlocated': 'Unlocated (no header)',
265
+ 'pte.copyFailed': 'Copy failed',
266
+ 'pte.summary.methods': 'Methods', 'pte.summary.instructions': 'Instructions',
267
+ 'pte.summary.operators': 'Operators', 'pte.summary.tensors': 'Tensors',
268
+ 'pte.summary.delegates': 'Delegates', 'pte.summary.constants': 'Constant data',
269
+ 'pte.warning.identifier': 'The file identifier is {identifier} rather than the expected ET12.',
270
+ 'pte.warning.noMethods': 'The program contains no methods.',
271
+ 'pte.warning.noInstructions': 'The program methods contain no instructions.',
272
+ 'pte.warning.headerMissing': '{count} data segment(s) are declared but the file has no extended header to locate them.',
273
+ 'pte.warning.segmentsOutOfRange': '{count} data segment(s) extend past the end of the file.',
274
+ 'pte.warning.delegates': '{count} delegate call(s) need these backends registered in the runtime: {names}',
275
+ 'pte.warning.externalTensors': '{count} tensor(s) are stored in a separate .ptd file that this viewer does not read.',
276
+ 'pte.warning.missingData': '{count} tensor(s) reference constant data the program does not provide.',
277
+ 'pte.warning.missingSegments': '{count} reference(s) name a data segment the program does not declare.',
278
+ 'pte.warning.unknownScalarTypes': '{count} tensor(s) use a scalar type this viewer does not recognize.',
279
+ 'pte.warning.unknownValueKinds': '{count} value(s) are of a kind this viewer does not recognize.',
280
+ 'pte.warning.unknownInstructions': '{count} instruction(s) are of a kind this viewer does not recognize.',
281
+ 'pte.column.index': '#', 'pte.column.name': 'Name', 'pte.column.chain': 'Chain', 'pte.column.kind': 'Kind',
282
+ 'pte.column.target': 'Operator / Backend', 'pte.column.inputs': 'Inputs', 'pte.column.outputs': 'Outputs',
283
+ 'pte.column.args': 'Args', 'pte.column.type': 'Type', 'pte.column.shape': 'Shape', 'pte.column.typeShape': 'Type / Shape',
284
+ 'pte.column.elements': 'Elements', 'pte.column.dataSize': 'Data size', 'pte.column.storage': 'Storage',
285
+ 'pte.column.memory': 'Memory plan', 'pte.column.valueIndex': 'Value', 'pte.column.backend': 'Backend',
286
+ 'pte.column.location': 'Location', 'pte.column.dataIndex': 'Data index', 'pte.column.fileOffset': 'File offset',
287
+ 'pte.column.compileSpecs': 'Compile specs', 'pte.column.offset': 'Offset', 'pte.column.status': 'Status', 'pte.column.usedBy': 'Used by',
288
+ 'pte.kind.KernelCall': 'Kernel call', 'pte.kind.DelegateCall': 'Delegate call', 'pte.kind.MoveCall': 'Move',
289
+ 'pte.kind.JumpFalseCall': 'Jump if false', 'pte.kind.FreeCall': 'Free', 'pte.kind.Unknown': 'Unknown',
290
+ 'pte.kind.input': 'Input', 'pte.kind.output': 'Output',
291
+ 'pte.storage.inline': 'Inline constant', 'pte.storage.segment': 'Constant segment', 'pte.storage.mutable': 'Mutable state',
292
+ 'pte.storage.external': 'External file', 'pte.storage.planned': 'Memory planned', 'pte.storage.runtime': 'Runtime',
293
+ 'pte.location.inline': 'Inline', 'pte.location.segment': 'Segment',
294
+ 'pte.segment.constant': 'Constant tensors', 'pte.segment.mutable': 'Mutable state', 'pte.segment.delegate': 'Delegate blob',
295
+ 'pte.segment.named': 'Named data', 'pte.segment.unused': 'Unreferenced',
296
+ 'pte.info.identifier': 'File identifier', 'pte.info.schemaVersion': 'Schema version', 'pte.info.fileSize': 'File size',
297
+ 'pte.info.extendedHeader': 'Extended header', 'pte.info.noHeader': 'none (no data segments)',
298
+ 'pte.info.headerDetail': 'program {program} · segment base {base} · segment data {data}',
299
+ 'pte.info.constants': 'Constant data', 'pte.info.inlineBuffers': '{count} inline buffer(s)',
300
+ 'pte.info.delegateData': 'Delegate data', 'pte.info.backends': 'Backends', 'pte.info.methods': 'Methods',
301
+ 'pte.info.namedData': 'Named data', 'pte.info.memoryPlan': 'Memory plan', 'pte.info.inputSpec': 'Input spec',
302
+ 'pte.info.outputSpec': 'Output spec', 'pte.info.operator': 'Operator',
303
+ 'pte.info.dimOrder': 'Dim order', 'pte.info.expectedSize': 'Expected size', 'pte.info.shapeDynamism': 'Shape dynamism',
304
+ 'pte.info.segment': 'Segment', 'pte.info.dataIndex': 'Data index', 'pte.info.storageOffset': 'Storage offset',
305
+ 'pte.info.requiresGrad': 'Requires grad', 'pte.info.device': 'Device',
306
+ 'pte.info.aliasOf': 'Shares memory with',
307
+ 'pte.inspector.inputs': 'Inputs', 'pte.inspector.outputs': 'Outputs', 'pte.inspector.arguments': 'Arguments',
308
+ 'pte.inspector.delegate': 'Delegate', 'pte.inspector.destination': 'Destination', 'pte.inspector.stackTrace': 'Stack trace',
309
+ 'pte.inspector.value': 'Value', 'pte.inspector.items': 'Items',
310
+ 'xml.title': 'XML document',
311
+ 'xml.eyebrow': 'XML {version}',
312
+ 'xml.unreadable': 'This file could not be read as XML.',
313
+ 'xml.search': 'Search names, values, comments…',
314
+ 'xml.searchLabel': 'Search the document',
315
+ 'xml.scopeLabel': 'Search in',
316
+ 'xml.scope.all': 'Everything',
317
+ 'xml.scope.name': 'Names',
318
+ 'xml.scope.value': 'Values',
319
+ 'xml.scope.comment': 'Comments & PIs',
320
+ 'xml.previousMatch': 'Previous match',
321
+ 'xml.nextMatch': 'Next match',
322
+ 'xml.matchPosition': '{current} / {total}',
323
+ 'xml.noMatches': 'No matches',
324
+ 'xml.matchesOnly': 'Matches only',
325
+ 'xml.showAttributes': 'Attribute rows',
326
+ 'xml.expandAll': 'Expand all',
327
+ 'xml.collapseAll': 'Collapse all',
328
+ 'xml.problems': '{count} notes',
329
+ 'xml.problemsPartial': '{count} problems — the tree shows what could be recovered',
330
+ 'xml.tree': 'Structure',
331
+ 'xml.treeLabel': 'XML structure',
332
+ 'xml.rowCount': '{count} rows',
333
+ 'xml.inspector': 'Details',
334
+ 'xml.source': 'Source',
335
+ 'xml.lineCount': '{count} lines',
336
+ 'xml.summary.elements': 'Elements',
337
+ 'xml.summary.attributes': 'Attributes',
338
+ 'xml.summary.depth': 'Max depth',
339
+ 'xml.summary.namespaces': 'Namespaces',
340
+ 'xml.summary.lines': 'Lines',
341
+ 'xml.moreAttributes': '+{count} more',
342
+ 'xml.childCount': '({count} children)',
343
+ 'xml.kind.element': 'Element',
344
+ 'xml.kind.attribute': 'Attribute',
345
+ 'xml.kind.text': 'Text',
346
+ 'xml.kind.cdata': 'CDATA',
347
+ 'xml.kind.comment': 'Comment',
348
+ 'xml.kind.pi': 'Processing instruction',
349
+ 'xml.kind.doctype': 'Document type',
350
+ 'xml.copyXpath': 'Copy XPath',
351
+ 'xml.copyValue': 'Copy value',
352
+ 'xml.copyXml': 'Copy XML',
353
+ 'xml.showInSource': 'Show in source',
354
+ 'xml.copied': 'Copied to the clipboard',
355
+ 'xml.copyFailed': 'Copy failed',
356
+ 'xml.document': 'Document',
357
+ 'xml.namespaces': 'Namespace declarations',
358
+ 'xml.noNamespaces': 'This document declares no namespaces.',
359
+ 'xml.defaultNamespace': '(default)',
360
+ 'xml.statistics': 'Statistics',
361
+ 'xml.attributes': 'Attributes',
362
+ 'xml.stat.text': 'Text nodes',
363
+ 'xml.stat.cdata': 'CDATA sections',
364
+ 'xml.stat.comments': 'Comments',
365
+ 'xml.stat.pis': 'Processing instructions',
366
+ 'xml.field.version': 'XML version',
367
+ 'xml.field.encoding': 'Encoding',
368
+ 'xml.field.encodingValue': '{used} (declared {declared})',
369
+ 'xml.field.standalone': 'Standalone',
370
+ 'xml.field.doctype': 'DOCTYPE',
371
+ 'xml.field.publicId': 'Public ID',
372
+ 'xml.field.systemId': 'System ID',
373
+ 'xml.field.root': 'Root element',
374
+ 'xml.field.namespace': 'Namespace',
375
+ 'xml.field.prefix': 'Prefix',
376
+ 'xml.field.uri': 'URI',
377
+ 'xml.field.count': 'Declarations',
378
+ 'xml.field.xpath': 'XPath',
379
+ 'xml.field.position': 'Position',
380
+ 'xml.field.positionValue': 'Line {line}, column {column}',
381
+ 'xml.field.children': 'Children',
382
+ 'xml.field.childrenValue': '{elements} elements · {attributes} attributes',
383
+ 'xml.field.status': 'Status',
384
+ 'xml.field.name': 'Name',
385
+ 'xml.field.value': 'Value',
386
+ 'xml.field.text': 'Text content',
387
+ 'xml.unclosed': 'Not closed — its end tag is missing',
388
+ 'xml.emptyText': 'No text content.',
389
+ 'xml.truncated': 'Showing the first {count} characters.',
390
+ 'diag.xml.noRoot': 'The file contains no XML element.',
391
+ 'diag.xml.notText': 'The file is binary, not XML text.',
392
+ 'diag.xml.unsupportedEncoding': 'The declared encoding {encoding} is not supported; the file was read as UTF-8.',
393
+ 'diag.xml.mismatchedTag': 'End tag </{found}> does not match the open element <{expected}>.',
394
+ 'diag.xml.unclosedElement': 'Element <{name}> is not closed.',
395
+ 'diag.xml.endTagSyntax': 'End tag </{name}> may contain only its name.',
396
+ 'diag.xml.missingAttributeSpace': 'Attribute {name} must be separated from the previous one by whitespace.',
397
+ 'diag.xml.entityMarkup': 'Entity &{name}; contains markup, which is shown as text, not parsed into elements.',
398
+ 'diag.xml.entityLtInAttribute': 'Entity &{name}; puts a \'<\' into an attribute value.',
399
+ 'diag.xml.tagSyntax': 'Unexpected character {char} in tag <{name}>.',
400
+ 'diag.xml.unexpectedEndTag': 'End tag </{name}> has no matching start tag.',
401
+ 'diag.xml.duplicateAttribute': 'Attribute {name} appears more than once.',
402
+ 'diag.xml.attributeSyntax': 'Attribute {name} needs a quoted value.',
403
+ 'diag.xml.ltInAttribute': 'Attribute {name} contains a \'<\'.',
404
+ 'diag.xml.undeclaredPrefix': 'Namespace prefix {prefix} is not declared.',
405
+ 'diag.xml.multipleRoots': 'The document has more than one root element.',
406
+ 'diag.xml.textOutsideRoot': 'Text appears outside the root element.',
407
+ 'diag.xml.misplacedDeclaration': 'The XML declaration must be at the very start of the file.',
408
+ 'diag.xml.misplacedDoctype': 'The DOCTYPE must come once, before the root element.',
409
+ 'diag.xml.invalidMarkup': 'Unrecognized markup.',
410
+ 'diag.xml.unescapedLt': 'A \'<\' that does not start markup must be written as &lt;.',
411
+ 'diag.xml.bareAmpersand': 'An \'&\' that does not start a reference must be written as &amp;.',
412
+ 'diag.xml.invalidCharRef': 'Invalid character reference {reference}.',
413
+ 'diag.xml.undefinedEntity': 'Entity &{name}; is not declared and was left as written.',
414
+ 'diag.xml.externalEntity': 'External entity &{name}; is not loaded and was left as written.',
415
+ 'diag.xml.entityExpansionLimit': 'Entity expansion stopped at {max} characters; later references were left as written.',
416
+ 'diag.xml.unterminatedTag': 'A tag is not closed with \'>\'.',
417
+ 'diag.xml.unterminatedAttribute': 'An attribute value is missing its closing quote.',
418
+ 'diag.xml.unterminatedComment': 'A comment is not closed with \'-->\'.',
419
+ 'diag.xml.unterminatedCdata': 'A CDATA section is not closed with \']]>\'.',
420
+ 'diag.xml.unterminatedPi': 'A processing instruction is not closed with \'?>\'.',
421
+ 'diag.xml.unterminatedDoctype': 'The DOCTYPE declaration is not closed.',
422
+ 'diag.xml.nodeLimit': 'Only the first {max} nodes were read.',
423
+ 'diag.xml.depthLimit': 'Reading stopped at an element nested deeper than {max} levels; the rest of the document was not read.',
424
+ 'diag.xml.moreDiagnostics': '{count} more problems are not listed.',
425
+ 'epub.title': 'EPUB e-book',
426
+ 'epub.eyebrow': 'EPUB {version}',
427
+ 'epub.contents': 'Contents',
428
+ 'epub.info': 'Book info',
429
+ 'epub.previous': 'Previous',
430
+ 'epub.next': 'Next',
431
+ 'epub.chapter': 'Chapter',
432
+ 'epub.position': '{position} / {total}',
433
+ 'epub.textSmaller': 'Smaller text',
434
+ 'epub.textLarger': 'Larger text',
435
+ 'epub.textReset': 'Reset text size',
436
+ 'epub.textScale': 'Text size {scale}% (reset)',
437
+ 'epub.toolbar': 'Reading controls',
438
+ 'epub.reader': 'Book text',
439
+ 'epub.partial': 'Some parts of this book could not be read ({count} issues). See Book info.',
440
+ 'epub.section': 'Section {number}',
441
+ 'epub.untitled': 'Untitled',
442
+ 'epub.cover': 'Cover',
443
+ 'epub.moreDiagnostics': '{count} more issues not listed.',
444
+ 'epub.diagnostics': 'Diagnostics',
445
+ 'epub.blocked': '{count} external resources were blocked.',
446
+ 'epub.meta.title': 'Title',
447
+ 'epub.meta.otherTitles': 'Other titles',
448
+ 'epub.meta.creators': 'Authors',
449
+ 'epub.meta.contributors': 'Contributors',
450
+ 'epub.meta.publisher': 'Publisher',
451
+ 'epub.meta.date': 'Published',
452
+ 'epub.meta.modified': 'Modified',
453
+ 'epub.meta.language': 'Language',
454
+ 'epub.meta.identifiers': 'Identifiers',
455
+ 'epub.meta.series': 'Series',
456
+ 'epub.meta.subjects': 'Subjects',
457
+ 'epub.meta.description': 'Description',
458
+ 'epub.meta.rights': 'Rights',
459
+ 'epub.meta.source': 'Source',
460
+ 'epub.meta.version': 'EPUB version',
461
+ 'epub.meta.layout': 'Layout',
462
+ 'epub.meta.direction': 'Page direction',
463
+ 'epub.meta.chapters': 'Chapters',
464
+ 'epub.meta.files': 'Files',
465
+ 'epub.meta.package': 'Package document',
466
+ 'epub.direction.rtl': 'Right to left',
467
+ 'epub.direction.ltr': 'Left to right',
468
+ 'epub.layout.reflowable': 'Reflowable',
469
+ 'epub.layout.fixed': 'Fixed layout (shown reflowed)',
470
+ 'epub.chapter.encrypted': 'This chapter is DRM-protected and cannot be shown.',
471
+ 'epub.chapter.unsupported': 'This chapter is a {mediaType} document, which cannot be shown.',
472
+ 'epub.chapter.missing': 'This chapter is listed in the book but missing from the file ({path}).',
473
+ 'epub.chapter.renderFailed': 'This chapter could not be displayed ({path}).',
474
+ 'epub.read.missing': 'This chapter is missing from the file ({path}).',
475
+ 'epub.read.too-large': 'This chapter is larger than the configured read limit ({path}).',
476
+ 'epub.read.unsupported-method': 'This chapter uses an unsupported ZIP compression method ({path}).',
477
+ 'epub.read.encrypted': 'This chapter is encrypted ({path}).',
478
+ 'epub.read.corrupted': 'This chapter is damaged and could not be decompressed ({path}).',
479
+ 'epub.read.inflate-unavailable': 'This platform cannot decompress EPUB content.',
480
+ 'epub.read.budget-exceeded': 'The decompression budget for this book has been used up.',
481
+ 'diag.epub.not-zip': 'This file is not a readable EPUB (ZIP) container.',
482
+ 'diag.epub.no-package': 'No package document (.opf) was found in this EPUB.',
483
+ 'diag.epub.package-unreadable': 'The package document could not be read.',
484
+ 'diag.epub.package-invalid': 'The package document is not a valid EPUB package.',
485
+ 'diag.epub.no-spine': 'This EPUB has no readable reading order (spine).',
486
+ 'diag.epub.drm': 'This EPUB is DRM-protected; its content cannot be shown.',
487
+ 'diag.epub.inflate-unavailable': 'This platform cannot decompress EPUB content.',
488
+ 'diag.epub.decompressed-limit': 'This EPUB declares more uncompressed data than can be safely opened.',
489
+ 'diag.epub.zip-entry-limit': 'Only the first {limit} files in the container were read.',
490
+ 'diag.epub.xml-truncated': 'An XML document was too large or deeply nested and was read partially.',
491
+ 'diag.epub.mimetype-missing': 'The container has no mimetype file.',
492
+ 'diag.epub.mimetype-mismatch': 'The container mimetype is "{value}" instead of application/epub+zip.',
493
+ 'diag.epub.multiple-renditions': 'The book has {count} renditions; the first one is shown.',
494
+ 'diag.epub.container-missing': 'META-INF/container.xml is missing or invalid; using {path}.',
495
+ 'diag.epub.encoding': 'Unsupported text encoding "{encoding}" was read as UTF-8.',
496
+ 'diag.epub.rights-file': 'The book contains a rights file (META-INF/rights.xml), which usually indicates DRM.',
497
+ 'diag.epub.item-limit': 'Only the first {limit} items were read.',
498
+ 'diag.epub.manifest-missing': '{count} files listed in the manifest are missing from the container.',
499
+ 'diag.epub.spine-idref': 'The reading order references {count} unknown items (first: "{idref}").',
500
+ 'diag.epub.spine-unsupported': 'A reading-order item of type {mediaType} cannot be displayed.',
501
+ 'diag.epub.resource-missing': 'A content document listed in the reading order is missing.',
502
+ 'diag.epub.encrypted': '{count} chapters are encrypted and cannot be shown.',
503
+ 'diag.epub.toc-unreadable': 'The table of contents could not be read.',
504
+ 'diag.epub.toc-missing': 'The book has no table of contents; chapters are listed in reading order.',
505
+ 'diag.epub.time-limit': 'Parsing stopped at the time limit; the book may be incomplete.',
506
+ 'diag.epub.fixed-layout': 'This is a fixed-layout book; pages are shown as reflowable text.',
507
+ 'har.title': 'HAR network log',
508
+ 'har.search': 'Search URL, status, headers…', 'har.searchBodies': 'Search bodies',
509
+ 'har.version': 'HAR {version}', 'har.requestCount': '{count} requests', 'har.unknownCreator': 'Unknown writer',
510
+ 'har.requests': 'Requests', 'har.pages': 'Pages', 'har.info': 'Archive info',
511
+ 'har.rows': '{shown} / {total} rows shown', 'har.moreRows': '{count} more…',
512
+ 'har.noMatches': 'No requests match the current filters.',
513
+ 'har.noEntries': 'This archive contains no requests.',
514
+ 'har.noPages': 'This archive records no page loads.',
515
+ 'har.noTimings': 'This request has no timing breakdown.',
516
+ 'har.selectRequest': 'Select a request to inspect it.',
517
+ 'har.unreadable': 'This file could not be read as a HAR archive.',
518
+ 'har.failed': 'failed', 'har.cached': 'cached', 'har.notApplicable': 'n/a',
519
+ 'har.resourceSize': 'Resource size {size}', 'har.startedAt': 'started +{offset}',
520
+ 'har.copyEntry': 'Copy request JSON', 'har.copyBody': 'Copy body',
521
+ 'har.filter.method': 'Method', 'har.filter.allMethods': 'All methods',
522
+ 'har.filter.status': 'Status', 'har.filter.allStatuses': 'All statuses',
523
+ 'har.filter.type': 'Type', 'har.filter.allTypes': 'All types',
524
+ 'har.filter.domain': 'Domain', 'har.filter.allDomains': 'All domains',
525
+ 'har.statusClass.1xx': '1xx informational', 'har.statusClass.2xx': '2xx success',
526
+ 'har.statusClass.3xx': '3xx redirect', 'har.statusClass.4xx': '4xx client error',
527
+ 'har.statusClass.5xx': '5xx server error', 'har.statusClass.none': 'No response',
528
+ 'har.type.document': 'Document', 'har.type.stylesheet': 'Stylesheet', 'har.type.script': 'Script',
529
+ 'har.type.xhr': 'XHR / Fetch', 'har.type.image': 'Image', 'har.type.font': 'Font',
530
+ 'har.type.media': 'Media', 'har.type.websocket': 'WebSocket', 'har.type.manifest': 'Manifest',
531
+ 'har.type.text': 'Text', 'har.type.binary': 'Binary', 'har.type.other': 'Other',
532
+ 'har.timing.blocked': 'Blocked', 'har.timing.dns': 'DNS', 'har.timing.connect': 'Connect',
533
+ 'har.timing.ssl': 'TLS', 'har.timing.send': 'Send', 'har.timing.wait': 'Wait (TTFB)',
534
+ 'har.timing.receive': 'Receive', 'har.timing.total': 'Total',
535
+ 'har.column.index': '#', 'har.column.name': 'Name', 'har.column.method': 'Method',
536
+ 'har.column.status': 'Status', 'har.column.type': 'Type', 'har.column.domain': 'Domain',
537
+ 'har.column.size': 'Transferred', 'har.column.time': 'Time', 'har.column.waterfall': 'Waterfall',
538
+ 'har.column.page': 'Page', 'har.column.title': 'Title', 'har.column.started': 'Started',
539
+ 'har.column.contentLoad': 'DOMContentLoaded', 'har.column.load': 'Load', 'har.column.requests': 'Requests',
540
+ 'har.detail.general': 'General', 'har.detail.headers': 'Headers', 'har.detail.payload': 'Payload',
541
+ 'har.detail.response': 'Response', 'har.detail.cookies': 'Cookies', 'har.detail.timings': 'Timings',
542
+ 'har.detail.rawTimings': 'Reported phases', 'har.detail.requestHeaders': 'Request headers',
543
+ 'har.detail.responseHeaders': 'Response headers', 'har.detail.queryString': 'Query string',
544
+ 'har.detail.requestBody': 'Request body', 'har.detail.responseBody': 'Response body',
545
+ 'har.detail.requestCookies': 'Request cookies', 'har.detail.responseCookies': 'Response cookies',
546
+ 'har.field.url': 'URL', 'har.field.method': 'Method', 'har.field.status': 'Status',
547
+ 'har.field.protocol': 'Protocol', 'har.field.type': 'Type', 'har.field.started': 'Started',
548
+ 'har.field.offset': 'Timeline offset', 'har.field.time': 'Duration', 'har.field.transferred': 'Transferred',
549
+ 'har.field.resourceSize': 'Resource size', 'har.field.remoteAddress': 'Remote address',
550
+ 'har.field.connection': 'Connection', 'har.field.redirect': 'Redirects to', 'har.field.page': 'Page',
551
+ 'har.field.error': 'Error', 'har.field.comment': 'Comment', 'har.field.mimeType': 'MIME type',
552
+ 'har.field.encoding': 'Encoding', 'har.field.compression': 'Saved by compression',
553
+ 'har.body.none': 'None', 'har.body.empty': 'The archive stored no body text.',
554
+ 'har.body.binary': 'Binary body ({size}) — stored as base64 and not decoded.',
555
+ 'har.body.truncated': 'Body truncated at the preview limit.',
556
+ 'har.body.incomplete': 'The stored body ends before its content does — part of it could not be decoded.',
557
+ 'har.summary.requests': 'Requests', 'har.summary.elapsed': 'Elapsed', 'har.summary.transferred': 'Transferred',
558
+ 'har.summary.resources': 'Resources', 'har.summary.domains': 'Domains', 'har.summary.errors': 'Errors',
559
+ 'har.summary.pages': 'Pages',
560
+ 'har.info.version': 'HAR version', 'har.info.creator': 'Writer', 'har.info.browser': 'Browser',
561
+ 'har.info.entries': 'Requests', 'har.info.pages': 'Pages', 'har.info.domains': 'Domains',
562
+ 'har.info.methods': 'Methods', 'har.info.firstRequest': 'First request', 'har.info.elapsed': 'Elapsed',
563
+ 'har.info.totalTime': 'Sum of request times', 'har.info.transferred': 'Transferred',
564
+ 'har.info.resources': 'Resource bytes', 'har.info.errors': 'Error responses',
565
+ 'har.info.creatorComment': 'Writer comment',
218
566
  'coreml.title': 'Core ML model', 'coreml.search': 'Search operations, operands, and weights…',
219
567
  'coreml.copyJson': 'Copy JSON', 'coreml.graph': 'Graph', 'coreml.unnamed': 'unnamed',
220
568
  'coreml.operations': 'Operations', 'coreml.io': 'Inputs & Outputs', 'coreml.weights': 'Weights',
@@ -386,6 +734,7 @@ export const CATALOG_EN = {
386
734
  'pt2.warning.payloadsLimited': '{count} weight or constant entries were not read because the limit was reached.',
387
735
  'pt2.warning.danglingRefs': '{count} argument(s) reference a value that no node or input produces.',
388
736
  'pt2.warning.subgraphDepth': '{count} sub-graph(s) nested deeper than {limit} levels were not read.',
737
+ 'pt2.warning.placeholdersLimited': 'Only the first {limit} graph inputs or outputs were read; {count} were dropped.',
389
738
  'pt2.warning.pickledPayloads': 'Program "{name}": {count} tensor(s) are stored as torch.save pickles and are listed without a value preview.',
390
739
  'pt2.warning.payloadMissing': 'Program "{name}": {count} weight file(s) referenced by the payload config are not in the archive.',
391
740
  'pt2.warning.payloadTruncated': 'Program "{name}": {count} weight file(s) are shorter than the tensor they hold.',
@@ -601,6 +950,18 @@ export const CATALOG_EN = {
601
950
  'diag.limit-exceeded.input': 'The file exceeds the maximum supported size ({maxBytes} bytes).',
602
951
  'diag.limit-exceeded.decompressed': 'The archive declares more uncompressed data than the supported limit ({maxBytes} bytes).',
603
952
  'diag.aborted': 'Parsing was cancelled.',
953
+ 'diag.har.invalid': 'This file could not be parsed as JSON, so it cannot be read as a HAR archive.',
954
+ 'diag.har.missing-log': 'This JSON file has no "log" object, so it is not a HAR archive.',
955
+ 'diag.har.missing-entries': 'The HAR log has no "entries" array.',
956
+ 'diag.har.no-entries': 'This archive records no requests.',
957
+ 'diag.har.version': 'The archive declares HAR version {version}; it is read as 1.2.',
958
+ 'diag.har.entry-limit': 'Only the first {shown} of {total} requests were read.',
959
+ 'diag.har.invalid-entries': '{count} entries are not objects and were skipped.',
960
+ 'diag.har.invalid-dates': '{count} request(s) have a start time that is not a valid ISO-8601 timestamp.',
961
+ 'diag.har.body-truncated': '{count} body(ies) were truncated at {limit} characters.',
962
+ 'diag.har.body-incomplete': '{count} response body(ies) could not be fully decoded.',
963
+ 'diag.har.binary-bodies': '{count} response(s) hold binary bodies that are listed by size only.',
964
+ 'diag.har.request-errors': '{count} request(s) failed before a response arrived.',
604
965
  'diag.csv.ragged-rows': '{count} row(s) had a different number of columns and were padded or truncated.',
605
966
  // JSON parser diagnostics (docs/parsers/json.md)
606
967
  'diag.limit-exceeded.nodes': 'Only the first {count} nodes were parsed (node limit reached).',