@laminapdf/viewer 0.0.0-stage → 0.2.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +176 -2
- package/dist/canvas/cache.d.ts +35 -0
- package/dist/canvas/cache.d.ts.map +1 -0
- package/dist/canvas/cache.js +89 -0
- package/dist/canvas/cache.js.map +1 -0
- package/dist/canvas/pool.d.ts +35 -0
- package/dist/canvas/pool.d.ts.map +1 -0
- package/dist/canvas/pool.js +65 -0
- package/dist/canvas/pool.js.map +1 -0
- package/dist/client.d.ts +114 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +240 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/page-layout.d.ts +58 -0
- package/dist/layout/page-layout.d.ts.map +1 -0
- package/dist/layout/page-layout.js +110 -0
- package/dist/layout/page-layout.js.map +1 -0
- package/dist/protocol.d.ts +107 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +36 -0
- package/dist/protocol.js.map +1 -0
- package/dist/render/tiles.d.ts +17 -0
- package/dist/render/tiles.d.ts.map +1 -0
- package/dist/render/tiles.js +29 -0
- package/dist/render/tiles.js.map +1 -0
- package/dist/source.d.ts +9 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +27 -0
- package/dist/source.js.map +1 -0
- package/dist/view/viewer.d.ts +135 -0
- package/dist/view/viewer.d.ts.map +1 -0
- package/dist/view/viewer.js +781 -0
- package/dist/view/viewer.js.map +1 -0
- package/dist/worker/document.d.ts +22 -0
- package/dist/worker/document.d.ts.map +1 -0
- package/dist/worker/document.js +122 -0
- package/dist/worker/document.js.map +1 -0
- package/dist/worker/entry.d.ts +2 -0
- package/dist/worker/entry.d.ts.map +1 -0
- package/dist/worker/entry.js +7 -0
- package/dist/worker/entry.js.map +1 -0
- package/dist/worker/methods.d.ts +4 -0
- package/dist/worker/methods.d.ts.map +1 -0
- package/dist/worker/methods.js +19 -0
- package/dist/worker/methods.js.map +1 -0
- package/dist/worker/render.d.ts +7 -0
- package/dist/worker/render.d.ts.map +1 -0
- package/dist/worker/render.js +22 -0
- package/dist/worker/render.js.map +1 -0
- package/dist/zoom/zoom.d.ts +44 -0
- package/dist/zoom/zoom.d.ts.map +1 -0
- package/dist/zoom/zoom.js +56 -0
- package/dist/zoom/zoom.js.map +1 -0
- package/package.json +55 -3
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** A tile's side in CSS px (256–512 per the plan; device px is this × DPR). */
|
|
2
|
+
const TILE_CSS = 512;
|
|
3
|
+
/** The low-resolution pass: at most this many device px wide, and at most half the sharp scale. */
|
|
4
|
+
const LOW_MAX_WIDTH = 256;
|
|
5
|
+
/** The render scale (output px per pt) of the low-resolution pass for a page `widthPt` wide. */
|
|
6
|
+
export function lowScale(sharpScale, widthPt) {
|
|
7
|
+
return Math.min(sharpScale * 0.5, LOW_MAX_WIDTH / Math.max(1, widthPt));
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* The tiles (device px, in the page's pixel space at the sharp scale) covering `visible`, the
|
|
11
|
+
* part of the page in view in CSS px (x, y from the page's top-left), clamped to the page.
|
|
12
|
+
*/
|
|
13
|
+
export function tilesFor(visible, pageCss, dpr) {
|
|
14
|
+
const pageW = Math.max(1, Math.floor(pageCss.width * dpr));
|
|
15
|
+
const pageH = Math.max(1, Math.floor(pageCss.height * dpr));
|
|
16
|
+
const side = Math.max(1, Math.round(TILE_CSS * dpr));
|
|
17
|
+
const x0 = Math.max(0, Math.floor((visible.x * dpr) / side) * side);
|
|
18
|
+
const y0 = Math.max(0, Math.floor((visible.y * dpr) / side) * side);
|
|
19
|
+
const x1 = Math.min(pageW, Math.ceil(((visible.x + visible.width) * dpr) / side) * side);
|
|
20
|
+
const y1 = Math.min(pageH, Math.ceil(((visible.y + visible.height) * dpr) / side) * side);
|
|
21
|
+
const tiles = [];
|
|
22
|
+
for (let y = y0; y < y1; y += side) {
|
|
23
|
+
for (let x = x0; x < x1; x += side) {
|
|
24
|
+
tiles.push({ x, y, width: Math.min(side, pageW - x), height: Math.min(side, pageH - y) });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return tiles;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=tiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tiles.js","sourceRoot":"","sources":["../../src/render/tiles.ts"],"names":[],"mappings":"AAKA,+EAA+E;AAC/E,MAAM,QAAQ,GAAG,GAAG,CAAC;AACrB,mGAAmG;AACnG,MAAM,aAAa,GAAG,GAAG,CAAC;AAE1B,gGAAgG;AAChG,MAAM,UAAU,QAAQ,CAAC,UAAkB,EAAE,OAAe;IAC1D,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,GAAG,EAAE,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CACtB,OAAoG,EACpG,OAA4D,EAC5D,GAAW;IAEX,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACpE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACpE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACzF,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1F,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/source.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type RangeSource } from "@laminapdf/sdk";
|
|
2
|
+
/** A Blob (or File) as a RangeSource: each read is a `slice()`, so the file is never read whole for one range. */
|
|
3
|
+
export declare function blobSource(blob: Blob): RangeSource;
|
|
4
|
+
/**
|
|
5
|
+
* Every byte of `source`, in chunks. Both engines need the whole file in memory in v0.1 (PDFium's
|
|
6
|
+
* reads are synchronous).
|
|
7
|
+
*/
|
|
8
|
+
export declare function readAll(source: RangeSource, signal?: AbortSignal): Promise<Uint8Array>;
|
|
9
|
+
//# sourceMappingURL=source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElE,kHAAkH;AAClH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAOlD;AAKD;;;GAGG;AACH,wBAAsB,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAO5F"}
|
package/dist/source.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// What the document worker reads a Blob through: `@laminapdf/sdk`'s RangeSource, so the viewer and
|
|
2
|
+
// Lamina PDF share one interface for a document's bytes (the HTTP range source is one too).
|
|
3
|
+
import { callbackSource } from "@laminapdf/sdk";
|
|
4
|
+
/** A Blob (or File) as a RangeSource: each read is a `slice()`, so the file is never read whole for one range. */
|
|
5
|
+
export function blobSource(blob) {
|
|
6
|
+
return callbackSource(blob.size, async (offset, length, signal) => {
|
|
7
|
+
signal?.throwIfAborted();
|
|
8
|
+
const bytes = new Uint8Array(await blob.slice(offset, offset + length).arrayBuffer());
|
|
9
|
+
signal?.throwIfAborted();
|
|
10
|
+
return bytes;
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
/** Reads past this many bytes at a time (a 1 GiB file is read in 4 MiB slices). */
|
|
14
|
+
const CHUNK = 4 * 1024 * 1024;
|
|
15
|
+
/**
|
|
16
|
+
* Every byte of `source`, in chunks. Both engines need the whole file in memory in v0.1 (PDFium's
|
|
17
|
+
* reads are synchronous).
|
|
18
|
+
*/
|
|
19
|
+
export async function readAll(source, signal) {
|
|
20
|
+
const out = new Uint8Array(source.size);
|
|
21
|
+
for (let offset = 0; offset < source.size; offset += CHUNK) {
|
|
22
|
+
const chunk = await source.read(offset, Math.min(CHUNK, source.size - offset), signal ? { signal } : {});
|
|
23
|
+
out.set(chunk, offset);
|
|
24
|
+
}
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,4FAA4F;AAC5F,OAAO,EAAE,cAAc,EAAoB,MAAM,gBAAgB,CAAC;AAElE,kHAAkH;AAClH,MAAM,UAAU,UAAU,CAAC,IAAU;IACnC,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;QAChE,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACtF,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED,mFAAmF;AACnF,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAAmB,EAAE,MAAoB;IACrE,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACzG,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { type CanvasPoolOptions } from "../canvas/pool.js";
|
|
2
|
+
import type { ViewerClient } from "../client.js";
|
|
3
|
+
import { type Rotation } from "../layout/page-layout.js";
|
|
4
|
+
import { type OpenedDocument } from "../protocol.js";
|
|
5
|
+
import { type DocumentPoint, type Point, type Zoom } from "../zoom/zoom.js";
|
|
6
|
+
/** Where a mounted page's pixels are. */
|
|
7
|
+
export type PageRenderState = "placeholder" | "low" | "sharp" | "error";
|
|
8
|
+
/** What the view shows: for `useSyncExternalStore` and the toolbar. */
|
|
9
|
+
export interface ViewState {
|
|
10
|
+
readonly pageCount: number;
|
|
11
|
+
/** The page under the viewport's centre. */
|
|
12
|
+
readonly currentPage: number;
|
|
13
|
+
readonly zoom: Zoom;
|
|
14
|
+
/** The zoom as a percentage (100 is actual size), whatever the mode. */
|
|
15
|
+
readonly percent: number;
|
|
16
|
+
readonly rotation: Rotation;
|
|
17
|
+
readonly scrollTop: number;
|
|
18
|
+
/** The pages any part of which is in the viewport. */
|
|
19
|
+
readonly visibleRange: {
|
|
20
|
+
readonly first: number;
|
|
21
|
+
readonly last: number;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/** Counters for the perf harness, and for checking the viewer's guarantees in production. */
|
|
25
|
+
export interface RenderStats {
|
|
26
|
+
readonly mounted: number;
|
|
27
|
+
readonly peakMounted: number;
|
|
28
|
+
readonly canvases: number;
|
|
29
|
+
readonly peakCanvases: number;
|
|
30
|
+
readonly maxCanvases: number;
|
|
31
|
+
/**
|
|
32
|
+
* Draws onto a page whose shell was out of the DOM at the moment of drawing, counted at the
|
|
33
|
+
* draw itself: always 0 (the guarantee that a cancelled render never paints).
|
|
34
|
+
*/
|
|
35
|
+
readonly drawsOnUnmounted: number;
|
|
36
|
+
/** Results that arrived for a page no longer mounted, or a zoom since replaced, and were dropped. */
|
|
37
|
+
readonly dropped: number;
|
|
38
|
+
/** Renders cancelled because their page left the margin or the zoom changed (the client rejected them). */
|
|
39
|
+
readonly aborted: number;
|
|
40
|
+
readonly cacheBytes: number;
|
|
41
|
+
/** Each mounted page's state. */
|
|
42
|
+
readonly pages: Readonly<Record<number, PageRenderState>>;
|
|
43
|
+
}
|
|
44
|
+
/** The viewer's events and what each carries. */
|
|
45
|
+
export interface ViewerEventMap {
|
|
46
|
+
pagechange: {
|
|
47
|
+
readonly page: number;
|
|
48
|
+
};
|
|
49
|
+
zoomchange: {
|
|
50
|
+
readonly zoom: Zoom;
|
|
51
|
+
readonly percent: number;
|
|
52
|
+
};
|
|
53
|
+
renderstats: RenderStats;
|
|
54
|
+
}
|
|
55
|
+
/** A layer that later todos mount into each page (text, annotations, highlights, …). */
|
|
56
|
+
export interface PageLayer {
|
|
57
|
+
/** Its slot: `text`, `annot` and `highlight` exist on every page; another name gets a new one on top. */
|
|
58
|
+
readonly name: string;
|
|
59
|
+
/** Page `page` was mounted: `element` is the layer's slot in its shell. */
|
|
60
|
+
onMount?(page: number, element: HTMLElement): void;
|
|
61
|
+
/** Page `page` is about to be unmounted (its renders already aborted). */
|
|
62
|
+
onUnmount?(page: number, element: HTMLElement): void;
|
|
63
|
+
/** The page's CSS size changed (zoom or rotation). */
|
|
64
|
+
onZoom?(page: number, element: HTMLElement, size: {
|
|
65
|
+
readonly width: number;
|
|
66
|
+
readonly height: number;
|
|
67
|
+
}): void;
|
|
68
|
+
}
|
|
69
|
+
/** `createViewer`'s options: the client, and the tuning the perf harness measures. */
|
|
70
|
+
export interface CreateViewerOptions {
|
|
71
|
+
readonly client: ViewerClient;
|
|
72
|
+
/** Pages mounted past each edge of the viewport (default 2; at least one viewport's worth). */
|
|
73
|
+
readonly margin?: number;
|
|
74
|
+
/** CSS px between pages (default 16). */
|
|
75
|
+
readonly gap?: number;
|
|
76
|
+
readonly pool?: CanvasPoolOptions;
|
|
77
|
+
/** The bitmap cache's budget in bytes (default 256 MB). */
|
|
78
|
+
readonly cacheBytes?: number;
|
|
79
|
+
/** How long a zoom gesture must pause before the sharp re-render, in ms (default 150). */
|
|
80
|
+
readonly settleMs?: number;
|
|
81
|
+
/** The device pixel ratio (default `globalThis.devicePixelRatio`). */
|
|
82
|
+
readonly dpr?: () => number;
|
|
83
|
+
/** The initial zoom (default `fit-width`). */
|
|
84
|
+
readonly zoom?: Zoom;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* The viewer: a scroll container over one document's pages. Make one with {@link createViewer},
|
|
88
|
+
* `mount` it, then `open` a document from the client.
|
|
89
|
+
*/
|
|
90
|
+
export declare class Viewer {
|
|
91
|
+
#private;
|
|
92
|
+
constructor(options: CreateViewerOptions);
|
|
93
|
+
/** The scroll container (append it, or use {@link mount}). */
|
|
94
|
+
get element(): HTMLDivElement;
|
|
95
|
+
/** Puts the viewer into `container` (which gives it its size). */
|
|
96
|
+
mount(container: HTMLElement): void;
|
|
97
|
+
/** Shows `document` (an `open()` result of the client), at the initial zoom, from page 0. */
|
|
98
|
+
open(document: OpenedDocument): void;
|
|
99
|
+
/** The current view state (a new object after each change). */
|
|
100
|
+
getState(): ViewState;
|
|
101
|
+
/** Calls `listener` after every state change (for `useSyncExternalStore`). */
|
|
102
|
+
subscribe(listener: () => void): () => void;
|
|
103
|
+
/** Listens for `event`; returns a function that stops listening. */
|
|
104
|
+
on<E extends keyof ViewerEventMap>(event: E, listener: (data: ViewerEventMap[E]) => void): () => void;
|
|
105
|
+
/** Adds a layer to every page, mounted now and later; returns a function that removes it. */
|
|
106
|
+
addLayer(layer: PageLayer): () => void;
|
|
107
|
+
/** Scrolls page `index` to the top of the viewport (or its centre). */
|
|
108
|
+
goToPage(index: number, options?: {
|
|
109
|
+
readonly anchor?: "top" | "center";
|
|
110
|
+
}): void;
|
|
111
|
+
/**
|
|
112
|
+
* Sets the zoom (a mode, or a percentage clamped to 10–800 %), keeping the document point at
|
|
113
|
+
* `anchor` (viewport CSS px; default its centre) where it is.
|
|
114
|
+
*/
|
|
115
|
+
setZoom(zoom: Zoom, options?: {
|
|
116
|
+
readonly anchor?: Point;
|
|
117
|
+
}): void;
|
|
118
|
+
/**
|
|
119
|
+
* Rotates the view by `delta` degrees, keeping the viewport's centre.
|
|
120
|
+
*
|
|
121
|
+
* @throws RangeError when `delta` isn't a multiple of 90.
|
|
122
|
+
*/
|
|
123
|
+
rotate(delta: number): void;
|
|
124
|
+
/** The document point at viewport position (`x`, `y`) in CSS px. */
|
|
125
|
+
pointAt(x: number, y: number): DocumentPoint | undefined;
|
|
126
|
+
/** Where `point` is now, in viewport CSS px. */
|
|
127
|
+
positionOf(point: DocumentPoint): Point | undefined;
|
|
128
|
+
/** The counters (see RenderStats). */
|
|
129
|
+
stats(): RenderStats;
|
|
130
|
+
/** Takes the viewer down: renders aborted, canvases and bitmaps freed, listeners removed. */
|
|
131
|
+
destroy(): void;
|
|
132
|
+
}
|
|
133
|
+
/** Creates a viewer over `options.client`'s document worker. */
|
|
134
|
+
export declare function createViewer(options: CreateViewerOptions): Viewer;
|
|
135
|
+
//# sourceMappingURL=viewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewer.d.ts","sourceRoot":"","sources":["../../src/view/viewer.ts"],"names":[],"mappings":"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"}
|